summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorManoj Srivastava <srivasta@golden-gryphon.com>2014-05-14 20:26:39 -0700
committerManoj Srivastava <srivasta@golden-gryphon.com>2014-05-14 20:26:39 -0700
commit88df2cb8fb4a21f00e6f5140ff6936b6628192ba (patch)
tree082242de72ba54e3fc240ebcb32db53933deb9fe
parent3fc416b2af0d680def067bf1b52f31c470efe051 (diff)
parent0dcef5a234fdb2f63389f062ecb4f9d3920e79b3 (diff)
Merge branch 'upstream'
-rw-r--r--BUGS.txt1
-rw-r--r--CMakeLists.txt12
-rw-r--r--DEBUG.txt8
-rw-r--r--README.txt5
-rw-r--r--changes.txt35
-rw-r--r--lib/CMakeLists.txt1
-rw-r--r--lib/core/crpt_aux.lua61
-rw-r--r--lib/core/dungeon.lua51
-rw-r--r--lib/core/init.lua1
-rw-r--r--lib/core/load2.lua7
-rw-r--r--lib/core/player.lua5
-rw-r--r--lib/core/powers.lua105
-rw-r--r--lib/core/s_aux.lua76
-rw-r--r--lib/core/util.lua99
-rw-r--r--lib/edit/fireprof.map60
-rw-r--r--lib/edit/library.map62
-rw-r--r--lib/help/debug.txt5
-rw-r--r--lib/help/tome_faq.txt8
-rw-r--r--lib/mods/theme/apex/delete.me1
-rw-r--r--lib/mods/theme/changelog.txt73
-rw-r--r--lib/mods/theme/core/auto.lua859
-rw-r--r--lib/mods/theme/core/building.lua15
-rw-r--r--lib/mods/theme/core/crpt_aux.lua182
-rw-r--r--lib/mods/theme/core/dungeon.lua55
-rw-r--r--lib/mods/theme/core/gen_idx.lua261
-rw-r--r--lib/mods/theme/core/gods.lua40
-rw-r--r--lib/mods/theme/core/help.lua141
-rw-r--r--lib/mods/theme/core/init.lua83
-rw-r--r--lib/mods/theme/core/load.lua37
-rw-r--r--lib/mods/theme/core/load2.lua56
-rw-r--r--lib/mods/theme/core/mimc_aux.lua96
-rw-r--r--lib/mods/theme/core/monsters.lua16
-rw-r--r--lib/mods/theme/core/objects.lua45
-rw-r--r--lib/mods/theme/core/player.lua135
-rw-r--r--lib/mods/theme/core/quests.lua57
-rw-r--r--lib/mods/theme/core/s_aux.lua716
-rw-r--r--lib/mods/theme/core/stores.lua32
-rw-r--r--lib/mods/theme/core/util.lua158
-rw-r--r--lib/mods/theme/core/xml.lua375
-rw-r--r--lib/mods/theme/data/delete.me0
-rw-r--r--lib/mods/theme/dngn/dun1.142
-rw-r--r--lib/mods/theme/dngn/dun1.222
-rw-r--r--lib/mods/theme/dngn/dun10.03
-rw-r--r--lib/mods/theme/dngn/dun11.202
-rw-r--r--lib/mods/theme/dngn/dun11.222
-rw-r--r--lib/mods/theme/dngn/dun17.155
-rw-r--r--lib/mods/theme/dngn/dun18.02
-rw-r--r--lib/mods/theme/dngn/dun18.12
-rw-r--r--lib/mods/theme/dngn/dun19.115
-rw-r--r--lib/mods/theme/dngn/dun2.312
-rw-r--r--lib/mods/theme/dngn/dun20.15
-rw-r--r--lib/mods/theme/dngn/dun22.102
-rw-r--r--lib/mods/theme/dngn/dun22.205
-rw-r--r--lib/mods/theme/dngn/dun22.55
-rw-r--r--lib/mods/theme/dngn/dun24.03
-rw-r--r--lib/mods/theme/dngn/dun29.156
-rw-r--r--lib/mods/theme/dngn/dun3.185
-rw-r--r--lib/mods/theme/dngn/dun3.285
-rw-r--r--lib/mods/theme/dngn/dun3.35
-rw-r--r--lib/mods/theme/dngn/dun36.55
-rw-r--r--lib/mods/theme/dngn/dun39.09
-rw-r--r--lib/mods/theme/dngn/dun4.92
-rw-r--r--lib/mods/theme/dngn/dun40.09
-rw-r--r--lib/mods/theme/dngn/dun5.03
-rw-r--r--lib/mods/theme/dngn/dun5.1414
-rw-r--r--lib/mods/theme/dngn/dun6.03
-rw-r--r--lib/mods/theme/edit/a_info.txt3359
-rw-r--r--lib/mods/theme/edit/ab_info.txt109
-rw-r--r--lib/mods/theme/edit/al_info.txt12
-rw-r--r--lib/mods/theme/edit/ba_info.txt310
-rw-r--r--lib/mods/theme/edit/between.map71
-rw-r--r--lib/mods/theme/edit/d_info.txt701
-rw-r--r--lib/mods/theme/edit/dragons.map43
-rw-r--r--lib/mods/theme/edit/e_info.txt3007
-rw-r--r--lib/mods/theme/edit/evil.map52
-rw-r--r--lib/mods/theme/edit/f_info.txt1245
-rw-r--r--lib/mods/theme/edit/fireprof.map60
-rw-r--r--lib/mods/theme/edit/haunted.map49
-rw-r--r--lib/mods/theme/edit/k_info.txt6865
-rw-r--r--lib/mods/theme/edit/library.map62
-rw-r--r--lib/mods/theme/edit/maeglin.map85
-rw-r--r--lib/mods/theme/edit/misc.txt91
-rw-r--r--lib/mods/theme/edit/nirnaeth.map64
-rw-r--r--lib/mods/theme/edit/numenor.txt80
-rw-r--r--lib/mods/theme/edit/ow_info.txt1419
-rw-r--r--lib/mods/theme/edit/p_info.txt2855
-rw-r--r--lib/mods/theme/edit/qrand1.map32
-rw-r--r--lib/mods/theme/edit/qrand10.map36
-rw-r--r--lib/mods/theme/edit/qrand11.map36
-rw-r--r--lib/mods/theme/edit/qrand12.map36
-rw-r--r--lib/mods/theme/edit/qrand14.map37
-rw-r--r--lib/mods/theme/edit/qrand5.map27
-rw-r--r--lib/mods/theme/edit/qrand6.map37
-rw-r--r--lib/mods/theme/edit/qrand7.map35
-rw-r--r--lib/mods/theme/edit/r_info.txt19013
-rw-r--r--lib/mods/theme/edit/ra_info.txt1985
-rw-r--r--lib/mods/theme/edit/re_info.txt183
-rw-r--r--lib/mods/theme/edit/readme.txt96
-rw-r--r--lib/mods/theme/edit/s_bilbo.map58
-rw-r--r--lib/mods/theme/edit/s_bridge.map104
-rw-r--r--lib/mods/theme/edit/s_crypt.map109
-rw-r--r--lib/mods/theme/edit/s_death.map104
-rw-r--r--lib/mods/theme/edit/s_doom.map226
-rw-r--r--lib/mods/theme/edit/s_factory.map238
-rw-r--r--lib/mods/theme/edit/s_gates.map117
-rw-r--r--lib/mods/theme/edit/s_info.txt542
-rw-r--r--lib/mods/theme/edit/s_name.map110
-rw-r--r--lib/mods/theme/edit/s_orc.map109
-rw-r--r--lib/mods/theme/edit/s_orthanc.map99
-rw-r--r--lib/mods/theme/edit/s_ship.map239
-rw-r--r--lib/mods/theme/edit/s_smaug.map78
-rw-r--r--lib/mods/theme/edit/s_thorin.map47
-rw-r--r--lib/mods/theme/edit/set_info.txt254
-rw-r--r--lib/mods/theme/edit/special.txt67
-rw-r--r--lib/mods/theme/edit/spiders.map66
-rw-r--r--lib/mods/theme/edit/st_info.txt1157
-rw-r--r--lib/mods/theme/edit/t_basic.txt66
-rw-r--r--lib/mods/theme/edit/t_beorn.txt108
-rw-r--r--lib/mods/theme/edit/t_bree.txt137
-rw-r--r--lib/mods/theme/edit/t_cerin.txt98
-rw-r--r--lib/mods/theme/edit/t_d_beorn.txt75
-rw-r--r--lib/mods/theme/edit/t_d_bree.txt91
-rw-r--r--lib/mods/theme/edit/t_d_cerin.txt75
-rw-r--r--lib/mods/theme/edit/t_d_dale.txt75
-rw-r--r--lib/mods/theme/edit/t_d_edoras.txt75
-rw-r--r--lib/mods/theme/edit/t_d_esga.txt75
-rw-r--r--lib/mods/theme/edit/t_d_gond.txt100
-rw-r--r--lib/mods/theme/edit/t_d_helm.txt75
-rw-r--r--lib/mods/theme/edit/t_d_henn.txt75
-rw-r--r--lib/mods/theme/edit/t_d_hobb.txt75
-rw-r--r--lib/mods/theme/edit/t_d_imlad.txt75
-rw-r--r--lib/mods/theme/edit/t_d_khaz.txt79
-rw-r--r--lib/mods/theme/edit/t_d_lori.txt75
-rw-r--r--lib/mods/theme/edit/t_d_mina.txt79
-rw-r--r--lib/mods/theme/edit/t_d_osgili.txt78
-rw-r--r--lib/mods/theme/edit/t_d_pelar.txt78
-rw-r--r--lib/mods/theme/edit/t_d_thrand.txt75
-rw-r--r--lib/mods/theme/edit/t_dale.txt96
-rw-r--r--lib/mods/theme/edit/t_edoras.txt117
-rw-r--r--lib/mods/theme/edit/t_esga.txt105
-rw-r--r--lib/mods/theme/edit/t_gondol.txt219
-rw-r--r--lib/mods/theme/edit/t_helm.txt73
-rw-r--r--lib/mods/theme/edit/t_henn.txt96
-rw-r--r--lib/mods/theme/edit/t_hobb.txt108
-rw-r--r--lib/mods/theme/edit/t_imlad.txt90
-rw-r--r--lib/mods/theme/edit/t_info.txt125
-rw-r--r--lib/mods/theme/edit/t_khazad.txt114
-rw-r--r--lib/mods/theme/edit/t_lorien.txt185
-rw-r--r--lib/mods/theme/edit/t_minas.txt141
-rw-r--r--lib/mods/theme/edit/t_osgili.txt136
-rw-r--r--lib/mods/theme/edit/t_pelar.txt105
-rw-r--r--lib/mods/theme/edit/t_pref.txt145
-rw-r--r--lib/mods/theme/edit/t_thrand.txt103
-rw-r--r--lib/mods/theme/edit/thieves.map64
-rw-r--r--lib/mods/theme/edit/thrain.map35
-rw-r--r--lib/mods/theme/edit/tr_info.txt817
-rw-r--r--lib/mods/theme/edit/trolls.map58
-rw-r--r--lib/mods/theme/edit/v_info.txt2287
-rw-r--r--lib/mods/theme/edit/volcano.txt83
-rw-r--r--lib/mods/theme/edit/w_info.txt141
-rw-r--r--lib/mods/theme/edit/wf_info.txt394
-rw-r--r--lib/mods/theme/edit/wights.map82
-rw-r--r--lib/mods/theme/edit/wolves.map55
-rw-r--r--lib/mods/theme/file/book-0.txt86
-rw-r--r--lib/mods/theme/file/book-1.txt83
-rw-r--r--lib/mods/theme/file/book-10.txt75
-rw-r--r--lib/mods/theme/file/book-101.txt4
-rw-r--r--lib/mods/theme/file/book-102.txt4
-rw-r--r--lib/mods/theme/file/book-103.txt6
-rw-r--r--lib/mods/theme/file/book-104.txt6
-rw-r--r--lib/mods/theme/file/book-105.txt7
-rw-r--r--lib/mods/theme/file/book-106.txt5
-rw-r--r--lib/mods/theme/file/book-107.txt6
-rw-r--r--lib/mods/theme/file/book-11.txt51
-rw-r--r--lib/mods/theme/file/book-12.txt68
-rw-r--r--lib/mods/theme/file/book-13.txt54
-rw-r--r--lib/mods/theme/file/book-14.txt55
-rw-r--r--lib/mods/theme/file/book-15.txt68
-rw-r--r--lib/mods/theme/file/book-16.txt43
-rw-r--r--lib/mods/theme/file/book-17.txt47
-rw-r--r--lib/mods/theme/file/book-18.txt55
-rw-r--r--lib/mods/theme/file/book-19.txt47
-rw-r--r--lib/mods/theme/file/book-2.txt90
-rw-r--r--lib/mods/theme/file/book-20.txt192
-rw-r--r--lib/mods/theme/file/book-200.txt5
-rw-r--r--lib/mods/theme/file/book-201.txt5
-rw-r--r--lib/mods/theme/file/book-202.txt5
-rw-r--r--lib/mods/theme/file/book-203.txt5
-rw-r--r--lib/mods/theme/file/book-204.txt5
-rw-r--r--lib/mods/theme/file/book-205.txt5
-rw-r--r--lib/mods/theme/file/book-206.txt5
-rw-r--r--lib/mods/theme/file/book-207.txt5
-rw-r--r--lib/mods/theme/file/book-208.txt5
-rw-r--r--lib/mods/theme/file/book-209.txt5
-rw-r--r--lib/mods/theme/file/book-210.txt5
-rw-r--r--lib/mods/theme/file/book-211.txt5
-rw-r--r--lib/mods/theme/file/book-212.txt5
-rw-r--r--lib/mods/theme/file/book-213.txt5
-rw-r--r--lib/mods/theme/file/book-214.txt5
-rw-r--r--lib/mods/theme/file/book-215.txt5
-rw-r--r--lib/mods/theme/file/book-216.txt5
-rw-r--r--lib/mods/theme/file/book-22.txt56
-rw-r--r--lib/mods/theme/file/book-23.txt81
-rw-r--r--lib/mods/theme/file/book-24.txt59
-rw-r--r--lib/mods/theme/file/book-25.txt98
-rw-r--r--lib/mods/theme/file/book-26.txt56
-rw-r--r--lib/mods/theme/file/book-27.txt75
-rw-r--r--lib/mods/theme/file/book-28.txt102
-rw-r--r--lib/mods/theme/file/book-29.txt75
-rw-r--r--lib/mods/theme/file/book-30.txt58
-rw-r--r--lib/mods/theme/file/book-31.txt63
-rw-r--r--lib/mods/theme/file/book-32.txt37
-rw-r--r--lib/mods/theme/file/book-33.txt21
-rw-r--r--lib/mods/theme/file/book-4.txt11
-rw-r--r--lib/mods/theme/file/book-6.txt171
-rw-r--r--lib/mods/theme/file/book-7.txt83
-rw-r--r--lib/mods/theme/file/book-8.txt101
-rw-r--r--lib/mods/theme/file/book-9.txt99
-rw-r--r--lib/mods/theme/file/bravado.txt105
-rw-r--r--lib/mods/theme/file/chainswd.txt8
-rw-r--r--lib/mods/theme/file/dam_huge.txt9
-rw-r--r--lib/mods/theme/file/dam_lots.txt21
-rw-r--r--lib/mods/theme/file/dam_med.txt25
-rw-r--r--lib/mods/theme/file/dam_none.txt24
-rw-r--r--lib/mods/theme/file/dam_xxx.txt11
-rw-r--r--lib/mods/theme/file/dead.txt24
-rw-r--r--lib/mods/theme/file/death.txt351
-rw-r--r--lib/mods/theme/file/elvish.txt218
-rw-r--r--lib/mods/theme/file/error.txt67
-rw-r--r--lib/mods/theme/file/mondeath.txt334
-rw-r--r--lib/mods/theme/file/monfear.txt63
-rw-r--r--lib/mods/theme/file/monspeak.txt517
-rw-r--r--lib/mods/theme/file/news.txt23
-rw-r--r--lib/mods/theme/file/news2.txt23
-rw-r--r--lib/mods/theme/file/rart_f.txt86
-rw-r--r--lib/mods/theme/file/rart_s.txt87
-rw-r--r--lib/mods/theme/file/readme!36
-rw-r--r--lib/mods/theme/file/rumors.txt201
-rw-r--r--lib/mods/theme/file/sample.txt5
-rw-r--r--lib/mods/theme/file/sfail.txt34
-rw-r--r--lib/mods/theme/file/silly.txt301
-rw-r--r--lib/mods/theme/file/smeagol.txt29
-rw-r--r--lib/mods/theme/file/smeagolr.txt5
-rw-r--r--lib/mods/theme/file/speakpet.txt53
-rw-r--r--lib/mods/theme/file/timefun.txt92
-rw-r--r--lib/mods/theme/file/timenorm.txt83
-rw-r--r--lib/mods/theme/help/ability.txt115
-rw-r--r--lib/mods/theme/help/advanced.hlp15
-rw-r--r--lib/mods/theme/help/attack.txt148
-rw-r--r--lib/mods/theme/help/automat.txt504
-rw-r--r--lib/mods/theme/help/birth.txt659
-rw-r--r--lib/mods/theme/help/c_alchem.txt135
-rw-r--r--lib/mods/theme/help/c_archer.txt68
-rw-r--r--lib/mods/theme/help/c_ascet.txt46
-rw-r--r--lib/mods/theme/help/c_assass.txt58
-rw-r--r--lib/mods/theme/help/c_axemas.txt51
-rw-r--r--lib/mods/theme/help/c_bard.txt69
-rw-r--r--lib/mods/theme/help/c_clairv.txt47
-rw-r--r--lib/mods/theme/help/c_demono.txt54
-rw-r--r--lib/mods/theme/help/c_druid.txt55
-rw-r--r--lib/mods/theme/help/c_geoman.txt59
-rw-r--r--lib/mods/theme/help/c_hafted.txt54
-rw-r--r--lib/mods/theme/help/c_lorema.txt54
-rw-r--r--lib/mods/theme/help/c_mage.txt67
-rw-r--r--lib/mods/theme/help/c_mercen.txt49
-rw-r--r--lib/mods/theme/help/c_merch.txt29
-rw-r--r--lib/mods/theme/help/c_mimic.txt53
-rw-r--r--lib/mods/theme/help/c_mindcr.txt57
-rw-r--r--lib/mods/theme/help/c_monk.txt87
-rw-r--r--lib/mods/theme/help/c_necro.txt80
-rw-r--r--lib/mods/theme/help/c_pacif.txt10
-rw-r--r--lib/mods/theme/help/c_palad.txt49
-rw-r--r--lib/mods/theme/help/c_peacemag.txt46
-rw-r--r--lib/mods/theme/help/c_polear.txt52
-rw-r--r--lib/mods/theme/help/c_posses.txt70
-rw-r--r--lib/mods/theme/help/c_pr_drk.txt57
-rw-r--r--lib/mods/theme/help/c_pr_eru.txt55
-rw-r--r--lib/mods/theme/help/c_pr_man.txt54
-rw-r--r--lib/mods/theme/help/c_pr_mand.txt49
-rw-r--r--lib/mods/theme/help/c_pr_ulmo.txt50
-rw-r--r--lib/mods/theme/help/c_pr_varda.txt50
-rw-r--r--lib/mods/theme/help/c_priest.txt17
-rw-r--r--lib/mods/theme/help/c_ranger.txt56
-rw-r--r--lib/mods/theme/help/c_rogue.txt62
-rw-r--r--lib/mods/theme/help/c_runecr.txt110
-rw-r--r--lib/mods/theme/help/c_sniper.txt50
-rw-r--r--lib/mods/theme/help/c_sorcer.txt68
-rw-r--r--lib/mods/theme/help/c_stonewr.txt50
-rw-r--r--lib/mods/theme/help/c_summon.txt80
-rw-r--r--lib/mods/theme/help/c_swordm.txt52
-rw-r--r--lib/mods/theme/help/c_symbia.txt68
-rw-r--r--lib/mods/theme/help/c_thaum.txt84
-rw-r--r--lib/mods/theme/help/c_trapper.txt46
-rw-r--r--lib/mods/theme/help/c_unbel.txt65
-rw-r--r--lib/mods/theme/help/c_wainrid.txt49
-rw-r--r--lib/mods/theme/help/c_warper.txt60
-rw-r--r--lib/mods/theme/help/c_warrio.txt54
-rw-r--r--lib/mods/theme/help/command.txt1251
-rw-r--r--lib/mods/theme/help/corspoil.txt136
-rw-r--r--lib/mods/theme/help/debug.txt278
-rw-r--r--lib/mods/theme/help/def.aux3
-rw-r--r--lib/mods/theme/help/defines.txt639
-rw-r--r--lib/mods/theme/help/dungeon.txt703
-rw-r--r--lib/mods/theme/help/dunspoil.txt173
-rw-r--r--lib/mods/theme/help/essences.txt219
-rw-r--r--lib/mods/theme/help/experien.hlp28
-rw-r--r--lib/mods/theme/help/explore.hlp16
-rw-r--r--lib/mods/theme/help/fatespoi.txt28
-rw-r--r--lib/mods/theme/help/foot.aux4
-rw-r--r--lib/mods/theme/help/g_aule.txt61
-rw-r--r--lib/mods/theme/help/g_eru.txt65
-rw-r--r--lib/mods/theme/help/g_mandos.txt56
-rw-r--r--lib/mods/theme/help/g_manwe.txt62
-rw-r--r--lib/mods/theme/help/g_melkor.txt65
-rw-r--r--lib/mods/theme/help/g_tulkas.txt45
-rw-r--r--lib/mods/theme/help/g_ulmo.txt58
-rw-r--r--lib/mods/theme/help/g_varda.txt54
-rw-r--r--lib/mods/theme/help/g_yavann.txt62
-rw-r--r--lib/mods/theme/help/gambling.txt29
-rw-r--r--lib/mods/theme/help/general.txt39
-rw-r--r--lib/mods/theme/help/gods.txt42
-rw-r--r--lib/mods/theme/help/head.aux10
-rw-r--r--lib/mods/theme/help/help.hlp33
-rw-r--r--lib/mods/theme/help/index.txt636
-rw-r--r--lib/mods/theme/help/inscrip.txt65
-rw-r--r--lib/mods/theme/help/lua.hlp34
-rw-r--r--lib/mods/theme/help/lua_gf.txt45
-rw-r--r--lib/mods/theme/help/lua_intr.txt133
-rw-r--r--lib/mods/theme/help/lua_mon.txt535
-rw-r--r--lib/mods/theme/help/lua_play.txt1225
-rw-r--r--lib/mods/theme/help/lua_pow.txt266
-rw-r--r--lib/mods/theme/help/lua_ques.txt299
-rw-r--r--lib/mods/theme/help/lua_skil.txt342
-rw-r--r--lib/mods/theme/help/lua_spel.txt2150
-rw-r--r--lib/mods/theme/help/lua_util.txt898
-rw-r--r--lib/mods/theme/help/luckspoi.txt129
-rw-r--r--lib/mods/theme/help/m_air.txt42
-rw-r--r--lib/mods/theme/help/m_convey.txt71
-rw-r--r--lib/mods/theme/help/m_demono.txt44
-rw-r--r--lib/mods/theme/help/m_divin.txt38
-rw-r--r--lib/mods/theme/help/m_earth.txt35
-rw-r--r--lib/mods/theme/help/m_fire.txt53
-rw-r--r--lib/mods/theme/help/m_geoman.txt75
-rw-r--r--lib/mods/theme/help/m_mana.txt40
-rw-r--r--lib/mods/theme/help/m_meta.txt75
-rw-r--r--lib/mods/theme/help/m_mimic.txt33
-rw-r--r--lib/mods/theme/help/m_mind.txt49
-rw-r--r--lib/mods/theme/help/m_mindcr.txt54
-rw-r--r--lib/mods/theme/help/m_music.txt77
-rw-r--r--lib/mods/theme/help/m_nature.txt54
-rw-r--r--lib/mods/theme/help/m_necrom.txt35
-rw-r--r--lib/mods/theme/help/m_symbio.txt50
-rw-r--r--lib/mods/theme/help/m_tempo.txt42
-rw-r--r--lib/mods/theme/help/m_thaum.txt31
-rw-r--r--lib/mods/theme/help/m_udun.txt35
-rw-r--r--lib/mods/theme/help/m_water.txt34
-rw-r--r--lib/mods/theme/help/macrofaq.txt2360
-rw-r--r--lib/mods/theme/help/magic.hlp41
-rw-r--r--lib/mods/theme/help/magic.txt143
-rw-r--r--lib/mods/theme/help/newbie.hlp16
-rw-r--r--lib/mods/theme/help/option.txt697
-rw-r--r--lib/mods/theme/help/r_beorn.txt33
-rw-r--r--lib/mods/theme/help/r_demon.txt31
-rw-r--r--lib/mods/theme/help/r_dragon.txt33
-rw-r--r--lib/mods/theme/help/r_drkelf.txt33
-rw-r--r--lib/mods/theme/help/r_druadan.txt32
-rw-r--r--lib/mods/theme/help/r_dunad.txt32
-rw-r--r--lib/mods/theme/help/r_dwarf.txt39
-rw-r--r--lib/mods/theme/help/r_eagle.txt32
-rw-r--r--lib/mods/theme/help/r_easterl.txt34
-rw-r--r--lib/mods/theme/help/r_elf.txt32
-rw-r--r--lib/mods/theme/help/r_ent.txt39
-rw-r--r--lib/mods/theme/help/r_gnome.txt36
-rw-r--r--lib/mods/theme/help/r_hafelf.txt31
-rw-r--r--lib/mods/theme/help/r_hafogr.txt31
-rw-r--r--lib/mods/theme/help/r_hielf.txt34
-rw-r--r--lib/mods/theme/help/r_hobbit.txt39
-rw-r--r--lib/mods/theme/help/r_human.txt23
-rw-r--r--lib/mods/theme/help/r_maia.txt20
-rw-r--r--lib/mods/theme/help/r_orc.txt35
-rw-r--r--lib/mods/theme/help/r_pettyd.txt30
-rw-r--r--lib/mods/theme/help/r_rohank.txt33
-rw-r--r--lib/mods/theme/help/r_troll.txt34
-rw-r--r--lib/mods/theme/help/r_wodelf.txt37
-rw-r--r--lib/mods/theme/help/r_yeek.txt30
-rw-r--r--lib/mods/theme/help/rm_adanrog.txt31
-rw-r--r--lib/mods/theme/help/rm_aewrog.txt35
-rw-r--r--lib/mods/theme/help/rm_barb.txt38
-rw-r--r--lib/mods/theme/help/rm_black.txt31
-rw-r--r--lib/mods/theme/help/rm_blue.txt31
-rw-r--r--lib/mods/theme/help/rm_cabrog.txt35
-rw-r--r--lib/mods/theme/help/rm_class.txt14
-rw-r--r--lib/mods/theme/help/rm_drarog.txt34
-rw-r--r--lib/mods/theme/help/rm_ether.txt32
-rw-r--r--lib/mods/theme/help/rm_green.txt30
-rw-r--r--lib/mods/theme/help/rm_herm.txt36
-rw-r--r--lib/mods/theme/help/rm_hurog.txt27
-rw-r--r--lib/mods/theme/help/rm_limrog.txt33
-rw-r--r--lib/mods/theme/help/rm_lsoul.txt26
-rw-r--r--lib/mods/theme/help/rm_lygrog.txt27
-rw-r--r--lib/mods/theme/help/rm_narrog.txt34
-rw-r--r--lib/mods/theme/help/rm_rawrog.txt30
-rw-r--r--lib/mods/theme/help/rm_red.txt30
-rw-r--r--lib/mods/theme/help/rm_sarnrog.txt30
-rw-r--r--lib/mods/theme/help/rm_skel.txt40
-rw-r--r--lib/mods/theme/help/rm_spec.txt44
-rw-r--r--lib/mods/theme/help/rm_vamp.txt32
-rw-r--r--lib/mods/theme/help/rm_white.txt32
-rw-r--r--lib/mods/theme/help/rm_zomb.txt39
-rw-r--r--lib/mods/theme/help/skills.txt539
-rw-r--r--lib/mods/theme/help/spoil_faq.txt63
-rw-r--r--lib/mods/theme/help/spoiler.hlp18
-rw-r--r--lib/mods/theme/help/tome_faq.txt381
-rw-r--r--lib/mods/theme/help/version.txt354
-rw-r--r--lib/mods/theme/help/whattome.txt30
-rw-r--r--lib/mods/theme/help/wishing.txt24
-rw-r--r--lib/mods/theme/module.lua48
-rw-r--r--lib/mods/theme/note/delete.me1
-rw-r--r--lib/mods/theme/permission.txt3
-rw-r--r--lib/mods/theme/pref/422color.prf909
-rw-r--r--lib/mods/theme/pref/colors.prf53
-rw-r--r--lib/mods/theme/pref/font-ami.prf28
-rw-r--r--lib/mods/theme/pref/font-dos.prf8
-rw-r--r--lib/mods/theme/pref/font-ibm.prf365
-rw-r--r--lib/mods/theme/pref/font-mac.new110
-rw-r--r--lib/mods/theme/pref/font-mac.prf18
-rw-r--r--lib/mods/theme/pref/font-win.prf304
-rw-r--r--lib/mods/theme/pref/font-x11.prf22
-rw-r--r--lib/mods/theme/pref/font-xxx.prf472
-rw-r--r--lib/mods/theme/pref/font.prf60
-rw-r--r--lib/mods/theme/pref/graf-ami.prf64
-rw-r--r--lib/mods/theme/pref/graf-dos.prf15
-rw-r--r--lib/mods/theme/pref/graf-ibm.prf6237
-rw-r--r--lib/mods/theme/pref/graf-iso.prf5963
-rw-r--r--lib/mods/theme/pref/graf-mac.prf15
-rw-r--r--lib/mods/theme/pref/graf-new.prf6934
-rw-r--r--lib/mods/theme/pref/graf-sdl.prf37
-rw-r--r--lib/mods/theme/pref/graf-win.prf16
-rw-r--r--lib/mods/theme/pref/graf-x11.prf37
-rw-r--r--lib/mods/theme/pref/graf-xxx.prf3267
-rw-r--r--lib/mods/theme/pref/graf.prf51
-rw-r--r--lib/mods/theme/pref/pref-acn.prf24
-rw-r--r--lib/mods/theme/pref/pref-ami.prf7
-rw-r--r--lib/mods/theme/pref/pref-emx.prf19
-rw-r--r--lib/mods/theme/pref/pref-gcu.prf70
-rw-r--r--lib/mods/theme/pref/pref-mac.prf243
-rw-r--r--lib/mods/theme/pref/pref-sdl.prf144
-rw-r--r--lib/mods/theme/pref/pref-win.prf534
-rw-r--r--lib/mods/theme/pref/pref-x11.prf413
-rw-r--r--lib/mods/theme/pref/pref.prf311
-rw-r--r--lib/mods/theme/pref/trap-xxx.prf428
-rw-r--r--lib/mods/theme/pref/user.prf50
-rw-r--r--lib/mods/theme/pref/xtra-gcu.prf34
-rw-r--r--lib/mods/theme/pref/xtra-new.prf63
-rw-r--r--lib/mods/theme/pref/xtra-xxx.prf137
-rw-r--r--lib/mods/theme/save/delete.me1
-rw-r--r--lib/mods/theme/scpt/bounty.lua90
-rw-r--r--lib/mods/theme/scpt/corrupt.lua1089
-rw-r--r--lib/mods/theme/scpt/drunk.lua21
-rw-r--r--lib/mods/theme/scpt/fireprof.lua415
-rw-r--r--lib/mods/theme/scpt/god.lua812
-rw-r--r--lib/mods/theme/scpt/gods.lua26
-rw-r--r--lib/mods/theme/scpt/gods_new.lua454
-rw-r--r--lib/mods/theme/scpt/gondolin.lua63
-rw-r--r--lib/mods/theme/scpt/help.lua445
-rw-r--r--lib/mods/theme/scpt/init.lua56
-rw-r--r--lib/mods/theme/scpt/intro.lua43
-rw-r--r--lib/mods/theme/scpt/joke.lua31
-rw-r--r--lib/mods/theme/scpt/library.lua439
-rw-r--r--lib/mods/theme/scpt/mimic.lua419
-rw-r--r--lib/mods/theme/scpt/misc.lua213
-rw-r--r--lib/mods/theme/scpt/mkeys.lua95
-rw-r--r--lib/mods/theme/scpt/monsters.lua182
-rw-r--r--lib/mods/theme/scpt/player.lua196
-rw-r--r--lib/mods/theme/scpt/powers.lua61
-rw-r--r--lib/mods/theme/scpt/s_air.lua193
-rw-r--r--lib/mods/theme/scpt/s_aule.lua222
-rw-r--r--lib/mods/theme/scpt/s_convey.lua226
-rw-r--r--lib/mods/theme/scpt/s_demon.lua337
-rw-r--r--lib/mods/theme/scpt/s_divin.lua230
-rw-r--r--lib/mods/theme/scpt/s_earth.lua184
-rw-r--r--lib/mods/theme/scpt/s_eru.lua130
-rw-r--r--lib/mods/theme/scpt/s_fire.lua227
-rw-r--r--lib/mods/theme/scpt/s_geom.lua656
-rw-r--r--lib/mods/theme/scpt/s_mana.lua132
-rw-r--r--lib/mods/theme/scpt/s_mandos.lua186
-rw-r--r--lib/mods/theme/scpt/s_manwe.lua144
-rw-r--r--lib/mods/theme/scpt/s_melkor.lua154
-rw-r--r--lib/mods/theme/scpt/s_meta.lua287
-rw-r--r--lib/mods/theme/scpt/s_mind.lua132
-rw-r--r--lib/mods/theme/scpt/s_music.lua443
-rw-r--r--lib/mods/theme/scpt/s_nature.lua184
-rw-r--r--lib/mods/theme/scpt/s_stick.lua494
-rw-r--r--lib/mods/theme/scpt/s_tempo.lua162
-rw-r--r--lib/mods/theme/scpt/s_tulkas.lua81
-rw-r--r--lib/mods/theme/scpt/s_udun.lua180
-rw-r--r--lib/mods/theme/scpt/s_ulmo.lua147
-rw-r--r--lib/mods/theme/scpt/s_varda.lua140
-rw-r--r--lib/mods/theme/scpt/s_water.lua154
-rw-r--r--lib/mods/theme/scpt/s_yavann.lua157
-rw-r--r--lib/mods/theme/scpt/spells.lua627
-rw-r--r--lib/mods/theme/scpt/stores.lua161
-rw-r--r--lib/mods/theme/theme.txt313
-rw-r--r--lib/mods/theme/user/all.prf520
-rw-r--r--lib/mods/theme/user/automat.atm667
-rw-r--r--lib/mods/theme/user/fierce.atm761
-rw-r--r--lib/module.lua2
-rw-r--r--lib/scpt/fireprof.lua67
-rw-r--r--lib/scpt/intro.lua66
-rw-r--r--lib/scpt/library.lua81
-rw-r--r--lib/scpt/stores.lua19
-rw-r--r--src/CMakeLists.txt4
-rw-r--r--src/angband.h10
-rw-r--r--src/birth.c141
-rw-r--r--src/bldg.c127
-rw-r--r--src/cave.c240
-rw-r--r--src/cmd1.c492
-rw-r--r--src/cmd2.c309
-rw-r--r--src/cmd3.c267
-rw-r--r--src/cmd4.c174
-rw-r--r--src/cmd5.c55
-rw-r--r--src/cmd6.c355
-rw-r--r--src/cmd7.c561
-rw-r--r--src/cmovie.c20
-rw-r--r--src/config.h134
-rw-r--r--src/defines.h23
-rw-r--r--src/dungeon.c339
-rw-r--r--src/dungeon.pkg11
-rw-r--r--src/externs.h1217
-rw-r--r--src/files.c1229
-rw-r--r--src/gen_evol.c7
-rw-r--r--src/gen_maze.c5
-rw-r--r--src/generate.c230
-rw-r--r--src/gods.c7
-rw-r--r--src/h-config.h4
-rw-r--r--src/h-system.h2
-rw-r--r--src/h-type.h15
-rw-r--r--src/help.c2
-rw-r--r--src/init1.c140
-rw-r--r--src/init2.c414
-rw-r--r--src/irc.c297
-rw-r--r--src/iso/hackdef.h44
-rw-r--r--src/iso/readme.txt6
-rw-r--r--src/iso/simgraph.c1429
-rw-r--r--src/iso/simgraph.h159
-rw-r--r--src/iso/simsys.h197
-rw-r--r--src/iso/simview.c87
-rw-r--r--src/iso/simview.h41
-rw-r--r--src/iso/walls4.h288
-rw-r--r--src/iso/walls9.h288
-rw-r--r--src/iso/world_adaptor.c226
-rw-r--r--src/iso/world_adaptor.h117
-rw-r--r--src/iso/world_view.c499
-rw-r--r--src/iso/world_view.h49
-rw-r--r--src/levels.c18
-rw-r--r--src/load_gif.c384
-rw-r--r--src/loadsave.c619
-rw-r--r--src/lua/tolua.h4
-rw-r--r--src/lua_bind.c303
-rwxr-xr-xsrc/maid-x11.c45
-rw-r--r--src/maim-iso.c873
-rw-r--r--src/main-cap.c1075
-rw-r--r--src/main-crb.c69
-rw-r--r--src/main-gcu.c35
-rw-r--r--src/main-gtk.c5251
-rw-r--r--src/main-gtk2.c428
-rw-r--r--src/main-net.c442
-rw-r--r--src/main-sdl-iso.c1955
-rw-r--r--src/main-sdl.c678
-rw-r--r--src/main-sla.c2
-rw-r--r--src/main-win.c165
-rw-r--r--src/main-x11.c105
-rw-r--r--src/main-xaw.c111
-rw-r--r--src/main-xxx.c2
-rw-r--r--src/main.c242
-rw-r--r--src/melee1.c241
-rw-r--r--src/melee2.c285
-rw-r--r--src/modules.c13
-rw-r--r--src/monster1.c61
-rw-r--r--src/monster2.c167
-rw-r--r--src/monster3.c73
-rw-r--r--src/notes.c3
-rw-r--r--src/object1.c583
-rw-r--r--src/object2.c200
-rw-r--r--src/player.pkg6
-rw-r--r--src/plots.c28
-rw-r--r--src/plots.h55
-rw-r--r--src/powers.c46
-rw-r--r--src/q_betwen.c18
-rw-r--r--src/q_dragons.c10
-rw-r--r--src/q_eol.c14
-rw-r--r--src/q_evil.c10
-rw-r--r--src/q_haunted.c10
-rw-r--r--src/q_hobbit.c30
-rw-r--r--src/q_invas.c20
-rw-r--r--src/q_main.c18
-rw-r--r--src/q_narsil.c22
-rw-r--r--src/q_nazgul.c18
-rw-r--r--src/q_nirna.c14
-rw-r--r--src/q_one.c47
-rw-r--r--src/q_poison.c22
-rw-r--r--src/q_rand.c61
-rw-r--r--src/q_shroom.c23
-rw-r--r--src/q_spider.c12
-rw-r--r--src/q_thief.c14
-rw-r--r--src/q_thrain.c26
-rw-r--r--src/q_troll.c16
-rw-r--r--src/q_ultrae.c2
-rw-r--r--src/q_ultrag.c18
-rw-r--r--src/q_wight.c12
-rw-r--r--src/q_wolves.c10
-rw-r--r--src/randart.c40
-rw-r--r--src/script.c95
-rw-r--r--src/skills.c187
-rw-r--r--src/spells.pkg50
-rw-r--r--src/spells1.c229
-rw-r--r--src/spells2.c510
-rw-r--r--src/squeltch.c8
-rw-r--r--src/status.c12
-rw-r--r--src/store.c128
-rw-r--r--src/tables.c51
-rw-r--r--src/traps.c374
-rw-r--r--src/types.h259
-rw-r--r--src/util.c407
-rw-r--r--src/util.pkg70
-rw-r--r--src/variable.c369
-rw-r--r--src/wild.c57
-rw-r--r--src/wizard1.c4
-rw-r--r--src/wizard2.c65
-rw-r--r--src/xtra1.c125
-rw-r--r--src/xtra2.c2673
-rw-r--r--src/z-form.c4
-rw-r--r--src/z-form.h7
-rw-r--r--src/z-rand.c2
-rw-r--r--src/z-rand.h9
-rw-r--r--src/z-sock.c787
-rw-r--r--src/z-sock.h127
-rw-r--r--src/z-term.c365
-rw-r--r--src/z-term.h68
-rw-r--r--src/z-util.c15
-rw-r--r--src/z-util.h17
-rw-r--r--src/z-virt.h45
-rw-r--r--src/z_pack.pkg295
643 files changed, 129933 insertions, 29451 deletions
diff --git a/BUGS.txt b/BUGS.txt
index ddac58c3..9a88aaed 100644
--- a/BUGS.txt
+++ b/BUGS.txt
@@ -3,3 +3,4 @@ Known Bugs:
- If you save the game during the Thieves Quest in Bree, it will not be able to load.
- Under Linux the X11 front-end does not work properly when NumLock is on.
+- Using modules: Automatizer save (+ note save, etc.) don't autocreate the module directory in the save directory hierarchy...
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 547e50d1..c93bebd6 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -10,22 +10,12 @@ IF(CMAKE_COMPILER_IS_GNUCC)
# Let's set sensible options.
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pipe -Wall -Wno-unused-value")
SET(CMAKE_C_FLAGS_RELEASE "-O2")
- SET(CMAKE_C_FLAGS_DEBUG "-O1 -g")
+ SET(CMAKE_C_FLAGS_DEBUG "-O0 -g")
ENDIF()
# Add definitions.
-ADD_DEFINITIONS(-DUSE_EGO_GRAPHICS)
-ADD_DEFINITIONS(-DUSE_TRANSPARENCY)
-ADD_DEFINITIONS(-DSUPPORT_GAMMA)
ADD_DEFINITIONS(-DUSE_PRECISE_CMOVIE)
-# Which socket implementation are we using?
-IF(WIN32)
-ADD_DEFINITIONS(-DUSE_WINSOCK)
-ELSE()
-ADD_DEFINITIONS(-DUSE_UNIXSOCK)
-ENDIF()
-
#
# X11 support (OPTIONAL)
#
diff --git a/DEBUG.txt b/DEBUG.txt
new file mode 100644
index 00000000..f7146c28
--- /dev/null
+++ b/DEBUG.txt
@@ -0,0 +1,8 @@
+Debugging
+=========
+
+To turn on Debug mode when compiling run cmake with the
+
+ -DCMAKE_BUILD_TYPE=Debug
+
+parameter.
diff --git a/README.txt b/README.txt
index 463d648c..1e0ad583 100644
--- a/README.txt
+++ b/README.txt
@@ -15,7 +15,7 @@ Simply run the commands below.
You should now be able to run
- $ ./src/tome2
+ $ ./src/tome
to start ToME.
@@ -76,6 +76,9 @@ Compiling on Windows using MinGW
(See http://www.mingw.org/)
+The source MUST be unpacked in a directory without spaces in the
+name.
+
To compile on Windows using MinGW, use the commands
$ cmake -G "MinGW Makefiles"
diff --git a/changes.txt b/changes.txt
index e9ed9593..d95e9b11 100644
--- a/changes.txt
+++ b/changes.txt
@@ -1,3 +1,38 @@
+T.o.M.E 2.3.10 (ah)
+
+User Interface:
+
+- Always display list of selectable objects, i.e. remove the option of
+ pressing '*' to hide list.
+- GTK2: Allow running with Shift + arrow keys. (Thanks to Lord
+ Estraven.)
+- SDL fixes. (Thanks to Lord Estraven.)
+- System-wide character scores were removed. Use the ladder at
+ http://angband.oook.cz instead.
+- Panic saves are no longer created. Saving state when memory is
+ likely corrupted seems like a bad idea.
+- Remove long-obsolete front-ends.
+- Unix: Removed pointless and error-prone signal handling aimed at
+ preventing cheating.
+- Removed gamma correction.
+
+Game:
+
+- Killerbunnies: Character dump now lists companions.
+- Killerbunnies: Fix dodge messages.
+- Imported Theme 1.2.0 since this excellent module by Furiosity seems
+ to not be downloadable any more.
+- Further Thaumaturgy tweaks by Lord Estraven
+
+Build:
+
+- Setuid support REMOVED; do NOT install ToME as setuid!
+- Fixes for system installation. Thanks to 'darwin' for reporting.
+- Fix linking problem with the 'curses' front-end.
+- Add DEBUG.txt file for information on enabling debugging in builds.
+
+
+
T.o.M.E 2.3.9 (ah)
User Interface:
diff --git a/lib/CMakeLists.txt b/lib/CMakeLists.txt
index acb87b25..44d7d1ee 100644
--- a/lib/CMakeLists.txt
+++ b/lib/CMakeLists.txt
@@ -14,7 +14,6 @@ INSTALL(DIRECTORY
info
mods
note
- plot
pref
save
scpt
diff --git a/lib/core/crpt_aux.lua b/lib/core/crpt_aux.lua
index e4f16e2a..97f8d4b6 100644
--- a/lib/core/crpt_aux.lua
+++ b/lib/core/crpt_aux.lua
@@ -180,64 +180,3 @@ function add_corruption(c)
return (__corruptions_max - 1)
end
-
-
----------- Corruption spoiler generator -----------
-function corruption_spoiler_generate()
- make_temp_file()
- print_hook(
-[[~~~~~01|Corruptions (Spoiler)
-~~~~~02|Spoilers|Corruptions
-#####R=== ToME Corruptions Spoiler ===
-
-Sometimes adventurers become exposed to the dark powers of Morgoth. If they
-are unable to resist these powers, they become corrupted. Corruptions can
-change their physical or mental abilities, some of which can be good, and
-some bad. Most corruptions will affect you permanently, although some only
-operate when they are activated (whether by player choice or as a random
-event). You can check which corruptions you have in the knowledge screen 6
-(accessed through the '~' menu) or in a character dump.
-
-#####GGaining and (not) losing corruptions
-There are several ways that you can become corrupted.
-
-You can become corrupted by quaffing a Potion of Corruption or by drinking
-from a Fountain of Corruption. Also some strange items can be activated
-for corruption.
-
-Corruptions are permanent. Once you have one, you have it for life.
-
-]])
- local i, e
- for i = 0, __corruptions_max - 1 do
- print_hook("[[[[[B"..__corruptions[i].name.."]\n")
- print_hook(__corruptions[i].desc)
- print_hook("[[[[[GGain message: "..__corruptions[i].get_text.."]\n")
- if __corruptions[i].removable == TRUE then
- print_hook("[[[[[RLose message: "..__corruptions[i].lose_text.."]\n")
- else
- print_hook("It is not removable.\n")
- end
-
- local ok
- ok = nil
- for e, _ in __corruptions[i].depends do ok = not nil end
- if ok then
- print_hook("It depends on:\n")
- for e, _ in __corruptions[i].depends do
- print_hook(" "..__corruptions[e].name.."\n")
- end
- end
- ok = nil
- for e, _ in __corruptions[i].oppose do ok = not nil end
- if ok then
- print_hook("It is opposed to:\n")
- for e, _ in __corruptions[i].oppose do
- print_hook(" "..__corruptions[e].name.."\n")
- end
- end
- print_hook("\n\n")
- end
- close_temp_file()
- msg_print("File created as: "..get_temp_name())
-end
diff --git a/lib/core/dungeon.lua b/lib/core/dungeon.lua
index 2877838d..d91d785b 100644
--- a/lib/core/dungeon.lua
+++ b/lib/core/dungeon.lua
@@ -46,22 +46,6 @@ function rotate_dir(dir, mov)
return dir
end
--- Check if the map is a filename or directly a map
-function load_map(map, y, x)
- if strsub(map, 1, 5) == "#!map" then
- %load_map(TRUE, map, y, x)
- else
- %load_map(FALSE, map, y, x)
- end
-end
-function get_map_size(map)
- if strsub(map, 1, 5) == "#!map" then
- return %get_map_size(TRUE, map)
- else
- return %get_map_size(FALSE, map)
- end
-end
-
-- Place a trap for a specific level
function place_trap(y, x, level)
local old_dun = dun_level
@@ -69,38 +53,3 @@ function place_trap(y, x, level)
%place_trap(y, x)
dun_level = old_dun
end
-
--- Level generators processing
-__level_generators = {}
-
-function level_generator(t)
- assert(t.name, "no generator name")
- assert(t.gen, "no generator function")
-
- if not t.stairs then t.stairs = TRUE end
- if not t.monsters then t.monsters = TRUE end
- if not t.objects then t.objects = TRUE end
- if not t.miscs then t.miscs = TRUE end
-
- __level_generators[t.name] = t.gen
- add_scripted_generator(t.name, t.stairs, t.monsters, t.objects, t.miscs)
-end
-
-function level_generate(name)
- assert(__level_generators[name], "Unknown level generator '"..name.."'")
- return __level_generators[name]()
-end
-
---[[ Example
-level_generator
-{
- ["name"] = "test",
- ["gen"] = function()
- print("zog")
- for i = 1, 30 do
- cave(i, 2).feat = 1
- end
- return new_player_spot(get_branch())
- end,
-}
-]]
diff --git a/lib/core/init.lua b/lib/core/init.lua
index 9a9ec1ee..11b812d5 100644
--- a/lib/core/init.lua
+++ b/lib/core/init.lua
@@ -14,7 +14,6 @@ tome_dofile_anywhere(ANGBAND_DIR_CORE, "util.lua")
tome_dofile_anywhere(ANGBAND_DIR_CORE, "player.lua")
tome_dofile_anywhere(ANGBAND_DIR_CORE, "objects.lua")
tome_dofile_anywhere(ANGBAND_DIR_CORE, "monsters.lua")
-tome_dofile_anywhere(ANGBAND_DIR_CORE, "powers.lua")
tome_dofile_anywhere(ANGBAND_DIR_CORE, "building.lua")
tome_dofile_anywhere(ANGBAND_DIR_CORE, "dungeon.lua")
tome_dofile_anywhere(ANGBAND_DIR_CORE, "s_aux.lua")
diff --git a/lib/core/load2.lua b/lib/core/load2.lua
index 7ea432e9..7e151d91 100644
--- a/lib/core/load2.lua
+++ b/lib/core/load2.lua
@@ -12,13 +12,6 @@ function __savefile_load(key, val)
end
end
-function dump_loadsave()
- local k, e
- for k, e in __loadsave_name do
- msg_print(k.." :: ".. e.name.." ["..e.default.."]")
- end
-end
-
-- called when the game is saved, can only save numbers
-- assosiate a key with them to allow the loading code to recognize them
function __savefile_save()
diff --git a/lib/core/player.lua b/lib/core/player.lua
index 3017d94f..16878228 100644
--- a/lib/core/player.lua
+++ b/lib/core/player.lua
@@ -133,8 +133,3 @@ function subrace_add_power(subrace, power)
end
return nil
end
-
--- Body parts
-function player.add_body_part(part, nb)
- player.extra_body_parts[part + 1] = player.extra_body_parts[part + 1] + nb
-end
diff --git a/lib/core/powers.lua b/lib/core/powers.lua
deleted file mode 100644
index 839a921d..00000000
--- a/lib/core/powers.lua
+++ /dev/null
@@ -1,105 +0,0 @@
---
--- Helper functions for magic powers
---
-
-__magic_powers = {}
-
-function add_magic(m)
- local i, ret
-
- if type(m.spell_list) ~= "table" then
- error("add_magic called without a table")
- end
-
- -- Ok iterate over all the powers to add
- local index, p, max
-
- -- First, count them
- max = 0
- for index, p in m.spell_list do
- max = max + 1
- end
-
- -- Now register it
- ret = {}
- i = new_magic_power(max)
- ret.spells = i
- ret.max = max
- ret.fail_fct = m.fail
- if m.stat then
- ret.stat = m.stat
- else
- ret.stat = A_INT
- end
- if m.get_level then
- ret.get_current_level = m.get_level
- else
- ret.get_current_level = function()
- return player.lev
- end
- end
-
- -- And add each spells
- max = 0
- ret.info = {}
- ret.spell = {}
- for index, p in m.spell_list do
- assert(p.name, "No name for the spell!")
- assert(p.desc, "No desc for the spell!")
- assert(p.mana, "No mana for the spell!")
- assert(p.level, "No level for the spell!")
- assert(p.fail, "No fail for the spell!")
- assert(p.info, "No info for the spell!")
- assert(p.spell, "No spell for the spell!")
-
- get_magic_power(i, max).name = p.name
- get_magic_power(i, max).desc = p.desc
- get_magic_power(i, max).mana_cost = p.mana
- get_magic_power(i, max).min_lev = p.level
- get_magic_power(i, max).fail = p.fail
- ret.info[max] = p.info
- ret.spell[max] = p.spell
-
- max = max + 1
- end
-
- return ret
-end
-
-function __get_magic_info(power)
- return __current_magic_power_info[power]()
-end
-
-function execute_magic(m)
- local sn, ret
-
- -- Ask for a spell
- __current_magic_power_info = m.info
- ret, sn = select_magic_power(0, m.spells, m.max, "__get_magic_info", m.get_current_level(), m.stat)
- if (ret == FALSE) then return end
-
- -- Verify mana needs
- if (get_magic_power(m.spells, sn).mana_cost > player.csp) then msg_print("Not enough mana!") return end
-
- -- Verify failure(second parameter is optional)
- if m.fail then
- __current_magic_power_fail = m.fail_fct
- if (magic_power_sucess(get_magic_power(m.spells, sn), m.stat, "__current_magic_power_fail") == FALSE) then return end
- else
- if (magic_power_sucess(get_magic_power(m.spells, sn), m.stat) == FALSE) then return end
- end
-
- -- Actually cast the spells
- m.spell[sn]()
-
- -- use up some mana
- increase_mana(-get_magic_power(m.spells, sn).mana_cost)
-end
-
--- Get the level of a power
-function get_level_power(s, max, min)
- if not max then max = 50 end
- if not min then min = 1 end
-
- return value_scale(s.get_current_level(), 50, max, min)
-end
diff --git a/lib/core/s_aux.lua b/lib/core/s_aux.lua
index abd1269d..ec609b04 100644
--- a/lib/core/s_aux.lua
+++ b/lib/core/s_aux.lua
@@ -276,6 +276,14 @@ function get_power_name(s)
end
end
+-- Get the level of a power
+function get_level_power(s, max, min)
+ if not max then max = 50 end
+ if not min then min = 1 end
+
+ return value_scale(s.get_current_level(), 50, max, min)
+end
+
-- Changes the amount of power(mana, piety, whatever) for the spell
function adjust_power(s, x)
if check_affect(s, "piety", FALSE) then
@@ -285,6 +293,22 @@ function adjust_power(s, x)
end
end
+-- Get spell school name(s) as a /-separated string.
+function spell_school_name(s)
+ local xx, sch_str
+ xx = nil
+ sch_str = ""
+ for index, sch in __spell_school[s] do
+ if xx then
+ sch_str = sch_str.."/"..school(sch).name
+ else
+ xx = 1
+ sch_str = sch_str..school(sch).name
+ end
+ end
+ return sch_str
+end
+
-- Print the book and the spells
function print_book(book, spl, obj)
local x, y, index, sch, size, s
@@ -309,16 +333,7 @@ function print_book(book, spl, obj)
else color = TERM_L_GREEN end
end
- xx = nil
- sch_str = ""
- for index, sch in __spell_school[s] do
- if xx then
- sch_str = sch_str.."/"..school(sch).name
- else
- xx = 1
- sch_str = sch_str..school(sch).name
- end
- end
+ sch_str = spell_school_name(s)
if na then
c_prt(color, format("%c) %-20s%-16s %3s %4s %3d%s %s", size + strbyte("a"), spell(s).name, sch_str, na, get_mana(s), spell_chance(s), "%", __spell_info[s]()), y, x)
@@ -523,47 +538,6 @@ function cast_school_spell(s, s_ptr, no_cost)
end
--- Helper functions
-HAVE_ARTIFACT = 0
-HAVE_OBJECT = 1
-HAVE_EGO = 2
-function have_object(mode, type, find, find2)
- local o, i, min, max
-
- max = 0
- min = 0
- if band(mode, USE_EQUIP) == USE_EQUIP then
- min = INVEN_WIELD
- max = INVEN_TOTAL
- end
- if band(mode, USE_INVEN) == USE_INVEN then
- min = 0
- if max == 0 then max = INVEN_WIELD end
- end
-
- i = min
- while i < max do
- o = get_object(i)
- if o.k_idx ~= 0 then
- if type == HAVE_ARTIFACT then
- if find == o.name1 then return i end
- end
- if type == HAVE_OBJECT then
- if find2 == nil then
- if find == o.k_idx then return i end
- else
- if (find == o.tval) and (find2 == o.sval) then return i end
- end
- end
- if type == HAVE_EGO then
- if (find == o.name2) or (find == o.name2b) then return i end
- end
- end
- i = i + 1
- end
- return -1
-end
-
-- Can the spell be randomly found(in random books)
function can_spell_random(i)
return __tmp_spells[i].random
diff --git a/lib/core/util.lua b/lib/core/util.lua
index 997f1eba..eea13014 100644
--- a/lib/core/util.lua
+++ b/lib/core/util.lua
@@ -71,92 +71,6 @@ function msg_print(c, m)
end
end
--- Returns the direction of the compass that y2, x2 is from y, x
--- the return value will be one of the following: north, south,
--- east, west, north-east, south-east, south-west, north-west,
--- or "close" if it is within 2 tiles.
-function compass(y, x, y2, x2)
- local y_axis, x_axis, y_diff, x_diff, compass_dir
-
- -- is it close to the north/south meridian?
- y_diff = y2 - y
-
- -- determine if y2, x2 is to the north or south of y, x
- if (y_diff > -3) and (y_diff < 3) then
- y_axis = nil
- elseif y2 > y then
- y_axis = "south"
- else
- y_axis = "north"
- end
-
- -- is it close to the east/west meridian?
- x_diff = x2 - x
-
- -- determine if y2, x2 is to the east or west of y, x
- if (x_diff > -3) and (x_diff < 3) then
- x_axis = nil
- elseif x2 > x then
- x_axis = "east"
- else
- x_axis = "west"
- end
-
- -- Maybe it is very close
- if ((not x_axis) and (not y_axis)) then compass_dir = "close"
- -- Maybe it is (almost) due N/S
- elseif not x_axis then compass_dir = y_axis
- -- Maybe it is (almost) due E/W
- elseif not y_axis then compass_dir = x_axis
- -- or if it is neither
- else compass_dir = y_axis.."-"..x_axis
- end
-
- return compass_dir
-end
-
--- Returns a relative approximation of the 'distance' of y2, x2 from y, x.
-function approximate_distance(y, x, y2, x2)
- local y_diff, x_diff, most_dist
-
- -- how far to away to the north/south
- y_diff = y2 - y
-
- -- make sure it's a positive integer
- if y_diff < 0 then
- y_diff = 0 - y_diff
- end
-
- -- how far to away to the east/west
- x_diff = x2 - x
-
- -- make sure it's a positive integer
- if x_diff < 0 then
- x_diff = 0 - x_diff
- end
-
- -- find which one is the larger distance
- if x_diff > y_diff then
- most_dist = x_diff
- else
- most_dist = y_diff
- end
-
- -- how far away then?
- if most_dist >= 41 then
- how_far = "a very long way"
- elseif most_dist >= 25 then
- how_far = "a long way"
- elseif most_dist >= 8 then
- how_far = "quite some way"
- else
- how_far = "not very far"
- end
-
- return how_far
-
-end
-
-- better timer add function
__timers_callback_max = 0
@@ -234,19 +148,6 @@ function msg_format(...)
msg_print(call(format, arg))
end
--- Stacks
-function stack_push(stack, val)
- tinsert(stack, val)
-end
-function stack_pop(stack)
- if getn(stack) >= 1 then
- return tremove(stack)
- else
- error("Tried to unstack an empty stack")
- return nil
- end
-end
-
-- A way to check if the game is now running(as opposed to initialization/character gen)
game = {}
add_hooks
diff --git a/lib/edit/fireprof.map b/lib/edit/fireprof.map
new file mode 100644
index 00000000..35f6bec4
--- /dev/null
+++ b/lib/edit/fireprof.map
@@ -0,0 +1,60 @@
+# Created by fearoffours (fearoffours@moppy.co.uk)
+# Made for ToME 2.1.x on 03/09/02
+
+# Permanent wall
+F:X:63:3
+
+# Floor with dirt
+F:.:88:3
+
+# shallow lava
+F:f:86:3
+
+# Deep lava
+F:F:85:3
+
+### Random Monsters and/or Items
+# Random object (upto 3 levels ood)
+F:!:88:5:0:*21
+
+# red mold
+F:m:88:5:324
+
+# Chimaera
+F:H:88:5:341
+
+# Red dragon bat
+F:b:88:5:377
+
+# Hellhound and
+# Random object (upto 7 levels ood) on normal floor
+F:C:88:5:613:*25
+
+# Quest exit
+F:<:6:3
+
+D:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+D:X......m.................H.........b...m......X
+D:X.............b...............................X
+D:X.......................m.....m.......H...b.C.X
+D:X...............m.!........b.............FFFf.X
+D:X.........m!............H....!........fffFFFffX
+D:X..................................fffFFFFFFfFX
+D:XFFf..............................fFFFFff..fffX
+D:XFFFff........FFFFFF...........fffFFFfff......X
+D:XfFFFFfff....FFFFFFFf.......fffFFFFFf.........X
+D:X.fFFFFFFff.FFFFFFFFFfF..fffFFFFFFff..........X
+D:X..fFFFFFFFffFFFfffFFFfffFFFFFFFFf............X
+D:X...fFFFFFFFFFFff.ffFFFFFFFFFFFff.............X
+D:X....fffFFFFFFff...ffFFFFFFFFFf...............X
+D:X.......ffFFFf.......ffffFFfff................X
+D:X.........fff.................................X
+D:X.............................................X
+D:X.............................................X
+D:X.............................................X
+D:X..................................<..........X
+D:X.............................................X
+D:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+
+# Starting position
+P:22:26
diff --git a/lib/edit/library.map b/lib/edit/library.map
new file mode 100644
index 00000000..2369fbd6
--- /dev/null
+++ b/lib/edit/library.map
@@ -0,0 +1,62 @@
+# Permanent wall
+F:X:63:3
+
+# Granite Wall
+F:#:57:3
+
+# Cobblestone Road
+F:O:200:3
+
+# Floor
+F:.:1:3
+
+# Lich
+F:l:200:3:518
+
+# Master lich
+F:L:200:3:658
+
+# Quest exit
+F:<:6:3
+
+D:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+D:X###############################################################X
+D:X#<OlOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO#X
+D:X#O#.###.#.###.#.###.#.###.#.###.O.###.#.###.#.###.#.###.#.###O#X
+D:X#O#.###.#.###.#.###.#.###.#.###.O.###.#.###.#.###.#.###.#.###O#X
+D:X#O#.###.#.###.#.###.#.###.#.###.O.###.#.###.#.###.#.###.#.###O#X
+D:X#O#.###.#.###.#.###.#.###.#.###.O.###.#.###.#.###.#.###.#.###O#X
+D:X#O#.###.#.###.#.###.#.###.#.###.O.###.#.###.#.###.#.###.#.###O#X
+D:X#O#.###.#.###.#.###.#.###.#.###.O.###.#.###.#.###.#.###.#.###O#X
+D:X#O#.###.#.###.#.###.#.###.#.###.O.###.#.###.#.###.#.###.#.###O#X
+D:X#O#.###.#.###.#.###.#.###.#.###.O.###.#.###.#.###.#.###.#.###O#X
+D:X#O#.###.#.###.#.###.#.###.#.###.O.###.#.###.#.###.#.###.#.###O#X
+D:X#O#.###.#.###.#.###.#.###.#.###.O.###.#.###.#.###.#.###.#.###O#X
+D:X#OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO#X
+D:X#O#.###.#.###.#.###.#.###.#.###.O.###.#.###.#.###.#.###.#.###O#X
+D:X#O#.###.#.###.#.###.#.###.#.###.O.###.#.###.#.###.#.###.#.###O#X
+D:X#O#.###.#.###.#.###.#.###.#.###.O.###.#.###.#.###.#.###.#.###O#X
+D:X#O#.###.#.###.#.###.#.###.#.###.O.###.#.###.#.###.#.###.#.###O#X
+D:X#O#.###.#.###.#.###.#.###.#.###.O.###.#.###.#.###.#.###.#.###O#X
+D:X#O#.###.#.###.#.###.#.###.#.###.O.###.#.###.#.###.#.###.#.###O#X
+D:X#O#.###.#.###.#.###.#.###.#.###.O.###.#.###.#.###.#.###.#.###O#X
+D:X#O#.###.#.###.#.###.#.###.#.###.O.###.#.###.#.###.#.###.#.###O#X
+D:X#O#.###.#.###.#.###.#.###.#.###.O.###.#.###.#.###.#.###.#.###O#X
+D:X#O#.###.#.###.#.###.#.###.#.###.O.###.#.###.#.###.#.###.#.###O#X
+D:X#OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO#X
+D:X#O#.###.#.###.#.###.#.###.#.###.O.###.#.###.#.###.#.###.#.###O#X
+D:X#O#.###.#.###.#.###.#.###.#.###.O.###.#.###.#.###.#.###.#.###O#X
+D:X#O#.###.#.###.#.###.#.###.#.###.O.###.#.###.#.###.#.###.#.###O#X
+D:X#O#.###.#.###.#.###.#.###.#.###.O.###.#.###.#.###.#.###.#.###O#X
+D:X#O#.###.#.###.#.###.#.###.#.###.O.###.#.###.#.###.#.###.#.###O#X
+D:X#O#.###.#.###.#.###.#.###.#.###.O.###.#.###.#.###.#.###.#.###O#X
+D:X#O#.###.#.###.#.###.#.###.#.###.O.###.#.###.#.###.#.###.#.###O#X
+D:X#O#.###.#.###.#.###.#.###.#.###.O.###.#.###.#.###.#.###.#.###O#X
+D:X#O#.###.#.###.#.###.#.###.#.###.O.###.#.###.#.###.#.###.#.###O#X
+D:X#O#.###.#.###.#.###.#.###.#.###.O.###.#.###.#.###.#.###.#.###O#X
+D:X#OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOL#X
+D:X###############################################################X
+D:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+
+# Starting position
+P:4:4
diff --git a/lib/help/debug.txt b/lib/help/debug.txt
index 56d57098..4d5e75da 100644
--- a/lib/help/debug.txt
+++ b/lib/help/debug.txt
@@ -27,7 +27,7 @@ will not be scored if you use debug commands.
*****debug.txt*25[m Magic Mapping] *****debug.txt*26[M Gain corruption]
*****debug.txt*27[n Summon named monster] *****debug.txt*28[N Summon _friendly_ named monster]
*****debug.txt*29[o Edit object attributes] O (unused)
- *****debug.txt*31[p Phase door] *****debug.txt*32[P Panic save]
+ *****debug.txt*31[p Phase door] P (unused)
*****debug.txt*33[q Get a quest] Q (unused)
*****debug.txt*35[r Gain reward] *****debug.txt*36[R Create a trap]
*****debug.txt*37[s Summon monster] *****debug.txt*38[S Change the feature of the map]
@@ -175,9 +175,6 @@ maximal legal value.
~~~~~31
[[[[[GPhase door (p)]
Like a Scroll of Phase Door.
-~~~~~32
-[[[[[GPanic save (P)]
- Save and quit the game, which is the same as doing a ^X.
~~~~~33
[[[[[GGet a quest (q)]
Get a quest.
diff --git a/lib/help/tome_faq.txt b/lib/help/tome_faq.txt
index 756ce639..7ad7a421 100644
--- a/lib/help/tome_faq.txt
+++ b/lib/help/tome_faq.txt
@@ -164,14 +164,6 @@ corrected it.
A: Void jumpgates are not automatic. You must press '>' while standing
on one to activate it.
-#####G------------------------------------------------------------------------------
-#####GQ: When it panic saves it reloads an old savefile !!
-
-A: Now the panic saves use a different file to save, savefile.pnc.
-This file will be loaded first, if present, when the game is started.
-If it loads successfully, save the game immediately. Otherwise, delete
-the panic save, and your old (non-panic) savefile should be safe.
-
~~~~~08|Monsters|They are talking to me!
#####G------------------------------------------------------------------------------
#####GQ: Farmer Maggot / Melinda Proudfoot keep shouting at me, and I cannot
diff --git a/lib/mods/theme/apex/delete.me b/lib/mods/theme/apex/delete.me
new file mode 100644
index 00000000..2e65efe2
--- /dev/null
+++ b/lib/mods/theme/apex/delete.me
@@ -0,0 +1 @@
+a \ No newline at end of file
diff --git a/lib/mods/theme/changelog.txt b/lib/mods/theme/changelog.txt
new file mode 100644
index 00000000..3cb3cb45
--- /dev/null
+++ b/lib/mods/theme/changelog.txt
@@ -0,0 +1,73 @@
+=== RECENT VERSION HISTORY (1.1.5 to 1.2.0) ===
+
+1.1.5 AKA "Angles and Corners"
+- Dropped the NOTICE flag from regular sandwalls.
+- Flight is now possible over wooden wilderness structures.
+- The Anduin River lost the CAN_RUN and DONT_NOTICE_RUNNING flags.
+- The Orc Cave now leads you out to the other side of the Misty Mountains.
+- Put an Eagles' nest into Khazad-Dum.
+
+- The Map of Thror no longer lives in the Bree town quest. It is now on a special (branch) level of the Barrow-Downs.
+- The Key of Thorin no longer lives in the Minas Anor town quest. It is now on a special (branch) level of Mirkwood.
+- Reworked the Bridge of Khazad-Dum level to be more nasty and random, played with the layout a bit.
+- Added new level "Orthanc" in the Isengard dungeon, based heavily on the one created by Burb Lulls. There is, however, a canonical twist (or two). >:)
+
+1.1.6 AKA "Curses to This Mirage"
+- Druids (r_info) lost the EVIL flag. These are supposed to be Yavanna's people and they're certainly not evil. The dark elven druids are stil evil.
+- All neutral monsters defined in r_info have been forced into the wilderness.
+- The coaligned spirits now have the GOOD flag. This is mostly to clean up the Mandos piety code (later).
+
+- Fixed the automatic stat gain script to forget stat gain on death, so the savefile can be reused and monster memory retained.
+- Drastically reduced piety gain for quaffing pots of corruption. It's meant to be a fun thematic addition, not a scumming tactic.
+- Aewroeg, Narroeg and Wainriders now start with their stated spellbooks
+
+1.1.7 AKA "Poor Madeleine"
+- Rings and amulets no longer ignore the elements. The rationale for this was that Middle-earth magical items are *really* magical and therefore powerful, but it was unbalancing, not to mention made it a pain destroying objects in the late game.
+- Rings of Lordly Protection have been renamed to 'of Arnor'
+- Pushed Potions of Corruption deeper into the dungeon.
+- Changed names on Aule's and Ulmo's spellbooks to be more impressive-sounding
+- Removed the miscellaneous food items, except for Longbottom leaf, milk and honey.
+- New item types: Ranger's Arrow, Throwing Axe, Buckler, Small Mithril Boomerang, Mithril Boomerang (the latter three adapted from FuryMod)
+
+1.1.8 AKA "Little White Candle"
+- Weapons of Unmagic now have negative to-hit and to-dam modifiers; demonology equipment can no longer get this ego type.
+- Reworked the T-Plus "Rogue" ego type for boots to balance it: reduced the pval, added to_h and to_d penalties and made the stealth and luck bonuses rarer.
+- Boots of Elvenkind no longer guarantee a speed bonus; chance is 50%.
+- Pushed 'of the Maiar' items deeper into the dungeon.
+- Filthy Rags of Leprousness are no more; they're replaced by Armour of Dunharrow (same effects, but can show up on all soft & hard armour plus cloaks)
+- A number of the "bad" ego types got the aggravation flag to offset the benefits of flip-scumming.
+- Drastically reduced magic breath chances on Ethereal robes and cloaks.
+- The 'of Lordliness' ego type is now 'of Arnor'; 'of Might' is now 'of Gondor'; 'of Nothingness' is now 'of Angmar'; boots of speed are now 'of Rohan' and all 'of Stealth' is now 'of Eriador'. Because of the hobbit connection, the 'of Eriador' items now have a 10% chance of a luck bonus equal to the stealth bonus (which remains at 100%).
+- The 'of Arnor' and 'of Gondor' ego types can now show up on all headgear, not just crowns.
+- The 'Sharp' ego has been extended to arrows and crossbow bolts (I added a new index and called them 'Sharpened' to make sure the additional cost is not exorbitant).
+- The 'of Sensitivity' ego type is no longer possible on body armour; there were too many T-lines in e_info.txt.
+- The 'Elemental' ego type on rings is only possible on high-level rings and amulets now; same reason as above.
+- The 'Blazing' ego type is now only possible on crowns, high-level rings and amulets; same reason as above.
+- The 'Radiant' ego type is now only possible on crowns, high-level rings and all amulets (as before); same reason as above.
+- The 'Glowing' and 'Dazzling' ego types are now only possible on crowns and low-level rings and amulets; same reason as above.
+- Rings of the Elements have been removed; one Elemental ego for jewelry is enough.
+- New ego types: Magical for jewelry, cloaks, soft armour and gloves -- makes the item ignore the elements and gives a 50% chance of the ability to store a spell. Magical for missile launchers -- adds a tiny boost to mana; designed with magic-using archer and warrior-types in mind.
+
+1.1.9 AKA "Kit Bag Full of Marbles"
+- Randart magestaves can now gain % to life
+- Randart armour, lights, jewelry and magestaves can now get the ability to store a spell
+- Randart high-level soft armour, hard armour and DSM can gain nether immunity
+- Randart light weapons (no broken ones) can gain sentience
+
+- Humans may no longer be Lost Souls for thematic reasons; the Doom of Men is that their fate after death is unknown to anyone except Eru. This applies to: Edain, Druedain, Rohirrim, Dunedain, Easterlings and Beornings. Also no longer allowed as LostSouls are yeeks, orcs, trolls and half-ogres.
+- Flying creatures (Eagles, Dragons, Aewroeg) now learn to fly high enough to pass mountains at clvl50.
+
+- FF now may also offer the following skills: Nature, Runecraft, Boulder-throwing.
+
+1.2.0 AKA "Twining Light"
+- Ultimate amulet no longer weighs 60lbs. >.>
+- Reworked the Paur* artifact gauntlets to be more thematic, added stat bonuses and sustains. I never liked the fact that it was a no-brainer which of them to keep if you had all four.
+- Fixed some rarity bugs with a number of Theme artifacts.
+- Removed the lesser (Dwarven) rings of power (except the Ring of Durin). They were taking up artifact space and didn't do much. They'll be back, tweaked, in a 3.0.0-compatible Theme.
+- Fixed some lurking bugs in in set_info
+- Reduced rarity on the Cloak of Valinor. It was a little incongruous that it cost far less than Ancanaur and was far more rare than is decent.
+- Gandalf's robe now gives fire immunity
+- Ancanaur is now a shadow blade, not a bluesteel blade.
+- The Golden Horn of the Thunderlords now ignores elements.
+- New artifacts: Erkenbrand's shield, Gimli's axe and shield.
+- New item set: Gimli's Gear (boots, axe, shield) \ No newline at end of file
diff --git a/lib/mods/theme/core/auto.lua b/lib/mods/theme/core/auto.lua
new file mode 100644
index 00000000..b758db52
--- /dev/null
+++ b/lib/mods/theme/core/auto.lua
@@ -0,0 +1,859 @@
+-- This file is the core of the Automatizer
+-- Please do not touch unless you know what you are doing
+
+__rules = {}
+__rules_max = 0
+
+rule_aux = {}
+
+-- Rule apply function, does .. nothing
+function auto_nothing(obj, item)
+ return
+end
+
+function auto_inscribe(obj, item, note)
+ if obj.note ~= 0 then return end
+ msg_print("<Auto-Inscribe {"..note.."}>")
+ obj.note = quark_add(note)
+ return TRUE
+end
+
+-- Rule apply function, pickup object
+function auto_pickup(obj, item)
+ if item >= 0 then return end
+ if inven_carry_okay(obj) == FALSE then return end
+ msg_print("<Auto-pickup>")
+ object_pickup(-item)
+ return TRUE
+end
+
+-- Rule apply function, destroy item
+function auto_destroy(obj, item)
+ -- be carefull to what we can destroy
+ -- Unaware things won't be destroyed.
+ if is_aware(obj) == FALSE then return end
+
+ -- Inscribed things won't be destroyed!
+ if obj.note ~= 0 then return end
+
+ -- Keep Artifacts -- they cannot be destroyed anyway
+ if is_artifact(obj) == TRUE then return end
+
+ -- Cannot destroy CURSE_NO_DROP objects
+ local f1, f2, f3, f4, f5, esp = object_flags(obj);
+ if band(f4, TR4_CURSE_NO_DROP) ~= 0 and band(obj.ident, IDENT_CURSED) then return end
+
+ msg_print("<Auto-destroy>")
+
+ -- Eliminate the item (from the pack)
+ if item >= 0 then
+ inven_item_increase(item, -obj.number)
+ inven_item_describe(item)
+ inven_item_optimize(item)
+ -- Eliminate the item (from the floor)
+ else
+ floor_item_increase(0 - item, -obj.number)
+ floor_item_describe(0 - item)
+ floor_item_optimize(0 - item)
+ end
+ return TRUE
+end
+
+-- Report the status of an object
+function object_status(obj)
+ local sense =
+ {
+ [SENSE_CURSED] = "bad",
+ [SENSE_WORTHLESS] = "very bad",
+ [SENSE_AVERAGE] = "average",
+ [SENSE_GOOD_LIGHT] = "good",
+ [SENSE_GOOD_HEAVY] = "good",
+ [SENSE_EXCELLENT] = "very good",
+ [SENSE_SPECIAL] = "special",
+ [SENSE_TERRIBLE] = "terrible",
+ }
+
+ if is_known(obj) == FALSE then
+ if sense[obj.sense] then
+ return sense[obj.sense]
+ else
+ return ""
+ end
+ else
+if nil then -- test
+ local osense = -1
+ local type = select_sense(obj, TRUE, TRUE)
+ if type == 1 then
+ osense = value_check_aux1(obj)
+ elseif type == 2 then
+ osense = value_check_aux1_magic(obj)
+ end
+print("type : "..type)
+ if sense[osense] then
+ print("sense: "..sense[osense])
+ return sense[osense]
+ else
+ print("sense: ")
+ return ""
+ end
+
+else -- the real one
+
+ local slot = wield_slot_ideal(obj, TRUE)
+
+ -- Arts items
+ if is_artifact(obj) == TRUE then
+ if band(obj.ident, IDENT_CURSED) == 0 then return "special"
+ else return "terrible" end
+ -- Ego items
+ elseif (obj.name2 > 0 or obj.name2b > 0) then
+ if band(obj.ident, IDENT_CURSED) == 0 then return "very good"
+ else return "very bad" end
+ -- weapon
+ elseif (slot == INVEN_WIELD) or (slot == INVEN_BOW) or (slot == INVEN_AMMO) or (slot == INVEN_TOOL) then
+ if obj.to_h + obj.to_d < 0 then
+ return "bad"
+ elseif obj.to_h + obj.to_d > 0 then
+ return "good"
+ else
+ return "average"
+ end
+ -- armor
+ elseif (slot >= INVEN_BODY) and (slot <= INVEN_FEET) then
+ if obj.to_a < 0 then
+ return "bad"
+ elseif obj.to_a > 0 then
+ return "good"
+ else
+ return "average"
+ end
+ -- ring
+ elseif slot == INVEN_RING then
+ if (obj.to_d + obj.to_h < 0) or (obj.to_a < 0) or (obj.pval < 0) then
+ return "bad"
+ else
+ return "average"
+ end
+ -- amulet
+ elseif slot == INVEN_NECK then
+ if (obj.pval < 0) then
+ return "bad"
+ else
+ return "average"
+ end
+ -- chests
+ elseif obj.tval == TV_CHEST then
+ if obj.pval == 0 then
+ return "empty"
+ elseif obj.pval < 0 then
+ return "disarmed"
+ else
+ return "average"
+ end
+ else
+ return "average"
+ end
+end
+ end
+end
+
+-- Recursive function to generate a rule function tree
+function gen_rule_fct(r)
+ -- It is a test rule (or, and, ...)
+ if r.label == "and" or r.label == "or" then
+ local i
+ local fct_tbl = {}
+ for i = 1, getn(r) do
+ if r[i].label ~= "comment" then
+ tinsert(fct_tbl, gen_rule_fct(r[i]))
+ end
+ end
+ if r.label == "and" then
+ return function(object)
+ local fcts = %fct_tbl
+ local i
+ for i = 1, getn(fcts) do
+ if not fcts[i](object) then return end
+ end
+ return TRUE
+ end
+ elseif r.label == "or" then
+ return function(object)
+ local fcts = %fct_tbl
+ local i
+ for i = 1, getn(fcts) do
+ if fcts[i](object) then return TRUE end
+ end
+ end
+ end
+ -- It is a condition rule (name, type, level, ...)
+ else
+ if r.label == "not" then
+ local f
+ if not r[1] then
+ f = function (object) return TRUE end
+ else
+ f = gen_rule_fct(r[1])
+ end
+ return function(object) return not %f(object) end
+ elseif r.label == "inventory" then
+ local f
+ if not r[1] then
+ f = function(object) return end
+ else
+ f = gen_rule_fct(r[1])
+ end
+ return function(object)
+ local i = 0
+ while i < INVEN_WIELD do
+ if %f(player.inventory(i)) then
+ return TRUE
+ end
+ i = i + 1
+ end
+ end
+ elseif r.label == "equipment" then
+ local f
+ if not r[1] then
+ f = function(object) return end
+ else
+ f = gen_rule_fct(r[1])
+ end
+ return function(object)
+ local i = INVEN_WIELD
+ while i < INVEN_TOTAL do
+ if %f(player.inventory(i)) then
+ return TRUE
+ end
+ i = i + 1
+ end
+ end
+ elseif r.label == "name" then
+ return function(object) if strlower(object_desc(object, -1, 0)) == strlower(%r[1]) then return TRUE end end
+ elseif r.label == "contain" then
+ return function(object) if strfind(strlower(object_desc(object, -1, 0)), strlower(%r[1])) then return TRUE end end
+ elseif r.label == "symbol" then
+ return function(object) if strchar(get_kind(object).d_char) == %r[1] then return TRUE end end
+ elseif r.label == "inscribed" then
+ return function(object) if object.note ~= 0 and strfind(strlower(quark_str(object.note)), strlower(%r[1])) then return TRUE end end
+ elseif r.label == "discount" then
+ local d1 = r.args.min
+ local d2 = r.args.max
+ if tonumber(d1) == nil then d1 = getglobal(d1) else d1 = tonumber(d1) end
+ if tonumber(d2) == nil then d2 = getglobal(d2) else d2 = tonumber(d2) end
+ return function(object) if is_aware(object) == TRUE and object.discount >= %d1 and object.discount <= %d2 then return TRUE end end
+ elseif r.label == "tval" then
+ local tv = r[1]
+ if tonumber(tv) == nil then tv = getglobal(tv) else tv = tonumber(tv) end
+ return function(object) if object.tval == %tv then return TRUE end end
+ elseif r.label == "sval" then
+ assert(r.args.min and r.args.max, "sval rule lacks min or max")
+ local sv1 = r.args.min
+ local sv2 = r.args.max
+ if tonumber(sv1) == nil then sv1 = getglobal(sv1) else sv1 = tonumber(sv1) end
+ if tonumber(sv2) == nil then sv2 = getglobal(sv2) else sv2 = tonumber(sv2) end
+ return function(object) if is_aware(object) == TRUE and object.sval >= %sv1 and object.sval <= %sv2 then return TRUE end end
+ elseif r.label == "status" then
+ return function(object) if object_status(object) == strlower(%r[1]) then return TRUE end end
+ elseif r.label == "state" then
+ if r[1] == "identified" then
+ return function(object) if is_known(object) == TRUE then return TRUE end end
+ else
+ return function(object) if is_known(object) == FALSE then return TRUE end end
+ end
+ elseif r.label == "race" then
+ return function(object) if strlower(get_race_name()) == strlower(%r[1]) then return TRUE end end
+ elseif r.label == "subrace" then
+ return function(object) if strlower(get_subrace_name()) == strlower(%r[1]) then return TRUE end end
+ elseif r.label == "class" then
+ return function(object) if strlower(get_class_name()) == strlower(%r[1]) then return TRUE end end
+ elseif r.label == "level" then
+ assert(r.args.min and r.args.max, "level rule lacks min or max")
+ return function(object) if player.lev >= tonumber(%r.args.min) and player.lev <= tonumber(%r.args.max) then return TRUE end end
+ elseif r.label == "skill" then
+ assert(r.args.min and r.args.max, "skill rule lacks min or max")
+ local s = find_skill_i(r[1])
+ assert(s ~= -1, "no skill "..r[1])
+ return function(object) if get_skill(%s) >= tonumber(%r.args.min) and get_skill(%s) <= tonumber(%r.args.max) then return TRUE end end
+ elseif r.label == "ability" then
+ local s = find_ability(r[1])
+ assert(s ~= -1, "no ability "..r[1])
+ return function(object) if has_ability(%s) == TRUE then return TRUE end end
+ end
+ end
+end
+
+function auto_inscribe_maker(inscription)
+ return function(...)
+ arg.n = arg.n + 1
+ arg[getn(arg)] = %inscription
+ return call(auto_inscribe, arg)
+ end
+end
+
+-- Generate a rule from a table
+function gen_full_rule(t)
+ -- only honor rules for this module
+ if not t.args.module then
+ t.args.module = "ToME"
+ end
+
+ if not ((t.args.module == "all") or (t.args.module == game_module)) then
+ return function() end
+ end
+
+ -- Check for which action to do
+ local apply_fct = auto_nothing
+ if t.args.type == "destroy" then apply_fct = auto_destroy
+ elseif t.args.type == "pickup" then apply_fct = auto_pickup
+ elseif t.args.type == "inscribe" then apply_fct = auto_inscribe_maker(t.args.inscription)
+ end
+
+ -- create the function tree
+ local rf
+ if t[1] then
+ rf = gen_rule_fct(t[1])
+ else
+ rf = function (object) end
+ end
+
+ -- create the final function
+ return function(...)
+ local rf = %rf
+ if rf(arg[1]) then
+ if call(%apply_fct, arg) == TRUE then return TRUE end
+ end
+ end
+end
+
+-- Create a function that checks for the rules(passed in xml form)
+function add_ruleset(s)
+ local tbl = xml:collect(s)
+ local i
+
+ -- Add all rules
+ for i = 1, getn(tbl) do
+ local t = tbl[i]
+
+ if t.label == "rule" then
+ -- Create the function tree
+ local fct = gen_full_rule(t)
+
+ -- Create the test function
+ __rules[__rules_max] =
+ {
+ ["table"] = t,
+ ["fct"] = fct
+ }
+ __rules_max = __rules_max + 1
+ end
+ end
+end
+
+-- Apply the current rules to an object
+-- call with at least (object, idx)
+function apply_rules(...)
+ local i
+ for i = 0, __rules_max - 1 do
+ if call(__rules[i].fct, arg) then return TRUE end
+ end
+ return FALSE
+end
+
+-- Clear the current rules
+function clean_ruleset()
+ __rules_max = 0
+ __rules = {}
+end
+
+------ helper fonctions for the GUI
+
+auto_aux = {}
+auto_aux.stack = { n = 0 }
+auto_aux.idx = 1
+auto_aux.rule = 1
+function auto_aux:go_right()
+ if auto_aux.rule[1] and type(auto_aux.rule[1]) == "table" then
+ tinsert(auto_aux.stack, auto_aux.idx)
+ tinsert(auto_aux.stack, auto_aux.rule)
+ auto_aux.rule = auto_aux.rule[1]
+ auto_aux.idx = 1
+ end
+end
+
+function auto_aux:go_left(sel)
+ local n = getn(auto_aux.stack)
+
+ if n > 0 then
+ auto_aux.idx = auto_aux.stack[n - 1]
+ auto_aux.rule = auto_aux.stack[n]
+ tremove(auto_aux.stack)
+ tremove(auto_aux.stack)
+ end
+end
+
+function auto_aux:go_down()
+ if getn(auto_aux.stack) > 1 then
+ if auto_aux.stack[getn(auto_aux.stack)][auto_aux.idx + 1] then
+ auto_aux.idx = auto_aux.idx + 1
+ auto_aux.rule = auto_aux.stack[getn(auto_aux.stack)][auto_aux.idx]
+ end
+ end
+end
+
+function auto_aux:go_up()
+ if getn(auto_aux.stack) > 1 then
+ if auto_aux.stack[getn(auto_aux.stack)][auto_aux.idx - 1] then
+ auto_aux.idx = auto_aux.idx - 1
+ auto_aux.rule = auto_aux.stack[getn(auto_aux.stack)][auto_aux.idx]
+ end
+ end
+end
+
+function auto_aux:scroll_up()
+ xml.write_off_y = xml.write_off_y - 1
+end
+
+function auto_aux:scroll_down()
+ xml.write_off_y = xml.write_off_y + 1
+end
+
+function auto_aux:scroll_left()
+ xml.write_off_x = xml.write_off_x + 1
+end
+
+function auto_aux:scroll_right()
+ xml.write_off_x = xml.write_off_x - 1
+end
+
+function auto_aux:adjust_current(sel)
+ if __rules_max == 0 then return end
+
+ xml.write_off_y = 0
+ xml.write_off_x = 0
+ auto_aux.idx = 1
+ auto_aux.stack = { n = 0 }
+ auto_aux.rule = __rules[sel].table
+end
+
+function auto_aux:move_up(sel)
+ if sel > 0 then
+ local u = __rules[sel - 1]
+ local d = __rules[sel]
+ __rules[sel - 1] = d
+ __rules[sel] = u
+ return sel - 1
+ end
+ return sel
+end
+
+function auto_aux:move_down(sel)
+ if sel < __rules_max - 1 then
+ local u = __rules[sel]
+ local d = __rules[sel + 1]
+ __rules[sel + 1] = u
+ __rules[sel] = d
+ return sel + 1
+ end
+ return sel
+end
+
+function auto_aux:new_rule(sel, nam, typ, arg)
+ local r
+
+
+ -- nam can also directly be the table itself
+ if type(nam) == "table" then
+ r =
+ {
+ ["table"] = nam,
+ ["fct"] = function (object) end
+ }
+ elseif typ == "inscribe" then
+ if arg == "" then
+ arg = input_box("Inscription?", 79)
+ end
+ r =
+ {
+ ["table"] =
+ {
+ label = "rule",
+ args = { name = nam, type = typ, inscription = arg, module = game_module },
+ },
+ ["fct"] = function (object) end
+ }
+ else
+ r =
+ {
+ ["table"] =
+ {
+ label = "rule",
+ args = { name = nam, type = typ, module = game_module },
+ },
+ ["fct"] = function (object) end
+ }
+ end
+ tinsert(__rules, sel, r)
+ __rules_max = __rules_max + 1
+end
+
+function auto_aux:rename_rule(sel, nam)
+ if sel >= 0 and sel < __rules_max then
+ __rules[sel].table.args.name = nam
+ end
+end
+
+function auto_aux:save_ruleset()
+ xml.write = xml.write_file
+
+ print_hook("clean_ruleset()\nadd_ruleset\n[[\n")
+ local i
+ for i = 0, __rules_max - 1 do
+ xml:print_xml(__rules[i].table, '')
+ end
+ print_hook("]]\n")
+
+ xml.write = xml.write_screen
+end
+
+function auto_aux:del_self(sel)
+ if auto_aux.rule.label == "rule" then
+ tremove(__rules, sel)
+ __rules_max = __rules_max - 1
+ return sel - 1
+ else
+ local idx = auto_aux.idx
+ auto_aux:go_left(sel)
+ tremove(auto_aux.rule, idx)
+ return sel
+ end
+end
+
+auto_aux.types_desc =
+{
+ ["and"] =
+ {
+ "Check is true if all rules within it are true",
+ xml:collect([[<and><foo1>...</foo1><foo2>...</foo2><foo3>...</foo3></and>]]),
+ function ()
+ return xml:collect("<and></and>")
+ end,
+ },
+ ["or"] =
+ {
+ "Check is true if at least one rule within it is true",
+ xml:collect([[<or><foo1>...</foo1><foo2>...</foo2><foo3>...</foo3></or>]]),
+ function ()
+ return xml:collect("<or></or>")
+ end,
+ },
+ ["not"] =
+ {
+ "Invert the result of its child rule",
+ xml:collect([[<not><foo1>...</foo1></not>]]),
+ function ()
+ return xml:collect("<not></not>")
+ end,
+ },
+ ["comment"] =
+ {
+ "Comments are meaningless",
+ xml:collect([[<comment>Comment explaining something</comment>]]),
+ function ()
+ local n = input_box("Comment?", 79)
+ if n == "" then return end
+ return xml:collect("<comment>"..n.."</comment>")
+ end,
+ },
+ ["name"] =
+ {
+ "Check is true if object name matches name",
+ xml:collect([[<name>potion of healing</name>]]),
+ function ()
+ local n = input_box("Object name to match?", 79)
+ if n == "" then return end
+ return xml:collect("<name>"..n.."</name>")
+ end,
+ },
+ ["contain"] =
+ {
+ "Check is true if object name contains word",
+ xml:collect([[<contain>healing</contain>]]),
+ function ()
+ local n = input_box("Word to find in object name?", 79)
+ if n == "" then return end
+ return xml:collect("<contain>"..n.."</contain>")
+ end,
+ },
+ ["inscribed"] =
+ {
+ "Check is true if object inscription contains word",
+ xml:collect([[<inscribed>=g</inscribed>]]),
+ function ()
+ local n = input_box("Word to find in object inscription?", 79)
+ if n == "" then return end
+ return xml:collect("<inscribed>"..n.."</inscribed>")
+ end,
+ },
+ ["discount"] =
+ {
+ "Check is true if object discount is between 2 values",
+ xml:collect([[<sval min='50' max='100'></sval>]]),
+ function ()
+ local s = "<discount "
+
+ local n = input_box("Min discount?", 79)
+ if n == "" then return end
+ s = s.."min='"..n.."' "
+
+ n = input_box("Max discount?", 79)
+ if n == "" then return end
+ s = s.."max='"..n.."'></discount>"
+ return xml:collect(s)
+ end,
+ },
+ ["symbol"] =
+ {
+ "Check is true if object symbol is ok",
+ xml:collect([[<symbol>!</symbol>]]),
+ function ()
+ local n = input_box("Symbol to match?", 1)
+ if n == "" then return end
+ return xml:collect("<symbol>"..n.."</symbol>")
+ end,
+ },
+ ["status"] =
+ {
+ "Check is true if object status is ok",
+ xml:collect([[<status>good</status>]]),
+ function ()
+ local n = msg_box("[t]errible, [v]ery bad, [b]ad, [a]verage, [G]ood, [V]ery good, [S]pecial?")
+ local t =
+ {
+ ["t"] = "terrible",
+ ["v"] = "very bad",
+ ["b"] = "bad",
+ ["a"] = "average",
+ ["G"] = "good",
+ ["V"] = "very good",
+ ["S"] = "special",
+ }
+ if not t[strchar(n)] then return end
+ return xml:collect("<status>"..t[strchar(n)].."</status>")
+ end,
+ },
+ ["state"] =
+ {
+ "Check is true if object is identified/unidentified",
+ xml:collect([[<state>identified</state>]]),
+ function ()
+ local n = msg_box("[i]dentified, [n]on identified?")
+ local t =
+ {
+ ["i"] = "identified",
+ ["n"] = "not identified",
+ }
+ if not t[strchar(n)] then return end
+ return xml:collect("<state>"..t[strchar(n)].."</state>")
+ end,
+ },
+ ["tval"] =
+ {
+ "Check is true if object tval(from k_info.txt) is ok",
+ xml:collect([[<tval>55</tval>]]),
+ function ()
+ local n = input_box("Tval to match?", 79)
+ if n == "" then return end
+ return xml:collect("<tval>"..n.."</tval>")
+ end,
+ },
+ ["sval"] =
+ {
+ {
+ "Check is true if object sval(from k_info.txt) is between",
+ "2 values",
+ },
+ xml:collect([[<sval min='0' max='100'></sval>]]),
+ function ()
+ local s = "<sval "
+
+ local n = input_box("Min sval?", 79)
+ if n == "" then return end
+ s = s.."min='"..n.."' "
+
+ n = input_box("Max sval?", 79)
+ if n == "" then return end
+ s = s.."max='"..n.."'></sval>"
+ return xml:collect(s)
+ end,
+ },
+ ["race"] =
+ {
+ "Check is true if player race is ok",
+ xml:collect([[<race>dunadan</race>]]),
+ function ()
+ local n = input_box("Player race to match?", 79)
+ if n == "" then return end
+ return xml:collect("<race>"..n.."</race>")
+ end,
+ },
+ ["subrace"] =
+ {
+ "Check is true if player subrace is ok",
+ xml:collect([[<subrace>vampire</subrace>]]),
+ function ()
+ local n = input_box("Player subrace to match?", 79)
+ if n == "" then return end
+ return xml:collect("<subrace>"..n.."</subrace>")
+ end,
+ },
+ ["class"] =
+ {
+ "Check is true if player class is ok",
+ xml:collect([[<class>sorceror</class>]]),
+ function ()
+ local n = input_box("Player class to match?", 79)
+ if n == "" then return end
+ return xml:collect("<class>"..n.."</class>")
+ end,
+ },
+ ["level"] =
+ {
+ "Check is true if player level is between 2 values",
+ xml:collect([[<level min='20' max='50'></level>]]),
+ function ()
+ local s = "<level "
+
+ local n = input_box("Min player level?", 79)
+ if n == "" then return end
+ s = s.."min='"..n.."' "
+
+ n = input_box("Max player level?", 79)
+ if n == "" then return end
+ s = s.."max='"..n.."'></level>"
+
+ return xml:collect(s)
+ end,
+ },
+ ["skill"] =
+ {
+ "Check is true if player skill level is between 2 values",
+ xml:collect([[<skill min='10' max='20'>Divination</skill>]]),
+ function ()
+ local s = "<skill "
+
+ local n = input_box("Min skill level?", 79)
+ if n == "" then return end
+ s = s.."min='"..n.."' "
+
+ n = input_box("Max skill level?", 79)
+ if n == "" then return end
+ s = s.."max='"..n.."'>"
+
+ n = input_box("Skill name?", 79)
+ if n == "" then return end
+ if find_skill_i(n) == -1 then return end
+ s = s..n.."</skill>"
+
+ return xml:collect(s)
+ end,
+ },
+ ["ability"] =
+ {
+ "Check is true if player has the ability",
+ xml:collect([[<ability>Ammo creation</ability>]]),
+ function()
+ local n = input_box("Ability name?", 79)
+ if n == "" then return end
+ if find_ability(n) == -1 then return end
+ return xml:collect("<ability>"..n.."</ability>")
+ end,
+ },
+ ["inventory"] =
+ {
+ {
+ "Check is true if something in player's inventory matches",
+ "the contained rule",
+ },
+ xml:collect([[<inventory><foo1>...</foo1></inventory>]]),
+ function ()
+ return xml:collect("<inventory></inventory>")
+ end,
+ },
+ ["equipment"] =
+ {
+ {
+ "Check is true if something in player's equipment matches",
+ "the contained rule",
+ },
+ xml:collect([[<equipment><foo1>...</foo1></equipment>]]),
+ function ()
+ return xml:collect("<equipment></equipment>")
+ end,
+ },
+}
+
+function auto_aux:display_desc(sel)
+ local d = auto_aux.types_desc[sel][1]
+ if type(d) == "string" then
+ c_prt(TERM_WHITE, d, 1, 17)
+ else
+ local k, e, i
+ i = 0
+ for k, e in d do
+ c_prt(TERM_WHITE, e, 1 + i, 17)
+ i = i + 1
+ end
+ end
+end
+
+function auto_aux:add_child(sel)
+ -- <rule> and <not> contain only one match
+ if (auto_aux.rule.label == "rule" or auto_aux.rule.label == "not") and auto_aux.rule[1] then return end
+ if (auto_aux.rule.label == "rule" or auto_aux.rule.label == "equipment") and auto_aux.rule[1] then return end
+ if (auto_aux.rule.label == "rule" or auto_aux.rule.label == "inventory") and auto_aux.rule[1] then return end
+
+ -- Only <and> and <or> can contain
+ if auto_aux.rule.label ~= "rule" and auto_aux.rule.label ~= "and" and auto_aux.rule.label ~= "or" and auto_aux.rule.label ~= "not" and auto_aux.rule.label ~= "equipment" and auto_aux.rule.label ~= "inventory" then return end
+
+ -- get it
+ local r = auto_aux.types_desc[sel][3]()
+ if not r then return end
+
+ -- Ok add it
+ tinsert(auto_aux.rule, r[1])
+end
+
+function auto_aux.regen_ruleset()
+ local i
+ for i = 0, __rules_max - 1 do
+ __rules[i].fct = gen_full_rule(__rules[i].table)
+ end
+end
+
+
+-- Easily add new rules
+function easy_add_rule(typ, mode, do_status, obj)
+ local detect_rule
+
+ if mode == "tval" then
+ detect_rule = "<tval>"..obj.tval.."</tval>"
+ elseif mode == "tsval" then
+ detect_rule = "<and><tval>"..obj.tval.."</tval><sval min='"..obj.sval.."' max='"..obj.sval.."'></sval></and>"
+ elseif mode == "name" then
+ detect_rule = "<name>"..strlower(object_desc(obj, -1, 0)).."</name>"
+ end
+
+ if do_status == TRUE then
+ local status = object_status(obj)
+ if status and not (status == "") then
+ detect_rule = "<and>"..detect_rule.."<status>"..status.."</status></and>"
+ end
+ end
+
+ local rule = "<rule module='"..game_module.."' name='"..typ.."' type='"..typ.."'>"..detect_rule.."</rule>"
+ auto_aux:new_rule(0, xml:collect(rule)[1], '')
+ auto_aux.regen_ruleset()
+ msg_print("Rule added. Please go to the Automatizer screen (press = then T)")
+ msg_print("to save the modified ruleset.")
+end
diff --git a/lib/mods/theme/core/building.lua b/lib/mods/theme/core/building.lua
new file mode 100644
index 00000000..8e88888a
--- /dev/null
+++ b/lib/mods/theme/core/building.lua
@@ -0,0 +1,15 @@
+__building_actions = {}
+
+function add_building_action(a)
+ assert(a.index, "No building action index")
+ assert(a.action, "No building action action")
+ __building_actions[a.index] = a.action
+end
+
+function __bact_activate(bact)
+ if __building_actions[bact] then
+ return __building_actions[bact]()
+ end
+end
+
+add_hook_script(HOOK_BUILDING_ACTION, "__bact_activate", "__bact_activate")
diff --git a/lib/mods/theme/core/crpt_aux.lua b/lib/mods/theme/core/crpt_aux.lua
new file mode 100644
index 00000000..97f8d4b6
--- /dev/null
+++ b/lib/mods/theme/core/crpt_aux.lua
@@ -0,0 +1,182 @@
+-- Core functions for corruptions
+
+__corruptions = {}
+__corruptions_max = 0
+__corruptions_callbacks_max = 0
+
+-- Get the corruption
+function player.corruption(c, set)
+ if set then
+ player.corruptions_aux[c + 1] = set
+ player.redraw = bor(player.redraw, PR_BASIC)
+ player.update = bor(player.update, PU_BONUS, PU_TORCH, PU_BODY, PU_POWERS)
+ if (set == TRUE) and (__corruptions[c].gain) then
+ __corruptions[c].gain()
+ end
+ if (set == FALSE) and (__corruptions[c].lose) then
+ __corruptions[c].lose()
+ end
+ else
+ return player.corruptions_aux[c + 1]
+ end
+end
+
+-- Test if we have that corruption
+-- We must:
+-- 1) have it or be willing to get it
+-- 2) have all its dependancies
+-- 3) have none of its opposing corruptions
+-- 4) pass the possible tests
+function test_depend_corrupt(corrupt, can_gain)
+ local i, c
+
+ if not can_gain then can_gain = FALSE end
+
+ if can_gain == TRUE then
+ if (player.corruption(corrupt) ~= FALSE) then
+ return FALSE
+ end
+ else
+ if (player.corruption(corrupt) ~= TRUE) then
+ return FALSE
+ end
+ end
+
+ for c, i in __corruptions[corrupt].depends do
+ if test_depend_corrupt(c) ~= TRUE then
+ return FALSE
+ end
+ end
+
+ for c, i in __corruptions[corrupt].oppose do
+ if test_depend_corrupt(c) ~= FALSE then
+ return FALSE
+ end
+ end
+
+ -- are we even allowed to get it?
+ if __corruptions[corrupt].can_gain and (not __corruptions[corrupt].can_gain()) then
+ return FALSE
+ end
+
+ return TRUE
+end
+
+-- Gain a new corruption
+function gain_corruption(group)
+ local i, max
+ local pos = {}
+
+ -- Get the list of all possible ones
+ max = 0
+ for i = 0, __corruptions_max - 1 do
+ if __corruptions[i].group == group and test_depend_corrupt(i, TRUE) == TRUE and __corruptions[i].random == TRUE and __corruptions[i].allow() then
+ pos[max] = i
+ max = max + 1
+ end
+ end
+
+ -- Ok now get one of them
+ if (max > 0) then
+ local ret = rand_int(max)
+
+ player.corruption(pos[ret], TRUE)
+ cmsg_print(TERM_L_RED, __corruptions[pos[ret]].get_text)
+
+ return pos[ret]
+ else
+ return -1
+ end
+end
+
+-- Lose an existing corruption
+function lose_corruption()
+ local i, max
+ local pos = {}
+
+ -- Get the list of all possible ones
+ max = 0
+ for i = 0, __corruptions_max - 1 do
+ if test_depend_corrupt(i) == TRUE and __corruptions[i].removable == TRUE then
+ pos[max] = i
+ max = max + 1
+ end
+ end
+
+ -- Ok now get one of them
+ if (max > 0) then
+ local ret = rand_int(max)
+
+ player.corruption(pos[ret], FALSE)
+ cmsg_print(TERM_L_RED, __corruptions[pos[ret]].lose_text)
+
+ -- Ok now lets see if it broke some dependancies
+ for i = 0, max - 1 do
+ if player.corruption(pos[i]) ~= test_depend_corrupt(pos[i]) then
+ player.corruption(pos[i], FALSE)
+ cmsg_print(TERM_L_RED, __corruptions[pos[i]].lose_text)
+ end
+ end
+
+ return pos[ret]
+ else
+ return -1
+ end
+end
+
+-- Lose all corruptions (for e.g. Potion of New Life)
+function lose_all_corruptions()
+ local i;
+ for i = 0, __corruptions_max - 1 do
+ lose_corruption()
+ end
+ return -1
+end
+
+-- Creates a new corruption
+function add_corruption(c)
+ assert(c.color, "No corruption color")
+ assert(c.name, "No corruption name")
+ assert(c.get_text, "No corruption get_text")
+ assert(c.lose_text, "No corruption lose_text")
+ assert(c.desc, "No corruption desc")
+ assert(c.hooks, "Nothing to do for corruption")
+ if not c.random then c.random = TRUE end
+ if not c.removable then c.removable = TRUE end
+ if not c.allow then c.allow = function() return not nil end end
+
+ if c.depends == nil then c.depends = {} end
+ if c.oppose == nil then c.oppose = {} end
+
+ -- We must make sure the other ones opposes too
+ local o, i
+ for o, i in c.oppose do
+ __corruptions[o].oppose[__corruptions_max] = TRUE
+ end
+
+ local index, h
+ for index, h in c.hooks do
+ add_hook_script(index, "__lua__corrupt_callback"..__corruptions_callbacks_max, "__lua__corrupt_callback"..__corruptions_callbacks_max)
+ setglobal("__lua__corrupt_callback"..__corruptions_callbacks_max,
+ function (...)
+ if test_depend_corrupt(%__corruptions_max) == TRUE then
+ return call(%h, arg)
+ end
+ end
+ )
+ __corruptions_callbacks_max = __corruptions_callbacks_max + 1
+ end
+
+ if type(c.desc) == "table" then
+ local new_desc = ""
+ for index, h in c.desc do
+ new_desc = new_desc..h.."\n"
+ end
+ c.desc = new_desc
+ end
+
+ __corruptions[__corruptions_max] = c
+ __corruptions_max = __corruptions_max + 1
+ return (__corruptions_max - 1)
+end
+
diff --git a/lib/mods/theme/core/dungeon.lua b/lib/mods/theme/core/dungeon.lua
new file mode 100644
index 00000000..d91d785b
--- /dev/null
+++ b/lib/mods/theme/core/dungeon.lua
@@ -0,0 +1,55 @@
+-- Internal lua file in charge of dungeon stuff
+
+function place_dungeon(y, x, d_idx)
+ if d_idx then
+ wild_map(y, x).entrance = 1000 + d_idx
+ else
+ wild_map(y, x).entrance = 0
+ end
+end
+
+function dungeon(d_idx)
+ return d_info[1 + d_idx]
+end
+
+function wild_feat(wild)
+ return wf_info[1 + wild.feat]
+end
+
+function explode_dir(dir)
+ return ddy[dir + 1], ddx[dir + 1]
+end
+
+function rotate_dir(dir, mov)
+ if mov > 0 then
+ if dir == 7 then dir = 8
+ elseif dir == 8 then dir = 9
+ elseif dir == 9 then dir = 6
+ elseif dir == 6 then dir = 3
+ elseif dir == 3 then dir = 2
+ elseif dir == 2 then dir = 1
+ elseif dir == 1 then dir = 4
+ elseif dir == 4 then dir = 7
+ end
+ elseif mov < 0 then
+ if dir == 7 then dir = 4
+ elseif dir == 4 then dir = 1
+ elseif dir == 1 then dir = 2
+ elseif dir == 2 then dir = 3
+ elseif dir == 3 then dir = 6
+ elseif dir == 6 then dir = 9
+ elseif dir == 9 then dir = 8
+ elseif dir == 8 then dir = 7
+ end
+ end
+
+ return dir
+end
+
+-- Place a trap for a specific level
+function place_trap(y, x, level)
+ local old_dun = dun_level
+ dun_level = level
+ %place_trap(y, x)
+ dun_level = old_dun
+end
diff --git a/lib/mods/theme/core/gen_idx.lua b/lib/mods/theme/core/gen_idx.lua
new file mode 100644
index 00000000..5f3af435
--- /dev/null
+++ b/lib/mods/theme/core/gen_idx.lua
@@ -0,0 +1,261 @@
+-- Place here the list of files to parse
+files =
+{
+ "birth.txt",
+ "experien.hlp",
+ "gods.txt",
+ "explore.hlp",
+ "newbie.hlp",
+ "advanced.hlp",
+ "help.hlp",
+ "general.txt",
+ "whattome.txt",
+ "dungeon.txt",
+ "spoiler.hlp",
+ "g_melkor.txt",
+ "skills.txt",
+ "c_bard.txt",
+ "c_druid.txt",
+ "c_lorema.txt",
+ "c_mage.txt",
+ "c_mimic.txt",
+ "c_mindcr.txt",
+ "c_monk.txt",
+ "c_palad.txt",
+ "c_posses.txt",
+ "c_pr_drk.txt",
+ "c_pr_eru.txt",
+ "c_pr_man.txt",
+ "c_symbia.txt",
+ "c_alchem.txt",
+ "c_archer.txt",
+ "c_assass.txt",
+ "c_axemas.txt",
+ "c_demono.txt",
+ "c_geoman.txt",
+ "c_hafted.txt",
+ "c_necro.txt",
+ "c_polear.txt",
+ "c_ranger.txt",
+ "c_rogue.txt",
+ "c_runecr.txt",
+ "c_sorcer.txt",
+ "c_swordm.txt",
+ "c_thaum.txt",
+ "c_unbel.txt",
+ "c_warper.txt",
+ "c_warrio.txt",
+ "m_meta.txt",
+ "rm_skel.txt",
+ "rm_zomb.txt",
+ "luckspoi.txt",
+ "m_air.txt",
+ "dunspoil.txt",
+ "g_eru.txt",
+ "g_manwe.txt",
+ "g_tulkas.txt",
+ "m_divin.txt",
+ "m_mimic.txt",
+ "m_water.txt",
+ "magic.txt",
+ "r_drkelf.txt",
+ "r_dwarf.txt",
+ "r_elf.txt",
+ "r_hielf.txt",
+ "r_hobbit.txt",
+ "r_pettyd.txt",
+ "r_wodelf.txt",
+ "rm_spec.txt",
+ "tome_faq.txt",
+ "ability.txt",
+ "automat.txt",
+ "c_summon.txt",
+ "command.txt",
+ "corspoil.txt",
+ "debug.txt",
+ "m_music.txt",
+ "rm_barb.txt",
+ "macrofaq.txt",
+ "m_necrom.txt",
+ "m_mindcr.txt",
+ "m_symbio.txt",
+ "m_thaum.txt",
+ "magic.hlp",
+ "m_convey.txt",
+ "m_fire.txt",
+ "m_mana.txt",
+ "m_mind.txt",
+ "m_nature.txt",
+ "m_tempo.txt",
+ "m_udun.txt",
+ "m_geoman.txt",
+ "essences.txt",
+ "r_ent.txt",
+ "g_yavann.txt",
+ "defines.txt",
+ "rm_vamp.txt",
+ "inscrip.txt",
+ "m_earth.txt",
+ "option.txt",
+ "attack.txt",
+ "version.txt",
+ "m_demono.txt",
+ "r_beorn.txt",
+ "r_deathm.txt",
+ "r_rohank.txt",
+ "r_hafogr.txt",
+ "r_human.txt",
+ "r_kobold.txt",
+ "r_maia.txt",
+ "r_orc.txt",
+ "r_thlord.txt",
+ "r_troll.txt",
+ "r_yeek.txt",
+ "rm_class.txt",
+ "rm_herm.txt",
+ "rm_lsoul.txt",
+ "wishing.txt",
+ "c_priest.txt",
+ "fatespoi.txt",
+ "gambling.txt",
+ "r_dunad.txt",
+ "r_gnome.txt",
+ "r_hafelf.txt",
+ "c_merch.txt",
+ "spoil_faq.txt",
+}
+
+out_file = "index.txt"
+
+index = {}
+
+function parse_file(file)
+ local fff = openfile(path_build(ANGBAND_DIR_HELP, file), "r")
+ local line
+
+ line = read(fff, "*l")
+ while line do
+ local i, j, anchor, name, subname = strfind(line, "~~~~~(%d+)|([%d%a -]+)|([%d%a -]+)")
+ if not i then
+ i, j, anchor, name = strfind(line, "~~~~~(%d+)|([%d%a -]+)")
+
+ subname = nil
+ end
+
+ if i then
+ if not index[name] then
+ index[name] = {}
+ end
+ if subname then
+ tinsert(index[name], { __name__ = subname, __file__ = file, __anchor__ = anchor})
+ else
+ tinsert(index[name], { __name__ = "__primary__", __file__ = file, __anchor__ = anchor})
+ end
+ end
+
+ line = read(fff, "*l")
+ end
+
+ closefile(fff)
+end
+
+function sort_fct(a, b)
+ local i, len
+
+ a = a.__name__
+ b = b.__name__
+
+ if strlen(a) > strlen(b) then len = strlen(b) else len = strlen(a) end
+
+ for i = 1, len do
+ local ac = strbyte(a, i)
+ local bc = strbyte(b, i)
+
+ if ac < bc then
+ return not nil
+ elseif ac > bc then
+ return nil
+ end
+ end
+ if strlen(a) > strlen(b) then return nil else return not nil end
+end
+
+function generate_index()
+ local k, e, index_list
+ for _, e in files do
+ parse_file(e)
+ end
+
+ index_list = {}
+ for k, e in index do
+ -- Ok either my sort function or lua sort function sucks ass ..
+ sort(e, sort_fct)
+ sort(e, sort_fct)
+ sort(e, sort_fct)
+ sort(e, sort_fct)
+ sort(e, sort_fct)
+ tinsert(index_list, {__name__= k, __table__ = e})
+ end
+
+ -- Ok either my sort function or lua sort function sucks ass ..
+ sort(index_list, sort_fct)
+ sort(index_list, sort_fct)
+ sort(index_list, sort_fct)
+ sort(index_list, sort_fct)
+ sort(index_list, sort_fct)
+ index = index_list
+end
+
+function out_link(fff, space, name, file, anchor)
+ write(fff, space.."*****"..file.."*"..anchor.."["..name.."]\n")
+end
+
+function print_index()
+ local i, j, c, new_c
+ local fff = openfile(path_build(ANGBAND_DIR_HELP, out_file), "w")
+
+ write(fff,
+[[|||||oy
+#####R /----------------------------------------\
+#####R < Help Index >
+#####R \----------------------------------------/
+
+This is the index of everything in the T.o.M.E. documentation.
+
+#####BHit a letter key to jump to the entries for that letter.
+
+Some entries in the index link to the same place as other entries. This is
+intentional, so that the information you want is easy to find.
+
+Don't forget you can browse the help from the *****help.hlp*02[Main menu].
+
+#####sSpotted a problem with the help files, or some content thats missing?
+#####sContact fearoffours@t-o-m-e.net .
+
+]])
+
+ c = ' '
+ for i = 1, getn(index) do
+ new_c = strbyte(index[i].__name__, 1)
+ if c ~= new_c then
+ c = new_c
+ write(fff, "~~~~~"..c.."\n")
+ write(fff, "*****/"..strchar(c)..out_file.."*"..c.."["..strchar(c).."]\n")
+ end
+ for j = 1, getn(index[i].__table__) do
+ if index[i].__table__[j].__name__ == "__primary__" then
+ out_link(fff, " ", index[i].__name__, index[i].__table__[j].__file__, index[i].__table__[j].__anchor__)
+ end
+ end
+ for j = 1, getn(index[i].__table__) do
+ if index[i].__table__[j].__name__ ~= "__primary__" then
+ out_link(fff, " ", index[i].__table__[j].__name__, index[i].__table__[j].__file__, index[i].__table__[j].__anchor__)
+ end
+ end
+ end
+ closefile(fff)
+end
+
+generate_index()
+
+print_index()
diff --git a/lib/mods/theme/core/gods.lua b/lib/mods/theme/core/gods.lua
new file mode 100644
index 00000000..77e0aad5
--- /dev/null
+++ b/lib/mods/theme/core/gods.lua
@@ -0,0 +1,40 @@
+-- Gods helper files
+
+-- Gods structs
+
+__gods_hook = {}
+__gods_callbacks = {}
+__gods_callbacks_max = 0
+
+function add_god(q)
+ local i, index, d, z, qq
+
+ assert(q.name, "No god name")
+ assert(q.desc, "No god desc")
+ assert(q.hooks, "No god hooks")
+
+ i = add_new_gods(q.name);
+
+ z = 0
+ for index, d in q.desc do
+ desc_god(i, z, d);
+ z = z + 1
+ end
+
+ __gods_hook[i] = q.hooks
+ for index, d in q.hooks do
+ add_hook_script(index, "__lua__gods_callback"..__gods_callbacks_max, "__lua__gods_callback"..__gods_callbacks_max)
+ setglobal("__lua__gods_callback"..__gods_callbacks_max, d)
+ __gods_callbacks_max = __gods_callbacks_max + 1
+ end
+ if q.data then
+ for index, d in q.data do
+ -- Besure it exists
+ setglobal(index, d)
+
+ -- Make it save & load
+ add_loadsave(index, d)
+ end
+ end
+ return i
+end
diff --git a/lib/mods/theme/core/help.lua b/lib/mods/theme/core/help.lua
new file mode 100644
index 00000000..a581fe63
--- /dev/null
+++ b/lib/mods/theme/core/help.lua
@@ -0,0 +1,141 @@
+-- Ingame contextual help
+
+-- We use our own hook list as to not overburn the hook proccessor
+-- with many hooks that would slow down things
+-- It would be very meaningless if the option is not even on
+__ingame_hooks = {}
+
+__ingame_help_max = 0
+
+function ingame_help(t, ...)
+ -- This function can also be used to call the callbacks
+ if type(t) == "string" then
+ local f = getglobal("__ingame_help_fct_"..t)
+ call(f, arg)
+ return
+ end
+
+ assert(t.desc or t.fct, "no ingame help desc/fct")
+ assert(t.hook or t.callback, "no ingame help hook/callback")
+ if t.hook then assert(t.event, "no ingame hepl event needed by hook") end
+
+ -- Set it to only trigger once
+ setglobal("__ingame_help_activated_"..__ingame_help_max, FALSE)
+ -- Save/load it
+ add_loadsave("__ingame_help_activated_"..__ingame_help_max, FALSE)
+
+ if t.hook then
+ -- If the hok list didnt exist yet, add it
+ if not __ingame_hooks[t.hook] then
+ -- Set it to empty, we'll fill it later
+ __ingame_hooks[t.hook] = {}
+ -- Add the global hook
+ add_hooks
+ {
+ [t.hook] = function (...)
+ if option_ingame_help ~= TRUE then return end
+ local k, e
+ for k, e in __ingame_hooks[%t.hook] do
+ if k ~= "n" then
+ call(e, arg)
+ end
+ end
+ end
+ }
+ end
+ if t.desc then
+ tinsert(__ingame_hooks[t.hook],
+ function (...)
+ local tbl = %t
+ if getglobal("__ingame_help_activated_"..%__ingame_help_max) == FALSE then
+ if call(tbl.event, arg) == TRUE then
+ local k, e
+ for k, e in tbl.desc do
+ msg_print(TERM_YELLOW, e)
+ end
+ setglobal("__ingame_help_activated_"..%__ingame_help_max, TRUE)
+ end
+ end
+ end
+ )
+ elseif t.fct then
+ tinsert(__ingame_hooks[t.hook],
+ function (...)
+ local tbl = %t
+ if getglobal("__ingame_help_activated_"..%__ingame_help_max) == FALSE then
+ if call(tbl.event, arg) == TRUE then
+ if tbl.fct() == TRUE then
+ setglobal("__ingame_help_activated_"..%__ingame_help_max, TRUE)
+ end
+ end
+ end
+ end
+ )
+ end
+ else
+ local no_test = FALSE
+ if t.no_test == TRUE then no_test = TRUE end
+ if t.desc then
+ setglobal
+ (
+ "__ingame_help_fct_"..(t.callback),
+ function (...)
+ local tbl = %t
+ if ((option_ingame_help == TRUE) or (%no_test == TRUE)) and (getglobal("__ingame_help_activated_"..%__ingame_help_max) == FALSE) then
+ local k, e
+ for k, e in tbl.desc do
+ msg_print(TERM_YELLOW, e)
+ end
+ setglobal("__ingame_help_activated_"..%__ingame_help_max, TRUE)
+ end
+ end
+ )
+ elseif t.fct then
+ setglobal
+ (
+ "__ingame_help_fct_"..(t.callback),
+ function (...)
+ local tbl = %t
+ if ((option_ingame_help == TRUE) or (%no_test == TRUE)) and (getglobal("__ingame_help_activated_"..%__ingame_help_max) == FALSE) then
+ if call(tbl.fct, arg) == TRUE then
+ setglobal("__ingame_help_activated_"..%__ingame_help_max, TRUE)
+ end
+ end
+ end
+ )
+ end
+ end
+
+ __ingame_help_max = __ingame_help_max + 1
+end
+
+-- Clean up the ingame help seen at birth
+add_hooks
+{
+ [HOOK_BIRTH_OBJECTS] = function()
+ local i
+ for i = 0, __ingame_help_max - 1 do
+ setglobal("__ingame_help_activated_"..i, FALSE)
+ end
+ end
+}
+
+function ingame_clean()
+ local i
+ for i = 0, __ingame_help_max - 1 do
+ setglobal("__ingame_help_activated_"..i, FALSE)
+ end
+end
+
+-- helper function, brings up a doc
+function ingame_help_doc(name, anchor)
+ -- Save screen
+ screen_save();
+
+ -- Peruse the help file
+ if not anchor then anchor = 0 end
+ show_file(name, 0, -anchor, 0)
+
+ -- Load screen
+ screen_load()
+end
diff --git a/lib/mods/theme/core/init.lua b/lib/mods/theme/core/init.lua
new file mode 100644
index 00000000..11b812d5
--- /dev/null
+++ b/lib/mods/theme/core/init.lua
@@ -0,0 +1,83 @@
+--
+-- This file is loaded at the initialisation of ToME
+-- Load the system functions
+--
+
+-- Name of globals to save
+tome_dofile_anywhere(ANGBAND_DIR_CORE, "load.lua")
+
+-- Very thin xml parser(49 lines ;)
+tome_dofile_anywhere(ANGBAND_DIR_CORE, "xml.lua")
+
+-- various vital helper code
+tome_dofile_anywhere(ANGBAND_DIR_CORE, "util.lua")
+tome_dofile_anywhere(ANGBAND_DIR_CORE, "player.lua")
+tome_dofile_anywhere(ANGBAND_DIR_CORE, "objects.lua")
+tome_dofile_anywhere(ANGBAND_DIR_CORE, "monsters.lua")
+tome_dofile_anywhere(ANGBAND_DIR_CORE, "building.lua")
+tome_dofile_anywhere(ANGBAND_DIR_CORE, "dungeon.lua")
+tome_dofile_anywhere(ANGBAND_DIR_CORE, "s_aux.lua")
+tome_dofile_anywhere(ANGBAND_DIR_CORE, "crpt_aux.lua")
+tome_dofile_anywhere(ANGBAND_DIR_CORE, "mimc_aux.lua")
+tome_dofile_anywhere(ANGBAND_DIR_CORE, "quests.lua")
+tome_dofile_anywhere(ANGBAND_DIR_CORE, "gods.lua")
+
+-- Load the ingame contextual help
+tome_dofile_anywhere(ANGBAND_DIR_CORE, "help.lua")
+
+-- let the store specific stuff happen!
+tome_dofile_anywhere(ANGBAND_DIR_CORE, "stores.lua")
+
+--------------------------------------------------------------
+--------------------------------------------------------------
+--------------------------------------------------------------
+-------------Here we load the non vital scripts---------------
+-----------------------from lib/scpt--------------------------
+--------------------------------------------------------------
+--------------------------------------------------------------
+tome_dofile("init.lua")
+
+-- The dofile functions for each patch
+patch_dofile = {}
+
+-- Now load patches
+function load_patches()
+ scansubdir(ANGBAND_DIR_PATCH)
+ for i = 0, scansubdir_max - 1 do
+ if (scansubdir_result[i + 1] ~= ".") and (scansubdir_result[i + 1] ~= "..") then
+ local dir = path_build(ANGBAND_DIR_PATCH, scansubdir_result[i + 1])
+ local file = path_build(dir, "patch.lua")
+ if file_exist(file) == TRUE then
+ patch_init = nil
+ tome_dofile_anywhere(dir, "patch.lua", TRUE)
+ unset_safe_globals()
+ if patch_init == nil then
+ set_safe_globals()
+ quit("Patch in "..file.." did not include a patch_init() function")
+ else
+ set_safe_globals()
+
+ -- create the dofile function
+ patch_dofile[scansubdir_result[i + 1]] = function(f)
+ tome_dofile_anywhere(%dir, f, TRUE)
+ end
+
+ local name, version = patch_init()
+ if name == nil or version == nil then
+ quit("Patch in "..file.." did not return valid name or version.\nIt must return name, version")
+ end
+ patch_version(name, version)
+ end
+ end
+ end
+ end
+end
+load_patches()
+
+--------------------------------------------------------------
+--------------------------------------------------------------
+--------------------------------------------------------------
+--
+-- Do not thouch after this line
+--
+tome_dofile_anywhere(ANGBAND_DIR_CORE, "load2.lua")
diff --git a/lib/mods/theme/core/load.lua b/lib/mods/theme/core/load.lua
new file mode 100644
index 00000000..9522ec91
--- /dev/null
+++ b/lib/mods/theme/core/load.lua
@@ -0,0 +1,37 @@
+-- Savefile stuff
+-- Do not meddle in the affairs of savefiles for they are subtle and quick to be become incompatible
+
+__loadsave_name = {}
+__loadsave_max = 0
+__loadsave_tmp = 0
+
+function add_loadsave(name, default)
+ assert(name, "No variable name to save")
+ assert(default, "No default value")
+
+ -- if it is a table we must create many entries
+ if type(default) == "table" then
+ for k, e in default do
+ add_loadsave(name.."."..k, e)
+ end
+ else
+ __loadsave_name[__loadsave_max] = { name = name, default = default }
+ __loadsave_max = __loadsave_max + 1
+ end
+end
+
+-- Example of how to save a table
+-- NOTE: { 1, 2, 3 } will NOT work, the key MUST be a string
+--[[
+add_loadsave("t",
+{
+ foo = 7,
+ tab = {
+ a = 1,
+ b = 2,
+ tab = {
+ a=1, b=2, c=3,
+ },
+ },
+})
+]]
diff --git a/lib/mods/theme/core/load2.lua b/lib/mods/theme/core/load2.lua
new file mode 100644
index 00000000..7e151d91
--- /dev/null
+++ b/lib/mods/theme/core/load2.lua
@@ -0,0 +1,56 @@
+-- Savefile helpers
+
+-- function called when a key in the variable part ofthe savefile is read
+-- if the key matches what we need, we use it, otehrwise just ignore it
+function __savefile_load(key, val)
+ local index, elem
+
+ for index, elem in __loadsave_name do
+ if (key == elem.name) then
+ dostring(elem.name.." = "..val)
+ end
+ end
+end
+
+-- called when the game is saved, can only save numbers
+-- assosiate a key with them to allow the loading code to recognize them
+function __savefile_save()
+ local index, elem
+ for index, elem in __loadsave_name do
+ dostring("__loadsave_tmp = "..elem.name)
+ save_number_key(elem.name, __loadsave_tmp);
+ end
+end
+
+register_savefile(__loadsave_max)
+add_hook_script(HOOK_LOAD_GAME, "__savefile_load", "__hook_load")
+add_hook_script(HOOK_SAVE_GAME, "__savefile_save", "__hook_save")
+
+-- Parse a flattened(i.e: foo.bar.zog) table path and recrate tables
+function reconstruct_table(name)
+ for i = 1, strlen(name) - 1 do
+ if strsub(name, i, i) == "." then
+ local tbl = strsub(name, 1, i - 1)
+
+ if dostring("return "..tbl) == nil then
+ dostring(tbl.."={}")
+ end
+ end
+ end
+end
+
+-- Automagically set unkown variables, otherwise the savefile code
+-- might get VERY upset
+do
+ local k, e
+ -- We need to be able to check for unknown globals
+ unset_safe_globals()
+ for k, e in __loadsave_name do
+ reconstruct_table(e.name)
+ if dostring("return "..(e.name)) == nil then
+ dostring((e.name).." = "..(e.default))
+ end
+ end
+ -- Now taht we did, we set it back, for it is usefull ;)
+ set_safe_globals()
+end
diff --git a/lib/mods/theme/core/mimc_aux.lua b/lib/mods/theme/core/mimc_aux.lua
new file mode 100644
index 00000000..cea1f4dc
--- /dev/null
+++ b/lib/mods/theme/core/mimc_aux.lua
@@ -0,0 +1,96 @@
+-- Mimic shapes helper file
+
+__mimics = {}
+__mimics_max = 1
+__mimics_names = {}
+
+function add_mimic_shape(t)
+ assert(t.name, "no mimic name")
+ assert(t.desc, "no mimic desc")
+ assert(t.calc, "no mimic calc")
+ assert(t.level, "no mimic level")
+ assert(t.duration, "no mimic duration")
+
+ if not t.limit then t.limit = 0 end
+
+ if not t.obj_name then
+ t.obj_name = t.name
+ end
+
+ t.show_name = '['..t.name..']'
+
+ -- if it needs hooks, add them
+ if t.hooks then
+ add_hooks(t.hooks)
+ end
+
+ -- Add it in a name to index hash table
+ __mimics_names[t.name] = __mimics_max
+
+ __mimics[__mimics_max] = t
+ __mimics_max = __mimics_max + 1
+end
+
+function resolve_mimic_name(name)
+ if __mimics_names[name] then
+ return __mimics_names[name]
+ else
+ return -1
+ end
+end
+
+function find_random_mimic_shape(level, limit, realm)
+ local mimic, tries
+
+ tries = 1000
+ while tries > 0 do
+ tries = tries - 1
+ mimic = rand_range(1, __mimics_max - 1)
+ if (not realm) or (__mimics[mimic].realm == realm) then
+ if limit >= __mimics[mimic].limit then
+ if (rand_int(__mimics[mimic].level * 3) < level) and (__mimics[mimic].rarity < 100) and (magik(100 - __mimics[mimic].rarity) == TRUE) then
+ break
+ end
+ end
+ end
+ end
+ if tries > 0 then
+ return mimic
+ else
+ return resolve_mimic_name("Abomination")
+ end
+end
+
+function get_mimic_info(mimic, info)
+ if not __mimics[mimic] then return 0 end
+ return __mimics[mimic][info]
+end
+
+function get_mimic_rand_dur(mimic)
+ return rand_range(__mimics[mimic].duration[1], __mimics[mimic].duration[2])
+end
+
+function calc_mimic(mimic)
+ return __mimics[mimic].calc()
+end
+
+function calc_mimic_power(mimic)
+ if __mimics[mimic].power then __mimics[mimic].power() end
+end
+
+--- Here comes the only vital shape
+
+add_mimic_shape
+{
+ ["name"] = "Abomination",
+ ["obj_name"] = "Abominable Cloak",
+ ["desc"] = "Abominations are failed experiments of powerful wizards.",
+ ["realm"] = nil,
+ ["level"] = 1,
+ ["rarity"] = 101,
+ ["duration"] = {20, 100},
+ ["calc"] = function ()
+ apply_flags(TR1_SPEED + TR1_STR + TR1_INT + TR1_WIS + TR1_DEX + TR1_CON + TR1_CHR, 0, 0, 0, 0, 0, -10)
+ player.xtra_f3 = bor(player.xtra_f3, TR3_AGGRAVATE)
+ end,
+}
diff --git a/lib/mods/theme/core/monsters.lua b/lib/mods/theme/core/monsters.lua
new file mode 100644
index 00000000..ca2851a0
--- /dev/null
+++ b/lib/mods/theme/core/monsters.lua
@@ -0,0 +1,16 @@
+-- SYSTEM FILE
+--
+-- Monster stuff, do not touch
+--
+
+function summon_monster(y, x, lev, friend, typ)
+ if type(typ) == "number" then
+ if friend == TRUE then
+ return summon_specific_friendly(y, x, lev, typ, FALSE)
+ else
+ return summon_specific(y, x, lev, typ)
+ end
+ else
+ return summon_monster_aux(y, x, lev, friend, typ)
+ end
+end
diff --git a/lib/mods/theme/core/objects.lua b/lib/mods/theme/core/objects.lua
new file mode 100644
index 00000000..97320b82
--- /dev/null
+++ b/lib/mods/theme/core/objects.lua
@@ -0,0 +1,45 @@
+-- SYSTEM FILE
+--
+-- Lua object funtions
+--
+
+function create_object(tval, sval)
+ local obj = new_object()
+ object_prep(obj, lookup_kind(tval, sval))
+ return (obj)
+end
+
+function set_item_tester(tester)
+ if tolua.type(tester) == "number" then
+ lua_set_item_tester(tester, "")
+ end
+ if tolua.type(tester) == "string" then
+ lua_set_item_tester(0, tester)
+ end
+ if tolua.type(tester) == "function" then
+ __get_item_hook_default = tester
+ lua_set_item_tester(0, "__get_item_hook_default")
+ end
+end
+
+function create_artifact(a_idx)
+ local obj
+ local tval, sval
+
+ tval = a_info[a_idx + 1].tval
+ sval = a_info[a_idx + 1].sval
+ obj = create_object(tval, sval)
+ obj.name1 = a_idx
+ apply_magic(obj, -1, TRUE, TRUE, TRUE)
+
+ return (obj)
+end
+
+function get_kind(obj)
+ return k_info[obj.k_idx + 1]
+end
+
+function get_item(ask, deny, flags, mask)
+ set_item_tester(mask)
+ return get_item_aux(0, ask, deny, flags)
+end
diff --git a/lib/mods/theme/core/player.lua b/lib/mods/theme/core/player.lua
new file mode 100644
index 00000000..16878228
--- /dev/null
+++ b/lib/mods/theme/core/player.lua
@@ -0,0 +1,135 @@
+-- SYSTEM FILE
+--
+-- Lua player funtions
+--
+
+-- Gods
+function deity(i)
+ return deity_info[1 + i]
+end
+
+-------- skill stuff ---------
+
+-- Easy skill access
+function skill(i)
+ return s_info[i + 1]
+end
+
+-- Sart a lasting spell
+function player.start_lasting_spell(spl)
+ player.music_extra = -spl
+end
+
+-- stat mods
+function player.modify_stat(stat, inc)
+ player.stat_add[1 + stat] = player.stat_add[1 + stat] + inc
+end
+
+-- powers mods
+function player.add_power(pow)
+ player.powers[1 + pow] = TRUE
+end
+
+-- easier inventory access
+function player.inventory(i)
+ return player.inventory_real[i + 1]
+end
+
+-- modify mana
+-- returns TRUE if there is a pb
+function increase_mana(amt)
+ player.csp = player.csp + amt
+ player.redraw = bor(player.redraw, PR_MANA)
+ if (player.csp < 0) then
+ player.csp = 0
+ return TRUE
+ end
+ if (player.csp > player.msp) then
+ player.csp = player.msp
+ end
+ return FALSE
+end
+
+
+-- Return the coordinates of the player whether in wild or not
+function player.get_wild_coord()
+ if player.wild_mode == TRUE then
+ return player.py, player.px
+ else
+ return player.wilderness_y, player.wilderness_x
+ end
+end
+
+-- Create a new power
+__power_fct = {}
+function add_power(p)
+ local i
+
+ assert(p.name, "No power name!")
+ assert(p.desc, "No power desc!")
+ assert(p.desc_get, "No power desc get!")
+ assert(p.desc_lose, "No power desc lose!")
+ assert(p.stat, "No power stat!")
+ assert(p.level, "No power level!")
+ assert(p.cost, "No power cost!")
+ assert(p.fail, "No power fail!")
+ assert(p.power, "No power power!")
+
+ i = add_new_power(p.name, p.desc, p.desc_get, p.desc_lose, p.level, p.cost, p.stat, p.fail)
+ __power_fct[i] = p.power
+ return i
+end
+
+function __power_fct_activate(power)
+ if __power_fct[power] then
+ __power_fct[power]()
+ return TRUE
+ else
+ return FALSE
+ end
+end
+
+-- Register in the hook list
+add_hook_script(HOOK_ACTIVATE_POWER, "__power_fct_activate", "__power_fct_activate")
+
+
+--- Mkeys
+
+-- Create a new power
+__mkey_fct = {}
+function add_mkey(p)
+ local i
+
+ assert(p.mkey, "No mkey mkey!")
+ assert(p.fct, "No mkeey fct!")
+
+ __mkey_fct[p.mkey] = p.fct
+end
+
+function __mkey_fct_activate(power)
+ if __mkey_fct[power] then
+ __mkey_fct[power]()
+ return TRUE
+ else
+ return FALSE
+ end
+end
+
+-- Register in the hook list
+add_hook_script(HOOK_MKEY, "__mkey_fct_activate", "__mkey_fct_activate")
+
+
+-- Subraces
+function subrace(racem)
+ return race_mod_info[racem + 1]
+end
+
+function subrace_add_power(subrace, power)
+ for i = 1, 4 do
+ if subrace.powers[i] == -1 then
+ subrace.powers[i] = power
+ return not nil
+ end
+ end
+ return nil
+end
diff --git a/lib/mods/theme/core/quests.lua b/lib/mods/theme/core/quests.lua
new file mode 100644
index 00000000..dfe9db51
--- /dev/null
+++ b/lib/mods/theme/core/quests.lua
@@ -0,0 +1,57 @@
+-- Quest helper files
+
+-- Quest structs
+
+__quest_hook = {}
+__quest_callbacks = {}
+__quest_callbacks_max = 0
+__quest_dynamic_desc = {}
+
+function add_quest(q)
+ local i, index, d, z, qq
+
+ assert(q.global, "No quest global name")
+ assert(q.name, "No quest name")
+ assert(q.desc, "No quest desc")
+ assert(q.level, "No quest level")
+ assert(q.hooks, "No quest hooks")
+
+ i = new_quest(q.name);
+ setglobal(q.global, i)
+
+ -- Make it save & load
+ add_loadsave("quest("..q.global..").status", QUEST_STATUS_UNTAKEN)
+
+ if type(q.desc) == "table" then
+ z = 0
+ for index, d in q.desc do
+ quest_desc(i, z, d);
+ z = z + 1
+ end
+ else
+ __quest_dynamic_desc[i] = q.desc
+ quest(i).dynamic_desc = TRUE
+ end
+ quest(i).level = q.level
+ if not q.silent then
+ quest(i).silent = FALSE
+ else
+ quest(i).silent = q.silent
+ end
+ __quest_hook[i] = q.hooks
+ for index, d in q.hooks do
+ add_hook_script(index, "__lua__quest_callback"..__quest_callbacks_max, "__lua__quest_callback"..__quest_callbacks_max)
+ setglobal("__lua__quest_callback"..__quest_callbacks_max, d)
+ __quest_callbacks_max = __quest_callbacks_max + 1
+ end
+ if q.data then
+ for index, d in q.data do
+ -- Besure it exists
+ setglobal(index, d)
+
+ -- Make it save & load
+ add_loadsave(index, d)
+ end
+ end
+ return i
+end
diff --git a/lib/mods/theme/core/s_aux.lua b/lib/mods/theme/core/s_aux.lua
new file mode 100644
index 00000000..ec609b04
--- /dev/null
+++ b/lib/mods/theme/core/s_aux.lua
@@ -0,0 +1,716 @@
+-- Functions to help with spells, do not touch
+
+__schools = {}
+__schools_num = 0
+
+__tmp_spells = {}
+__tmp_spells_num = 0
+
+function add_school(s)
+ __schools[__schools_num] = s
+
+ __schools_num = __schools_num + 1
+ return (__schools_num - 1)
+end
+
+function finish_school(i)
+ local s
+
+ s = __schools[i]
+ assert(s.name, "No school name!")
+ assert(s.skill, "No school skill!")
+
+ -- Need hooks?
+ if s.hooks then
+ add_hooks(s.hooks)
+ end
+
+ new_school(i, s.name, s.skill)
+end
+
+function add_spell(s)
+ __tmp_spells[__tmp_spells_num] = s
+
+ __tmp_spells_num = __tmp_spells_num + 1
+ return (__tmp_spells_num - 1)
+end
+
+function finish_spell(must_i)
+ local i, s
+
+ s = __tmp_spells[must_i]
+ assert(s.name, "No spell name!")
+ assert(s.school, "No spell school!")
+ assert(s.level, "No spell level!")
+ assert(s.mana, "No spell mana!")
+ if not s.mana_max then s.mana_max = s.mana end
+ assert(s.fail, "No spell failure rate!")
+ assert(s.spell, "No spell function!")
+ if not s.info then s.info = function() return "" end end
+ assert(s.desc, "No spell desc!")
+ if not s.random then s.random = SKILL_MAGIC end
+ if s.lasting then
+ assert(type(s.lasting) == "function", "Spell lasting is not function")
+ end
+ if s.stick then
+ local k, e
+ for k, e in s.stick do
+ if type(k) == "table" then
+ assert(e.base_level, "Arg no stick base level")
+ assert(e.max_level, "Arg no stick max level")
+ end
+ end
+ end
+
+ i = new_spell(must_i, s.name)
+ assert(i == must_i, "ACK ! i != must_i ! please contact the maintainer")
+ if type(s.school) == "number" then __spell_school[i] = {s.school}
+ else __spell_school[i] = s.school end
+ spell(i).mana = s.mana
+ spell(i).mana_max = s.mana_max
+ spell(i).fail = s.fail
+ spell(i).skill_level = s.level
+ __spell_spell[i] = s.spell
+ __spell_info[i] = s.info
+ __spell_desc[i] = s.desc
+ return i
+end
+
+-- Creates the school books array
+__spell_spell = {}
+__spell_info = {}
+__spell_desc = {}
+__spell_school = {}
+school_book = {}
+
+-- Find a spell by name
+function find_spell(name)
+ local i
+
+ i = 0
+ while (i < __tmp_spells_num) do
+ if __tmp_spells[i].name == name then return i end
+ i = i + 1
+ end
+ return -1
+end
+
+-- Find if the school is under the influence of a god, returns nil or the level
+function get_god_level(sch)
+ if __schools[sch].gods[player.pgod] then
+ return (s_info[__schools[sch].gods[player.pgod].skill + 1].value * __schools[sch].gods[player.pgod].mul) / __schools[sch].gods[player.pgod].div
+ else
+ return nil
+ end
+end
+
+-- Change this fct if I want to switch to learnable spells
+function get_level_school(s, max, min)
+ local lvl, sch, index, num, bonus
+ local allow_spell_power = TRUE
+
+ lvl = 0
+ num = 0
+ bonus = 0
+
+ -- No max specified ? assume 50
+ if not max then
+ max = 50
+ end
+ if not min then
+ min = 1
+ end
+
+ -- Do we pass tests?
+ if __tmp_spells[s].depend then
+ if __tmp_spells[s].depend() ~= TRUE then
+ return min, "n/a"
+ end
+ end
+
+ for index, sch in __spell_school[s] do
+ local r, s, p, ok = 0, 0, 0, 0
+
+ -- Does it require we worship a specific god?
+ if __schools[sch].god then
+ if __schools[sch].god ~= player.pgod then
+ if min then return min, "n/a"
+ else return 1, "n/a" end
+ end
+ end
+
+ -- Take the basic skill value
+ r = s_info[(school(sch).skill) + 1].value
+
+ -- Do we pass tests?
+ if __schools[sch].depend then
+ if __schools[sch].depend() ~= TRUE then
+ return min, "n/a"
+ end
+ end
+
+ -- Are we under sorcery effect ?
+ if __schools[sch].sorcery then
+ s = s_info[SKILL_SORCERY + 1].value
+ end
+
+ -- Are we affected by spell power ?
+ -- All teh schools must allow it for it to work
+ if not __schools[sch].spell_power then
+ allow_spell_power = nil
+ end
+
+ -- Are we under a god effect ?
+ if __schools[sch].gods then
+ p = get_god_level(sch)
+ if not p then p = 0 end
+ end
+
+ -- Find the higher
+ ok = r
+ if ok < s then ok = s end
+ if ok < p then ok = p end
+
+ -- Do we need to add a special bonus ?
+ if __schools[sch].bonus_level then
+ bonus = bonus + (__schools[sch].bonus_level() * (SKILL_STEP / 10))
+ end
+
+ -- All schools must be non zero to be able to use it
+ if ok == 0 then return min, "n/a" end
+
+ -- Apply it
+ lvl = lvl + ok
+ num = num + 1
+ end
+
+ -- Add the Spellpower skill as a bonus
+ if allow_spell_power then
+ bonus = bonus + (get_skill_scale(SKILL_SPELL, 20) * (SKILL_STEP / 10))
+ end
+
+ -- Add bonus from objects
+ bonus = bonus + (player.to_s * (SKILL_STEP / 10))
+
+ -- / 10 because otherwise we can overflow a s32b and we can use a u32b because the value can be negative
+ -- The loss of information should be negligible since 1 skill = 1000 internally
+ lvl = (lvl / num) / 10
+ lvl = lua_get_level(s, lvl, max, min, bonus)
+
+ return lvl, nil
+end
+
+-- This is the function to use when casting through a stick
+function get_level_device(s, max, min)
+ local lvl
+
+ -- No max specified ? assume 50
+ if not max then
+ max = 50
+ end
+
+ lvl = s_info[SKILL_DEVICE + 1].value
+ lvl = lvl + (get_level_use_stick * SKILL_STEP)
+
+ -- Sticks are limited
+ if lvl - ((spell(s).skill_level + 1) * SKILL_STEP) >= get_level_max_stick * SKILL_STEP then
+ lvl = (get_level_max_stick + spell(s).skill_level - 1) * SKILL_STEP
+ end
+
+ -- / 10 because otherwise we can overflow a s32b and we can use a u32b because the value can be negative
+ -- The loss of information should be negligible since 1 skill = 1000 internally
+ lvl = lvl / 10
+ if not min then
+ lvl = lua_get_level(s, lvl, max, 1, 0)
+ else
+ lvl = lua_get_level(s, lvl, max, min, 0)
+ end
+
+ return lvl
+end
+
+-- The real get_level, works for schooled magic and for innate powers
+get_level_use_stick = -1
+get_level_max_stick = -1
+function get_level(s, max, min)
+ if type(s) == "number" then
+ -- Ahah shall we use Magic device instead ?
+ if get_level_use_stick > -1 then
+ return get_level_device(s, max, min)
+ else
+ local lvl, na = get_level_school(s, max, min)
+ return lvl
+ end
+ else
+ return get_level_power(s, max, min)
+ end
+end
+
+-- Can we cast the spell ?
+function is_ok_spell(s, obj)
+ if get_level(s, 50, 0) == 0 then return nil end
+ if __tmp_spells[s].pval and obj.pval < __tmp_spells[s].pval then return nil end
+ return 1
+end
+
+-- Get the amount of mana(or power) needed
+function get_mana(s)
+ return spell(s).mana + get_level(s, spell(s).mana_max - spell(s).mana, 0)
+end
+
+-- Return the amount of power(mana, piety, whatever) for the spell
+function get_power(s)
+ if check_affect(s, "piety", FALSE) then
+ return player.grace
+ else
+ return player.csp
+ end
+end
+
+-- Return the amount of power(mana, piety, whatever) for the spell
+function get_power_name(s)
+ if check_affect(s, "piety", FALSE) then
+ return "piety"
+ else
+ return "mana"
+ end
+end
+
+-- Get the level of a power
+function get_level_power(s, max, min)
+ if not max then max = 50 end
+ if not min then min = 1 end
+
+ return value_scale(s.get_current_level(), 50, max, min)
+end
+
+-- Changes the amount of power(mana, piety, whatever) for the spell
+function adjust_power(s, x)
+ if check_affect(s, "piety", FALSE) then
+ inc_piety(GOD_ALL, x)
+ else
+ increase_mana(x)
+ end
+end
+
+-- Get spell school name(s) as a /-separated string.
+function spell_school_name(s)
+ local xx, sch_str
+ xx = nil
+ sch_str = ""
+ for index, sch in __spell_school[s] do
+ if xx then
+ sch_str = sch_str.."/"..school(sch).name
+ else
+ xx = 1
+ sch_str = sch_str..school(sch).name
+ end
+ end
+ return sch_str
+end
+
+-- Print the book and the spells
+function print_book(book, spl, obj)
+ local x, y, index, sch, size, s
+
+ x = 0
+ y = 2
+ size = 0
+
+ -- Hack if the book is 255 it is a random book
+ if book == 255 then
+ school_book[book] = {spl}
+ end
+
+ -- Parse all spells
+ for index, s in school_book[book] do
+ local color = TERM_L_DARK
+ local lvl, na = get_level_school(s, 50, -50)
+ local xx, sch_str
+
+ if is_ok_spell(s, obj) then
+ if get_mana(s) > get_power(s) then color = TERM_ORANGE
+ else color = TERM_L_GREEN end
+ end
+
+ sch_str = spell_school_name(s)
+
+ if na then
+ c_prt(color, format("%c) %-20s%-16s %3s %4s %3d%s %s", size + strbyte("a"), spell(s).name, sch_str, na, get_mana(s), spell_chance(s), "%", __spell_info[s]()), y, x)
+ else
+ c_prt(color, format("%c) %-20s%-16s %3d %4s %3d%s %s", size + strbyte("a"), spell(s).name, sch_str, lvl, get_mana(s), spell_chance(s), "%", __spell_info[s]()), y, x)
+ end
+ y = y + 1
+ size = size + 1
+ end
+ prt(format(" %-20s%-16s Level Cost Fail Info", "Name", "School"), 1, x)
+ return y
+end
+
+-- Output the describtion when it is used as a spell
+function print_spell_desc(s, y)
+ local index, desc, x
+
+ x = 0
+
+ if type(__spell_desc[s]) == "string" then c_prt(TERM_L_BLUE, __spell_desc[s], y, x)
+ else
+ for index, desc in __spell_desc[s] do
+ c_prt(TERM_L_BLUE, desc, y, x)
+ y = y + 1
+ end
+ end
+ if check_affect(s, "piety", FALSE) then
+ c_prt(TERM_L_WHITE, "It uses piety to cast.", y, x)
+ y = y + 1
+ end
+ if not check_affect(s, "blind") then
+ c_prt(TERM_ORANGE, "It is castable even while blinded.", y, x)
+ y = y + 1
+ end
+ if not check_affect(s, "confusion") then
+ c_prt(TERM_ORANGE, "It is castable even while confused.", y, x)
+ y = y + 1
+ end
+end
+
+-- Output the desc when sued as a device
+function print_device_desc(s)
+ local index, desc
+
+ if type(__spell_desc[s]) == "string" then text_out(__spell_desc[s])
+ else
+ for index, desc in __spell_desc[s] do
+ text_out("\n" .. desc)
+ end
+ end
+end
+
+function book_spells_num(book)
+ local size, index, sch
+
+ size = 0
+
+ -- Hack if the book is 255 it is a random book
+ if book == 255 then
+ return 1
+ end
+
+ -- Parse all spells
+ for index, s in school_book[book] do
+ size = size + 1
+ end
+ return size
+end
+
+function spell_x(book, spl, s)
+ if book == 255 then
+ return spl
+ else
+ local i, x, val
+
+ i, val = next(school_book[book], nil)
+ x = 0
+ while x < s do
+ i, val = next(school_book[book], i)
+ x = x + 1
+ end
+ return val
+ end
+end
+
+function spell_in_book(book, spell)
+ local i, s
+
+ for i, s in school_book[book] do
+ if s == spell then return TRUE end
+ end
+ return FALSE
+end
+
+-- Returns spell chance of failure for spell
+function spell_chance(s)
+ local chance, s_ptr
+
+ s_ptr = spell(s)
+
+ -- Extract the base spell failure rate
+ if get_level_use_stick > -1 then
+ chance = lua_spell_device_chance(s_ptr.fail, get_level(s, 50), s_ptr.skill_level)
+ else
+ chance = lua_spell_chance(s_ptr.fail, get_level(s, 50), s_ptr.skill_level, get_mana(s), get_power(s), get_spell_stat(s))
+ end
+
+ -- Return the chance
+ return chance
+end
+
+function check_affect(s, name, default)
+ local s_ptr = __tmp_spells[s]
+ local a
+
+ if type(s_ptr[name]) == "number" then
+ a = s_ptr[name]
+ else
+ a = default
+ end
+ if a == FALSE then
+ return nil
+ else
+ return TRUE
+ end
+end
+
+-- Returns the stat to use for the spell, INT by default
+function get_spell_stat(s)
+ if not __tmp_spells[s].stat then return A_INT
+ else return __tmp_spells[s].stat end
+end
+
+function cast_school_spell(s, s_ptr, no_cost)
+ local use = FALSE
+
+ -- No magic
+ if (player.antimagic > 0) then
+ msg_print("Your anti-magic field disrupts any magic attempts.")
+ return
+ end
+
+ -- No magic
+ if (player.anti_magic == TRUE) then
+ msg_print("Your anti-magic shell disrupts any magic attempts.")
+ return
+ end
+
+ -- if it costs something then some condition must be met
+ if not no_cost then
+ -- Require lite
+ if (check_affect(s, "blind")) and ((player.blind > 0) or (no_lite() == TRUE)) then
+ msg_print("You cannot see!")
+ return
+ end
+
+ -- Not when confused
+ if (check_affect(s, "confusion")) and (player.confused > 0) then
+ msg_print("You are too confused!")
+ return
+ end
+
+ -- Enough mana
+ if (get_mana(s) > get_power(s)) then
+ if (get_check("You do not have enough "..get_power_name(s)..", do you want to try anyway?") == FALSE) then return end
+ end
+
+ -- Invoke the spell effect
+ if (magik(spell_chance(s)) == FALSE) then
+ if (__spell_spell[s]() ~= nil) then
+ use = TRUE
+ end
+ else
+ local index, sch
+
+ -- added because this is *extremely* important --pelpel
+ if (flush_failure) then flush() end
+
+ msg_print("You failed to get the spell off!")
+ for index, sch in __spell_school[s] do
+ if __schools[sch].fail then
+ __schools[sch].fail(spell_chance(s))
+ end
+ end
+ use = TRUE
+ end
+ else
+ __spell_spell[s]()
+ end
+
+ if use == TRUE then
+ -- Reduce mana
+ adjust_power(s, -get_mana(s))
+
+ -- Take a turn
+ if is_magestaff() == TRUE then energy_use = 80
+ else energy_use = 100 end
+ end
+
+ player.redraw = bor(player.redraw, PR_MANA)
+ player.window = bor(player.window, PW_PLAYER)
+end
+
+
+-- Can the spell be randomly found(in random books)
+function can_spell_random(i)
+ return __tmp_spells[i].random
+end
+
+-- Find a random spell
+function get_random_spell(typ, level)
+ local spl, tries
+
+ tries = 1000
+ while tries > 0 do
+ tries = tries - 1
+ spl = rand_int(__tmp_spells_num)
+ if (can_spell_random(spl) == typ) and (rand_int(spell(spl).skill_level * 3) < level) then
+ break
+ end
+ end
+ if tries > 0 then
+ return spl
+ else
+ return -1
+ end
+end
+
+-- Execute a lasting spell
+function exec_lasting_spell(spl)
+ assert(__tmp_spells[spl].lasting, "No lasting effect for spell "..__tmp_spells[spl].name.." but called as such")
+ return __tmp_spells[spl].lasting()
+end
+
+-- Helper function for spell effect to know if they are or not obvious
+function is_obvious(effect, old)
+ if old then
+ if old == TRUE or effect == TRUE then
+ return TRUE
+ else
+ return FALSE
+ end
+ else
+ return effect
+ end
+end
+
+-------------------------Sticks-------------------------
+
+-- Fire off the spell
+function activate_stick(spl)
+ local ret = __spell_spell[spl]()
+ local charge, obvious
+ if not ret then
+ charge = FALSE
+ obvious = FALSE
+ else
+ charge = TRUE
+ obvious = ret
+ end
+ return obvious, charge
+end
+
+----------------------------------- Wand, Staves, Rods specific functions ----------------------------
+
+-- Get a spell for a given stick(wand, staff, rod)
+function get_random_stick(stick, level)
+ local spl, tries
+
+ tries = 1000
+ while tries > 0 do
+ tries = tries - 1
+ spl = rand_int(__tmp_spells_num)
+ if __tmp_spells[spl].stick and (type(__tmp_spells[spl].stick[stick]) == "table") then
+ if (rand_int(spell(spl).skill_level * 3) < level) and (magik(100 - __tmp_spells[spl].stick[stick].rarity) == TRUE) then
+ break
+ end
+ end
+ end
+ if tries > 0 then
+ return spl
+ else
+ return -1
+ end
+end
+
+-- Get a random base level
+function get_stick_base_level(stick, level, spl)
+ -- Paranoia
+ if spl < 0 or spl >= __tmp_spells_num or not __tmp_spells[spl].stick[stick] then return 0 end
+
+ local min, max = __tmp_spells[spl].stick[stick].base_level[1], __tmp_spells[spl].stick[stick].base_level[2]
+ local range = max - min;
+
+ -- Ok the basic idea is to have a max possible level of half the dungeon level
+ if range * 2 > level then range = level / 2 end
+
+ -- Randomize a bit
+ range = m_bonus(range, dun_level)
+
+ -- And get the result
+ return min + range
+end
+
+-- Get a random max level
+function get_stick_max_level(stick, level, spl)
+ -- Paranoia
+ if spl < 0 or spl >= __tmp_spells_num or not __tmp_spells[spl].stick[stick] then return 0 end
+
+ local min, max = __tmp_spells[spl].stick[stick].max_level[1], __tmp_spells[spl].stick[stick].max_level[2]
+ local range = max - min;
+
+ -- Ok the basic idea is to have a max possible level of half the dungeon level
+ if range * 2 > level then range = level / 2 end
+
+ -- Randomize a bit
+ range = m_bonus(range, dun_level)
+
+ -- And get the result
+ return min + range
+end
+
+-- Get the number of desired charges
+function get_stick_charges(spl)
+ return __tmp_spells[spl].stick.charge[1] + randint(__tmp_spells[spl].stick.charge[2]);
+end
+
+-- Get activation desc
+function get_activation_desc(spl)
+ local turns
+ if type(__tmp_spells[spl].activate) == 'number' then
+ turns = __tmp_spells[spl].activate
+ else
+ turns = __tmp_spells[spl].activate[1] .. '+d' .. __tmp_spells[spl].activate[2]
+ end
+ return __tmp_spells[spl].desc[1] .. ' every ' .. turns .. ' turns'
+end
+
+-- Compute the timeout of an activation
+function get_activation_timeout(spl)
+ if type(__tmp_spells[spl].activate) == 'number' then
+ return __tmp_spells[spl].activate
+ else
+ return __tmp_spells[spl].activate[1] + randint(__tmp_spells[spl].activate[2])
+ end
+end
+
+-- Fire off the spell
+function activate_activation(spl, item)
+ __spell_spell[spl](item)
+end
+
+
+------- Add new GF type ----------
+max_gf = MAX_GF
+function add_spell_type(t)
+ t.index = max_gf
+ max_gf = max_gf + 1
+ assert(t.color, "No GF color")
+ if not t.monster then t.monster = function() end end
+ if not t.angry then t.angry = function() end end
+ if not t.object then t.object = function() end end
+ if not t.player then t.player = function() end end
+ if not t.grid then t.grid = function() end end
+
+ add_hooks
+ {
+ [HOOK_GF_COLOR] = function (gf, new_gfx)
+ local t = %t
+ if gf == t.index then return TRUE, t.color[new_gfx + 1] end
+ end,
+ [HOOK_GF_EXEC] = function (action, who, gf, dam, rad, y, x, extra)
+ local t = %t
+ if t.index == gf then
+ return t[action](who, dam, rad, y, x, extra)
+ end
+ end,
+ }
+ return t.index
+end
diff --git a/lib/mods/theme/core/stores.lua b/lib/mods/theme/core/stores.lua
new file mode 100644
index 00000000..d4a63168
--- /dev/null
+++ b/lib/mods/theme/core/stores.lua
@@ -0,0 +1,32 @@
+-- Take care of all concerning stores
+function store_buy_list(t)
+ assert(type(t) == "table", "store_buy_list got no table")
+ add_hooks
+ {
+ [HOOK_STORE_BUY] = function (index, name, obj)
+ local tbl = %t
+ local elt = tbl[index]
+ if not elt then
+ elt = tbl[name]
+ end
+ if elt then
+ if elt then
+ if type(elt) == "function" then
+ return TRUE, elt(obj)
+ elseif type(elt) == "table" then
+ local k, e
+ for k, e in elt do
+ if type(e) == "number" then
+ if obj.tval == e then return TRUE, TRUE end
+ else
+ if (obj.tval == e[1]) and (obj.sval >= e[2]) and (obj.sval <= e[3]) then return TRUE, TRUE end
+ end
+ end
+ elseif elt == -1 then
+ return TRUE, FALSE
+ end
+ end
+ end
+ end,
+ }
+end
diff --git a/lib/mods/theme/core/util.lua b/lib/mods/theme/core/util.lua
new file mode 100644
index 00000000..eea13014
--- /dev/null
+++ b/lib/mods/theme/core/util.lua
@@ -0,0 +1,158 @@
+-- various stuff to make scripters life easier
+
+-- Beware of the scary undefined globals
+function safe_getglobal(x)
+ local v = rawget(globals(), x)
+
+ if v then
+ return v
+ else
+ error("undefined global variable '"..x.."'")
+ end
+end
+
+function set_safe_globals()
+ settagmethod(tag(nil), "getglobal", safe_getglobal)
+end
+function unset_safe_globals()
+ settagmethod(tag(nil), "getglobal", nil)
+end
+
+set_safe_globals()
+
+-- Patch modules
+__patch_modules = {}
+
+function patch_version(name, version)
+ assert(not __patch_modules[name], "Patch " .. name .. " already loaded!!!")
+ __patch_modules[name] = version
+end
+
+function patchs_list()
+ local k, e, first
+ first = FALSE
+ for k, e in __patch_modules do
+ if first == FALSE then print_hook("\n\n [Patch modules]\n") first = TRUE end
+ print_hook("\n "..k.." version "..e)
+ end
+ if first == TRUE then print_hook("\n") end
+end
+
+function patchs_display()
+ local k, e
+ for k, e in __patch_modules do
+ msg_print("Patch: "..k.." version "..e)
+ end
+end
+
+
+-- Better hook interface
+__hooks_list_callback = {}
+__hooks_list_callback_max = 0
+
+function add_hooks(h_table, name_prefix)
+ local k, e
+
+ if not name_prefix then name_prefix = "" end
+ for k, e in h_table do
+ add_hook_script(k, "__"..name_prefix.."__hooks_list_callback"..__hooks_list_callback_max, "__"..name_prefix.."__hooks_list_callback"..__hooks_list_callback_max)
+ setglobal("__"..name_prefix.."__hooks_list_callback"..__hooks_list_callback_max, e)
+ __hooks_list_callback_max = __hooks_list_callback_max + 1
+ end
+end
+
+-- Wrapper for the real msg_print and cmsg_print
+-- it understands if we want color or not
+function msg_print(c, m)
+ if type(c) == "number" then
+ cmsg_print(c, m)
+ else
+ call(%msg_print, { c })
+ end
+end
+
+-- better timer add function
+__timers_callback_max = 0
+
+function new_timer(t)
+ assert(t.delay > 0, "no timer delay")
+ assert(t.enabled, "no timer enabled state")
+ assert(t.callback, "no timer callback")
+
+ local timer
+ if type(t.callback) == "function" then
+ setglobal("__timers_callback_"..__timers_callback_max, t.callback)
+ timer = %new_timer("__timers_callback_"..__timers_callback_max, t.delay)
+ __timers_callback_max = __timers_callback_max + 1
+ else
+ timer = %new_timer(t.callback, t.delay)
+ end
+
+ timer.enabled = t.enabled
+
+ return timer
+end
+
+-- saves all timer values
+function save_timer(name)
+ add_loadsave(name..".enabled", FALSE)
+ add_loadsave(name..".delay", 1)
+ add_loadsave(name..".countdown", 1)
+end
+
+
+-- displays a scrolling list
+function display_list(y, x, h, w, title, list, begin, sel, sel_color)
+ local l = create_list(getn(list))
+
+ for i = 1, getn(list) do
+ add_to_list(l, i - 1, list[i])
+ end
+
+ %display_list(y, x, h, w, title, l, getn(list), begin - 1, sel - 1, sel_color)
+
+ delete_list(l, getn(list))
+end
+
+-- Easier access to special gene stuff
+function set_monster_generation(monster, state)
+ if type(monster) == "string" then
+ m_allow_special[test_monster_name(monster) + 1] = state
+ else
+ m_allow_special[monster + 1] = state
+ end
+end
+function set_object_generation(obj, state)
+ if type(obj) == "string" then
+ m_allow_special[test_item_name(obj) + 1] = state
+ else
+ m_allow_special[obj + 1] = state
+ end
+end
+function set_artifact_generation(obj, state)
+ m_allow_special[obj + 1] = state
+end
+
+-- Strings
+function strcap(str)
+ if strlen(str) > 1 then
+ return strupper(strsub(str, 1, 1))..strsub(str, 2)
+ elseif strlen(str) == 1 then
+ return strupper(str)
+ else
+ return str
+ end
+end
+
+function msg_format(...)
+ msg_print(call(format, arg))
+end
+
+-- A way to check if the game is now running(as opposed to initialization/character gen)
+game = {}
+add_hooks
+{
+ [HOOK_GAME_START] = function ()
+ game.started = TRUE
+ end
+}
diff --git a/lib/mods/theme/core/xml.lua b/lib/mods/theme/core/xml.lua
new file mode 100644
index 00000000..14f0511f
--- /dev/null
+++ b/lib/mods/theme/core/xml.lua
@@ -0,0 +1,375 @@
+-- The xml module
+xml = {}
+
+function xml:parseargs (s)
+ local arg = {}
+ gsub(s, "(%w+)=([\"'])(.-)%2", function (w, _, a)
+ %arg[w] = a
+ end)
+ return arg
+end
+
+-- s is a xml stream, returns a table
+function xml:collect (s)
+ local stack = {n=0}
+ local top = {n=0}
+ tinsert(stack, top)
+ local ni,c,label,args, empty
+ local i, j = 1, 1
+ while 1 do
+ ni,j,c,label,args, empty = strfind(s, "<(%/?)(%w+)(.-)(%/?)>", j)
+ if not ni then break end
+ local text = strsub(s, i, ni-1)
+ if not strfind(text, "^%s*$") then
+ tinsert(top, text)
+ end
+ if empty == "/" then -- empty element tag
+ tinsert(top, {n=0, label=label, args=xml:parseargs(args), empty=1})
+ elseif c == "" then -- start tag
+ top = {n=0, label=label, args=xml:parseargs(args)}
+ tinsert(stack, top) -- new level
+ else -- end tag
+ local toclose = tremove(stack) -- remove top
+ top = stack[stack.n]
+ if stack.n < 1 then
+ error("nothing to close with "..label)
+ end
+ if toclose.label ~= label then
+ error("trying to close "..toclose.label.." with "..label)
+ end
+ tinsert(top, toclose)
+ end
+ i = j+1
+ end
+ local text = strsub(s, i)
+ if not strfind(text, "^%s*$") then
+ tinsert(stack[stack.n], text)
+ end
+ if stack.n > 1 then
+ error("unclosed "..stack[stack.n].label)
+ end
+ return stack[1]
+end
+
+-- Viewport coordinates
+xml.write_out_y = 0
+xml.write_out_x = 0
+xml.write_out_h = 24
+xml.write_out_w = 80
+
+-- Offsets
+xml.write_off_y = 0
+xml.write_off_x = 0
+
+-- Current position
+xml.write_y = 0
+xml.write_x = 0
+
+xml.write_screen = function(color, s)
+ local i
+ for i = 1, strlen(s) do
+ local c = strsub(s, i, i + 1)
+ if c ~= "\n" then
+ if xml.write_y - xml.write_off_y >= 0 and xml.write_y - xml.write_off_y < xml.write_out_h and xml.write_x - xml.write_off_x >= 0 and xml.write_x - xml.write_off_x < xml.write_out_w then
+ Term_putch(xml.write_x - xml.write_off_x + xml.write_out_x, xml.write_y - xml.write_off_y + xml.write_out_y, color, strbyte(c))
+ end
+ xml.write_x = xml.write_x + 1
+ else
+ xml.write_x = 0
+ xml.write_y = xml.write_y + 1
+ end
+ end
+end
+
+xml.write_file = function (color, s)
+ print_hook(s)
+end
+
+xml.write = xml.write_screen
+
+xml.rule2string = {
+ ['name'] = {"Its ", "name", " is"},
+ ['contain'] = {"Its ", "name", " contains"},
+ ['symbol'] = {"Its ", "symbol", " is"},
+ ['inscribed'] = {"Its ", "inscription", " contains"},
+ ['state'] = {"Its ", "state", " is"},
+ ['status'] = {"Its ", "status", " is"},
+ ['tval'] = {"Its ", "tval", " is"},
+ ['race'] = {"Your ", "race", " is"},
+ ['subrace'] = {"Your ", "subrace", " is"},
+ ['class'] = {"Your ", "class", " is"},
+ ['foo1'] = {"The result of ", "test 1 ", "is"},
+ ['foo2'] = {"The result of ", "test 2 ", "is"},
+ ['foo3'] = {"The result of ", "test 3 ", "is"},
+}
+
+xml.display_english = 1
+function xml:display_xml(t, tab)
+ if xml.display_english then
+ xml:english_xml(t, tab)
+ else
+ xml:print_xml(t, tab)
+ end
+end
+
+function xml:english_xml(t, tab, not_flag)
+ local i, k, e
+ local pre, post, recurse
+ local children_not_flag
+ local nextlevel
+ local bcol, ecol = TERM_L_GREEN, TERM_GREEN
+
+ if xml.write_active and t == auto_aux.rule then bcol, ecol = TERM_VIOLET, TERM_VIOLET end
+
+ nextlevel = tab .. " "
+
+ recurse = 1
+
+ if t.label == "rule" then
+ if t.args.type == "inscribe" then
+ xml.write(TERM_WHITE, tab)
+ xml.write(ecol, "A rule named \"")
+ xml.write(TERM_WHITE, tostring(t.args.name))
+ xml.write(ecol, "\" to ")
+ xml.write(bcol, "inscribe")
+ xml.write(ecol, " an item with \"")
+ xml.write(TERM_WHITE, t.args.inscription)
+ xml.write(ecol, "\" when")
+ xml.write(TERM_WHITE, "\n")
+ else
+ xml.write(TERM_WHITE, tab)
+ xml.write(ecol, "A rule named \"")
+ xml.write(TERM_WHITE, tostring(t.args.name))
+ xml.write(ecol, "\" to ")
+ xml.write(bcol, t.args.type)
+ xml.write(ecol, " when")
+ xml.write(TERM_WHITE, "\n")
+ end
+ elseif t.label == "and" then
+ if not_flag then
+ xml.write(TERM_WHITE, tab)
+ xml.write(ecol, "At least one of the following is false:")
+ xml.write(TERM_WHITE, "\n")
+ else
+ xml.write(TERM_WHITE, tab)
+ xml.write(ecol, "All of the following are true:")
+ xml.write(TERM_WHITE, "\n")
+ end
+ elseif t.label == "or" then
+ if not_flag then
+ xml.write(TERM_WHITE, tab)
+ xml.write(ecol, "All of the following are false:")
+ xml.write(TERM_WHITE, "\n")
+ else
+ xml.write(TERM_WHITE, tab)
+ xml.write(ecol, "At least one of the following are true:")
+ xml.write(TERM_WHITE, "\n")
+ end
+ elseif t.label == "not" then
+ if bcol == TERM_VIOLET or getn(t) == 0 then
+ xml.write(ecol, "(a negating rule)")
+ xml.write(TERM_WHITE, "\n")
+ else
+ nextlevel = tab
+ end
+ children_not_flag = not nil
+ elseif t.label == "inventory" then
+ if not_flag then
+ xml.write(TERM_WHITE, tab)
+ xml.write(ecol, "Nothing in your ")
+ xml.write(bcol, "inventory")
+ xml.write(ecol, " matches the following:")
+ xml.write(TERM_WHITE, "\n")
+ else
+ xml.write(TERM_WHITE, tab)
+ xml.write(ecol, "Something in your ")
+ xml.write(bcol, "inventory")
+ xml.write(ecol, " matches the following:")
+ xml.write(TERM_WHITE, "\n")
+ end
+ elseif t.label == "equipment" then
+ if not_flag then
+ xml.write(TERM_WHITE, tab)
+ xml.write(ecol, "Nothing in your ")
+ xml.write(bcol, "equipment")
+ xml.write(ecol, " matches the following:")
+ xml.write(TERM_WHITE, "\n")
+ else
+ xml.write(TERM_WHITE, tab)
+ xml.write(ecol, "Something in your ")
+ xml.write(bcol, "equipment")
+ xml.write(ecol, " matches the following:")
+ xml.write(TERM_WHITE, "\n")
+ end
+ elseif t.label == "comment" then
+ xml.write(TERM_WHITE, tab)
+ xml.write(TERM_WHITE, "(" .. t[1] .. ")")
+ xml.write(TERM_WHITE, "\n")
+ elseif t.label == "skill" then
+ local s = t[1]
+ if not_flag then
+ xml.write(TERM_WHITE, tab)
+ xml.write(ecol, "Your skill in ")
+ xml.write(bcol, s)
+ xml.write(ecol, " is not from ")
+ xml.write(TERM_WHITE, tostring(t.args.min))
+ xml.write(ecol, " to ")
+ xml.write(TERM_WHITE, tostring(t.args.max))
+ xml.write(TERM_WHITE, "\n")
+ else
+ xml.write(TERM_WHITE, tab)
+ xml.write(ecol, "Your skill in ")
+ xml.write(bcol, s)
+ xml.write(ecol, " is from ")
+ xml.write(TERM_WHITE, tostring(t.args.min))
+ xml.write(ecol, " to ")
+ xml.write(TERM_WHITE, tostring(t.args.max))
+ xml.write(TERM_WHITE, "\n")
+ end
+ elseif t.label == "ability" then
+ local s = t[1]
+ if not_flag then
+ xml.write(TERM_WHITE, tab)
+ xml.write(ecol, "You do not have the ")
+ xml.write(bcol, s)
+ xml.write(ecol, " ability")
+ xml.write(TERM_WHITE, "\n")
+ else
+ xml.write(TERM_WHITE, tab)
+ xml.write(ecol, "You have the ")
+ xml.write(bcol, s)
+ xml.write(ecol, " ability")
+ xml.write(TERM_WHITE, "\n")
+ end
+ elseif t.label == "level" then
+ if not_flag then
+ xml.write(TERM_WHITE, tab)
+ xml.write(ecol, "Your ")
+ xml.write(bcol, "level")
+ xml.write(ecol, " is not from ")
+ xml.write(TERM_WHITE, tostring(t.args.min))
+ xml.write(ecol, " to ")
+ xml.write(TERM_WHITE, tostring(t.args.max))
+ xml.write(TERM_WHITE, "\n")
+ else
+ xml.write(TERM_WHITE, tab)
+ xml.write(ecol, "Your ")
+ xml.write(bcol, "level")
+ xml.write(ecol, " is from ")
+ xml.write(TERM_WHITE, tostring(t.args.min))
+ xml.write(ecol, " to ")
+ xml.write(TERM_WHITE, tostring(t.args.max))
+ xml.write(TERM_WHITE, "\n")
+ end
+ elseif t.label == "sval" then
+ if not_flag then
+ xml.write(TERM_WHITE, tab)
+ xml.write(ecol, "Its ")
+ xml.write(bcol, "sval")
+ xml.write(ecol, " is not from ")
+ xml.write(TERM_WHITE, tostring(t.args.min))
+ xml.write(ecol, " to ")
+ xml.write(TERM_WHITE, tostring(t.args.max))
+ xml.write(TERM_WHITE, "\n")
+ else
+ xml.write(TERM_WHITE, tab)
+ xml.write(ecol, "Its ")
+ xml.write(bcol, "sval")
+ xml.write(ecol, " is from ")
+ xml.write(TERM_WHITE, tostring(t.args.min))
+ xml.write(ecol, " to ")
+ xml.write(TERM_WHITE, tostring(t.args.max))
+ xml.write(TERM_WHITE, "\n")
+ end
+ elseif t.label == "discount" then
+ if not_flag then
+ xml.write(TERM_WHITE, tab)
+ xml.write(ecol, "Its ")
+ xml.write(bcol, "discount")
+ xml.write(ecol, " is not from ")
+ xml.write(TERM_WHITE, tostring(t.args.min))
+ xml.write(ecol, " to ")
+ xml.write(TERM_WHITE, tostring(t.args.max))
+ xml.write(TERM_WHITE, "\n")
+ else
+ xml.write(TERM_WHITE, tab)
+ xml.write(ecol, "Its ")
+ xml.write(bcol, "discount")
+ xml.write(ecol, " is from ")
+ xml.write(TERM_WHITE, tostring(t.args.min))
+ xml.write(ecol, " to ")
+ xml.write(TERM_WHITE, tostring(t.args.max))
+ xml.write(TERM_WHITE, "\n")
+ end
+ else
+ if xml.rule2string[t.label] then
+ local rule = xml.rule2string[t.label]
+ a, b, c = rule[1], rule[2], rule[3]
+ if not_flag then c = c .. " not" end
+ xml.write(TERM_WHITE, tab)
+ xml.write(ecol, a)
+ xml.write(bcol, b)
+ xml.write(ecol, c)
+ xml.write(ecol, " \"")
+ xml.write(TERM_WHITE, t[1])
+ xml.write(ecol, "\"")
+ xml.write(TERM_WHITE, "\n")
+ else
+ if not_flag then
+ xml.write(bcol, "Not:\n")
+ tab = tab .. " "
+ xml:print_xml(t, tab)
+ return
+ end
+ end
+ end
+
+ for i = 1, getn(t) do
+ if type(t[i]) == "string" then
+ -- xml.write(TERM_WHITE, t[i].."\n")
+ else
+ xml:english_xml(t[i], nextlevel, children_not_flag)
+ end
+ end
+end
+
+function xml:print_xml(t, tab)
+ local i, k, e
+ local inside = nil
+ local bcol, ecol = TERM_L_GREEN, TERM_GREEN
+
+ if xml.write_active and t == auto_aux.rule then bcol, ecol = TERM_VIOLET, TERM_VIOLET end
+
+ xml.write(bcol, tab.."<"..t.label)
+ for k, e in t.args do
+ xml.write(TERM_L_BLUE, " "..k)
+ xml.write(TERM_WHITE, "=\"")
+ xml.write(TERM_YELLOW, e)
+ xml.write(TERM_WHITE, "\"")
+ end
+ xml.write(bcol, ">")
+
+ for i = 1, getn(t) do
+ if type(t[i]) == "string" then
+ xml.write(TERM_WHITE, t[i])
+ else
+ if not inside then xml.write(TERM_WHITE, "\n") end
+ inside = not nil
+ xml:print_xml(t[i], tab.." ")
+ end
+ end
+
+ if not inside then
+ xml.write(ecol, "</"..t.label..">\n")
+ else
+ xml.write(ecol, tab.."</"..t.label..">\n")
+ end
+end
+
+-- t is a table representing xml, outputs the xml code via xml.write()
+function xml:output(t)
+ local i
+ for i = 1, getn(t) do
+ xml:print_xml(t[i], "")
+ end
+end
diff --git a/lib/mods/theme/data/delete.me b/lib/mods/theme/data/delete.me
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/lib/mods/theme/data/delete.me
diff --git a/lib/mods/theme/dngn/dun1.14 b/lib/mods/theme/dngn/dun1.14
new file mode 100644
index 00000000..6421e80b
--- /dev/null
+++ b/lib/mods/theme/dngn/dun1.14
@@ -0,0 +1,2 @@
+# On this level there is a stairway leading to the Heart of the Earth
+B:10
diff --git a/lib/mods/theme/dngn/dun1.22 b/lib/mods/theme/dngn/dun1.22
new file mode 100644
index 00000000..cbf78046
--- /dev/null
+++ b/lib/mods/theme/dngn/dun1.22
@@ -0,0 +1,2 @@
+# On this level there is a stairway leading to a trail left by a purposeful dwarf
+B:40 \ No newline at end of file
diff --git a/lib/mods/theme/dngn/dun10.0 b/lib/mods/theme/dngn/dun10.0
new file mode 100644
index 00000000..b89ce05e
--- /dev/null
+++ b/lib/mods/theme/dngn/dun10.0
@@ -0,0 +1,3 @@
+# Father branch is Mirkwood(1), on level 14
+A:1
+L:14
diff --git a/lib/mods/theme/dngn/dun11.20 b/lib/mods/theme/dngn/dun11.20
new file mode 100644
index 00000000..9cc611d3
--- /dev/null
+++ b/lib/mods/theme/dngn/dun11.20
@@ -0,0 +1,2 @@
+# On this level there is a stairway leading to the Nether Realm
+B:6
diff --git a/lib/mods/theme/dngn/dun11.22 b/lib/mods/theme/dngn/dun11.22
new file mode 100644
index 00000000..149e2c33
--- /dev/null
+++ b/lib/mods/theme/dngn/dun11.22
@@ -0,0 +1,2 @@
+#I'm downright evil
+F:NO_GENO |
diff --git a/lib/mods/theme/dngn/dun17.15 b/lib/mods/theme/dngn/dun17.15
new file mode 100644
index 00000000..d08bf5e7
--- /dev/null
+++ b/lib/mods/theme/dngn/dun17.15
@@ -0,0 +1,5 @@
+N:Machine
+U:s_factory.map
+D:The clatter of strange machinery surrounds you.
+F:DESC | NO_GENO | NO_NEW_MONSTER | SPECIAL | NO_STAIR
+F:ASK_LEAVE | NO_TELEPORT
diff --git a/lib/mods/theme/dngn/dun18.0 b/lib/mods/theme/dngn/dun18.0
new file mode 100644
index 00000000..da1b6c27
--- /dev/null
+++ b/lib/mods/theme/dngn/dun18.0
@@ -0,0 +1,2 @@
+# The level is SAVED in the playername.mz? file
+#S:mz0
diff --git a/lib/mods/theme/dngn/dun18.1 b/lib/mods/theme/dngn/dun18.1
new file mode 100644
index 00000000..70f27718
--- /dev/null
+++ b/lib/mods/theme/dngn/dun18.1
@@ -0,0 +1,2 @@
+# The level is SAVED in the playername.mz? file
+#S:mz1
diff --git a/lib/mods/theme/dngn/dun19.11 b/lib/mods/theme/dngn/dun19.11
new file mode 100644
index 00000000..7fba690d
--- /dev/null
+++ b/lib/mods/theme/dngn/dun19.11
@@ -0,0 +1,5 @@
+N:Deathwatch
+U:s_death.map
+D:This level looks filled with evilness.
+F:DESC | NO_GENO | NO_NEW_MONSTER | SPECIAL | NO_STAIR
+F:ASK_LEAVE | NO_TELEPORT
diff --git a/lib/mods/theme/dngn/dun2.31 b/lib/mods/theme/dngn/dun2.31
new file mode 100644
index 00000000..dd8669a5
--- /dev/null
+++ b/lib/mods/theme/dngn/dun2.31
@@ -0,0 +1,2 @@
+# On this level there is a stairway leading to the Mount Doom
+B:5
diff --git a/lib/mods/theme/dngn/dun20.1 b/lib/mods/theme/dngn/dun20.1
new file mode 100644
index 00000000..61bc6a65
--- /dev/null
+++ b/lib/mods/theme/dngn/dun20.1
@@ -0,0 +1,5 @@
+U:s_smaug.map
+N:Lower Halls
+D:You can just make out a malevolent red glow at the end of the corridor.
+F:DESC
+F:NO_GENO | NO_NEW_MONSTER | SPECIAL | NO_STAIR | ASK_LEAVE \ No newline at end of file
diff --git a/lib/mods/theme/dngn/dun22.10 b/lib/mods/theme/dngn/dun22.10
new file mode 100644
index 00000000..e7eb116e
--- /dev/null
+++ b/lib/mods/theme/dngn/dun22.10
@@ -0,0 +1,2 @@
+# On this level there is a stairway leading to the Small Water Cave
+B:24
diff --git a/lib/mods/theme/dngn/dun22.20 b/lib/mods/theme/dngn/dun22.20
new file mode 100644
index 00000000..a04a2788
--- /dev/null
+++ b/lib/mods/theme/dngn/dun22.20
@@ -0,0 +1,5 @@
+N:The Bridge
+U:s_bridge.map
+D:You hear the beating of drums in the Deep.
+F:DESC | NO_GENO | NO_NEW_MONSTER | SPECIAL | NO_STAIR
+F:ASK_LEAVE | NO_TELEPORT \ No newline at end of file
diff --git a/lib/mods/theme/dngn/dun22.5 b/lib/mods/theme/dngn/dun22.5
new file mode 100644
index 00000000..11d8e51f
--- /dev/null
+++ b/lib/mods/theme/dngn/dun22.5
@@ -0,0 +1,5 @@
+N:Orc Town
+U:s_orc.map
+D:You hear orc warcries.
+F:DESC | NO_GENO | NO_NEW_MONSTER | SPECIAL | NO_STAIR
+F:ASK_LEAVE | NO_TELEPORT
diff --git a/lib/mods/theme/dngn/dun24.0 b/lib/mods/theme/dngn/dun24.0
new file mode 100644
index 00000000..bbb93f85
--- /dev/null
+++ b/lib/mods/theme/dngn/dun24.0
@@ -0,0 +1,3 @@
+# Father branch is the Moria(22), on level 10
+A:22
+L:10
diff --git a/lib/mods/theme/dngn/dun29.15 b/lib/mods/theme/dngn/dun29.15
new file mode 100644
index 00000000..4df873b5
--- /dev/null
+++ b/lib/mods/theme/dngn/dun29.15
@@ -0,0 +1,6 @@
+N:Galleon
+U:s_ship.map
+D:A ship of antique design lies jammed in the ice here.
+F:DESC | NO_GENO | NO_NEW_MONSTER | SPECIAL | NO_STAIR
+F:ASK_LEAVE | NO_TELEPORT
+
diff --git a/lib/mods/theme/dngn/dun3.18 b/lib/mods/theme/dngn/dun3.18
new file mode 100644
index 00000000..84c0a74a
--- /dev/null
+++ b/lib/mods/theme/dngn/dun3.18
@@ -0,0 +1,5 @@
+N:Dim Gates
+U:s_gates.map
+D:Visions of death fill your mind.
+F:DESC | NO_GENO | NO_NEW_MONSTER | SPECIAL | NO_STAIR
+F:ASK_LEAVE | NO_TELEPORT
diff --git a/lib/mods/theme/dngn/dun3.28 b/lib/mods/theme/dngn/dun3.28
new file mode 100644
index 00000000..0acd4193
--- /dev/null
+++ b/lib/mods/theme/dngn/dun3.28
@@ -0,0 +1,5 @@
+N:Nameless
+U:s_name.map
+D:You sense a powerful artifact here.
+F:DESC | NO_GENO | NO_NEW_MONSTER | SPECIAL | NO_STAIR
+F:ASK_LEAVE | NO_TELEPORT
diff --git a/lib/mods/theme/dngn/dun3.3 b/lib/mods/theme/dngn/dun3.3
new file mode 100644
index 00000000..710ef5f8
--- /dev/null
+++ b/lib/mods/theme/dngn/dun3.3
@@ -0,0 +1,5 @@
+N:Crypt
+U:s_crypt.map
+D:Looks like a forgotten crypt...
+F:DESC | NO_GENO | NO_NEW_MONSTER | SPECIAL | NO_STAIR
+F:ASK_LEAVE | NO_TELEPORT
diff --git a/lib/mods/theme/dngn/dun36.5 b/lib/mods/theme/dngn/dun36.5
new file mode 100644
index 00000000..9fddd4dd
--- /dev/null
+++ b/lib/mods/theme/dngn/dun36.5
@@ -0,0 +1,5 @@
+N:Orthanc
+U:s_orthanc.map
+D:#BAnd here you shall stay, foolish adventurer, and die quickly. For I am Saruman the Wise, Saruman the Ring-maker, Saruman of Many Colours!#w
+F:DESC | NO_GENO | NO_NEW_MONSTER | SPECIAL | NO_STAIR
+F:ASK_LEAVE | NO_TELEPORT \ No newline at end of file
diff --git a/lib/mods/theme/dngn/dun39.0 b/lib/mods/theme/dngn/dun39.0
new file mode 100644
index 00000000..57fa485e
--- /dev/null
+++ b/lib/mods/theme/dngn/dun39.0
@@ -0,0 +1,9 @@
+# Father branch is Barrow-Downs(4), on level 10
+A:4
+L:9
+
+N:Bilbo's trail
+U:s_bilbo.map
+D:#yYou hear someone shout, "I am in a frightful hurry, but Gandalf told me to leave this map for you! Find it, then seek Thorin in Mirkwood!"#w
+F:DESC | NO_GENO | NO_NEW_MONSTER | SPECIAL | NO_STAIR
+F:ASK_LEAVE | NO_TELEPORT \ No newline at end of file
diff --git a/lib/mods/theme/dngn/dun4.9 b/lib/mods/theme/dngn/dun4.9
new file mode 100644
index 00000000..e09273d6
--- /dev/null
+++ b/lib/mods/theme/dngn/dun4.9
@@ -0,0 +1,2 @@
+# On this level there is a stairway leading to a trail left by a fleeing hobbit
+B:39 \ No newline at end of file
diff --git a/lib/mods/theme/dngn/dun40.0 b/lib/mods/theme/dngn/dun40.0
new file mode 100644
index 00000000..0cd769c4
--- /dev/null
+++ b/lib/mods/theme/dngn/dun40.0
@@ -0,0 +1,9 @@
+# Father branch is Mirkwood(1), on level 33
+A:1
+L:22
+
+N:Thorin's trail
+U:s_thorin.map
+D:#yYou hear someone shout, "My mad kinsmen have taken the key to the Lonely Mountain! Get the key, then find that fool hobbit and my map! If you haven't already."#w
+F:DESC | NO_GENO | NO_NEW_MONSTER | SPECIAL | NO_STAIR
+F:ASK_LEAVE | NO_TELEPORT \ No newline at end of file
diff --git a/lib/mods/theme/dngn/dun5.0 b/lib/mods/theme/dngn/dun5.0
new file mode 100644
index 00000000..48a7bea6
--- /dev/null
+++ b/lib/mods/theme/dngn/dun5.0
@@ -0,0 +1,3 @@
+# Father branch is the Mordor, on level 32
+A:2
+L:31
diff --git a/lib/mods/theme/dngn/dun5.14 b/lib/mods/theme/dngn/dun5.14
new file mode 100644
index 00000000..3d7a3080
--- /dev/null
+++ b/lib/mods/theme/dngn/dun5.14
@@ -0,0 +1,14 @@
+# The level is SAVED in the playername.mdm file
+S:mdm
+
+# Use the map in s_doom.map file
+U:s_doom.map
+
+# Use Mt Doom as level name
+N:Mt Doom
+
+D:You finally reach the top of Mount Doom, here must lie the Great Fire.
+F:DESC
+F:NO_GENO | NO_NEW_MONSTER | SPECIAL | NO_STAIR
+F:NO_TELEPORT
+
diff --git a/lib/mods/theme/dngn/dun6.0 b/lib/mods/theme/dngn/dun6.0
new file mode 100644
index 00000000..c750ea67
--- /dev/null
+++ b/lib/mods/theme/dngn/dun6.0
@@ -0,0 +1,3 @@
+# Father branch is Void(11), on level 20
+A:11
+L:20
diff --git a/lib/mods/theme/edit/a_info.txt b/lib/mods/theme/edit/a_info.txt
new file mode 100644
index 00000000..e2a312c5
--- /dev/null
+++ b/lib/mods/theme/edit/a_info.txt
@@ -0,0 +1,3359 @@
+# File: a_info.txt
+
+
+# This file is used to initialize the "lib/raw/a_info.raw" file, which is
+# used to initialize the "artifact" information for the Angband game.
+
+# 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/a_info.raw" file.
+
+
+# The artifact indexes are defined in "defines.h", and must not be changed.
+
+# Artifacts 1-15 are "special", 16-63 are "armor", and 64-127 are "weapons".
+
+# Hack -- "Grond" and "Morgoth" MUST have a rarity of one, or they might
+# not be dropped when Morgoth is killed. Note that they, like the "special"
+# artifacts, are never created "accidentally".
+
+# Artifacts now have descriptions. Special thanks to J.R.R Tolkien,
+# without whom the words would be unwritten, the images unconceived,
+# the deed undone.
+# -Leon Marrick
+# Contributors: Jeff Butler, Neal Hackler, Ethan Sicotte, Pat Tracy, Divia
+# The 'Theme' module for ToME introduces many changes into this file; please
+# refer to changes.txt in the module root folder for details.
+
+# Version stamp (required)
+
+V:2.0.0
+
+
+
+# The Phial of Galadriel
+
+N:1:of Galadriel
+I:39:100:4
+W:20:10:10:10000
+P:0:1d1:0:0:0
+F:ACTIVATE | SEARCH | LITE3 | LUCK
+F:INSTA_ART | HIDE_TYPE
+a:HARDCORE=LIGHT
+D:A small crystal phial, with the light of Earendil's Star contained inside.
+D:Its light is imperishable, and near it darkness cannot endure.
+
+
+# The Star of Elendil
+
+N:2:of Elendil
+I:39:101:1
+W:30:25:5:32500
+P:0:1d1:0:0:0
+F:ACTIVATE | SEE_INVIS | HOLD_LIFE |
+F:INSTA_ART | SPEED | LITE3 | LITE1 | HIDE_TYPE
+a:HARDCORE=MAP_LIGHT
+Z:detect curses
+D:The shining Star of the West, a famed heirloom of Elendil's house.
+D:A white diamond set as a star in a silver fillet to be bound at the
+D:forehead.
+
+# The Arkenstone of Thrain
+# Was +2 WIS/DEX
+
+N:3:of Thrain
+I:39:102:3
+W:50:50:5:50000
+P:0:1d1:0:0:0
+F:ACTIVATE | SEE_INVIS | HOLD_LIFE | RES_CHAOS | HIDE_TYPE | LUCK
+F:INSTA_ART | SPEED | RES_LITE | RES_DARK | ESP_ORC | LITE3 | SPECIAL_GENE
+a:HARDCORE=THRAIN
+D:A great globe seemingly filled with moonlight, the famed Heart of the
+D:Mountain, which splinters the light that falls upon it into a thousand
+D:glowing shards.
+
+# The Amulet of Annatar (replaces Carlammas in Theme)
+
+N:4:of Annatar
+I:40:10:10
+W:70:30:3:90000
+F:HIDE_TYPE | MANA | LIFE | SPELL | DRAIN_EXP | AGGRAVATE
+F:INSTA_ART
+D:This fiery golden circle once belonged to one who was known to the elves
+D:of Eregion as 'The Lord of Gifts'. Treacherous were his gifts, as was his
+D:teaching. Sauron the Sorcerer lurked behind the guise and his gifts, like
+D:this necklace, were not without cost.
+
+# The Amulet of Ingwe
+
+N:5:of Ingwe
+I:40:11:3
+W:65:30:3:90000
+F:INT | WIS | CHR | SEARCH | INFRA | HIDE_TYPE |
+F:SEE_INVIS | FREE_ACT | ACTIVATE |
+F:RES_ACID | RES_COLD | RES_ELEC |
+F:INSTA_ART
+a:HARDCORE=DISP_EVIL
+D:The ancient heirloom of Ingwe, high lord of the Vanyar, against whom nothing
+D:of evil could stand.
+
+
+# The Necklace 'Nauglamir'
+# Inherits Flare's old activation, since Flare is gone in Theme.
+
+N:6:'Nauglamir'
+I:40:12:3
+W:70:50:3:75000
+F:STR | CON | DEX | INFRA | HIDE_TYPE | RES_FEAR |
+F:SEE_INVIS | FREE_ACT | REGEN | LITE3 | SPEED |
+F:INSTA_ART | SPECIAL_GENE
+a:HARDCORE=DIM_DOOR
+D:A carencet of gold, set with a multitude of shining gems of
+D:Valinor. Despite its size, its weight seems as that of gossamer.
+
+# The Shadow Blade 'Ancanaur' - adapted from Annals of Ea
+
+
+N:7:'Ancanaur'
+I:23:32:3
+W:80:120:45:5000000
+P:0:12d12:10:10:0
+F:CHR | CON | DEX | DRAIN_EXP | FREE_ACT | HEAVY_CURSE | HIDE_TYPE | HOLD_LIFE | IM_FIRE | INT | KILL_DEMON | LEVELS | LITE1 | REGEN | RES_DARK | RES_FEAR | RES_NETHER | RES_NEXUS | SEE_INVIS | SHOW_MODS | SLAY_EVIL | SLAY_UNDEAD | SPEED | STR | WIS
+Z:mind blast
+D:"The Jaws of Fire", this is the sword that Feanor forged in secret
+D:to do battle against his enemies. The sword which threatened Fingolfin,
+D:the sword which in the end did not prevent its owner's untimely death.
+
+# The Ring of Barahir
+
+N:8:of Barahir
+I:45:32:1
+W:50:25:2:75000
+F:STR | INT | WIS | DEX | CON | CHR | STEALTH | HIDE_TYPE |
+F:RES_POIS | RES_DARK | ACTIVATE | SEE_INVIS | SEARCH |
+F:INSTA_ART
+a:HARDCORE=BARAHIR
+D:A ring shaped into twinned serpents with eyes of emerald meeting beneath
+D:a crown of flowers, an ancient treasure of Isildur's house.
+
+# The Slaughter Axe 'Dramborleg' - Tuor's axe
+# Replaces the Ring of Tulkas in Theme
+# Inherits the activation.
+
+N:9:'Dramborleg'
+I:24:30:5
+W:90:60:300:500000
+P:0:5d7:18:25:0
+F:CRIT | HIDE_TYPE | KILL_DEMON | SHOW_MODS | VORPAL | WOUNDING | ACTIVATE
+a:HARDCORE=TULKAS
+D:The great axe of Tuor, Thudder-Sharp is its name. The axe that smote
+D:both a heavy dint as of a club and cleft as a sword. When it was swung
+D:by the hands of Tuor, it sang like the rush of eagle's wings in the
+D:air and took death as it fell. Its name alone instills fear in Balrogs
+D:and other corruptions of Morgoth.
+
+# The Ring of Power 'Narya'
+
+N:10:of Power 'Narya'
+I:45:34:1
+W:70:30:2:100000
+P:0:1d1:6:6:0
+F:STR | INT | WIS | DEX | CON | CHR | SPEED | HIDE_TYPE | LUCK
+F:ACTIVATE | FREE_ACT | SEE_INVIS |
+F:SUST_STR | SUST_CON | SUST_WIS | SUST_CHR | SPECIAL_GENE |
+F:IM_FIRE | RES_NETHER | RES_FEAR | REGEN |
+F:INSTA_ART
+a:HARDCORE=NARYA
+D:The Ring of Fire, set with a ruby that glows like flame. Narya is one
+D:of the three Rings of Power created by the Elves and hidden by them from
+D:Sauron.
+
+
+# The Ring of Power 'Nenya'
+
+N:11:of Power 'Nenya'
+I:45:35:2
+W:80:40:2:200000
+P:0:1d1:9:9:0
+F:STR | INT | WIS | DEX | CON | CHR | SPEED | HIDE_TYPE | LUCK
+F:ACTIVATE | HOLD_LIFE | FREE_ACT | SEE_INVIS |
+F:SUST_INT | SUST_WIS | SUST_CHR |
+F:IM_COLD | RES_BLIND | STEALTH | ESP_ALL |
+F:INSTA_ART
+a:HARDCORE=NENYA
+D:The Ring of Adamant, with a pure white stone as centrepiece. Nenya is one
+D:of the three Rings of Power created by the Elves and hidden by them from
+D:Sauron.
+
+
+# The Ring of Power 'Vilya'
+
+N:12:of Power 'Vilya'
+I:45:36:3
+W:90:50:2:300000
+P:0:1d1:12:12:0
+F:STR | INT | WIS | DEX | CON | CHR | SPEED | HIDE_TYPE | LUCK
+F:ACTIVATE | HOLD_LIFE | FREE_ACT | SEE_INVIS |
+F:FEATHER | SLOW_DIGEST | REGEN |
+F:SUST_STR | SUST_DEX | SUST_CON |
+F:IM_ELEC | RES_POIS | RES_DISEN |
+F:INSTA_ART
+a:HARDCORE=VILYA
+D:The Ring of Sapphire, with clear blue gems that shine like stars,
+D:glittering untouchable despite all that Sauron ever wrought. Vilya is
+D:one of the three Rings of Power created by the Elves and hidden by them
+D:from Sauron.
+
+
+# The Ring of Power 'The One Ring'
+
+N:13:of Power 'The One Ring'
+I:45:37:5
+W:100:100:2:5000000
+P:0:1d1:15:15:0
+F:STR | INT | WIS | DEX | CON | CHR | SPEED | HIDE_TYPE |
+F:ACTIVATE | AUTO_CURSE | HEAVY_CURSE | INVIS | SPELL | MANA |
+F:SEE_INVIS | REGEN | FREE_ACT | CURSED | CURSE_NO_DROP |
+F:IM_FIRE | IM_COLD | IM_ELEC | IM_ACID | PERMA_CURSE |
+F:SUST_STR | SUST_DEX | SUST_CON |
+F:SUST_INT | SUST_WIS | SUST_CHR |
+F:RES_BLIND | RES_POIS | RES_DISEN | RES_NETHER | ESP_ALL |
+F:DRAIN_MANA | DRAIN_HP | DRAIN_EXP |
+F:INSTA_ART
+a:HARDCORE=POWER
+Z:change the world
+D:"Ash nazg durbatuluk, ash nazg gimbatul, ash nazg thrakatuluk agh
+D:burzum-ishi krimpatul". Unadorned, made of massive gold,
+D:set with runes in the foul speech of Mordor, with power so great that it
+D:inevitably twists and masters any earthly being who wears it.
+
+
+# The Anchor of Space-Time
+
+N:14:of Space-Time
+I:39:105:0
+W:30:12:15:50000
+P:0:1d1:0:0:0
+F:INSTA_ART | LITE1
+D:A powerful stone that provides a strong light for any who
+D:wields it. It is rumoured that it may even protect the wearer from
+D:the passing of time.
+
+
+# The Key of Orthanc - replaces Stone of Lore
+# This artifact has a low artifact level to prevent it being worthless for
+# chars with poor magic skills.
+
+N:15:of Orthanc
+I:39:106:0
+W:15:12:15:20000
+P:0:1d1:0:0:0
+F:ACTIVATE | SPECIAL_GENE | EASY_USE | LITE1 |
+F:INSTA_ART
+a:HARDCORE=STONE_LORE
+D:The key to the tower of Saruman, which fills your mind
+D:with images of knowledge and dreadful understanding. It
+D:is not a regular key - it is a perfectly round stone
+D:that is meant to fit into a hole. It can be used to
+D:light your way in the dungeon as well.
+
+# The Multi-Hued Dragon Scale Mail 'Lothronfaun'
+
+N:16:'Lothronfaun'
+I:38:6:0
+W:90:9:500:400000
+P:30:2d4:-4:0:25
+F:FREE_ACT | IM_ELEC | SPECIAL_GENE |
+F:RES_FIRE | RES_COLD | RES_POIS | RES_LITE | RES_DARK |
+F:LITE1 | SEE_INVIS | AGGRAVATE | ESP_DRAGON
+F:ACTIVATE
+a:HARDCORE=RAZORBACK
+D:A massive suit of heavy dragon scales deeply saturated with many colours.
+D:It throbs with angry energies. May-cloud it is called, after the
+D:element lightning which courses through it with unusual vigour.
+
+# The Power Dragon Scale Mail of the Sun
+
+N:17:of the Sun
+I:38:30:0
+W:100:16:600:500000
+P:50:2d4:-8:0:35
+F:HOLD_LIFE | REGEN | ESP_DRAGON |
+F:RES_ACID | RES_FIRE | RES_COLD | RES_ELEC | RES_POIS | FEATHER | FLY |
+F:RES_NETHER | RES_NEXUS | RES_CHAOS | RES_LITE | RES_DARK | ULTIMATE |
+F:RES_SHARDS | RES_SOUND | RES_DISEN | RES_BLIND | RES_CONF |
+F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD | SPECIAL_GENE
+F:ACTIVATE
+a:HARDCORE=BLADETURNER
+D:A suit of tilkal, set with scales of every colour, surrounded in a nimbus
+D:of perfectly untramelled yet inextricably intermingled and utterly mastered
+D:powers elemental and ethereal.
+
+
+# The Spear of Melkor
+
+N:18:of Melkor
+I:22:2:-4
+W:65:45:200:100000
+P:0:4d6:12:24:0
+F:STEALTH | WIS | CURSED | HEAVY_CURSE | TY_CURSE | ESP_GOOD |
+F:DRAIN_MANA | DRAIN_HP |
+F:RES_DARK | RES_BLIND | RES_LITE | RES_NETHER | BRAND_POIS | RES_CONF
+D:The mighty spear used once by Melkor to slay the trees of Valinor.
+
+# The Galvorn Plate Mail of Eol
+
+N:19:of Eol
+I:37:30:2
+W:75:9:420:300000
+P:40:2d4:-4:0:20
+F:CON |
+F:HOLD_LIFE | SUST_CON | ESP_UNDEAD | RES_CONF | RES_FEAR |
+F:RES_ACID | RES_COLD | RES_DARK | RES_NETHER | RES_NEXUS | RES_CHAOS |
+F:ACTIVATE
+a:HARDCORE=CURE_1000
+D:A suit of imperishable galvorn, with unconquerable strength to endure evil
+D:and disruptive magics. It protects the life force of its wearer like
+D:nothing else can. Eol the Dark Elf made it in secret for his son, but
+D:Maeglin left Nan Elmoth with his mother Aredhel and never got to wear it.
+
+# The Full Plate Armour of Isildur
+
+N:20:of Isildur
+I:37:15:1
+W:30:3:300:50000
+P:25:2d4:0:0:25
+F:CON |
+F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD |
+F:RES_SOUND | RES_CONF | RES_NEXUS
+D:A gleaming steel suit covering the wearer from neck to foot, with runes of
+D:warding and stability deeply engraved into its surface.
+
+
+# The Metal Brigandine Armour of the Rohirrim
+
+N:21:of the Rohirrim
+I:37:9:2
+W:30:3:200:30000
+P:19:1d4:0:0:15
+F:STR | DEX | SPEED | HIDE_TYPE | RES_FEAR |
+F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD | RES_CONF | RES_SOUND
+D:A stiff suit of armour composed of small metal plates sewn to an
+D:inner layer of heavy canvas, and covered with a second layer of
+D:cloth. Within it is the spirit of Eorl the Young, matchless in combat.
+
+
+# The Mithril Chain Mail 'Belegennon'
+
+N:22:'Belegennon'
+I:37:20:4
+W:40:10:150:135000
+P:28:1d4:-1:0:20
+F:STEALTH | WIS | INT |
+F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD | RES_POIS |
+F:HOLD_LIFE | RES_DARK | RES_FEAR |
+F:SEE_INVIS |
+F:ACTIVATE
+a:HARDCORE=BELEGENNON
+D:This wondrous suit of fine-linked chain shimmers as though of pure silver.
+D:It stands untouched amidst the fury of the elements, and a power of
+D:concealment rests within.
+
+
+# The Mithril Plate Mail of Celeborn
+
+N:23:of Celeborn
+I:37:25:4
+W:40:3:250:150000
+P:35:2d4:-3:0:25
+F:STR | CHR | HIDE_TYPE | ESP_ORC
+F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD | RES_DARK |
+F:RES_DISEN | ACTIVATE
+a:HARDCORE=GENOCIDE
+D:A shimmering suit of true-silver, forged long ago by dwarven smiths of
+D:legend. It gleams with purest white as you gaze upon it, and mighty are
+D:its powers to protect and banish.
+
+
+# The Chain Mail of Arvedui
+
+N:24:of Arvedui
+I:37:4:2
+W:20:3:220:32000
+P:14:1d4:-2:0:15
+F:STR | CHR | HIDE_TYPE |
+F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD | RES_SHARDS | RES_NEXUS
+D:A hauberk, leggings, and sleeves of interlocking steel rings, well padded
+D:with leather. You feel strong and tall as Arvedui, last king of Arnor,
+D:as you put it on.
+
+
+# The Augmented Chain Mail of Caspanion
+
+N:25:of Caspanion
+I:37:6:3
+W:25:9:270:40000
+P:16:1d4:-2:0:20
+F:INT | WIS | CON | HIDE_TYPE |
+F:RES_ACID | RES_POIS | RES_CONF | ACTIVATE
+a:HARDCORE=DEST_DOOR
+D:A hauberk, leggings, and sleeves of interlocking steel rings, strategically
+D:reinforced at vital locations with a second layer of chain. Magics to
+D:enhance body and mind lie within, and no door can hope to resist the wearer.
+
+
+# The Mithril Helm of Gil-galad
+# Designed with no-infravision warrior-types in mind.
+# Replaces Marda's coat in Theme
+
+N:26:of Gil-galad
+I:32:8:10
+W:50:80:50:20000
+P:6:1d3:0:0:10
+F:ACTIVATE | HIDE_TYPE | INFRA | LITE2 | LITE3 | SEARCH
+a:HARDCORE=SUNLIGHT
+D:The shining helm that Gil-galad, legendary Elven-king, wore in battle.
+
+# The Leather Jerkin of Tom Bombadil
+# Based on a suggestion by Maverick in the forums:
+# Replaces Trone's coat in Theme.
+
+
+N:27:of Tom Bombadil
+I:36:12:1
+W:10:10:70:30000
+P:40:2d4:0:0:0
+F:CHR | CON | DEX | HIDE_TYPE | INT | STR | WIS
+Z:teleport
+D:This garment was once the property of Tom Bombadil -
+D:a strange being rumoured to be older than Arda itself. It
+D:may be the explanation for how Tom could always turn up
+D:when he was most needed.
+
+# The Leather Scale Mail 'Thalkettoth'
+
+N:28:'Thalkettoth'
+I:36:11:3
+W:20:3:60:25000
+P:11:1d1:-1:0:25
+F:DEX | SPEED | HIDE_TYPE | SPECIAL_GENE |
+F:RES_ACID | RES_SHARDS
+D:A tunic and skirt sewn with thick, overlapping scales of hardened
+D:leather whose wearer moves with agility and assurance.
+
+
+# The Pair of Soft Leather Boots of Wormtongue
+
+N:29:of Wormtongue
+I:30:2:3
+W:40:20:20:50000
+P:2:1d1:-10:-10:10
+F:INT | DEX | CHR | STEALTH | SEARCH | SPEED | HIDE_TYPE |
+F:FREE_ACT | FEATHER | RES_DARK | RES_LITE | ESP_GOOD | ESP_UNIQUE
+Z:panic hit
+D:The pair of boots used by Grima son of Galmod, also named the Wormtongue:
+D:a treacherous but persuasive counsellor, ever ready to betray, sneak,
+D:lie, cheat and steal - but never ready to actually fight.
+
+
+# The Small Mithril Shield of Thorin
+
+N:30:of Thorin
+I:34:7:4
+W:30:6:65:60000
+P:5:1d2:0:0:25
+F:STR | CON | HIDE_TYPE |
+F:FREE_ACT | IM_ACID | RES_SOUND |
+F:RES_CHAOS | ESP_ORC
+D:Invoking the strength and endurance of Thorin, King under the Mountain,
+D:this little shield forged of true-silver is proof against the Element
+D:of Earth.
+
+# The Large Leather Shield of Celegorm
+
+N:31:of Celegorm
+I:34:4:0
+W:30:3:60:12000
+P:4:1d2:0:0:20
+F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD | RES_LITE | RES_DARK
+D:This shield emblazoned with a multitude of creatures not seen for ages
+D:once protected Celegorm, lord of Himlad; around it lies a mystic balance
+D:that contains the conflicts of the elements.
+
+
+# The Large Metal Shield of Anarion
+
+N:32:of Anarion
+I:34:5:0
+W:40:9:120:160000
+P:5:1d3:0:0:20
+F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD | SUST_STR | SUST_INT |
+F:SUST_WIS | SUST_DEX | SUST_CON | SUST_CHR | ESP_EVIL
+D:The great metal-bound shield of Anarion, son of Elendil, who Sauron found
+D:himself powerless to wither or diminish.
+
+
+# The Beaked Axe of Hurin
+
+N:33:of Hurin
+I:22:10:3
+W:20:15:180:90000
+P:0:2d6:12:20:0
+F:STR | CON | HIDE_TYPE | BRAND_ACID | RES_ACID | LITE1 | DRAIN_MANA |
+F:SLAY_ORC | KILL_DEMON | SLAY_TROLL | ACTIVATE | SHOW_MODS
+F:MUST2H
+f:MUST2H
+a:HARDCORE=HURIN
+D:Wielded by Hurin Thalion in the Fifth Battle of Beleriand, this
+D:troll-bane smoked in the black blood of Gothmog's guards.
+
+
+# The Massive Iron Crown of Morgoth
+
+N:34:of Morgoth
+I:33:50:125
+W:100:1:20:10000000
+P:0:1d1:0:0:0
+F:STR | INT | WIS | DEX | CON | CHR | INFRA | HIDE_TYPE |
+F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD | RES_POIS |
+F:RES_LITE | RES_DARK | RES_CONF | RES_NEXUS | RES_NETHER |
+F:LITE1 | SEE_INVIS | ESP_ALL |
+F:CURSED | HEAVY_CURSE | PERMA_CURSE |
+F:INSTA_ART | SPECIAL_GENE
+D:Two Silmarils of Feanor blaze from the thunderous crown of twisted
+D:iron. The corrupted metal feels at once as infernal as hellfire
+D:and as chilling as the Outer Darkness. One protrusion from the
+D:crown is abruptly ended where a third jewel might have shone.
+
+
+# The Iron Crown of Beruthiel
+
+N:35:of Beruthiel
+I:33:10:-5
+W:40:12:20:0
+P:0:1d1:0:0:20
+F:STR | DEX | CON | HIDE_TYPE |
+F:FREE_ACT | SEE_INVIS | ESP_ANIMAL | ESP_EVIL | ESP_NONLIVING | ESP_ALL |
+F:CURSED | AUTO_CURSE
+D:The midnight-hued steel circlet of the sorceress-queen Beruthiel, which
+D:grants extraordinary powers of sight and awareness at a terrible physical
+D:cost.
+
+
+# The Hard Leather Cap of Thranduil
+
+N:36:of Thranduil
+I:32:2:2
+W:20:2:15:50000
+P:2:0d0:0:0:10
+F:INT | WIS | HIDE_TYPE |
+F:RES_BLIND | ESP_ORC | ESP_EVIL | ESP_TROLL
+D:The hunting cap of King Thranduil, to whose ears come all the secrets of
+D:his forest domain.
+
+
+# The Metal Cap of Thengel
+
+N:37:of Thengel
+I:32:3:3
+W:10:2:20:22000
+P:3:1d1:0:0:12
+F:WIS | CHR | RES_CONF | HIDE_TYPE | LUCK
+D:A ridged helmet made of steel, and embossed with scenes of valour in fine-
+D:engraved silver. It grants the wearer nobility, clarity of thought and
+D:understanding.
+
+
+# The Steel Helm of Hammerhand
+
+N:38:of Hammerhand
+I:32:6:3
+W:20:2:60:45000
+P:6:1d3:0:0:20
+F:STR | DEX | CON | HIDE_TYPE | SPECIAL_GENE | RES_FEAR |
+F:SUST_STR | SUST_DEX | SUST_CON |
+F:RES_ACID | RES_NEXUS | RES_COLD | RES_DARK | SLOW_DIGEST |
+Z:berserk
+D:A great helm as steady as the heroes of the Westdike. Mighty were the
+D:blows of Helm, the Hammerhand!
+
+
+# The Dragon Helm of Dor-Lomin
+
+N:39:of Dor-Lomin
+I:32:7:4
+W:40:12:75:300000
+P:8:1d3:0:0:20
+F:STR | DEX | CON | HIDE_TYPE |
+F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD | RES_LITE | RES_BLIND |
+F:LITE1 | SEE_INVIS | ESP_DRAGON | ESP_THUNDERLORD | ACTIVATE
+a:HARDCORE=GORLIM
+D:The legendary dragon helm of Turin Turambar, an object of dread to the
+D:servants of Morgoth.
+
+# The Iron Helm 'Holhenneth'
+
+N:40:'Holhenneth'
+I:32:5:2
+W:20:5:75:100000
+P:5:1d3:0:0:10
+F:INT | WIS | SEARCH | HIDE_TYPE |
+F:RES_BLIND | SEE_INVIS | ACTIVATE
+a:HARDCORE=DETECT_ALL
+D:A famous helm of forged iron granting extraordinary powers of mind and
+D:awareness.
+
+
+# The Iron Helm of Gorlim
+
+N:41:of Gorlim
+I:32:5:-5
+W:20:5:75:0
+P:5:1d3:25:25:10
+F:INT | WIS | SEARCH | HIDE_TYPE | SHOW_MODS |
+F:SEE_INVIS | NO_MAGIC | HEAVY_CURSE | TY_CURSE
+F:RES_DISEN | RES_FEAR | FREE_ACT | RES_ACID | RES_FIRE | RES_POIS |
+F:IM_COLD | ACTIVATE | DRAIN_HP |
+F:TELEPORT | CURSED
+a:HARDCORE=GORLIM
+D:A headpiece, gaudy and barbaric, that betrayed a warrior when he most
+D:needed succor.
+
+
+# The Golden Crown of Gondor
+
+N:42:of Gondor
+I:33:11:3
+W:40:40:30:125000
+P:0:1d1:0:0:15
+F:STR | WIS | CON | HIDE_TYPE | SPEED | RES_CONF | RES_SOUND |
+F:RES_COLD | RES_FIRE | RES_LITE | RES_BLIND | RES_ELEC | RES_CHAOS |
+F:LITE1 | SEE_INVIS | REGEN | ACTIVATE
+a:HARDCORE=CURE_700
+D:The shining winged circlet brought by Elendil from dying Numenor, emblem of
+D:Gondor through an age of the world.
+
+
+# The Jewel Encrusted Crown of Numenor
+# Stolen from Oangband
+
+N:43:of Numenor
+I:33:12:3
+W:60:30:40:50000
+P:0:1d1:0:0:18
+F:INT | DEX | CHR | SEARCH | SPEED | HIDE_TYPE |
+F:SEE_INVIS | FREE_ACT | RES_DARK | RES_BLIND |
+F:RES_SHARDS | RES_SOUND | RES_LITE | RES_COLD |
+F:LITE1 | ACTIVATE | DRAIN_MANA
+a:HARDCORE=NUMENOR
+D:A crown of massive gold, set with wondrous jewels of thought and warding,
+D:worn by the kings of ancient Numenor. Its wearer may go into battle
+D:always knowing what he faces - unless his own folly blinds him to the
+D:nature and magnitude of the task.
+
+# The Cloak of Valinor
+# Replaces Colluin in Theme
+# *THE* cloak for Barehanders/Mages
+
+N:44:of Valinor
+I:35:1:0
+W:60:90:10:40000
+P:1:0d0:0:0:20
+F:ACTIVATE | IM_ACID | IM_COLD | IM_ELEC | IM_FIRE | RES_POIS
+a:HARDCORE=COLLUIN
+D:A cape worn by a hero from Valinor, a land utterly beyond the strife
+D:of the elements.
+
+# The Cloak 'Holcolleth'
+
+N:45:'Holcolleth'
+I:35:1:2
+W:5:25:10:13000
+P:1:0d0:0:0:4
+F:INT | WIS | SPEED | STEALTH | HIDE_TYPE |
+F:RES_ACID | ACTIVATE
+a:HARDCORE=SLEEP
+D:This elven-grey mantle possesses great powers of tranquility and of
+D:concealment, and grants the wearer the knowledge and understanding of
+D:the Sindar.
+
+
+# The Cloak of Thingol
+
+N:46:of Thingol
+I:35:1:3
+W:10:50:10:35000
+P:1:0d0:0:0:18
+F:DEX | CHR | HIDE_TYPE |
+F:FREE_ACT | RES_ACID | RES_FIRE | RES_COLD | ACTIVATE
+a:HARDCORE=RECHARGE
+D:A sable-hued cloak, with glowing elven-runes to restore magic showing calm
+D:and clear as moonlight on still water.
+
+
+# The Cloak of Thorongil
+
+N:47:of Thorongil
+I:35:1:0
+W:5:10:10:8000
+P:1:0d0:0:0:10
+F:FREE_ACT | RES_ACID | SEE_INVIS | RES_FEAR
+D:A cloak of shimmering green and brown that grants sight beyond sight and
+D:shakes off holding magics, worn by Aragorn son of Arathorn in his youth
+D:as he adventured under the name of Thorongil.
+
+
+# The Cloak 'Colannon'
+
+N:48:'Colannon'
+I:35:1:3
+W:5:20:10:11000
+P:1:0d0:0:0:15
+F:STEALTH | SPEED | RES_NEXUS |
+F:RES_ACID | ACTIVATE
+a:HARDCORE=TELEPORT
+D:A crystal-blue cape of fine silk worn by a silent messenger of
+D:the forces of Law. Somehow, its wearer is always able to escape
+D:trouble.
+
+
+# The Shadow Cloak of Luthien
+
+N:49:of Luthien
+I:35:6:2
+W:40:40:5:55000
+P:6:0d0:0:0:20
+F:INT | WIS | CHR | HIDE_TYPE | SPEED | STEALTH | INVIS | LUCK
+F:RES_ACID | RES_FIRE | RES_COLD | SPECIAL_GENE | ACTIVATE | SPELL_CONTAIN | WIELD_CAST
+a:HARDCORE=REST_LIFE
+D:The opaque midnight folds, inset with a multitude of tiny diamonds, of
+D:this cloak swirl around you and you feel a hint, a fragment of the
+D:knowledge and power to restore that lay in Luthien, the most beautiful
+D:being that ever knew death.
+
+
+# The Shadow Cloak of Tuor
+
+N:50:of Tuor
+I:35:6:4
+W:40:40:5:35000
+P:6:0d0:0:0:12
+F:STEALTH | DEX | HIDE_TYPE | INVIS | WATER_BREATH
+F:FREE_ACT | IM_ACID | SEE_INVIS | CLIMB
+D:From the ruin of Gondolin did Tuor escape, through secret ways and travail,
+D:shielded by his cloak from a multitude of hostile eyes.
+
+
+# The Main Gauche of Azaghal, which wounded Glaurung
+N:51:of Azaghal
+I:23:5:0
+W:15:30:30:40000
+P:0:2d5:12:14:0
+F:KILL_DRAGON | IM_FIRE | ESP_DRAGON | RES_FEAR
+D:The weapon of Azaghal when he wounded Glaurung. It is deadly
+D:when fighting dragons and is said to make the breaths of fire
+D:completely harmless.
+
+
+# The Set of Leather Gloves 'Cambeleg'
+
+N:52:'Cambeleg'
+I:31:1:2
+W:10:6:5:36000
+P:1:0d0:8:8:15
+F:STR | CON | HIDE_TYPE |
+F:FREE_ACT | SHOW_MODS
+D:A hero's handgear that lends great prowess in battle.
+
+
+# The Set of Leather Gloves 'Cammithrim'
+
+N:53:'Cammithrim'
+I:31:1:0
+W:10:3:5:30000
+P:1:0d0:0:0:10
+F:FREE_ACT | RES_LITE | SUST_CON | LITE1 | ACTIVATE
+F:SPECIAL_GENE
+a:HARDCORE=BO_MISS_1
+D:These gloves glow so brightly as to light the way for their owner and cast
+D:magical bolts with great frequency.
+
+# The Set of Gauntlets of Eregion (formerly 'Paurhach')
+
+N:54:of Eregion
+I:31:2:4
+W:10:5:25:33000
+P:2:1d1:0:0:15
+F:RES_FIRE | ACTIVATE |
+F:SUST_STR | STR | REGEN | SPELL_CONTAIN | WIELD_CAST
+a:HARDCORE=BO_FIRE_1
+D:A fiery set of gauntlets that can even shoot fire from the user's
+D:hands. Wrought by Curufin's people, they guard the wearer's
+D:strength and enhance it.
+
+# The Set of Gauntlets of Nargothrond (formerly 'Paurnimmen')
+
+N:55:of Nargothrond
+I:31:2:4
+W:10:5:25:33000
+P:2:1d1:0:0:15
+F:RES_COLD | ACTIVATE |
+F:SUST_CON | CON | REGEN | SPELL_CONTAIN | WIELD_CAST
+a:HARDCORE=BO_COLD_1
+D:A set of handgear so icy as to be able to fire frost bolts. Wrought by
+D:Finrod Felagund himself, it is inscribed with runes that guard and
+D:boost health.
+
+# The Set of Gauntlets of Lorien (formerly 'Pauraegen')
+
+N:56:of Lorien
+I:31:2:4
+W:10:5:25:33000
+P:2:1d1:0:0:15
+F:RES_ELEC | ACTIVATE | FREE_ACT |
+F:SUST_DEX | DEX | SPELL_CONTAIN | WIELD_CAST
+a:HARDCORE=BO_ELEC_1
+D:A set of handgear wrought by the Galadhrim. Sparks surround it, enabling
+D:the wearer to fire bolts of electricity. Ever has lightning improved and
+D:protected agility, and these gauntlets are no exception.
+
+# The Set of Gauntlets of Ossiriand (formerly 'Paurnen')
+
+N:57:of Ossiriand
+I:31:2:4
+W:10:5:25:33000
+P:2:1d1:0:0:15
+F:RES_ACID | ACTIVATE |
+F:SUST_CHR | CHR | SPELL_CONTAIN | WIELD_CAST
+a:HARDCORE=BO_ACID_1
+D:Mighty was the woodcraft of the Laiquendi, for they learned to control the
+D:element of acid to a level theretofore unknown. This set of handgear is so
+D:corrosive that it may fire bolts of acid.
+
+# The Set of Gauntlets 'Camlost'
+
+N:58:'Camlost'
+I:31:2:-3
+W:10:20:25:0
+P:2:1d1:-11:-12:0
+F:STR | DEX | HIDE_TYPE | DRAIN_MANA |
+F:RES_POIS | IM_FIRE | IM_COLD | RES_DISEN | RES_NETHER | FREE_ACT |
+F:AGGRAVATE | SHOW_MODS | HEAVY_CURSE | TY_CURSE | TELEPORT | CURSED
+D:A pair of gauntlets that sap combat ability, named after the empty hand
+D:of Beren that once clasped a Silmaril.
+
+
+# The Set of Cesti of Fingolfin
+
+N:59:of Fingolfin
+I:31:5:4
+W:40:15:40:110000
+P:5:1d1:10:10:20
+F:DEX | HIDE_TYPE | LUCK
+F:FREE_ACT | RES_ACID | ACTIVATE | SHOW_MODS
+a:HARDCORE=BO_MISS_2
+Z:magic missile
+D:The hand-sheathing of Fingolfin, warrior-king of Elves and Men, who gave
+D:Morgoth seven mighty wounds and pain that will last forever.
+
+
+# The Pair of Hard Leather Boots of Feanor
+
+N:60:of Feanor
+I:30:3:15
+W:40:120:40:300000
+P:3:1d1:0:0:20
+F:SPEED | HIDE_TYPE |
+F:RES_NEXUS | ACTIVATE
+a:HARDCORE=SPEED
+D:This wondrous pair of leather boots once sped Feanor, creator of the
+D:Silmarils and the mightiest of the Eldar, along the Grinding Ice and to
+D:Middle-earth at last.
+
+
+# The Pair of Soft Leather Boots 'Dal-i-thalion'
+
+N:61:'Dal-i-thalion'
+I:30:2:5
+W:10:25:20:40000
+P:2:1d1:0:0:15
+F:DEX | HIDE_TYPE | CHR | SUST_CHR |
+F:ACTIVATE | FREE_ACT |
+F:RES_NETHER | RES_CHAOS | RES_CONF | SUST_CON
+a:HARDCORE=CURE_POISON
+D:A pair of high-laced shoes, strong against the powers of corruption and
+D:withering, that grant the wearer extraordinary agility.
+
+
+# The Pair of Metal Shod Boots of Thror
+
+N:62:of Thror
+I:30:6:3
+W:30:25:80:15000
+P:6:1d1:0:0:20
+F:STR | CON | HIDE_TYPE | SPEED | RES_FEAR | CLIMB
+D:Sturdy footwear of leather and steel as enduring as the long-suffering
+D:Dwarven King-in-exile who wore them. Of dwarven make, these boots will
+D:make their wearer completely at home in the mountains.
+
+
+# The Seeker Arrow of Bard
+# This is, of course, from my 'Artifact Ammo' thread and doesn't need much
+# explanation. It's rather nasty and deals 1000 or more damage on a
+# normal hit to a dragon. :) Doesn't put a dent in Sky Drakes and Power
+# Dragons, tho it's still good for helping to take down Smaug, Tiamat and
+# the other dragon uniques.
+# P+ changed name, rarity to 30
+
+N:63:of Bard
+I:17:2:0
+W:55:30:2:50000
+P:0:8d4:20:15:0
+F:SLAY_ANIMAL | SLAY_EVIL | SLAY_UNDEAD | SLAY_DEMON |
+F:SLAY_ORC | SLAY_TROLL | SLAY_GIANT | SLAY_DRAGON | KILL_DRAGON |
+F:BRAND_ACID | BRAND_ELEC | BRAND_FIRE | BRAND_COLD | BRAND_POIS
+D:Deadliest of arrows, imbued with elemental strength, this shaft is
+D:feared especially by the wyrmkin.
+
+
+# The Main Gauche of Maedhros
+
+N:64:of Maedhros
+I:23:5:3
+W:15:30:30:22500
+P:0:2d5:12:15:0
+F:INT | DEX | HIDE_TYPE | SPEED | SPECIAL_GENE
+F:SLAY_TROLL | SLAY_GIANT | FREE_ACT | SEE_INVIS | SHOW_MODS
+D:A short thrusting blade with a large guard worn by Maedhros the Tall,
+D:eldest son of Feanor, and wielded with his left hand after the loss of
+D:his right hand in the pits of Thangorodrim.
+
+# The Broken Dagger 'Angrist'
+
+N:65:'Angrist'
+I:23:1:4
+W:25:80:12:150000
+P:0:2d4:10:15:5
+F:BRAND_ACID | BRAND_POIS | DEX | FREE_ACT | HIDE_TYPE | LUCK | RES_DARK | SEARCH | SEE_INVIS | SHOW_MODS | SLAY_EVIL | SLAY_ORC | SLAY_TROLL | STEALTH | SUST_DEX
+D:The knife Beren Barahir`s son took from Curufin and with which he cut
+D:out a Silmaril from the crown of Morgoth, The blade snapped and broke
+D:when he tried to gain one more and the splint hit Morgoth at his chin.
+D:It was made of Telchar the dwarf from Nogrod and it could cut through
+D:stone. Even broken, it retains power.
+
+# The Dagger of Samwise
+
+N:66:of Samwise
+I:23:4:0
+W:4:100:12:12000
+P:0:1d4:4:6:0
+F:ACTIVATE | BRAND_FIRE | LEVELS | LITE1 | RES_FIRE | SHOW_MODS
+a:HARDCORE=BO_FIRE_1
+D:The blade of Samwise Gamgee, chosen by him from the hoard of the
+D:Barrow-wights. A fiery dagger finely balanced for deadly throws.
+
+# The Dagger of Peregrin
+
+N:67:of Peregrin
+I:23:4:0
+W:3:100:12:11000
+P:0:1d4:4:6:0
+F:ACTIVATE | BRAND_COLD | LEVELS | RES_COLD | SHOW_MODS
+a:HARDCORE=BO_COLD_1
+D:The blade of Peregrin Took, chosen by him from the hoard of the
+D:Barrow-wights. A frosty dagger finely balanced for deadly throws.
+
+# The Dagger of Meriadoc
+
+N:68:of Meriadoc
+I:23:4:0
+W:5:100:12:13000
+P:0:1d4:4:6:0
+F:BRAND_ELEC | RES_ELEC | ACTIVATE | SHOW_MODS | LEVELS
+a:HARDCORE=BO_ELEC_1
+D:The blade of Meriadoc Brandybuck, chosen by him from the hoard of
+D:the Barrow-wights. A dagger covered in sparks and finely balanced
+D:for deadly throws.
+
+# The Dagger of Rilia
+
+N:69:of Rilia
+I:23:4:0
+W:5:40:12:35000
+P:0:2d4:4:3:0
+F:SLAY_ORC | RES_POIS | RES_DISEN | ACTIVATE | SHOW_MODS | BRAND_POIS
+a:HARDCORE=BA_POIS_1
+D:A large stiletto dagger that glistens with odourless poison, to which the
+D:wearer seems oddly immune.
+
+
+# The Dagger 'Belangil'
+
+N:70:'Belangil'
+I:23:4:2
+W:10:40:12:50000
+P:0:2d4:6:9:0
+F:DEX | HIDE_TYPE | SPEED | BLOWS |
+F:BRAND_COLD | RES_COLD |
+F:SEE_INVIS | SLOW_DIGEST | REGEN |
+F:ACTIVATE | SHOW_MODS | BRAND_POIS
+a:HARDCORE=BELANGIL
+D:A frosty dagger surrounded in a nimbus of ice with a hilt of elk horn and
+D:an edge to wound the wind.
+
+
+# The Bastard Sword 'Calris'
+
+N:71:'Calris'
+I:23:21:5
+W:30:15:140:100000
+P:0:5d4:-20:20:0
+F:CON | HIDE_TYPE | DRAIN_HP |
+F:KILL_DRAGON | SLAY_EVIL | SLAY_DEMON | SLAY_TROLL | RES_DISEN |
+F:AGGRAVATE | CURSED | HEAVY_CURSE | SHOW_MODS | ESP_DRAGON | ESP_DEMON |
+F:AUTO_CURSE |
+F:COULD2H
+f:COULD2H
+D:This sword has runes of power incised on its ornate hilt and a single
+D:blood channel that gleams coldly blue as you grasp this mighty weapon of
+D:peril.
+
+
+# The Broad Sword 'Aranruth'
+
+N:72:'Aranruth'
+I:23:16:4
+W:20:45:150:125000
+P:0:3d5:20:12:0
+F:STR | DEX | CON | SUST_CON | SUST_STR
+F:REGEN | FREE_ACT | SEE_INVIS |
+F:RES_CHAOS | RES_NETHER | HOLD_LIFE | RES_FEAR |
+F:RES_COLD |
+F:SLAY_DEMON | SLAY_EVIL | SLAY_DRAGON | SLAY_UNDEAD |
+F:BRAND_COLD |
+F:SLOW_DIGEST | SHOW_MODS | HIDE_TYPE | BLESSED
+D:The beautiful sword of Thingol with a hilt of gold and silver inlay,
+D:glistening icily enough to freeze the hearts of demons. You feel supple
+D:and lightfooted as you hold it.
+
+
+# The Broad Sword 'Glamdring'
+
+N:73:'Glamdring'
+I:23:16:1
+W:20:20:150:40000
+P:0:2d5:10:15:0
+F:SEARCH | HIDE_TYPE | BLESSED | SLAY_DEMON |
+F:SLAY_EVIL | BRAND_FIRE | SLAY_ORC | RES_FIRE | RES_LITE | LITE1 |
+F:SLOW_DIGEST | SHOW_MODS | ESP_ORC | SPECIAL_GENE
+D:This fiery, shining blade earned its sobriquet "Foe-Hammer" from dying orcs
+D:who dared to come near hidden Gondolin. Inscribed upon the guard in Cirth
+D:is the following --
+D:gûd daedheloth, dam an Glamhoth." - "Turgon King of Gondolin wields, has and
+D:holds the sword Glamdring, foe of Morgoth's realm, hammer to the Din-horde."
+
+# The Quarterstaff of Thranduil [Replaces the 'Aeglin' sword in Theme]
+
+N:74:of Thranduil
+I:21:3:0
+W:20:18:150:50000
+P:0:1d9:10:20:0
+F:BRAND_POIS | COULD2H | RES_POIS | SLAY_ANIMAL | HIDE_TYPE | SHOW_MODS | ESP_ANIMAL
+f:COULD2H
+D:The carven oak staff of the King of the Woodland Realm,
+D:this weapon is a fighter's best friend in a forest.
+
+# The Broad Sword 'Orcrist'
+
+N:75:'Orcrist'
+I:23:16:3
+W:20:20:150:40000
+P:0:2d5:10:15:0
+F:SEARCH | ESP_ORC | SLAY_DRAGON | ESP_DRAGON | RES_COLD | HIDE_TYPE |
+F:SLAY_EVIL | BRAND_COLD | SLAY_ORC | RES_COLD | LITE1 | RES_DARK |
+F:SLOW_DIGEST | SHOW_MODS
+D:This coldly gleaming blade is called simply "Biter", by orcs who came to
+D:know its power all too well.
+
+# The Two-Handed Sword 'Anglachel'
+
+N:76:'Anglachel'
+I:23:25:2
+W:30:30:200:100000
+P:0:3d6:13:17:0
+F:STR | HIDE_TYPE | VORPAL | ESP_DRAGON | DRAIN_HP |
+F:RES_FIRE | RES_POIS | BRAND_FIRE | BRAND_POIS |
+F:KILL_DRAGON | SLAY_TROLL | FREE_ACT | SLOW_DIGEST | REGEN | SHOW_MODS |
+F:MUST2H
+f:MUST2H
+D:A giant sword once wielded by mighty Turin, and a great dragonbane which
+D:bathed in Glaurung's blood. Its blade once shone brightly, it can cleave
+D:iron as though it is old wood. Beleg Cuthalion chose this sword from the
+D:armoury of Thingol in Doriath. Turin son of Hurin slew his friend Beleg
+D:with it by accident, and since then the blade is black and dull.
+
+# The Two-Handed Sword 'Zarcuthra'
+
+N:77:'Zarcuthra'
+I:23:25:4
+W:30:180:250:205000
+P:0:4d6:19:21:0
+F:STR | CHR | INFRA | HIDE_TYPE | VORPAL | DRAIN_MANA |
+F:KILL_DRAGON | SLAY_ANIMAL | SLAY_EVIL | BRAND_FIRE |
+F:SLAY_UNDEAD | SLAY_DEMON | SLAY_TROLL | SLAY_GIANT | SLAY_ORC |
+F:RES_FIRE | RES_CHAOS | FREE_ACT | SEE_INVIS | AGGRAVATE | SHOW_MODS |
+F:MUST2H
+f:MUST2H
+D:Dark and deadly runes stand stark against the naked steel of this awesome
+D:weapon, and you feel a stunning power of slaying and rending as you
+D:slowly approach.
+
+
+# The Dark Sword 'Mormegil'
+
+N:78:'Mormegil'
+I:23:33:2
+W:30:15:250:0
+P:0:6d7:0:0:-20
+F:SPEED | IM_FIRE | RES_FIRE | BRAND_FIRE | RES_DISEN | RES_FEAR |
+F:AGGRAVATE | CURSED | HEAVY_CURSE | SHOW_MODS | LEVELS | TY_CURSE |
+F:BLOWS | SLAY_DRAGON | RES_CHAOS | ANTIMAGIC_50 |
+F:DRAIN_MANA | DRAIN_HP | DRAIN_EXP
+D:A foul, twisted sword with blackened spines and knobs, whose very name is a
+D:curse upon the lips of Elves and Men.
+
+
+# The Cutlass 'Gondricam'
+
+N:79:'Gondricam'
+I:23:12:3
+W:20:8:110:28000
+P:0:1d7:10:11:0
+F:DEX | STEALTH | HIDE_TYPE |
+F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD | FEATHER |
+F:SEE_INVIS | REGEN | SHOW_MODS
+D:Famed sea-defender of Lebennin. A short, slightly curved chopping blade
+D:with a perfect edge shining cleanly in the sun, an object of hate to the
+D:men of Umbar who met it in combat.
+
+
+# The Executioner's Sword 'Crisdurian'
+
+N:80:'Crisdurian'
+I:23:28:0
+W:40:15:260:111000
+P:0:4d5:18:19:0
+F:SLAY_DRAGON | SLAY_EVIL | SLAY_UNDEAD | SLAY_TROLL | SLAY_GIANT |
+F:SLAY_ORC | SEE_INVIS | SHOW_MODS | VORPAL | BRAND_POIS | WOUNDING |
+F:MUST2H
+f:MUST2H
+D:A giant's weapon, with a long blade tall and straight thrusting out from a
+D:massive double-pronged hilt. On its blade are written doomspells against
+D:both the living and undead.
+
+# The Long Sword 'Herugrim' - sword of Theoden
+# Replaces 'Aglarang' in Theme
+
+N:81:'Herugrim'
+I:23:17:2
+W:60:40:130:300000
+P:0:3d5:8:9:0
+F:ACTIVATE | ESP_EVIL | FREE_ACT | HIDE_TYPE | INT | RES_CONF | RES_DARK | SHOW_MODS | VORPAL
+a:HARDCORE=CURE_INSANITY
+D:The ancient blade of Theoden, King of the Mark. It was taken from
+D:the king by Grima the Wormtongue, and hidden from him in a dusty
+D:chest. It was once instrumental in restoring the King's wits from
+D:evil bewitchment.
+
+# The Long Sword 'Ringil'
+
+N:82:'Ringil'
+I:23:17:10
+W:20:120:130:300000
+P:0:4d5:22:25:0
+F:SPEED | HIDE_TYPE | RES_FEAR | BLESSED |
+F:SLAY_EVIL | BRAND_COLD | SLAY_UNDEAD | KILL_DEMON | SLAY_TROLL |
+F:FREE_ACT | RES_COLD | RES_LITE | LITE1 | SEE_INVIS | SLOW_DIGEST | REGEN |
+F:ACTIVATE | SHOW_MODS
+a:HARDCORE=BA_COLD_2
+D:The weapon of Fingolfin, High King of the Noldor; it shines like a column
+D:of ice lit by light unquenchable. Morgoth came but unwillingly to meet it
+D:of old; his lame foot will remind him of its might should he meet it again.
+
+
+# The Long Sword 'Anduril'
+
+N:83:'Anduril'
+I:23:17:4
+W:20:40:130:100000
+P:0:3d5:10:15:5
+F:STR | DEX | HIDE_TYPE | RES_FEAR | FREE_ACT | BLESSED | LUCK
+F:SLAY_EVIL | BRAND_FIRE | SLAY_TROLL | SLAY_ORC | FREE_ACT |
+F:RES_FIRE | SUST_DEX | SEE_INVIS | ACTIVATE | SHOW_MODS | LITE1 |
+F:RES_DISEN | SPECIAL_GENE
+a:HARDCORE=BA_FIRE_1
+D:The famed "Flame of the West", the sword that was broken and is forged
+D:again. It glows with the essence of fire, its wearer is mighty in combat,
+D:and no creature of Sauron can withstand it. It will never be stained or
+D:broken even in defeat. Its pommel glows anew with the Quenya words --
+D:"Anar. Nanye Anduril i ne Narsil i macil Elendilo. Lercuvanten i moli
+D:Mordoreo. Isil." - "Sun. I am Anduril who once was Narsil, sword of Elendil.
+D:The slaves of Mordor shall flee from me. Moon."
+
+# The Long Sword 'Anguirel'
+
+N:84:'Anguirel'
+I:23:17:2
+W:20:30:130:40000
+P:0:2d5:8:12:0
+F:STR | CON | SPEED | HIDE_TYPE |
+F:SLAY_EVIL | BRAND_ELEC | SLAY_DEMON | FREE_ACT | RES_ELEC |
+F:RES_LITE | RES_DARK | SEE_INVIS | SHOW_MODS | VORPAL | WOUNDING |
+F:AGGRAVATE | CURSED
+D:Forged of black galvorn by the Dark-Elven smith Eol, this blade has the
+D:living lightning trapped inside.
+
+
+# The Long Sword 'Elvagil'
+
+N:85:'Elvagil'
+I:23:17:2
+W:20:8:130:20000
+P:0:2d5:5:7:0
+F:DEX | CHR | STEALTH | HIDE_TYPE | ESP_ORC | ESP_TROLL
+F:SLAY_TROLL | SLAY_ORC | FEATHER | SEE_INVIS | SHOW_MODS
+D:The "Singing Blade", whose wearer can slay Orcs and Trolls in the hidden
+D:and secret places of the earth.
+
+
+# The Rapier 'Forasgil'
+
+N:86:'Forasgil'
+I:23:7:0
+W:15:8:40:15000
+P:0:1d6:12:19:0
+F:SLAY_ANIMAL | BRAND_COLD | RES_COLD | RES_LITE | SHOW_MODS
+D:A slender, tapered blade whose wielder strikes icy blows with deadly
+D:accuracy.
+
+
+# The Sabre 'Careth Asdriag'
+
+N:87:'Careth Asdriag'
+I:23:11:2
+W:15:8:50:25000
+P:0:2d7:6:8:0
+F:DEX | BLOWS | SPEED | CON |
+F:SLAY_DRAGON | SLAY_ANIMAL | SLAY_TROLL | SLAY_GIANT |
+F:SLAY_ORC | SHOW_MODS | ESP_ANIMAL
+D:An heirloom of the Lords of Rhun far to the east, and a name of
+D:dismay to creatures natural and unnatural.
+
+# The Short Sword 'Sting'
+
+N:88:'Sting'
+I:23:10:2
+W:20:205:75:100000
+P:0:1d7:7:8:0
+F:BLOWS | CON | DEX | ESP_ORC | ESP_SPIDER | ESP_UNDEAD | FREE_ACT |
+F:LEVELS | LITE1 | RES_LITE | SEE_INVIS | SHOW_MODS | SLAY_ANIMAL |
+F:SLAY_EVIL | SLAY_ORC | SLAY_UNDEAD | SPEED | STR
+D:The perfect size for Bilbo, and stamped forever by the courage he found
+D:in Mirkwood, this sturdy little blade grants the wearer combat prowess
+D:and survival abilities they did not know they had. The blade is inscribed
+D:with Tengwar writing -- "Sting is my name, I am the spiders' bane."
+
+# The Scimitar 'Haradekket'
+
+N:89:'Haradekket'
+I:23:18:2
+W:20:8:130:111111
+P:0:2d5:9:11:0
+F:INT | WIS | BLOWS |
+F:SLAY_ANIMAL | SLAY_EVIL | SLAY_UNDEAD | SLAY_DRAGON | SLAY_DEMON |
+F:RES_CHAOS | RES_DISEN | RES_NEXUS |
+F:SEE_INVIS | BLESSED |
+F:SHOW_MODS
+D:A damascened scimitar that seems wondrously easy to hold. Famed in song as
+D:the "Sickle of Harad", and a deadly foe to the undead.
+
+
+# The Short Sword 'Gilettar'
+
+N:90:'Gilettar'
+I:23:10:2
+W:20:8:80:35000
+P:0:1d7:3:7:0
+F:BLOWS | HIDE_TYPE |
+F:SLAY_ANIMAL | SLOW_DIGEST | REGEN | SHOW_MODS | SEE_INVIS | RES_DISEN
+D:A stubby blade worn by Beren, whose horn sounded of old in the glades of
+D:Brethil.
+
+# The Blade of Chaos 'Daedheloth'
+
+N:91:'Daedheloth'
+I:23:30:0
+W:70:25:180:250000
+P:0:6d5:18:28:-50
+F:KILL_DRAGON | SLAY_ANIMAL | SLAY_EVIL | BRAND_COLD | SLAY_TROLL |
+F:SLAY_ORC | FREE_ACT | RES_ACID | RES_ELEC | RES_FIRE | RES_COLD |
+F:RES_CHAOS | SEE_INVIS | ESP_EVIL | AGGRAVATE | SHOW_MODS |
+F:CHAOTIC | VORPAL | BRAND_FIRE | BRAND_POIS | SPECIAL_GENE
+D:This weapon of wrath, cursed with a violent anger, dives hungrily
+D:into the flesh of its enemies. It gathers shadows of death into its
+D:owner as they inflict wounds that will never heal.
+
+# The Long Sword 'Sereghathol'
+
+N:92:'Sereghathol'
+I:23:17:2
+W:50:30:150:250000
+P:0:5d5:32:32:0
+F:DEX | FREE_ACT | LEVELS | REGEN | SEE_INVIS | SLAY_EVIL | SLOW_DIGEST | SPEED | STR | VORPAL | WOUNDING
+D:Blood-Sword it is called, after its thirst for the blood of foes.
+
+# The Beaked Axe of Dain Ironfoot
+
+N:93:of Dain Ironfoot
+I:22:10:3
+W:20:15:180:40000
+P:0:2d6:8:10:0
+F:WIS | CON | HIDE_TYPE |
+F:SLAY_DRAGON | ESP_EVIL | ESP_UNDEAD | SLOW_DIGEST | ACTIVATE | SHOW_MODS
+a:HARDCORE=DRAIN_2
+D:The narrow axe head of this weapon, finely balanced by a crow's beak,
+D:would pierce even the armour of Smaug, and its wielder becomes aware of
+D:the minds of their enemies.
+
+
+# The Glaive of Pain
+
+N:94:of Pain
+I:22:13:0
+W:30:155:190:50000
+P:0:9d6:0:30:0
+F:SHOW_MODS | LEVELS | DRAIN_MANA |
+F:COULD2H
+f:COULD2H
+D:The massive chopper that crowns this glaive glows blood-red and black;
+D:fell spells of annihilation swirl and dance as you swing death's myrmidon
+D:down.
+
+
+# The Halberd 'Osondir'
+
+N:95:'Osondir'
+I:22:15:3
+W:20:8:190:22000
+P:0:3d5:6:9:0
+F:CHR | HIDE_TYPE |
+F:BRAND_FIRE | SLAY_UNDEAD | SLAY_GIANT | RES_FIRE | RES_SOUND |
+F:FEATHER | SEE_INVIS | SHOW_MODS | ESP_GIANT |
+F:COULD2H
+f:COULD2H
+D:Lordly and tall did Osondir stand against the wrath of giants, and
+D:clear-eyed in barrows fell, wielding a halberd glowing ruby red.
+
+
+# The Pike 'Til-i-arc'
+
+N:96:'Til-i-arc'
+I:22:8:2
+W:20:15:160:32000
+P:0:2d5:10:12:10
+F:INT | HIDE_TYPE |
+F:BRAND_COLD | BRAND_FIRE | SLAY_DEMON | SLAY_TROLL | SLAY_GIANT | ESP_GIANT
+F:RES_FIRE | RES_COLD | SUST_INT | SLOW_DIGEST | SHOW_MODS |
+F:COULD2H
+f:COULD2H
+D:Within this long thrusting spear lie the spirits of frost giants and fire
+D:demons, who war forever, trapped by magely spells.
+
+# The Spear 'Aiglos'
+
+N:97:'Aiglos'
+I:22:2:4
+W:15:45:50:180000
+P:0:3d6:15:25:5
+F:DEX | WIS | HIDE_TYPE |
+F:BRAND_COLD | BRAND_ELEC | LITE1 |
+F:SLAY_TROLL | SLAY_ORC | SLAY_GIANT | KILL_UNDEAD |
+F:FREE_ACT | RES_COLD | RES_ELEC | RES_LITE |
+F:SLOW_DIGEST | ACTIVATE | BLESSED | SHOW_MODS
+a:HARDCORE=BA_ELEC_2
+D:The mighty spear of Gil-galad, famed as "Snow-point" in the songs of
+D:Elves, against which all the foul corruptions of Sauron dashed in vain.
+D:The spear is inscribed with Tengwar runes, reading "Gil-galad ech vae
+D:vaegannen matha, / Aith heleg nin i orch gostatha; / Nin cíniel na
+D:nguruthos / Hon ess nín istatha --
+D:well-made spear, / The Orc will fear my point of ice; / When he sees me,
+D:in fear of death / he will know my name
+
+# The Spear of Caradhras
+
+N:98:of Caradhras
+I:22:2:4
+W:15:45:50:77777
+P:0:4d6:15:15:0
+F:INT | WIS | SPEED | TUNNEL | INFRA | HIDE_TYPE | SEARCH |
+F:BRAND_FIRE |
+F:SLAY_GIANT | SLAY_EVIL | SLAY_DEMON | SLAY_UNDEAD | SLAY_DRAGON |
+F:RES_FIRE | RES_LITE | HOLD_LIFE | RES_FEAR | FEATHER | ESP_GIANT |
+F:SEE_INVIS | ACTIVATE | BLESSED | SHOW_MODS
+a:HARDCORE=STONE_MUD
+D:A magical spear, rumoured to have been forged by Orome himself
+D:in the coldest reach of the cruel Redhorn.
+
+# The Spear 'Nimloth'
+
+N:99:'Nimloth'
+I:22:2:3
+W:15:12:50:30000
+P:0:1d6:11:13:0
+F:STEALTH | RES_DARK | INFRA | SPEED | BLESSED |
+F:BRAND_COLD | SLAY_UNDEAD | RES_COLD | SEE_INVIS | SHOW_MODS
+D:A thin spike of thrice-forged steel caps a straight sylvan shaft cut from
+D:a legendary tree; spells to break the will of the undead and strike cold
+D:fear into the hearts of foes lie on this perfectly balanced spear.
+
+
+# The Lance of Eorlingas
+
+N:100:of Eorlingas
+I:22:20:2
+W:20:23:360:55000
+P:0:3d8:3:21:0
+F:STR | DEX | SPEED | HIDE_TYPE | RES_FEAR |
+F:SLAY_EVIL | SLAY_TROLL | SLAY_ORC | SEE_INVIS | SHOW_MODS |
+F:MUST2H
+f:MUST2H
+D:"Forth Eorlingas!". To the field of Cormallen came Eorl the Young
+D:to save beleaguered Gondor, and from his lance fled massive trolls
+D:and dire wolves.
+
+
+# The Great Axe of Durin
+
+N:101:of Durin
+I:24:25:3
+W:30:90:230:150000
+P:0:4d4:10:20:15
+F:STR | CON | TUNNEL | HIDE_TYPE | ESP_EVIL | RES_FEAR |
+F:SLAY_DRAGON | KILL_DEMON | SLAY_TROLL | SLAY_ORC | FREE_ACT |
+F:RES_ACID | RES_FIRE | RES_LITE | RES_DARK | RES_CHAOS | SHOW_MODS |
+F:BRAND_ACID | BRAND_FIRE |
+F:MUST2H
+f:MUST2H
+D:The twin massive axe heads of this ancient demon's dread gleam with
+D:mithril inlay, which tell sagas of endurance, invoking the powers of
+D:Khazad-dum to protect the wearer and slay all evils found underground.
+
+
+# The Great Axe of Eonwe
+
+N:102:of Eonwe
+I:24:25:2
+W:30:120:230:200000
+P:0:4d4:15:18:8
+F:STR | INT | WIS | DEX | CON | CHR | HIDE_TYPE |
+F:SLAY_EVIL | BRAND_COLD | KILL_DEMON | SLAY_UNDEAD | ESP_NONLIVING
+F:SLAY_ORC | FREE_ACT | IM_COLD | SEE_INVIS | ACTIVATE |
+F:BLESSED | SHOW_MODS
+a:HARDCORE=MASS_GENO
+D:The axe of Eonwe, leader of the Hosts of the West before the gates of
+D:Thangorodrim, strikes with icy wrath at the undead, disperses hosts of
+D:evil at a word, and grants Maia-like powers of body and mind.
+
+
+# The Battle Axe of Balli Stonehand
+
+N:103:of Balli Stonehand
+I:22:22:3
+W:30:15:170:90000
+P:0:3d8:8:11:5
+F:STR | CON | STEALTH | HIDE_TYPE | ESP_NONLIVING
+F:SLAY_DEMON | SLAY_TROLL | SLAY_ORC | FREE_ACT |
+F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD | RES_BLIND | FEATHER |
+F:SEE_INVIS | REGEN | SHOW_MODS |
+F:COULD2H
+f:COULD2H
+D:The twin blades of this weapon were forged in Belegost, and powerful forces
+D:to resist and endure lie ready for he who shall wield it once more.
+
+
+# The Battle Axe 'Lotharang'
+
+N:104:'Lotharang'
+I:22:22:1
+W:30:15:170:21000
+P:0:2d8:4:3:0
+F:STR | DEX | HIDE_TYPE |
+F:SLAY_TROLL | SLAY_ORC | ACTIVATE | SHOW_MODS
+a:HARDCORE=CURE_MW
+D:A superbly crafted double-bladed axe that slays the creatures of earth and
+D:allows rapid recovery from their blows.
+
+
+# The Lochaber Axe 'Mundwine' -> of the Dwarves
+
+N:105:of the Dwarves
+I:22:28:10
+W:30:8:250:80000
+P:0:3d8:12:17:0
+F:SLAY_EVIL | TUNNEL | INFRA | SEARCH | SLAY_GIANT |
+F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD | RES_FEAR |
+F:SHOW_MODS |
+F:COULD2H
+f:COULD2H
+D:A massive axe with twin razor-sharp heads, so large that it usually
+D:requires two hands to wield, intricately engraved in gold with spells
+D:to ward off the elements and smite evil.
+
+# The Broad Axe 'Barukkheled'
+
+N:106:'Barukkheled'
+I:24:11:3
+W:20:8:160:50000
+P:0:2d6:13:19:0
+F:CON | HIDE_TYPE |
+F:SLAY_EVIL | SLAY_TROLL | SLAY_GIANT | SLAY_ORC |
+F:SEE_INVIS | SHOW_MODS |
+F:COULD2H
+f:COULD2H
+D:A royal heirloom of the southern coast, strong in combat against evil
+D:creatures of the earth.
+
+# The Broad Sword 'Guthwine' - sword of Eomer
+# Replaces the Trident of Wrath in Theme
+
+N:107:'Guthwine'
+I:23:16:1
+W:30:10:150:45000
+P:0:2d6:6:7:0
+F:CRIT | ESP_ORC | HIDE_TYPE | LITE1 | RES_BLIND | RES_FEAR |
+F:SHOW_MODS | SLAY_ORC | WOUNDING
+D:The sword of Eomer, son of Eomund, leader of the Riders of the Mark.
+D:As one flashed this sword with Anduril during a battle long ago.
+D:Legendary are its powers in the rallying of desperate troops.
+
+# The Trident of Osse
+
+N:108:of Osse
+I:22:5:4
+W:30:90:70:120000
+P:0:4d8:15:19:0
+F:DEX | HIDE_TYPE |
+F:SLAY_DRAGON | SLAY_ANIMAL | FREE_ACT | HOLD_LIFE | IM_ACID |
+F:RES_NETHER | SEE_INVIS | SLOW_DIGEST | REGEN | ACTIVATE |
+F:BLESSED | SHOW_MODS | WATER_BREATH
+a:HARDCORE=TELE_AWAY
+D:The awesome weapon imbued with some of the power of the Vala Ulmo,
+D:Lord of Waters. It allows the wearer to laugh in scorn at the dread
+D:powers of the undead, and be utterly in command of the element of water.
+
+# The Scythe 'Avavir'
+
+N:109:'Avavir'
+I:22:17:3
+W:40:8:250:18000
+P:0:5d3:8:8:10
+F:DEX | CHR | HIDE_TYPE |
+F:BRAND_COLD | BRAND_FIRE | FREE_ACT | RES_FIRE | RES_COLD |
+F:RES_LITE | SEE_INVIS | ACTIVATE | SHOW_MODS |
+F:COULD2H
+f:COULD2H
+a:HARDCORE=RECALL
+D:With elemental powers whose struggles turn this weapon red and purest
+D:white, this shining reaper bears within it a power of going forth and
+D:returning.
+
+# The Long Sword of Dernhelm - from T-Plus by Ingeborg S. Norden
+# Replaces the Long Sword of the Dawn in Theme
+
+N:110:of Dernhelm
+I:23:17:5
+W:70:50:150:250000
+P:0:3d5:20:25:0
+F:BLESSED | ESP_UNIQUE | FREE_ACT | HIDE_TYPE | HOLD_LIFE | KILL_UNDEAD |
+F:LITE1 | LUCK | RES_DISEN | RES_FEAR | RES_MORGUL | SEE_INVIS |
+F:SHOW_MODS | SLAY_EVIL | SPEED | STEALTH | VORPAL | WOUNDING | SPECIAL_GENE
+D:Eomer's sister Eowyn once wielded this shining sword when she
+D:battled the Witch-King of Angmar, hiding her true identity to
+D:join the battle. Others are less likely to notice the wielder
+D:immediately. Eowyn's sword also allowed her to move swiftly,
+D:sense powerful enemies, inflict terrible wounds, and partly
+D:withstand the worst attacks of the Nazgul.
+
+# The Mighty Hammer 'Grond'
+
+N:111:'Grond'
+I:21:50:2
+W:100:1:1000:500000
+P:0:9d9:25:25:10
+F:KILL_DRAGON | SLAY_ANIMAL | SLAY_EVIL | IMPACT | KILL_UNDEAD | NO_MAGIC |
+F:KILL_DEMON | SLAY_TROLL | SLAY_ORC | RES_ACID | RES_ELEC | RES_FIRE |
+F:RES_COLD | SEE_INVIS | ESP_ALL | AGGRAVATE | SHOW_MODS | INSTA_ART |
+F:LEVELS | ACTIVATE | SPECIAL_GENE |
+F:MUST2H
+f:MUST2H
+a:HARDCORE=GROND
+D:The mighty Hammer of the Underworld, blackened by doomspells of shattering,
+D:whose wielder holds the lives of all Morgoth's servants in his hand.
+
+# The Flail 'Totila'
+
+N:112:'Totila'
+I:21:13:2
+W:20:8:150:55000
+P:0:3d6:6:8:0
+F:STEALTH |
+F:SLAY_EVIL | BRAND_FIRE | RES_FIRE | RES_CONF | ACTIVATE |
+F:SHOW_MODS | LITE1 |
+F:COULD2H
+f:COULD2H
+a:HARDCORE=CONFUSE
+D:A flail whose head befuddles those who stare as you whirl it around, and
+D:becomes a fiery comet as you bring it down.
+
+
+# The Two-Handed Flail 'Thunderfist'
+
+N:113:'Thunderfist'
+I:21:18:4
+W:45:38:300:160000
+P:0:3d6:5:18:0
+F:STR | CON | HIDE_TYPE | RES_FEAR |
+F:SLAY_ANIMAL | BRAND_FIRE | BRAND_ELEC | SLAY_TROLL | SLAY_ORC |
+F:RES_ELEC | RES_FIRE | RES_DARK | SHOW_MODS |
+F:MUST2H
+f:MUST2H
+D:The long-lost weapon of Kzurin, Dwarven champion of ancient Belegost,
+D:with runes of strength in its handle, and flames and sparks that roar and
+D:crackle around its massive head.
+
+# The Morning Star 'Maegnas-in-sereg'
+
+N:114:'Maegnas-in-sereg'
+I:21:12:4
+W:20:30:150:30000
+P:0:2d6:8:22:0
+F:STR | HIDE_TYPE | BRAND_POIS |
+F:SLAY_ANIMAL | SLAY_TROLL | SLAY_ORC | RES_NEXUS | SEE_INVIS |
+F:SHOW_MODS
+D:You feel strong and firm of foot as you whip the chain-suspended spiked orb
+D:around - and bathe it in the blood of your foes.
+
+# The Morning Star 'Naurgil'
+
+N:115:'Naurgil'
+I:21:12:0
+W:20:100:150:35000
+P:0:2d6:5:7:2
+F:BRAND_FIRE | IM_FIRE | ACTIVATE | SHOW_MODS | LITE1
+a:HARDCORE=FIRESTAR
+D:A famed battle-lord of old, with a ruddy head, coloured as embers are that
+D:can yet rise up in wrath.
+
+
+# The Mace 'Taratol'
+
+N:116:'Taratol'
+I:21:5:0
+W:20:15:200:50000
+P:0:3d4:12:12:0
+F:KILL_DRAGON | BRAND_ELEC | IM_ELEC | ACTIVATE | SHOW_MODS |
+F:COULD2H
+f:COULD2H
+a:HARDCORE=SPEED
+D:A great ridged mace that calls around you a nimbus of living lightning;
+D:you remain utterly untouched even as fat sparks arc around your
+D:fingers and eyebrows.
+
+# The War Hammer of Gamil Zirak
+
+N:117:of Gamil Zirak
+I:21:8:4
+W:40:75:120:250000
+P:0:9d3:19:21:5
+F:WIS | TUNNEL | HIDE_TYPE | RES_FEAR |
+F:KILL_DRAGON | SLAY_EVIL | BRAND_ELEC | SLAY_UNDEAD | SLAY_DEMON |
+F:FREE_ACT | RES_ACID | RES_ELEC | RES_FIRE | RES_COLD | RES_NEXUS |
+F:SEE_INVIS | SHOW_MODS |
+F:COULD2H
+f:COULD2H
+D:Gamil Zirak was a great craftsman, the master of Telchar of Nogrod.
+D:This weapon was rescued from Thingol's treasury, and it is rumoured
+D:that its wielder need not fear dragons or other fell beings of the
+D:Dark.
+
+# The Quarterstaff 'Nar-i-vagil'
+
+N:118:'Nar-i-vagil'
+I:21:3:3
+W:20:18:150:70000
+P:0:1d9:10:20:0
+F:INT | HIDE_TYPE |
+F:SLAY_ANIMAL | BRAND_FIRE | RES_FIRE | SHOW_MODS |
+F:COULD2H
+f:COULD2H
+D:Named for a fiery star and set with gems of great worth binding mystic
+D:virtues of protection and thought.
+
+
+# The Quarterstaff 'Eriril'
+
+N:119:'Eriril'
+I:21:3:4
+W:20:18:150:20000
+P:0:1d9:3:5:0
+F:INT | WIS | HIDE_TYPE | ESP_EVIL | SPELL_CONTAIN | WIELD_CAST
+F:SLAY_EVIL | RES_LITE | SEE_INVIS | ACTIVATE | SHOW_MODS
+a:HARDCORE=ID_PLAIN
+D:The radiant golden staff of an Istari of legend, this wizard's companion
+D:grants keen sight and the knowledge of many hidden things.
+
+
+# The Quarterstaff of Olorin
+
+N:120:of Olorin
+I:21:3:4
+W:30:105:150:140000
+P:0:2d9:10:13:0
+F:INT | WIS | CHR | HIDE_TYPE | SEARCH | BRAND_FIRE |
+F:SLAY_EVIL | BRAND_FIRE | SLAY_TROLL | SLAY_ORC | SPELL_CONTAIN | WIELD_CAST
+F:HOLD_LIFE | RES_FIRE | RES_NETHER | SEE_INVIS | ACTIVATE | SHOW_MODS
+a:HARDCORE=DETECT_XTRA
+D:A staff tall and sturdy, with rough-hewn runes that invoke the element of
+D:Earth, and which strikes down all creatures who live in the shadow of
+D:mountains.
+
+# The Mace of Disruption 'Nguruthos'
+
+N:121:'Nguruthos'
+I:21:20:6
+W:80:38:400:444444
+P:0:7d8:18:18:0
+F:STR | TUNNEL | HIDE_TYPE | NO_TELE | DRAIN_MANA |
+F:SLAY_DRAGON | SLAY_ANIMAL | SLAY_EVIL | KILL_UNDEAD | BRAND_FIRE |
+F:IM_FIRE | RES_DARK | RES_CHAOS | RES_DISEN | AGGRAVATE |
+F:SHOW_MODS | BRAND_POIS | VAMPIRIC |
+F:MUST2H
+f:MUST2H
+D:A weapon so massive it seems beyond the strength of mortals, yet you feel
+D:the might of giants within you as you heft it. As you grip the handle
+D:of ebony and steel, coronas of fire blaze and mighty spells to preserve
+D:magic activate around you. It is named 'Fear of Death' - you wield the
+D:Fear of Dragons and the Despair of the Undead.
+
+# The Lucerne Hammer 'Turmil'
+
+N:122:'Turmil'
+I:21:10:4
+W:20:15:120:30000
+P:0:2d5:10:6:8
+F:WIS | INFRA | HIDE_TYPE |
+F:BRAND_COLD | SLAY_ORC | RES_COLD | RES_LITE | REGEN |
+F:ACTIVATE | SHOW_MODS | ESP_ORC | ESP_TROLL | ESP_GIANT |
+F:COULD2H
+f:COULD2H
+a:HARDCORE=TURMIL
+D:Wielded by the High Priest of Meneltarma, this great mace gleams coldly as
+D:though moonlit, and it can strike as mighty a blow spiritually as
+D:physically.
+
+
+# The Whip of Gothmog
+
+N:123:of Gothmog
+I:21:2:-2
+W:20:15:120:100000
+P:0:3d6:15:16:0
+F:INT | DEX | INFRA | HIDE_TYPE | DRAIN_HP | HEAVY_CURSE |
+F:CURSED | AGGRAVATE | BRAND_FIRE | SLAY_ANIMAL | SLAY_DEMON |
+F:RES_FIRE | ESP_SPIDER | VORPAL | RES_LITE | LITE1 | REGEN |
+F:ESP_DEMON | WOUNDING | SHOW_MODS
+D:With this unbearably bright whip of flame, the Balrog Gothmog has become
+D:known for never having lost in combat.
+
+
+# The Long Bow 'Belthronding'
+
+N:124:'Belthronding'
+I:19:13:3
+W:40:20:40:35000
+P:0:0d0:20:22:0
+F:DEX | STEALTH | HIDE_TYPE |
+F:RES_DISEN | XTRA_SHOTS | SHOW_MODS
+D:The great bow of Beleg, made of black yew and strung with elven hair that
+D:faintly shines a pale clear gold.
+
+
+# The Long Bow of Bard
+
+N:125:of Bard
+I:19:13:2
+W:30:20:40:20000
+P:0:0d0:17:19:0
+F:DEX | HIDE_TYPE | ESP_DRAGON | LUCK
+F:FREE_ACT | XTRA_MIGHT | SHOW_MODS
+D:The great yew bow of grim-faced Bard, who shot the mightiest arrow that
+D:songs record.
+
+
+# The Light Crossbow 'Cubragol'
+
+N:126:'Cubragol'
+I:19:23:10
+W:50:25:110:50000
+P:0:0d0:10:14:0
+F:SPEED | HIDE_TYPE |
+F:RES_FIRE | ACTIVATE | SHOW_MODS
+a:HARDCORE=CUBRAGOL
+D:A crossbow that grants fiery speed to he who finds it, and from which
+D:shoot bolts that blaze with flame unquenchable.
+
+# The Mage Staff of Manwe
+# The ULTIMATE "weapon" for a mage
+
+N:127:of Manwe
+I:6:1:12
+W:127:220:20:9000000
+P:0:1d4:-19:-19:0
+F:INT | CHR | WIS | MANA | SPELL | ACTIVATE | LUCK |
+F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD | SPECIAL_GENE |
+F:SEE_INVIS | ESP_EVIL | ESP_DEMON | NEVER_BLOW | INFRA |
+F:PRECOGNITION | IM_FIRE | ULTIMATE | SPELL_CONTAIN | WIELD_CAST |
+F:COULD2H
+f:COULD2H
+a:HARDCORE=GANDALF
+D:A simple, wooden wizard's staff. Unremarkable in all aspects...
+D:except that it pulses with overwhelming power.
+
+# Boomerang Artifacts
+
+# The Metal Boomerang of Beor
+
+N:128:of Beor
+I:15:4:4
+W:20:10:20:40000
+P:0:4d5:8:12:0
+F:DEX | SPEED |
+F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD
+D:Beor's boomerang makes its wielder as agile as the winds,
+D:and as hard to harm.
+
+
+# The Metal Boomerang 'Glimdrir'
+
+N:129:'Glimdrir'
+I:15:4:3
+W:40:20:20:60000
+P:0:5d5:15:16:0
+F:DEX | SPEED | FREE_ACT | BRAND_POIS | SLAY_EVIL | SLAY_UNDEAD | REGEN
+F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD | RES_SOUND | NO_TELE | CURSED
+D:A powerful boomerang that makes one agile and fast, with a thirst for
+D:evil and undead creatures, but demands its wielder not teleport, for fear
+D:of desertion.
+
+
+# The Robe of Incanus [aka Gandalf]
+
+N:130:of Incanus
+I:36:2:3
+W:30:20:20:60000
+P:2:0d0:0:0:20
+F:INT | WIS | SEARCH | HIDE_TYPE | SPELL_CONTAIN | WIELD_CAST
+F:SUST_INT | SUST_WIS | FREE_ACT | SEE_INVIS |
+F:RES_ACID | RES_ELEC | IM_FIRE | RES_COLD
+Z:weigh magic
+D:Gandalf's long, flowing robe. It provides insight and allows the
+D:wearer to see things not seen by all.
+
+
+# The Sling of the Thain
+
+N:131:of the Thain
+I:19:2:4
+W:40:20:40:35000
+P:0:0d0:15:15:0
+F:HIDE_TYPE | DEX | CON
+F:RES_NETHER | XTRA_SHOTS | XTRA_MIGHT | SHOW_MODS
+D:This sling was crafted by Faramir I, Thain of the Shire, just in case
+D:the nasties of his father's stories ever dare to enter the Shire again.
+
+# The Small Metal Shield of Gimli
+
+N:132:of Gimli
+I:34:3:3
+W:40:3:65:80000
+P:3:0d0:9:10:40
+F:INT | CON | RES_FEAR | HIDE_TYPE | IM_FIRE | RES_SHARDS
+Z:find secret passages
+D:A gift from the King of Rohan to Gimli the Dwarf, this shield
+D:combines the cunning and stamina of Gimli Elf-friend, Gimli the
+D:Lock-bearer.
+
+# The Bearded Axe of Gimli
+
+N:133:of Gimli
+I:24:3:2
+W:35:60:35:65000
+P:0:1d6:5:15:0
+F:STR | BLOWS | LEVELS | SLAY_ORC | FREE_ACT | VORPAL |
+F:ESP_UNDEAD | ESP_NONLIVING | COULD2H
+f:COULD2H
+D:"Gimli sensed the Dead behind following, but he continued on
+D:after Aragorn." The trusty axe of Gimli son of Gloin, one of
+D:the Nine Walkers of old.
+
+# The Whip 'Lasher'
+
+N:134:'Lasher'
+I:21:2:3
+W:20:5:30:50000
+P:0:1d6:12:15:0
+F:DEX | BLOWS | HIDE_TYPE |
+F:SLAY_ANIMAL | SLAY_ORC | BRAND_POIS | VORPAL |
+F:RES_POIS | FREE_ACT | ESP_ORC
+D:A powerful whip that is deadly against orcs. It poisons your foes
+D:and is said to go "snicker snack".
+
+# The Harp of Thorin
+
+N:135:of Thorin
+I:14:59:2
+W:50:10:30:40000
+P:0:1d1:0:0:0
+F:ACTIVATE | CHR | INFRA | INSTA_ART | LUCK | STEALTH | SUST_CHR | TUNNEL
+a:HARDCORE=CHARM_OTHERS
+Z:remove fear
+D:This magical instrument once belonged to Thorin Oakenshield,
+D:a mighty dwarf warrior of old. The sounds emanating from it
+D:once gave a frightened hobbit a glimpse of beauty and helped
+D:allay his fears, and to this day the harp preserves its magical
+D:powers to encourage when all seems horribly wrong.
+
+# The Mithril Helm of Thorin
+
+N:136:of Thorin
+I:32:8:3
+W:40:5:20:55000
+P:10:2d4:0:0:0
+F:ACTIVATE | DEX | HIDE_TYPE | HOLD_LIFE | REGEN | RES_FEAR | SUST_CON | SUST_DEX | SUST_STR
+a:HARDCORE=TERROR
+D:Mighty was Thorin Oakenshield as he emerged from the Gate of the
+D:Lonely Mountain on the day of the Battle of the Five Armies, clad
+D:in shining armour, part of which was this helm. He gleamed like
+D:gold in the dying fire of the day, red light leapt from his
+D:eyes, and his foes were terrified at the mere sight of him.
+
+# The Harp of Maglor
+
+N:137:of Maglor
+I:14:59:3
+W:60:10:20:100000
+P:0:3d4:0:0:0
+F:CHR | SPEED | WIS | SEE_INVIS | RES_SOUND | STEALTH | LUCK
+F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD | ESP_UNIQUE
+D:This harp that once belonged to Maglor makes those who use it seem
+D:more forceful and convincing. It is also said that those who have
+D:used it found themselves walking faster, as if to an unheard beat.
+
+
+# The Drum of the Sky
+
+N:138:of the Sky
+I:14:58:2
+W:40:10:15:80000
+P:0:3d4:0:0:0
+F:CHR | SPEED | WIS | SEE_INVIS | RES_SOUND | STEALTH | LUCK
+F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD
+D:The drum is decorated with the images of the stars, the clouds, the
+D:Sun guided by Arien and the Moon with Tilion. It imparts to the
+D:wearer an echo of the beauty of the sky, and protects him from the
+D:elements day or night. The beat of the drum marks the passage of
+D:time, and will make time pass differently for the wearer.
+
+
+# The Harp of Daeron
+
+N:139:of Daeron
+I:14:59:1
+W:20:10:10:50000
+P:0:3d4:0:0:0
+F:CHR | SPEED | WIS | RES_SOUND | STEALTH | LUCK
+F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD
+D:A pretty harp that makes those who play it beautiful, wise and
+D:fast.
+
+
+# The Dwarven Pick of Erebor
+
+N:140:of Erebor
+I:20:6:5
+W:50:15:200:55000
+P:0:3d4:5:0:0
+F:STR | TUNNEL | SUST_STR | HIDE_TYPE | LITE1 | ACTIVATE | CLIMB
+F:RES_CHAOS | RES_LITE | RES_DARK
+a:HARDCORE=EREBOR
+D:A pick that provides a magical light by which to see while tunnelling.
+
+
+# The Drum of the Druedain
+
+N:141:of the Druedain
+I:14:58:4
+W:19:10:15:10000
+P:0:3d4:0:0:0
+F:ACTIVATE | STEALTH | SEARCH | INFRA | RES_POIS | RES_DARK
+a:HARDCORE=DRUEDAIN
+D:The fabled Drum of the Druedain that will protect those who play it
+D:from darkness and poison attacks. It also aids in the seeing of
+D:warm-blooded creatures.
+
+
+# The Horn of Rohan
+
+N:142:of Rohan
+I:14:60:2
+W:14:10:15:80000
+P:0:3d4:0:0:0
+F:ACTIVATE | CHR | WIS | ESP_DRAGON
+a:HARDCORE=ROHAN
+D:A horn carved from the bones of the Dragon of Ered-Mithrin, this
+D:heirloom of the House of Eorl bestows to its user the gifts of
+D:courage and command.
+
+
+# The Horn of Helm
+
+N:143:of Helm
+I:14:60:2
+W:16:10:15:15000
+P:0:3d4:0:0:0
+F:ACTIVATE | STR | CON | IM_COLD | RES_NETHER | RES_FEAR
+a:HARDCORE=HELM
+D:Heedless of cold, fearless of darkness -- besiegers fled at the wind
+D:of the solitary coming of King Helm Hammerhand, proclaimed by a single
+D:horn-blast in the dead of winter.
+
+
+# The Horn of Boromir
+
+N:144:of Boromir
+I:14:60:3
+W:18:10:15:18000
+P:0:3d4:0:0:0
+F:ACTIVATE | STR | CON | RES_FEAR | RES_FIRE | AGGRAVATE
+a:HARDCORE=BOROMIR
+D:The great horn made of the horns of kine of Araw. It is inlaid with silver
+D:and gold signs; when blown, it can be heard for miles over. The horn gives
+D:courage and endurance to its wearer, provided that secrecy is not desired.
+D:"Loud and clear it sounds in the valleys of the hills... and then let all
+D:the foes of Gondor flee!"
+
+# The Lochaber Axe of Gothmog, which slew Fingon
+
+N:145:of Gothmog
+I:22:28:-4
+W:30:8:250:30000
+P:0:3d8:14:19:0
+F:BRAND_FIRE | IM_FIRE | CHR | ACTIVATE | SHOW_MODS | CURSED | TY_CURSE
+a:HARDCORE=AXE_GOTHMOG
+D:The black axe of Gothmog, which struck Fingon at Nirnaeth. Mighty
+D:spells of evil make it unsafe in any hands but those of its original wielder.
+
+
+# The Seeker Arrow of Gondor
+
+N:146:of Gondor
+I:17:2:0
+W:20:5:3:25000
+P:0:10d8:10:20:0
+F:SLAY_EVIL | SLAY_DEMON
+D:An arrow that was created to rid the world of demons.
+
+# The Long Sword of Tulkas
+# The ULTIMATE weapon for a Swordmaster class
+
+N:147:of Tulkas
+I:23:17:10
+W:127:220:130:9000000
+P:0:5d6:21:26:50
+F:LIFE | CON | CHR | LUCK
+F:SUST_STR | SUST_INT | SUST_WIS | SUST_DEX | SUST_CON | SUST_CHR |
+F:BRAND_FIRE | BRAND_COLD | BRAND_ELEC | VORPAL | IM_COLD |
+F:SLAY_EVIL | SLAY_UNDEAD | SLAY_DEMON | SLAY_TROLL | SLAY_DEMON |
+F:FREE_ACT | RES_FIRE | RES_DARK | LITE1 | SEE_INVIS | SLOW_DIGEST | REGEN |
+F:ACTIVATE | SHOW_MODS | BLESSED |
+F:PRECOGNITION | NO_MAGIC | ULTIMATE | SPECIAL_GENE
+a:HARDCORE=ERU
+D:A warm light bathes this translucent blade. The power of the fates are
+D:at the command of its wielder as the weapon passes Supreme Judgment on
+D:the inhabitants of Angband.
+
+
+# The Robe of Great Luck
+
+N:148:of Great Luck
+I:36:2:60
+W:50:120:20:60000
+P:2:0d0:0:0:0
+F:LUCK | HIDE_TYPE |
+F:FREE_ACT | DRAIN_HP | DRAIN_MANA
+D:A powerful wizard once created this robe to grant him incredible luck....
+D:It seems he forgot to wear it.
+
+
+# The Sling of Farmer Maggot
+
+N:149:of Farmer Maggot
+I:19:2:2
+W:10:10:5:20000
+P:0:0d0:20:0:0
+F:INFRA | SEARCH | HIDE_TYPE |
+F:XTRA_SHOTS | SHOW_MODS | ACTIVATE | SPECIAL_GENE
+a:SPELL=Artifact Maggot
+D:This ordinary seeming leather sling has been raised to legendary
+D:status amongst generations of hobbit children. Farmer Maggot's
+D:ability to notice and strike any mushroom thief anywhere within
+D:his patch almost keeps young poachers at bay, but once they get
+D:within range they soon flee for less painful pastures, frequently
+D:with rounded pebbles stinging their backsides...
+
+
+# The Long Sword of Angmar (a.k.a. anti-Ringil)
+# The next time someone wields an unidentified Long Sword (4d5) ...
+
+N:150:of Angmar
+I:23:17:-10
+W:20:40:130:30000
+P:0:4d5:-22:-25:0
+F:SPEED | STR | WIS | CHR | ESP_UNDEAD
+F:BRAND_FIRE | SEE_INVIS | SLOW_DIGEST | FREE_ACT |
+F:VAMPIRIC | NO_TELE | AGGRAVATE | WRAITH | INVIS |
+F:CURSED | HEAVY_CURSE | DG_CURSE | SHOW_MODS | CLONE
+D:Dark flames wreath the naked steel of the Witch-King of Angmar.
+D:A mighty curse to all those who wield it apart from its master,
+D:the torture of the wraithworld awaits those who dare.
+
+
+# The Seeker Bolt of Feanor
+
+N:151:of Feanor
+I:18:2:0
+W:127:220:130:100000
+P:0:5d5:5:6:0
+F:BRAND_COLD | BRAND_FIRE | BRAND_ELEC | BRAND_ACID | BRAND_POIS |
+F:SLAY_DRAGON | SLAY_GIANT | SLAY_TROLL | KILL_UNDEAD | SLAY_ORC |
+F:SLAY_DEMON | SLAY_EVIL | SPECIAL_GENE
+D:Made during the war against Morgoth by Feanor, this powerful
+D:bolt is the bane of Morgoth's power, and has especial strength
+D:against those foes who are already dead.
+
+# The Heavy Crossbow of Orome
+# The ULTIMATE crossbow for a crossbow-master
+
+N:152:of Orome
+I:19:24:5
+W:127:220:130:8000000
+P:0:0d0:36:28:0
+F:CON | DEX | ESP_EVIL | ESP_ORC | ESP_TROLL | FLY | FREE_ACT | IM_ELEC | INFRA | INVIS | LUCK | NO_MAGIC | PRECOGNITION | REFLECT | RES_BLIND | RES_CHAOS | RES_CONF | RES_DISEN | SEE_INVIS | SLOW_DIGEST | SPECIAL_GENE | SPEED | STEALTH | SUST_CHR | SUST_CON | SUST_DEX | SUST_INT | SUST_STR | SUST_WIS | ULTIMATE | XTRA_MIGHT | XTRA_SHOTS
+D:A crossbow handcrafted by Aule for the Huntsman of the Valar during
+D:the first pursuit of Melkor Bauglir.
+
+# The Soft Leather Armour of the Sandworm
+
+N:153:of the Sandworm
+I:36:4:5
+W:30:3:80:65000
+P:30:0d0:0:0:0
+F:RES_POIS | RES_ELEC | RES_FIRE | RES_ACID | SPECIAL_GENE
+F:TUNNEL | STR | STEALTH | INFRA | ESP_ANIMAL
+D:This powerful piece of armour was made using the remains of
+D:the Sandworm Queen.
+
+# The Lochaber Axe 'Lhugdagnir'
+
+N:154:'Lhugdagnir'
+I:22:28:2
+W:70:20:260:33000
+P:0:3d8:20:20:0
+F:BLOWS | KILL_DRAGON | RES_ACID | RES_ELEC | RES_FIRE | RES_COLD |
+F:RES_POIS | SHOW_MODS
+D:Forged by the Dwarves to defend their home of Khazad-dum from dragons,
+D:this axe has been lost to time... until now.
+
+# The Light War Axe 'Cam-tal-crist'
+
+N:155:'Cam-tal-crist'
+I:24:8:4
+W:15:3:140:12000
+P:0:2d5:12:15:0
+F:DEX | VORPAL | HIDE_TYPE | SHOW_MODS | WOUNDING
+D:The Petty-dwarves of Bathak forged this blade, and it shares their thirst
+D:for blood.
+
+
+# The Broad Axe 'Orchast'
+
+N:156:'Orchast'
+I:24:11:4
+W:15:2:170:12000
+P:0:2d7:20:14:0
+F:DEX | SEARCH | SLAY_ORC | ACTIVATE | HIDE_TYPE | SHOW_MODS |
+F:COULD2H
+f:COULD2H
+a:HARDCORE=ORCHAST
+D:Forged by the dwarves of Khazad-dum in a time of desperation,
+D:this axe turned many a battle against the invading orcs.
+
+
+# The Hatchet of the Night
+
+N:157:of the Night
+I:24:1:4
+W:45:20:45:34000
+P:0:2d6:34:22:0
+F:DEX | STEALTH | VAMPIRIC | KILL_UNDEAD | RES_DARK | HIDE_TYPE |
+F:SHOW_MODS | SEE_INVIS | ACTIVATE | DRAIN_EXP
+a:HARDCORE=NIGHT
+D:Found on an unmarked grave after a violent storm, this hatchet
+D:has a sinister aura of darkness and decay.
+
+# The Slaughter Axe 'Lavandagnir'
+
+N:158:'Lavandagnir'
+I:24:30:3
+W:70:20:300:28400
+P:0:5d7:31:27:0
+F:STR | SLAY_ANIMAL | SUST_STR | RES_SHARDS | RES_NEXUS | FEATHER |
+F:HIDE_TYPE | SHOW_MODS | ACTIVATE | DRAIN_HP
+a:HARDCORE=NATUREBANE
+D:Used by the orcs in their battle at Dagor Bragollach against the elves, this
+D:axe has a bloodthirst for nature.
+
+# The Light War Axe of Helcar
+
+N:159:of Helcar
+I:24:8:3
+W:30:25:140:26550
+P:0:2d5:3:15:0
+F:INT | CHR | SUST_DEX | BRAND_COLD | IM_COLD | RES_NEXUS | HIDE_TYPE |
+F:SHOW_MODS
+D:Crafted of purest ice and held solid by powerful spells, this icy axe
+D:delivers a chill of death to its victims.
+
+
+# The Iron Helm of Knowledge
+
+N:160:of Knowledge
+I:32:5:-6
+W:20:5:75:100000
+P:6:1d3:0:0:20
+F:LITE1 | HIDE_TYPE | SPECIAL_GENE | LUCK |
+F:AUTO_ID | ACTIVATE
+a:HARDCORE=KNOWLEDGE
+D:This helm, designed by Petty-Dwarves ages ago to act as the brain of a
+D:long lost project, is made of finest glass. Its light banishes all secrets,
+D:and makes audible whispers from the deceased.
+
+
+### Trapping Kits ###
+
+# The Catapult Trap Set of the Edain
+
+N:161:of the Edain
+I:46:3:3
+W:20:10:40:20000
+P:0:0d0:25:15:30
+F:STEALTH | AUTOMATIC_99 | XTRA_MIGHT | HIDE_TYPE
+D:A trap that can almost never be detected. Its missiles may be mere pebbles,
+D:but fired at an incredibly high velocity to penetrate even the toughest
+D:hide or armour.
+
+# The Device Trap Set of the Noegyth Nibin
+
+N:162:of the Noegyth Nibin
+I:46:6:3
+W:20:20:40:20000
+P:0:0d0:0:0:25
+F:STEALTH | XTRA_SHOTS | TELEPORT_TO | HIDE_TYPE | AUTOMATIC_99
+D:A magical trap, armed with a wand. Unaccountably, its victims keep
+D:on coming back for more...
+
+# The Bolt Trap Set of the Naugrim
+
+N:163:of the Naugrim
+I:46:2:2
+W:20:20:200:20000
+P:0:0d0:17:27:37
+F:STEALTH | XTRA_SHOTS | XTRA_MIGHT | HIDE_TYPE | ONLY_DEMON
+D:A snare set not for animals, or people, but for demons alone, and
+D:enchanted so that whenever the demon sets foot or claw into the
+D:(hidden) pentagram, its hide is immediately pierced by many magical
+D:crossbow bolts.
+
+# The Broken Sword 'Narsil'
+
+N:164:'Narsil'
+I:23:2:2
+W:20:5:30:15000
+P:0:3d2:6:10:0
+F:BLESSED | DEX | HIDE_TYPE | RES_FIRE | SLAY_ORC | SLAY_TROLL | STR
+D:These are the shards of the mighty blade of Isildur, which deprived
+D:the dark lord Sauron of The One Ring of Power. Legend has it that
+D:the sword that was broken shall be reforged. You can barely make out
+D:a Tengwar inscription on the pommel, reading "Narsil essenya, macil
+D:meletya; Telchar carneron Navarotesse." - "Narsil is my name, a mighty
+D:sword; Telchar made me in Nogrod."
+
+# The Chain Mail of Peregrin Took
+# From T-Plus by Ingeborg S. Norden
+
+N:165:of Peregrin Took
+I:37:4:2
+W:20:3:220:32000
+P:14:1d4:3:5:11
+F:ACTIVATE | ESP_TROLL | HIDE_TYPE | LITE1 | REGEN | RES_FEAR | SHOW_MODS | STR | SUST_STR
+a:HARDCORE=GORLIM
+D:This sturdy mail shirt was a gift from the nobility of Gondor to the halfling
+D:Peregrin Took. It enables a warrior to fight more capably and cling to life when
+D:others would be killed. It also reveals enemies (especially trolls) hiding in the
+D:dark, and terrifies anyone who threatens the wearer.
+
+# The Balance Dragon Scale Mail 'Loknare'
+
+N:166:'Loknare'
+I:38:20:0
+W:95:12:500:400000
+P:50:2d4:-8:0:35
+F:FEATHER | FLY | ESP_DRAGON |
+F:RES_NEXUS | RES_CHAOS | AGGRAVATE | REGEN |
+F:RES_SHARDS | RES_SOUND | RES_DISEN | RES_CONF |
+F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD |
+F:ACTIVATE
+a:HARDCORE=MEDIATOR
+D:A mighty suit of dragon armour, set with the scales of dragons of both
+D:Law and Chaos, and with power over both. Loknare means Dragonblaze.
+
+# The Hard Leather Armour of Himring
+
+N:167:of Himring
+I:36:6:0
+W:50:20:100:35000
+P:6:0d0:0:0:15
+F:RES_CHAOS | RES_NETHER | RES_POIS | ACTIVATE
+a:HARDCORE=PROT_EVIL
+D:Contained within this studded cuirass of pliable leather is the memory of
+D:unvanquished Himring, defiant fortress surrounded by the legions of Morgoth.
+
+
+# The Soft Leather Armour 'Hithlomir'
+
+N:168:'Hithlomir'
+I:36:4:4
+W:20:3:80:45000
+P:4:0d0:0:0:20
+F:STEALTH | HIDE_TYPE | SEARCH |
+F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD | RES_DARK
+D:Familiar with the secret ways hidden in darkness, this leather cuirass is
+D:truly more than it appears.
+
+
+# The Shield of Deflection of Gil-galad
+# Description from Sangband
+
+N:169:of Gil-galad
+I:34:10:5
+W:70:4:80:65000
+P:10:1d3:0:0:20
+F:ACTIVATE |
+F:LITE1 | WIS | CHR | SEARCH | LUCK
+F:RES_ELEC | RES_ACID | RES_DISEN | RES_DARK | HIDE_TYPE |
+F:SUST_WIS | SUST_DEX | SUST_CHR
+a:HARDCORE=GILGALAD
+D:The legendary shield of Gil-Galad, who fought his way to the gates of
+D:the Dark Tower, and with whom came light even to Gorgoroth.
+
+
+# The Metal Cap of Celebrimbor
+
+N:170:of Celebrimbor
+I:32:3:3
+W:55:12:20:45000
+P:3:1d1:0:0:18
+F:INT | DEX | CHR | SPELL | SEARCH |
+F:RES_FIRE | RES_ACID | RES_DISEN | RES_SHARDS |
+F:ACTIVATE
+a:HARDCORE=CELEBRIMBOR
+D:This once belonged to Celebrimbor, maker of the Rings of Power. One who
+D:knows both fire and acid, from the business of forging and engraving, will
+D:fear neither: nor have his enchantments ever faded. Celebrimbor was even
+D:aware of Sauron before Sauron became aware of him, when Sauron put on the
+D:One Ring for the first time.
+
+
+# The Heavy Crossbow of Umbar
+
+N:171:of Umbar
+I:19:24:2
+W:60:20:200:35000
+P:0:4d1:18:18:0
+F:STR | CON | XTRA_MIGHT | AGGRAVATE |
+F:RES_LITE | RES_DARK | RES_BLIND | RES_ELEC |
+F:HIDE_TYPE | ACTIVATE | SHOW_MODS
+a:HARDCORE=UMBAR
+D:A great brazen arbalest with arms of gleaming steel, shooting quarrels with
+D:speed and power for those brave enough to risk betrayal.
+
+# The Short Bows of Amrod and Amras, Feanor's twin sons
+
+# The Short Bow of Amrod
+
+N:172:of Amrod
+I:19:12:2
+W:25:10:30:9000
+P:0:0d0:12:15:0
+F:STR | CON | XTRA_MIGHT |
+F:RES_FIRE | RES_ELEC | RES_COLD | REGEN
+D:This bow, and its twin, belonged to Feanor's last two twin sons, Amrod
+D:and Amras, who both hunted with the Green-elves for a time. Like the
+D:twins, the bows are similar, for both protect their wielders from the
+D:elements: and yet they are also unlike, for this bow gives endurance
+D:and strength, while the other gives quickness and subtlety.
+
+
+# The Short Bow of Amras
+
+N:173:of Amras
+I:19:12:1
+W:25:10:30:9000
+P:0:0d0:12:15:0
+F:INT | WIS | DEX | XTRA_SHOTS | XTRA_MIGHT | SPEED |
+F:RES_FIRE | RES_ELEC | RES_COLD | SLOW_DIGEST
+D:This bow, and its twin, belonged to Feanor's last two twin sons, Amrod
+D:and Amras, who both hunted with the Green-elves for a time. Like the
+D:twins, the bows are similar, for both protect their wielders from the
+D:elements: and yet they are also unlike, for this bow gives quickness
+D:and subtlety, while the other gives endurance and strength.
+
+
+# The Mattock of Nain
+
+N:174:of Nain
+I:20:7:6
+W:60:5:250:30000
+P:0:3d8:12:18:0
+F:TUNNEL | INFRA | SEARCH | STR | ESP_ORC | CLIMB |
+F:SLAY_ORC | SLAY_TROLL | SLAY_GIANT | SLAY_DRAGON |
+F:BRAND_ACID | RES_ACID | RES_DARK | RES_DISEN |
+F:ACTIVATE
+a:HARDCORE=STONE_MUD
+D:Wielded by Nain of the Iron Hills at the Battle of Azanulbizar, this great
+D:mattock brought victory to the Dwarves over Azog's Orcs - though Nain
+D:himself fell at the last, even with victory already assured.
+
+
+# The Ball-and-Chain of Fundin Bluecloak
+
+N:175:of Fundin Bluecloak
+I:21:6:4
+W:25:100:130:60000
+P:0:5d4:13:17:10
+F:STR | WIS | SPEED | LITE1 | HIDE_TYPE |
+F:SLAY_EVIL | SLAY_UNDEAD | ACTIVATE |
+F:RES_FIRE | RES_ELEC | RES_NETHER | RES_DISEN | HOLD_LIFE |
+F:COULD2H
+f:COULD2H
+a:HARDCORE=FUNDIN
+D:The weapon of one of the great dwarven priests, with powers
+D:to preserve body, soul and enchantments, and the bane of those
+D:who seek life beyond death.
+
+
+# The Large Leather Shield of the Haradrim
+
+N:176:of the Haradrim
+I:34:4:2
+W:35:12:120:25000
+P:4:1d2:0:0:15
+F:ACTIVATE |
+F:STR | CON | SUST_STR | SUST_CON | HIDE_TYPE |
+F:RES_FEAR | RES_BLIND | RES_POIS | AGGRAVATE
+a:HARDCORE=HARADRIM
+D:A great shield from the far lands of the South, whose wielder
+D:will go charging into battle heedless of danger, with the
+D:strength and endurance of a madman. Nor will he fear poison, for
+D:the Southron barbarians handle poisoned darts naturally.
+
+# The Lead-Filled Mace 'Dolcrist'
+
+N:177:'Dolcrist'
+I:21:15:5
+W:30:15:500:60000
+P:0:5d4:11:23:20
+F:STR | TUNNEL | INFRA | HIDE_TYPE |
+F:CURSED | AGGRAVATE | NO_MAGIC | ACTIVATE |
+F:RES_NEXUS | RES_BLIND | RES_SOUND |
+F:KILL_DRAGON | SLAY_ANIMAL | BRAND_POIS | BRAND_ELEC |
+F:COULD2H
+f:COULD2H
+a:HARDCORE=SKULLCLEAVER
+D:This mighty bludgeon brings destruction to all around it, and is the
+D:bane of dragons and magic. Skull-cleaver (or head-cleaver) it is called.
+
+# The Set of Gauntlets of Eol
+
+N:178:of Eol
+I:31:2:3
+W:55:35:25:40000
+P:3:1d1:0:0:15
+F:INT | MANA | FREE_ACT | FEATHER | RES_ELEC | RES_DARK | RES_POIS |
+F:ACTIVATE | LUCK | SPELL_CONTAIN | WIELD_CAST
+a:HARDCORE=EOL
+D:The iron-shod gauntlets of the Dark Elven smith Eol, tingling with magics
+D:that he could channel in battle.
+
+
+# The Pair of Hard Leather Boots of Nevrast
+
+N:179:of Nevrast
+I:30:3:3
+W:20:8:40:35000
+P:3:1d1:0:0:13
+F:STEALTH | CON | SPEED | HIDE_TYPE
+D:Footgear made of bear leather and set with opals, which grant the wearer
+D:silent, hasted movement.
+
+
+# The Pair of Metal Shod Boots of Gimli
+
+N:180:of Gimli
+I:30:6:4
+W:40:8:60:22500
+P:4:1d1:5:5:10
+F:INFRA | SEARCH | TUNNEL | CLIMB | HIDE_TYPE
+Z:magic map
+D:A set of iron-shod boots stamped by Gimli's combat prowess, a peerless
+D:ally to those journeying through halls of stone under mountains.
+
+# The demon garbs of Gothmog
+
+# The Demonblade of Gothmog
+
+N:181:of Gothmog
+I:115:55:-20
+W:10:0:150:500
+P:0:7d6:13:13:0
+F:SHOW_MODS | SLAY_DEMON | SLAY_EVIL | BRAND_FIRE | BRAND_POIS
+F:LUCK | CHAOTIC | LITE1 | WOUNDING | RES_MORGUL | WIELD_CAST
+F:HEAVY_CURSE | AUTO_CURSE
+
+
+# The Demonshield of Gothmog
+
+N:182:of Gothmog
+I:115:56:4
+W:15:0:70:500
+P:13:1d1:0:0:13
+F:DEX | INVIS | SUST_STR | SUST_CON | SUST_DEX
+F:FEATHER | SH_FIRE | FREE_ACT | HOLD_LIFE
+F:HEAVY_CURSE | AUTO_CURSE | WIELD_CAST
+
+
+# The Demonhorn of Gothmog
+
+N:183:of Gothmog
+I:115:57:-5
+W:20:0:30:500
+P:2:1d1:0:0:13
+F:LITE2 | REGEN | ESP_DEMON
+F:CHR | SLOW_DIGEST | SEE_INVIS
+F:HEAVY_CURSE | AUTO_CURSE | WIELD_CAST
+
+# The Elven cloak of Peregrin Took
+# From T-Plus by Ingeborg S. Norden
+
+N:184:of Peregrin Took
+I:35:2:3
+W:10:10:10:12500
+P:4:0d0:0:0:16
+F:ACTIVATE | CHR | DEX | HIDE_TYPE | INVIS | LUCK | SEARCH | STEALTH
+a:HARDCORE=CURE_HUNGER
+D:This simple-looking cloak, dyed in hues that blend into the woodlands, was a gift
+D:from the elves of Lothlorien to the halfling Peregrin Took. Its wearer has an
+D:uncanny knack for making friends, escaping bonds, moving among enemies completely
+D:unseen--and finding food.
+
+# The Harp of Tom Bombadil
+# From T-Plus by Ingeborg S. Norden
+
+N:185:of Tom Bombadil
+I:14:59:4
+W:80:60:20:150000
+P:0:3d4:0:0:0
+F:ACTIVATE | BLESSED | CHR | ESP_UNDEAD | FREE_ACT |
+F:HIDE_TYPE | HOLD_LIFE | LIFE | LUCK | RES_FEAR |
+F:RES_SOUND | SEARCH | SEE_INVIS | STEALTH | SUST_CHR
+a:HARDCORE=PROT_EVIL
+D:This small, serviceable wooden harp once belonged to Tom Bombadil--
+D:a mysterious figure whose song prevented the Wight-King from
+D:attacking Frodo and his companions. Its music still inspires
+D:boldness and strengthens the life force of all who play it.
+
+# The Quarterstaff of Radagast
+# From T-Plus by Ingeborg S. Norden
+
+N:186:of Radagast
+I:21:3:2
+W:100:120:150:180000
+P:0:2d9:10:13:0
+F:ACTIVATE | BLESSED | CHR | ESP_ANIMAL | ESP_EVIL |
+F:HIDE_TYPE | INFRA | INT | MANA | RES_COLD | RES_ELEC |
+F:RES_FIRE | RES_MORGUL | SEARCH | SEE_INVIS | SHOW_MODS |
+F:SLAY_ANIMAL | SLAY_EVIL | SPELL | SPELL_CONTAIN |
+F:STEALTH | WATER_BREATH | WIELD_CAST | WIS
+a:SPELL=Artifact Radagast
+Z:grow trees
+D:Rumoured to be a gift from Yavanna to Radagast the Brown, this
+D:plain-seeming oak staff shields its bearer against the elements
+D:and helps him fight off malicious beasts (such as the goblins'
+D:Warg-steeds). It also grants exceptional insight into Nature
+D:magic, and can even cause trees or healing herbs to spring forth
+D:at the bearer's command.
+
+# The Horn 'Valaroma'
+# From T-Plus by Ingeborg S. Norden
+
+N:187:'Valaroma'
+I:14:60:4
+W:80:60:15:90000
+P:0:3d4:0:0:0
+F:ACTIVATE | BLESSED | CON | ESP_ANIMAL | ESP_EVIL |
+F:FREE_ACT | HIDE_TYPE | LUCK | RES_CONF | RES_FEAR |
+F:RES_SOUND | SEARCH | SEE_INVIS | STEALTH
+a:SPELL=Artifact Valaroma
+D:This heavenly instrument, wrought from gleaming silver, most
+D:often appears in the hands of the Valarin huntsman Orome; yet
+D:he may lend mortal champions the horn from time to time. Its
+D:music inspires courage and clarity of mind in pure-hearted
+D:beings, but drives evil ones far away.
+
+# The Cloak 'Menelcol'
+# From T-Plus by Ingeborg S. Norden
+
+N:188:'Menelcol'
+I:35:1:5
+W:70:70:10:27500
+P:1:0d0:0:0:25
+F:ACTIVATE | CHR | FLY | HIDE_TYPE | IM_ELEC | INFRA |
+F:LITE1 | MAGIC_BREATH | RES_COLD | RES_DARK | RES_LITE |
+F:SEARCH | SEE_INVIS | SUST_CHR
+a:HARDCORE=GILGALAD
+D:This deep-blue velvet cloak, embroidered with silvery stars, sheds a
+D:celestial light that reveals hidden things and bestows unearthly
+D:beauty. It also wards off damage from elements of the skies, and
+D:allows the wearer to fly unscathed even through airless space.
+
+# The Filthy Rag of Ghan-buri-Ghan
+# Suggested by ShinesmanOffWhite in the forums
+
+N:189:of Ghan-buri-Ghan
+I:36:1:2
+W:25:10:20:30000
+P:2:0d0:0:0:32
+F:CON | HIDE_TYPE | LIFE | RES_COLD | RES_FIRE |
+F:RES_POIS | RES_SOUND | STR | SUST_CON |
+F:SUST_STR | SUST_WIS | WIS
+Z:poison dart
+D:The wrappings of a leader among the wild Men of Druadan
+D:forest. It contains a multitude of tiny pockets filled
+D:with small darts dripping with venom.
+
+# The Cloak of Ghan-buri-Ghan
+# Suggested by ShinesmanOffWhite in the forums
+
+N:190:of Ghan-buri-Ghan
+I:35:1:5
+W:30:15:10:25000
+P:1:0d0:5:5:13
+F:DEX | HIDE_TYPE | INVIS | SPEED | STEALTH | SUST_DEX
+Z:berserk
+D:This dark-coloured cloak once belonged to the leader of the
+D:Druedain. As you put it on, you feel safer from attempts to
+D:waylay you on your travels.
+
+# The Black Banner of Gondor
+# Suggested by ShinesmanOffWhite in the forums
+
+N:191:of Gondor
+I:39:108:-3
+W:60:30:50:50000
+P:0:0d0:0:0:0
+F:ACTIVATE | ESP_UNDEAD | HIDE_TYPE | INSTA_ART | INVIS |
+F:LITE1 | RES_CHAOS | RES_DARK | RES_NETHER | STEALTH
+a:HARDCORE=SUMMON_UNDEAD
+D:A large banner of pure black, strangely gleaming with a dark light
+D:that is faint and at the same time so bright it attracts attention.
+
+# The Mage Staff of Saruman
+# Suggested by ShinesmanOffWhite in the forums
+
+N:192:of Saruman
+I:6:1:4
+W:60:80:12:60000
+P:0:1d4:5:5:0
+F:ACTIVATE | HIDE_TYPE | INT | MANA | SHOW_MODS | SPEED |
+F:SPELL | SPELL_CONTAIN | WIELD_CAST
+a:HARDCORE=BA_COLD_1
+Z:weigh magic
+D:A white quarterstaff that faintly gleams a pale white, it once belonged
+D:to one of the most powerful beings on Middle-Earth, Saruman the White.
+D:Saruman fell into shadow, and the staff left him during his travels. As
+D:you wield it, you become much more attuned to magic.
+
+# The Robe of Curunir
+# Suggested by ShinesmanOffWhite in the forums
+
+N:193:of Curunir
+I:36:2:10
+W:60:80:20:2000000
+P:2:0d0:-40:-40:36
+F:ACTIVATE | HIDE_TYPE | IM_COLD | IM_ELEC | SPEED | SPELL_CONTAIN |
+F:SUST_CHR | SUST_CON | SUST_DEX | SUST_INT | SUST_STR | WIELD_CAST
+a:HARDCORE=BA_ELEC_2
+D:The white robe of the Istari wizard Curunir, known on Middle-earth as
+D:Saruman the White and Saruman of Many Colours. Imbued with cold and
+D:lightning used in the creation of the Fire of Orthanc, it grants the
+D:wearer some mastery over these elements.
+
+# The Light Crossbow of Brand
+# Adapted from Hengband
+
+N:194:of Brand
+I:19:23:10
+W:30:10:110:40000
+P:0:0d0:5:7:0
+F:ACTIVATE | HIDE_TYPE | RES_COLD | SHOW_MODS | STEALTH
+a:HARDCORE=RUNE_EXPLO
+D:The bow of Brand, last King of Dale. It was given to him
+D:as a gift by the King under the Mountain of Erebor, and
+D:has access to an especially secret realm of Dwarven lore.
+
+# The Pearl 'Nimphelos'
+# Adapted from Annals of Ea by Feanor
+
+N:195:'Nimphelos'
+I:39:109:1
+W:20:10:10:40000
+P:0:1d1:0:0:0
+F:HIDE_TYPE | INFRA | INSTA_ART | LITE3 | SEARCH
+Z:dazzle
+D:It was a gift from the Falas-Elves to the Naugrim who built Menegroth,
+D:the abode of Thingol and Melian. It shines like starlight on the waves
+D:of the sea.
+
+# The Silmaril of Flames
+# Adapted from Annals of Ea by Feanor
+
+N:196:of Flames
+I:39:110:2
+W:75:90:200:100000
+P:0:10d10:0:0:0
+F:ACTIVATE | AUTO_CURSE | CURSED | DRAIN_EXP | DRAIN_MANA |
+F:ESP_EVIL | HEAVY_CURSE | HIDE_TYPE | INSTA_ART | LITE2 |
+F:LITE3 | RES_CHAOS | RES_DARK | RES_FIRE | RES_LITE |
+F:RES_NETHER | RES_NEXUS | RES_SHARDS | SEE_INVIS | STR
+a:HARDCORE=INVULN
+Z:banish evil
+D:A Silmaril of Feanor. It shines with the unquenchable light of the
+D:White Trees of Valinor. It was stolen from the camp of Eonwe by
+D:Maedhros the Tall, whose evil deeds made him unable to hold the
+D:shining jewel. Desperate and anguished, he cast himself into a
+D:fiery chasm, along with the jewel. Yet the jewel seems to have
+D:survived. Forever did the Oath of Feanor bind this jewel to the fate
+D:of Middle-earth.
+
+# The Silmaril of the Seas
+# Adapted from Annals of Ea by Feanor
+
+N:197:of the Seas
+I:39:111:2
+W:75:90:200:100000
+P:0:10d10:0:0:0
+F:ACTIVATE | AUTO_CURSE | CURSED | DRAIN_EXP | DRAIN_HP | ESP_EVIL |
+F:HEAVY_CURSE | HIDE_TYPE | INSTA_ART | INT | LITE2 | LITE3 |
+F:RES_CHAOS | RES_DARK | RES_LITE | RES_NETHER | RES_NEXUS | SEE_INVIS
+a:HARDCORE=RECALL
+Z:banish evil
+D:A Silmaril of Feanor. It shines with the unquenchable light of the
+D:White Trees of Valinor. It was stolen from the camp of Eonwe by
+D:Maglor, yet he soon discovered that the light of the Valar cannot
+D:abide in the hands of evildoers. Thus he could not bear to hold it,
+D:and he cast it into the sea. Thereafter he wandered ever upon the
+D:shores singing in pain, regret and sorrow. Forever did the Oath of
+D:Feanor bind this jewel to the fate of Middle-earth.
+
+# The Sceptre of Numenor
+
+N:198:of Numenor
+I:12:2:-3
+W:50:40:24:80000
+P:0:0d0:0:0:0
+F:ACTIVATE | AUTO_CURSE | CHR | CON | CURSED | HEAVY_CURSE |
+F:INSTA_ART | LUCK | SPEED | SPELL_CONTAIN | STR | WIELD_CAST | WRAITH
+a:HARDCORE=DISP_GOOD
+D:The chief mark of royalty in Westernesse, it is said to have perished
+D:in the fall of Numenor. It once belonged to Ar-Pharazon the Golden and
+D:the evilness of that fallen King still courses through it.
+
+# The Rod of Annuminas
+
+N:199:of Annuminas
+I:12:3:4
+W:60:50:24:80000
+P:0:0d0:0:0:0
+F:ACTIVATE | BLESSED | CHR | FREE_ACT | INSTA_ART | LUCK |
+F:RES_CONF | SPELL_CONTAIN | WIELD_CAST
+a:HARDCORE=RUNE_PROT
+D:The chief mark of royalty in Arnor, possibly the oldest remaining work
+D:of Men. It came from Numenor, but it belonged to the Lords of Andunie
+D:of whom the first was Valandil son of Silmarien. It was passed down to
+D:Elendil and thus survived the downfall of Numenor.
+# The Feanorian Lamp of Taniquetil
+# From T-Plus by Ingeborg S. Norden
+
+N:200:of Taniquetil
+I:39:4:2
+W:75:60:200:100000
+P:0:1d1:0:0:0
+F:ACTIVATE | BLESSED | ESP_ALL | HIDE_TYPE | INFRA | INT |
+F:LITE1 | LITE2 | LITE3 | RES_BLIND | RES_LITE | SEARCH |
+F:SEE_INVIS | WATER_BREATH | WIS
+a:HARDCORE=PALANTIR
+Z:detect curses
+D:This holy lamp once belonged to a seeress who warned Ar-Pharazon of
+D:the dire fate Numenor would suffer for daring to break the ban against
+D:mortals' entering the Blessed Realms alive. The king had the seeress
+D:executed and discarded her possessions--but rumors persist that a source
+D:of pure vision, untainted by Sauron's darkness, lies hidden away
+D:somewhere on Arda.
+
+# The template for artifacts corpses
+
+N:201:
+I:9:1:0
+W:200:1:10:0
+P:0:1d1:0:0:0
+F:INSTA_ART | SPECIAL_GENE
+
+
+# The Palantir of Orthanc
+
+N:202:of Orthanc
+I:39:104:2
+W:75:60:200:100000
+P:0:10d10:0:0:0
+F:WIS | INT | SEARCH | INFRA | HIDE_TYPE | ACTIVATE | ESP_ALL |
+F:SEE_INVIS | RES_BLIND | AGGRAVATE | DRAIN_MANA | LITE2
+F:INSTA_ART
+a:HARDCORE=PALANTIR
+D:A shining white ball of unbreakable crystal, the ancient Palantiri
+D:were used by kings of Numenor and later by the Exiles for rapid
+D:communication between distant lands. Nothing is hidden from one who
+D:gazes into a Palantir, but the observed will also be aware of the
+D:observer, as was Sauron when Saruman tried to spy on him with this
+D:particular Palantir.
+
+# The Ring 'Fuin'
+
+N:203:'Fuin'
+I:45:55:15
+W:110:0:2:3000000
+P:0:1d1:0:0:0
+F:SPEED | SEE_INVIS | LUCK | MAGIC_BREATH
+F:CURSED | HEAVY_CURSE | REGEN
+F:WRAITH | IM_NETHER | DRAIN_EXP | HOLD_LIFE | SPECIAL_GENE |
+F:INSTA_ART
+Z:teleport
+D:Imbued with the screams of the victims of undead everywhere, this
+D:ring is more a hole in reality than anything else. Strange forces ripple over
+D:its surface, giving you visions of a reality considerably less solid than this
+D:one. You feel your senses reel, and must make a conscious effort not to throw
+D:this ring as far from you as possible.
+
+# The Blue Stone 'Coimir' (formerly 'Toris Mejistos')
+# From T-Plus by Ingeborg S. Norden
+
+N:204:'Coimir'
+I:40:18:2
+W:80:120:3:120000
+P:0:0d0:0:0:0
+F:FREE_ACT | HIDE_TYPE | HOLD_LIFE | INSTA_ART | LIFE | LITE1 | LUCK | REGEN | RES_NETHER | SLOW_DIGEST | SPECIAL_GENE | SPELL_CONTAIN | SUST_CON | SUST_DEX | SUST_STR | WATER_BREATH | WIELD_CAST
+Z:restore life
+D:Called 'Life-jewel' by the Vanyar of old, this flawless sapphire
+D:pendant bears potent runes that preserve body and soul.
+
+# The Ring of Durin - last of the Seven Rings of the Dwarf-lords
+
+N:205:of Durin
+I:45:57:2
+W:70:70:2:65000
+F:CON | CHR | STR | SUST_CHR | SUST_CON | SUST_STR | HIDE_TYPE |
+F:ESP_EVIL | AGGRAVATE | HEAVY_CURSE | HOLD_LIFE | DRAIN_EXP |
+F:RES_DARK | RES_CHAOS | RES_NETHER | RES_COLD | RES_ACID |
+F:INSTA_ART | SPECIAL_GENE | CURSED
+Z:Midas touch
+D:The greatest of the Seven Rings of the Dwarf-lords, and the last to be
+D:lost. Alone among the Seven, it was not taken by Sauron when he made
+D:war on the Elves, but was given as a gift from Celebrimbor to King Durin
+D:III of Moria in token of friendship: nevertheless, Sauron in disguise
+D:had a hand in its making, and so it is cursed, and draws evil towards it.
+
+
+# The Elfstone 'Elessar'
+
+N:206:'Elessar'
+I:40:19:4
+W:60:60:3:40000
+P:0:0d0:7:7:10
+F:STR | WIS | CHR | SPEED | LITE3 | INSTA_ART |
+F:RES_FEAR | RES_FIRE | RES_POIS | RES_DISEN | HIDE_TYPE |
+F:ACTIVATE
+a:HARDCORE=ELESSAR
+D:This green gem glows with inner light. Aragorn son of Arathorn wore
+D:it at the Battle of the Pelennor Fields, and he was himself given the
+D:name of 'Elessar' by the people of Gondor because of this.
+
+
+# The Jewel 'Evenstar'
+
+N:207:'Evenstar'
+I:40:20:3
+W:50:50:3:35000
+F:HOLD_LIFE | SUST_CON | SUST_WIS | SUST_INT | LITE1 | CON |
+F:RES_DARK | RES_COLD | RES_NETHER | REGEN | INSTA_ART |
+F:ACTIVATE
+a:HARDCORE=REST_ALL
+D:A pure white jewel, the last gift of Queen Arwen Undomiel to Frodo
+D:Baggins, intended to be worn around his neck on the chain that had
+D:once borne the One Ring.
+
+# The Palantir of Minas Ithil
+
+N:208:of Minas Ithil
+I:39:107:-3
+W:75:60:200:0
+P:0:10d10:0:0:-30
+F:LIFE | CON | INT | WIS | ESP_ALL | LITE3 | LITE1
+F:CURSED | HEAVY_CURSE | TY_CURSE | DRAIN_EXP |
+F:RES_BLIND | SEE_INVIS | ACTIVATE
+a:HARDCORE=PALANTIR
+D:A shining white ball of unbreakable crystal, the ancient Palantiri
+D:were used by kings of Numenor and later by the Exiles for rapid
+D:communication between distant lands. This Palantir, however, was
+D:taken by Sauron long ago, and mastered to his evil uses, to the
+D:destruction of all others who would gaze into it.
+
+### More new artifacts in Theme ###
+
+# The Map of Thror
+
+N:209:of Thror
+I:8:33:0
+W:70:100:30:1
+P:0:0d0:0:0:0
+F:INSTA_ART | SPECIAL_GENE
+D:A map made by Thror, the King under the Mountain. It shows the Lonely
+D:Mountain of Erebor, the Running River, and the lands about devastated by
+D:Smaug. It also contains mention of a secret entrance to the Mountain.
+D:This map and a key are all you need to enter a special cavern in Erebor.
+
+# The Key of Thorin
+
+N:210:of Thorin
+I:11:13:0
+W:70:100:5:1
+P:0:0d0:0:0:0
+F:INSTA_ART | SPECIAL_GENE
+D:A small silver key, given to Thorin Oakenshield by Gandalf the Grey,
+D:who got it from Thrain, Thorin's father, in Dol Guldur. It opens a
+D:magical gate to a special cavern in the Lonely Mountain - you will
+D:also need a map to show you the gate's precise location.
+
+# The Cup of Thror
+
+N:211:of Thror
+I:11:14:0
+W:70:100:50:100000
+P:0:0d0:0:0:0
+F:ACTIVATE | ACTIVATE_NO_WIELD | HIDE_TYPE | INSTA_ART | SPECIAL_GENE
+a:HARDCORE=ALCHEMY
+D:It was made for Thror, King under the Mountain. It is a huge golden bowl
+D:with two handles, hammered and carved, with birds and flowers whose eyes
+D:and leaves are made in jewels.
+
+# The Red Arrow of Gondor
+
+N:212:of Gondor
+I:11:15:0
+W:40:70:2:70000
+P:0:0d0:0:0:0
+F:ACTIVATE | ACTIVATE_NO_WIELD | HIDE_TYPE | INSTA_ART
+a:HARDCORE=BOROMIR
+D:The summons of Gondor, an arrow sent as a symbol of desperate need from
+D:Gondor to its northern allies, the Rohirrim. The tradition dates back to
+D:the time of Borondir, who rode north from Gondor to summon aid from the
+D:ancestors of the Rohirrim, the Eotheod. The Red Arrow was only sent north
+D:in the most perilous of circumstances.
+
+# ToME artifacts (new since 2.3.x) #
+
+# The Mage Staff of Forochel
+
+N:213:of Forochel
+I:6:1:3
+W:65:70:60:60000
+P:0:3d4:-12:-8:0
+F:INT | WIS | MANA | SPELL | INFRA | SEE_INVIS |
+F:SUST_INT | SUST_WIS | RES_BLIND | IM_COLD | SENS_FIRE |
+F:SPECIAL_GENE | WIELD_CAST |
+F:COULD2H
+f:COULD2H
+D:A shaft of pure, invincible crystal cut from the heart of one
+D:of the great glaciers ringing the Ice-Bay of Forochel.
+D:While you hold it, your mind feels as clear as the winter sky.
+
+
+# The Elven Cloak of Mellyrn
+
+N:214:of Mellyrn
+I:35:2:4
+W:40:40:5:65000
+P:4:0d0:0:0:20
+F:HIDE_TYPE | INVIS | DEX | SPEED | STEALTH | LUCK |
+F:SUST_DEX | RES_LITE | RES_DARK
+D:Bearing the same lyrical name as the great trees of Lothlorien
+D:and containing in its close-woven folds the speed and skill of
+D:the Galadrim, this grey cloak is ideal for those who travel in
+D:forests.
+
+
+# The Bluesteel Blade of Ephel Duath
+
+N:215:of Ephel Duath
+I:23:31:-3
+W:60:60:50:30000
+P:0:2d6:-20:-18:0
+F:STR | WIS | CHR | BRAND_POIS | VAMPIRIC | VORPAL |
+F:INVIS | AGGRAVATE | CURSED | HEAVY_CURSE | SHOW_MODS |
+D:This filthy orc-blade is famed for vile deeds of torture and blood,
+D:and its wielder will never cease to fear treachery.
+
+
+# The Slaughter Axe 'Garachoth'
+
+N:216:'Garachoth'
+I:24:30:2
+W:70:50:400:0
+P:0:7d5:18:18:-20
+F:STR | CON | SPEED | LEVELS | BLACK_BREATH |
+F:KILL_DEMON | SLAY_ANIMAL | BRAND_FIRE | VORPAL |
+F:RES_FEAR | RES_FIRE | RES_CHAOS | RES_NETHER |
+F:HIDE_TYPE | SHOW_MODS
+D:A ghastly axe with the soul of a demon lord trapped inside, this horrifying
+D:creation reverberates with the screams of the damned. As you gaze into its
+D:glassy, translucent blade, it seems that endless sulphrous wastelands
+D:stretch away from you into the distance, obscured by sheets of fire.
+
+
+# The Set of Cesti 'Skycleaver'
+
+N:217:'Skycleaver'
+I:31:5:1
+W:40:45:40:100000
+P:5:1d1:16:7:16
+F:STR | CON | DEX | CHR | LUCK | FLY |
+F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD | RES_POIS |
+F:HIDE_TYPE | SHOW_MODS
+D:The handgear of a legendary dragonslaying hero. The wearer of these
+D:wyrmskin gauntlets will be versed in all aerial ways, and will fear no
+D:dragon that walks or flies.
+
+
+# The Pair of Metal Shod Boots of the Machine
+# Replaced the stealth malus with AGGRAVATE
+
+N:218:of the Machine
+I:30:6:3
+W:30:100:170:19000
+P:6:1d1:0:0:24
+F:INT | SPEED | TUNNEL | AGGRAVATE |
+F:RES_CHAOS | RES_SHARDS | RES_CONF |
+F:ESP_NONLIVING | HIDE_TYPE | SPECIAL_GENE
+D:A massive pair of adamantine boots studded with gold, the final and
+D:greatest product of the petty-dwarven magical forge. Despite
+D:the great powers they contain, they are heavy and awkward enough to
+D:make quite a racket whenever you move.
+
+# Theme artifacts continued #
+
+# The Robe of Belegaer
+# Based on Robe of the Seven Seas from T-Plus by Ingeborg S. Norden
+
+N:219:of Belegaer
+I:36:2:5
+W:100:200:20:1500000
+P:2:0d0:0:0:20
+F:FREE_ACT | HIDE_TYPE | IM_ACID | IM_COLD | IM_ELEC | LITE1 | LUCK | RES_BLIND | RES_DARK | SEARCH | STEALTH | WATER_BREATH
+D:This pearl-trimmed blue robe was created by a Maia loremaster in
+D:Ulmo's service. No ocean storm can harm its wearer or anything
+D:he carries; the pressure and darkness of deep water cannot hinder
+D:him, either.
+
+# The Necklace of Girion
+
+N:220:of Girion
+I:40:4:5
+W:20:5:2:15000
+P:0:1d1:0:0:10
+F:ACTIVATE | CHR | INSTA_ART | RES_NEXUS | RES_POIS | SEE_INVIS | SUST_CHR
+a:HARDCORE=GROW_MOLD
+D:A necklace of emeralds, green as the grass. It once belonged to Girion,
+D:King of Dale, and was given to the Dwarves of the Lonely Mountain as
+D:payment for a mithril mail shirt for Girion's son. It seems to have
+D:overgrown with a strange moss over the years.
+
+# The Silver Bolt 'Dailir' - the 'dart' of Beleg Cuthalion, based on Heart's Blood
+
+N:221:'Dailir'
+I:18:3:5
+W:85:40:3:35000
+P:0:8d5:15:20:0
+F:CRIT | HIDE_TYPE | SHOW_MODS | VORPAL | WOUNDING
+D:The beloved dart of Beleg Cuthalion. It never failed to be found
+D:unharmed, until it broke when Beleg fell upon it while he was
+D:carrying Turin Turambar away from an Orc-camp, the night Beleg
+D:met his end. Turin remade the bolt and kept it to his dying day in
+D:memory of his friend.
+
+# The Amulet of Faramir [adapted from Oangband]
+# The equivalent of the Phial (not too rare) for a stealth bonus and a source of RES_CONF early
+
+N:222:of Faramir
+I:40:29:5
+W:10:2:2:10000
+P:0:0d0:18:0:8
+F:HIDE_TYPE | INSTA_ART | RES_CONF | SHOW_MODS | STEALTH | SUST_DEX
+D:A slim neckpiece of True-silver, with quiet spells of Ithilien to aid and
+D:protect the wearer.
+
+# The Large Mithril Shield of Earendil
+# Adapted from Oangband; its chief benefits are the +to_ac and the activation
+
+N:223:of Earendil
+I:34:8:0
+W:95:80:100:90000
+P:20:1d1:0:0:80
+F:ACTIVATE | RES_BLIND | RES_DARK | RES_ELEC | RES_FIRE | RES_NETHER
+a:HARDCORE=BLADETURNER
+D:A shining shield, once borne by the great mariner Earendil, "scored with
+D:runes to keep all wounds and harm from him".
+
+# The Long Bow of Legolas
+
+N:224:of Legolas
+I:19:13:3
+W:40:20:40:30000
+P:0:0d0:17:19:0
+F:XTRA_MIGHT | XTRA_SHOTS | FREE_ACT | HIDE_TYPE | ESP_ORC |
+F:STEALTH | INFRA | DEX
+D:The great bow of Legolas, one of the Nine Walkers of old.
+D:Handcrafted specially for Thranduil's son in Lothlorien,
+D:this bow gives clarity of sight and agility to the wielder.
+
+# The Large Metal Shield of Erkenbrand
+
+N:225:of Erkenbrand
+I:34:5:3
+W:40:9:120:200000
+P:0:0d0:0:0:30
+F:REFLECT | STR | CHR | SUST_DEX | HIDE_TYPE | ESP_ORC |
+F:FREE_ACT | REGEN
+D:Tall and strong stood Erkenbrand, Lord of the Westfold, as he rode
+D:to combat the forces of Isengard. The valour of Helm Hammerhand lived
+D:again in him. This shield is painted red according to Rohan custom
+D:and it grants magical protection against enemy projectiles, as well
+D:as lets the wearer sense approaching enemy hordes.
+
+# XXX 226 Room for another artifact here XXX #
+# XXX 227 Room for another artifact here XXX #
+# XXX 228 Room for another artifact here XXX #
+# XXX 229 Room for another artifact here XXX #
+# XXX 230 Room for another artifact here XXX #
+# XXX 231 Room for another artifact here XXX #
+# XXX 232 Room for another artifact here XXX #
+# XXX 233 Room for another artifact here XXX #
+# XXX 234 Room for another artifact here XXX #
+# XXX 235 Room for another artifact here XXX #
+# XXX 236 Room for another artifact here XXX #
+# XXX 237 Room for another artifact here XXX #
+# XXX 238 Room for another artifact here XXX #
+# XXX 239 Room for another artifact here XXX #
+# XXX 240 Room for another artifact here XXX #
+
+### New Ultimate items added in Theme ###
+
+# The Lucerne Hammer of the Eruchin (Haftedmasters/Eru warriors)
+
+N:241:of the Eruchin
+I:21:10:10
+W:127:220:130:9000000
+P:0:5d6:21:26:50
+F:ACTIVATE | BLESSED | BRAND_COLD | BRAND_ELEC | BRAND_FIRE |
+F:CHR | CON | FREE_ACT | IM_COLD | LIFE | LITE1 | LUCK |
+F:NO_MAGIC | PRECOGNITION | REGEN | RES_DARK | RES_FIRE |
+F:SEE_INVIS | SHOW_MODS | SLAY_DEMON | SLAY_EVIL | SLAY_TROLL |
+F:SLAY_UNDEAD | SLOW_DIGEST | SPECIAL_GENE | SUST_CHR | SUST_CON |
+F:SUST_DEX | SUST_INT | SUST_STR | SUST_WIS | ULTIMATE | VORPAL
+a:HARDCORE=ERU
+D:A weapon forged by Aule himself and blessed by Eru Iluvatar,
+D:calling upon the strength of all his children (hence the name,
+D:which means Children of Eru). It is Eru Iluvatar's gift to you,
+D:made for a single purpose
+
+# The Trident of Ulmo (Polearmmasters)
+
+N:242:of Ulmo
+I:22:5:10
+W:127:220:130:9000000
+P:0:5d6:21:26:50
+F:ACTIVATE | BLESSED | BRAND_COLD | BRAND_ELEC | BRAND_FIRE |
+F:CHR | CON | FREE_ACT | IM_COLD | LIFE | LITE1 | LUCK |
+F:NO_MAGIC | PRECOGNITION | REGEN | RES_DARK | RES_FIRE |
+F:SEE_INVIS | SHOW_MODS | SLAY_DEMON | SLAY_EVIL | SLAY_TROLL |
+F:SLAY_UNDEAD | SLOW_DIGEST | SPECIAL_GENE | SUST_CHR | SUST_CON |
+F:SUST_DEX | SUST_INT | SUST_STR | SUST_WIS | ULTIMATE | VORPAL
+a:HARDCORE=ERU
+D:The awesome weapon of the Vala Ulmo, Lord of Waters. Mightiest of all the
+D:powers of good save Manwe himself, Ulmo laughs in scorn at the dread powers
+D:of the undead, and is utterly in command of the element of water.
+
+# The Broad Axe of Aule (Axemasters)
+
+N:243:of Aule
+I:24:11:10
+W:127:220:130:9000000
+P:0:5d6:21:26:50
+F:ACTIVATE | BLESSED | BRAND_COLD | BRAND_ELEC | BRAND_FIRE |
+F:CHR | CON | FREE_ACT | IM_COLD | LIFE | LITE1 | LUCK |
+F:NO_MAGIC | PRECOGNITION | REGEN | RES_DARK | RES_FIRE |
+F:SEE_INVIS | SHOW_MODS | SLAY_DEMON | SLAY_EVIL | SLAY_TROLL |
+F:SLAY_UNDEAD | SLOW_DIGEST | SPECIAL_GENE | SUST_CHR | SUST_CON |
+F:SUST_DEX | SUST_INT | SUST_STR | SUST_WIS | ULTIMATE | VORPAL
+a:HARDCORE=ERU
+D:Aule's mighty weapon, granted to you to aid the defeat of Melkor.
+
+# The Rapier of Vaire (Rogues, whose Critical-hits skill is only useful with lighter swords)
+
+N:244:of Vaire
+I:23:7:10
+W:127:220:130:9000000
+P:0:5d6:21:26:50
+F:ACTIVATE | BLESSED | BRAND_COLD | BRAND_ELEC | BRAND_FIRE | CHR |
+F:CON | FREE_ACT | IM_COLD | LIFE | LITE1 | LUCK | NO_MAGIC |
+F:PRECOGNITION | REGEN | RES_DARK | RES_FIRE | SEE_INVIS | SHOW_MODS |
+F:SLAY_DEMON | SLAY_EVIL | SLAY_TROLL | SLAY_UNDEAD | SLOW_DIGEST |
+F:SPECIAL_GENE | SUST_CHR | SUST_CON | SUST_DEX | SUST_INT | SUST_STR |
+F:SUST_WIS | ULTIMATE | VORPAL
+a:HARDCORE=ERU
+D:A shining rapier used by Vaire to cut the strings of time when
+D:dire need arises. Its power with that of the Flame Imperishable
+D:will let you destroy Melkor forever.
+
+# The Long Bow of Irmo (Bow-masters)
+
+N:245:of Irmo
+I:19:13:5
+W:127:220:130:8000000
+P:0:0d0:36:28:0
+F:CON | DEX | ESP_EVIL | ESP_ORC | ESP_TROLL | FLY | FREE_ACT |
+F:IM_ELEC | INFRA | INVIS | LUCK | NO_MAGIC | PRECOGNITION |
+F:REFLECT | RES_BLIND | RES_CHAOS | RES_CONF | RES_DISEN |
+F:SEE_INVIS | SLOW_DIGEST | SPECIAL_GENE | SPEED | STEALTH |
+F:SUST_CHR | SUST_CON | SUST_DEX | SUST_INT | SUST_STR |
+F:SUST_WIS | ULTIMATE | XTRA_MIGHT | XTRA_SHOTS
+D:A gift from Orome to Irmo, a mighty bow that sings the songs of the
+D:garden of Lorien. It will guide your hand and steady your grip in
+D:your encounter with Melkor.
+
+# The Sling of Nessa (Sling-masters)
+
+N:246:of Nessa
+I:19:2:5
+W:127:220:130:8000000
+P:0:0d0:36:28:0
+F:CON | DEX | ESP_EVIL | ESP_ORC | ESP_TROLL | FLY | FREE_ACT |
+F:IM_ELEC | INFRA | INVIS | LUCK | NO_MAGIC | PRECOGNITION |
+F:REFLECT | RES_BLIND | RES_CHAOS | RES_CONF | RES_DISEN |
+F:SEE_INVIS | SLOW_DIGEST | SPECIAL_GENE | SPEED | STEALTH |
+F:SUST_CHR | SUST_CON | SUST_DEX | SUST_INT | SUST_STR | SUST_WIS |
+F:ULTIMATE | XTRA_MIGHT | XTRA_SHOTS
+D:This sling was made for the most lithe of the Valier to provide
+D:her with amusement as she used it to shoot magical pebbles of
+D:cheer and charm while dancing in the lush green fields of Valinor.
+D:She grants it to you now in your time of trial.
+
+# The Metal Boomerang of Varda (Boomerang-masters)
+
+N:247:of Varda
+I:15:4:5
+W:127:220:130:8000000
+P:0:0d0:36:28:0
+F:CON | DEX | ESP_EVIL | ESP_ORC | ESP_TROLL | FLY | FREE_ACT |
+F:IM_ELEC | INFRA | INVIS | LUCK | NO_MAGIC | PRECOGNITION |
+F:REFLECT | RES_BLIND | RES_CHAOS | RES_CONF | RES_DISEN |
+F:SEE_INVIS | SLOW_DIGEST | SPECIAL_GENE | SPEED | STEALTH |
+F:SUST_CHR | SUST_CON | SUST_DEX | SUST_INT | SUST_STR | SUST_WIS |
+F:ULTIMATE | XTRA_MIGHT | XTRA_SHOTS
+D:Made from living starlight, this boomerang will dispel the darkest
+D:of darkness. It is a gift from Varda Elentari, to aid you in your
+D:task.
+
+# The Amulet of Mandos (Weaponless fighters)
+
+N:248:of Mandos
+I:40:27:0
+W:100:16:60:500000
+P:0:2d4:0:0:85
+F:ACTIVATE | ESP_DRAGON | FEATHER | FLY | HOLD_LIFE | IGNORE_ACID |
+F:IGNORE_COLD | IGNORE_ELEC | IGNORE_FIRE | REGEN | RES_ACID |
+F:RES_BLIND | RES_CHAOS | RES_COLD | RES_CONF | RES_DARK | RES_DISEN |
+F:RES_ELEC | RES_FIRE | RES_LITE | RES_NETHER | RES_NEXUS | RES_POIS |
+F:RES_SHARDS | RES_SOUND | SPECIAL_GENE | ULTIMATE
+a:HARDCORE=BLADETURNER
+D:This amulet contains the power of Mandos, the Doomsman of the
+D:Valar. It will grant you protection against the foul dark magic
+D:of Melkor, though you will still need your wits and strength
+D:about you as you face your ultimate foe.
+
+# XXX 249 Room for another artifact here XXX ###
+# XXX 250 Room for another artifact here XXX ###
+# XXX 251 Room for another artifact here XXX ###
+# XXX 252 Room for another artifact here XXX ###
+# XXX 253 Room for another artifact here XXX ###
+# XXX 254 Room for another artifact here XXX ###
+# XXX 255 Room for another artifact here XXX ###
+# XXX 256 Room for another artifact here XXX ###
+
+### 256 is the maximum number of artifacts (257 in misc.txt).
+
+# N: serial number : & object name~
+# G: symbol : color
+# I: tval : sval : pval
+# W: depth : rarity : weight : cost
+# P: base armor class : base damage : plus to-hit : plus to-dam : plus to-ac
+# F: flag | flag | etc
+# D: description
diff --git a/lib/mods/theme/edit/ab_info.txt b/lib/mods/theme/edit/ab_info.txt
new file mode 100644
index 00000000..4272776a
--- /dev/null
+++ b/lib/mods/theme/edit/ab_info.txt
@@ -0,0 +1,109 @@
+# File: ab_info.txt
+
+
+# This file is used to initialize the "lib/data/ab_info.raw" file, which is
+# used to initialize the "abilities" information for the ToME game.
+
+# Do not modify this file unless you know exactly what you are doing,
+# unless you wish to risk possible system crashes and broken savefiles.
+
+# The ToME abilities indexes are defined in "defines.h", and must not be changed.
+# If you want to add new ones, add them after the tome ones
+
+# N:idx:name
+# D:desc
+# I:cost(in skill points)
+# A:action mkey:action desc
+
+# Prerequisites
+# k:level:skill
+# S:level(linear mode):stats
+# a:needed ability
+
+# E:excluding ability:excluding ability
+
+# If you need more sophisticated prereqs use the HOOK_LEARN_ABILITY
+
+# Version stamp (required)
+
+# Do not forget to update misc.txt with an entry like the following :
+# Maximum number of traits in ab_info.txt
+# M:b:50
+
+V:2.2.0
+
+N:0:Spread blows
+D:If a monster dies to your attack but you still have blows left
+D:you won't lose the full turn, allowing you to attack some other
+D:monster in the same turn
+D:Prereq: Weaponmastery skill@30, Dex@17
+I:5
+k:30:Weaponmastery
+S:17:DEX
+
+N:1:Tree walking
+D:Allows you to walk in dense forest
+D:Prereq: Nature skill@20
+I:7
+k:20:Nature
+
+N:2:Perfect casting
+D:Allows you to reach 0% failure rate on spells
+D:Prereq: Magic skill@35
+I:6
+k:35:Magic
+
+N:3:Extra Max Blow(1)
+D:Increases your max possible blows number by 1
+D:Prereq: Combat@10
+I:7
+k:10:Combat
+
+N:4:Extra Max Blow(2)
+D:Increases your max possible blows number by 1
+D:Prereq: Combat@20, Extra Max Blow(1)
+I:7
+k:20:Combat
+a:Extra Max Blow(1)
+
+N:5:Ammo creation
+D:Allows you to create shots, arrows and bolts from various materials
+D:Prereq: Archery@10
+A:10:Forge ammo
+I:8
+k:10:Archery
+
+N:6:Touch of death
+D:Your melee blows can insta-kill, but you only receive 1/3 of the experience
+D:Prereq: Necromancy@50, Combat@40, DEX@30, STR@30
+A:100:Activate touch of death
+I:15
+k:50:Necromancy
+k:40:Combat
+S:30:DEX
+S:30:STR
+
+N:8:Far reaching attack
+D:You can attack an enemy one square far using a long polearm.
+D:At high levels of Polearm-mastery skill, you can even hit two enemies at once.
+D:Prereq: Combat@15, Polearm-mastery@15
+I:10
+A:102:Far reaching attack
+k:15:Combat
+k:15:Polearm-mastery
+
+N:9:Trapping
+D:Ability to set monster traps
+D:Prereq: Disarming@15
+I:10
+A:14:Set trap
+k:15:Disarming
+
+N:10:Undead Form
+D:Ability to turn into a weak undead being when you "die".
+D:You must then kill enough monsters to absorb enough life energy
+D:to come back to life.
+D:Prereq: Necromancy@30, INT@25
+I:15
+k:30:Necromancy
+S:25:INT
diff --git a/lib/mods/theme/edit/al_info.txt b/lib/mods/theme/edit/al_info.txt
new file mode 100644
index 00000000..c5e7c55d
--- /dev/null
+++ b/lib/mods/theme/edit/al_info.txt
@@ -0,0 +1,12 @@
+# File: al_info.txt
+
+
+# This file is used to initialize the "lib/raw/al_info.raw" file, which is
+# used as the alchemist recipes in ToME
+
+# This file is intentionally blank in Theme
+# because the Alchemist class has been removed.
+
+# Version stamp (required)
+
+V:2.0.0 \ No newline at end of file
diff --git a/lib/mods/theme/edit/ba_info.txt b/lib/mods/theme/edit/ba_info.txt
new file mode 100644
index 00000000..b76f79dd
--- /dev/null
+++ b/lib/mods/theme/edit/ba_info.txt
@@ -0,0 +1,310 @@
+# File: ba_info.txt
+
+
+# This file is used to initialize the "lib/raw/ba_info.raw" file, which is
+# used to initialize the "store/building actions type" information for
+# the Angband game.
+
+# Do not modify this file unless you know exactly what you are doing,
+# unless you wish to risk possible system crashes and broken savefiles.
+
+# N:<index>:<name>
+# C:<hated cost>:<normal cost>:<liked cost>
+# I:<action>:<acttion restriction>:<letter>
+
+# Restriction:
+# 0 = No restrictions
+# 1 = Restrict to normal & liked
+# 2 = Restrict to liked
+
+# Version stamp (required)
+
+V:2.0.0
+
+N:0:Nothing
+C:0:0:0
+I:0:0:.
+
+N:1:Sell an item
+C:0:0:0
+I:43:0:s:d
+
+N:2:Purchase an item
+C:0:0:0
+I:44:0:p:g
+
+N:3:Examine an item
+C:0:0:0
+I:45:0:x
+
+N:4:Steal an item
+C:0:0:0
+I:46:0:Z
+
+N:5:Rest for the night
+C:25:20:15
+I:17:0:r
+
+N:6:Buy food and drink
+C:3:2:1
+I:18:0:f
+
+N:7:Listen for rumours
+C:0:0:0
+I:19:0:u
+
+N:8:Presage fate
+C:600:500:480
+I:42:0:l
+
+N:9:In-Between
+C:0:0:0
+I:12:0:b
+
+N:10:Play craps
+C:0:0:0
+I:14:0:c
+
+N:11:Spin the wheel
+C:0:0:0
+I:15:0:s
+
+N:12:Play dice slots
+C:0:0:0
+I:16:0:d
+
+N:13:Game rules
+C:0:0:0
+I:13:0:r
+
+N:14:Research item
+C:1400:1300:1200
+I:1:0:a
+
+N:15:Town history
+C:0:0:0
+I:2:0:h
+
+N:16:Race legends
+C:0:0:0
+I:3:0:l
+
+N:17:Look at busts of Kings
+C:0:0:0
+I:5:0:l
+
+N:18:Research monster
+C:1600:1500:1400
+I:20:0:r
+
+N:19:View bounties
+C:0:0:0
+I:38:0:v
+
+N:20:Receive bounty money
+C:0:0:0
+I:39:0:b
+
+N:21:Get quest monster
+C:0:0:0
+I:54:0:q
+
+N:22:Turn in quest corpse
+C:0:0:0
+I:55:0:m
+
+N:23:Compare weapons
+C:220:200:180
+I:21:0:c
+
+N:24:Enchant weapon
+C:750:700:150
+I:23:0:w
+
+N:25:Enchant armour
+C:750:700:150
+I:24:0:a
+
+N:26:Recharge item
+C:350:300:75
+I:25:0:r
+
+N:27:Identify possessions
+C:900:800:100
+I:26:0:i
+
+N:28:Healing prayer
+C:600:400:0
+I:28:0:h
+
+N:29:Restoration
+C:600:500:100
+I:29:0:r
+
+N:30:Get share of stolen gold
+C:0:0:0
+I:7:2:g
+
+N:31:Enchant arrows
+C:550:500:100
+I:30:0:a
+
+N:32:Enchant bow
+C:550:500:100
+I:31:0:b
+
+N:33:Recall to dungeon
+C:300:200:100
+I:33:0:r
+
+N:34:Teleport to dungeon-level
+C:15000:10000:1000
+I:34:0:t
+
+N:35:Get a quest
+C:0:0:0
+I:6:0:q
+
+# Restrict to liked/normal
+N:36:Get a quest
+C:0:0:0
+I:46:1:q
+
+N:37:Get a quest
+C:0:0:0
+I:47:0:q
+
+N:38:Get a quest
+C:0:0:0
+I:49:0:q
+
+N:39:Herbal Healing
+C:32000:10000:0
+I:50:0:h
+
+N:40:Song of Lore
+C:2000:800:50
+I:26:0:s
+
+N:41:Distribute earnings
+C:0:0:0
+I:7:2:d
+
+N:42:Morph restoration
+C:3000:1500:750
+I:37:0:r
+
+#for The Mirror
+N:43:View fate
+C:500:500:500
+I:42:0:v
+
+#for The Mirror
+N:44:Research item
+C:1500:1500:1500
+I:1:0:a
+
+#for library in gondol
+N:45:Research item
+C:2000:2000:2000
+I:1:0:a
+
+#for Star-Dome
+N:46:Identify possessions
+C:1200:1000:250
+I:26:0:i
+
+#for Star-Dome
+N:47:Recharge item
+C:1200:1000:150
+I:25:0:r
+
+#for Valarin Temple
+N:48:Restoration
+C:1200:1000:200
+I:29:0:r
+
+#for Sea-Dome
+N:49:Morph restoration
+C:1500:1500:1500
+I:37:0:r
+
+#for The Golden Flower
+N:50:Enchant arrows
+C:1100:1000:200
+I:30:0:a
+
+#for The Golden Flower
+N:51:Enchant bow
+C:1100:1000:200
+I:31:0:b
+
+#for The Fountain
+N:52:Enchant armour
+C:1100:1000:200
+I:24:0:a
+
+#for The Fountain
+N:53:See Healers
+C:1100:1000:0
+I:28:0:h
+
+N:54:Drop an item
+C:0:0:0
+I:43:0:d:s
+
+N:55:Get an item
+C:0:0:0
+I:44:0:g:p
+
+N:56:Request an item
+C:0:0:0
+I:51:2:r
+
+N:57:Ask for loan
+C:0:0:0
+I:52:2:a
+
+N:58:Pay back loan
+C:0:0:0
+I:53:2:p
+
+N:59:Donate an item
+C:0:0:0
+I:43:0:d
+
+# Mage Tower quest in Lothlorien
+N:60:Get a quest
+C:0:0:0
+I:56:0:q
+
+N:61:Get a quest
+C:0:0:0
+I:61:0:q
+
+# Free rest for the night option for homes
+N:62:Rest for the night
+C:0:0:0
+I:17:0:r
+
+# Free rest for the night option at some 'town' locations
+# Restricted to 'liked' races for thematic reasons
+N:63:Rest for the night
+C:0:0:0
+I:17:2:r
+
+# Enchant arrows option with a different letter for Imladris forge
+N:64:Enchant arrows
+C:550:500:100
+I:30:0:r
+
+# Getting free dinner at some 'town' locations
+# Restricted to 'liked' races for thematic reasons
+N:65:Get food and drink
+C:0:0:0
+I:18:2:f
+
+# Ask Bard for directions to Erebor
+N:66:Ask about Erebor
+C:0:0:0
+I:66:0:a \ No newline at end of file
diff --git a/lib/mods/theme/edit/between.map b/lib/mods/theme/edit/between.map
new file mode 100644
index 00000000..4fed5c95
--- /dev/null
+++ b/lib/mods/theme/edit/between.map
@@ -0,0 +1,71 @@
+# Created by Mynstral (mynstral@thehelm.com)
+# Made for PernAngband on 14/08/2001
+
+# Monsters starts awake
+N:0
+
+# Permanent wall
+F:X:63:3
+
+# Floor with dirt
+F:.:88:3
+
+# Floor with grass
+F:,:89:3
+
+# Tree
+F:T:96:3
+
+# Floor with grass with a green thunderlord
+F:G:89:5:955
+
+# Floor with grass with a blue thunderlord
+F:L:89:5:956
+
+# Floor with grass with a brown thunderlord
+F:B:89:5:957:0:0:0:0:0:0:2
+
+# Floor with grass with a bronze thunderlord
+F:z:89:5:958:0:0:0:0:0:0:2
+
+# Floor with dirt with a bronze thunderlord
+F:Z:88:5:958:0:0:0:0:0:0:2
+
+# Floor with grass with a gold thunderlord
+F:D:88:5:959:0:0:0:0:0:0:2
+
+D:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+D:X..T.TT..T...T...T...T.....T....T......T...T.,,.....T......T....T...T.T..T..TT...T..T.TT.T.TT.TX
+D:X.T.TTTTT...T..TT..T..T.T.T.T...T.....T..T.TT,,..T...T.....T..T......T..T.T..T.T.TT.T.T.T..TTT.X
+D:XTTT.T.T.T.T..TTT.T.T.TTT.T.T.T..T..T.T..T..T.,,..T....T....T..T.T.T..T.T..T.T.TT.T.TT.TT.TTT.TX
+D:XTTT.T...T....T....T..T.TT..T.T.T...T...GG....,,...GG....T...T...T.TTT.T..TTTT.TT...T.TT..T.T.TX
+D:X.TTT..T.T..TTTT.T.T..T..T.TT...T......G..L..,,...L..G..T..T.T...T....T.TTTTTT..TTTTT.T..TT..T.X
+D:XTT.T.TTT.T.T.T.T.T.T.T...T..T...T..T.G..L..B,,.B..L..G....T..T...TT.T.T..TTT.T.TTTT.TTTT..T.T.X
+D:X.T.TT..T.TT.TTT.T.T.T.T.T.T...T.T.T.G..L..B.,,..B..L..G..T..T...T...T.T.T..TTTT.T.T.TT.T.T.TT.X
+D:X.TT.T.TTT.T.T.T.T..T.T..T....T..T..G..L..B..,Z...B..L..G..T...T.T..T...T...T.T.T.TTT.T.T.T..T.X
+D:XT.T.TT.TTTT.TT.T.TTT...T.T.T...T.T.G..L..B..ZDz..B..L..G...T.T...T.T...T..T..T...T..T.TT.T.T.TX
+D:XTTT..TTTT.T.T.T..T.T....T...T..T.T..G..L..B.,,..B..L..G..T....T...T....T....T..T..TT.T.T.TTT..X
+D:XTT.TT..T.T.T.T.T...T...T....T.T..T.T.G..L...,,....L..G..T..T...T..T.......T...T....T..T..TT...X
+D:XTTT.T..T.T..T.T..T...T..T....TT..T.T..GG....,,.....GG...T.T...T.T...T..T.T...T....T...T..T.T..X
+D:XTT...T.T..T....T....T....T....T...T....T.T..,,,.....T...T..T...T.....T...T...T..T..T...T..T.T.X
+D:XT..T.T...T...T...T.....T....T....T....T...TTTTTTTT...T...T...T....T.....T......T....T.....T..TX
+D:XT.T...T...T..T.T...T.T.T..T...T.T...T...T.T...,.T...T...T...T...T..T.....T....T....T...T...T.TX
+D:XTT.T.T.T.T..T..T.T.T.....T....T..T...T.......,,..T........T...T...T...T...T.....T..T..T...TTT.X
+D:X..TT...T..T.....T...T....T...T...T...T..T...,,.....T..T..T.....T.T...T...T...T..T..T.T...T.TT.X
+D:X.TT..T....T.T..T...T..T...T..T.T.T..T..T.T.,,..T..T..T....T..T..T...T.T....T....T...TT.TTTTTT.X
+D:X.T.TTTTTT.T.T.T...T..T..T.....T.T..T...T.T.,,...T...T......T.....T....T...T..T....T..TT.TTTTTTX
+D:XTTT.T.T.TTTTT.TTT...T..T...TT.T.T...T.T....,,.T...T.....T.....T....T.......T..T...T.TT.T.T.TT.X
+D:XTT.T..T.TT.T.T.TT.T...T.T..T.T.......T..T.,,.....T....T....T...........T..T...TT.TTTTTTTTTTTTTX
+D:XTTTT....TT.T.T.TTTTT.T...T..T.T..T......T.,,T......T....T....T.....T...T...T..TTTT.T.TT.T.TTTTX
+D:XTT.TTTTTT.T.TT.TTTTTT...T....TT.T...T....,,.T...T....T.....T....T....T....T..TT.T.TTT.T.T.T.TTX
+D:XTT.T..TTT.T.T.TTTTTTTT.T...T....T....T.T,,.........T....T....T....T...T.T.T.TTT.T.T.T.T..T.T.TX
+D:XTT.T..TTT..T.T.T.T.TT..T.T.T......T.T.T.,,..T...T...T...T..T...T...T.T.TTT.T.T.T.T.T.T.T.T..T.X
+D:X.T.T.T.T.T.T..T.T.T.T.T.T..T...T..T.TT.T.,,..T...T.....T.....T.....T..TTT.T.T.TTTTT.T.TTT.TT.TX
+D:XTT.T.T.T.TTTT.T..T.T.T.TTTT.T..T.T..T.TT.,,.T...T..T..T.......T.T....TTTTT.TTTT.T.TTT.TTTT.T.TX
+D:XT.T.TT.TTTT.T.T.T.TTT.T.T.TT......T...T...,,..T...T...T....T....T.TTT.T.T.T.T.T.T..T.T.T.T.TT.X
+D:XT.TTT.T.T.TTTT.T.T.T.T.TTT.TT..T...T...T..,,..T...T....T....T..TT.T.TT.TTTTT.T.T.TT.TT.TT.T.T.T
+D:XTT.T.T.TT.T.TTTT.T..TT.T.T.TT.T.T.T..T....,,.T...T...T....T..TTTTTTTT.T.T.T.T.T.TT.T.TTTTT.T.TX
+D:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+
+# Starting position
+P:17:47
diff --git a/lib/mods/theme/edit/d_info.txt b/lib/mods/theme/edit/d_info.txt
new file mode 100644
index 00000000..c54c9f8f
--- /dev/null
+++ b/lib/mods/theme/edit/d_info.txt
@@ -0,0 +1,701 @@
+# File: d_info.txt
+
+
+# This file is used to initialize the "lib/raw/d_info.raw" file, which is
+# used to initialize the "dungeon type" information for the Angband game.
+
+# Do not modify this file unless you know exactly what you are doing,
+# unless you wish to risk possible system crashes and broken savefiles.
+
+# Some store indexes are defined in "defines.h", and must not be
+# changed.
+
+# N:<index>:<name>
+# D:<3 letter short name>:<long name>
+# W:<min depth>:<max depth>:<min player level>:<next dungeon>:<min alloc>:<max alloc chance>
+# L:<floor1>:<%1>:<floor2>:<%2>:<floor3>:<%3>
+# A:<wall1>:<%1>:<wall2>:<%2>:<wall3>:<%3>:<outer wall>:<inner wall>
+# O:<%treasure>:<%combat>:<%magic>:<%tools>
+# E:<dices>d<sides>:<frequency>:<attack type>
+# F:<flags>
+# R:<percent>:<flags mode>
+# M:<monster flags>
+# S:<monster spells>
+
+# Note for <flags mode> :
+# 0 = No restriction
+# 1 = AND
+# 2 = NAND
+# 3 = OR
+# 4 = NOR
+
+# Version stamp (required)
+
+V:2.0.0
+
+### Wilderness(purely cosmetic, never used) ###
+
+N:0:Wilderness
+D:Wil:a way to the Wilderness
+W:0:0:0:0:14:500
+L:89:80:199:20:1:0
+A:96:100:56:0:56:0:57:58
+O:20:20:20:20
+F:PRINCIPAL | FLAT | NO_RECALL
+R:100:0
+
+### The principal dungeons, they were created by spliting the vanilla dungeon ###
+
+N:1:Mirkwood
+D:Mkw:a way to the Mirkwood Forest.
+W:11:33:5:0:14:160
+L:89:95:199:5:88:0
+A:96:100:97:0:56:0:202:96
+O:20:20:20:20
+F:PRINCIPAL | NO_DOORS | NO_DESTROY | FLAT
+F:FILL_METHOD_0
+R:100:0
+
+N:2:Barad-Dur
+D:BDr:a door to the tower of Barad-Dur.
+W:34:66:15:0:14:160
+L:88:67:93:33:1:0
+L:0:100:0
+A:97:50:56:50:56:0:57:97
+A:0:100:0
+O:20:20:20:20
+F:PRINCIPAL | LAVA_RIVER | CAVERN | NO_STREAMERS
+F:FILL_METHOD_2 | NO_RECALL
+R:100:0
+
+N:3:Angband
+D:Ang:an entrance to the Pits of Angband.
+W:67:100:30:0:14:160
+L:1:100:1:0:1:0
+A:56:100:56:0:56:0:57:58
+O:20:20:20:20
+F:PRINCIPAL | CAVERN | NO_EASY_MOVE | NO_RECALL
+F:ADJUST_LEVEL_1_2 | ADJUST_LEVEL_1
+F:FILL_METHOD_0
+R:100:0
+
+N:4:Barrow-Downs
+D:BDw:a way to the Barrow-Downs.
+W:1:10:1:0:14:160
+# Theme adds *fog* (dense mist) on the Barrow-Downs :)
+L:88:94:210:2:199:4
+A:96:80:97:19:57:1:57:97
+A:100:0:0
+O:20:20:20:20
+F:PRINCIPAL | FLAT
+F:FILL_METHOD_3
+R:25:1
+M:UNDEAD
+R:75:0
+
+# The Additional dungeons
+
+# Mount Doom
+# Levels 85-99
+N:5:Orodruin
+D:MDm:a way to the top of the Mount Doom.
+W:85:99:18:0:14:160
+L:86:90:205:10:1:0
+A:177:100:0:0:0:0:85:87
+O:10:10:30:30
+E:2d10:10:FIRE
+F:CAVE | LAVA_RIVER | NO_RECALL | NO_STREAMERS
+F:FILL_METHOD_0 | NO_EASY_MOVE
+R:100:1
+M:IM_FIRE
+
+# Nether Realm
+# Levels 666-696 (!!!)
+# guarded by Tik'srvzllat, who has the Ring 'Fuin'
+N:6:Nether Realm
+D:Nth:a magical portal to the Nether Realm.
+W:666:696:40:0:14:160
+L:102:80:86:15:85:5
+A:85:80:87:20:87:0:57:85
+A:50:50:0
+O:25:25:25:25
+E:10d10:3:NETHER
+F:EMPTY | FORGET | NO_BREATH | NO_EASY_MOVE | NO_SHAFT
+F:ADJUST_LEVEL_2 | NO_RECALL | NO_STREAMERS
+F:LAVA_RIVER | FINAL_GUARDIAN_1032 | FINAL_ARTIFACT_203
+F:FILL_METHOD_2 | NO_RECALL_OUT
+R:5:0
+R:95:3
+M:RES_NETH | R_CHAR_G | R_CHAR_W | R_CHAR_U
+
+# The Lost Land of Numenor
+# levels 35-50
+# guarded by Ar-Pharazon the Golden, who has the stone "Coimir".
+N:7:Submerged Ruins
+D:Num:a submerged way to the lost land of Numenor.
+W:35:50:25:0:14:160
+L:84:95:187:5:1:0
+A:187:80:84:10:56:10:57:187
+A:60:0:40
+O:30:30:10:10
+E:1d1:1:ACID
+F:NO_STREAMERS
+F:FINAL_GUARDIAN_980 | FINAL_ARTIFACT_204
+F:FILL_METHOD_3 | WATER_BREATH
+R:20:0
+R:80:3
+M:AQUATIC | CAN_SWIM | CAN_FLY
+
+# Used for astral mode
+N:8:Halls of Waiting
+D:HWa:*A BUG*YOU should see this message!*
+W:1:98:1:0:14:160
+L:1:100:1:0:1:0
+O:20:20:20:20
+A:56:100:56:0:56:0:57:58
+F:RANDOM_TOWNS | NO_RECALL | NO_SHAFT
+F:FILL_METHOD_0
+R:100:2
+M:UNIQUE
+
+# Cirith Ungol
+# levels 25-50
+# guarded by Shelob.
+# Updated for Theme to lead out into Gorgoroth a la Moria
+N:9:Cirith Ungol
+D:CUg:an entrance to Cirith Ungol.
+W:25:50:10:0:14:160
+L:87:5:88:65:16:30
+A:97:90:16:10:56:0:16:58
+O:30:30:30:10
+E:4d4:20:POISON
+F:FINAL_GUARDIAN_481
+F:RANDOM_TOWNS | CIRCULAR_ROOMS
+F:FILL_METHOD_2
+F:FORCE_DOWN
+F:WILD_65_56__67_53
+R:2:0
+R:49:3
+M:SPIDER | R_CHAR_a | R_CHAR_I |
+R:49:3
+M:ORC | R_CHAR_w | R_CHAR_m | R_CHAR_j
+
+# The Heart of the Earth
+# levels 25-36
+# guarded by Golgarach, the Living Rock
+N:10:Heart of the Earth
+D:HoE:a passage leading into the very heart of the world.
+W:25:36:10:0:14:160
+L:1:100:1:0:1:0
+A:56:100:56:0:56:0:57:58
+O:40:10:10:20
+G:life
+F:EVOLVE | FINAL_GUARDIAN_1035 | NO_RECALL | NO_SHAFT
+R:40:3
+M:R_CHAR_# | R_CHAR_X | R_CHAR_g | R_CHAR_E |
+R:30:3
+M:PASS_WALL | KILL_WALL | HURT_ROCK
+R:30:0
+
+# The Void
+# Levels 128-150
+# Where Melkor lurks for the final battle!
+N:11:The Void
+D:Vod:a jumpgate to the Void
+W:128:150:40:0:20:160
+L:183:97:102:3:0:0
+A:183:90:102:10:0:0:102:102
+A:40:60:0
+O:25:25:25:25
+E:20d6:100:DARK
+F:EMPTY | FORGET | NO_BREATH | NO_EASY_MOVE | NO_RECALL_OUT | NO_RECALL |
+F:ADJUST_LEVEL_1_2 | ADJUST_LEVEL_1 | NO_STREAMERS | NO_SHAFT
+F:FILL_METHOD_2
+F:FINAL_GUARDIAN_1044 |
+R:1:0
+R:99:3
+M:UNDEAD | DEMON | DRAGON | NONLIVING | SPIRIT
+
+# TEST dungeon
+N:12:Test
+D:Tst:a way to test dungeon gen
+W:1:10:1:0:14:160
+L:88:78:89:18:199:4
+L:0:95:5
+A:177:100:0:0:0:0:85:87
+A:100:0:0
+O:20:20:20:20
+F:FILL_METHOD_3 | SMALL
+R:100:0
+G:dungeon2
+
+
+# The Paths of the Dead
+# levels 40-70
+# Feagwath is there, guarding Doomcaller
+N:16:Paths of the Dead
+D:PoD:the entrance to the Paths of the Dead.
+W:40:70:18:0:24:100
+L:88:85:84:15:1:0
+A:56:75:87:25:56:0:57:58
+O:30:30:30:2
+E:1d1:20:RAISE
+F:FINAL_GUARDIAN_804 | FINAL_ARTIFACT_91
+F:FILL_METHOD_3
+R:5:0
+R:10:3
+M:R_CHAR_p
+R:85:3
+M:UNDEAD | NONLIVING
+
+# The Illusory Castle
+# levels 35-52
+# Guarded by The Glass Golem guarding The Helm of Knowledge
+N:17:Illusory Castle
+D:Ill:an entrance to the Illusory Castle.
+W:35:52:10:0:24:100
+L:1:98:188:2:1:0
+A:56:50:189:50:56:0:57:58
+O:50:10:20:20
+E:6d2:6:CONFUSION
+F:RANDOM_TOWNS | NO_STREAMERS
+F:FINAL_GUARDIAN_1033 | FINAL_ARTIFACT_160
+F:FILL_METHOD_1
+R:30:0
+R:70:3
+M:STUPID | WEIRD_MIND | SHAPECHANGER | ATTR_MULTI | CHAR_MULTI | RAND_25 |
+M:RAND_50 | EMPTY_MIND | INVISIBLE | PASS_WALL | KILL_WALL
+S:BR_CONF | BR_CHAO | BA_CHAO | CONF | FORGET | TRAPS | MULTIPLY
+
+# The Maze
+# Levels 25-37
+# Guarded by The Minotaur of the Labyrinth with the Steel Helm of Hammerhand
+N:18:Maze
+D:Maz:a small tunnel leading to a maze of twisty little passages, all alike.
+W:25:37:15:0:20:160
+L:1:100:1:0:1:0
+A:56:98:48:2:56:0:57:58
+O:2:40:10:40
+G:maze
+F:SMALLEST | FORGET
+F:FINAL_GUARDIAN_1029 | FINAL_ARTIFACT_38
+R:80:0
+R:20:3
+M:R_CHAR_p
+
+# The Orc Cave
+# levels 10-22
+# There is Azog with the Wand of Thrain at the bottom
+N:19:Orc Cave
+D:Orc:a dark tunnel leading to an Orc Cave.
+W:10:22:8:0:35:200
+L:88:100:1:0:1:0
+A:97:100:56:0:56:0:57:97
+O:5:50:10:25
+F:RANDOM_TOWNS |
+F:FINAL_OBJECT_810 | FINAL_GUARDIAN_373 | CAVE |
+F:FILL_METHOD_0
+F:FORCE_DOWN
+F:WILD_21_49__51_19
+R:30:3
+M:TROLL
+R:20:0
+R:50:3
+M:ORC | R_CHAR_o | R_CHAR_O
+
+# Erebor
+# levels 60-72
+# There is Glaurung
+N:20:Erebor
+D:Ere:a tunnel leading into depths of the Lonely Mountain.
+W:60:72:35:0:20:140
+L:88:100:1:0:1:0
+A:97:90:87:10:56:0:57:97
+O:40:40:40:40
+F:BIG | LAVA_RIVER | CAVERN | NO_RECALL | NO_STREAMERS
+F:CAVE | DOUBLE | FINAL_GUARDIAN_715 |
+F:FILL_METHOD_2
+R:10:0
+R:60:1
+M:DRAGON | R_CHAR_D
+R:30:1
+M:DRAGON | R_CHAR_d
+
+# The Old Forest
+# levels 13-25
+# Old Man Willow protects it
+N:21:The Old Forest
+D:OFr:a path into the Old Forest.
+W:13:25:5:0:15:100
+L:88:76:84:16:199:8
+L:68:16:16
+A:96:100:56:0:56:0:202:96
+O:20:5:15:30
+F:WATER_RIVERS | NO_DOORS | NO_DESTROY | FLAT | NO_STREAMERS
+F:RANDOM_TOWNS | FINAL_GUARDIAN_206
+F:FILL_METHOD_3
+R:30:0
+R:40:3
+M:ANIMAL
+R:30:3
+M:UNDEAD | R_CHAR_h | R_CHAR_l
+
+# The Mines of Moria
+# levels 30-50
+# There is Durin's Bane
+N:22:Moria
+D:MoM:a stone door leading to the Mines of Moria.
+W:30:50:20:0:40:40
+L:88:100:1:0:1:0
+A:97:100:56:0:56:0:57:97
+O:30:50:10:5
+F:FINAL_GUARDIAN_872 | WATER_RIVER | NO_STREAMERS
+F:FORCE_DOWN
+F:RANDOM_TOWNS
+F:WILD_45_30__44_37
+F:FILL_METHOD_0
+R:40:3
+M:ORC
+R:30:3
+M:TROLL | GIANT
+R:20:3
+M:DEMON
+R:10:0
+
+# The tower of Dol Guldur
+# Levels 57-70
+# The Necromancer (weak Sauron) at the bottom, with the Ring of Durin
+N:23:Dol Guldur
+D:TDG:a gate leading to the tower of Dol Guldur.
+W:57:70:34:0:24:160
+L:1:80:174:20:1:0
+A:56:100:56:0:56:0:57:58
+O:20:1:70:9
+F:SMALL | FINAL_GUARDIAN_819 | FINAL_ARTIFACT_205
+F:FILL_METHOD_3
+R:30:3
+M:R_CHAR_p | R_CHAR_P
+R:10:3
+M:ORC | TROLL
+R:20:3
+M:UNDEAD
+R:30:3
+M:DEMON | DRAGON
+R:10:0
+
+# Dungeons from Variaz
+
+# The Small Water Cave
+# levels 32-34
+# The Watcher in the Water is at the bottom
+N:24:The Small Water Cave
+D:SWC:the entrance to a small water cave.
+W:32:34:20:0:14:160
+L:84:100:84:0:84:0
+A:97:100:56:0:56:0:57:58
+O:10:10:30:30
+E:1d1:20:ACID
+F:FINAL_GUARDIAN_517 | NO_RECALL
+F:FILL_METHOD_0
+R:10:0
+R:10:3
+M:AQUATIC
+R:40:1
+M:IM_COLD
+S:BA_WATE
+R:40:3
+M:IM_COLD
+
+# The Land of Mountains
+# Trone the rebel Thunderlord is hiding here, with
+# the Robe of Curunir (Theme update as Trone's coat is gone)
+# Levels 45-70
+N:25:The Sacred Land Of Mountains
+D:LoM:the way to the Sacred Land of Mountains.
+W:45:70:20:0:14:160
+L:89:100:89:0:89:0
+A:97:100:56:0:56:0:97:97
+O:20:20:20:20
+F:RANDOM_TOWNS | FLAT | NO_STREAMERS
+F:FINAL_GUARDIAN_789 | FINAL_ARTIFACT_228
+F:FILL_METHOD_0
+R:60:3
+M:CAN_FLY
+R:40:0
+
+# The Land of Rhun
+# levels 26-40
+# Guarded by Ulfang the Black, Morgoth's first Easterling follower.
+N:26:The Land Of Rhun
+D:LoR:a way to the Land of Rhun.
+W:26:40:15:0:14:160
+L:89:100:1:0:1:0
+A:89:50:96:25:84:25:57:58
+O:20:20:20:20
+F:RANDOM_TOWNS | FLAT | NO_STREAMERS | FINAL_GUARDIAN_990
+F:FILL_METHOD_1
+R:30:3
+M:R_CHAR_p | R_CHAR_h | R_CHAR_l
+R:30:3
+M:ANIMAL
+R:40:0
+
+# The Withered Heath
+# level 22-30
+# guarded by the Sandworm Queen (and her children), who will drop her armour
+N:27:The Withered Heath
+D:SwL:the Withered Heath, from whence came the Great Worms.
+W:22:30:12:0:5:200
+L:91:85:94:10:93:5
+A:98:100:96:0:84:0:94:94
+O:15:5:60:20
+F:NO_DOORS | SAND_VEIN |
+F:FINAL_GUARDIAN_1030 | FINAL_ARTIFACT_153
+F:FILL_METHOD_0
+R:100:1
+M:R_CHAR_w
+R:10:3
+S:MULTIPLY
+
+# Used by the death fate
+N:28:Death fate
+D:Dth:a fated death.
+W:1:1:1:0:30:255
+L:1:100:1:0:1:0
+A:1:100:1:0:1:0:1:1
+O:1:1:1:1
+F:EMPTY | SMALLEST | NO_RECALL | NO_STREAMERS
+F:FILL_METHOD_0
+R:100:0
+
+# The Grinding Ice
+# levels 20-40
+# Guarded by Elenwe the Lost
+N:29:The Helcaraxe
+D:Ice:the entrance to the Grinding Ice of the Helcaraxe.
+W:20:40:10:0:14:160
+L:90:0:88:70:84:30
+L:90:0:10
+A:95:0:56:100:56:0:57:58
+A:100:0:0
+O:20:20:20:20
+E:1d4:15:COLD
+F:DOUBLE | WATER_RIVER | CAVERN | NO_STREAMERS
+F:FINAL_GUARDIAN_1034 |
+F:FILL_METHOD_2
+R:100:1
+M:IM_COLD
+
+# The Lost Temple of "..player.pgod.."
+# Generated in god quest.
+# Most dungeon attributes altered during the quest.
+# See god.lua for details
+N:30:a Lost Temple
+D:LTm:the entrance to a lost temple.
+W:1:50:1:0:14:160
+L:1:100:1:0:1:0
+A:56:100:56:0:56:0:57:58
+O:20:20:20:20
+F:FILL_METHOD_4 | NO_RECALL
+R:100:0
+
+### New dungeons added for Theme module ###
+
+
+# Forodwaith
+# levels 75-80
+# Guarded by The Hunter
+N:31:Forodwaith
+D:NWa:a path leading through the wastelands of the North
+W:75:80:40:0:14:160
+# ice, ash, and dirt
+L:90:20:93:40:88:40
+#Ugly - using floor tiles for walls, only rooms have real walls
+A:90:20:93:40:88:40:88:211
+O:20:20:20:20
+# it is always dark here in the northern wastelands
+E:2d4:1:DARK
+F:NO_DOORS | CAVERN | COLD | NO_DESTROY | EMPTY | FLAT |
+F:NO_RECALL | LIFE_LEVEL | NO_STREAMERS | NO_SHAFT |
+F:FINAL_GUARDIAN_389 |
+F:FILL_METHOD_4
+R:100:3
+M:COLD_BLOOD | HURT_LITE | IM_COLD
+
+# Emyn Luin
+# levels 60-70
+# Guarded by Naugladur, who has Nauglamir
+N:32:Emyn Luin
+D:ELu:a path into the depths of the Blue Mountains
+W:60:70:30:0:14:160
+# grass, flowers, and dirt
+L:89:45:81:5:88:50
+# blue mountains, granite, hailstones
+A:215:100:215:0:215:0:56:211
+# lots of treasure, not much magic
+O:50:20:10:30
+F:CAVE | CAVERN | CIRCULAR_ROOMS | RANDOM_TOWNS |
+F:NO_STREAMERS | NO_RECALL | NO_DESTROY
+# no_recall because it should not be so easy to get Nauglamir. :P
+F:FINAL_GUARDIAN_457 | FINAL_ARTIFACT_6
+F:FILL_METHOD_3
+R:100:0
+M:R_CHAR_k | R_CHAR_o
+
+#Dol Amroth - Castle of Prince Imrahil
+#levels 25-35
+#Guarded by Prince Imrahil (yes, he's evil in this game)
+N:33:Dol Amroth
+D:DAm:a way to the top of the castle of Dol Amroth
+W:25:35:15:0:14:160
+# Vanilla-style
+L:1:100:1:0:1:0
+A:56:100:56:0:56:0:57:58
+O:20:20:20:20
+F:SMALLEST | NO_DESTROY | TOWER | RANDOM_TOWNS |
+F:ADJUST_LEVEL_1 | NO_STREAMERS | NO_SHAFT | NO_STAIR |
+F:NO_EASY_MOVE | FILL_METHOD_2
+F:FINAL_GUARDIAN_402 |
+R:80:3
+M:R_CHAR_p | R_CHAR_P
+R:20:3
+M:SMART | TAKE_ITEM
+
+#Angmar
+#levels 80-90
+#Guarded by Fuinur, who has Eowyn's sword
+N:34:Angmar
+D:WRA:a dark path through the Witch Realm of Angmar
+W:80:90:49:0:14:160
+# Tainted, dark, evil
+L:93:70:174:20:226:10
+# Dark mountain chains only
+A:214:100:214:0:214:0:214:214
+O:20:20:20:20
+# In addition to swamp water poison, we have disenchantment
+E:1d1:1:DISENCHANT
+F:ADJUST_LEVEL_1_2 | NO_DOORS | NO_STREAMERS |
+F:HOT | FLAT | NO_SHAFT | NO_NEW_MONSTER | CIRCULAR_ROOMS |
+F:FINAL_GUARDIAN_242 | FINAL_ARTIFACT_110
+F:FILL_METHOD_2
+R:50:0
+R:50:3
+M:RES_DISE | UNDEAD | DEMON | NONLIVING
+
+#Near Harad
+#levels 20-25
+#Guarded by Herumor, who has the heavy crossbow of Umbar
+N:35:Near Harad
+D:NHa:a desert path into Near Harad
+W:20:25:15:0:14:160
+#It's a desert, so sand and only sand
+L:91:100:91:0:91:0
+#Ugly - using floor tiles for walls, only rooms have real walls
+A:91:100:91:0:91:0:98:91
+O:20:20:20:20
+#Living is slow in the desert, heh :)
+E:1d1:1:INERTIA
+F:NO_DOORS | CAVE | CAVERN | HOT | NO_DESTROY | EMPTY | FLAT
+F:RANDOM_TOWNS | NO_STREAMERS | NO_SHAFT |
+F:FINAL_GUARDIAN_395 | FINAL_ARTIFACT_171
+F:FILL_METHOD_4
+#It's a desert (sort of wilderness) so WILD_TOO monsters, plus the 'p's for the Haradrim
+R:30:0
+R:70:3
+M:WILD_TOO | R_CHAR_p
+
+#Isengard - Orc Cave on steroids.
+#levels 35-40
+#It ends in a special level with the Palantir of Orthanc and Sharkey
+N:36:Isengard
+D:Isg:a passage to the caves beneath Isengard
+W:35:40:20:0:14:160
+# Like the Orc caves
+L:88:100:1:0:1:0
+A:97:100:56:0:56:0:57:97
+O:20:20:20:20
+F:CAVE | ADJUST_LEVEL_2 | NO_STREAMERS |
+F:FILL_METHOD_0
+R:20:0
+R:30:3
+M:TROLL | R_CHAR_T |
+R:50:3
+M:ORC | R_CHAR_o | R_CHAR_O
+
+# Tol Eressea - of course you never actually set foot on Tol Eressea ;)
+# levels 40-45
+# Guarded by Marda and the Robe of Belegaer
+N:37:Tol Eressea
+D:TEr:a way to the Lonely Isle
+W:40:45:40:0:14:160
+# shallow water, lilies
+L:84:60:222:40:222:0
+# Going to have to add walls here to avoid being overly nasty
+A:211:100:211:0:211:0:211:211
+# As little loot as possible, this is open water, after all
+O:1:1:1:1
+F:SMALLEST | NO_DOORS | NO_DESTROY | EMPTY | FLAT |
+F:ADJUST_LEVEL_1 | NO_STREAMERS | NO_SHAFT | NO_NEW_MONSTER |
+F:FINAL_GUARDIAN_791 | FINAL_ARTIFACT_219 |
+F:FILL_METHOD_0
+R:1:0
+R:99:1
+M:R_CHAR_B
+
+#Utumno
+#levels 101-127
+#Guarded by no one (yet!)
+N:38:Utumno
+D:Utu:an entrance to the depths of Utumno
+W:101:127:30:0:14:160
+L:1:100:1:0:1:0
+A:56:100:56:0:56:0:57:58
+O:20:20:20:20
+F:CAVERN | NO_EASY_MOVE | NO_RECALL
+F:ADJUST_LEVEL_1_2 | ADJUST_LEVEL_1
+F:FILL_METHOD_0
+R:100:0
+
+# Bilbo's trail in the Barrow-downs
+# just one special level that later becomes a different one, sans princess.
+N:39:Bilbo's trail
+D:Btr:a trail left by a fleeing hobbit
+W:10:10:1:0:14:160
+L:88:94:210:2:199:4
+A:96:80:97:19:57:1:57:97
+A:100:0:0
+O:20:20:20:20
+F:FLAT
+F:FILL_METHOD_3
+R:25:1
+M:UNDEAD
+R:75:0
+
+# Thorin's trail in Mirkwood
+# just one special level that later becomes a different one, sans princess.
+N:40:Thorin's trail
+D:Ttr:a trail left by a purposeful dwarf
+W:33:33:15:0:14:160
+L:89:95:199:5:88:0
+A:96:100:97:0:56:0:202:96
+O:20:20:20:20
+F:NO_DOORS | NO_DESTROY | FLAT
+F:FILL_METHOD_0
+R:100:0
+
+# N:<index>:<name>
+# D:<3 letter short name>:<long name>
+# W:<min depth>:<max depth>:<min player level>:<next dungeon>:<min alloc>:<max alloc chance>
+# L:<floor1>:<%1>:<floor2>:<%2>:<floor3>:<%3>
+# A:<wall1>:<%1>:<wall2>:<%2>:<wall3>:<%3>:<outer wall>:<inner wall>
+# O:<%treasure>:<%combat>:<%magic>:<%tools>
+# E:<dices>d<sides>:<frequency>:<attack type>
+# F:<flags>
+# R:<percent>:<flags mode>
+# M:<monster flags>
+# S:<monster spells>
+# 0 = No restriction
+# 1 = AND
+# 2 = NAND
+# 3 = OR
+# 4 = NOR
diff --git a/lib/mods/theme/edit/dragons.map b/lib/mods/theme/edit/dragons.map
new file mode 100644
index 00000000..164c97c8
--- /dev/null
+++ b/lib/mods/theme/edit/dragons.map
@@ -0,0 +1,43 @@
+# permanent wall
+F:X:61:0
+
+# Mountain Chain
+F:^:97:0
+
+# granite
+F:#:57:0
+
+# up staircase
+F:<:6:0
+
+# Dirt
+F:.:88:0
+
+# Dungeon layout
+D:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+D:X^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^X
+D:X^^^^^.....................^^^^^X
+D:X^^^.........................^^^X
+D:X^^...........................^^X
+D:X^^...........................^^X
+D:X^.............................^X
+D:X^.............................^X
+D:X^.............................^X
+D:X^.............................^X
+D:X^.............................^X
+D:X^.............................^X
+D:X^.............................^X
+D:X^.............................^X
+D:X^.............................^X
+D:X^.............................^X
+D:X^.............................^X
+D:X^^...........................^^X
+D:X^^...........................^^X
+D:X^^^........................<^^^X
+D:X^^^^^.....................^^^^^X
+D:X^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^X
+D:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+
+# Starting position
+P:6:6
+
diff --git a/lib/mods/theme/edit/e_info.txt b/lib/mods/theme/edit/e_info.txt
new file mode 100644
index 00000000..72b8348e
--- /dev/null
+++ b/lib/mods/theme/edit/e_info.txt
@@ -0,0 +1,3007 @@
+# File: e_info.txt
+
+
+# This file is used to initialize the "lib/data/e_info.raw" file, which is
+# used to initialize the "ego-item" information for the Angband game.
+
+# 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/data/e_info.raw" file.
+
+# The ego-item indexes are defined in "defines.h", and must not be changed.
+
+# Note that every "ego-item" type has a different "index", and can only be
+# created from items that belong to a certain "slot" in the equipment, if
+# one assumes that "ammo" belongs to an imaginary slot (23). However, it
+# is possible for several "ego-item" types to have the same "textual name",
+# such as with "Armor of Resistance" and "Shield of Resistance".
+
+# === Understanding e_info.txt ===
+
+# N: serial number : ego type
+# D: description
+# T: tval : min sval : max sval
+# R: rarity
+# X: position : slot : rating
+# W: depth : rarity1 : rarity2 : cost
+# C: to-hit : to-dam : to-ac : pval
+# r:N:needed flags on the base object
+# r:F:forbidden flags on the base object
+# Z: granted_power
+# F: flags
+
+# 'N' indicated the beginning of an entry. The serial number must increase
+# for each new item.
+
+# 'D' contains description. This field is currently not supported.
+
+# 'T' is for possible tval and sval value of the base item.
+# Up to 5 entries are possible.
+
+# 'R' stands for rarity, or randomness. It specifies percentual chance
+# of generated item to have following 'F' flags. I.e. 'R:40' followed
+# by 'F:SPEED' means, that 40% of item of this ego type will boost speed.
+
+# 'X' is for extra information. Position value 'A' means that ego-type name
+# will appear after base-item name ('Robe of Permanence'), value 'B' means
+# that ego-type name will appear before base-item name ('Elven Plate Mail').
+# Slot is determining in which equipment slots item could be equipped. This
+# value is currently ignored. Rating determines how level feeling will be
+# affected.
+
+# 'W' is for extra information. Depth is the depth the object is normally
+# found at, rarity determines how common the object is and cost is the items
+# value.
+
+# 'C' stands for 'creation'. It determines maximal to-hit, to-damage, AC and
+# stats (pval) values item can get.
+
+# 'Z' is granted power. See tables.c, array powers_type_init (lines 4511-4943).
+
+# 'F' contains flags. Most are self explaining, rest could be found in source.
+
+
+
+# Version stamp (required)
+
+V:2.0.0
+
+### Mage Staff ###
+
+N:1:of Mana
+X:A:24:20
+T:6:0:99
+W:5:3:8:10000
+C:-30:-30:0:3
+R:100
+F:MANA
+f:MANA
+R:70
+F:PVAL_M2
+
+N:2:of Power
+X:A:24:30
+T:6:0:99
+W:5:5:8:20000
+C:-30:-30:0:10
+R:100
+F:SPELL
+f:SPELL
+R:70
+F:PVAL_M2
+
+N:3:of Wizardry
+X:A:24:60
+T:6:0:99
+W:10:1:8:50000
+C:-40:-40:0:3
+R:100
+F:MANA | SPELL
+R:50
+F:PVAL_M2
+
+N:4:of Spell
+T:6:0:99
+X:A:24:60
+W:0:2:8:40000
+C:0:0:0:0
+R:100
+F:ACTIVATE
+F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD
+
+### Body Armor ###
+
+N:5:of Resist Acid
+T:36:0:99
+T:37:0:99
+X:A:30:16
+W:0:4:20:1000
+R:100
+F:RES_ACID | IGNORE_ACID
+f:RES_ACID | IGNORE_ACID
+
+N:6:of Resist Lightning
+T:36:0:99
+T:37:0:99
+X:A:30:10
+W:0:4:20:400
+R:100
+F:RES_ELEC | IGNORE_ELEC
+f:RES_ELEC | IGNORE_ELEC
+
+N:7:of Resist Fire
+T:36:0:15
+T:36:17:99
+T:37:0:99
+X:A:30:14
+W:0:4:20:800
+R:100
+F:RES_FIRE | IGNORE_FIRE
+f:RES_FIRE | IGNORE_FIRE
+
+N:8:of Resist Cold
+T:36:0:15
+T:36:17:99
+T:37:0:99
+X:A:30:12
+W:0:4:20:600
+R:100
+F:RES_COLD | IGNORE_COLD
+f:RES_COLD | IGNORE_COLD
+
+N:9:of Resistance
+T:36:0:99
+T:37:0:99
+X:A:30:20
+W:0:2:20:12500
+C:0:0:10:0
+R:100
+F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD |
+F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD
+f:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD |
+R:25
+F:R_HIGH
+
+N:10:Elven
+T:36:0:99
+T:37:0:99
+X:B:30:25
+W:0:2:20:15000
+C:0:0:10:3
+R:100
+F:STEALTH | ESP_ORC
+f:STEALTH
+F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD |
+F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD
+F:OLD_RESIST
+R:25
+F:RES_POIS
+
+# Robe
+N:11:of Permanence
+T:36:2:2
+X:A:30:30
+W:0:1:10:30000
+C:0:0:10:0
+R:100
+F:SUST_STR | SUST_DEX | SUST_CON | SUST_INT | SUST_WIS | SUST_CHR |
+F:HOLD_LIFE | RES_ACID | RES_ELEC | RES_FIRE | RES_COLD |
+F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD
+F:OLD_RESIST
+R:2
+F:R_IMMUNITY
+
+# Armour of Dunharrow - built on Filthy rags of leprousness
+N:12:of Dunharrow
+T:35:0:99
+T:36:0:99
+T:37:0:99
+X:A:30:0
+W:0:1:10:0
+C:0:0:0:-6
+R:100
+F:CON | STR | R_STAT | CURSED | HEAVY_CURSE | AGGRAVATE
+# No CURSE_NO_DROP here, players seems to unlike surprises
+
+# Mithirl & Galvorn mails & PDSM
+N:13:of Immunity
+T:37:25:25
+T:37:30:30
+T:38:30:30
+X:A:30:40
+W:60:10:100:30000
+C:0:0:5:0
+R:100
+F:R_IMMUNITY
+
+# Ego DSM
+N:14:of Defense
+T:38:0:99
+X:A:30:5
+W:20:40:100:1000
+C:0:0:8:0
+R:100
+F:SUSTAIN
+
+# Boots of Jumping
+N:15:of Jumping
+T:30:0:99
+X:A:35:16
+W:0:3:27:500
+C:0:0:0:3
+Z:blink
+R:100
+F:ACTIVATE
+a:HARDCORE=JUMP
+
+### Shields ###
+
+N:16:of Resist Acid
+T:115:56:56
+T:34:0:5
+T:34:7:99
+X:A:32:16
+W:0:6:22:1000
+R:100
+F:RES_ACID | IGNORE_ACID
+f:RES_ACID | IGNORE_ACID
+
+N:17:of Resist Lightning
+T:34:0:5
+T:34:7:99
+T:115:56:56
+X:A:32:10
+W:0:6:22:400
+R:100
+F:RES_ELEC | IGNORE_ELEC
+f:RES_ELEC | IGNORE_ELEC
+
+N:18:of Resist Fire
+T:34:0:5
+T:34:7:99
+T:115:56:56
+X:A:32:14
+W:0:6:22:800
+R:100
+F:RES_FIRE | IGNORE_FIRE
+f:RES_FIRE | IGNORE_FIRE
+
+N:19:of Resist Cold
+T:115:56:56
+T:34:0:5
+T:34:7:99
+X:A:32:12
+W:0:6:22:600
+R:100
+F:RES_COLD | IGNORE_COLD
+f:RES_COLD | IGNORE_COLD
+
+N:20:of Resistance
+T:115:56:56
+T:34:0:5
+T:34:7:99
+X:A:32:20
+W:0:2:22:12500
+C:0:0:10:0
+R:100
+F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD |
+f:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD |
+F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD
+
+N:21:of Reflection
+T:115:56:56
+T:34:0:5
+T:34:7:99
+X:A:32:20
+W:0:2:22:15000
+C:0:0:5:0
+R:100
+F:REFLECT
+f:REFLECT
+F:IGNORE_ELEC | IGNORE_ACID | IGNORE_COLD | IGNORE_FIRE
+
+# Metal shields only
+N:22:of Electricity
+T:34:3:3
+T:34:5:5
+T:34:10:10
+X:A:32:10
+W:0:2:22:400
+R:100
+F:RES_ELEC | IGNORE_ELEC | SH_ELEC
+f:SH_ELEC
+
+### Crowns and Helms ###
+
+N:23:of the Noldor
+T:115:57:57
+T:32:0:6
+T:32:8:99
+X:A:33:13
+C:0:0:0:2
+W:0:1:8:500
+R:100
+F:DEX | SUST_DEX | ACTIVATE | ESP_ORC
+a:HARDCORE=NOLDOR
+
+N:24:of Intelligence
+X:A:33:13
+C:0:0:0:2
+W:0:2:15:500
+T:32:0:6
+T:32:8:99
+T:115:57:57
+R:100
+F:INT | SUST_INT
+f:INT
+
+N:25:of Wisdom
+X:A:33:13
+W:0:2:15:500
+C:0:0:0:2
+T:32:0:6
+T:32:8:99
+T:115:57:57
+R:100
+F:WIS | SUST_WIS
+f:WIS
+
+N:26:of Beauty
+X:A:33:8
+W:0:2:15:1000
+C:0:0:0:4
+T:32:0:6
+T:32:8:99
+T:115:57:57
+R:100
+F:CHR | SUST_CHR
+f:CHR
+
+# 40% chance of increase spell power
+N:27:of the Magi
+X:A:33:15
+W:0:1:8:7500
+C:0:0:0:3
+T:33:0:99
+R:100
+F:INT | SUST_INT |
+F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD |
+F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD
+F:ABILITY | R_HIGH
+R:40
+F:SPELL
+R:50
+F:SPELL_CONTAIN | WIELD_CAST
+
+N:28:of Gondor
+X:A:33:19
+W:0:1:8:2000
+C:0:0:0:3
+T:32:0:99
+T:33:0:99
+R:100
+F:STR | DEX | CON | SUST_STR | SUST_DEX | SUST_CON | FREE_ACT
+F:R_HIGH
+
+N:29:of Arnor
+X:A:33:17
+W:0:1:8:2000
+C:0:0:0:3
+T:32:0:99
+T:33:0:99
+R:100
+F:WIS | CHR | SUST_WIS | SUST_CHR
+F:R_HIGH
+
+N:30:of Seeing
+X:A:33:8
+W:0:1:8:1000
+C:0:0:0:5
+T:32:0:6
+T:32:8:99
+T:33:0:99
+T:115:57:57
+R:100
+F:SEARCH | RES_BLIND | SEE_INVIS
+f:SEARCH
+R:20
+F:ESP_ALL
+
+N:31:of Infravision
+X:A:33:11
+W:0:1:15:500
+C:0:0:0:5
+T:32:0:6
+T:32:8:99
+T:115:57:57
+R:100
+F:INFRA | HIDE_TYPE
+f:INFRA
+
+N:32:of Light
+X:A:33:6
+W:0:2:15:500
+T:32:0:6
+T:32:8:99
+T:115:57:57
+R:100
+F:LITE1 | RES_LITE
+f:LITE1
+
+N:33:of Telepathy
+X:A:33:20
+W:0:1:8:50000
+T:33:0:99
+R:100
+F:ESP_ALL
+f:ESP_ALL
+
+N:34:of Regeneration
+X:A:33:10
+W:0:1:8:1500
+T:32:0:6
+T:32:8:99
+T:33:0:99
+T:115:57:57
+R:100
+F:REGEN
+f:REGEN
+
+N:35:of Teleportation
+X:A:33:0
+W:0:1:7:50
+T:32:0:6
+T:32:8:99
+T:115:57:57
+R:100
+F:TELEPORT
+f:TELEPORT
+R:90
+F:CURSED
+
+N:36:of Stupidity
+X:A:33:0
+C:0:0:0:-5
+W:0:2:7:0
+T:32:0:6
+T:32:8:99
+T:115:57:57
+R:100
+F:INT | CURSED
+f:INT
+# No CURSE_NO_DROP here, players seems to unlike surprises
+
+N:37:of Naivety
+X:A:33:0
+C:0:0:0:-5
+W:0:2:7:0
+T:32:0:6
+T:32:8:99
+T:115:57:57
+R:100
+F:WIS
+f:WIS
+
+N:38:of Ugliness
+X:A:33:0
+C:0:0:0:-5
+W:0:1:7:0
+T:32:0:6
+T:32:8:99
+T:115:57:57
+R:100
+F:CHR
+f:CHR
+
+N:39:of Sickliness
+X:A:33:0
+C:0:0:0:-5
+W:0:1:7:0
+T:33:0:99
+R:100
+F:STR | DEX | CON
+
+N:40:Dwarven
+T:32:0:6
+T:32:8:99
+X:B:33:13
+C:0:0:0:2
+W:0:1:8:500
+R:100
+F:INFRA | CON | RES_FIRE | ESP_TROLL | ESP_DRAGON
+
+
+### Cloaks ###
+
+N:41:of Protection
+X:A:31:10
+W:0:4:19:1500
+C:0:0:10:0
+T:35:0:99
+R:100
+F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD | RES_SHARDS
+
+N:42:of Eriador
+X:A:31:10
+W:0:8:18:500
+C:0:0:0:3
+T:35:0:99
+R:100
+F:STEALTH
+f:STEALTH
+R:10
+F:LUCK
+f:LUCK
+
+N:43:of Aman
+X:A:31:20
+W:0:1:28:4000
+C:0:0:20:3
+T:35:0:99
+R:100
+F:STEALTH |
+f:STEALTH |
+F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD
+F:OLD_RESIST
+
+# Aura, Fire
+N:44:of Immolation
+X:A:31:16
+W:0:1:18:4000
+C:0:0:4:0
+T:35:0:99
+R:100
+F:IGNORE_ACID | IGNORE_FIRE | SH_FIRE | RES_FIRE
+f:SH_FIRE
+
+N:45:of Enveloping
+X:A:31:0
+W:0:1:3:0
+C:-10:-10:0:0
+T:35:0:99
+R:100
+F:SHOW_MODS
+
+N:46:of Vulnerability
+X:A:31:0
+W:0:1:3:0
+C:0:0:-50:0
+T:35:0:99
+R:100
+F:AGGRAVATE
+
+N:47:of Irritation
+X:A:31:0
+W:0:1:3:0
+C:-15:-15:0:0
+T:35:0:99
+R:100
+F:AGGRAVATE | SHOW_MODS
+
+# Aura, Electricity
+N:48:of Electricity
+X:A:31:16
+W:0:1:18:4000
+C:0:0:4:0
+T:35:0:99
+R:100
+F:IGNORE_ACID | IGNORE_ELEC | SH_ELEC | RES_ELEC
+
+### Gloves ###
+
+N:49:of Free Action
+X:A:34:11
+W:0:4:10:1000
+T:31:0:99
+R:100
+F:FREE_ACT
+f:FREE_ACT
+
+N:50:of Slaying
+X:A:34:17
+W:0:3:10:1500
+C:6:6:0:0
+T:31:0:99
+R:100
+F:SHOW_MODS
+
+N:51:of Agility
+X:A:34:14
+W:0:2:10:1000
+C:0:0:0:5
+T:31:0:99
+R:100
+F:DEX | HIDE_TYPE
+f:DEX
+
+N:52:of Power
+T:31:0:99
+X:A:34:22
+W:0:1:10:2500
+C:5:5:0:5
+R:100
+F:STR | SHOW_MODS | HIDE_TYPE
+f:STR
+F:R_HIGH
+
+# 53 Gauntlets only
+N:53:of Peace
+X:A:34:0
+W:0:1:3:0
+C:-10:-10:0:0
+T:31:2:2
+R:100
+F:HEAVY_CURSE | CURSED
+
+# 54 Gloves only
+N:54:of Charming
+X:A:34:5
+T:31:1:1
+W:0:1:11:400
+C:0:0:0:6
+R:100
+F:CHR
+R:33
+F:STEALTH
+f:STEALTH
+
+N:55:of Weakness
+T:31:0:99
+X:A:34:0
+W:0:1:3:0
+C:0:0:0:-10
+R:100
+F:STR
+
+N:56:of Clumsiness
+X:A:34:0
+W:0:1:3:0
+C:0:0:0:-10
+R:100
+F:DEX
+T:31:0:99
+
+
+### Boots ###
+
+N:57:of Levitation
+X:A:35:7
+W:0:8:27:250
+T:30:0:99
+R:100
+F:FEATHER
+f:FEATHER
+R:40
+F:R_HIGH
+
+N:58:of Eriador
+X:A:35:16
+W:0:8:27:500
+C:0:0:0:3
+T:30:0:99
+R:100
+F:STEALTH
+f:STEALTH
+R:10
+F:LUCK
+f:LUCK
+
+N:59:of Free Action
+X:A:35:15
+W:0:5:27:1000
+T:30:0:99
+R:100
+F:FREE_ACT
+f:FREE_ACT
+
+N:60:of Rohan
+X:A:35:25
+W:0:1:27:200000
+C:0:0:0:10
+T:30:0:99
+R:100
+F:SPEED | HIDE_TYPE
+f:SPEED
+R:10
+F:PVAL_M3
+
+# 61 Metal boots only
+
+N:61:of Dwarvish Endurance
+X:A:35:15
+W:0:1:20:5000
+C:0:0:0:6
+T:30:6:6
+R:100
+F:CON | INFRA | RES_DARK
+R:33
+F:STR
+
+N:62:of Noise
+X:A:35:0
+W:0:1:3:0
+T:30:0:99
+R:100
+F:AGGRAVATE
+f:AGGRAVATE
+
+N:63:of Slowness
+X:A:35:0
+W:0:1:3:0
+C:0:0:0:-5
+T:30:0:99
+R:100
+F:SPEED
+f:SPEED
+
+N:64:of Annoyance
+X:A:35:0
+W:0:1:3:0
+C:0:0:0:-10
+T:30:0:99
+R:100
+F:SPEED | AGGRAVATE
+
+
+### Weapons ###
+
+N:65:of Aman
+T:21:0:99
+T:22:0:99
+T:23:0:99
+T:24:0:99
+X:A:24:30
+W:0:2:44:20000
+C:6:6:4:3
+R:100
+F:WIS |
+F:SLAY_EVIL | SLAY_UNDEAD | SLAY_DEMON |
+F:SEE_INVIS | BLESSED | RES_FEAR | ESP_EVIL
+F:SUSTAIN | LIMIT_BLOWS
+R:10
+F:BLOWS
+R:1
+F:PVAL_M1
+
+N:66:(Defender)
+T:125:0:99
+T:15:0:99
+T:21:0:99
+T:22:0:99
+T:23:0:99
+T:24:0:99
+X:A:24:25
+W:0:2:44:15000
+C:4:4:8:4
+R:100
+F:STEALTH |
+f:STEALTH |
+F:FREE_ACT | SEE_INVIS | FEATHER | REGEN |
+F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD |
+F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD
+F:SUSTAIN | R_HIGH
+R:33
+F:RES_POIS
+
+N:67:Blessed
+T:21:0:99
+T:22:0:99
+T:23:0:99
+T:24:0:99
+X:B:24:20
+W:0:1:44:5000
+C:0:0:0:3
+R:100
+F:WIS | ESP_GOOD
+F:BLESSED | ABILITY
+f:BLESSED
+
+N:68:of Greater Life
+T:21:0:99
+T:22:0:99
+T:23:0:99
+T:24:0:99
+T:115:55:55
+X:A:24:20
+W:0:1:50:30000
+C:5:5:0:3
+r:N:MUST2H
+R:100
+F:LIFE | HOLD_LIFE
+f:LIFE
+
+N:69:of Westernesse
+T:15:0:99
+T:21:0:99
+T:22:0:99
+T:23:0:99
+T:24:0:99
+X:A:24:20
+W:0:2:44:20000
+C:5:5:0:2
+R:100
+F:STR | DEX | CON |
+F:SLAY_ORC | SLAY_TROLL | SLAY_GIANT |
+F:FREE_ACT | SEE_INVIS | ESP_ORC | ESP_TROLL | ESP_GIANT
+R:33
+F:RES_FEAR
+R:50
+F:RES_MORGUL
+
+N:70:of Extra Attacks
+T:125:0:99
+T:21:0:99
+T:22:0:99
+T:23:0:99
+T:24:0:99
+T:115:55:55
+X:A:24:20
+W:0:1:44:10000
+C:0:0:0:3
+R:100
+F:BLOWS
+f:BLOWS
+
+N:71:of Slaying
+T:125:0:99
+T:15:0:99
+T:21:0:99
+T:22:0:99
+T:23:0:99
+T:24:0:99
+T:115:55:55
+X:A:24:15
+W:0:2:44:2500
+C:0:0:0:0
+R:100
+F:SLAY_WEAP | WOUNDING
+
+N:72:of Spinning
+T:125:0:99
+T:21:0:99
+T:22:0:99
+T:23:0:99
+T:24:0:99
+T:115:55:55
+X:A:24:18
+W:0:1:44:9000
+C:8:8:0:2
+R:100
+F:DEX | STR | VORPAL | ACTIVATE
+a:HARDCORE=SPIN
+
+# The "Elemental" brands (4) (6)
+
+N:73:Acidic
+T:125:0:99
+T:15:0:99
+T:21:0:99
+T:22:0:99
+T:23:0:99
+T:24:0:99
+T:115:55:55
+X:B:24:15
+W:0:4:44:5000
+R:100
+F:BRAND_ACID | RES_ACID | IGNORE_ACID
+f:BRAND_ACID
+
+N:74:Shocking
+T:125:0:99
+T:15:0:99
+T:21:0:99
+T:22:0:99
+T:23:0:99
+T:24:0:99
+T:115:55:55
+X:B:24:20
+W:0:4:44:4500
+R:100
+F:BRAND_ELEC | RES_ELEC | IGNORE_ELEC
+f:BRAND_ELEC
+
+N:75:Fiery
+T:125:0:99
+T:15:0:99
+T:21:0:99
+T:22:0:99
+T:23:0:99
+T:24:0:99
+T:115:55:55
+X:B:24:20
+W:0:4:44:3500
+R:100
+F:BRAND_FIRE | RES_FIRE | IGNORE_FIRE | LITE1
+f:BRAND_FIRE |
+
+N:76:Frozen
+T:125:0:99
+T:15:0:99
+T:21:0:99
+T:22:0:99
+T:23:0:99
+T:24:0:99
+T:115:55:55
+X:B:24:15
+W:0:4:44:3000
+R:100
+F:BRAND_COLD | RES_COLD | IGNORE_COLD
+f:BRAND_COLD |
+
+N:77:Venomous
+T:125:0:99
+T:15:0:99
+T:21:0:99
+T:22:0:99
+T:23:0:99
+T:24:0:99
+T:115:55:55
+X:B:24:20
+W:0:4:44:4000
+R:100
+F:BRAND_POIS | RES_POIS
+f:BRAND_POIS |
+
+N:78:Chaotic
+T:125:0:99
+T:21:0:99
+T:22:0:99
+T:23:0:29
+T:23:31:99
+T:24:0:99
+T:115:55:55
+X:B:24:28
+W:0:1:44:10000
+R:100
+F:CHAOTIC | RES_CHAOS | IGNORE_ELEC | IGNORE_ACID | IGNORE_FIRE
+f:CHAOTIC
+F:R_ANY
+
+N:79:Sharp
+T:125:0:99
+T:23:0:99
+T:24:0:99
+T:115:55:55
+X:B:24:20
+W:0:2:44:5000
+R:100
+F:VORPAL
+f:VORPAL
+
+N:80:of Earthquakes
+T:125:0:99
+T:21:0:99
+T:115:55:55
+X:A:24:20
+W:0:1:44:4000
+C:10:10:0:6
+R:100
+F:IMPACT | STR | TUNNEL | HIDE_TYPE
+f:IMPACT
+
+# The "Slay" brands (8)
+
+N:81:of Slay Animal
+T:15:0:99
+T:21:0:99
+T:22:0:99
+T:23:0:99
+T:24:0:99
+T:115:55:55
+X:A:24:18
+W:0:6:44:3500
+R:100
+F:SLAY_ANIMAL
+f:SLAY_ANIMAL
+
+N:82:of Slay Evil
+T:15:0:99
+T:125:0:99
+T:21:0:99
+T:22:0:99
+T:23:0:99
+T:24:0:99
+T:115:55:55
+X:A:24:18
+W:0:6:44:3500
+R:100
+F:SLAY_EVIL
+f:SLAY_EVIL
+
+N:83:of Slay Undead
+T:15:0:99
+T:21:0:19
+T:21:21:99
+T:22:0:99
+T:23:0:99
+T:24:0:99
+T:115:55:55
+X:A:24:18
+W:0:6:44:3500
+R:100
+F:SLAY_UNDEAD
+f:SLAY_UNDEAD
+
+N:84:of Slay Demon
+T:15:0:99
+T:125:0:99
+T:21:0:99
+T:22:0:99
+T:23:0:99
+T:24:0:99
+T:115:55:55
+X:A:24:14
+W:0:6:44:2500
+R:100
+F:SLAY_DEMON
+f:SLAY_DEMON
+
+N:85:of Slay Orc
+T:15:0:99
+T:21:0:99
+T:22:0:99
+T:23:0:99
+T:24:0:99
+T:115:55:55
+X:A:24:10
+W:0:6:44:2500
+R:100
+F:SLAY_ORC
+f:SLAY_ORC
+
+N:86:of Slay Troll
+T:15:0:99
+T:21:0:99
+T:22:0:99
+T:23:0:99
+T:24:0:99
+T:115:55:55
+X:A:24:10
+W:0:6:44:2500
+R:100
+F:SLAY_TROLL
+f:SLAY_TROLL
+
+N:87:of Slay Giant
+T:15:0:99
+T:21:0:99
+T:22:0:99
+T:23:0:99
+T:24:0:99
+T:115:55:55
+X:A:24:14
+W:0:6:44:2500
+R:100
+F:SLAY_GIANT
+f:SLAY_GIANT
+
+N:88:of Slay Dragon
+T:15:0:99
+T:21:0:99
+T:22:0:99
+T:23:0:99
+T:24:0:99
+T:115:55:55
+X:A:24:18
+W:0:6:44:3500
+R:100
+F:SLAY_DRAGON
+f:SLAY_DRAGON
+
+# The "Kill" brands (8)
+
+N:89:of *Slay Animal*
+T:15:0:99
+T:21:0:99
+T:22:0:99
+T:23:0:99
+T:24:0:99
+T:115:55:55
+X:A:24:20
+W:0:2:44:6000
+C:0:0:0:2
+R:100
+F:INT | SLAY_ANIMAL | SLOW_DIGEST | STEALTH | ESP_ANIMAL
+f:SLAY_ANIMAL | STEALTH
+
+N:90:of *Slay Evil*
+T:125:0:99
+T:21:0:99
+T:22:0:99
+T:23:0:99
+T:24:0:99
+T:115:55:55
+X:A:24:20
+W:0:2:44:6000
+C:0:0:0:2
+R:100
+F:WIS | SLAY_EVIL | BLESSED | ESP_EVIL | RES_FEAR | ABILITY
+f:SLAY_EVIL |
+
+N:91:of *Slay Undead*
+T:125:0:99
+T:15:0:99
+T:21:0:99
+T:22:0:99
+T:23:0:99
+T:24:0:99
+T:115:55:55
+X:A:24:24
+W:0:2:44:8000
+C:0:0:0:2
+R:100
+F:WIS | KILL_UNDEAD | SEE_INVIS | ESP_UNDEAD | RES_NETHER
+f:KILL_UNDEAD |
+
+N:92:of *Slay Demon*
+T:125:0:99
+T:15:0:99
+T:21:0:99
+T:22:0:99
+T:23:0:99
+T:24:0:99
+T:115:55:55
+X:A:24:16
+W:0:2:44:8000
+C:0:0:0:2
+R:100
+F:INT | KILL_DEMON | ESP_DEMON | RES_FIRE | RES_CHAOS
+f:KILL_DEMON |
+
+N:93:of *Slay Orc*
+T:15:0:99
+T:21:0:99
+T:22:0:99
+T:23:0:99
+T:24:0:99
+T:115:55:55
+X:A:24:14
+W:0:2:44:4000
+C:0:0:0:2
+R:100
+F:DEX | SLAY_ORC | ESP_ORC | SUST_DEX |
+f:SLAY_ORC |
+
+N:94:of *Slay Troll*
+T:15:0:99
+T:21:0:99
+T:22:0:99
+T:23:0:99
+T:24:0:99
+T:115:55:55
+X:A:24:14
+W:0:2:44:4000
+C:0:0:0:2
+R:100
+F:STR | SLAY_TROLL | ESP_TROLL | REGEN | SUST_STR
+f:SLAY_TROLL |
+
+N:95:of *Slay Giant*
+T:15:0:99
+T:21:0:99
+T:22:0:99
+T:23:0:99
+T:24:0:99
+T:115:55:55
+X:A:24:16
+W:0:2:44:4000
+C:0:0:0:2
+R:100
+F:STR | SLAY_GIANT | ESP_GIANT | RES_SHARDS | SUST_STR
+f:SLAY_GIANT |
+
+N:96:of *Slay Dragon*
+T:15:0:99
+T:21:0:99
+T:22:0:99
+T:23:0:99
+T:24:0:99
+T:115:55:55
+X:A:24:24
+W:0:2:44:8000
+C:0:0:0:2
+R:100
+F:CON | KILL_DRAGON | ESP_DRAGON | RES_FEAR |
+f:KILL_DRAGON
+F:R_LOW | R_ELEM
+R:20
+F:RES_POIS
+
+N:97:Vampiric
+T:125:0:99
+T:23:0:99
+T:115:55:55
+X:B:24:25
+W:0:2:44:10000
+C:0:0:0:-2
+R:100
+F:LIFE | VAMPIRIC | HOLD_LIFE
+f:LIFE | VAMPIRIC
+
+N:98:(*Defender*)
+T:21:0:99
+T:22:0:99
+T:23:0:99
+T:24:0:99
+X:A:24:35
+W:0:1:100:50000
+C:-15:-15:20:4
+R:100
+F:STEALTH | RES_POIS | DEX | CON | WIS | HOLD_LIFE |
+f:STEALTH
+F:FREE_ACT | SEE_INVIS | FEATHER | REGEN |
+F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD |
+F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD
+F:R_ANY | R_LOW | SUSTAIN
+R:30
+F:R_ANY | R_LOW | SUSTAIN
+R:20
+F:R_ANY | R_LOW | SUSTAIN | R_HIGH
+R:10
+F:R_IMMUNITY | R_ANY
+
+# 'of the Thunderlords' renamed to 'of Tulkas' and picked up some new flags:) --furiosity
+N:99:of Tulkas
+T:15:0:99
+T:21:0:99
+T:22:0:99
+T:23:0:99
+T:24:0:99
+X:A:24:22
+W:10:6:90:45000
+C:4:4:0:2
+a:HARDCORE=TELEPORT
+R:100
+F:SLAY_EVIL | KILL_DRAGON | TELEPORT | FREE_ACT | SEARCH | BRAND_ELEC
+F:REGEN | SLOW_DIGEST | RES_MORGUL | ACTIVATE | ESP_DRAGON
+R:50
+F:RES_NEXUS | HOLD_LIFE
+R:30
+F:R_HIGH | KILL_UNDEAD
+R:12
+F:ABILITY | KILL_DEMON
+R:2
+F:R_P_ABILITY | PVAL_M3 | LIMIT_BLOWS
+
+N:100:of Gondolin
+T:21:0:99
+T:22:0:99
+T:23:0:99
+T:24:0:99
+X:A:24:26
+W:0:1:44:25000
+C:7:7:0:3
+R:100
+F:STR | CON | ESP_EVIL | RES_FEAR |
+F:SLAY_EVIL | SLAY_TROLL | SLAY_DRAGON | SLAY_DEMON |
+F:FREE_ACT | SEE_INVIS | LITE1 | RES_DARK | ABILITY |
+F:IGNORE_ACID | IGNORE_FIRE
+R:33
+F:R_HIGH
+R:33
+F:HOLD_LIFE
+R:22
+F:DEX
+
+# Diggers only
+
+N:101:of Digging
+T:20:0:99
+X:A:24:4
+W:0:1:2:500
+C:0:0:0:5
+R:100
+F:TUNNEL |
+f:TUNNEL |
+F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD
+
+# More weapons
+
+N:102:Spectral
+T:125:0:99
+T:21:0:99
+T:22:0:99
+T:23:0:99
+T:24:0:99
+T:115:55:55
+X:B:24:30
+W:0:1:5:5000
+R:100
+F:SLAY_UNDEAD | SEE_INVIS | HOLD_LIFE | DRAIN_HP
+F:ACTIVATE
+a:HARDCORE=SPECTRAL
+
+N:103:of Morgul
+T:125:0:99
+T:21:0:99
+T:22:0:99
+T:23:0:99
+T:24:0:99
+T:115:55:55
+X:A:24:0
+W:0:1:1:0
+C:-20:-20:-10:-10
+R:100
+F:LUCK
+F:SEE_INVIS | AGGRAVATE | HEAVY_CURSE | CURSED | BLACK_BREATH | DRAIN_EXP |
+F:AUTO_CURSE | WOUNDING
+# No CURSE_NO_DROP here, players seems to unlike surprises
+
+N:104:of Angmar
+T:125:0:99
+T:15:0:99
+T:21:0:99
+T:22:0:99
+T:23:0:99
+T:24:0:99
+X:A:24:0
+W:0:1:2:0
+C:-100:-100:0:0
+R:100
+F:NEVER_BLOW | HEAVY_CURSE | CURSED | AUTO_CURSE
+
+
+### Missile Launchers ###
+
+N:105:of Accuracy
+T:19:0:99
+T:15:0:99
+X:A:25:10
+W:0:8:21:1000
+C:15:5:0:0
+
+N:106:of Power
+T:19:0:99
+T:15:0:99
+X:A:25:10
+W:0:8:21:1000
+C:5:15:0:0
+
+N:107:of Extra Might
+T:19:0:99
+X:A:25:20
+W:0:4:21:10000
+C:5:10:0:1
+R:100
+F:XTRA_MIGHT | PVAL_M3 | R_ANY
+f:XTRA_MIGHT |
+
+N:108:of Extra Shots
+T:19:0:99
+X:A:25:20
+C:10:5:0:1
+W:0:4:21:10000
+R:100
+F:XTRA_SHOTS | PVAL_M2
+f:XTRA_SHOTS |
+
+# Bows only
+N:109:of Lothlorien
+T:19:12:13
+X:A:25:20
+W:50:2:21:30000
+C:10:10:0:2
+R:100
+F:DEX | XTRA_MIGHT | FREE_ACT | IGNORE_ACID | IGNORE_FIRE | HIDE_TYPE |
+F:BLESSED | ABILITY
+
+# Crossbows only
+N:110:of the Haradrim
+T:19:23:24
+X:A:25:30
+W:50:2:21:20000
+C:5:15:0:1
+R:100
+F:XTRA_MIGHT | XTRA_SHOTS | IGNORE_ACID | IGNORE_FIRE | HIDE_TYPE
+
+# Slings only
+N:111:of Buckland
+X:A:25:25
+W:40:2:21:20000
+C:8:8:0:2
+T:19:1:1
+R:100
+F:DEX | XTRA_SHOTS | XTRA_MIGHT | IGNORE_ACID | IGNORE_FIRE | HIDE_TYPE
+
+
+### Ammo ###
+
+N:112:of Slay Animal
+T:16:0:99
+T:17:0:99
+T:18:0:99
+X:A:23:10
+W:0:2:12:25
+R:100
+F:SLAY_ANIMAL
+f:SLAY_ANIMAL
+
+N:113:of Slay Evil
+T:16:0:99
+T:17:0:99
+T:18:0:99
+X:A:23:10
+W:0:2:12:25
+R:100
+F:SLAY_EVIL
+f:SLAY_EVIL
+
+N:114:of Slay Undead
+T:16:0:99
+T:17:0:99
+T:18:0:99
+X:A:23:10
+W:0:1:12:35
+R:100
+F:SLAY_UNDEAD
+f:SLAY_UNDEAD
+
+N:115:of Venom
+T:16:0:99
+T:17:0:2
+T:18:0:2
+X:A:23:10
+R:100
+F:BRAND_POIS
+f:BRAND_POIS
+W:0:2:12:25
+
+N:116:of Acid
+T:16:0:99
+T:17:0:99
+T:18:0:99
+X:A:23:10
+R:100
+F:BRAND_ACID | IGNORE_ACID
+f:BRAND_ACID |
+W:0:1:12:30
+
+# 117 All Elements at once - melee weapon
+N:117:Elemental
+X:B:24:30
+W:10:1:50:26000
+T:21:0:99
+T:22:0:99
+T:23:0:99
+T:24:0:99
+R:100
+F:BRAND_ACID | RES_ACID | IGNORE_ACID
+F:BRAND_ELEC | RES_ELEC | IGNORE_ELEC
+F:BRAND_FIRE | RES_FIRE | IGNORE_FIRE
+F:BRAND_COLD | RES_COLD | IGNORE_COLD
+F:BRAND_POIS | RES_POIS | DRAIN_MANA
+f:BRAND_ACID |
+f:BRAND_ELEC |
+f:BRAND_FIRE |
+f:BRAND_COLD |
+f:BRAND_POIS |
+
+N:118:of Slay Demon
+T:16:0:99
+T:17:0:99
+T:18:0:99
+X:A:23:10
+W:0:1:12:35
+R:100
+F:SLAY_DEMON
+f:SLAY_DEMON
+
+N:119:of Slay Dragon
+T:16:0:99
+T:17:0:99
+T:18:0:99
+X:A:23:10
+R:100
+F:SLAY_DRAGON
+f:SLAY_DRAGON
+W:0:1:12:35
+
+N:120:of Slaying
+X:A:23:15
+W:0:1:12:20
+C:12:12:0:0
+R:100
+F:DAM_DIE
+
+N:121:of Lightning
+T:16:0:99
+T:17:0:99
+T:18:0:99
+X:A:23:10
+R:100
+F:BRAND_ELEC | IGNORE_ELEC
+f:BRAND_ELEC |
+W:0:1:12:30
+
+N:122:of Flame
+T:16:0:99
+T:17:0:99
+T:18:0:99
+X:A:23:10
+R:100
+F:BRAND_FIRE | IGNORE_FIRE
+f:BRAND_FIRE |
+W:0:2:12:25
+
+N:123:of Frost
+T:16:0:99
+T:17:0:99
+T:18:0:99
+X:A:23:10
+R:100
+F:BRAND_COLD | IGNORE_COLD
+f:BRAND_COLD |
+W:0:2:12:25
+
+N:124:of Wounding
+T:16:0:99
+T:17:0:99
+T:18:0:99
+X:A:23:5
+W:0:3:12:20
+C:6:6:0:0
+
+N:125:of Backbiting
+T:16:0:99
+T:17:0:99
+T:18:0:99
+X:A:23:0
+W:0:1:2:0
+C:-50:-50:0:0
+
+
+### Special Broken Items ###
+
+# Destroyed Weapon
+N:126:Shattered
+T:16:0:99
+T:17:0:99
+T:18:0:99
+X:B:24:0
+W:0:1:2:0
+C:-5:-5:0:0
+
+# Destroyed Body Armor
+
+N:127:Blasted
+T:16:0:99
+T:17:0:99
+T:18:0:99
+X:B:30:0
+W:0:1:2:0
+C:0:0:-10:0
+
+
+# Instruments
+
+N:128:of the Eldar
+T:14:0:59
+T:14:61:99
+X:A:25:20
+W:0:2:3:1000
+C:0:0:0:0
+R:100
+F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD |
+F:RES_ACID | CHR | SEE_INVIS
+F:R_ANY | PVAL_M2
+R:25
+F:PVAL_M1
+
+N:129:of Power
+T:14:0:59
+T:14:61:99
+X:A:25:20
+W:0:1:3:2000
+C:0:0:0:0
+R:100
+F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD | SUST_CHR |
+F:RES_FIRE | RES_COLD | RES_ELEC | RES_ACID | CHR | SEE_INVIS
+F:R_ANY | PVAL_M3
+R:50
+F:PVAL_M1
+R:35
+F:PVAL_M1
+
+# Horn, now four different ego items (for different GF_ values)
+# see items 181, 182 & 183.
+N:130:Dragon
+T:14:60:60
+X:B:25:20
+W:0:1:2:2000
+C:0:0:0:0
+R:100
+F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD | ACTIVATE
+F:R_ANY | PVAL_M2
+R:50
+F:PVAL_M1
+R:25
+F:PVAL_M1
+a:HARDCORE=BA_ACID_H
+
+# Rods ego
+N:131:Capacity of
+T:67:0:99
+X:A:51:10
+W:0:2:10:1000
+C:0:0:0:0
+R:100
+F:CAPACITY
+f:CAPACITY
+
+N:132:Cheapness of
+T:67:0:99
+X:A:51:10
+W:0:2:10:700
+C:0:0:0:0
+R:100
+F:CHEAPNESS
+f:CHEAPNESS
+
+N:133:Quickness of
+T:67:0:99
+X:A:51:15
+W:0:3:10:1100
+C:0:0:0:0
+R:100
+F:FAST_CAST
+f:FAST_CAST
+
+N:134:Charging of
+T:67:0:99
+X:A:51:15
+W:0:2:10:1500
+C:0:0:0:0
+R:100
+F:CHARGING
+f:CHARGING
+
+N:135:the Istari of
+T:67:0:99
+X:A:51:10
+W:0:1:10:10000
+C:0:0:0:0
+R:100
+F:CAPACITY | CHARGING | CHEAPNESS | FAST_CAST |
+
+### Lights ###
+
+N:136:of Boldness
+X:A:0:5
+T:39:0:99
+W:0:1:5:1000
+Z:remove fear
+
+N:137:of Fearlessness
+X:A:0:5
+T:39:0:99
+W:0:1:10:1500
+R:100
+F:RES_FEAR
+
+N:138:of Illumination
+X:A:0:5
+T:39:0:99
+W:0:3:10:1000
+Z:illuminate
+R:10
+F:LITE1
+R:5
+F:LITE2
+R:2
+F:LITE3
+
+N:139:of Brightness
+X:A:0:5
+T:39:0:99
+W:0:3:10:1000
+R:100
+F:LITE1
+f:LITE1
+R:60
+F:LITE2
+R:30
+F:LITE3
+R:30
+F:RES_DARK
+
+N:140:of *Brightness*
+X:A:0:9
+T:39:0:99
+W:0:1:40:5000
+R:100
+F:LITE1
+F:LITE2
+F:LITE3
+f:LITE1
+f:LITE2
+f:LITE3
+F:RES_DARK
+
+N:141:of the Shadows
+X:A:0:6
+T:39:0:99
+W:0:1:20:3000
+C:0:0:0:2
+R:100
+F:INVIS
+R:70
+F:RES_DARK
+R:50
+F:RES_LITE
+
+N:142:of Infravision
+X:A:0:3
+T:39:0:99
+W:0:1:10:700
+C:0:0:0:3
+R:100
+F:INFRA
+f:INFRA
+
+N:143:of the Eternal Eye
+X:A:0:7
+T:39:0:99
+W:0:3:40:4000
+C:0:0:0:0
+R:100
+F:RES_BLIND | SEE_INVIS
+
+N:144:of the Ethereal Eye
+X:A:0:7
+T:39:0:99
+W:0:3:40:4000
+C:0:0:0:0
+Z:magic map
+
+N:145:of Fading
+X:A:0:0
+T:39:2:99
+W:0:1:1:0
+C:0:0:0:0
+R:100
+F:FUEL_LITE
+
+# Armor (dwarven): must be heavy metal, and not rusty chain mail
+
+N:146:Dwarven
+T:37:2:99
+X:B:30:18
+W:0:2:20:5000
+C:0:0:15:2
+R:100
+F:STR | CON | INFRA | FREE_ACT | HIDE_TYPE |
+F:RES_FEAR | RES_DARK | SUST_STR | SUST_CON |
+F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD
+
+# Magical: affects soft armour, gloves, cloaks
+
+N:147:Magical
+X:B:0:2
+T:31:0:99
+T:35:0:99
+T:36:0:99
+T:40:0:99
+T:45:0:99
+W:5:1:10:2000
+C:0:0:0:0
+R:100
+F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD
+f:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD
+R:50
+F:SPELL_CONTAIN | WIELD_CAST
+f:SPELL_CONTAIN | WIELD_CAST
+
+# Ring and Amulet egos
+
+N:148:Cursed
+X:B:0:0
+T:40:0:99
+T:45:0:99
+W:0:1:10:0
+C:0:0:0:0
+R:100
+F:AUTO_CURSE
+f:AUTO_CURSE
+
+# Scrolls & school spellbooks & staves
+N:149:Fireproof
+X:B:0:1
+T:70:0:99
+T:111:0:99
+T:55:0:99
+W:0:1:10:1000
+C:0:0:0:0
+R:100
+F:IGNORE_FIRE
+f:IGNORE_FIRE
+
+# Wands & Staffs(NOT wishing nor nothing)
+N:150:of Plenty
+X:A:0:1
+T:55:0:29
+T:55:32:99
+T:65:0:29
+T:65:31:99
+W:0:1:20:1000
+C:0:0:0:3
+R:100
+F:PVAL_M5 | PVAL_M3
+R:50
+F:PVAL_M5 | PVAL_M3
+R:10
+F:PVAL_M5 | PVAL_M3
+R:1
+F:PVAL_M5 | PVAL_M3
+
+
+### Trapping Kits ###
+
+N:151:of Extra Might
+X:A:0:5
+T:46:1:3
+W:0:1:10:1000
+C:20:20:0:2
+R:100
+F:XTRA_MIGHT
+f:XTRA_MIGHT
+
+N:152:of Extra Shots
+X:A:0:10
+T:46:0:99
+W:0:1:10:2000
+C:20:20:0:3
+R:100
+F:XTRA_SHOTS
+f:XTRA_SHOTS
+
+N:153:Automatic
+X:B:0:15
+T:46:0:99
+W:0:1:10:3000
+C:10:10:0:0
+R:100
+F:IGNORE_ACID | IGNORE_ELEC | IGNORE_COLD | IGNORE_FIRE |
+F:AUTOMATIC_5
+f:AUTOMATIC_5
+
+N:154:Fully Automatic
+X:B:0:15
+T:46:0:99
+W:0:1:15:5000
+C:10:10:0:0
+R:100
+F:IGNORE_ACID | IGNORE_ELEC | IGNORE_COLD | IGNORE_FIRE |
+F:AUTOMATIC_99
+f:AUTOMATIC_99
+
+N:155:Well-hidden
+X:B:0:5
+T:46:0:99
+W:0:1:8:1000
+C:15:15:5:12
+R:100
+F:IGNORE_ACID | IGNORE_ELEC | IGNORE_COLD | IGNORE_FIRE |
+F:STEALTH | HIDE_TYPE
+f:STEALTH
+
+N:156:Complicated
+X:B:0:10
+T:46:0:99
+W:0:1:12:2000
+C:15:15:30:0
+R:100
+F:IGNORE_ACID | IGNORE_ELEC | IGNORE_COLD | IGNORE_FIRE
+
+N:157:Obvious
+X:B:0:0
+T:46:0:99
+W:0:1:1:0
+C:-20:-20:-20:-20
+R:100
+F:STEALTH | CURSED | HIDE_TYPE
+f:STEALTH
+
+N:158:for Dragons
+X:A:0:5
+T:46:0:99
+W:0:3:10:500
+C:20:20:10:4
+R:100
+F:STEALTH | ONLY_DRAGON | HIDE_TYPE | XTRA_SHOTS |
+F:IGNORE_ACID | IGNORE_FIRE
+
+N:159:for Demons
+X:A:0:5
+T:46:0:99
+W:0:3:10:500
+C:20:20:10:4
+R:100
+F:STEALTH | ONLY_DEMON | HIDE_TYPE | XTRA_SHOTS
+F:IGNORE_ACID | IGNORE_FIRE
+
+N:160:for Animals
+X:A:0:5
+T:46:0:99
+W:0:3:10:500
+C:20:20:10:4
+R:100
+F:STEALTH | ONLY_ANIMAL | HIDE_TYPE | XTRA_SHOTS
+
+N:161:for Undead
+X:A:0:5
+T:46:0:99
+W:0:3:10:500
+C:20:20:10:4
+R:100
+F:STEALTH | ONLY_UNDEAD | HIDE_TYPE | XTRA_SHOTS | KILL_GHOST
+
+N:162:for Evil
+X:A:0:5
+T:46:0:99
+W:0:3:10:500
+C:20:20:10:4
+R:100
+F:STEALTH | ONLY_EVIL | HIDE_TYPE | XTRA_SHOTS | KILL_GHOST
+
+# Lite ego
+N:163:of the Magi
+X:A:0:0
+T:39:1:99
+W:0:1:150:2000
+C:0:0:0:3
+Z:magic map
+R:100
+F:INT | WIS | CHR
+R:60
+F:INVIS | RES_BLIND
+R:30
+F:R_HIGH
+R:30
+F:PVAL_M2
+R:50:
+F:SPELL_CONTAIN | WIELD_CAST
+
+### New ego-items added by JLE
+
+# Armor of Vulnerability (the only cursed armor) [not in Theme, it isn't!]
+N:164:of Vulnerability
+X:A:30:0
+W:0:2:20:0
+C:0:0:-50:0
+T:36:0:99
+T:37:0:99
+R:100
+F:AGGRAVATE | CURSED
+
+# Shield of Vulnerability (the only cursed shield) [not in Theme, it isn't!]
+N:165:of Vulnerability
+X:A:32:0
+W:0:2:22:0
+C:0:0:-50:0
+T:115:56:56
+T:34:0:99
+R:100
+F:AGGRAVATE | CURSED
+
+# Shield of Preservation -
+N:166:of Preservation
+X:A:32:25
+W:40:2:44:20000
+C:-10:-10:20:0
+T:115:56:56
+T:34:0:99
+R:100
+F:RES_DISEN | SUST_STR | SUST_CON | SUST_DEX | HOLD_LIFE | R_HIGH |
+F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD
+R:33
+F:R_LOW
+R:33
+F:R_LOW
+
+# Helm/Crown of Serenity
+N:167:of Serenity
+X:A:33:20
+W:35:1:15:4000
+T:32:0:6
+T:32:8:99
+T:33:0:99
+R:100
+F:RES_SOUND | RES_CONF | RES_FEAR
+
+# Crown of Night and Day
+N:168:of Night and Day
+X:A:33:18
+W:35:1:15:4000
+T:33:0:99
+R:100
+F:RES_LITE | RES_DARK | LITE1 | SEE_INVIS | RES_BLIND | IGNORE_ACID
+
+# Cloak of the Magi
+N:169:of the Magi
+X:A:31:15
+W:30:1:18:2000
+C:-5:-5:5:3
+T:35:0:99
+R:100
+F:INT | SPEED | SUST_INT | FREE_ACT | STEALTH | HIDE_TYPE | IGNORE_ACID
+R:30
+F:SPELL_CONTAIN | WIELD_CAST
+
+# Cloak of Invisibility
+N:170:of Invisibility
+X:A:31:20
+W:40:1:18:3000
+C:0:0:10:5
+T:35:0:99
+R:100
+F:STEALTH | HIDE_TYPE | INVIS
+f:INVIS
+
+# Cloak of the Bat
+N:171:of the Bat
+X:A:31:15
+W:50:1:35:3000
+C:-10:-10:10:3
+T:35:0:99
+R:100
+F:SPEED | FLY | RES_DARK | SEE_INVIS | INFRA | HIDE_TYPE | STEALTH
+
+# Leather Gloves of Thievery
+N:172:of Thievery
+X:A:34:22
+W:40:1:15:5000
+C:8:3:0:5
+T:31:1:1
+R:100
+F:DEX | SEARCH | SHOW_MODS | FEATHER | FREE_ACT | HIDE_TYPE | IGNORE_ACID
+R:10
+F:SPEED
+
+# Gauntlets and Cesti of Combat
+N:173:of Combat
+X:A:34:22
+W:50:1:15:7000
+C:6:8:-20:2
+T:31:2:99
+R:100
+F:STR | CON | SHOW_MODS | AGGRAVATE | HIDE_TYPE | IGNORE_ACID | RES_FEAR |
+F:DRAIN_HP
+R:25
+F:BLOWS
+
+# Boots of Stability
+N:174:of Stability
+X:A:35:20
+W:0:3:27:5000
+T:30:0:99
+R:100
+F:RES_NEXUS | FEATHER
+
+# Boots of Elvenkind (leather boots only)
+N:175:of Elvenkind
+X:A:35:30
+W:60:1:36:200000
+C:0:0:0:4
+T:30:2:3
+R:100
+F:STEALTH | HIDE_TYPE | FEATHER | IGNORE_ACID | IGNORE_FIRE | ABILITY
+R:50
+F:SPEED
+
+# Weapon of Fury (must be big heavy type of weapon, no daggers or whips)
+N:176:of Fury
+X:A:24:30
+W:40:1:66:20000
+T:21:12:99
+T:22:10:99
+T:23:16:99
+T:24:8:99
+T:125:0:99
+C:10:10:-20:2
+R:100
+F:STR | BLOWS | AGGRAVATE | RES_FEAR | HIDE_TYPE |
+F:IGNORE_ACID | IGNORE_FIRE | DRAIN_MANA
+
+# Staffs of wishing
+N:177:of Plenty
+X:A:0:1
+T:55:31:31
+W:0:1:20:1000
+C:0:0:0:2
+R:100
+F:PVAL_M2
+
+
+# Diggers only
+
+N:178:Magical
+T:20:0:99
+X:B:24:4
+W:0:1:10:500
+C:0:0:0:0
+Z:stone to mud
+R:100
+
+# Rod
+N:179:Simplicity of
+T:67:0:99
+X:A:51:8
+W:3:2:8:1000
+C:0:0:0:0
+R:100
+F:EASY_USE
+f:EASY_USE
+
+# Lite ego
+N:180:of Warmth
+X:A:0:0
+T:39:1:99
+W:0:1:10:500
+C:0:0:0:0
+R:100
+F:RES_COLD
+
+#Three more horn types, for different activation types...
+N:181:Dragon
+T:14:7:7
+X:B:25:20
+W:0:1:2:2000
+C:0:0:0:0
+a:HARDCORE=BA_COLD_3
+R:100
+F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD |
+
+N:182:Dragon
+T:14:7:7
+X:B:25:20
+W:0:1:2:2000
+C:0:0:0:0
+a:HARDCORE=BA_ELEC_3
+R:100
+F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD |
+
+N:183:Dragon
+T:14:7:7
+X:B:25:20
+W:0:1:2:2000
+C:0:0:0:0
+a:HARDCORE=BA_FIRE_H
+R:100
+F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD |
+
+# Helm of water breathing
+N:184:of Water Breathing
+X:A:33:13
+C:0:0:0:2
+W:15:1:25:1000
+T:32:5:10
+R:100
+F:WATER_BREATH | IGNORE_ACID
+f:WATER_BREATH
+
+# A second of life for non MUST2H weapons, much lower value tho
+N:185:of Life
+T:21:0:99
+T:22:0:99
+T:23:0:99
+T:24:0:99
+T:115:55:55
+X:A:24:20
+W:0:1:50:30000
+C:5:5:0:1
+r:F:MUST2H
+R:100
+F:LIFE | HOLD_LIFE
+f:LIFE
+
+# Cloak of Air
+N:186:of Air
+X:A:31:10
+W:30:1:35:1500
+C:0:0:0:0
+T:35:0:99
+R:100
+F:MAGIC_BREATH
+
+# Ego DSM
+N:187:Polished
+T:38:0:99
+X:B:30:5
+W:40:25:100:25000
+C:0:0:0:0
+R:100
+F:REFLECT
+
+# Ego Heavy Crossbow
+N:188:of Siegecraft
+T:19:24:24
+X:A:25:30
+W:60:5:30:30000
+C:10:15:20:2
+R:120
+F:XTRA_MIGHT | XTRA_SHOTS | REFLECT | IMMOVABLE
+
+### New ego-items from T-Plus by Ingeborg S. Norden ###
+
+# Rogue's Boots, no Metal-Shod or cursed ones allowed // Reworked to balance in Theme 1.1.5
+
+N:189:Rogue's
+X:B:35:15
+W:15:10:25:2500
+C:-5:-5:0:2
+r:F:CURSED | HEAVY_CURSE | AUTO_CURSE |
+T:30:2:3
+Z:panic hit
+R:100
+F:SEARCH
+f:SEARCH
+R:50
+F:STEALTH
+f:STEALTH
+R:25
+F:LUCK
+f:LUCK
+R:10
+F:R_HIGH |
+
+### Egos for rings, amulets and crowns (partly inspired by Multiband)
+
+# Glowing (no "Nothings", Amulets of Brilliance, or Rings of
+# Light and Darkness Resistance)
+
+N:190:Glowing
+X:B:0:5
+T:33:0:99
+T:40:0:5
+T:40:7:15
+T:45:0:38
+W:5:1:10:1250
+C:0:0:0:0
+R:100
+F:LITE1 |
+f:LITE1 |
+
+# Dazzling (as above, with more light plus resistance/granted ability)
+
+N:191:Dazzling
+X:B:0:7
+T:33:0:99
+T:40:0:5
+T:40:7:15
+T:45:0:38
+W:10:3:12:2500
+C:0:0:0:0
+Z:illuminate
+R:100
+F:LITE2 | RES_LITE |
+f:LITE2 |
+R:50
+F:LITE1 |
+f:LITE1 |
+R:25
+F:LITE3 |
+f:LITE3 |
+
+# Radiant (Dazzling with some extras;
+# no cursed jewelry)
+
+N:192:Radiant
+X:B:0:12
+T:33:0:99
+T:40:17:99
+T:45:0:38
+T:45:40:49
+T:45:51:99
+W:15:5:15:3500
+C:0:0:0:0
+Z:illuminate
+r:F:CURSED | HEAVY_CURSE | AUTO_CURSE |
+R:100
+F:LITE3 | RES_LITE |
+f:LITE3 |
+R:50
+F:LITE2 |
+f:LITE2 |
+R:25
+F:LITE1 |
+f:LITE1 |
+R:20
+F:RES_BLIND |
+R:2
+F:REFLECT |
+
+# Blazing (Glowing plus fiery sheath, resistance, undamaged by
+# fire; restrictions as per Glowing, but no Cold Resistance/Ice
+# rings either)
+
+N:193:Blazing
+X:B:0:15
+T:33:0:99
+T:40:17:99
+T:45:20:38
+T:45:40:49
+T:45:51:99
+W:15:5:15:3000
+C:0:0:0:0
+R:100
+F:LITE1 | RES_FIRE | SH_FIRE |
+f:LITE1 | SH_FIRE | IGNORE_FIRE
+R:25
+F:LITE2 |
+f:LITE2 |
+R:10
+F:LITE3 |
+f:LITE3 |
+R:2
+F:IM_FIRE |
+
+# Lucky (amulets only--resists cursing, undamaged by elements, luck
+# bonus added; no inherently cursed types or Nothing amulets)
+
+N:194:Lucky
+X:B:0:12
+T:40:2:15
+T:40:17:99
+W:15:5:15:2750
+C:0:0:0:5
+r:F:CURSED | HEAVY_CURSE | AUTO_CURSE |
+R:100
+F:BLESSED | LUCK |
+
+# Unlucky (amulets only; no Prot/Evil, Doom, or Nothing amulets)
+N:195:Unlucky
+X:B:0:0
+T:40:3:15
+T:40:17:99
+W:0:3:10:0
+C:-5:-5:-5:-5
+R:100
+F:CURSED | AUTO_CURSE | LUCK | AGGRAVATE
+R:20
+F:HEAVY_CURSE |
+
+# Armour of the Maiar (of the Chosen in T-Plus)
+
+N:196:of the Maiar
+T:36:2:99
+T:37:2:99
+X:A:30:30
+W:10:3:45:15000
+C:0:0:15:0
+R:100
+F:BLESSED | ESP_EVIL | ESP_GIANT | ESP_TROLL |
+F:FREE_ACT | RES_FEAR |
+F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD |
+F:OLD_RESIST |
+F:IGNORE_ACID | IGNORE_COLD | IGNORE_ELEC | IGNORE_FIRE |
+f:FREE_ACT | IGNORE_ACID | IGNORE_COLD | IGNORE_ELEC | IGNORE_FIRE |
+Z:berserk
+R:25
+F:R_HIGH | SUSTAIN |
+
+### Weapons of the Maiar (of the Chosen in T-Plus)
+N:197:of the Maiar
+T:15:0:99
+T:21:0:99
+T:22:0:99
+T:23:0:99
+T:24:0:99
+X:A:24:35
+W:10:5:45:30000
+C:6:6:4:3
+R:100
+F:SLAY_GIANT | SLAY_TROLL |
+F:SEE_INVIS | FREE_ACT | BLESSED | RES_FEAR |
+F:ESP_GIANT | ESP_TROLL |
+F:LIMIT_BLOWS |
+F:IGNORE_ACID | IGNORE_COLD | IGNORE_ELEC | IGNORE_FIRE |
+f:FREE_ACT | IGNORE_ACID | IGNORE_COLD | IGNORE_ELEC | IGNORE_FIRE |
+R:33
+F:ESP_EVIL | SLAY_EVIL | R_ANY |
+R:10
+F:BLOWS
+R:1
+F:PVAL_M1
+r:F:CHAOTIC | DRAIN_HP | VAMPIRIC | CURSED | HEAVY_CURSE |
+
+# Robe of Ithryn (of the Archmagi in T-Plus)
+N:198:of the Ithryn
+T:36:2:2
+X:A:30:30
+W:15:3:45:15000
+C:-5:-5:15:2
+R:100
+F:FREE_ACT | RES_BLIND | RES_CONF | R_HIGH | SUST_INT |
+F:SPELL_CONTAIN | WIELD_CAST |
+F:IGNORE_ACID | IGNORE_COLD | IGNORE_ELEC | IGNORE_FIRE |
+f:IGNORE_ACID | IGNORE_COLD | IGNORE_ELEC | IGNORE_FIRE | SUST_INT |
+r:F:CURSED | HEAVY_CURSE | AUTO_CURSE |
+R:33
+F:RES_DISEN | SPELL |
+R:10
+F:MANA |
+
+# Robe of Sanctity
+
+N:199:of Sanctity
+T:36:2:2
+X:A:30:30
+W:15:3:45:15000
+C:0:0:15:2
+R:100
+F:FREE_ACT | RES_BLIND | RES_CONF | R_HIGH | SUST_WIS |
+F:BLESSED | ACTIVATE |
+F:IGNORE_ACID | IGNORE_COLD | IGNORE_ELEC | IGNORE_FIRE |
+f:IGNORE_ACID | IGNORE_COLD | IGNORE_ELEC | IGNORE_FIRE | SUST_WIS |
+a:HARDCORE=PROT_EVIL
+r:F:CURSED | HEAVY_CURSE | AUTO_CURSE |
+R:33
+F:ESP_EVIL |
+R:10
+F:SPELL |
+
+N:200:Ethereal
+T:35:0:99
+T:36:2:2
+X:B:25:25
+W:15:2:20:27500
+C:0:0:20:0
+R:100
+F:FREE_ACT | SEE_INVIS | HOLD_LIFE |
+F:ACTIVATE |
+F:IGNORE_ACID | IGNORE_COLD | IGNORE_ELEC | IGNORE_FIRE |
+f:FREE_ACT | IGNORE_ACID | IGNORE_COLD | IGNORE_ELEC | IGNORE_FIRE |
+r:F:CURSED | HEAVY_CURSE | AUTO_CURSE |
+a:HARDCORE=SPECTRAL
+R:33
+F:RES_NETHER |
+R:5
+F:MAGIC_BREATH |
+f:MAGIC_BREATH |
+
+### More new ego-items from Annals of Ea by Feanor:
+
+# Mage staff of the Sindar
+N:201:of the Sindar
+T:6:0:99
+X:A:24:80
+W:40:25:100:25000
+C:0:0:0:5
+R:100
+F:ESP_EVIL | SPELL | MANA
+F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD
+
+# Swords of the Noldor
+N:202:of the Noldor
+T:23:0:99
+X:A:24:35
+W:40:25:100:50000
+C:15:15:20:4
+R:100
+F:STEALTH | RES_POIS | DEX | CON | WIS | HOLD_LIFE |
+f:STEALTH
+F:FREE_ACT | SEE_INVIS | FEATHER | REGEN |
+F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD |
+F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD
+F:R_ANY | R_LOW | SUSTAIN
+F:SLAY_EVIL | BLESSED | WOUNDING
+R:30
+F:R_ANY | R_LOW | SUSTAIN
+R:20
+F:R_ANY | R_LOW | SUSTAIN | R_HIGH
+R:10
+F:R_IMMUNITY | R_ANY
+
+# Spear of Vanyar
+N:203:of the Vanyar
+T:22:0:99
+R:100
+X:A:24:35
+W:40:25:100:50000
+C:15:15:20:4
+F:STEALTH | HOLD_LIFE | SEE_INVIS | WIS | INT |
+F:REGEN | RES_FEAR | RES_DARK | RES_LITE | RES_BLIND |
+F:IGNORE_ACID | IGNORE_FIRE | IGNORE_ELEC | IGNORE_COLD |
+F:SLAY_DEMON | SLAY_UNDEAD | BLESSED |
+F:R_ANY | R_LOW | SUSTAIN
+R:30
+F:R_ANY | R_LOW | SUSTAIN
+R:20
+F:R_ANY | R_LOW | SUSTAIN | R_HIGH
+R:10
+F:R_IMMUNITY | R_ANY
+
+# Axe of the Nandor
+N:204:of the Nandor
+T:24:0:99
+R:100
+X:A:24:35
+W:40:25:100:50000
+C:15:15:20:5
+F:STEALTH | SPEED | SEE_INVIS | RES_COLD | RES_ELEC |
+F:IGNORE_ACID | IGNORE_FIRE | IGNORE_COLD | IGNORE_ELEC |
+F:SLAY_ORC | SLAY_ANIMAL | RES_POIS |
+F:R_ANY | R_LOW | SUSTAIN
+R:30
+F:R_ANY | R_LOW | SUSTAIN
+R:20
+F:R_ANY | R_LOW | SUSTAIN | R_HIGH
+R:10
+F:R_IMMUNITY | R_ANY
+
+# Arrow of Teleri
+N:205:of the Teleri
+T:17:0:99
+X:A:23:10
+W:40:25:100:5000
+R:100
+F:R_ANY | WOUNDING | BLESSED
+
+# Hafted of Avari
+N:206:of the Avari
+T:21:0:99
+R:100
+X:A:24:35
+W:40:25:100:50000
+C:15:15:20:5
+F:STEALTH | INVIS | SEE_INVIS | INFRA | RES_DARK |
+F:RES_BLIND | SLAY_UNDEAD |
+F:R_ANY | R_LOW | SUSTAIN
+R:30
+F:R_ANY | R_LOW | SUSTAIN
+R:20
+F:R_ANY | R_LOW | SUSTAIN | R_HIGH
+R:10
+F:R_IMMUNITY | R_ANY
+
+### Ravenred's Weapons of Unmagic
+
+N:207:of Unmagic
+T:15:0:99
+T:21:0:99
+T:22:0:99
+T:23:0:99
+T:24:0:99
+X:A:24:24
+W:0:2:44:8000
+C:-10:-10:0:0
+R:100
+F:ANTIMAGIC_50
+f:ANTIMAGIC_50
+
+### Amulet and ring egos suggested by power
+
+#Blessed - anything but Doom
+N:208:Blessed
+T:40:0:99
+T:45:1:99
+X:B:0:10
+W:0:5:100:2000
+C:0:0:10:2
+r:F:CURSED | HEAVY_CURSE | AUTO_CURSE |
+R:100
+F:WIS | SEE_INVIS | HOLD_LIFE | BLESSED
+f:WIS | SEE_INVIS | HOLD_LIFE | BLESSED
+
+#Demonic - anything but Devotion and Protection from Evil
+N:209:Demonic
+T:40:0:1
+T:40:3:24
+T:40:26:99
+T:45:0:99
+X:B:0:10
+W:0:5:100:2000
+C:0:0:0:2
+r:F:BLESSED
+R:100
+F:ESP_DEMON | RES_FIRE
+f:ESP_DEMON | RES_FIRE
+
+# Jewellery of the Rohirrim - no speed rings
+N:210:Rohirric
+T:40:0:99
+T:45:0:30
+T:45:32:99
+X:B:0:10
+W:0:5:100:20000
+C:0:0:0:3
+r:F:CURSED | HEAVY_CURSE | AUTO_CURSE |
+R:100
+F:RES_FEAR | SPEED
+f:RES_FEAR | SPEED
+
+# Draconic - anything but Devotion and Protection from Evil
+N:211:Draconic
+T:40:0:1
+T:40:3:24
+T:40:26:99
+T:45:0:99
+X:B:0:10
+W:0:5:100:2000
+C:5:5:10:1
+r:F:BLESSED
+R:100
+F:ESP_DRAGON
+f:ESP_DRAGON
+
+#Elemental - the ones that already give resists are obviously not eligible
+N:212:Elemental
+T:40:16:28
+T:40:30:99
+T:45:10:16
+T:45:20:99
+X:B:0:30
+W:25:5:50:1000
+C:0:0:0:0
+R:100
+F:IGNORE_ACID | IGNORE_FIRE | IGNORE_COLD | IGNORE_ELEC |
+F:RES_ACID | RES_FIRE | RES_COLD | RES_ELEC | R_ANY
+R:20
+F:IM_FIRE | R_HIGH
+R:15
+F:IM_COLD | R_HIGH
+R:10
+F:IM_ELEC | R_HIGH
+R:5
+F:IM_ACID | R_HIGH
+R:1
+F:IM_NETHER
+
+### New ego-items unique to Theme module ###
+
+#Musical instruments of Melkor
+
+N:213:of Melkor
+T:14:0:59
+T:14:61:99
+X:A:0:30
+W:0:5:30:0
+C:0:0:0:-10
+R:100
+F:IGNORE_ACID | IGNORE_FIRE | IGNORE_COLD | IGNORE_ELEC |
+F:CURSED | HEAVY_CURSE | AUTO_CURSE | AGGRAVATE
+R:50
+F:R_STAT | CURSED | HEAVY_CURSE | AUTO_CURSE
+
+#Horns of Ulmo (Ulumuri)
+
+N:214:of Ulmo
+T:14:60:60
+X:A:0:80
+W:0:5:80:5000
+C:0:0:0:0
+R:100
+F:IGNORE_ACID | IGNORE_FIRE | IGNORE_COLD | IGNORE_ELEC |
+F:PVAL_M5 | R_IMMUNITY
+
+# Reverse Armour of the Maiar (of the Chosen in T-Plus)
+N:215:of the Fallen
+T:36:2:99
+T:37:2:99
+X:A:30:30
+W:0:3:45:0
+C:0:0:-15:0
+R:25
+F:CURSED | AUTO_CURSE | ESP_GOOD |
+F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD |
+R:50
+F:CURSED | AUTO_CURSE | R_LOW | SUSTAIN | AGGRAVATE
+R:75
+F:CURSED | AUTO_CURSE | WRAITH | DRAIN_EXP |
+R:100
+F:CURSED | AUTO_CURSE | DRAIN_MANA | DRAIN_HP | BLACK_BREATH
+
+###Reverse Weapons of the Maiar (of the Chosen in T-Plus)
+N:216:of the Fallen
+T:15:0:99
+T:21:0:99
+T:22:0:99
+T:23:0:99
+T:24:0:99
+X:A:24:35
+W:0:5:45:0
+C:+6:+6:-5:-3
+R:100
+F:NEVER_BLOW | IM_NETHER | PERMA_CURSE
+R:50
+F:CURSED | HEAVY_CURSE | AUTO_CURSE | NO_MAGIC | CLONE
+R:33
+F:CURSED | HEAVY_CURSE | AUTO_CURSE | DRAIN_EXP | DRAIN_MANA
+R:10
+F:CURSED | HEAVY_CURSE | AUTO_CURSE | CHAOTIC | DRAIN_HP
+R:1
+F:R_STAT | CURSED | AUTO_CURSE | ESP_GOOD |
+F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD |
+
+# Robe of Fools (reverse of Ithryn/Archmagi in T-Plus)
+N:217:of the Fools
+T:36:2:2
+X:A:30:30
+W:0:3:45:0
+C:-5:-5:-15:-2
+R:100
+F:CURSED | HEAVY_CURSE | AUTO_CURSE | LIFE
+R:33
+F:CURSED | HEAVY_CURSE | AUTO_CURSE | RES_DISEN | SPELL | NO_MAGIC |
+R:10
+F:CURSED | HEAVY_CURSE | AUTO_CURSE | MANA |
+
+# Robe of Vice (reverse of Sanctity in T-Plus)
+N:218:of Vice
+T:36:2:2
+X:A:30:30
+W:0:3:45:0
+C:0:0:-15:-2
+R:100
+F:CURSED | HEAVY_CURSE | AUTO_CURSE | LIFE | AGGRAVATE
+R:33
+F:ESP_GOOD | ANTIMAGIC_50
+
+# Soft and Hard Armour of Sensitivity, no paper armour
+N:219:of Sensitivity
+T:30:0:99
+T:31:0:99
+T:32:0:99
+T:33:0:99
+T:34:0:99
+X:A:30:30
+W:0:3:45:0
+C:0:0:-5:-2
+R:100
+F:CURSED | SENS_FIRE | R_STAT |
+
+# Elemental ammo
+N:220:Elemental
+T:16:0:99
+T:17:0:99
+T:18:0:99
+X:B:30:30
+W:0:1:50:1000
+C:5:5:0:0
+R:100
+F:BRAND_ACID | IGNORE_ACID
+F:BRAND_ELEC | IGNORE_ELEC
+F:BRAND_FIRE | IGNORE_FIRE
+F:BRAND_COLD | IGNORE_COLD
+F:BRAND_POIS |
+f:BRAND_ACID |
+f:BRAND_ELEC |
+f:BRAND_FIRE |
+f:BRAND_COLD |
+f:BRAND_POIS |
+
+# Cursed ammo
+
+N:221:of Angmar
+T:16:0:99
+T:17:0:99
+T:18:0:99
+X:A:30:30
+W:0:1:50:0
+C:-10:-10:0:0
+R:100
+F:CURSED | IMMOVABLE
+
+# Bows of Numenor
+
+N:222:of Numenor
+T:19:12:34
+X:A:50:50
+W:0:1:50:0
+C:10:10:0:3
+R:100
+F:DEX | XTRA_MIGHT | XTRA_SHOTS |
+F:RES_FEAR | RES_POIS | RES_DARK | FREE_ACT
+
+# Lights of Valinor (no refillable lights)
+
+N:223:of Valinor
+T:39:2:4
+X:A:60:60
+W:0:2:60:45000
+C:0:0:0:2
+R:100
+F:STR | INT | WIS | DEX | CON | CHR
+F:ESP_ALL
+f:STR | INT | WIS| DEX | CON | CHR | ESP_ALL
+
+# Lucky weapons - named after smith of legend
+N:224:of Telchar
+T:21:0:99
+T:22:0:99
+T:23:0:99
+T:24:0:99
+X:A:70:70
+W:10:2:70:3000
+C:10:10:0:2
+r:F:CURSED | HEAVY_CURSE | AUTO_CURSE
+R:100
+F:LUCK
+f:LUCK
+
+# Unlucky weapons - of the Din-horde (Orcs)
+N:225:of the Glamhoth
+T:21:0:99
+T:22:0:99
+T:23:0:99
+T:24:0:99
+X:A:50:50
+W:0:2:50:0
+C:5:5:0:-2
+R:100
+F:LUCK | CURSED | HEAVY_CURSE | AUTO_CURSE | AGGRAVATE
+f:LUCK | CURSED | HEAVY_CURSE | AUTO_CURSE | AGGRAVATE
+
+# Holy ammo - based on 'Of Holy Might' from Hengband
+N:226:Blessed
+T:16:0:99
+T:17:0:99
+T:18:0:99
+X:B:30:30
+W:0:5:60:600
+C:5:10:0:0
+R:100
+F:SLAY_EVIL | SLAY_DEMON | SLAY_UNDEAD | BRAND_FIRE | BLESSED
+F:IGNORE_FIRE | IGNORE_ACID
+
+# Holy Avenger weapons brought back, modified
+N:227:(Holy Avenger)
+T:21:0:99
+T:22:0:99
+T:23:0:99
+T:24:0:99
+X:A:50:50
+W:0:2:60:20000
+C:5:5:0:3
+R:100
+F:WIS | SUSTAIN |
+F:SLAY_EVIL | SLAY_UNDEAD | SLAY_DEMON |
+F:SEE_INVIS | BLESSED
+
+# A Whip of the Balroeg, adapted from Oangband
+N:228:of the Balroeg
+T:21:2:2
+X:A:50:50
+W:0:3:50:12000
+C:-10:10:0:-3
+R:100
+F:STEALTH | BRAND_FIRE | RES_FIRE | LITE2 |
+F:IGNORE_FIRE | ESP_GOOD |
+R:5
+F:IM_FIRE
+
+# Bows of the Nazgul, adapted from Angband
+N:229:of the Nazgul
+T:19:0:99
+T:15:0:99
+R:80
+X:A:25:10
+W:0:3:50:0
+C:0:0:0:-1
+r:F:BLESSED
+F:DRAIN_EXP | SEE_INVIS | CHR
+
+# Magical missile launchers
+# Tiny mana boost for magic-using archers or warrior-types
+N:230:Magical
+T:19:0:99
+T:15:0:99
+X:B:25:10
+W:25:9:30:8000
+C:0:0:0:1
+R:100
+F:MANA
+f:MANA
+
+# Magical jewelry (no rings/amulets of spell, anti-magic, cursed items)
+N:231:Magical
+X:B:0:2
+T:40:0:12
+T:40:14:26
+T:40:28:99
+T:45:0:56
+T:45:59:99
+W:5:1:10:2000
+C:0:0:0:0
+r:F:CURSED | HEAVY_CURSE | AUTO_CURSE
+R:100
+F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD
+f:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD
+R:50
+F:SPELL_CONTAIN | WIELD_CAST
+f:SPELL_CONTAIN | WIELD_CAST
+
+# Magestaves of Sorcery, added in Theme 1.0.1
+N:232:of Sorcery
+X:A:24:60
+T:6:0:99
+W:30:1:8:100000
+C:-80:-80:0:3
+r:F:CURSED | HEAVY_CURSE | PERMA_CURSE
+R:100
+F:MANA | SPELL | LIFE
+R:50
+F:PVAL_M2
+
+# Sentient weapons, added in Theme 1.0.2
+N:233:of Doriath
+T:21:0:99
+T:22:0:99
+T:23:0:99
+T:24:0:99
+X:A:70:70
+W:0:2:70:50000
+C:1:1:0:0
+r:F:CURSED | HEAVY_CURSE | AUTO_CURSE
+R:100
+F:LEVELS
+f:LEVELS
+
+# Bows of Mirkwood, added in Theme 1.0.2
+N:234:of Mirkwood
+T:19:12:13
+X:A:25:20
+W:50:2:21:50000
+C:10:10:0:2
+R:100
+F:CON | XTRA_MIGHT | XTRA_SHOTS | RES_POIS | STEALTH
+F:IGNORE_ACID | IGNORE_FIRE | HIDE_TYPE | SEE_INVIS
+
+# Spear of Mirkwood, added in Theme 1.0.2
+N:235:of Mirkwood
+T:22:2:2
+X:A:24:35
+W:40:25:100:50000
+C:15:15:20:3
+r:F:CURSED | HEAVY_CURSE | AUTO_CURSE
+R:100
+F:STEALTH | HOLD_LIFE | SEE_INVIS | CON |
+F:RES_FEAR | RES_DARK | RES_LITE | RES_BLIND |
+F:IGNORE_ACID | IGNORE_FIRE |
+F:R_ANY | R_LOW | SUSTAIN
+R:30
+F:R_ANY | R_LOW | SUSTAIN
+R:20
+F:R_ANY | R_LOW | SUSTAIN | R_HIGH
+
+# Dwarven jewelry - no speed rings; added in Theme 1.1.4
+N:236:Dwarven
+T:40:0:99
+T:45:0:30
+T:45:32:99
+X:B:0:5
+W:5:1:10:1250
+C:0:0:10:1
+R:100
+F:INFRA
+Z:stone to mud
+R:50
+F:SUSTAIN
+R:25
+F:R_ANY | SUSTAIN
+R:5
+F:CON
+
+# Sharpened arrows and bolts; added in Theme 1.1.5
+# Separating from 'Sharp' weapons to avoid cost of 5000 AU per missile
+N:237:Sharpened
+T:17:0:99
+T:18:0:99
+X:B:23:10
+W:5:2:30:400
+R:100
+F:VORPAL
+f:VORPAL
+
+# N: serial number : ego type
+# D: description
+# T: tval : min sval : max sval
+# R: rarity
+# X: position : slot : rating
+# W: depth : rarity1 : rarity2 : cost
+# C: to-hit : to-dam : to-ac : pval
+# r:N:needed flags on the base object
+# r:F:forbidden flags on the base object
+# Z: granted_power
+# F: flags
diff --git a/lib/mods/theme/edit/evil.map b/lib/mods/theme/edit/evil.map
new file mode 100644
index 00000000..a2f00914
--- /dev/null
+++ b/lib/mods/theme/edit/evil.map
@@ -0,0 +1,52 @@
+# permanent wall
+F:X:61:0
+
+# granite
+F:#:57:0
+
+# Mountain Chain
+F:^:97:0
+
+# up staircase
+F:<:6:0
+
+# Dirt
+F:.:88:0
+
+# Lesser Balrog
+F:b:88:0:996:0:0:0:0:0:0:2
+
+# Greater Balrog
+F:B:88:0:807:0:0:0:0:0:0:2
+
+# Pit Fiend
+F:P:88:0:812:0:0:0:0:0:0:2
+
+# Dungeon layout
+D:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+D:X^..^^^^^^^^^^^^^^^^^^^^^^^^^^^^X
+D:X^..^^^^^^^^^..^^^^^^^^^^^^^^^^^X
+D:X^...^^^^^^.........^^^^^^^^^^^^X
+D:X^^..^^^^^..^^^^..^B^^^^^^^^^^^^X
+D:X^...^^^^...^^^^^..^^^^^^^^^^^^^X
+D:X^^..^^^..^^.^^^^^^^^^^^^^^^^^^^X
+D:X^..^^^^^.....^^^^^.^^^^^^^^^^^^X
+D:X^^..^^^^..^^.^^^.^......^^^^^^^X
+D:X^..^^^^..^^...^^...^..^.^^^^^^^X
+D:X^^..^^^..^^^..^...^^^....^^^^^^X
+D:X^^^...^.^^^.....^^^^P...<^^^^^^X
+D:X^^^.....^^^^..^^^^^^^^..^^^^^^^X
+D:X^^^^^^.^^^^..^^^^^^^^^^^^^^^^^^X
+D:X^^^^^^^^^^^...^^^^^^^^^^^^^^^^^X
+D:X^^^^^.^^^^.^..^^^^^^^^^^^^^^^^^X
+D:X^^^^...^^...^^^...^^^^^^...^^^^X
+D:X^^^^.^....^^^^.^.....^..^..^^^^X
+D:X^^^^..^^^^^.....^...^..^^^B^^^^X
+D:X^^^P........^.....^^^^^^^^^^^^^X
+D:X^^^^^^...^^^^^^^^^^^^^^^^^^^^^^X
+D:X^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^X
+D:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+
+# Starting position
+P:3:4
+
diff --git a/lib/mods/theme/edit/f_info.txt b/lib/mods/theme/edit/f_info.txt
new file mode 100644
index 00000000..dbfec51a
--- /dev/null
+++ b/lib/mods/theme/edit/f_info.txt
@@ -0,0 +1,1245 @@
+# File: f_info.txt
+
+
+# This file is used to initialize the "lib/raw/f_info.raw" file, which is
+# used to initialize the "terrain feature" information for the Angband game.
+
+# 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/f_info.raw" file.
+
+# Note that the terrain feature are grouped into very regular groups,
+# such that each of the bits in the feature type conveys information.
+
+# Note that terrain feature zero contains the "darkness" picture.
+
+
+# Version stamp (required)
+
+V:2.0.0
+
+
+# 0x00 --> nothing
+
+N:0:nothing
+G: :w
+F:FLOOR
+
+# 0x01 --> open floor
+
+N:1:open floor
+G:.:w
+F:FLOOR | DONT_NOTICE_RUNNING | SUPPORT_LIGHT | CAN_RUN
+F:SUPPORT_GROWTH
+
+# 0x02 -> fountain
+N:2:fountain
+G:_:w
+F:FLOOR | NOTICE | REMEMBER | CAN_RUN
+D:0:The liquid here seems magical.
+
+# 0x03 --> glyph of warding
+
+N:3:glyph of warding
+G:;:y
+F:FLOOR | NOTICE | SUPPORT_LIGHT | CAN_RUN | REMEMBER
+D:0:There is a mighty spell of protection here.
+
+# 0x04 --> open door
+
+N:4:open door
+G:':U
+F:FLOOR | NOTICE | REMEMBER | CAN_RUN | DOOR
+
+# 0x05 --> broken door
+
+N:5:broken door
+G:':U
+F:FLOOR | NOTICE | REMEMBER | CAN_RUN | DOOR
+
+# 0x06 --> up stairs (perm)
+
+N:6:up staircase
+G:<:w
+F:FLOOR | PERMANENT | NOTICE | SUPPORT_LIGHT | REMEMBER | CAN_RUN
+D:0:There is an up staircase here.
+D:1:You cannot tunnel a stair.
+
+# 0x07 --> down stairs (perm)
+
+N:7:down staircase
+G:>:w
+F:FLOOR | PERMANENT | NOTICE | SUPPORT_LIGHT | REMEMBER | CAN_RUN
+D:0:There is a down staircase here.
+D:1:You cannot tunnel a stair.
+
+N:8:quest entrance
+G:>:y
+F:FLOOR | PERMANENT | REMEMBER | NOTICE | CAN_RUN
+D:1:You cannot tunnel a quest entrance.
+
+N:9:quest exit
+G:<:y
+F:FLOOR | PERMANENT | REMEMBER | NOTICE | CAN_RUN
+D:1:You cannot tunnel a quest exit.
+
+N:10:quest down level
+G:>:r
+F:FLOOR | PERMANENT | REMEMBER | NOTICE | CAN_RUN
+
+N:11:quest up level
+G:<:r
+F:FLOOR | PERMANENT | REMEMBER | NOTICE | CAN_RUN
+
+N:12:town exit
+G:>:g
+F:FLOOR | PERMANENT | REMEMBER | NOTICE | CAN_RUN
+
+N:13:shaft down
+G:>:U
+F:FLOOR | PERMANENT | REMEMBER | NOTICE | CAN_RUN
+D:0:There is a shaft down here.
+D:1:You cannot tunnel a shaft.
+
+N:14:shaft up
+G:<:U
+F:FLOOR | PERMANENT | REMEMBER | NOTICE | CAN_RUN
+D:0:There is a shaft up here.
+D:1:You cannot tunnel a shaft.
+
+# 0x0F -> empty fountain
+N:15:fountain
+G:_:D
+F:FLOOR | NOTICE | REMEMBER | CAN_RUN
+D:0:The fountain seems empty.
+
+N:16:web
+G:+:y
+F:CAN_PASS | NOTICE | WEB | NOTICE | TUNNELABLE
+D:1:You tunnel through the web.
+D:2:a web blocking your way
+
+# Trap -- the flags are not used by the program
+N:17:trap
+G:^:w
+F:FLOOR | NOTICE | REMEMBER
+
+# 0x12 --> 0x1F -- UNUSED
+
+# 0x2x --> locked door (power 0)
+
+N:32:door
+G:+:U
+M:32
+F:WALL | NO_WALK | CAN_PASS | NO_VISION | NOTICE | REMEMBER | DOOR
+F:TUNNELABLE
+D:1:You bash the boor.
+
+# 0x2x --> locked door (power 1)
+
+N:33:locked door
+G:+:U
+M:32
+F:WALL | NO_WALK | CAN_PASS | NO_VISION | NOTICE | REMEMBER | DOOR
+F:TUNNELABLE
+D:1:You bash the boor.
+
+# 0x2x --> locked door (power 2)
+
+N:34:locked door
+G:+:U
+M:32
+F:WALL | NO_WALK | CAN_PASS | NO_VISION | NOTICE | REMEMBER | DOOR
+F:TUNNELABLE
+D:1:You bash the boor.
+
+# 0x2x --> locked door (power 3)
+
+N:35:locked door
+G:+:U
+M:32
+F:WALL | NO_WALK | CAN_PASS | NO_VISION | NOTICE | REMEMBER | DOOR
+F:TUNNELABLE
+D:1:You bash the boor.
+
+# 0x2x --> locked door (power 4)
+
+N:36:locked door
+G:+:U
+M:32
+F:WALL | NO_WALK | CAN_PASS | NO_VISION | NOTICE | REMEMBER | DOOR
+F:TUNNELABLE
+D:1:You bash the boor.
+
+# 0x2x --> locked door (power 5)
+
+N:37:locked door
+G:+:U
+M:32
+F:WALL | NO_WALK | CAN_PASS | NO_VISION | NOTICE | REMEMBER | DOOR
+F:TUNNELABLE
+D:1:You bash the boor.
+
+# 0x2x --> locked door (power 6)
+
+N:38:locked door
+G:+:U
+M:32
+F:WALL | NO_WALK | CAN_PASS | NO_VISION | NOTICE | REMEMBER | DOOR
+F:TUNNELABLE
+D:1:You bash the boor.
+
+# 0x2x --> locked door (power 7)
+
+N:39:locked door
+G:+:U
+M:32
+F:WALL | NO_WALK | CAN_PASS | NO_VISION | NOTICE | REMEMBER | DOOR
+F:TUNNELABLE
+D:1:You bash the boor.
+
+# 0x2x --> jammed door (power 0)
+
+N:40:jammed door
+G:+:U
+M:32
+F:WALL | NO_WALK | CAN_PASS | NO_VISION | REMEMBER | NOTICE
+F:TUNNELABLE
+D:1:You bash the boor.
+
+# 0x2x --> jammed door (power 1)
+
+N:41:jammed door
+G:+:U
+M:32
+F:WALL | NO_WALK | CAN_PASS | NO_VISION | REMEMBER | NOTICE
+F:TUNNELABLE
+D:1:You bash the boor.
+
+# 0x2x --> jammed door (power 2)
+
+N:42:jammed door
+G:+:U
+M:32
+F:WALL | NO_WALK | CAN_PASS | NO_VISION | REMEMBER | NOTICE
+F:TUNNELABLE
+D:1:You bash the boor.
+
+# 0x2x --> jammed door (power 3)
+
+N:43:jammed door
+G:+:U
+M:32
+F:WALL | NO_WALK | CAN_PASS | NO_VISION | REMEMBER | NOTICE
+F:TUNNELABLE
+D:1:You bash the boor.
+
+# 0x2x --> jammed door (power 4)
+
+N:44:jammed door
+G:+:U
+M:32
+F:WALL | NO_WALK | CAN_PASS | NO_VISION | REMEMBER | NOTICE
+F:TUNNELABLE
+D:1:You bash the boor.
+
+# 0x2x --> jammed door (power 5)
+
+N:45:jammed door
+G:+:U
+M:32
+F:WALL | NO_WALK | CAN_PASS | NO_VISION | REMEMBER | NOTICE
+F:TUNNELABLE
+D:1:You bash the boor.
+
+# 0x2x --> jammed door (power 6)
+
+N:46:jammed door
+G:+:U
+M:32
+F:WALL | NO_WALK | CAN_PASS | NO_VISION | REMEMBER | NOTICE
+F:TUNNELABLE
+D:1:You bash the boor.
+
+# 0x2x --> jammed door (power 7)
+
+N:47:jammed door
+G:+:U
+M:32
+F:WALL | NO_WALK | CAN_PASS | NO_VISION | REMEMBER | NOTICE
+F:TUNNELABLE
+D:1:You bash the boor.
+
+# 0x30 --> secret door
+
+N:48:secret door
+G:#:w
+M:56
+F:WALL | NO_WALK | CAN_PASS | NO_VISION | DOOR
+F:DONT_NOTICE_RUNNING
+F:TUNNELABLE
+D:1:You tunnel.
+
+# 0x31 --> rubble
+
+N:49:pile of rubble
+G:::w
+F:WALL | NO_WALK | CAN_PASS | NO_VISION | NOTICE
+F:CAN_FLY | SUPPORT_LIGHT
+F:TUNNELABLE
+D:1:You dig in the rubble.
+
+# 0x32 --> magma vein
+
+N:50:magma vein
+G:%:s
+F:WALL | NO_WALK | CAN_PASS | NO_VISION | NOTICE | SUPPORT_LIGHT
+F:DONT_NOTICE_RUNNING
+F:TUNNELABLE
+D:1:You tunnel into the magma vein.
+
+# 0x33 --> quartz vein
+
+N:51:quartz vein
+G:%:w
+F:WALL | NO_WALK | CAN_PASS | NO_VISION | NOTICE | SUPPORT_LIGHT
+F:DONT_NOTICE_RUNNING
+F:TUNNELABLE
+D:1:You tunnel into the quartz vein.
+
+# 0x34 --> magma vein + treasure
+
+N:52:magma vein
+G:%:s
+M:50
+F:WALL | NO_WALK | CAN_PASS | NO_VISION | NOTICE | SUPPORT_LIGHT
+F:DONT_NOTICE_RUNNING
+F:TUNNELABLE
+D:1:You tunnel into the magma vein.
+
+# 0x35 --> quartz vein + treasure
+
+N:53:quartz vein
+G:%:w
+M:51
+F:WALL | NO_WALK | CAN_PASS | NO_VISION | NOTICE | SUPPORT_LIGHT
+F:DONT_NOTICE_RUNNING
+F:TUNNELABLE
+D:1:You tunnel into the quartz vein.
+
+# 0x36 --> magma vein + known treasure
+
+N:54:magma vein with treasure
+G:*:o
+F:WALL | NO_WALK | CAN_PASS | NO_VISION | NOTICE | SUPPORT_LIGHT
+F:DONT_NOTICE_RUNNING
+F:TUNNELABLE
+D:1:You tunnel into the magma vein.
+
+# 0x37 --> quartz vein + known treasure
+
+N:55:quartz vein with treasure
+G:*:o
+F:WALL | NO_WALK | CAN_PASS | NO_VISION | NOTICE | SUPPORT_LIGHT
+F:DONT_NOTICE_RUNNING
+F:TUNNELABLE
+D:1:You tunnel into the quartz vein.
+
+# 0x38 --> granite wall -- basic
+
+N:56:granite wall
+G:#:w
+F:WALL | NO_WALK | CAN_PASS | NO_VISION | SUPPORT_LIGHT
+F:DONT_NOTICE_RUNNING
+F:TUNNELABLE
+D:1:You tunnel into the granite wall.
+
+# 0x39 --> granite wall -- inner
+
+N:57:granite wall
+G:#:w
+M:56
+F:WALL | NO_WALK | CAN_PASS | NO_VISION | SUPPORT_LIGHT
+F:DONT_NOTICE_RUNNING
+F:TUNNELABLE
+D:1:You tunnel into the granite wall.
+
+# 0x3A --> granite wall -- outer
+
+N:58:granite wall
+G:#:w
+M:56
+F:WALL | NO_WALK | CAN_PASS | NO_VISION | SUPPORT_LIGHT
+F:DONT_NOTICE_RUNNING
+F:TUNNELABLE
+D:1:You tunnel into the granite wall.
+
+# 0x3B --> granite wall -- solid
+
+N:59:granite wall
+G:#:w
+M:56
+F:WALL | NO_WALK | CAN_PASS | NO_VISION | SUPPORT_LIGHT
+F:DONT_NOTICE_RUNNING
+F:TUNNELABLE
+D:1:You tunnel into the granite wall.
+
+# 0x3C --> permanent wall -- basic (perm)
+
+N:60:permanent wall
+G:#:w
+F:WALL | NO_WALK | NO_VISION | PERMANENT | SUPPORT_LIGHT
+F:DONT_NOTICE_RUNNING
+
+# 0x3D --> permanent wall -- inner (perm)
+
+N:61:permanent wall
+G:#:w
+M:60
+F:WALL | NO_WALK | NO_VISION | PERMANENT | SUPPORT_LIGHT
+F:DONT_NOTICE_RUNNING
+
+# 0x3E --> permanent wall -- outer (perm)
+
+N:62:permanent wall
+G:#:w
+M:60
+F:WALL | NO_WALK | NO_VISION | PERMANENT | SUPPORT_LIGHT
+F:DONT_NOTICE_RUNNING
+
+# 0x3F --> permanent wall -- solid (perm)
+
+N:63:permanent wall
+G:#:w
+M:60
+F:WALL | NO_WALK | NO_VISION | PERMANENT | SUPPORT_LIGHT
+F:DONT_NOTICE_RUNNING
+
+N:64:explosive rune
+G:*:R
+F:FLOOR | CAN_LEVITATE | CAN_FLY | NOTICE | SUPPORT_LIGHT
+D:0:This rune seems unstable.
+
+N:65:Straight Road startpoint
+G:*:w
+F:FLOOR | REMEMBER | NOTICE
+
+N:66:section of the Straight Road
+G:*:B
+F:FLOOR | REMEMBER | NOTICE
+
+N:67:section of the Straight Road
+G:*:b
+F:FLOOR | REMEMBER | NOTICE
+
+N:68:section of the Straight Road
+G:*:B
+F:FLOOR | REMEMBER | NOTICE
+
+N:69:section of the Straight Road
+G:*:b
+F:FLOOR | REMEMBER | NOTICE
+
+N:70:section of the Straight Road
+G:*:W
+F:FLOOR | REMEMBER | NOTICE
+
+N:71:section of the Straight Road (discharged)
+G:*:W
+F:FLOOR | REMEMBER | NOTICE
+
+N:72:Straight Road exit
+G:*:w
+F:FLOOR | REMEMBER | NOTICE
+
+N:73:corrupted section of the Straight Road
+G:*:D
+F:FLOOR | REMEMBER | NOTICE
+
+# 74 --> shop
+
+N:74:Building
+G:1:U
+F:FLOOR | PERMANENT | REMEMBER | NOTICE | CAN_RUN
+
+# 75 --> 78 Quests index
+
+N:75:permanent wall
+G:#:w
+F:WALL | NO_WALK | NO_VISION | PERMANENT | SUPPORT_LIGHT
+F:DONT_NOTICE_RUNNING
+
+N:76:permanent wall
+G:#:w
+F:WALL | NO_WALK | NO_VISION | PERMANENT | SUPPORT_LIGHT
+F:DONT_NOTICE_RUNNING
+
+N:77:permanent wall
+G:#:w
+F:WALL | NO_WALK | NO_VISION | PERMANENT | SUPPORT_LIGHT
+F:DONT_NOTICE_RUNNING
+
+N:78:permanent wall
+G:#:w
+F:WALL | NO_WALK | NO_VISION | PERMANENT | SUPPORT_LIGHT
+F:DONT_NOTICE_RUNNING
+
+#Elanor
+N:79:grass with Elanor flowers
+G:&:y
+F:FLOOR | DONT_NOTICE_RUNNING | CAN_RUN
+F:SUPPORT_GROWTH
+
+#Fumellar
+N:80:grass with Fumella flowers
+G:;:r
+F:FLOOR | DONT_NOTICE_RUNNING | CAN_RUN
+F:SUPPORT_GROWTH
+
+#Anemones
+N:81:grass with anemones
+G:;:v
+F:FLOOR | DONT_NOTICE_RUNNING | CAN_RUN
+F:SUPPORT_GROWTH
+
+#Niphredil
+N:82:grass with Niphredil flowers
+G:;:w
+F:FLOOR | DONT_NOTICE_RUNNING | CAN_RUN
+F:SUPPORT_GROWTH
+
+#Iris
+N:83:grass with irises
+G:;:b
+F:FLOOR | DONT_NOTICE_RUNNING | CAN_RUN
+F:SUPPORT_GROWTH
+
+N:84:stream of shallow water
+G:~:B
+S:B:B:B:B:B:B:b
+F:ATTR_MULTI
+F:FLOOR | CAN_LEVITATE | CAN_FLY | REMEMBER | SUPPORT_LIGHT | CAN_RUN
+F:DONT_NOTICE_RUNNING
+F:SUPPORT_GROWTH
+
+# -1 = player level
+N:85:pool of deep lava
+G:.:R
+E:-1d2:1:FIRE
+F:FLOOR | CAN_LEVITATE | CAN_FLY | REMEMBER | SUPPORT_LIGHT
+D:0:You move across the deep lava.
+
+N:86:stream of shallow lava
+G:.:r
+E:-1d1:1:FIRE
+F:FLOOR | CAN_LEVITATE | CAN_FLY | REMEMBER | SUPPORT_LIGHT
+D:0:You move across the shallow lava.
+
+N:87:dark pit
+G:#:D
+F:CAN_LEVITATE | CAN_FLY
+F:NO_WALK | SUPPORT_LIGHT
+F:DONT_NOTICE_RUNNING
+D:0:Ohhh, it is dark and deep.
+
+N:88:dirt
+G:.:U
+F:FLOOR | SUPPORT_LIGHT | CAN_RUN
+F:DONT_NOTICE_RUNNING
+F:SUPPORT_GROWTH
+
+N:89:patch of grass
+G:.:G
+F:FLOOR | SUPPORT_LIGHT | CAN_RUN
+F:DONT_NOTICE_RUNNING
+F:SUPPORT_GROWTH
+
+N:90:ice
+G:.:W
+E:1d1:50:ICE
+F:FLOOR | NOTICE
+
+N:91:sand
+G:.:y
+F:FLOOR | DONT_NOTICE_RUNNING | CAN_RUN
+F:SUPPORT_GROWTH
+
+N:92:dead tree
+G:#:D
+F:CAN_FLY | CAN_PASS
+F:WALL | NO_WALK | NO_VISION | NOTICE
+F:DONT_NOTICE_RUNNING
+F:TUNNELABLE
+D:1:You chop away at the dead tree.
+D:2:a tree blocking your way
+
+N:93:ash
+G:.:s
+F:FLOOR | DONT_NOTICE_RUNNING | CAN_RUN
+F:SUPPORT_GROWTH
+
+N:94:puddle of mud
+G:.:u
+F:FLOOR | DONT_NOTICE_RUNNING | CAN_RUN
+F:SUPPORT_GROWTH
+
+N:95:ice wall
+G:#:W
+F:WALL | NO_WALK | CAN_PASS | NO_VISION | SUPPORT_LIGHT
+F:DONT_NOTICE_RUNNING
+F:TUNNELABLE
+D:1:You tunnel into the ice wall... #BOh, chilly#w.
+D:2:an ice wall blocking your way
+
+N:96:tree
+G:#:G
+F:CAN_FLY | CAN_PASS | SUPPORT_LIGHT
+F:WALL | NO_WALK | NO_VISION
+F:DONT_NOTICE_RUNNING
+F:TUNNELABLE
+D:1:You chop away at the tree.
+D:2:a tree blocking your way
+
+N:97:mountain chain
+G:^:U
+F:CAN_CLIMB | CAN_PASS | SUPPORT_LIGHT
+F:WALL | NO_WALK | NO_VISION
+F:DONT_NOTICE_RUNNING
+F:PERMANENT
+D:1:You cannot tunnel into such a hard stone.
+D:2:a hard stone block blocking your way
+
+# 0x62 --> sandwall
+
+N:98:sandwall
+G:#:y
+F:WALL | NO_WALK | CAN_PASS | NO_VISION
+F:DONT_NOTICE_RUNNING
+F:TUNNELABLE
+D:1:You easily dig into the sandwall.
+D:2:a sandwall blocking your way
+
+# 0x63 --> sandwall + treasure
+
+N:99:sandwall
+G:%:y
+M:98
+F:WALL | NO_WALK | CAN_PASS | NO_VISION
+F:DONT_NOTICE_RUNNING
+F:TUNNELABLE
+D:1:You easily dig into the sandwall.
+D:2:a sandwall blocking your way
+
+# 0x64 --> sandwall + known treasure
+
+N:100:sandwall with treasure
+G:*:o
+F:WALL | NO_WALK | CAN_PASS | NO_VISION | NOTICE
+F:DONT_NOTICE_RUNNING
+F:TUNNELABLE
+D:1:You easily tunnel into the sandwall.
+D:2:a sandwall blocking your way
+
+N:101:high mountain chain
+G:^:W
+F:WALL | NO_WALK | NO_VISION | PERMANENT
+F:DONT_NOTICE_RUNNING
+D:1:This rock is far too hard.
+D:2:a very hard stone block blocking your way
+
+N:102:nether mist
+G:.:v
+S:v:R:r:v:R:r:D
+E:1d1:40:NETHER
+F:ATTR_MULTI
+F:FLOOR | DONT_NOTICE_RUNNING | CAN_RUN
+
+# A diggable glass wall.
+N:103:molten glass wall
+G:.:B
+F:NO_WALK | WALL | CAN_PASS | TUNNELABLE | NOTICE
+F:DONT_NOTICE_RUNNING
+D:1:You tunnel into the molten glass wall...
+D:2:a molten glass wall blocking your way
+
+N:159:Void Jumpgate
+G:+:v
+F:FLOOR | REMEMBER | NOTICE | PERMANENT | CAN_RUN
+D:0:A dark rift opens to the void here.
+
+N:160:Void Jumpgate
+G:+:v
+F:FLOOR | REMEMBER | NOTICE | PERMANENT | CAN_RUN
+D:0:A dark rift opens to the void here.
+
+###### Here are the altars. ######
+
+N:161:Altar of Being
+G:0:W
+F:FLOOR | REMEMBER | NOTICE | CAN_RUN
+D:0:You feel at peace.
+
+N:162:Altar of Winds
+G:0:B
+F:FLOOR | REMEMBER | NOTICE | CAN_RUN
+D:0:You grow a desire to become a bird.
+
+N:163:Altar of Force
+G:0:R
+F:FLOOR | REMEMBER | NOTICE | CAN_RUN
+D:0:You grow a desire to fight evil.
+
+N:164:Altar of Darkness
+G:0:D
+F:FLOOR | REMEMBER | NOTICE | CAN_RUN
+D:0:Images of pain and death fill your mind.
+
+N:165:Altar of Nature
+G:0:g
+F:FLOOR | REMEMBER | NOTICE | CAN_RUN
+D:0:You feel the desire to walk in a great forest.
+
+N:166:Altar of Stone
+G:0:s
+F:FLOOR | REMEMBER | NOTICE | CAN_RUN
+D:0:You grow a desire to forge items.
+
+N:167:Altar of Light
+G:0:y
+F:FLOOR | REMEMBER | NOTICE | CAN_RUN
+D:0:You grow a desire to light up dark places.
+
+N:168:Altar of Waters
+G:0:b
+F:FLOOR | REMEMBER | NOTICE | CAN_RUN
+D:0:You grow a desire to bathe in the ocean.
+
+N:169:Altar of Doom
+G:0:o
+F:FLOOR | REMEMBER | NOTICE | CAN_RUN
+D:0:You grow a desire to do justice.
+
+# XXX
+# XXX
+# XXX
+# XXX
+# XXX
+# XXX
+# XXX
+# XXX
+
+# Used as a marker for random quests
+N:172:open floor
+G:.:w
+F:FLOOR | CAN_RUN | DONT_NOTICE_RUNNING
+F:SUPPORT_GROWTH
+
+# Underground Tunnel
+N:173:Underground Tunnel
+G:#:s
+F:FLOOR | REMEMBER | SUPPORT_LIGHT | DONT_NOTICE_RUNNING | CAN_RUN
+D:0:Oh, an underground tunnel!
+
+# Tainted water
+N:174:stream of tainted water
+G:~:u
+F:FLOOR | CAN_LEVITATE | CAN_FLY | REMEMBER | SUPPORT_LIGHT
+F:DONT_NOTICE_RUNNING
+
+N:175:monster trap
+G:;:v
+F:FLOOR
+
+N:176:Void Jumpgate
+G:+:v
+F:FLOOR | REMEMBER | NOTICE | PERMANENT | CAN_RUN
+D:0:A dark rift opens to the void here.
+
+N:177:lava wall
+G:#:R
+S:R:R:r:r:U:u:R
+F:ATTR_MULTI
+F:WALL | NO_WALK | NO_VISION | PERMANENT | DONT_NOTICE_RUNNING
+D:1:The lava is far too hot to tunnel into it.
+D:2:a lava wall blocking your way
+
+N:178:Great Fire
+G:%:v
+S:R:R:y:v:y:v:R
+E:150d2:1:HELL_FIRE
+F:ATTR_MULTI
+F:FLOOR | REMEMBER | NOTICE | PERMANENT
+D:0:This fire is so powerful it could destroy even the most powerful artifacts.
+
+N:179:path to the next area
+G:>:w
+F:FLOOR | PERMANENT | NOTICE | REMEMBER | CAN_RUN
+D:0:There is a path leading to the next area here.
+D:1:You cannot tunnel a path.
+
+N:180:path to the previous area
+G:<:w
+F:FLOOR | PERMANENT | NOTICE | REMEMBER | CAN_RUN
+D:0:There is a path leading to the previous area here.
+D:1:You cannot tunnel a path.
+
+N:181:field
+G:::g
+F:FLOOR | PERMANENT | NOTICE | REMEMBER
+F:DONT_NOTICE_RUNNING
+D:1:You cannot tunnel a field.
+
+N:182:Ekkaia, the Encircling Sea
+G:*:b
+S:b:b:b:b:b:b:B
+F:ATTR_MULTI
+F:WALL | NO_WALK | NO_VISION | PERMANENT | SUPPORT_LIGHT
+F:DONT_NOTICE_RUNNING
+
+N:183:void
+G: :d
+F:FLOOR
+
+# XXX 182 - 186
+
+# 187 --> terrain -- deep water
+
+N:187:pool of deep water
+G:~:b
+S:b:b:b:b:b:b:B
+F:ATTR_MULTI
+F:FLOOR | CAN_LEVITATE | CAN_FLY | REMEMBER | SUPPORT_LIGHT
+
+# Glass wall -- can see but not pass
+N:188:glass wall
+G:.:B
+F:NO_WALK | WALL | PERMANENT | NOTICE
+F:DONT_NOTICE_RUNNING
+D:1:This glass seems to be totaly impenetrable.
+D:2:a glass wall blocking your way
+
+# Illusion wall -- can't see but can pass
+N:189:illusion wall
+G:#:w
+F:FLOOR | NO_VISION | REMEMBER | SUPPORT_LIGHT | DONT_NOTICE_RUNNING
+D:0:Looks like this wall is not so real.
+
+# Grass roof
+N:190:Grass roof
+G:#:y
+F:WALL | NO_WALK | NO_VISION | PERMANENT | DONT_NOTICE_RUNNING
+
+# grass roof top
+N:191:grass roof top
+G:#:y
+F:WALL | NO_WALK | NO_VISION | PERMANENT | DONT_NOTICE_RUNNING
+
+# grass roof chimney
+N:192:grass roof chimney
+G:#:y
+F:WALL | NO_WALK | NO_VISION | PERMANENT | DONT_NOTICE_RUNNING
+
+# brick roof
+N:193:brick roof
+G:#:r
+F:WALL | NO_WALK | NO_VISION | PERMANENT | DONT_NOTICE_RUNNING
+
+# brick roof top
+N:194:brick roof top
+G:#:r
+F:WALL | NO_WALK | NO_VISION | PERMANENT | DONT_NOTICE_RUNNING
+
+# brick roof chimney
+N:195:brick roof chimney
+G:#:r
+F:WALL | NO_WALK | NO_VISION | PERMANENT | DONT_NOTICE_RUNNING
+
+# window
+N:196:window
+G:#:w
+F:WALL | NO_WALK | NO_VISION | PERMANENT | DONT_NOTICE_RUNNING
+
+# small window
+N:197:small window
+G:#:w
+F:WALL | NO_WALK | NO_VISION | PERMANENT | DONT_NOTICE_RUNNING
+
+# rain barrel
+N:198:rain barrel
+G:#:w
+F:WALL | NO_WALK | NO_VISION | PERMANENT | DONT_NOTICE_RUNNING
+
+# grass with Kingsfoil flowers
+N:199:grass with Kingsfoil flowers
+G:;:G
+F:FLOOR | DONT_NOTICE_RUNNING | CAN_RUN
+F:SUPPORT_GROWTH
+
+# cobblestone road
+N:200:cobblestone road
+G:.:w
+F:FLOOR | DONT_NOTICE_RUNNING | CAN_RUN
+
+# cobblestone with outlet
+N:201:cobblestone with outlet
+G:.:w
+F:FLOOR | DONT_NOTICE_RUNNING | CAN_RUN
+
+N:202:small tree
+G:#:g
+F:FLOOR | DONT_NOTICE_RUNNING | CAN_RUN | SUPPORT_LIGHT | REMEMBER
+F:NO_VISION
+
+# Just to have a town entrance picture
+N:203:town
+G:*:w
+F:FLOOR | NOTICE
+
+# Underground Tunnel
+N:204:Underground Tunnel
+G:^:U
+F:FLOOR | REMEMBER | SUPPORT_LIGHT | DONT_NOTICE_RUNNING | CAN_RUN
+D:0:Oh, an underground tunnel!
+
+# Fire
+N:205:a blazing fire
+G:%:y
+S:y:y:y:R:r:y:R
+E:-1d2:1:FIRE
+D:0:The blazing fire burns you!
+F:ATTR_MULTI
+F:FLOOR | CAN_FLY | REMEMBER | SUPPORT_LIGHT
+F:DONT_NOTICE_RUNNING
+
+# Permanent rubble -- town use
+N:206:pile of rubble
+G:::w
+F:WALL | NO_WALK | CAN_PASS | NO_VISION | NOTICE
+F:CAN_FLY | SUPPORT_LIGHT | PERMANENT
+D:1:Looks like this pile of rubble is quite hard.
+
+# Rocky ground - rougher terrain.
+N:207:rocky ground
+G:.:s
+F:FLOOR | SUPPORT_LIGHT | CAN_RUN
+F:DONT_NOTICE_RUNNING
+
+# cloud-like vapour. Floor for Eru's temple
+N:208:cloud-like vapour
+G:.:W
+S:W:B:B:W:w:W:B
+F:FLOOR | CAN_LEVITATE | CAN_FLY | SUPPORT_LIGHT
+F:ATTR_MULTI | CAN_RUN | DONT_NOTICE_RUNNING
+
+# condensing water
+N:209:condensing water
+G:~:B
+S:B:B:B:B:B:B:b
+F:ATTR_MULTI
+F:FLOOR | CAN_LEVITATE | CAN_FLY | REMEMBER | SUPPORT_LIGHT | CAN_RUN
+F:DONT_NOTICE_RUNNING
+
+# Dense mist. Can pass through, but not see through
+N:210:dense mist
+G:#:w
+S:w:W:s:s:s:w:w
+F:FLOOR | NO_VISION | REMEMBER | SUPPORT_LIGHT
+F:ATTR_MULTI | DONT_NOTICE_RUNNING
+D:0:You wander through the mist.
+D:1:You cannot tunnel through mist!
+
+# Hail-stone wall
+N:211:hail-stone wall
+G:#:W
+F:WALL | NO_WALK | CAN_PASS | NO_VISION | NOTICE | SUPPORT_LIGHT
+F:DONT_NOTICE_RUNNING
+F:TUNNELABLE
+D:1:You tunnel into the hail-stone wall.
+
+N:212:dead small tree
+G:#:D
+F:FLOOR | DONT_NOTICE_RUNNING | CAN_RUN | SUPPORT_LIGHT | REMEMBER
+F:NO_VISION
+
+# Low hill
+N:213:low hill
+G:^:g
+F:FLOOR | DONT_NOTICE_RUNNING| CAN_RUN | SUPPORT_LIGHT | NO_VISION
+D:0:You go over the hill.
+D:1:You cannot tunnel through that.
+
+#Angband and Mordor (Ered Lithui, Ephel Duath) mountains
+N:214:dark mountain chain
+G:^:D
+F:WALL | NO_WALK | NO_VISION | PERMANENT
+F:DONT_NOTICE_RUNNING
+D:1:This rock is far too hard.
+D:2:a very hard stone block blocking your way
+
+#Ered Luin - Blue Mountains
+N:215:blue mountain chain
+G:^:B
+F:CAN_CLIMB | CAN_PASS | SUPPORT_LIGHT
+F:WALL | NO_WALK | NO_VISION
+F:DONT_NOTICE_RUNNING
+F:PERMANENT
+D:1:You cannot tunnel into such a hard stone.
+D:2:a hard stone block blocking your way
+
+#Ered Mithrin - Grey Mountains
+N:216:grey mountain chain
+G:^:s
+F:CAN_CLIMB | CAN_PASS | SUPPORT_LIGHT
+F:WALL | NO_WALK | NO_VISION
+F:DONT_NOTICE_RUNNING
+F:PERMANENT
+D:1:You cannot tunnel into such a hard stone.
+D:2:a hard stone block blocking your way
+
+#Orodruin - Mount Doom
+N:217:part of Mount Doom
+G:^:R
+F:WALL | NO_WALK | NO_VISION | NOTICE | SUPPORT_LIGHT
+F:DONT_NOTICE_RUNNING
+F:PERMANENT
+D:1:You cannot tunnel through that.
+D:2:a stream of searing lava barring your way
+
+#Snow-capped peak
+N:218:snow-capped peak
+G:^:w
+F:WALL | NO_WALK | NO_VISION | NOTICE | SUPPORT_LIGHT
+F:DONT_NOTICE_RUNNING | PERMANENT
+D:1:The ice is too cold to tunnel into it.
+D:2:an unusually thick wall of ice barring your way
+
+#Fir tree
+#BUG - these do not burn.
+N:219:fir tree
+G:#:g
+F:CAN_FLY | CAN_PASS | SUPPORT_LIGHT
+F:WALL | NO_WALK | NO_VISION
+F:DONT_NOTICE_RUNNING
+F:TUNNELABLE
+D:1:You chop away at the fir tree.
+D:2:a fir tree blocking your way
+
+#section of a flet (wooden platforms built high up in the trees of Lothlórien)
+N:220:section of a flet
+G:_:u
+F:FLOOR | DONT_NOTICE_RUNNING | CAN_RUN
+
+#light post
+N:221:light post
+G:|:w
+F:WALL | NO_WALK | CAN_FLY | CAN_PASS
+F:SUPPORT_LIGHT | REMEMBER
+D:1:You cannot tunnel a light post.
+D:2:A light post blocking your way
+
+#Water lily
+N:222:water lily
+G:;:B
+F:FLOOR | DONT_NOTICE_RUNNING | CAN_RUN
+F:SUPPORT_GROWTH
+
+#Dead Marshes swamp water
+N:223:part of the Dead Marshes
+G:~:G
+E:10d10:6:CONFUSION
+F:FLOOR | CAN_LEVITATE | CAN_FLY | REMEMBER | SUPPORT_LIGHT
+
+#Morannon
+N:224:Black Gate
+G:+:D
+F:CAN_CLIMB | CAN_PASS | SUPPORT_LIGHT
+F:WALL | NO_WALK | NO_VISION | NOTICE
+F:DONT_NOTICE_RUNNING
+F:PERMANENT
+D:1:You cannot tunnel through that.
+D:2:a closed Black Gate blocking your way
+
+#River (overland view only)
+N:225:river
+G:~:w
+S:w:w:w:B:w:w:B
+F:ATTR_MULTI
+F:FLOOR | CAN_LEVITATE | CAN_FLY | REMEMBER | SUPPORT_LIGHT | CAN_RUN
+F:DONT_NOTICE_RUNNING | SUPPORT_GROWTH
+
+#Swamp
+N:226:swamp pool
+G:~:g
+E:1d1:1:POISON
+F:FLOOR | CAN_LEVITATE | CAN_FLY | REMEMBER | SUPPORT_LIGHT
+
+#Anduin river
+N:227:stream of the Anduin river
+G:~:B
+E:1d1:1:WATER
+S:w:w:w:b:w:w:b
+F:ATTR_MULTI
+F:FLOOR | CAN_LEVITATE | CAN_FLY | REMEMBER | SUPPORT_LIGHT | SUPPORT_GROWTH
+
+#Road sign to Gondolin to avoid Maeglin quest silliness somewhat
+N:228:road sign that says 'Find Gondolin!'
+G:?:v
+S:v:R:B:G:w:v:R
+F:ATTR_MULTI
+F:WALL | PERMANENT | NOTICE | SUPPORT_LIGHT | REMEMBER |
+
+### New terrain features for town use ###
+
+#Beehive
+N:229:beehive
+G:*:o
+E:1d1:1:POISON
+F:WALL | PERMANENT | CAN_FLY | REMEMBER | SUPPORT_LIGHT |
+F:CAN_PASS | NO_WALK | NO_VISION | DONT_NOTICE_RUNNING |
+D:0:Ouch! A bee stung you!
+D:1:You'll just get stung.
+D:2:a beehive blocking your way
+
+#Dirt road - same as dirt but more appropriate for towns
+N:230:dirt road
+G:.:U
+F:FLOOR | DONT_NOTICE_RUNNING | CAN_RUN
+F:SUPPORT_GROWTH
+
+#Wide gate
+N:231:wide gate
+G:-:D
+F:WALL | PERMANENT | CAN_FLY | SUPPORT_LIGHT | NOTICE |
+F:CAN_PASS | NO_WALK | NO_VISION | DONT_NOTICE_RUNNING |
+D:1:You cannot tunnel through that.
+D:2:a closed gate barring your way
+
+#Same gate, but opened
+N:232:open gate
+G:':D
+F:FLOOR | DONT_NOTICE_RUNNING | CAN_RUN | SUPPORT_LIGHT |
+
+### For wood houses, bridges, etc:
+
+#Wooden board - horizontal
+N:233:wooden board
+G:-:u
+F:WALL | PERMANENT | SUPPORT_LIGHT | NO_WALK | NO_VISION | CAN_FLY
+D:1:You cannot tunnel through that.
+D:2:a wooden board blocking your way
+
+#Wooden board - vertical
+N:234:wooden board
+G:|:u
+F:WALL | PERMANENT | SUPPORT_LIGHT | NO_WALK | NO_VISION | CAN_FLY
+D:1:You cannot tunnel through that.
+D:2:a wooden board blocking your way
+
+#Light wooden board - horizontal
+N:235:wooden board
+G:-:U
+F:WALL | PERMANENT | SUPPORT_LIGHT | NO_WALK | NO_VISION | CAN_FLY
+D:1:You cannot tunnel through that.
+D:2:a wooden board blocking your way
+
+#Light wooden board - vertical
+N:236:wooden board
+G:|:U
+F:WALL | PERMANENT | SUPPORT_LIGHT | NO_WALK | NO_VISION | CAN_FLY
+D:1:You cannot tunnel through that.
+D:2:a wooden board blocking your way
+
+#White tree
+#BUG - these do not burn.
+N:237:white tree
+G:#:w
+F:CAN_FLY | CAN_PASS | SUPPORT_LIGHT
+F:WALL | NO_WALK | NO_VISION | PERMANENT
+F:DONT_NOTICE_RUNNING
+D:1:You cannot tunnel through that.
+D:2:a white tree blocking your way
+
+#Swift waterfall
+N:238:swift waterfall
+G:|:B
+E:25d10:1:WATER
+S:w:w:w:b:w:w:b
+F:ATTR_MULTI
+F:FLOOR | CAN_LEVITATE | CAN_FLY | REMEMBER | SUPPORT_LIGHT |
+F:DONT_NOTICE_RUNNING | SUPPORT_GROWTH |
+
+#Slippery rock ledge
+N:239:slippery rock ledge
+G:&:s
+E:5d10:1:COLD
+F:FLOOR | CAN_LEVITATE | CAN_FLY | SUPPORT_LIGHT |
+F:SUPPORT_GROWTH
+
+#Stable
+N:240:stable
+G:#:u
+F:WALL | NO_WALK | NO_VISION | PERMANENT | CAN_FLY
+D:1:You cannot tunnel through that.
+D:2:a stable wall blocking your way
+
+#Wooden plank
+N:241:wooden plank
+G:%:U
+F:FLOOR | CAN_RUN | DONT_NOTICE_RUNNING | SUPPORT_LIGHT |
+F:SUPPORT_GROWTH |
+
+#Fosse (dry moat)
+N:242:fosse pit
+G:&:g
+F:CAN_LEVITATE | CAN_FLY
+F:NO_WALK | SUPPORT_LIGHT
+F:DONT_NOTICE_RUNNING
+D:1:You cannot tunnel through that.
+D:2:a dry moat blocking your way
+
+#Mallorn
+N:243:Mallorn
+G:*:y
+S:y:W:W:y:w:W:y
+F:CAN_FLY | CAN_PASS | SUPPORT_LIGHT
+F:WALL | NO_WALK | NO_VISION
+F:DONT_NOTICE_RUNNING
+D:1:It isn't a good idea to harm a Mallorn.
+D:2:a Mallorn blocking your way
+
+# New features for the Maps of Lord Dimwit
+
+N:244:copper pillar
+G:#:u
+S:u:u:u:o:u:u:u
+F:WALL | NO_WALK | CAN_PASS | NO_VISION | NOTICE | SUPPORT_LIGHT
+F:DONT_NOTICE_RUNNING | ATTR_MULTI
+D:1:The copper is too tough to tunnel through.
+D:2:a copper pillar blocking your way
+
+N:245:ethereal wall
+G:.:w
+F:WALL | NO_WALK | PERMANENT | NOTICE | DONT_NOTICE_RUNNING
+D:1:You can't even see your obstruction!
+D:2:an unseen force blocking your way
+
+N:246:glacial wall
+G:#:B
+F:WALL | NO_WALK | CAN_PASS | NO_VISION | SUPPORT_LIGHT
+F:DONT_NOTICE_RUNNING | TUNNELABLE
+D:1:You tunnel into the glacial wall... #BOh, chilly!#w.
+D:2:a hard glacial wall blocking your way
+
+N:247:battlement
+G:#:w
+F:NO_WALK | CAN_PASS | NOTICE | SUPPORT_LIGHT
+F:DONT_NOTICE_RUNNING | TUNNELABLE
+D:1:You tunnel into the battlement.
+D:2:a hard stone battlement blocking your way
+
+N:248:door of Orthanc
+G:':r
+F:FLOOR | NOTICE | REMEMBER | CAN_RUN
+F:SUPPORT_LIGHT | DONT_NOTICE_RUNNING
+D:0:The Key of Orthanc allows you to pass. \ No newline at end of file
diff --git a/lib/mods/theme/edit/fireprof.map b/lib/mods/theme/edit/fireprof.map
new file mode 100644
index 00000000..35f6bec4
--- /dev/null
+++ b/lib/mods/theme/edit/fireprof.map
@@ -0,0 +1,60 @@
+# Created by fearoffours (fearoffours@moppy.co.uk)
+# Made for ToME 2.1.x on 03/09/02
+
+# Permanent wall
+F:X:63:3
+
+# Floor with dirt
+F:.:88:3
+
+# shallow lava
+F:f:86:3
+
+# Deep lava
+F:F:85:3
+
+### Random Monsters and/or Items
+# Random object (upto 3 levels ood)
+F:!:88:5:0:*21
+
+# red mold
+F:m:88:5:324
+
+# Chimaera
+F:H:88:5:341
+
+# Red dragon bat
+F:b:88:5:377
+
+# Hellhound and
+# Random object (upto 7 levels ood) on normal floor
+F:C:88:5:613:*25
+
+# Quest exit
+F:<:6:3
+
+D:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+D:X......m.................H.........b...m......X
+D:X.............b...............................X
+D:X.......................m.....m.......H...b.C.X
+D:X...............m.!........b.............FFFf.X
+D:X.........m!............H....!........fffFFFffX
+D:X..................................fffFFFFFFfFX
+D:XFFf..............................fFFFFff..fffX
+D:XFFFff........FFFFFF...........fffFFFfff......X
+D:XfFFFFfff....FFFFFFFf.......fffFFFFFf.........X
+D:X.fFFFFFFff.FFFFFFFFFfF..fffFFFFFFff..........X
+D:X..fFFFFFFFffFFFfffFFFfffFFFFFFFFf............X
+D:X...fFFFFFFFFFFff.ffFFFFFFFFFFFff.............X
+D:X....fffFFFFFFff...ffFFFFFFFFFf...............X
+D:X.......ffFFFf.......ffffFFfff................X
+D:X.........fff.................................X
+D:X.............................................X
+D:X.............................................X
+D:X.............................................X
+D:X..................................<..........X
+D:X.............................................X
+D:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+
+# Starting position
+P:22:26
diff --git a/lib/mods/theme/edit/haunted.map b/lib/mods/theme/edit/haunted.map
new file mode 100644
index 00000000..49f72d5b
--- /dev/null
+++ b/lib/mods/theme/edit/haunted.map
@@ -0,0 +1,49 @@
+# permanent wall
+F:X:61:0
+
+# granite
+F:#:57:0
+
+# up staircase
+F:<:6:0
+
+# Floor
+F:.:1:0
+
+# Locked Door
+F:D:38:0
+
+# Secret Door
+F:S:48:0
+
+# Great item
+F:g:1:0:0:*:*
+
+# Dungeon layout
+D:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+D:XXX...D.........................X
+D:XXX...XXXXXXXXXXXXXXXXXXXXXXXXX.X
+D:XXX...X....X....X....X....X...X.X
+D:XXX...X....X....X....X....X...X.X
+D:XXX...X....X....X....X....X...X.X
+D:XXXDXXXDXXXXDXXXXDXXXXDXXXXDXXX.X
+D:XXX.............................X
+D:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.X
+D:X.S.....X.....X.....X.....X...X.X
+D:X.X.....X.....X.....X.....X...X.X
+D:X.X.....X.....X.....X.....X...X.X
+D:X.X.....X.....X.....X.....X...X.X
+D:XgX.....X.....X.....X.....X...X.X
+D:XXXDXXXXXDXXXXXDXXXXXDXXXXXDXXX.X
+D:XXX.............................X
+D:XXXXXXXDXXXXXDXXXXXDXXXXXDXXXXXDX
+D:XgX<....X.....X.....X.....X.....X
+D:X.X.....X.....X.....X.....X.....X
+D:X.X.....X.....X.....X.....X.....X
+D:X.X.....X.....X.....X.....X.....X
+D:X.S.....X.....X.....X.....X.....X
+D:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+
+# Starting position
+P:3:5
+
diff --git a/lib/mods/theme/edit/k_info.txt b/lib/mods/theme/edit/k_info.txt
new file mode 100644
index 00000000..07e4bbe2
--- /dev/null
+++ b/lib/mods/theme/edit/k_info.txt
@@ -0,0 +1,6865 @@
+# File: k_info.txt
+
+
+# This file is used to initialize the "lib/data/k_info.raw" file, which is
+# used to initialize the "object kind" information for the Angband game.
+
+# 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/data/k_info.raw" file.
+
+# Available slots are marked with # XXX: 294, 299, 444-464, ...
+
+# XXX XXX Add some "IGNORE_XXX" flags to Rings, Amulets, etc.
+
+# The old "MULTI_HUED" objects are now "violet", and no other object
+# is violet, so all six violet objects can be made "multi-hued", though
+# this would be a heinous hack. XXX XXX
+
+# Note that object zero is used for the "stack" picture (unused).
+
+# N: serial number : & object name~
+# G: symbol : color
+# I: tval : sval : pval
+# W: depth : rarity : weight : cost
+# P: base armor class : base damage : plus to-hit : plus to-dam : plus to-ac
+# A: depth/rarity : depth/rarity : etc
+# F: flag | flag | etc
+
+# Version stamp (required)
+
+V:2.0.0
+
+
+##### Something special #####
+
+N:0:something
+G:&:w
+
+
+##### Mushrooms #####
+
+N:1:Blindness
+G:,:d
+I:80:1:500
+W:5:0:1:0
+A:5/1
+D:'E'ating this mushrooms will blind you. You cannot cast magic
+D:or see monsters when you are blinded. You can still use magic items or
+D:quaff potions.
+
+N:2:Fear
+G:,:d
+I:80:2:500
+W:5:0:1:0
+A:5/1
+D:'E'ating this mushroom will make you scared.
+D:You will not be able to hit your enemies in combat if you're scared.
+
+N:3:Confusion
+G:,:d
+I:80:3:500
+W:5:0:1:0
+A:5/1
+D:'E'ating this mushroom will confuse you. You will not be able to cast spells,
+D:use wands, staves or scrolls. You can still quaff potions, though.
+
+N:4:Hallucination
+G:,:d
+I:80:4:500
+W:10:0:1:0
+A:10/1
+D:'E'ating this mushroom will make you hallucinate.
+D:You will not be able to recognise any monster or item.
+
+N:5:Cure Poison
+G:,:d
+I:80:12:500
+W:10:0:1:60
+A:10/1
+D:'E'ating this mushroom will cure you from poison.
+
+N:6:Cure Blindness
+G:,:d
+I:80:13:500
+W:10:0:1:50
+A:10/1
+D:'E'ating this mushroom will cure you from blindness.
+
+N:7:Cure Fear
+G:,:d
+I:80:14:500
+W:10:0:1:25
+A:10/1
+D:'E'ating this mushroom will cure your paranoia. Paranoia is the state when you are
+D:too afraid to attack monsters.
+
+N:8:Cure Confusion
+G:,:d
+I:80:15:500
+W:10:0:1:50
+A:10/1
+D:'E'ating this mushroom will cure your confusion. Confusion is when you are too confused
+D:to cast spells, zap staves, aim wands or read scrolls.
+
+N:9:Weakness
+G:,:d
+I:80:6:500
+W:10:0:1:0
+A:10/1
+P:0:5d5:0:0:0
+D:'E'ating this mushroom will reduce your strength by one point.
+
+N:10:Unhealth
+G:,:d
+I:80:10:500
+W:15:0:1:50
+A:15/1
+P:0:10d10:0:0:0
+D:'E'ating this mushroom will reduce your constitution by one point.
+
+N:11:Restore Constitution
+G:,:d
+I:80:18:500
+W:20:0:1:350
+A:20/1
+D:'E'ating this mushroom will restore your constitution. Your constitution
+D:needs restoring when it is displayed in yellow.
+
+N:12:Restoring
+G:,:d
+I:80:19:500
+W:20:0:1:1000
+A:20/8:30/4:40/1
+D:'E'ating this mushroom will restore your strength, dexterity, constitution,
+D:intelligence, wisdom and charisma. These need restoring when they
+D:are displayed in yellow.
+
+N:13:Stupidity
+G:,:d
+I:80:8:500
+W:15:0:1:0
+A:15/1
+D:'E'ating this mushroom will reduce your intelligence by one point.
+D:That's a bad thing.
+
+N:14:Naivety
+G:,:d
+I:80:9:500
+W:15:0:1:0
+A:15/1
+D:'E'ating this mushroom will reduce your wisdom by one point.
+D:That's a bad thing.
+
+N:15:Poison
+G:,:d
+I:80:0:500
+W:5:0:1:0
+A:5/1:5/1
+P:0:4d4:0:0:0
+D:'E'ating this mushroom will poison you. Poisoning makes you lose one hitpoint
+D:per turn until you magically stop the poison or until your body has
+D:fought off the poison.
+D:That's a bad thing.
+
+N:16:Sickness
+G:,:d
+I:80:7:500
+W:10:0:1:0
+A:10/1
+P:0:4d4:0:0:0
+D:'E'ating this mushroom will reduce your constitution by one point.
+D:It will also damage you quite severely in the process.
+D:That's a bad thing.
+
+N:17:Paralysis
+G:,:d
+I:80:5:500
+W:20:0:1:0
+A:20/1
+D:'E'ating this mushroom will paralyse you for a certain time.
+D:Any nearby monsters will take this opportunity to kill you.
+D:That's a bad thing.
+
+N:18:Restore Strength
+G:,:d
+I:80:17:500
+W:20:0:1:350
+A:20/1
+D:'E'ating this mushroom will restore your strength. Your strength
+D:needs restoring when it is displayed in yellow.
+
+N:19:Disease
+G:,:d
+I:80:11:500
+W:20:0:1:50
+A:20/1
+P:0:10d10:0:0:0
+D:'E'ating this mushroom will reduce your strength by one point.
+D:It will also damage you quite severely in the process.
+D:That's a bad thing.
+
+N:20:Cure Serious Wounds
+G:,:d
+I:80:16:500
+W:15:0:1:75
+A:15/1
+D:'E'ating this mushroom will heal several hit points. Your hit points
+D:need healing when they are displayed in yellow or red.
+
+##### Normal Food #####
+
+N:21:& Ration~ of Cram
+G:,:U
+I:80:35:5000
+W:0:0:10:3
+A:0/1:5/1:10/1
+D:It is biscuitish, keeps good indefinitely, is supposed to be sustaining but
+D:certainly not entertaining. Its origin is Esgaroth, the city of Lake-men.
+D:You can 'E'at it.
+
+N:22:& Round Seed-Cake~
+G:,:U
+I:80:32:500
+W:0:0:2:1
+D:It's a treat, but 'E'ating it will only fill your stomach for a short time.
+
+N:23:& Strip~ of Venison
+G:,:u
+I:80:33:1500
+W:0:0:2:2
+D:It looks great, and 'E'ating it will fill your stomach well.
+
+N:24:& Slime Mold~
+G:,:g
+I:80:36:3000
+W:1:0:5:2
+A:1/1
+D:It looks disgusting, but if you really want to you can 'E'at it.
+D:Not an incredible taste experience, but that'd be asking a bit much.
+
+# New - now Lembas works as a scroll of Satisfy Hunger
+N:25:& Lembas~
+G:,:B
+I:80:37:0
+W:5:0:3:10
+A:5/1:10/1:20/1
+D:Small golden-brown wafers wrapped in silver leaves. Its fabrication is a
+D:secret of the Elves, and it sustains life where nothing else can. If you
+D:'E'at it, you will be full.
+
+N:26:& Pint~ of Fine Ale
+G:,:y
+I:80:38:500
+W:0:0:5:1
+D:A bottle of a dark beer-like beverage from Eriador. You can drink it by pressing 'E'.
+
+N:27:& Pint~ of Old Winyards
+G:,:r
+I:80:39:1000
+W:0:0:10:2
+D:A bottle of fine wine from Eriador. You can drink it by pressing 'E'.
+
+##### Extra digger #####
+
+N:28:& Mattock~
+G:\:D
+I:20:7:3
+W:50:0:250:700
+A:50/2
+P:0:1d8:0:0:0
+F:TUNNEL
+f:TUNNEL
+D:This is a digging tool. Use it to dig in walls, destroy doors, or cut wood.
+
+# The Blue Stone 'Coimir' -- see artifact list
+
+N:29:& Blue Stone~
+G:":B
+I:40:18:0
+W:60:0:3:90000
+F:INSTA_ART | SPECIAL_GENE
+
+##### Edged Weapons #####
+
+N:30:& Broken Dagger~
+G:|:D
+I:23:1:0
+W:0:0:5:1
+A:0/2:5/2
+P:0:1d1:-2:-4:0
+F:SHOW_MODS
+D:The blade itself is a foot long and broken off not far above the hilt.
+
+N:31:& Bastard Sword~
+G:|:W
+I:23:21:0
+W:15:0:140:350
+A:15/1
+P:0:3d4:0:0:0
+F:SHOW_MODS | COULD2H
+f:COULD2H
+D:This is a long, double-edged sword with a plain hilt that could
+D:be wielded in one or two hands. It's called a "bastard sword" because in
+D:size, it falls between the broad sword and the two-handed sword, thus not
+D:having a family of its own. It's typically around 51 inches long.
+D:It is effective for cutting through tougher armours. It could be used for
+D:thrusting, but most wielders swing it like a bat.
+
+N:32:& Scimitar~
+G:|:W
+I:23:18:0
+W:10:0:130:250
+A:10/1
+P:0:2d5:0:0:0
+F:SHOW_MODS
+D:This oriental blade has 2 edges and is deeply curved. It has a wide
+D:and very sharp end. It is the forefather of the sabre.
+
+N:33:& Tulwar~
+G:|:W
+I:23:15:0
+W:5:0:100:200
+A:5/1
+P:0:2d4:0:0:0
+F:SHOW_MODS
+D:This vicious sword is half sword and half club, with a slight hook on the tip.
+
+N:34:& Broad Sword~
+G:|:W
+I:23:16:0
+W:10:0:150:255
+A:10/1:15/1
+P:0:2d5:0:0:0
+F:SHOW_MODS
+D:This broader version of the long sword is a standard weapon in the army
+D:of Gondolin.
+
+N:35:& Short Sword~
+G:|:W
+I:23:10:0
+W:5:0:80:90
+A:5/1
+P:0:1d7:0:0:0
+F:SHOW_MODS
+D:This shorter version of the long sword is a common weapon for rogues
+D:and mages.
+
+N:36:& Blade~ of Chaos
+G:|:v
+I:23:30:0
+W:70:0:180:4000
+A:70/8
+P:0:6d5:0:0:0
+F:ATTR_MULTI
+F:RES_CHAOS | CHAOTIC | SHOW_MODS
+f:RES_CHAOS | CHAOTIC
+D:A mighty sword which seems to be completely blunt. However, it is a conduit
+D:into the realms of pure chaos and strikes its victims with the devastating
+D:might of chaos itself whenever it connects. It gives you resistance to chaos
+D:and it can polymorph, teleport, confuse or drain hit points from the monster
+D:you hit. It occasionally causes earthquakes as well.
+
+N:37:& Two-Handed Sword~
+G:|:W
+I:23:25:0
+W:30:0:200:775
+A:30/1:40/1
+P:0:3d6:0:0:0
+F:SHOW_MODS | MUST2H
+f:MUST2H
+D:This blade is lot longer, wider and heavier than a long sword. You have to
+D:wield it with two hands. This means that wielding a shield makes fighting
+D:very difficult.
+
+N:38:& Main Gauche~
+G:|:W
+I:23:5:0
+W:3:0:30:25
+A:3/1
+P:0:1d5:0:0:0
+F:SHOW_MODS
+D:This blade is sinuously curved and tipped with a harpoon-like end.
+D:This blade has a large handguard and was designed as an off-hand weapon.
+D:This short but cruel blade is a favourite among orcs.
+
+N:39:& Cutlass~
+G:|:W
+I:23:12:0
+W:5:0:110:85
+A:5/1
+P:0:1d7:0:0:0
+F:SHOW_MODS
+D:This oriental weapon is a short, thick, curving sword
+D:with a single cutting edge. This simple slashing weapon
+D:is typically carried by buccaneers, pirates, and sailors.
+
+N:40:& Executioner's Sword~
+G:|:r
+I:23:28:0
+W:40:0:260:850
+A:40/1
+P:0:4d5:0:0:0
+F:SHOW_MODS | MUST2H
+f:MUST2H
+D:These weapons have been built in all sizes. They are custom-made
+D:for warriors that want to set out and kill their archenemy. These
+D:blades are rare, costly and very deadly.
+
+N:41:& Katana~
+G:|:W
+I:23:20:0
+W:20:0:120:400
+A:20/1
+P:0:3d4:0:0:0
+F:SHOW_MODS | COULD2H
+f:COULD2H
+D:The katana is a long blade with only a small disk for a guard.
+D:Its hilt is long enough for two hands, though it could be used
+D:with only one hand, and is usually wrapped in cloth or leather.
+D:The art of forging such swords is largely unknown in this part
+D:of Middle-earth, and such weapons are typically imported from
+D:distant lands.
+
+N:42:& Long Sword~
+G:|:W
+I:23:17:0
+W:10:0:130:300
+A:10/1:20/1
+P:0:2d5:0:0:0
+F:SHOW_MODS
+D:A long straight sword, tapering to a pronounced point. Mainly good for
+D:piercing attacks, but it can be used for slashing, too. It is a very
+D:popular design and has become standard issue in many armies.
+
+N:43:& Dagger~
+G:|:W
+I:23:4:0
+W:0:0:12:10
+A:0/1:5/1:10/1:20/1
+P:0:1d4:0:0:0
+F:SHOW_MODS
+D:It's the standard weapon of rogues and thieves. The blade is
+D:a foot long.
+
+N:44:& Rapier~
+G:|:W
+I:23:7:0
+W:5:0:40:42
+A:5/1
+P:0:1d6:0:0:0
+F:SHOW_MODS
+D:The rapier's hilt consisted of a pair of oval guards pierced with holes,
+D:recurved quillions, and a knuckle guard. The guard is very intricate
+D:and very effective as protection.
+
+N:45:& Sabre~
+G:|:W
+I:23:11:0
+W:5:0:50:50
+A:5/1
+P:0:1d7:0:0:0
+F:SHOW_MODS
+D:A long, one-edged, slightly curved sword with a knuckle guard and short
+D:hilt. It is two-edged in its lower part.
+
+N:46:& Small Sword~
+G:|:W
+I:23:8:0
+W:5:0:75:48
+A:5/1
+P:0:1d6:0:0:0
+F:SHOW_MODS
+D:It's the favourite weapon of strong mages and thieves. The blade is
+D:about twenty inches long. It's very easy to handle, although it is a lot less
+D:efficient than the longer and heavier designs.
+
+N:47:& Broken Sword~
+G:|:D
+I:23:2:0
+W:0:0:30:2
+A:0/2:5/2
+P:0:1d2:-2:-4:0
+F:SHOW_MODS
+D:Just a hilt and a few inches of blade, broken off in a jagged stump.
+D:Probably worthless.
+
+##### Hafted Weapons #####
+
+N:48:& Ball-and-Chain~
+G:\:D
+I:21:6:0
+W:20:0:150:200
+A:20/1
+P:0:2d4:0:0:0
+F:SHOW_MODS | COULD2H
+f:COULD2H
+D:This weapon has a ball linked with a chain to a wooden handle.
+D:Preferred tactic is smashing the brains of your opponent.
+
+N:49:& Whip~
+G:\:D
+I:21:2:0
+W:3:0:30:30
+A:3/1
+P:0:1d6:0:0:0
+F:SHOW_MODS
+D:This weapon is light and easy to fight with. It has nasty barbs and
+D:hooks fixed to the thong to make it useful in combat.
+D:Whips easily give multiple attacks.
+
+N:50:& Flail~
+G:\:D
+I:21:13:0
+W:10:0:150:353
+A:10/1
+P:0:2d6:0:0:0
+F:SHOW_MODS | COULD2H
+f:COULD2H
+D:This weapon was originally used to cut corn. More warlike versions
+D:sport a large blade stuck on a wooden handle. The hinge allows it to get
+D:past enemy defences or to strike with added momentum when used skillfully.
+
+N:51:& Two-Handed Flail~
+G:\:y
+I:21:18:0
+W:45:0:280:590
+A:45/1
+P:0:3d6:0:0:0
+F:SHOW_MODS | MUST2H
+f:MUST2H
+D:This two-handed version of the flail gives the fighter a fearsome
+D:weapon that can do a fair amount of damage. It typically has several
+D:spiked metal lumps on chains.
+
+N:52:& Morning Star~
+G:\:D
+I:21:12:0
+W:10:0:150:396
+A:10/1
+P:0:2d6:0:0:0
+F:SHOW_MODS
+D:This weapon consists of a large club with chains that have wooden balls
+D:with metal spikes on the end.
+
+N:53:& Mace~
+G:\:D
+I:21:5:0
+W:5:0:120:130
+A:5/1
+P:0:2d4:0:0:0
+F:SHOW_MODS | COULD2H
+f:COULD2H
+D:This weapon is a club ending in a sphere. The sphere is studded
+D:with metal shards, and thus can both crush and cut your adversary.
+
+N:54:& Quarterstaff~
+G:\:U
+I:21:3:0
+W:10:0:150:200
+A:10/1
+P:0:1d9:0:0:0
+F:SHOW_MODS | COULD2H
+f:COULD2H
+D:A long, wooden pole, usually the height of the wielder. Four of them can be
+D:made out of the trunk of one young tree, hence the name. The quarterstaff
+D:is an excellent weapon for travellers as it doubles both as a walking staff
+D:and as a deterrent against brigands. The quarterstaff is used more in
+D:fencing and brawling than melee combat.
+
+N:55:& War Hammer~
+G:\:D8
+I:21:8:0
+W:5:0:120:225
+A:5/1
+P:0:3d3:0:0:0
+F:SHOW_MODS | COULD2H
+f:COULD2H
+D:A large hammer, designed to crush skulls with mighty strikes.
+
+N:56:& Lead-Filled Mace~
+G:\:D
+I:21:15:0
+W:15:0:180:502
+A:15/1
+P:0:3d4:0:0:0
+F:SHOW_MODS | COULD2H
+f:COULD2H
+D:A large, mean mace filled with lead in order to wreak a maximum of havoc.
+
+N:57:& Mace~ of Disruption
+G:\:v
+I:21:20:0
+W:80:0:400:4300
+A:80/5
+P:0:5d8:0:0:0
+F:SLAY_UNDEAD | SHOW_MODS | MUST2H
+f:MUST2H | SLAY_UNDEAD
+D:This mace is custom-made for priests that go out to destroy evil.
+D:It is deadly, especially for undead.
+
+N:58:& Lucerne Hammer~
+G:\:B
+I:21:10:0
+W:10:0:120:376
+A:10/1
+P:0:2d5:0:0:0
+F:SHOW_MODS | COULD2H
+f:COULD2H
+D:A war hammer combined with a spearpoint, mounted on a long pole.
+
+##### Polearms #####
+
+N:59:& Beaked Axe~
+G:/:s
+I:22:10:0
+W:15:0:180:408
+A:15/1
+P:0:2d6:0:0:0
+F:SHOW_MODS | MUST2H
+f:MUST2H
+D:This polearm has a beak mounted opposite the blade.
+
+N:60:& Glaive~
+G:/:s
+I:22:13:0
+W:20:0:190:363
+A:20/1
+P:0:2d6:0:0:0
+F:SHOW_MODS | COULD2H
+f:COULD2H
+D:A polearm with a long, slightly curved knife-like blade. It has spurs on
+D:the dull side of the blade. It's primarily a slashing and chopping weapon. Glaives
+D:are often used to protect archers, crossbowmen, and gunners while they reload.
+D:Outside of combat they are a popular processional weapon and therefore many
+D:have ornately carved blades.
+
+N:61:& Halberd~
+G:/:s
+I:22:15:0
+W:25:0:190:430
+A:25/1
+P:0:3d5:0:0:0
+F:SHOW_MODS | COULD2H
+f:COULD2H
+D:The halberd has a broad, short axe blade on a 5-6 ft long haft, with a
+D:spearpoint at the top, often a back-spike and occasionally a butt-spike. Used to
+D:combat heavier armour. It's usually used for cutting and stabbing. It's the most
+D:versatile polearm in Middle-earth. The axe is used in general melee. The top
+D:pike is used to pierce armour, or is set against a cavalry charge. The back
+D:hook could unseat horses, trip opponents, parry a blow, or be a general
+D:piercing weapon.
+
+N:62:& Awl-Pike~
+G:/:s
+I:22:4:0
+W:10:0:160:340
+A:10/1
+P:0:1d8:0:0:0
+F:SHOW_MODS | COULD2H
+f:COULD2H
+D:This is a polearm with a long square-sectioned spike on the end.
+
+N:63:& Pike~
+G:/:s
+I:22:8:0
+W:15:0:160:358
+A:15/1
+P:0:2d5:0:0:0
+F:SHOW_MODS | COULD2H
+f:COULD2H
+D:A staff, 16-18 feet long, that has a small piercing head about 10 inches
+D:long. The pike is often used by infantry to fend off cavalry. It is very
+D:effective against mounted troops.
+
+N:64:& Spear~
+G:/:s
+I:22:2:0
+W:5:0:50:36
+A:5/1
+P:0:1d6:0:0:0
+F:SHOW_MODS
+D:Spears tend to have a strong, wide, leaf-shaped head with a ridge down the
+D:middle. The spearhead is attached to the wooden shaft by a socket. The
+D:sockets are usually riveted to the shaft and some have two small lugs near
+D:the base of the socket to allow the head to be possibly bound on as well.
+D:This spear is 7 feet long.
+
+N:65:& Trident~
+G:/:y
+I:22:5:0
+W:5:0:70:120
+A:5/1
+P:0:1d8:0:0:0
+F:SHOW_MODS | COULD2H
+f:COULD2H
+D:The trident is based on the pitchfork. In fact, when not used as a weapon,
+D:it is often employed as a pitchfork. It is famous for its uses in
+D:gladiatorial arenas. It is used much like a spear and could even be thrown
+D:like one in desperate situations.
+
+N:66:& Lance~
+G:/:s
+I:22:20:0
+W:10:0:300:230
+A:10/1
+P:0:2d8:0:0:0
+F:SHOW_MODS | MUST2H
+f:MUST2H
+D:This is the original polearm. It is shaped like a spear but is bigger. It's
+D:meant to fend off enemies, not to be thrown.
+
+N:67:& Great Axe~
+G:/:s
+I:24:25:0
+W:40:0:230:500
+A:40/1
+P:0:4d4:0:0:0
+F:SHOW_MODS | MUST2H
+f:MUST2H
+D:A huge and heavy two-headed axe.
+
+N:68:& Battle Axe~
+G:/:s
+I:22:22:0
+W:15:0:170:334
+A:15/1
+P:0:2d8:0:0:0
+F:SHOW_MODS | COULD2H
+f:COULD2H
+D:Nordic polearm with a broad blade and a hook mounted on the end of the shaft.
+D:The Nordics' take on the halberd. The polearm of choice for many Nordics,
+D:ideally suited for slashing, thrusting, and unseating cavalry.
+
+N:69:& Lochaber Axe~
+G:/:D
+I:22:28:0
+W:45:0:250:750
+A:45/1
+P:0:3d8:0:0:0
+F:SHOW_MODS | COULD2H
+f:COULD2H
+D:Nordic polearm with a broad blade and a hook mounted on the end of the shaft.
+D:Another Nordic version of the halberd. The polearm of choice for many Nordics,
+D:this weapon is ideally suited for slashing, thrusting, and unseating cavalry.
+
+N:70:& Broad Axe~
+G:/:s
+I:24:11:0
+W:15:0:160:304
+A:15/1
+P:0:2d6:0:0:0
+F:SHOW_MODS | COULD2H
+f:COULD2H
+D:A one-headed axe made for combat, with an elongated moon-shaped blade.
+
+N:71:& Scythe~
+G:/:s
+I:22:17:0
+W:45:0:250:800
+A:45/1
+P:0:5d3:0:0:0
+F:SHOW_MODS | COULD2H
+f:COULD2H
+D:A simple farm implement, converted into a weapon by slightly straightening
+D:its blade and putting it in line with its pole, instead of the typical
+D:right angle.
+
+N:72:& Scythe~ of Slicing
+G:/:r
+I:22:30:0
+W:80:0:250:10000
+A:80/20
+P:0:8d4:0:0:0
+F:SHOW_MODS | MUST2H | WOUNDING | VORPAL
+f:MUST2H | VORPAL | WOUNDING
+D:The simple design of the war scythe, but this one uses a finely crafted and
+D:incredibly sharp steel blade which causes terrible wounds when it hits.
+
+##### Bows, Crossbows, Slings #####
+
+N:73:& Short Bow~
+G:}:U
+I:19:12:0
+W:3:0:30:50
+A:3/1:50/2
+F:SHOW_MODS
+D:A piece of bent wood, fitted with a string. Easy to transport and use, but
+D:its effect is not very impressive. You can 'f'ire it after you 'w'ield it.
+
+N:74:& Long Bow~
+G:}:U
+I:19:13:0
+W:10:0:40:120
+A:10/1:70/2
+F:SHOW_MODS
+D:A bow almost as long as a human. It takes considerable strength and skill to
+D:use and is rather awkward to carry around inside buildings. Nevertheless, it
+D:shoots arrows with astonishing force. You can 'f'ire it after you 'w'ield it.
+
+N:75:& Light Crossbow~
+G:}:s
+I:19:23:0
+W:15:0:110:140
+A:15/1:60/2
+F:SHOW_MODS
+D:A metal bow mounted on a wooden stock. It is used for shooting bolts. This
+D:design is relatively light and not too difficult to cock, but also shoots its
+D:quarrels with less force. You can 'f'ire with it after you 'w'ield it.
+
+N:76:& Heavy Crossbow~
+G:}:s
+I:19:24:0
+W:30:0:200:300
+A:30/1:80/2
+F:SHOW_MODS
+D:A metal bow mounted on a wooden stock, with attached cocking mechanism. It
+D:takes considerable time and strength to cock it and it's rather heavy.
+D:However, it hurls its ammunition with incredible force. You can 'f'ire with
+D:it after you 'w'ield it.
+
+N:77:& Sling~
+G:}:u
+I:19:2:0
+W:1:0:5:5
+A:1/1:40/2
+F:SHOW_MODS
+D:A simple cloth or leather pouch with two strings attached. It is used to hurl
+D:pebbles or iron shots. You can 'f'ire with it after you 'w'ield it.
+
+##### Missiles #####
+
+N:78:& Arrow~
+G:{:U
+I:17:1:0
+W:3:0:2:1
+A:3/1:15/1:50/1
+P:0:1d4:0:0:0
+F:SHOW_MODS
+D:A simple metal head on a piece of wood or bamboo, fitted with some feathers.
+D:You can use it for 'f'iring a bow.
+
+N:79:& Seeker Arrow~
+G:{:G
+I:17:2:0
+W:55:0:2:20
+A:55/2:80/2
+P:0:4d4:0:0:0
+F:SHOW_MODS
+D:A precision-made arrow, which allows you to hit precisely the most vulnerable
+D:place of an opponent. You can use it for 'f'iring a bow.
+
+N:80:& Bolt~
+G:{:s
+I:18:1:0
+W:3:0:3:2
+A:3/1:25/1:60/1
+P:0:1d5:0:0:0
+F:SHOW_MODS
+D:Short metal arrows, to be fired with crossbows. You can use it for 'f'iring a
+D:crossbow.
+
+N:81:& Seeker Bolt~
+G:{:B
+I:18:2:0
+W:65:0:3:25
+A:65/2:90/2
+P:0:4d5:0:0:0
+F:SHOW_MODS
+D:A precision-made bolt, which allows you to hit exactly the most vulnerable
+D:place of an opponent. You can use it for 'f'iring a crossbow.
+
+N:82:& Rounded Pebble~
+G:{:s
+I:16:0:0
+W:0:0:4:1
+A:0/1:10/2
+P:0:1d2:0:0:0
+F:SHOW_MODS
+D:Small round stones. When fired with a sling, they could even hurt a giant.
+D:You can use them for 'f'iring a sling.
+
+N:83:& Iron Shot~
+G:{:s
+I:16:1:0
+W:3:0:5:2
+A:3/1:40/2
+P:0:1d4:0:0:0
+F:SHOW_MODS
+D:Metal balls, made for shooting with slings. You can use them for 'f'iring a
+D:sling.
+
+##### Shovels and Picks #####
+
+N:84:& Shovel~
+G:\:s
+I:20:1:1
+W:1:0:60:10
+A:5/2
+P:0:1d2:0:0:0
+F:TUNNEL
+f:TUNNEL
+D:A simple digging tool for shovelling away rubble and maybe even soft rock.
+
+N:85:& Gnomish Shovel~
+G:\:G
+I:20:2:2
+W:20:0:60:100
+A:20/3
+P:0:1d2:0:0:0
+F:TUNNEL
+f:TUNNEL
+D:Crafted by the gnomes, its design profits greatly from the gnomes' expertise
+D:honed in the burrowing of their hovels.
+
+N:86:& Dwarven Shovel~
+G:\:B
+I:20:3:3
+W:40:0:120:200
+A:40/4
+P:0:1d3:0:0:0
+F:TUNNEL
+f:TUNNEL
+D:The lighter digging tool used by dwarves to remove debris, but also good
+D:enough to clear away bits of rock when no pick is easily available.
+
+N:87:& Pick~
+G:\:s
+I:20:4:1
+W:5:0:150:50
+A:10/2
+P:0:1d3:0:0:0
+F:TUNNEL
+f:TUNNEL
+D:A heavy digging tool, primarily for earthworking, but also good for tunnelling
+D:through stone, if one is willing to perform the time-consuming labour.
+
+N:88:& Orcish Pick~
+G:\:g
+I:20:5:2
+W:30:0:180:300
+A:30/3
+P:0:1d3:0:0:0
+F:TUNNEL
+f:TUNNEL
+D:Although orcs tend to dig rather untidy mines and overcome difficulties in
+D:this work less by skill than mere stubbornness, they have amassed
+D:quite some expertise in mining, which has gone into this digging tool.
+
+N:89:& Dwarven Pick~
+G:\:b
+I:20:6:3
+W:50:0:200:600
+A:50/4
+P:0:1d4:0:0:0
+F:TUNNEL
+f:TUNNEL
+D:The dwarves, miners of legend, have made this pick, which is so expertly
+D:crafted that even weaklings can bore through solid rock with it.
+
+##### Armour #####
+
+N:90:& Elven Cloak~
+G:(:G
+I:35:2:0
+W:30:0:5:1500
+A:30/4
+P:4:0d0:0:0:4
+F:IGNORE_ACID | IGNORE_COLD | IGNORE_FIRE | IGNORE_ELEC
+F:STEALTH | SEARCH | LUCK
+f:STEALTH
+D:A wonderfully light cloak coloured in brown and green hues. Its colouring
+D:greatly helps the wearer to avoid undesired attention. Wearing it makes you
+D:feel lucky and somehow you seem to see what was meant to stay unseen.
+
+N:91:& Pair~ of Soft Leather Boots
+G:]:U
+I:30:2:0
+W:3:0:20:7
+A:3/1
+P:2:1d1:0:0:0
+D:A pair of low boots, comfortable to wear.
+
+N:92:& Pair~ of Hard Leather Boots
+G:]:U
+I:30:3:0
+W:5:0:40:12
+A:5/1
+P:3:1d1:0:0:0
+D:A pair of boots, with hardened leather at the caps, offering a little
+D:extra protection for the feet.
+
+N:93:& Pair~ of Metal Shod Boots
+G:]:s
+I:30:6:0
+W:20:0:80:50
+A:20/1
+P:6:1d1:0:0:0
+D:Heavy boots, with metal strips at the toes, heels and other vulnerable parts,
+D:to better protect the wearer's feet from harm.
+
+N:94:& Hard Leather Cap~
+G:]:u
+I:32:2:0
+W:3:0:15:12
+A:3/1
+P:2:0d0:0:0:0
+D:A piece of protective headgear made from hardened leather, just covering the
+D:skull.
+
+N:95:& Metal Cap~
+G:]:s
+I:32:3:0
+W:10:0:20:30
+A:10/1
+P:3:1d1:0:0:0
+D:A metal skullcap with nose and cheekguards.
+
+N:96:& Iron Helm~
+G:]:s
+I:32:5:0
+W:20:0:75:75
+A:20/1
+P:5:1d3:0:0:0
+D:A large helmet that can protect the entire head. Ventilation and bad vision
+D:can be a problem, however.
+
+N:97:& Steel Helm~
+G:]:W
+I:32:6:0
+W:40:0:60:200
+A:40/1
+P:6:1d3:0:0:0
+D:A helmet which protects the entire head. The expensive steel as base material
+D:allows it to offer very good protection while being fairly light.
+
+N:98:& Iron Crown~
+G:]:s
+I:33:10:0
+W:45:0:20:500
+A:45/1
+P:0:1d1:0:0:0
+D:An iron circlet which might be worn, but which is purely ornamental unless it
+D:has special powers.
+
+N:99:& Golden Crown~
+G:]:y
+I:33:11:0
+W:45:0:30:1000
+A:45/1
+P:0:1d1:0:0:0
+F:IGNORE_ACID
+D:A gilded crown, which just looks good. Sometimes such headgear also has
+D:additional properties which might make it worth wearing.
+
+N:100:& Jewel Encrusted Crown~
+G:]:v
+I:33:12:0
+W:50:0:40:2000
+A:50/1
+P:0:1d1:0:0:0
+F:IGNORE_ACID
+D:A gorgeous-looking silver crown, adorned with several gems. You might wear it
+D:on your head, if you really think you're worthy.
+
+N:101:& Robe~
+G:(:b
+I:36:2:0
+W:1:0:20:4
+A:1/1:50/1
+P:2:0d0:0:0:0
+D:A full-length garment which can be worn on the body. It is not really
+D:armour, but mages often wear them as they are very light and don't hinder
+D:movement much.
+
+N:102:& Filthy Rag~
+G:(:D
+I:36:1:0
+W:0:0:20:1
+A:0/1
+P:1:0d0:0:0:-1
+D:A piece of discarded cloth, smelly and dirty. Probably worthless.
+
+N:103:& Soft Leather Armour~
+G:(:U
+I:36:4:0
+W:3:0:80:18
+A:3/1
+P:4:0d0:0:0:0
+D:A suit of soft armour, light and unencumbering, but not very protective.
+
+N:104:& Soft Studded Leather~
+G:(:U
+I:36:5:0
+W:3:0:90:35
+A:3/1
+P:5:1d1:0:0:0
+D:A leather jerkin with metal studs in critical places offering slightly better
+D:protection.
+
+N:105:& Hard Leather Armour~
+G:(:U
+I:36:6:0
+W:5:0:100:150
+A:5/1
+P:6:1d1:-1:0:0
+D:A leather armour covering only the body. It is made of hardened leather to
+D:make it harder to penetrate. It's also a bit harder to move in, as it is
+D:rather stiff.
+
+N:106:& Hard Studded Leather~
+G:(:U
+I:36:7:0
+W:10:0:110:200
+A:10/1
+P:7:1d2:-1:0:0
+D:A suit of hardened leather armour, reinforced with metal studs.
+
+N:107:& Leather Scale Mail~
+G:(:U
+I:36:11:0
+W:15:0:140:450
+A:15/1
+P:11:1d1:-1:0:0
+D:A suit of armour made of overlapping hardened leather scales. It offers good
+D:protection while still being rather lightweight.
+
+N:108:& Metal Scale Mail~
+G:[:s
+I:37:3:0
+W:25:0:250:550
+A:25/1
+P:13:1d4:-2:0:0
+D:A suit of overlapping metal scales, sewn onto a leather or cloth jerkin.
+
+N:109:& Chain Mail~
+G:[:s
+I:37:4:0
+W:25:0:220:750
+A:25/1
+P:14:1d4:-2:0:0
+D:A suit of interlinked metal rings, to be worn over a woollen garment.
+
+N:110:& Rusty Chain Mail~
+G:[:r
+I:37:1:0
+W:25:0:200:550
+A:25/1
+P:14:1d4:-5:0:-8
+D:This chain mail has rusted beyond repair. It can still be worn, but some of
+D:the rings have gone missing and the rust has made the suit inflexible.
+D:Consequently, it offers very poor protection and is cumbersome to move in.
+
+N:111:& Augmented Chain Mail~
+G:[:s
+I:37:6:0
+W:30:0:270:900
+A:30/1
+P:16:1d4:-2:0:0
+D:A suit of interlinked metal rings, with additional metal plates or scales
+D:covering vulnerable parts of the wearer.
+
+N:112:& Bar Chain Mail~
+G:[:s
+I:37:8:0
+W:35:0:280:950
+A:35/1
+P:18:1d4:-2:0:0
+D:A suit of interlinked metal rings, with additional short metal bars added in
+D:many places to prevent penetration of the armour by piercing attacks.
+
+N:113:& Metal Brigandine Armour~
+G:[:s
+I:37:9:0
+W:35:0:290:1100
+A:35/1
+P:19:1d4:-3:0:0
+D:This is a leather armour with many small metal plates fixed to it, covering
+D:it entirely.
+
+N:114:& Partial Plate Armour~
+G:[:W
+I:37:12:0
+W:45:0:260:1200
+A:45/1
+P:22:1d6:-3:0:0
+D:An armour made of steel plates, covering only the body of the wearer.
+
+N:115:& Metal Lamellar Armour~
+G:[:W
+I:37:13:0
+W:45:0:340:1250
+A:45/1
+P:23:1d6:-3:0:0
+D:Lamellar consists of small rectangular plates (lames) attached to each other
+D:at each edge or corner with leather lacings through small holes in the plates.
+
+N:116:& Full Plate Armour~
+G:[:W
+I:37:15:0
+W:45:0:380:1350
+A:45/1
+P:25:2d4:-3:0:0
+D:A suit of armour made of metal plates, covering the body, arms and upper legs.
+D:A very effective but very heavy armour.
+
+N:117:& Ribbed Plate Armour~
+G:[:W
+I:37:18:0
+W:50:0:380:1500
+A:50/1
+P:28:2d4:-3:0:0
+D:This full suit of armour has been strengthened in places to better deflect or
+D:absorb blows.
+
+N:118:& Galvorn Plate Mail~
+G:[:g
+I:37:30:0
+W:75:0:420:20000
+A:75/4
+P:40:2d4:-4:0:0
+F:IGNORE_ACID | IGNORE_COLD | IGNORE_ELEC | IGNORE_FIRE |
+D:A suit of plate armour fashioned from a metal whose secret is only known to Eol,
+D:the dark Elvensmith. It is practically unbreakable.
+
+N:119:& Mithril Plate Mail~
+G:[:B
+I:37:25:0
+W:60:0:300:15000
+A:60/3
+P:35:2d4:-3:0:0
+F:IGNORE_ACID
+D:A full suit of plate armour, fashioned from the rare true-silver. Only the
+D:dwarves know the secret of making armour or weapons of this metal.
+
+N:120:& Mithril Chain Mail~
+G:[:B
+I:37:20:0
+W:55:0:150:7000
+A:55/3
+P:28:1d4:-1:0:0
+F:IGNORE_ACID
+D:A suit of chain mail, made by dwarven smiths from the rare and precious metal
+D:also called true-silver.
+
+N:121:& Double Chain Mail~
+G:[:s
+I:37:7:0
+W:30:0:250:850
+A:30/1
+P:16:1d4:-2:0:0
+D:A suit of chain mail, with an additional layer of mail in some places.
+
+# This shield does not belong here
+
+N:122:& Shield~ of Deflection
+G:[:B
+I:34:10:0
+W:70:0:100:10000
+A:70/3
+P:10:1d1:0:0:10
+F:IGNORE_ACID
+D:A large shield fashioned from a metal alloy that is not subject to corrosion.
+D:It was especially crafted to better deflect attacks.
+
+### The Cloaks ###
+
+N:123:& Cloak~
+G:(:g
+I:35:1:0
+W:1:0:10:3
+A:1/1:20/1
+P:1:0d0:0:0:0
+D:A cloth coat typically worn as a loose outer garment. It is spacious enough
+D:to be worn even over bulky metal armour.
+
+N:124:& Shadow Cloak~
+G:(:D
+I:35:6:1
+W:60:0:5:7500
+A:75/4
+P:6:0d0:0:0:4
+F:RES_DARK | RES_LITE | STEALTH
+f:STEALTH
+D:A rare cloak imbued with magic to radiate a strange twilight, absorbing both
+D:extreme brightness and darkness.
+
+### The Gloves ###
+
+N:125:& Set~ of Leather Gloves
+G:]:U
+I:31:1:0
+W:1:0:5:3
+A:1/1
+P:1:0d0:0:0:0
+D:Light gloves which do not seriously hinder finger movements, while still
+D:protecting the hands somewhat.
+
+N:126:& Set~ of Gauntlets
+G:]:U
+I:31:2:0
+W:10:0:25:35
+A:10/1
+P:2:1d1:0:0:0
+D:Metal gloves protecting the hands up to the middle of the lower arm.
+
+N:127:& Set~ of Cesti
+G:]:W
+I:31:5:0
+W:50:0:40:100
+A:50/1
+P:5:1d1:0:0:0
+D:A set of metal gloves with nasty spikes and barbs. Though originally made to
+D:help in combat, the additional metal on the backs of the hands also offers a
+D:lot more protection.
+
+### The shields ###
+
+N:128:& Small Leather Shield~
+G:):U
+I:34:2:0
+W:3:0:50:30
+A:3/1
+P:2:1d1:0:0:0
+D:A small disc of lindenwood, with a leather covering on one side.
+
+N:129:& Large Leather Shield~
+G:):U
+I:34:4:0
+W:15:0:100:120
+A:15/1
+P:4:1d2:0:0:0
+D:A large oval or rectangular shield. It is made of wood, typically linden, and
+D:covered with a layer of hardened leather to offer better protection.
+
+N:130:& Small Metal Shield~
+G:):s
+I:34:3:0
+W:10:0:65:50
+A:10/1
+P:3:1d2:0:0:0
+D:A small shield strengthened with a layer of metal.
+
+N:131:& Large Metal Shield~
+G:):s
+I:34:5:0
+W:30:0:120:200
+A:30/1
+P:5:1d3:0:0:0
+D:A large piece of wood, rectangular or oval in shape, and covered with metal
+D:to strengthen it. It's to be worn strapped to the arm not occupied by the
+D:weapon when fighting.
+
+##### Rings #####
+
+N:132:Strength
+G:=:d
+I:45:24:0
+W:30:0:2:500
+A:30/1
+F:STR | HIDE_TYPE | SUST_STR
+f:STR
+D:This bauble magically improves your strength.
+
+N:133:Dexterity
+G:=:d
+I:45:26:0
+W:30:0:2:500
+A:30/1
+F:DEX | HIDE_TYPE | SUST_DEX
+f:DEX
+D:This piece of jewellery magically improves your agility.
+
+N:134:Constitution
+G:=:d
+I:45:27:0
+W:30:0:2:500
+A:30/1
+F:CON | HIDE_TYPE | SUST_CON
+f:CON
+D:This ring magically grants you health, improving your constitution.
+
+N:135:Intelligence
+G:=:d
+I:45:25:0
+W:30:0:2:500
+A:30/1
+F:INT | HIDE_TYPE | SUST_INT
+f:INT
+D:This magical piece of jewellery makes you smarter.
+
+N:136:Speed
+G:=:d
+I:45:31:0
+W:75:0:2:100000
+A:75/1
+F:SPEED | HIDE_TYPE
+f:SPEED
+D:This wonderful ring grants you additional energy, allowing you to act faster.
+
+N:137:Searching
+G:=:d
+I:45:23:0
+W:5:0:2:250
+A:5/1
+F:SEARCH | HIDE_TYPE
+f:SEARCH
+D:This ring magically improves your attention, so you can detect hidden things better.
+
+# New : It can be activated but at the cost of its destruction
+N:138:Teleportation
+G:=:d
+I:45:4:0
+W:5:0:2:250
+A:5/1
+a:HARDCORE=DEST_TELE
+F:CURSED | TELEPORT | EASY_KNOW | ACTIVATE
+f:TELEPORT
+D:This ring will uncontrollably send you to different places at its whim.
+D:You can use its power once at your will, but it will destroy the ring.
+
+N:139:Slow Digestion
+G:=:d
+I:45:6:0
+W:5:0:2:250
+A:5/1
+F:SLOW_DIGEST | EASY_KNOW
+f:SLOW_DIGEST
+D:This magical bauble grants you some sustenance, allowing you to subsist on less food.
+
+N:142:Levitation
+G:=:d
+I:45:7:0
+W:5:0:2:200
+A:5/1
+F:FEATHER | EASY_KNOW
+f:FEATHER
+D:When you put on this ring, you will be able to float just above the floor.
+D:It prevents you from drowning, and all your falls will be painless.
+
+N:143:Poison Resistance
+G:=:d
+I:45:20:0
+W:60:0:2:16000
+A:60/2
+F:RES_POIS | EASY_KNOW
+f:RES_POIS
+D:This magical ring grants protection from poison.
+D:It is rumoured that in deep dungeons monsters can kill you at once if you
+D:don't have poison resistance.
+
+N:144:Free Action
+G:=:d
+I:45:21:0
+W:20:0:2:1500
+A:20/1
+F:FREE_ACT | EASY_KNOW
+f:FREE_ACT
+D:This magical bauble prevents you from being held.
+D:Some monsters will paralyse you and then kill you if you lack free action.
+
+N:145:Weakness
+G:=:d
+I:45:2:-5
+W:5:0:2:0
+A:5/1
+F:CURSED | STR | HIDE_TYPE
+f:STR
+D:This accursed ring will sap your strength, rendering you much weaker as long as you wear it.
+
+N:146:Flames
+G:=:d
+I:45:18:0
+W:50:0:2:3000
+A:50/1
+P:0:0d0:0:0:15
+a:HARDCORE=BA_FIRE_4
+F:RES_FIRE | ACTIVATE
+f:RES_FIRE | IGNORE_FIRE
+D:This fiery circlet grants you protection, makes fire less dangerous and even
+D:allows you to call forth a ball of flame.
+
+N:147:Acid
+G:=:d
+I:45:17:0
+W:50:0:2:3000
+A:50/1
+P:0:0d0:0:0:15
+a:HARDCORE=BA_ACID_4
+F:RES_ACID | ACTIVATE
+f:RES_ACID | IGNORE_ACID
+D:This magical ring is imbued with spells of devouring acid, granting protection against such
+D:assaults and the ability to shoot acid at your foes.
+
+N:148:Ice
+G:=:d
+I:45:19:0
+W:50:0:2:3000
+A:50/1
+a:HARDCORE=BA_COLD_4
+P:0:0d0:0:0:15
+F:RES_COLD | ACTIVATE
+f:RES_COLD | IGNORE_COLD
+D:This ring is imbued with supernatural cold, which makes you less vulnerable to such effects
+D:and occasionally allows you to throw balls of ice at your foes.
+
+N:149:Woe
+G:=:d
+I:45:0:-5
+W:50:0:2:0
+A:50/1
+F:CURSED | TELEPORT | WIS | CHR | HIDE_TYPE | AUTO_CURSE
+D:This accursed ring will turn you into a bumbling fool and, in addition, magically
+D:transports you to places you never wanted to see. It can recurse itself if
+D:you leave it on too long.
+
+N:150:Stupidity
+G:=:d
+I:45:3:-5
+W:5:0:2:0
+A:5/1
+F:CURSED | INT | HIDE_TYPE
+f:INT
+D:This wicked ring feeds off your intellect, magically making you stupid.
+
+N:151:Damage
+G:=:d
+I:45:29:0
+W:20:0:2:500
+A:20/1
+F:HIDE_TYPE
+D:This ring makes your hands magically strong in combat, allowing you to inflict
+D:greater pain with your hand-to-hand attacks.
+
+N:152:Accuracy
+G:=:d
+I:45:28:0
+W:20:0:2:500
+A:20/1
+F:HIDE_TYPE | EASY_USE | ACTIVATE |
+a:HARDCORE=WHIRLWIND
+D:This ring magically improves your control in combat, allowing you to hit more often.
+D:It can also sometimes be used to hit several nearby opponents with deadly accuracy.
+
+N:153:Protection
+G:=:d
+I:45:16:0
+W:10:0:2:500
+A:10/1
+D:This ring creates a magical aura around you, protecting you against the blows of your enemies.
+
+N:154:Aggravate Monster
+G:=:d
+I:45:1:0
+W:5:0:2:0
+A:5/1
+F:CURSED | AGGRAVATE | EASY_KNOW | AUTO_CURSE
+f:AGGRAVATE
+D:This faithless ring will draw opponents' attention towards its hapless owner.
+D:If you have any pets, it will also make them turn against you.
+
+N:155:See Invisible
+G:=:d
+I:45:22:0
+W:30:0:2:340
+A:30/1
+F:SEE_INVIS | EASY_KNOW
+f:SEE_INVIS
+D:This magical piece of jewellery allows your eyes to perceive beings otherwise unseen.
+
+N:162:Slaying
+G:=:d
+I:45:30:0
+W:40:0:2:1000
+A:40/1
+F:SHOW_MODS
+D:This ring magically improves your fighting prowess, allowing to hit more often and harder.
+
+##### Amulets #####
+
+N:163:Brilliance
+G:":d
+I:40:6:0
+W:50:0:3:1000
+A:50/4
+F:INT | WIS | HIDE_TYPE | LITE1
+D:This talisman grants a sharper wit, greater insight and brightness to light dark places.
+
+N:164:Charisma
+G:":d
+I:40:7:0
+W:30:0:3:500
+A:30/1
+F:CHR | HIDE_TYPE
+f:CHR
+D:This amulet grants beauty beyond mere looks.
+
+N:165:Searching
+G:":d
+I:40:5:0
+W:15:0:3:600
+A:15/1
+F:SEARCH | HIDE_TYPE
+f:SEARCH
+D:This amulet grants keen sight, finding things that are hidden.
+
+N:166:Teleportation
+G:":d
+I:40:1:0
+W:10:0:3:250
+A:10/1
+F:CURSED | TELEPORT | EASY_KNOW
+f:TELEPORT
+D:This amulet nastily throws you all over the place.
+
+# Replacing Adornment with Protection from Evil from T-Plus by Ingeborg S. Norden
+
+N:169:Protection from Evil
+G:":d
+I:40:2:0
+W:25:0:3:10000
+A:25/1
+F:EASY_KNOW | ACTIVATE | BLESSED | ESP_EVIL
+a:HARDCORE=PROT_EVIL
+D:This blessed amulet fends off evil beings and warns the wearer
+D:of their presence.
+
+##### Extra armour #####
+
+N:170:& Double Ring Mail~
+G:[:s
+I:37:5:0
+W:25:0:230:700
+A:25/1
+P:15:1d4:-2:0:0
+D:A suit of leather armour with metal rings sewn onto it. In addition, in important parts it is
+D:reinforced with mail.
+
+##### Additional amulets #####
+
+N:171:the Magi
+G:":d
+I:40:8:0
+W:70:0:3:30000
+A:70/8
+P:0:0d0:-4:-4:0
+F:INT | SUST_INT | SEARCH | SPELL_CONTAIN | WIELD_CAST
+F:FREE_ACT | RES_BLIND | RES_CONF |
+F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD
+D:This rare amulet is highly desirable for mages, as it makes its wearer smarter, more attentive
+D:and impervious to magics which would make their own magic-use impossible.
+
+N:172:Doom
+G:":d
+I:40:0:-5
+W:50:0:3:0
+A:50/1
+F:CURSED | STR | INT | WIS | DEX | CON | CHR | HIDE_TYPE
+F:AUTO_CURSE | CURSE_NO_DROP
+D:This wicked amulet will drain all your abilities, turning you into a mere shadow of yourself. It
+D:is exceedingly hard to get rid of.
+
+##### Scrolls #####
+
+N:173:Enchant Weapon To-Hit
+G:?:d
+I:70:17:0
+W:15:0:5:125
+A:15/1
+D:This magical scroll will allow you to improve the accuracy of a weapon in your possession.
+D:However, weapons which are already very highly enchanted are more difficult to improve
+D:further.
+
+N:174:Enchant Weapon To-Dam
+G:?:d
+I:70:18:0
+W:15:0:5:125
+A:15/1
+D:Upon reading this scroll, a magical enchantment will be placed on a weapon in your
+D:possession, increasing the pain it inflicts when hitting. On very highly enchanted weapons this
+D:enchantment may fail, wasting the scroll.
+
+N:175:Enchant Armour
+G:?:d
+I:70:16:0
+W:15:0:5:125
+A:15/1
+D:This scroll will try to enchant a piece of armour in your possession, making it more effective
+D:in protecting you. Highly enchanted armour is likely not to accept this enchantment, however.
+
+N:176:Identify
+G:?:d
+I:70:12:0
+W:1:0:5:50
+A:1/1:5/1:10/1:30/1
+D:If you read this scroll, the identity of an item you specify will be laid open to you.
+
+N:177:*Identify*
+G:?:d
+I:70:13:0
+W:30:0:5:1000
+A:30/1:50/2:80/1:100/1
+D:This scroll will allow you to gain insight into an object's special properties.
+D:Only the highly magical objects, like rare rings and amulets or very unusual weapons
+D:and armour possess abilities which warrant the use of this magic.
+
+N:178:Rumour
+G:?:d
+I:70:51:0
+W:1:0:5:10
+A:1/1
+D:A piece of paper inscribed with a little text. You may meditate over it or ignore it at your
+D:leisure.
+
+N:179:Chaos
+G:?:d
+I:70:50:0
+W:100:0:5:10000
+A:100/8
+F:IGNORE_FIRE | IGNORE_ACID | IGNORE_COLD | IGNORE_ELEC
+D:A piece of paper inscribed with strange shifting runes. Upon reading them, they will release
+D:a blast of chaotic forces.
+
+N:180:Remove Curse
+G:?:d
+I:70:14:0
+W:10:0:5:100
+A:10/1:20/2:40/2
+D:A scroll inscribed with a beneficial formula. Upon reading it, evil magics will be removed
+D:from your possessions.
+
+N:181:Light
+G:?:d
+I:70:24:0
+W:0:0:5:15
+A:0/1:3/1:10/1
+D:A scroll which will create a permanent magical light, illuminating your surroundings.
+
+N:182:Fire
+G:?:d
+I:70:48:0
+W:50:0:5:1000
+A:50/4
+F:IGNORE_FIRE
+D:A piece of paper inscribed with runes glowing brightly red. Upon reading them, a large blast
+D:of fire will be released.
+
+N:183:Ice
+G:?:d
+I:70:49:0
+W:75:0:5:5000
+A:75/6
+F:IGNORE_COLD
+D:A piece of paper inscribed with light-blue runes that radiate a strange cold. Upon reading them,
+D:a large icy blast will be released.
+
+N:184:Summon Monsters
+G:?:d
+I:70:4:0
+W:1:0:5:0
+A:1/1
+D:This scroll was made by mischievous sorcerers. If it is read, a few creatures will appear to fight
+D:you.
+
+N:185:Phase Door
+G:?:d
+I:70:8:0
+W:1:0:5:15
+A:1/1
+D:Upon reading this scroll, you will be translocated over a short distance.
+
+N:186:Teleportation
+G:?:d
+I:70:9:0
+W:10:0:5:40
+A:10/1
+D:If you read this scroll, you will immediately be transported to another place on the level.
+
+N:187:Teleport Level
+G:?:d
+I:70:10:0
+W:20:0:5:50
+A:20/1
+D:This scroll will magically transport you to the level directly above or below, when read.
+
+N:188:Monster Confusion
+G:?:d
+I:70:36:0
+W:5:0:5:30
+A:5/1
+D:Reading this scroll will cause your hands to glow with a strange mesmerising light that will
+D:attempt to confuse the next creature you hit with a hand or weapon attack.
+
+N:189:Magic Mapping
+G:?:d
+I:70:25:0
+W:5:0:5:40
+A:5/1
+D:Reading this scroll will reveal the layout of your immediate surroundings to you.
+
+N:190:Rune of Protection
+G:?:d
+I:70:38:0
+W:50:0:5:500
+A:50/2:90/4
+D:This scroll is inscribed with a powerful protective incantation. When read, this will erect a
+D:strong magical ward around the location you currently stand on. Be aware that this magic is
+D:easily disturbed by already present structures and thus cannot work where an object is lying, or
+D:on a trap.
+
+N:191:*Remove Curse*
+G:?:d
+I:70:15:0
+W:50:0:5:8000
+A:50/2:75/2:85/2:95/1
+D:This valuable scroll is inscribed with a powerful blessing capable of dispelling all but the
+D:mightiest curses which may have been laid on your possessions.
+
+N:192:Treasure Detection
+G:?:d
+I:70:26:0
+W:0:0:5:15
+A:0/1
+D:This scroll magically reveals the locations of nearby loose change to you.
+
+N:193:Object Detection
+G:?:d
+I:70:27:0
+W:0:0:5:15
+A:0/1
+D:This scroll shows nearby objects to you. It only makes you aware of items on the floor,
+D:however, not those carried by creatures.
+
+N:194:Trap Detection
+G:?:d
+I:70:28:0
+W:5:0:5:35
+A:5/1:10/1
+D:This scroll is very helpful, because it reveals the locations of nearby snares and traps which you
+D:might otherwise blunder into.
+
+##### Extra ammunition #####
+
+N:195:& Sheaf Arrow~
+G:{:o
+I:17:1:0
+W:10:0:4:3
+A:15/2:50/2
+P:0:1d5:0:0:0
+F:SHOW_MODS
+D:These arrows have bigger arrowheads and bigger feathers.
+D:They also make bigger holes.
+
+N:196:& Mithril Shot~
+G:{:B
+I:16:2:0
+W:40:0:4:20
+A:40/2:65/1
+P:0:3d4:5:5:0
+F:SHOW_MODS | IGNORE_ACID
+D:Sling bullets made from the slags of mithril smelting. They are unusually heavy, hitting
+D:with great force, and are almost imperishable.
+
+##### Additional scrolls #####
+
+N:197:Door/Stair Location
+G:?:d
+I:70:29:0
+W:5:0:5:35
+A:5/1:10/1:15/1
+D:This scroll will reveal nearby doors and stairs.
+
+N:198:Acquirement
+G:?:d
+I:70:46:0
+W:20:0:5:100000
+A:20/8
+D:A great treasure is magically stored within the shimmering runes of this scroll. Reading the
+D:words will release it.
+
+N:199:*Acquirement*
+G:?:d
+I:70:47:0
+W:60:0:5:200000
+A:60/16
+D:Several great treasures have been hidden in a magical compartment. This scroll serves as the
+D:key and will release them when read.
+
+N:200:Mass Genocide
+G:?:d
+I:70:45:0
+W:50:0:5:1000
+A:50/4:100/4
+D:An astoundingly powerful death spell is stored in the runes of this spell. Reading
+D:it will annihilate all nearby creatures. Only a few beings of legendary stature
+D:can withstand it.
+
+N:201:Detect Invisible
+G:?:d
+I:70:30:0
+W:1:0:5:15
+A:1/1
+D:A minor detection spell is stored in this scroll, showing you the locations of otherwise
+D:unseen beings for a brief moment.
+
+N:202:Aggravation
+G:?:d
+I:70:1:0
+W:5:0:5:0
+A:5/1
+D:This nasty scroll will make a loud noise when read, waking up foes in your vicinity.
+
+N:203:Trap Creation
+G:?:d
+I:70:7:0
+W:10:0:5:0
+A:10/1
+D:If you read this rather annoying scroll, snares and pitfalls will magically be planted all around
+D:you, ready to do nasty things to you once you walk onto them.
+
+N:204:Trap/Door Destruction
+G:?:d
+I:70:39:0
+W:10:0:5:50
+A:10/1
+D:A very specifically destructive spell is written on this scroll. It will smash all traps and all
+D:doors immediately next to you.
+
+N:205:Artifact Creation
+G:?:d
+I:70:52:0
+W:70:0:5:200000
+A:70/16
+D:The mighty magic on this scroll will imbue a mundane item you possess with supernatural powers,
+D:also rendering the object indestructible.
+
+N:206:Recharging
+G:?:d
+I:70:22:0
+W:40:0:5:200
+A:40/1
+D:This scroll is inscribed with a spell releasing the enchantments used to give wands and
+D:staves their power, allowing you to replenish their spent charges.
+
+N:207:Genocide
+G:?:d
+I:70:44:0
+W:40:0:5:750
+A:40/4:80/4
+D:This rare and powerful scroll will annihilate all members of a specified race of monsters in
+D:your current location, but this will also exact a price of pain from you.
+
+N:208:Darkness
+G:?:d
+I:70:0:0
+W:1:0:5:0
+A:1/1
+D:This scroll will create a blast of utter darkness, which then fades to leave the immediate
+D:surroundings in a lasting gloom. The extreme darkness can blind those who are not used to
+D:it.
+
+N:209:Protection from Evil
+G:?:d
+I:70:37:0
+W:30:0:5:250
+A:30/1
+D:Upon reading the runes on this piece of paper, a faint aura of holiness will spring into existence
+D:around you, protecting you from blows of evil creatures, unless they are more powerful than you.
+
+N:210:Satisfy Hunger
+G:?:d
+I:70:32:0
+W:5:0:5:10
+A:5/1:20/1:50/1:75/1
+D:Reading this scroll will create a nutritious mass in your stomach, satisfying your hunger.
+
+N:211:Dispel Undead
+G:?:d
+I:70:42:0
+W:40:0:5:200
+A:40/1
+D:A powerful exorcism is inscribed on this scroll. When read it will hurt undead abominations
+D:nearby, possibly even destroying them.
+
+N:212:*Enchant Weapon*
+G:?:d
+I:70:21:0
+W:50:0:5:500
+A:50/1
+D:Reading this scroll will magically infuse a weapon of your choice, making it more effective
+D:in combat. It may not work on weapons that are already powerful or unique.
+
+N:213:Curse Weapon
+G:?:d
+I:70:3:0
+W:50:0:5:0
+A:50/1
+D:This scroll will ruin your weapon beyond repair. Only weapons of legend have a hope of
+D:escaping destruction, but even they will often be shattered.
+
+N:214:*Enchant Armour*
+G:?:d
+I:70:20:0
+W:50:0:5:500
+A:50/1:50/1
+D:This scroll will place a great enchantment on a piece of armour of your choice, making it much
+D:better at protecting you. Mark that improving armours which are already highly enchanted is very
+D:difficult and will often fail.
+
+N:215:Curse Armour
+G:?:d
+I:70:2:0
+W:50:0:5:0
+A:50/1
+D:This scroll bears a curse that will tear your armour to shreds.
+
+N:216:Summon Undead
+G:?:d
+I:70:5:0
+W:15:0:5:0
+A:15/1
+D:These spells scribed by ancient necromancers will call their horrible creatures to haunt you.
+
+N:217:Blessing
+G:?:d
+I:70:33:0
+W:1:0:5:15
+A:1/1
+D:The recitation of this scroll will grant you a blessing of the Valar, making you more confident
+D:in attack and defence for a few moments.
+
+N:218:Holy Chant
+G:?:d
+I:70:34:0
+W:10:0:5:40
+A:10/1
+D:This blessing will give you a holy warrior's prowess in battle for a while.
+
+N:219:Holy Prayer
+G:?:d
+I:70:35:0
+W:25:0:5:80
+A:25/1
+D:This incantation lets you fight as a warrior of Valinor for quite a while, supreme in attack and
+D:defence.
+
+N:220:Word of Recall
+G:?:d
+I:70:11:0
+W:5:0:5:150
+A:5/1
+D:The spell on this scroll will slowly build an ethereal conduit to the surface for you if you are in
+D:a dungeon, and into the dungeon if you are above ground. Upon completion, which takes a while, you
+D:will suddenly be translocated to the other place.
+
+N:221:*Destruction*
+G:?:d
+I:70:41:0
+W:40:0:5:250
+A:40/1
+D:This scroll is inscribed with a mighty conjuration which wrecks the dungeon all around you.
+D:Monsters and objects will be annihilated by this blast; only completely indestructible things can
+D:withstand it.
+
+##### Potions #####
+
+N:222:Slime Mold Juice
+G:!:d
+I:71:2:400
+W:0:0:4:2
+A:0/1
+P:0:1d1:0:0:0
+F:FOUNTAIN
+D:A strange sort of yellowish-green slime, too viscous to even slosh in the bottle.
+
+N:223:Apple Juice
+G:!:d
+I:71:1:250
+W:0:0:4:1
+A:0/1
+P:0:1d1:0:0:0
+F:FOUNTAIN
+D:A healthy fruit beverage.
+
+N:224:Water
+G:!:d
+I:71:0:200
+W:0:0:4:1
+A:0/1
+P:0:1d1:0:0:0
+F:FOUNTAIN
+D:A small bottle filled with pure water.
+
+N:225:Strength
+G:!:d
+I:71:48:0
+W:20:0:4:8000
+A:20/6:25/3:30/1
+P:0:1d1:0:0:0
+D:This beneficial potion will permanently improve your physical strength.
+
+N:226:Weakness
+G:!:d
+I:71:16:0
+W:3:0:4:0
+A:3/1
+P:0:3d12:0:0:0
+F:FOUNTAIN
+D:This nasty potion will sap your strength, making you weaker.
+
+N:227:Restore Strength
+G:!:d
+I:71:42:0
+W:25:0:4:300
+A:25/1
+P:0:1d1:0:0:0
+F:FOUNTAIN
+D:This magical potion will bring back your physical power to its full extent, should it be drained.
+
+N:228:Intelligence
+G:!:d
+I:71:49:0
+W:20:0:4:8000
+A:20/6:25/3:30/1
+P:0:1d1:0:0:0
+D:This beneficial potion will magically enhance your wit, permanently improving your intellect.
+
+N:229:Stupidity
+G:!:d
+I:71:17:0
+W:20:0:4:0
+A:20/1
+P:0:1d1:0:0:0
+F:FOUNTAIN
+D:This accursed potion will cloud your intellect, making you stupid.
+
+N:230:Restore Intelligence
+G:!:d
+I:71:43:0
+W:25:0:4:300
+A:25/1
+P:0:1d1:0:0:0
+F:FOUNTAIN
+D:This beneficial potion will magically heal your brain, restoring drained intelligence.
+
+N:231:Wisdom
+G:!:d
+I:71:50:0
+W:20:0:4:8000
+A:20/6:25/3:30/1
+P:0:1d1:0:0:0
+D:This potion grants great insight, making you permanently wiser.
+
+N:232:Naivety
+G:!:d
+I:71:18:0
+W:20:0:4:0
+A:20/1
+P:0:1d1:0:0:0
+F:FOUNTAIN
+D:This potion casts a shadow on your knowledge, making you naive.
+
+N:233:Restore Wisdom
+G:!:d
+I:71:44:0
+W:25:0:4:300
+A:25/1
+P:0:1d1:0:0:0
+F:FOUNTAIN
+D:This potion benefits the naive, bringing back their wisdom to what it once was.
+
+N:234:Charisma
+G:!:d
+I:71:53:0
+W:20:0:4:1000
+A:20/1:25/1
+P:0:1d1:0:0:0
+F:FOUNTAIN
+D:This potion infuses you with permanent beauty and charm.
+
+N:235:Ugliness
+G:!:d
+I:71:21:0
+W:20:0:4:0
+A:20/1
+P:0:1d1:0:0:0
+F:FOUNTAIN
+D:This wicked potion slightly twists your features, making you appear less fair.
+
+N:236:Restore Charisma
+G:!:d
+I:71:47:0
+W:20:0:4:300
+A:20/1
+P:0:1d1:0:0:0
+F:FOUNTAIN
+D:This useful potion restores drained charm.
+
+N:237:Curing
+G:!:d
+I:71:61:100
+W:18:0:4:250
+A:18/1:40/1
+P:0:1d1:0:0:0
+F:FOUNTAIN
+D:This blessed potion helps to recover from a wide variety of ailments.
+
+### Note! Invulnerability decreases your food... ###
+
+N:238:Invulnerability
+G:!:d
+I:71:62:-2500
+W:90:0:4:100000
+A:90/9
+P:0:1d1:0:0:0
+F:FOUNTAIN
+D:This immensely powerful potion makes your physique almost indestructible for a very short
+D:time. Very rarely, an attempt to hurt you will still succeed, so don't be too confident.
+
+N:239:New Life
+G:!:d
+I:71:63:100
+W:50:0:4:750000
+A:50/20:100/10:120/5
+P:0:1d1:0:0:0
+F:FOUNTAIN
+D:This potion fundamentally twists your physical features, as if you were another mother's child.
+D:Your physique will be shaped anew. This may make you more or less hardy in battle.
+
+N:240:Cure Serious Wounds
+G:!:d
+I:71:35:100
+W:3:0:4:40
+A:3/1
+P:0:1d1:0:0:0
+F:FOUNTAIN
+D:This beneficial potion will cure some wounds and other inhibiting ailments.
+
+N:241:Cure Critical Wounds
+G:!:d
+I:71:36:100
+W:5:0:4:100
+A:5/1
+P:0:1d1:0:0:0
+F:FOUNTAIN
+D:This potion will cure a good bit of hurt you have suffered and also allows you to recover
+D:from unhealthy conditions like blood poisoning, confusion or blindness.
+
+N:242:Healing
+G:!:d
+I:71:37:200
+W:15:0:4:300
+A:15/1:30/1:60/1
+P:0:1d1:0:0:0
+F:FOUNTAIN
+D:This blessed potion greatly heals you and also cures many other ailments from
+D:which you might suffer.
+
+N:243:Constitution
+G:!:d
+I:71:52:0
+W:20:0:4:8000
+A:20/6:25/3:30/1
+P:0:1d1:0:0:0
+D:This magical concoction greatly improves your health, making you permanently tougher.
+
+N:244:Experience
+G:!:d
+I:71:59:0
+W:65:0:4:25000
+A:65/1
+P:0:1d1:0:0:0
+D:This exceptional drink instills into you knowledge, allowing you to advance further in your trade.
+
+N:245:Sleep
+G:!:d
+I:71:11:100
+W:0:0:4:0
+A:0/1
+P:0:1d1:0:0:0
+F:FOUNTAIN
+D:This potion will make you fall asleep for some turns, allowing monsters
+D:to attack you with impunity.
+
+N:246:Blindness
+G:!:d
+I:71:7:0
+W:0:0:4:0
+A:0/1
+P:0:1d1:0:0:0
+F:FOUNTAIN
+D:This slightly poisonous potion temporarily impedes your eyesight, making you unable to see.
+
+N:247:Booze
+G:!:d
+I:71:9:50
+W:0:0:4:0
+A:0/1
+P:0:1d1:0:0:0
+F:FOUNTAIN
+D:A small bottle of a dark brown distilled beverage. It will impede your ability to see clearly.
+
+N:248:Poison
+G:!:d
+I:71:6:0
+W:3:0:4:0
+A:3/1
+P:0:1d1:0:0:0
+F:FOUNTAIN
+D:This bottle is filled with a mild but still dangerous liquid poison. Drinking it would be highly
+D:unwise.
+
+N:249:Speed
+G:!:d
+I:71:29:0
+W:1:0:4:75
+A:1/1:40/1:60/1
+P:0:1d1:0:0:0
+F:FOUNTAIN
+D:A magical drink which temporarily allows you to act much faster.
+
+N:250:Slowness
+G:!:d
+I:71:4:50
+W:1:0:4:0
+A:1/1
+P:0:1d1:0:0:0
+F:FOUNTAIN
+D:A magical concoction that will temporarily force you to move and act a lot slower.
+
+N:251:Dexterity
+G:!:d
+I:71:51:0
+W:20:0:4:8000
+A:20/6:25/3:30/1
+P:0:1d1:0:0:0
+D:A strange magical drink which permanently improves your agility.
+
+N:252:Restore Dexterity
+G:!:d
+I:71:45:0
+W:25:0:4:300
+A:25/1
+P:0:1d1:0:0:0
+F:FOUNTAIN
+D:This magical brew brings your agility back to its former glory should it have been reduced.
+
+N:253:Restore Constitution
+G:!:d
+I:71:46:0
+W:25:0:4:300
+A:25/1
+P:0:1d1:0:0:0
+F:FOUNTAIN
+D:A beneficial magical concoction, restoring your damaged health.
+
+N:254:Lose Memories
+G:!:d
+I:71:13:0
+W:10:0:4:0
+A:10/1
+P:0:1d1:0:0:0
+F:FOUNTAIN
+D:This wicked potion will make you lose a lot of the experience you've gained.
+
+N:255:Salt Water
+G:!:d
+I:71:5:0
+W:0:0:4:1
+A:0/1
+P:0:1d1:0:0:0
+F:FOUNTAIN
+D:A solution of salt in water, made for curing meat. Drinking it causes violent nausea.
+
+N:256:Enlightenment
+G:!:d
+I:71:56:0
+W:25:0:4:800
+A:25/1:50/1:100/1
+P:0:1d1:0:0:0
+F:FOUNTAIN
+D:An exceptional magical drink which lets you "remember" your current location as if you had
+D:already seen all of it.
+
+N:257:Heroism
+G:!:d
+I:71:32:0
+W:1:0:4:35
+A:1/1
+P:0:1d1:0:0:0
+F:FOUNTAIN
+D:Quaffing this potion will temporarily make you fight like a hero of great might.
+
+N:258:Berserk Strength
+G:!:d
+I:71:33:0
+W:3:0:4:100
+A:3/1
+P:0:1d1:0:0:0
+F:FOUNTAIN
+D:This strange drink will instill in you a wild battle rage for a while.
+
+N:259:Boldness
+G:!:d
+I:71:28:0
+W:1:0:4:10
+A:1/1
+P:0:1d1:0:0:0
+F:FOUNTAIN
+D:This drink will improve your courage, dispelling all fear.
+
+N:260:Restore Life Levels
+G:!:d
+I:71:41:0
+W:40:0:4:400
+A:40/1
+P:0:1d1:0:0:0
+F:FOUNTAIN
+D:If your life force has been drained, this blessed brew will bring it back.
+
+N:261:Resist Heat
+G:!:d
+I:71:30:0
+W:1:0:4:30
+A:1/1
+P:0:1d1:0:0:0
+F:FOUNTAIN
+D:This magical potion will render you less vulnerable to outward heat.
+
+N:262:Resist Cold
+G:!:d
+I:71:31:0
+W:1:0:4:30
+A:1/1
+P:0:1d1:0:0:0
+F:FOUNTAIN
+D:This magical potion will for a short while grant you a familiarity with frost, so that you take
+D:less harm from extreme cold.
+
+N:263:Detect Invisible
+G:!:d
+I:71:25:0
+W:3:0:4:50
+A:3/1
+P:0:1d1:0:0:0
+F:FOUNTAIN
+D:This magical concoction will temporarily improve your eyesight so that you can see creatures
+D:otherwise unseen.
+
+N:264:Slow Poison
+G:!:d
+I:71:26:0
+W:1:0:4:25
+A:1/1
+P:0:1d1:0:0:0
+F:FOUNTAIN
+D:This healthy potion will dilute poisons in your blood and reduce the damage they cause.
+
+N:265:Neutralise Poison
+G:!:d
+I:71:27:0
+W:5:0:4:75
+A:5/1
+P:0:1d1:0:0:0
+F:FOUNTAIN
+D:This powerful antidote will negate the effect of all poisons currently affecting you.
+
+N:266:Restore Mana
+G:!:d
+I:71:40:0
+W:25:0:4:350
+A:25/1
+P:0:1d1:0:0:0
+F:FOUNTAIN
+D:This potion infuses the drinker with pure magic force, bringing their magical potential back to
+D:its full extent.
+
+N:267:Infra-vision
+G:!:d
+I:71:24:0
+W:3:0:4:20
+A:3/1
+P:0:1d1:0:0:0
+F:FOUNTAIN
+D:This potion temporarily grants or improves the ability to optically perceive heat sources.
+
+N:268:Resistance
+G:!:d
+I:71:60:100
+W:20:0:4:250
+A:20/1:45/1:80/1:100/1
+P:0:1d1:0:0:0
+F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD
+F:FOUNTAIN
+D:This great potion infuses you with the power of the elements, so that you can better
+D:withstand their ravages.
+
+##### Wands #####
+
+# Wand of school spells
+N:269:Spell
+G:-:d
+I:65:1:0
+W:3:0:10:100
+A:3/1:13/1:23/1:43/1:63/1:83/1
+P:0:1d1:0:0:0
+F:SPECIAL_GENE
+
+N:270:Manathrust
+G:-:d
+I:65:3:-1:SPELL=Manathrust
+W:3:0:10:100
+A:3/1
+P:0:1d1:0:0:0
+
+N:271:Fireflash
+G:-:d
+I:65:4:-1:SPELL=Fireflash
+W:10:0:10:100
+A:10/2
+P:0:1d1:0:0:0
+
+N:272:Firewall
+G:-:d
+I:65:5:-1:SPELL=Firewall
+W:20:0:10:100
+A:20/1
+P:0:1d1:0:0:0
+
+N:273:Tidal Wave
+G:-:d
+I:65:6:-1:SPELL=Tidal Wave
+W:20:0:10:100
+A:20/1
+P:0:1d1:0:0:0
+
+N:274:Ice Storm
+G:-:d
+I:65:7:-1:SPELL=Ice Storm
+W:15:0:10:100
+A:15/1
+P:0:1d1:0:0:0
+
+N:275:Noxious Cloud
+G:-:d
+I:65:8:-1:SPELL=Noxious Cloud
+W:5:0:10:100
+A:5/2
+P:0:1d1:0:0:0
+
+N:276:Poison Blood
+G:-:d
+I:65:9:-1:SPELL=Poison Blood
+W:30:0:10:100
+A:30/2
+P:0:1d1:0:0:0
+
+N:277:Thunderstorm
+G:-:d
+I:65:10:-1:SPELL=Thunderstorm
+W:40:0:10:100
+A:40/2
+P:0:1d1:0:0:0
+
+N:278:Dig
+G:-:d
+I:65:11:-1:SPELL=Dig
+W:15:0:10:100
+A:15/1
+P:0:1d1:0:0:0
+
+N:279:Stone Prison
+G:-:d
+I:65:12:-1:SPELL=Stone Prison
+W:50:0:10:100
+A:50/3
+P:0:1d1:0:0:0
+
+N:280:Strike
+G:-:d
+I:65:13:-1:SPELL=Strike
+W:30:0:10:100
+A:30/1
+P:0:1d1:0:0:0
+
+N:281:Teleport Away
+G:-:d
+I:65:14:-1:SPELL=Teleport Away
+W:20:0:10:100
+A:20/1
+P:0:1d1:0:0:0
+
+N:282:Summon Animal
+G:-:d
+I:65:15:-1:SPELL=Summon Animal
+W:60:0:10:100
+A:60/1
+P:0:1d1:0:0:0
+
+N:283:Magelock
+G:-:d
+I:65:16:-1:SPELL=Magelock
+W:1:0:10:100
+A:3/2
+P:0:1d1:0:0:0
+
+N:284:Slow Monster
+G:-:d
+I:65:17:-1:SPELL=Slow Monster
+W:3:0:10:100
+A:3/2
+P:0:1d1:0:0:0
+
+N:285:Essence of Speed
+G:-:d
+I:65:18:-1:SPELL=Essence of Speed
+W:25:0:10:100
+A:25/2
+P:0:1d1:0:0:0
+
+N:286:Banishment
+G:-:d
+I:65:19:-1:SPELL=Banishment
+W:45:0:10:100
+A:45/2
+P:0:1d1:0:0:0
+
+N:287:Disperse Magic
+G:-:d
+I:65:20:-1:SPELL=Disperse Magic
+W:10:0:10:100
+A:10/2
+P:0:1d1:0:0:0
+
+N:288:Charm
+G:-:d
+I:65:21:-1:SPELL=Charm
+W:15:0:10:100
+A:15/1
+P:0:1d1:0:0:0
+
+N:289:Confuse
+G:-:d
+I:65:22:-1:SPELL=Confuse
+W:7:0:10:100
+A:7/2
+P:0:1d1:0:0:0
+
+N:290:Demon Blade
+G:-:d
+I:65:23:-1:SPELL=Demon Blade
+W:60:0:10:100
+A:60/1
+P:0:1d1:0:0:0
+
+N:291:Heal Monster
+G:-:d
+I:65:24:-1:SPELL=Heal Monster
+W:1:0:10:0
+A:1/4
+P:0:1d1:0:0:0
+
+N:292:Haste Monster
+G:-:d
+I:65:25:-1:SPELL=Haste Monster
+W:1:0:10:0
+A:1/4
+P:0:1d1:0:0:0
+
+
+##### Extra ammunition #####
+
+N:293:& Flight Arrow~
+G:{:y
+I:17:1:0
+W:3:0:1:1
+A:3/2
+P:0:1d3:0:0:0
+F:SHOW_MODS
+D:An arrow designed for longer flight. Consequently, it is lighter and hits with less force. You can use it for 'f'iring a bow.
+
+# XXX
+
+N:295:& Boulder~
+G:*:W
+I:11:1:0
+W:3:0:50:1
+A:3/200
+P:0:5d5:0:0:0
+F:SPECIAL_GENE
+D:A big nasty-looking piece of rock.
+
+# Used for a quest
+N:296:& Flame~ Imperishable
+G:~:v
+I:11:255:0
+W:127:0:4:0
+A:127/255
+P:0:1d1:0:0:0
+T:39:2
+F:NORM_ART | FULL_NAME | SPECIAL_GENE
+F:ACTIVATE | ACTIVATE_NO_WIELD
+a:SPELL=Artifact Eternal Flame
+D:An impossibly bright, flickering living flame. It can be used
+D:once to imbue an object with the power of Eru Iluvatar himself.
+
+N:297:& Necromantic Teeth~
+G:|:D
+I:23:34:0
+W:0:0:7:10
+A:0/1:5/1:10/1:20/1
+P:0:1d4:0:0:0
+F:SHOW_MODS | VAMPIRIC | SPECIAL_GENE
+D:A temporary weapon that only a necromancer can use.
+
+# The Horn of the Thunderlords
+N:298:& Golden Horn~ of the Thunderlords
+G:_:d
+I:55:23:-1:SPELL=Artifact Thunderlords
+W:50:10:10:12000
+P:0:1d4:0:0:0
+A:50/200
+T:55:8
+F:IGNORE_ACID | IGNORE_FIRE | IGNORE_ELEC | IGNORE_COLD |
+F:NO_RECHARGE | EASY_USE | RECHARGED | NORM_ART | FULL_NAME | SPECIAL_GENE
+D:This horn was given to you as a reward. Blow it if you are in dire need
+D:of leaving your current location fast.
+
+# XXX
+
+##### Staves #####
+
+N:300:Spell
+G:_:d
+I:55:1:0
+W:5:0:50:100
+A:5/1:15/1:35/1:45/1:65/1:75/1:85/1:95/1
+P:0:1d2:0:0:0
+F:SPECIAL_GENE
+
+N:301:Nothing
+G:_:d
+I:55:2:-1:SPELL=Nothing
+W:5:0:50:100
+A:5/1
+P:0:1d2:0:0:0
+
+N:302:Globe of Light
+G:_:d
+I:55:3:-1:SPELL=Globe of Light
+W:7:0:50:100
+A:7/1
+P:0:1d2:0:0:0
+
+N:303:Fiery Shield
+G:_:d
+I:55:4:-1:SPELL=Fiery Shield
+W:15:0:50:100
+A:15/2
+P:0:1d2:0:0:0
+
+N:304:Remove Curses
+G:_:d
+I:55:5:-1:SPELL=Remove Curses
+W:10:0:50:100
+A:10/1
+P:0:1d2:0:0:0
+
+N:305:Wings of Winds
+G:_:d
+I:55:6:-1:SPELL=Wings of Winds
+W:25:0:50:100
+A:25/2
+P:0:1d2:0:0:0
+
+N:306:Shake
+G:_:d
+I:55:7:-1:SPELL=Shake
+W:30:0:50:100
+A:30/1
+P:0:1d2:0:0:0
+
+N:307:Disarm
+G:_:d
+I:55:8:-1:SPELL=Disarm
+W:2:0:50:100
+A:2/1
+P:0:1d2:0:0:0
+
+N:308:Teleportation
+G:_:d
+I:55:9:-1:SPELL=Teleportation
+W:20:0:50:100
+A:20/1
+P:0:1d2:0:0:0
+
+N:309:Probability Travel
+G:_:d
+I:55:10:-1:SPELL=Probability Travel
+W:50:0:50:100
+A:50/3
+P:0:1d2:0:0:0
+
+N:310:Recovery
+G:_:d
+I:55:11:-1:SPELL=Recovery
+W:20:0:50:100
+A:20/1
+P:0:1d2:0:0:0
+
+N:311:Healing
+G:_:d
+I:55:12:-1:SPELL=Healing
+W:25:0:50:100
+A:25/2
+P:0:1d2:0:0:0
+
+N:312:Vision
+G:_:d
+I:55:13:-1:SPELL=Vision
+W:30:0:50:100
+A:30/1
+P:0:1d2:0:0:0
+
+N:313:Identify
+G:_:d
+I:55:14:-1:SPELL=Identify
+W:10:0:50:100
+A:10/1
+P:0:1d2:0:0:0
+
+N:314:Sense Hidden
+G:_:d
+I:55:15:-1:SPELL=Sense Hidden
+W:10:0:50:100
+A:10/1
+P:0:1d2:0:0:0
+
+N:315:Reveal Ways
+G:_:d
+I:55:16:-1:SPELL=Reveal Ways
+W:5:0:50:100
+A:5/1
+P:0:1d2:0:0:0
+
+N:316:Sense Monsters
+G:_:d
+I:55:17:-1:SPELL=Sense Monsters
+W:5:0:50:100
+A:5/1
+P:0:1d2:0:0:0
+
+N:317:Genocide
+G:_:d
+I:55:18:-1:SPELL=Genocide
+W:55:0:50:100
+A:55/2
+P:0:1d2:0:0:0
+
+N:318:Summon
+G:_:d
+I:55:19:-1:SPELL=Summon
+W:5:0:50:100
+A:5/1
+P:0:1d2:0:0:0
+
+N:319:Sterilization
+G:_:d
+I:55:24:-1:SPELL=Sterilize
+W:20:0:50:100
+A:20/3
+P:0:1d2:0:0:0
+
+N:320:Wish
+G:_:d
+I:55:20:-1:SPELL=Wish
+W:95:0:50:10000
+A:95/40
+P:0:1d2:0:0:0
+F:NO_RECHARGE
+
+N:321:Mana
+G:_:d
+I:55:21:-1:SPELL=Mana
+W:60:0:50:100
+A:60/2
+P:0:1d2:0:0:0
+
+# XXX
+# ...
+# XXX
+
+##### School Books #####
+
+N:330:& Tome~ of Magical Energy
+G:?:B
+I:111:0:0
+W:50:0:30:25000
+A:50/4
+P:0:1d1:0:0:0
+F:FULL_NAME | EASY_KNOW
+D:The slick black cover of this tome seems to glow
+D:with an inner violet light. You feel more attuned
+D:to raw magic as you hold it.
+
+N:331:& Tome~ of the Eternal Flame
+G:?:R
+I:111:1:0
+W:50:0:30:25000
+A:50/4
+P:0:1d1:0:0:0
+F:FULL_NAME | EASY_KNOW | IGNORE_FIRE
+D:The cover of this tome is bright red, with flickering
+D:flames dancing across it once in a while. As you hold
+D:it, you begin to gain a much closer knowledge of all
+D:that is fiery.
+
+N:332:& Tome~ of the Blowing Wind
+G:?:b
+I:111:2:0
+W:50:0:30:25000
+A:50/4
+P:0:1d1:0:0:0
+F:FULL_NAME | EASY_KNOW | IGNORE_ELEC
+D:The pages of this tome have a tendency to turn themselves,
+D:as though flipped by an errant wind. As you hold it,
+D:you start feeling wind at your fingertips.
+
+N:333:& Tome~ of the Impenetrable Earth
+G:?:U
+I:111:3:0
+W:50:0:30:25000
+A:50/4
+P:0:1d1:0:0:0
+F:FULL_NAME | EASY_KNOW | IGNORE_ACID
+D:The solid leather cover of this tome seems permanently
+D:stained with caked mud and grass. Heavy it is to lift,
+D:yet strangely comforting to hold - you feel stronger
+D:and better supported.
+
+N:334:& Tome~ of the Everrunning Wave
+G:?:B
+I:111:4:0
+W:50:0:30:25000
+A:50/4
+P:0:1d1:0:0:0
+F:FULL_NAME | EASY_KNOW
+D:The cover and pages of this tome seem to be perpetually
+D:wet, though they are not wet to the touch. As you hold
+D:it, you begin to understand ocean storms better.
+
+N:335:& Tome~ of Translocation
+G:?:B
+I:111:5:0
+W:50:0:30:25000
+A:50/4
+P:0:1d1:0:0:0
+F:FULL_NAME | EASY_KNOW
+D:This book seems to flicker strangely. It's one of those books
+D:with an annoying tendency to disappear when you need it and
+D:reappear in the unlikeliest places. As you hold it, you start
+D:to understand what conveyance really means.
+
+N:336:& Tome~ of the Tree
+G:?:G
+I:111:6:0
+W:50:0:30:25000
+A:50/4
+P:0:1d1:0:0:0
+F:FULL_NAME | EASY_KNOW
+D:The cover of this tome is a bright shade of green, and it gives off
+D:a healthy, zesty scent that makes your thoughts clearer. As you
+D:hold it, your heart goes out to all living things upon Arda.
+
+N:337:& Tome~ of Knowledge
+G:?:D
+I:111:7:0
+W:50:0:30:25000
+A:50/4
+P:0:1d1:0:0:0
+F:FULL_NAME | EASY_KNOW
+D:A thick book with solid leather binding. It looks entirely
+D:unremarkable, but as you hold it, you feel strangely able
+D:to learn the inner workings of things and creatures.
+
+##### Chests #####
+
+N:338:& Small wooden chest~
+G:~:s
+I:7:1:0
+W:5:0:250:20
+A:5/1
+P:0:2d3:0:0:0
+D:A small wooden box, locked and possibly trapped.
+
+N:339:& Large wooden chest~
+G:~:s
+I:7:5:0
+W:15:0:500:60
+A:15/1
+P:0:2d5:0:0:0
+D:A large wooden box, locked and possibly trapped
+
+N:340:& Small iron chest~
+G:~:s
+I:7:2:0
+W:25:0:300:100
+A:25/1
+P:0:2d4:0:0:0
+D:A small rectangular container made of wood and reinforced with iron corners and latches.
+D:It is locked and possibly trapped.
+
+N:341:& Large iron chest~
+G:~:s
+I:7:6:0
+W:35:0:1000:150
+A:35/1
+P:0:2d6:0:0:0
+D:A large container made of wood, with a heavy iron lock, and probably a trap.
+
+N:342:& Small steel chest~
+G:~:s
+I:7:3:0
+W:45:0:500:200
+A:45/1
+P:0:2d4:0:0:0
+D:A small wooden box with strong steel locks and reinforcements. It's likely to be trapped.
+
+N:343:& Large steel chest~
+G:~:s
+I:7:7:0
+W:55:0:1000:250
+A:55/1
+P:0:2d6:0:0:0
+D:A nearly indestructible chest of wood and steel. The lock doesn't look impenetrable, but it
+D:might be trapped.
+
+N:344:& Ruined chest~
+G:~:s
+I:7:0:0
+W:0:0:250:0
+A:75/1
+D:A broken, empty chest.
+
+##### Various Stuff #####
+
+N:345:& Iron Spike~
+G:~:W
+I:5:0:0
+W:1:0:10:1
+A:1/1
+P:0:1d1:0:0:0
+D:A small spur of iron. Ramming one between a door and its frame might jam it.
+
+N:346:& Wooden Torch~
+G:~:u
+I:39:0:0:4000
+W:1:0:30:2
+A:1/1
+P:0:1d1:0:0:0
+F:EASY_KNOW | LITE1 | FUEL_LITE
+f:LITE1 | FUEL_LITE
+D:A piece of wood with an oily rag wrapped around it. When lit, it will give off a little light and
+D:much smoke.
+
+N:347:& Brass Lantern~
+G:~:U
+I:39:1:0:7500
+W:3:0:50:35
+A:3/1
+P:0:1d1:0:0:0
+F:EASY_KNOW | IGNORE_FIRE | LITE2 | FUEL_LITE
+f:LITE2 | FUEL_LITE
+D:A brass container with a wick emerging from it, protected from draughts by a sheet of greased
+D:paper. It can be carried by a handle.
+
+N:348:& Flask~ of oil
+G:!:y
+I:77:0:7500
+W:1:0:10:3
+A:1/1
+P:0:2d6:0:0:0
+D:A small clay container, filled with thick oil. The oil is flammable and can be used as lantern
+D:fuel.
+
+N:349:& Empty Bottle~
+G:!:w
+I:2:1:0
+W:0:0:2:1
+A:0/1
+P:0:1d1:0:0:0
+D:A small glass bottle. It's empty.
+
+
+##### Here are the Rod Tips #####
+
+N:350:Havoc
+G:-:d
+I:66:28:90
+W:95:0:15:150000
+A:100/16
+P:0:1d1:0:0:0
+F:IGNORE_ACID | IGNORE_COLD | IGNORE_ELEC | IGNORE_FIRE
+D:This powerful rod will release great blasts of destructive energy, but there's no knowing what
+D:this effect will concentrate on.
+
+N:351:Door/Stair Location
+G:-:d
+I:66:1:10
+W:15:0:15:1000
+A:15/1
+P:0:1d1:0:0:0
+F:IGNORE_ACID | IGNORE_COLD | IGNORE_ELEC | IGNORE_FIRE
+D:When fuelled with enough ambient mana, this rod can detect nearby passages.
+
+N:352:Trap Location
+G:-:d
+I:66:29:8
+W:5:0:15:100
+A:5/1:10/1:20/1
+P:0:1d1:0:0:0
+F:IGNORE_ACID | IGNORE_COLD | IGNORE_ELEC | IGNORE_FIRE
+D:Zapping this rod will release a minor detection magic, alerting you of nearby pits and snares.
+
+N:353:Probing
+G:-:d
+I:66:7:50
+W:40:0:15:4000
+A:40/4
+P:0:1d1:0:0:0
+F:IGNORE_ACID | IGNORE_COLD | IGNORE_ELEC | IGNORE_FIRE
+D:A rod of knowledge which will tell you about nearby creatures' health.
+D:If they are sleeping, the intrusion will wake them.
+
+N:354:Recall
+G:-:d
+I:66:3:80
+W:30:0:15:4500
+A:30/4
+P:0:1d1:0:0:0
+F:IGNORE_ACID | IGNORE_COLD | IGNORE_ELEC | IGNORE_FIRE
+D:A rod which can transport you from the depths to your home and back.
+
+N:355:Illumination
+G:-:d
+I:66:4:8
+W:20:0:15:1000
+A:20/1
+P:0:1d1:0:0:0
+F:EASY_KNOW
+F:IGNORE_ACID | IGNORE_COLD | IGNORE_ELEC | IGNORE_FIRE
+D:This rod carries a minor spell of brightness, lighting your immediate surroundings whenever
+D:activated.
+
+N:356:Light
+G:-:d
+I:66:15:15
+W:10:0:15:500
+A:10/1
+P:0:1d1:0:0:0
+F:IGNORE_ACID | IGNORE_COLD | IGNORE_ELEC | IGNORE_FIRE
+D:This rod can shoot a lance of bright light, hurting creatures which lurk in the dark.
+
+N:357:Lightning Bolts
+G:-:d
+I:66:21:30
+W:20:0:15:2000
+A:20/1
+P:0:1d1:0:0:0
+F:IGNORE_ACID | IGNORE_COLD | IGNORE_ELEC | IGNORE_FIRE
+D:This rod shoots a small spark of lightning, zapping the creature it hits.
+
+N:358:Frost Bolts
+G:-:d
+I:66:23:35
+W:25:0:15:2500
+A:25/1
+P:0:1d1:0:0:0
+F:IGNORE_ACID | IGNORE_COLD | IGNORE_ELEC | IGNORE_FIRE
+D:A small but extremely cold shard of ice will fly from this rod to the enemy you zap it at.
+
+N:359:Fire Bolts
+G:-:d
+I:66:22:40
+W:30:0:15:3000
+A:30/1
+P:0:1d1:0:0:0
+F:IGNORE_ACID | IGNORE_COLD | IGNORE_ELEC | IGNORE_FIRE
+D:This rod fires a magical flaming arrow at your foe, burning them.
+
+N:360:Polymorph
+G:-:d
+I:66:19:25
+W:35:0:15:1200
+A:35/1
+P:0:1d1:0:0:0
+F:IGNORE_ACID | IGNORE_COLD | IGNORE_ELEC | IGNORE_FIRE
+D:This rod of change will cause its target creature to mutate into someone else.
+D:Beware, it can make a weak enemy into a more powerful one.
+
+N:361:Slow Monster
+G:-:d
+I:66:17:25
+W:30:0:15:1500
+A:30/1
+P:0:1d1:0:0:0
+F:IGNORE_ACID | IGNORE_COLD | IGNORE_ELEC | IGNORE_FIRE
+D:This obstructive rod will slow the creature its spell hits.
+
+N:362:Sleep Monster
+G:-:d
+I:66:16:25
+W:30:0:15:1500
+A:30/1
+P:0:1d1:0:0:0
+F:IGNORE_ACID | IGNORE_COLD | IGNORE_ELEC | IGNORE_FIRE
+D:This sorcerous rod will cause its target to stop in its tracks.
+
+N:363:Drain Life
+G:-:d
+I:66:18:30
+W:75:0:15:3600
+A:75/4
+P:0:1d1:0:0:0
+F:IGNORE_ACID | IGNORE_COLD | IGNORE_ELEC | IGNORE_FIRE
+D:This necromantic magical rod will hurt a living creature struck by its spell.
+
+N:364:Teleport Other
+G:-:d
+I:66:13:60
+W:45:0:15:1400
+A:45/2
+P:0:1d1:0:0:0
+F:IGNORE_ACID | IGNORE_COLD | IGNORE_ELEC | IGNORE_FIRE
+D:This rod of movement will displace its target to another location.
+
+N:365:Disarming
+G:-:d
+I:66:14:50
+W:35:0:15:2100
+A:35/1
+P:0:1d1:0:0:0
+F:IGNORE_ACID | IGNORE_COLD | IGNORE_ELEC | IGNORE_FIRE
+D:This rod will clear a path for you, triggering and thus rendering harmless all traps on the way.
+
+N:366:Lightning Balls
+G:-:d
+I:66:25:50
+W:55:0:15:4000
+A:55/1
+P:0:1d1:0:0:0
+F:IGNORE_ACID | IGNORE_COLD | IGNORE_ELEC | IGNORE_FIRE
+D:This rod will hurl a large ball of lightning at its target, electrifying all it engulfs.
+
+N:367:Cold Balls
+G:-:d
+I:66:27:55
+W:60:0:15:4500
+A:60/1
+P:0:1d1:0:0:0
+F:IGNORE_ACID | IGNORE_COLD | IGNORE_ELEC | IGNORE_FIRE
+D:This rod will call forth a minor storm of ice which freezes everything in the area of its blast.
+
+N:368:Fire Balls
+G:-:d
+I:66:26:60
+W:75:0:15:5000
+A:75/1
+P:0:1d1:0:0:0
+D:This rod will cause a small storm of flame to rage in a small circular area of your choice.
+F:IGNORE_ACID | IGNORE_COLD | IGNORE_ELEC | IGNORE_FIRE
+
+N:369:Acid Balls
+G:-:d
+I:66:24:60
+W:70:0:15:5500
+A:70/1
+P:0:1d1:0:0:0
+F:IGNORE_ACID | IGNORE_COLD | IGNORE_ELEC | IGNORE_FIRE
+D:This destructive rod will drown its target and its immediate surroundings in caustic acid.
+
+N:370:Acid Bolts
+G:-:d
+I:66:20:40
+W:40:0:15:3500
+A:40/1
+P:0:1d1:0:0:0
+F:IGNORE_ACID | IGNORE_COLD | IGNORE_ELEC | IGNORE_FIRE
+D:This rod will shoot a small glob of powerful acid at its target.
+
+N:371:Enlightenment
+G:-:d
+I:66:5:40
+W:65:0:15:10000
+A:65/4
+P:0:1d1:0:0:0
+F:IGNORE_ACID | IGNORE_COLD | IGNORE_ELEC | IGNORE_FIRE
+D:This rod grants you knowledge of your surroundings.
+
+N:372:Perception
+G:-:d
+I:66:2:20
+W:50:0:15:13000
+A:50/8:100/8
+P:0:1d1:0:0:0
+F:IGNORE_ACID | IGNORE_COLD | IGNORE_ELEC | IGNORE_FIRE
+D:This rod makes you insightful, laying open the identity of your possessions.
+
+N:373:Curing
+G:-:d
+I:66:8:35
+W:65:0:15:15000
+A:65/8
+P:0:1d1:0:0:0
+F:IGNORE_ACID | IGNORE_COLD | IGNORE_ELEC | IGNORE_FIRE
+D:This is a rod with minor healing powers, alleviating many disabling conditions.
+
+N:374:Healing
+G:-:d
+I:66:9:120
+W:80:0:15:20000
+A:80/8
+P:0:1d1:0:0:0
+F:IGNORE_ACID | IGNORE_COLD | IGNORE_ELEC | IGNORE_FIRE
+D:This rod has major healing powers and can restore your health if you have been wounded.
+
+N:375:Detection
+G:-:d
+I:66:6:80
+W:30:0:15:5000
+A:30/8
+P:0:1d1:0:0:0
+F:IGNORE_ACID | IGNORE_COLD | IGNORE_ELEC | IGNORE_FIRE
+D:This rod grants knowledge about all things worthy of notice in your vicinity.
+
+N:376:Restoration
+G:-:d
+I:66:10:140
+W:80:0:15:25000
+A:80/16
+P:0:1d1:0:0:0
+F:IGNORE_ACID | IGNORE_COLD | IGNORE_ELEC | IGNORE_FIRE
+D:This rod lets you remember and gain back previously reduced abilities.
+
+N:377:Speed
+G:-:d
+I:66:11:100
+W:95:0:15:50000
+A:95/16
+P:0:1d1:0:0:0
+F:IGNORE_ACID | IGNORE_COLD | IGNORE_ELEC | IGNORE_FIRE
+D:This energising rod will allow you to act a lot faster for some time.
+
+# Ring of Spell
+
+N:378:Spell
+G:=:d
+I:45:58:0
+W:10:0:2:1000
+A:10/1
+F:SPELL_CONTAIN | WIELD_CAST
+f:SPELL_CONTAIN
+D:This ring is a container for spells. Those that are skilled in copying spells can inscribe a
+D:spell onto it.
+
+# Amulet of Spell
+
+N:379:Spell
+G:":d
+I:40:27:0
+W:10:0:2:1000
+A:10/1
+F:SPELL_CONTAIN | WIELD_CAST
+f:SPELL_CONTAIN
+D:This amulet is a container for spells. Those that are skilled in copying spells can inscribe a
+D:spell onto it.
+
+# XXX
+# XXX
+# XXX
+# XXX
+# XXX
+# XXX
+# XXX
+# XXX
+# XXX
+# XXX
+# XXX
+
+##### 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
+D:A yellowing, mud-stained, cracked skull.
+
+N:392:& Broken Bone~
+G:~:w
+I:1:2:0
+W:0:0:2:0
+A:0/1
+P:0:1d1:0:0:0
+D:A yellowish bone, broken off.
+
+N:393:& Canine Skeleton~
+G:~:w
+I:1:4:0
+W:1:0:10:0
+A:1/1
+P:0:1d1:0:0:0
+D:The only thing this dog has is its bones.
+
+N:394:& Rodent Skeleton~
+G:~:w
+I:1:3:0
+W:1:0:10:0
+A:1/1
+P:0:1d1:0:0:0
+D:A dead critter's remains.
+
+N:395:& Human Skeleton~
+G:~:w
+I:1:8:0
+W:5:0:60:0
+A:5/1
+P:0:1d2:0:0:0
+D:The remains of a human who met his or her demise here.
+
+N:396:& Dwarf Skeleton~
+G:~:w
+I:1:7:0
+W:5:0:50:0
+A:5/1
+P:0:1d2:0:0:0
+D:The remains of a dwarf who met his or her demise here.
+
+N:397:& Elf Skeleton~
+G:~:w
+I:1:6:0
+W:5:0:40:0
+A:5/1
+P:0:1d2:0:0:0
+D:The remains of an elf who met his or her demise here.
+
+N:398:& Gnome Skeleton~
+G:~:w
+I:1:5:0
+W:5:0:30:0
+A:5/1
+P:0:1d2:0:0:0
+D:The remains of a gnome who met his or her demise here.
+
+##### Additional weapon #####
+
+N:399:& Great Hammer~
+G:\:D
+I:21:19:0
+W:45:0:300:350
+A:45/3
+P:0:4d6:0:0:0
+F:SHOW_MODS
+D:A massive smith's hammer, so large and heavy it can be used as a weapon.
+
+##### Dragon Scale Mail #####
+
+N:400:& Black Dragon Scale Mail~
+G:[:s
+I:38:1:0
+W:60:0:200:50000
+A:60/8
+P:30:2d4:-2:0:10
+a:HARDCORE=BR_ACID
+F:RES_ACID | FLY |
+f:RES_ACID |
+F:ACTIVATE | IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD
+D:A pitch-black armour made from a black dragon's hide.
+D:It contains some of the dead beast's powers.
+
+N:401:& Blue Dragon Scale Mail~
+G:[:b
+I:38:2:0
+W:50:0:200:40000
+A:50/8
+P:30:2d4:-2:0:10
+a:HARDCORE=BR_ELEC
+F:RES_ELEC | FLY |
+f:RES_ELEC |
+F:ACTIVATE | IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD
+D:A shimmering bright blue armour made from a blue dragon's hide.
+D:It contains some of the dead beast's powers.
+
+N:402:& White Dragon Scale Mail~
+G:[:w
+I:38:3:0
+W:50:0:200:40000
+A:50/8
+a:HARDCORE=BR_COLD
+P:30:2d4:-2:0:10
+F:RES_COLD | FLY |
+f:RES_COLD |
+F:ACTIVATE | IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD
+D:A gleaming white armour made from a white dragon's hide.
+D:It contains some of the dead beast's powers.
+
+N:403:& Red Dragon Scale Mail~
+G:[:r
+I:38:4:0
+W:60:0:200:50000
+A:60/8
+P:30:2d4:-2:0:10
+a:HARDCORE=BR_FIRE
+F:RES_FIRE | FLY |
+f:RES_FIRE |
+F:ACTIVATE | IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD
+D:A glowing red armour made from a red dragon's hide.
+D:It contains some of the dead beast's powers.
+
+N:404:& Green Dragon Scale Mail~
+G:[:g
+I:38:5:0
+W:50:0:200:40000
+A:50/8
+P:30:2d4:-2:0:10
+a:HARDCORE=BR_POIS
+F:RES_POIS | FLY |
+f:RES_POIS |
+F:ACTIVATE | IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD
+D:A dirty green, foul-smelling armour made from a green dragon's hide.
+D:It contains some of the dead beast's powers.
+
+N:405:& Multi-Hued Dragon Scale Mail~
+G:[:v
+I:38:6:0
+W:90:0:200:150000
+A:90/32
+P:30:2d4:-2:0:10
+a:HARDCORE=BR_MANY
+F:ATTR_MULTI
+F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD | RES_POIS | FLY |
+f:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD | RES_POIS |
+F:ACTIVATE | IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD
+D:A powerful armour glowing red, blue, green, black, and white.
+D:made from a multihued dragon's hide, it contains some of the dead beast's powers.
+
+N:406:& Pseudo Dragon Scale Mail~
+G:[:v
+I:38:10:0
+W:70:0:200:70000
+A:70/16
+P:30:2d4:-2:0:10
+a:HARDCORE=BR_LIGHT
+F:RES_LITE | RES_DARK | FLY |
+F:ACTIVATE | IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD
+D:A strangely glowing armour made from a pseudo-dragon's hide.
+D:It contains some of the dead beast's powers.
+
+N:407:& Law Dragon Scale Mail~
+G:[:B
+I:38:12:0
+W:80:0:200:80000
+A:80/16
+P:30:2d4:-2:0:10
+a:HARDCORE=BR_SHARD
+F:RES_SOUND | RES_SHARDS | FLY |
+F:ACTIVATE | IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD
+D:A sharp-scaled armour that seems to roar, made from a law dragon's hide.
+D:It contains some of the dead beast's powers.
+
+N:408:& Bronze Dragon Scale Mail~
+G:[:U
+I:38:14:0
+W:50:0:200:40000
+A:50/8
+P:30:2d4:-2:0:10
+a:HARDCORE=BR_CONF
+F:RES_CONF | FLY |
+F:ACTIVATE | IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD
+D:A brownish armour glittering in a dazzling light, made from a bronze dragon's hide.
+D:It contains some of the dead beast's powers.
+
+N:409:& Gold Dragon Scale Mail~
+G:[:y
+I:38:16:0
+W:60:0:200:50000
+A:60/8
+P:30:2d4:-2:0:10
+a:HARDCORE=BR_SOUND
+F:RES_SOUND | FLY |
+F:ACTIVATE | IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD
+D:A suit of armour with rustling scales, made from a gold dragon's hide.
+D:It contains some of the dead beast's powers.
+
+N:410:& Chaos Dragon Scale Mail~
+G:[:v
+I:38:18:0
+W:80:0:200:80000
+A:80/16
+P:30:2d4:-2:0:10
+a:HARDCORE=BR_CHAOS
+F:ATTR_MULTI
+F:RES_CHAOS | RES_DISEN | FLY |
+f:RES_CHAOS |
+F:ACTIVATE | IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD
+D:A suit of armour made of dragon hide. It glows in colours you have never seen before. As you
+D:put it on, you feel like you could change the world and are no longer afraid of your equipment
+D:losing its magic.
+
+N:411:& Balance Dragon Scale Mail~
+G:[:v
+I:38:20:0
+W:95:0:200:100000
+A:95/32
+P:30:2d4:-2:0:10
+a:HARDCORE=BR_BALANCE
+F:RES_CHAOS | RES_DISEN | RES_SOUND | RES_SHARDS | FLY |
+F:ACTIVATE | IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD
+D:A suit of armour made of the hide of a dead dragon. When wearing it, you feel like you
+D:understand the principles of law and chaos, and no longer fear either.
+
+N:412:& Power Dragon Scale Mail~
+G:[:v
+I:38:30:0
+W:100:0:250:350000
+A:100/64
+P:40:2d4:-3:0:15
+a:HARDCORE=BR_POWER
+F:ATTR_MULTI
+F:RES_ACID | RES_FIRE | RES_COLD | RES_ELEC | RES_POIS | FLY |
+F:RES_NETHER | RES_NEXUS | RES_CHAOS | RES_LITE | RES_DARK |
+F:RES_SHARDS | RES_SOUND | RES_DISEN | RES_CONF |
+F:ACTIVATE | IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD
+D:A suit of armour made of a very thick richly coloured dragonhide. You think you'll never have
+D:to fear dragons if you put it on.
+
+#### PDSM has been restored to (almost) its former glory in Zangband
+
+N:413:& Dragon Helm~
+G:]:G
+I:32:7:0
+W:45:0:50:10000
+A:80/4
+P:8:1d3:0:0:10
+F:IGNORE_ACID | IGNORE_FIRE | IGNORE_ELEC | IGNORE_COLD
+D:An iron helmet, covered with a layer of dragonhide. It offers great protection and may grant
+D:protection against some dragon's attacks, based on the dragon the hide was taken from.
+
+N:414:& Dragon Shield~
+G:[:G
+I:34:6:0
+W:70:0:100:10000
+A:80/4
+P:8:1d3:0:0:10
+F:IGNORE_ACID | IGNORE_FIRE | IGNORE_ELEC | IGNORE_COLD
+D:A large shield, with a dragonskin cover. Depending on which dragon the hide came from, it
+D:might grant protection against some sorts of dragon breath.
+
+##### Extra potions #####
+
+N:415:Death
+G:!:d
+I:71:23:0
+W:55:0:4:0
+A:55/4
+P:0:20d20:0:0:0
+F:FOUNTAIN
+D:A potent and very quickly working poison, sometimes utilised by those who wish to end their
+D:lives. It is immensely toxic and will seriously hurt you even if you just get some of it on your
+D:hands.
+
+N:416:Ruination
+G:!:d
+I:71:15:0
+W:40:0:4:0
+A:40/8
+P:0:20d20:0:0:0
+F:FOUNTAIN
+D:This wicked potion will seriously damage your abilities beyond the powers of magical
+D:restoration.
+
+N:417:Detonations
+G:!:d
+I:71:22:0
+W:60:0:4:10000
+A:60/8
+P:0:25d25:0:0:0
+F:FOUNTAIN
+D:This bottle is filled with a strange substance which will violently explode if strongly agitated.
+
+N:418:Augmentation
+G:!:d
+I:71:55:0
+W:40:0:4:60000
+A:40/16
+P:0:1d1:0:0:0
+F:FOUNTAIN
+D:This blessed potion will greatly improve all your abilities if they can still be improved.
+
+N:419:*Healing*
+G:!:d
+I:71:38:0
+W:40:0:4:1500
+A:40/4:60/2:80/1
+P:0:1d1:0:0:0
+F:FOUNTAIN
+D:This highly desirable potion will greatly help recovering from wounds, typically healing you
+D:fully.
+
+N:420:Life
+G:!:d
+I:71:39:0
+W:60:0:4:5000
+A:60/4:100/2
+P:0:1d1:0:0:0
+F:FOUNTAIN
+D:This wonderful potion will fully heal you no matter how badly you're hurt, allow drained
+D:abilities to recover and remove various other ailments.
+
+N:421:Self Knowledge
+G:!:d
+I:71:58:0
+W:40:0:4:2000
+A:40/1
+P:0:1d1:0:0:0
+F:FOUNTAIN
+D:A drink of insight that lets you know yourself better.
+
+N:422:*Enlightenment*
+G:!:d
+I:71:57:0
+W:70:0:4:80000
+A:70/4
+P:0:1d1:0:0:0
+F:FOUNTAIN
+D:This magical concoction will grant you great insight, magically improving your wits and
+D:wisdom, letting you know precisely who and where you are and what you possess.
+
+# XXX
+# XXX
+
+N:425:Fear Resistance
+G:=:d
+I:45:38:0
+W:10:0:2:300
+A:10/2
+F:RES_FEAR | EASY_KNOW
+f:RES_FEAR |
+D:This ring grants courage, so that you can never become afraid.
+
+N:426:Light and Darkness Resistance
+G:=:d
+I:45:39:0
+W:30:0:2:3000
+A:30/2
+F:RES_LITE | RES_DARK | EASY_KNOW
+f:RES_LITE | RES_DARK |
+D:This ring protects against fluctuations of the light.
+
+N:427:Nether Resistance
+G:=:d
+I:45:40:0
+W:34:0:2:14500
+A:34/2
+F:RES_NETHER | HOLD_LIFE | EASY_KNOW
+f:RES_NETHER |
+D:This blessed ring improves your life force, protecting you from the draining forces of nether
+D:and other attempts to suck your lifeblood.
+
+N:428:Nexus Resistance
+G:=:d
+I:45:41:0
+W:24:0:2:3000
+A:24/2
+F:RES_NEXUS | EASY_KNOW
+f:RES_NEXUS |
+D:This ring of stability protects you from the warping forces of nexus.
+
+N:429:Sound Resistance
+G:=:d
+I:45:42:0
+W:26:0:2:3000
+A:26/2
+F:RES_SOUND | EASY_KNOW
+f:RES_SOUND |
+D:This ring projects an aura of quiet around you, protecting you from loud noise.
+
+N:430:Confusion Resistance
+G:=:d
+I:45:43:0
+W:22:0:2:3000
+A:22/2
+F:RES_CONF | EASY_KNOW
+f:RES_CONF |
+D:This ring stabilises your mind, protecting you from all kinds of befuddlement.
+
+N:431:Shard Resistance
+G:=:d
+I:45:44:0
+W:25:0:2:3000
+A:25/2
+F:RES_SHARDS | EASY_KNOW
+f:RES_SHARDS |
+D:This piece of jewellery magically toughens your skin, protecting you from flying shrapnel.
+
+N:432:Disenchantment Resistance
+G:=:d
+I:45:45:0
+W:90:0:2:15000
+A:90/10
+F:RES_DISEN | EASY_KNOW
+f:RES_DISEN |
+D:This rare ring of preservation protects your equipment from attempts to sap its magic, also
+D:causing you to suffer less pain from such attacks.
+
+N:433:Chaos Resistance
+G:=:d
+I:45:46:0
+W:50:0:2:13000
+A:50/2
+F:RES_CHAOS | RES_CONF | EASY_KNOW
+f:RES_CHAOS |
+D:This ring protects you from the horribly warping forces of chaos.
+
+N:434:Blindness Resistance
+G:=:d
+I:45:47:0
+W:60:0:2:7500
+A:60/2
+F:RES_BLIND | EASY_KNOW
+f:RES_BLIND |
+D:This ring magically preserves your eyesight, making you impervious to any attempt to blind
+D:you.
+
+N:435:Arnor
+G:=:d
+I:45:48:0
+W:100:0:2:100000
+A:100/5
+F:RES_DISEN | RES_POIS | HOLD_LIFE | FREE_ACT
+f:RES_DISEN | RES_POIS | HOLD_LIFE | FREE_ACT
+D:This blessed ring will protect you from disenchantment, poison, attempts to drain your life
+D:force and holding magic.
+
+N:436:Extra Attacks
+G:=:d
+I:45:49:0
+W:50:0:2:100000
+A:50/2
+F:BLOWS | ACTIVATE | EASY_USE |
+f:BLOWS | ACTIVATE
+a:HARDCORE=SPIN
+D:This powerful ring of fighters greatly enhances your fighting speed, allowing you to attack
+D:more often in a round of combat.
+
+N:437:Cure Light Wounds
+G:!:d
+I:71:34:50
+W:0:0:4:15
+A:0/1:1/1:3/1
+P:0:1d1:0:0:0
+F:FOUNTAIN
+D:This healthy drink heals a little damage you have taken.
+
+N:438:Clumsiness
+G:!:d
+I:71:19:0
+W:5:0:4:0
+A:5/1
+P:0:1d1:0:0:0
+F:FOUNTAIN
+D:This nasty concoction will numb your nerves, making you clumsier.
+
+N:439:Sickliness
+G:!:d
+I:71:20:0
+W:10:0:4:0
+A:10/1
+P:0:1d1:0:0:0
+F:FOUNTAIN
+D:This unhealthy drink damages your health, reducing your physical constitution.
+
+###### Here start the maps #####
+
+# Map of Bree
+N:440:Map of Bree
+G:?:s
+I:8:200:0
+W:3:100:5:100
+A:3/3
+D:A map, showing the town of Bree and the landscape around it.
+
+# Map of Gondolin
+N:441:Map of Gondolin
+G:?:s
+I:8:201:0
+W:70:100:5:50000
+A:70/3
+D:A map detailing the place of the hidden city of Gondolin.
+
+# Map of Lothlorien
+N:442:Map of Lothlorien
+G:?:s
+I:8:202:0
+W:6:100:5:1000
+A:6/3
+D:A map vaguely describing the forest of Lothlorien and the elven settlements therein.
+
+# Map of Minas Anor
+N:443:Map of Minas Anor
+G:?:s
+I:8:203:0
+W:36:100:5:10000
+A:36/3
+D:A map of the great city of Gondor.
+
+# XXX Numbers 444-464 unused #
+
+N:465:& Silver Arrow~
+G:{:W
+I:17:3:0
+W:55:0:2:35
+A:50/4:90/2
+P:0:3d4:0:0:0
+F:SHOW_MODS | SLAY_EVIL | IGNORE_ACID | IGNORE_FIRE
+D:An arrow to be shot with a bow, its iron head coated with hallowed silver,
+D:a material that sears the flesh of all evil creatures.
+
+N:466:& Silver Bolt~
+G:{:w
+I:18:3:0
+W:50:0:2:40
+A:60/4:95/2
+P:0:3d5:0:0:0
+F:SHOW_MODS | SLAY_EVIL | IGNORE_ACID | IGNORE_FIRE
+D:This crossbow bolt has a silver tip, blessed by the Valar for fighting evil.
+
+N:468:Wisdom
+G:":d
+I:40:28:0
+W:30:0:3:500
+A:30/1
+F:WIS | SUST_WIS | HIDE_TYPE
+f:WIS |
+D:This magical amulet will magically make you wiser, and fend off
+D:attacks that would reduce your wisdom. Beware: if cursed, the
+D:amulet will do the opposite.
+
+N:469:Regeneration
+G:":d
+I:40:30:0
+W:30:0:3:600
+A:30/3
+F:REGEN | EASY_KNOW
+f:REGEN |
+D:Wearing this amulet will trigger your body's regenerational
+D:processes quicker and make them proceed faster.
+
+N:470:Infravision
+G:":d
+I:40:26:0
+W:10:0:3:200
+A:10/1
+F:INFRA | HIDE_TYPE
+f:INFRA |
+D:This amulet will increase your ability to sense warm-blooded
+D:creatures in your vicinity. Beware: if cursed, it will do
+D:just the opposite.
+
+N:471:Devotion
+G:":d
+I:40:25:0
+W:70:0:3:30000
+A:70/8
+F:WIS | CHR | SUST_WIS | SUST_CHR | LITE1 | HIDE_TYPE |
+F:RES_DARK | RES_LITE | RES_FIRE | HOLD_LIFE |
+D:This blessed amulet will protect your wisdom and charms from
+D:diminishing, often adding to them as well. It also grants
+D:some extra protective magics by the grace of the Valar.
+
+N:472:Weaponmastery
+G:":d
+I:40:24:0
+W:70:0:3:30000
+A:70/8
+F:STR | CON | SUST_STR | SUST_CON | FREE_ACT | HIDE_TYPE |
+F:RES_FEAR | RES_DISEN |
+D:The ultimate amulet for a warrior, it will grant protection
+D:in the face of some evil magics, protect your strength and health,
+D:also increasing them. Beware: if cursed, the amulet will
+D:sap your strength and health instead.
+
+N:473:Trickery
+G:":d
+I:40:23:0
+W:70:0:3:30000
+A:70/8
+F:DEX | SUST_DEX | STEALTH | SPEED | INFRA | HIDE_TYPE |
+F:RES_NEXUS | RES_POIS
+D:The ultimate amulet for a rogue or assassin, it protects the
+D:wearer against some evil magics, granting improvements in
+D:the abilities vital to these adventurers. Beware: if cursed,
+D:the amulet will do just the opposite.
+
+N:474:Telepathy
+G:":d
+I:40:22:0
+W:50:0:3:25000
+A:50/6
+F:ESP_ALL |
+f:ESP_ALL |
+F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD
+D:This rare and powerful amulet lays bare the minds of monsters
+D:before the wearer.
+
+N:475:Sustenance
+G:":d
+I:40:21:0
+W:60:0:3:20000
+A:60/4
+F:SUST_STR | SUST_INT | SUST_WIS | SUST_DEX | SUST_CON | SUST_CHR |
+F:HOLD_LIFE | SLOW_DIGEST | EASY_KNOW |
+F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD
+D:This blessed amulet will make the wearer impervious to evil magics
+D:that would sap innate abilities. It also slows down the digestive
+D:system, making food less necessary on long journeys.
+
+# The Palantir of Minas Ithil -- see artifact list
+
+N:476:& Palantir~
+G:~:y
+I:39:107:0
+W:75:0:200:0
+P:0:10d10:0:0:0
+F:INSTA_ART
+
+# The Elfstone 'Elessar' -- see artifact list
+
+N:477:& Elfstone~
+G:":g
+I:40:19:0
+W:60:0:3:50000
+F:INSTA_ART
+
+# The Jewel 'Evenstar' -- see artifact list
+
+N:478:& Jewel~
+G:":w
+I:40:20:0
+W:50:0:3:35000
+F:INSTA_ART
+
+# The Ring of Durin -- see artifact list
+
+N:479:& Ring~
+G:=:d
+I:45:57:0
+W:70:0:2:65000
+F:INSTA_ART | SPECIAL_GENE
+
+##### And here starts the gold/gems #####
+
+N:480:copper
+G:$:u
+I:100:1:0
+W:1:0:0:3
+
+N:481:copper
+G:$:u
+I:100:2:0
+W:1:0:0:4
+
+N:482:copper
+G:$:u
+I:100:3:0
+W:1:0:0:5
+
+N:483:silver
+G:$:s
+I:100:4:0
+W:1:0:0:6
+
+N:484:silver
+G:$:s
+I:100:5:0
+W:1:0:0:7
+
+N:485:silver
+G:$:s
+I:100:6:0
+W:1:0:0:8
+
+N:486:garnets
+G:$:r
+I:100:7:0
+W:1:0:0:9
+
+N:487:garnets
+G:$:r
+I:100:8:0
+W:1:0:0:10
+
+N:488:gold
+G:$:y
+I:100:9:0
+W:1:0:0:12
+
+N:489:gold
+G:$:y
+I:100:10:0
+W:1:0:0:14
+
+N:490:gold
+G:$:y
+I:100:11:0
+W:1:0:0:16
+
+N:491:opals
+G:$:W
+I:100:12:0
+W:1:0:0:18
+
+N:492:sapphires
+G:$:b
+I:100:13:0
+W:1:0:0:20
+
+N:493:rubies
+G:$:r
+I:100:14:0
+W:1:0:0:24
+
+N:494:diamonds
+G:$:w
+I:100:15:0
+W:1:0:0:28
+
+N:495:emeralds
+G:$:g
+I:100:16:0
+W:1:0:0:32
+
+N:496:mithril
+G:$:B
+I:100:17:0
+W:1:0:0:40
+
+N:497:adamantite
+G:$:G
+I:100:18:0
+W:1:0:0:80
+
+
+##### Objects 498 and 499 are the "Morgoth Artifacts" #####
+
+# These objects, like objects 500 to 511, are never created
+# without being turned into artifacts. This simplifies the
+# code for "killing the winner monster".
+
+N:498:& Mighty Hammer~
+G:\:D
+I:21:50:0
+W:15:0:200:1000
+P:0:3d9:0:0:0
+F:SHOW_MODS | INSTA_ART | MUST2H | SPECIAL_GENE
+f:MUST2H
+
+N:499:& Massive Iron Crown~
+G:]:D
+I:33:50:0
+W:44:0:20:1000
+P:0:1d1:0:0:0
+F:INSTA_ART | SPECIAL_GENE
+
+
+##### Objects 500 to 511 are "Special Artifacts" #####
+
+# These objects do not specify "full names" because the artifact name
+# is added in "obj-desc.c" based on the artifact index ("i_ptr->name1").
+#
+# These objects do specify a "base name", which is used when the object
+# is "aware" (always true for lites)
+#
+# The Lites (and the One Ring) specify "physical colors", which
+# over-ride the "flavor" colors, if any. Note that the "One Ring"
+# also has a specific check for "unknown" in which it changes its
+# name to "a plain gold ring". See "object1.c"
+#
+# Note that ALL artifacts are given "IGNORE_ACID/ELEC/FIRE/COLD",
+# so we do not need to specify that here.
+#
+# Note that the "INSTA_ART" flag is used to prevent these objects from
+# being created without also turning them into artifacts. This flag
+# must be specified both here and in the artifact template.
+#
+# The only reason for having six different "ring" templates and three
+# different "amulet" templates is to allow each "special artifact" to
+# have a different "color" and "flavor", and also to allow the use of
+# special "base names" (such as "Necklace").
+
+
+# The Phial of Galadriel -- see artifact list
+
+N:500:& Phial~
+G:~:y
+I:39:100:0
+W:20:0:10:10000
+P:0:1d1:0:0:0
+F:INSTA_ART
+
+# The Star of Elendil -- see artifact list
+
+N:501:& Star~
+G:~:B
+I:39:101:0
+W:30:0:5:25000
+P:0:1d1:0:0:0
+F:INSTA_ART
+
+# The Arkenstone of Thrain -- see artifact list
+
+N:502:& Arkenstone~
+G:~:R
+I:39:102:0
+W:60:0:5:60000
+P:0:1d1:0:0:0
+F:INSTA_ART
+
+
+# The Amulet of Annatar -- see artifact list
+
+N:503:& Amulet~
+G:":d
+I:40:10:0
+W:70:0:3:90000
+F:INSTA_ART
+
+# The Amulet of Ingwe -- see artifact list
+
+N:504:& Amulet~
+G:":d
+I:40:11:0
+W:60:0:3:90000
+F:INSTA_ART
+
+# The Necklace 'Nauglamir' -- see artifact list
+
+N:505:& Necklace~
+G:":d
+I:40:12:0
+W:70:0:3:75000
+F:INSTA_ART
+
+
+# The Ring of Barahir -- see artifact list
+
+N:506:& Ring~
+G:=:d
+I:45:32:0
+W:50:0:2:65000
+F:INSTA_ART
+
+# The Ring of Tulkas -- see artifact list
+# Gone in Theme
+#N:507:& Ring~
+#G:=:d
+#I:45:33:0
+#W:90:0:2:150000
+#F:INSTA_ART
+
+# The Ring of Power 'Narya' -- see artifact list
+
+N:508:& Ring~
+G:=:d
+I:45:34:0
+W:80:0:2:100000
+F:INSTA_ART | SPECIAL_GENE
+
+# The Ring of Power 'Nenya' -- see artifact list
+
+N:509:& Ring~
+G:=:d
+I:45:35:0
+W:90:0:2:200000
+F:INSTA_ART
+
+# The Ring of Power 'Vilya' -- see artifact list
+
+N:510:& Ring~
+G:=:d
+I:45:36:0
+W:100:0:2:300000
+F:INSTA_ART
+
+# The Ring of Power 'The One Ring' -- see artifact list
+
+N:511:& Ring~
+G:=:y
+I:45:37:0
+W:110:0:2:5000000
+F:INSTA_ART
+
+
+### Room for new objects added after 511 (Zangband 2.1.0): 512-575
+
+# XXX
+# XXX
+# XXX
+# XXX
+# XXX
+# XXX
+# XXX
+# XXX
+
+N:520:Reflection
+G:":d
+I:40:9:0
+W:60:0:3:30000
+A:60/4
+F:REFLECT | EASY_KNOW
+f:REFLECT |
+F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD
+D:This wondrous amulet will magically make the wearer
+D:reflect arrows and bolts launched by adversaries.
+
+#521 and 522 cannot have EASY_KNOW because they may be cursed
+
+N:521:Anti-Magic
+G:":d
+I:40:13:0
+W:40:0:3:30000
+A:40/4
+F:NO_MAGIC
+f:NO_MAGIC
+F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD
+D:This amulet wards off magic of any kind, good or bad.
+
+N:522:Anti-Teleportation
+G:":d
+I:40:14:0
+W:30:0:3:15000
+A:30/4
+F:NO_TELE
+f:NO_TELE
+F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD
+D:This amulet will prevent the space-time continuum from
+D:being disrupted around the wearer.
+
+#523 cannot have EASY_KNOW because it can get random resistances
+
+N:523:Resistance
+G:":d
+I:40:15:0
+W:50:0:3:25000
+A:50/4
+F:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD
+f:RES_ACID | RES_ELEC | RES_FIRE | RES_COLD
+F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD
+D:This amulet will make the wearer resist the elements.
+
+##### New arms #####
+
+N:524:& Zweihander~
+G:|:w
+I:23:29:0
+W:40:0:280:580
+A:40/3
+P:0:4d6:0:0:0
+F:SHOW_MODS | MUST2H
+f:MUST2H
+D:This great sword of foreign origin is approximately 6 feet long. The hilt is
+D:long enough for even four hands to grip. A mighty weapon for a warrior.
+
+# Dwarven lantern
+N:525:& Dwarven Lantern~
+G:~:b
+I:39:3:0
+W:15:0:50:5000
+A:15/2
+P:0:1d1:0:0:0
+F:EASY_KNOW | IGNORE_FIRE | LITE2
+f:LITE2
+D:Made by the Dwarves, this lantern provides light in the
+D:darkest recesses of the earth.
+
+N:526:& Splint Mail~
+G:[:D
+I:37:10:0
+W:35:0:250:950
+A:35/1
+P:19:1d4:-2:0:0
+D:A variant of banded mail. The metal strips are applied to the backing of chain,
+D:leather, or cloth rather than horizontally.
+
+# Everburning torch
+N:527:& Everburning Torch~
+G:~:R
+I:39:2:0
+W:5:0:50:2500
+A:5/1
+P:0:1d1:0:0:0
+F:EASY_KNOW | IGNORE_FIRE | LITE1
+f:LITE1
+D:This enchanted torch never needs to be fuelled.
+
+N:528:& Trifurcate Spear~
+G:/:o
+I:22:26:0
+W:35:0:140:400
+A:35/3
+P:0:2d9:0:0:0
+F:SHOW_MODS
+D:This deadly spear's point has three branches, suited for inflicting
+D:slightly greater damage per hit than a regular spear.
+
+N:529:& Three Piece Rod~
+G:\:u
+I:21:11:0
+W:20:0:120:350
+A:20/3
+P:0:3d3:0:0:0
+F:SHOW_MODS
+D:A descendant of the threshing flail, consisting of three short wooden
+D:pieces linked by chain or rope.
+
+# Feanorian Lamp
+N:530:& Feanorian Lamp~
+G:~:B
+I:39:4:0
+W:25:0:50:15000
+A:25/3
+P:0:1d1:0:0:0
+F:EASY_KNOW | IGNORE_FIRE | LITE3
+f:LITE3
+D:Made by the descendants of the Noldo craftsman, this lamp
+D:contains a part of the flame which burned inside Feanor.
+
+N:531:& Fur Cloak~
+G:(:W
+I:35:3:0
+W:20:0:30:100
+A:20/2:30/2
+P:3:0d0:0:0:0
+F:RES_COLD
+D:A coat made from the fur of various wild animals - it is
+D:somewhat bulky, but still spacious enough to wear over armour.
+D:It is ideal for cold weather conditions.
+
+N:532:Water Curing
+G:!:d
+I:72:18:80
+W:0:0:4:0
+A:0/1
+P:0:1d1:0:0:0
+F:SPECIAL_GENE
+D:It is a magical component that can purify water.
+
+N:533:& Hatchet~
+G:/:s
+I:24:1:0
+W:10:0:60:120
+A:10/2
+P:0:1d5:0:0:0
+F:SHOW_MODS | COULD2H
+f:COULD2H
+D:This is a larger version of a throwing axe. It has a single
+D:blade with a pick on the reverse, designed for armour piercing.
+
+##### New armour #####
+
+N:535:& Mumak Hide Armour~
+G:(:s
+I:36:8:0
+W:15:0:110:400
+A:15/1
+P:8:1d1:-1:0:0
+D:This suit of armour is fashioned from the hide of a dead Mumak,
+D:or Oliphaunt. It is tough, leathery, and a bit cumbersome.
+
+N:536:& Leather Jerkin~
+G:(:U
+I:36:12:0
+W:20:0:70:550
+A:20/3
+P:7:1d2:0:0:0
+D:A kind of vest with a colarless neck, made from roughout leather. This
+D:is what Middle-earth rangers usually wear on their travels.
+
+##### New weapons #####
+
+N:537:& Sickle~
+G:/:s
+I:22:3:0
+W:10:0:70:110
+A:10/3
+P:0:2d3:0:0:0
+F:SHOW_MODS
+D:A semicircular blade attached to a short handle, good for chopping
+D:things up into pieces.
+
+# XXX
+# XXX
+# XXX
+# XXX
+
+N:542:& Club~
+G:\:u
+I:21:1:0
+W:0:0:100:3
+A:0/1
+P:0:1d4:0:0:0
+F:SHOW_MODS
+D:A stout heavy stick, thicker at one end. Useful for
+D:shattering and smashing things.
+
+N:543:& Broad Spear~
+G:/:w
+I:22:7:0
+W:14:0:100:240
+A:14/3
+P:0:1d9:0:0:0
+F:SHOW_MODS
+D:It looks like it has just come from the forge. Designed specifically for
+D:foot soldiers combatting mounted cavalry, it is too heavy to be effective
+D:when thrown.
+
+N:544:& Khopesh~
+G:|:W
+I:23:14:0
+W:10:0:130:190
+A:10/2
+P:0:2d4:0:0:0
+F:SHOW_MODS
+D:This sword comes from the regions of Far Harad. The blade is straight
+D:for 18 inches, and then it curves for another 2 feet.
+
+N:545:& Flamberge~
+G:|:W
+I:23:26:0
+W:40:0:230:600
+A:40/2
+P:0:3d7:0:0:0
+F:SHOW_MODS | MUST2H
+f:MUST2H
+D:A large, two-handed sword with a blade that weaves
+D:left and right until it reaches the hilt.
+
+N:546:& Claymore~
+G:|:W
+I:23:23:0
+W:40:0:200:600
+A:40/2
+P:0:2d8:0:0:0
+F:SHOW_MODS | COULD2H
+f:COULD2H
+D:Also known as a Claidhmore, or Greatsword, this weapon is favoured
+D:by powerful mercenaries. The blade is large, straight, and broad,
+D:almost as large as a two-handed sword.
+
+N:547:& Espadon~
+G:|:W
+I:23:24:0
+W:40:0:200:600
+A:40/3
+P:0:2d9:0:0:0
+F:SHOW_MODS | MUST2H
+f:MUST2H
+D:This is the strictly two-handed version of the bastard sword.
+D:The blade is of medium length, double-edged, and considerably
+D:heavy to wield.
+
+N:548:& Great Scimitar~
+G:|:W
+I:23:22:0
+W:40:0:240:500
+A:40/3
+P:0:4d5:0:0:0
+F:SHOW_MODS | MUST2H
+f:MUST2H
+D:This is a larger version of the curved oriental blade.
+D:Runes of war decorate its golden hilt.
+
+
+### Trapping Kits
+
+N:549:Arrow
+G:`:r
+I:46:2:0
+W:10:0:60:150
+A:10/2:50/2
+F:SHOW_MODS
+D:It must be loaded with arrows, which will be
+D:fired at the monster who triggers the trap.
+
+N:550:Bolt
+G:`:o
+I:46:3:0
+W:20:0:220:300
+A:20/2:50/2
+F:SHOW_MODS
+D:It must be loaded with crossbow bolts, which will
+D:be fired at the monster who triggers the trap.
+
+N:551:& Fauchard~
+G:/:s
+I:22:6:0
+W:18:0:155:301
+A:18/2
+P:0:1d10:0:0:0
+F:SHOW_MODS | COULD2H
+f:COULD2H
+D:It is a type of glaive with two ornate hooks on the back
+D:of the blade. It is typically 8 to 9 feet long.
+
+N:552:& Guisarme~
+G:/:s
+I:22:16:0
+W:21:0:165:320
+A:21/1
+P:0:2d5:0:0:0
+F:SHOW_MODS | COULD2H
+f:COULD2H
+D:Mounted on a long shaft for maximum reach, this weapon is
+D:effective at repelling both cavalry and infantry.
+
+N:553:& Heavy Lance~
+G:/:s
+I:22:29:0
+W:43:0:400:700
+A:43/2
+P:0:4d8:0:0:0
+F:SHOW_MODS | MUST2H
+f:MUST2H
+D:This is a shock weapon. Its purpose is to unhorse a rider
+D:in single combat, or smash through the armour of opposing lines.
+
+N:554:& Basilard~
+G:|:w
+I:23:9:0
+W:15:0:80:220
+A:15/3
+P:0:1d8:0:0:0
+F:SHOW_MODS
+D:This is a two-edged dagger with a long blade. A favourite among travellers
+D:and warriors alike, because it can be worn comfortably with plain clothes
+D:as well as armour.
+
+### Trapping Kits
+
+N:555:Catapult
+G:`:R
+I:46:1:0
+W:1:0:50:40
+A:1/2:20/2
+F:SHOW_MODS
+D:It must be loaded with sling bullets, which will
+D:be fired at the monster who triggers the trap.
+
+N:556:& Ring Mail~
+G:[:s
+I:37:2:0
+W:20:0:200:500
+A:20/1
+P:12:1d4:-2:0:0
+D:A suit of non-overlapping metal rings sewn onto a
+D:heavy leather backing.
+
+N:557:& Cord Armour~
+G:(:y
+I:36:9:0
+W:5:0:80:40
+A:5/1
+P:6:1d1:0:0:0
+D:Fibres of hemp or other natural material woven and knotted
+D:into a thick, tough fabric.
+
+N:558:& Paper Armour~
+G:(:w
+I:36:3:0
+W:5:0:30:40
+A:5/2
+P:4:1d1:0:0:0
+F:SENS_FIRE
+D:Thickly pleated sheets of paper assembled together into
+D:a suit of armour. It is useful against arrows, but it may
+D:catch on fire quite easily.
+
+N:559:& Padded Armour~
+G:(:y
+I:36:10:0
+W:2:0:60:40
+A:2/1
+P:4:1d1:0:0:0
+D:Heavy, multi-layered cloth sewn together to cover the body,
+D:with extra padding between layers.
+
+### Trapping Kits
+
+N:560:Fumes
+G:`:G
+I:46:4:0
+W:2:0:20:50
+A:2/2:30/2
+D:It must be loaded with potions, which will splatter
+D:over the monster who triggers the trap.
+
+N:561:& Golden Ring Mail~
+G:(:y
+I:36:15:0
+W:35:0:150:500
+A:35/7
+P:8:1d4:-1:0:0
+D:A suit of non-overlapping thin golden rings sewn onto a soft leather
+D:backing. It looks beautiful, and is worn on special occasions.
+
+### Trapping Kits
+
+N:562:Magic
+G:`:g
+I:46:5:0
+W:5:0:20:50
+A:5/2:40/2
+F:IGNORE_ACID | IGNORE_FIRE | IGNORE_COLD | IGNORE_ELEC
+D:It must be loaded with scrolls, which will release
+D:their spells at the monster who triggers the trap.
+
+N:563:Device
+G:`:v
+I:46:6:0
+W:20:0:20:50
+A:20/2:40/2:60/2
+F:IGNORE_ACID | IGNORE_FIRE | IGNORE_COLD | IGNORE_ELEC
+D:It must be loaded with a magic device (wand, staff, or rod), which
+D:will fire its spell at the monster who triggers the trap.
+
+# XXX
+# XXX
+# XXX
+# XXX
+# XXX
+
+N:569:Nothing
+G:-:d
+I:66:0:1
+W:5:0:10:50
+A:5/1
+P:0:1d1:0:0:0
+
+
+#Artifact Potion
+N:573:& Blood~ of Life
+G:!:d
+I:71:3:200
+W:70:0:4:10000
+A:70/16
+P:0:1d1:0:0:0
+T:71:2
+F:NORM_ART | FULL_NAME
+D:This magical potion contains a small part of the power of
+D:Eru Iluvatar on Middle-Earth.
+
+# XXX
+# XXX
+# XXX
+
+# Mage staffs (for Sorcerers to wield.)
+
+N:577:& Mage Staff~
+G:\:B
+I:6:1:0
+W:5:0:12:300
+A:5/1:20/1:50/1:80/1
+P:0:1d4:0:0:0
+F:SHOW_MODS | COULD2H
+f:COULD2H
+D:It looks like a simple walking stick, plain and nondescript.
+D:In the hands of a spellcaster, it can be a deadly weapon.
+
+# An extra ring, out of place
+
+N:578:Lightning
+G:=:d
+I:45:56:0
+W:50:0:2:3000
+A:50/1
+P:0:0d0:0:0:15
+a:HARDCORE=BA_ELEC_4
+F:RES_ELEC | ACTIVATE
+f:RES_ELEC | IGNORE_ELEC
+D:This sparkling circlet grants you protection, makes electricity less
+D:dangerous and even allows you to call forth a ball of lightning.
+
+# XXX
+# XXX
+# XXX
+
+# The Ring of Flare -- see artifact list
+# Gone in Theme.
+#N:582:& Ring~
+#G:=:y
+#I:45:52:5
+#W:50:25:2:75000
+#F:INSTA_ART
+
+N:583:Invisibility
+G:!:d
+I:71:8:0
+W:3:0:4:50
+A:3/1
+P:0:1d1:0:0:0
+F:FOUNTAIN
+D:This magical brew will temporarily hide you from sight, and also attunes you to this state so
+D:that your eyes can still perceive your hidden form.
+
+# Potion of Corruption
+
+N:585:Corruption
+G:!:d
+I:71:10:0
+W:10:0:4:0
+A:10/1:17/1:27/1
+P:0:1d1:0:0:0
+F:FOUNTAIN
+D:This concoction of toxic wastes will strangely warp your shape.
+
+# Ring of Invisibility
+
+N:586:Invisibility
+G:=:d
+I:45:53:4
+W:50:0:2:10000
+A:50/1
+F:INVIS | HIDE_TYPE
+f:INVIS |
+D:This magical bauble will hide you from sight.
+
+# XXX
+
+######### Here are the parchments ########
+
+N:588:Deep Thoughts
+G:?:o
+I:8:0:0
+W:3:0:5:50
+A:3/1
+D:This parchment contains the thoughts of a powerful
+D:wizard who departed Middle-earth long ago.
+
+N:589:More Deep Thoughts
+G:?:o
+I:8:1:0
+W:4:0:5:50
+A:4/1
+D:This parchment contains the thoughts of a powerful
+D:wizard who departed Middle-earth long ago.
+
+N:590:Compendium of Deep Thoughts
+G:?:o
+I:8:2:0
+W:5:0:5:50
+A:5/1
+D:This parchment contains the thoughts of a powerful
+D:wizard who departed Middle-earth long ago.
+
+# Artifact Lore - Edged weapons
+N:591:Artifact Lore Vol. I
+G:?:o
+I:8:6:0
+W:40:0:5:500
+A:40/3
+D:This parchment contains information about unique
+D:artifacts that are rumoured to exist upon Arda.
+
+# Artifact Lore - Hafted weapons
+N:592:Artifact Lore Vol. II
+G:?:o
+I:8:7:0
+W:40:0:5:500
+A:40/3
+D:This parchment contains information about unique
+D:artifacts that are rumoured to exist upon Arda.
+
+# Artifact Lore - Polearms
+N:593:Artifact Lore Vol. III
+G:?:o
+I:8:8:0
+W:40:0:5:500
+A:40/3
+D:This parchment contains information about unique
+D:artifacts that are rumoured to exist upon Arda.
+
+N:594:Monstrous Compendium 1
+G:?:o
+I:8:9:0
+W:10:0:5:100
+A:10/2
+D:This parchment contains a small part of the collected
+D:lore concerning monsters inhabiting Arda.
+
+N:595:Monstrous Compendium 2
+G:?:o
+I:8:10:0
+W:11:0:5:200
+A:11/2
+D:This parchment contains a small part of the collected
+D:lore concerning monsters inhabiting Arda.
+
+N:596:Monstrous Compendium 3
+G:?:o
+I:8:11:0
+W:12:0:5:300
+A:12/2
+D:This parchment contains a small part of the collected
+D:lore concerning monsters inhabiting Arda.
+
+N:597:Monstrous Compendium 4
+G:?:o
+I:8:12:0
+W:13:0:5:400
+A:13/2
+D:This parchment contains a small part of the collected
+D:lore concerning monsters inhabiting Arda.
+
+N:598:Monstrous Compendium 5
+G:?:o
+I:8:13:0
+W:14:0:5:500
+A:14/2
+D:This parchment contains a small part of the collected
+D:lore concerning monsters inhabiting Arda.
+
+N:599:Monstrous Compendium 6
+G:?:o
+I:8:14:0
+W:15:0:5:600
+A:15/2
+D:This parchment contains a small part of the collected
+D:lore concerning monsters inhabiting Arda.
+
+N:600:Monstrous Compendium 7
+G:?:o
+I:8:15:0
+W:16:0:5:700
+A:16/2
+D:This parchment contains a small part of the collected
+D:lore concerning monsters inhabiting Arda.
+
+N:601:Monstrous Compendium 8
+G:?:o
+I:8:16:0
+W:17:0:5:800
+A:17/2
+D:This parchment contains a small part of the collected
+D:lore concerning monsters inhabiting Arda.
+
+N:602:Monstrous Compendium 9
+G:?:o
+I:8:17:0
+W:18:0:5:900
+A:18/2
+D:This parchment contains a small part of the collected
+D:lore concerning monsters inhabiting Arda.
+
+N:603:Monstrous Compendium 10
+G:?:o
+I:8:18:0
+W:19:0:5:1000
+A:19/2
+D:This parchment contains a small part of the collected
+D:lore concerning monsters inhabiting Arda.
+
+N:604:Monstrous Compendium 11
+G:?:o
+I:8:19:0
+W:20:0:5:1200
+A:20/2
+D:This parchment contains a small part of the collected
+D:lore concerning monsters inhabiting Arda.
+
+#### Here come the shape-shifting potions. ####
+
+N:605:& Morphic Oil~ of #
+G:!:d
+I:72:1:0
+W:5:0:4:100
+A:1/3:5/1:10/1
+P:0:1d1:0:0:0
+F:FULL_NAME | EASY_KNOW
+D:This concoction can transform your body for a short period of time.
+
+### New Parchments for Theme - monster and artifact spoilers
+
+# XXX
+
+# Artifact Lore - Axes
+N:607:Artifact Lore Vol. IV
+G:?:o
+I:8:22:0
+W:40:0:5:500
+A:40/3
+D:This parchment contains information about unique
+D:artifacts that are rumoured to exist upon Arda.
+
+# Artifact Lore - Shooters and missiles
+N:608:Artifact Lore Vol. V
+G:?:o
+I:8:23:0
+W:40:0:5:500
+A:40/3
+D:This parchment contains information about unique
+D:artifacts that are rumoured to exist upon Arda.
+
+# Artifact Lore - Musical instruments
+N:609:Artifact Lore Vol. VI
+G:?:o
+I:8:24:0
+W:40:0:5:500
+A:40/3
+D:This parchment contains information about unique
+D:artifacts that are rumoured to exist upon Arda.
+
+# Artifact Lore - Body armour
+N:610:Artifact Lore Vol. VII
+G:?:o
+I:8:25:0
+W:40:0:5:500
+A:40/3
+D:This parchment contains information about unique
+D:artifacts that are rumoured to exist upon Arda.
+
+# Artifact Lore - Cloaks
+N:611:Artifact Lore Vol. VIII
+G:?:o
+I:8:26:0
+W:40:0:5:500
+A:40/3
+D:This parchment contains information about unique
+D:artifacts that are rumoured to exist upon Arda.
+
+# Artifact Lore - Shields and Boots
+N:612:Artifact Lore Vol. IX
+G:?:o
+I:8:27:0
+W:40:0:5:500
+A:40/3
+D:This parchment contains information about unique
+D:artifacts that are rumoured to exist upon Arda.
+
+# Artifact Lore - Headgear and Gloves
+N:613:Artifact Lore Vol. X
+G:?:o
+I:8:28:0
+W:40:0:5:500
+A:40/3
+D:This parchment contains information about unique
+D:artifacts that are rumoured to exist upon Arda.
+
+# Artifact Lore - Gothmog's set and other sets
+N:614:Artifact Lore Vol. XI
+G:?:o
+I:8:29:0
+W:40:0:5:1000
+A:40/3
+D:This parchment contains information about unique
+D:artifacts that are rumoured to exist upon Arda.
+
+# Artifact Lore - Light sources
+N:615:Artifact Lore Vol. IX
+G:?:o
+I:8:30:0
+W:40:0:5:500
+A:40/3
+D:This parchment contains information about unique
+D:artifacts that are rumoured to exist upon Arda.
+
+# Artifact Lore - Amulets and Rings
+N:616:Artifact Lore Vol. X
+G:?:o
+I:8:31:0
+W:40:0:5:500
+A:40/3
+D:This parchment contains information about unique
+D:artifacts that are rumoured to exist upon Arda.
+
+# Artifact Lore - Tools
+N:617:Artifact Lore Vol. XI
+G:?:o
+I:8:32:0
+W:40:0:5:500
+A:40/3
+D:This parchment contains information about unique
+D:artifacts that are rumoured to exist upon Arda.
+
+# The Mimic's cloaks
+
+N:618:& #~
+G:(:y
+I:35:100:0:50
+W:5:130:30:100
+A:5/1:15/1:35/1:55/1:75/1
+P:1:1d1:0:0:0
+D:Combined with proper skill, this cloak can make you seem
+D:like a different creature. Otherwise, it just provides some
+D:extra protection.
+
+# XXX
+# XXX
+# XXX
+# XXX
+# XXX
+# XXX
+# XXX
+# XXX
+# XXX
+# XXX
+# XXX
+# XXX
+# XXX
+# XXX
+# XXX
+# XXX
+# XXX
+# XXX
+# XXX
+# XXX
+# XXX
+# XXX
+
+# Here are the corpses
+
+N:641:corpse
+G:~:U
+I:9:1:3000
+W:20:0:80:0
+A:30/1
+P:0:1d1:0:0:0
+F:DECAY
+D:A decaying corpse.
+
+N:642:skeleton
+G:~:U
+I:9:2:800
+W:20:0:2:0
+A:30/1
+P:0:1d1:0:0:0
+D:The bony remains of some creature.
+
+N:643:head
+G:~:U
+I:9:3:600
+W:20:0:10:0
+A:30/1
+P:0:1d1:0:0:0
+F:DECAY
+D:A severed head.
+
+N:644:skull
+G:~:U
+I:9:4:1000
+W:20:0:20:0
+A:30/1
+P:0:1d1:0:0:0
+D:A white bony skull.
+
+N:645:raw meat
+G:~:U
+I:9:5:1200
+W:20:0:10:2
+A:30/1
+P:0:1d1:0:0:0
+F:DECAY
+D:A piece of raw meat.
+
+N:646:& Great Eagle Down Coat~
+G:(:y
+I:36:16:0
+W:5:0:60:400
+A:25/1
+P:9:1d1:0:0:0
+F:RES_FIRE | RES_COLD |
+D:This coat is made from the down of Manwe's Great Eagles,
+D:gathered painstakingly from nests. It is magical, protecting
+D:the wearer from extremes of temperatures.
+
+# The Key to Orthanc -- see artifact list
+N:647:& Key~
+G:~:g
+I:39:106:0
+W:15:0:15:20000
+F:INSTA_ART | SPECIAL_GENE
+
+# Here are the boomerangs
+
+N:648:& Small Wooden Boomerang~
+G:{:y
+I:15:1:0
+W:1:0:60:10
+A:1/1:5/2:10/2:20/2
+P:0:1d4:0:0:0
+D:A small curved piece of wood.
+
+N:649:& Wooden Boomerang~
+G:{:y
+I:15:2:0
+W:10:0:60:100
+A:10/1:20/2
+P:0:1d8:0:0:0
+D:A curved leaf-shaped piece of wood.
+
+N:650:& Small Metal Boomerang~
+G:{:y
+I:15:3:0
+W:20:0:60:400
+A:20/1:30/2
+P:0:3d4:0:0:0
+D:A small curved piece of wood with metal blades on the "forward" edges.
+
+N:651:& Metal Boomerang~
+G:{:y
+I:15:4:0
+W:30:0:60:800
+A:30/1:50/2
+P:0:4d5:0:0:0
+D:A curved leaf-shaped piece of wood, its "forward" edges enhanced with metal blades.
+
+# The Space-Time Anchor -- see artifact list
+N:652:& Anchor~
+G:~:v
+I:39:105:0
+W:30:0:15:50000
+F:INSTA_ART
+
+# To convert monsters into objects for wielding them ! ! ! :)
+# Funny, funny, funny :)
+# pval the monster idx, pval2 for the monster hp
+N:653:& ~
+G:~:y
+I:99:1:0
+W:127:200:60:0
+A:127/255
+P:0:0d0:0:0:0
+
+N:654:Summon Never-Moving Pet
+G:?:d
+I:70:6:0
+W:5:0:5:125
+A:5/1:15/1:25/1:35/1:65/1:85/1:95/1
+D:A piece of paper, inscribed with runes which will summon an immobile creature to your aid.
+
+# XXX
+# XXX
+
+###The potions of cure insanity, in light, medium, regular, and full
+###versions. Cure light's W:x entry reduced to 1, so it doesn't boost level rating when appearing
+###at 50' - nyra
+
+N:657:Cure Light Insanity
+G:!:d
+I:72:14:0
+W:1:5:4:15
+A:5/1:1/1:3/1
+P:0:1d1:0:0:0
+F:FOUNTAIN
+D:A magical potion which drives away irrational quirks of behaviour.
+
+N:658:Cure Serious Insanity
+G:!:d
+I:72:15:0
+W:10:5:4:40
+A:10/1
+P:0:1d1:0:0:0
+F:FOUNTAIN
+D:A magical brew which will lift shadows that have been cast on your soul.
+
+N:659:Cure Critical Insanity
+G:!:d
+I:72:16:0
+W:15:5:4:100
+A:15/3
+P:0:1d1:0:0:0
+F:FOUNTAIN
+D:This drink will cure you even of serious mental disorders.
+
+N:660:Cure Insanity
+G:!:d
+I:72:17:0
+W:25:5:4:300
+A:25/3
+P:0:1d1:0:0:0
+F:FOUNTAIN
+D:This blessed potion can make you completely sane and healthy, even if you have only the
+D:faintest shred of sanity left.
+
+# The Phial of Undeath -- see artifact list. He he he he...
+
+#N:661:& Phial~
+#G:~:y
+#I:39:103:0
+#W:1:0:10:0
+#P:0:1d1:0:0:0
+#F:INSTA_ART
+
+# Here is the random artifact type.
+# This is used as a template -- the sval will be chosen later
+# on in the game to be an index to the random_artifacts array,
+# which in turn determines:
+#
+# Name
+# Color
+# Level
+# Cost
+
+N:662:Random Artifact
+G:~:o
+I:102:0:0
+W:1:0:50:0
+A:1/1:10/1:20/1:30/1
+F:INSTA_ART | ACTIVATE | ACTIVATE_NO_WIELD
+
+N:663:Craftsmanship
+G:?:d
+I:70:19:0
+W:80:0:5:200000
+A:80/16
+D:A powerful scroll, desired by many, as it can magically improve the special powers of magical
+D:weaponry.
+
+# A Parchment, not the Artifact
+N:664:The One Ring
+G:?:s
+I:8:4:0
+W:10:100:5:50
+A:10/2
+D:This parchment contains words in the Black Speech and Westron,
+D:and they seem to speak of a powerful Ring... could it be true?
+
+# XXX 665 - 668 were the old music books
+
+### Musical Instruments ###
+
+N:669:& Horn~
+G:/:W
+I:14:60:1
+W:7:0:30:400
+A:7/2:20/1:40/1:80/1
+P:0:1d1:0:0:0
+F:CON | ACTIVATE | WIELD_CAST
+D:A simple wind instrument made from brass. If used by inexperienced musicians it sounds
+D:like somebody making "prbbt!" noises down a drainpipe.
+
+N:670:& Drum~
+G:/:W
+I:14:58:1
+W:7:0:30:400
+A:7/2:20/1:40/1:80/1
+P:0:1d1:0:0:0
+F:STR | WIELD_CAST
+D:A sort of clay pot with a bit of skin stretched over its mouth.
+
+N:671:& Harp~
+G:/:W
+I:14:59:1
+W:7:0:30:400
+A:7/2:20/1:40/1:80/1
+P:0:1d1:0:0:0
+F:CHR | WIELD_CAST
+D:A number of strings held by a wooden frame.
+
+# XXX
+# XXX
+
+# The Palantir of Orthanc -- see artifact list
+
+N:675:& Palantir~
+G:~:y
+I:39:104:0
+W:75:0:200:100000
+P:0:10d10:0:0:0
+F:INSTA_ART
+
+### The Monster Egg template; note the theoretical weight of 3 lbs ###
+
+N:676:Egg
+G:,:W
+I:10:1:0
+W:5:0:30:100
+A:5/1:15/1:25/1:35/1
+P:0:1d1:0:0:0
+F:ACTIVATE | ACTIVATE_NO_WIELD
+
+### Two more scrolls ###
+
+N:677:Reset Recall
+G:?:d
+I:70:23:0
+W:20:0:5:125
+A:20/1:25/1:35/1
+D:A strange formula is inscribed on this scroll, which allows you to define another place as the
+D:location to which recalls shall move you.
+
+N:678:Divination
+G:?:d
+I:70:31:0
+W:20:0:5:600
+A:30/1:45/1:55/1
+D:This scroll is inscribed with a ritual which allows you to discern what fate holds in store for
+D:you.
+
+### Here comes the Runes ###
+
+N:679:Self
+G:?:b
+I:105:0:0
+W:3:5:2:40
+A:3/1
+P:0:1d1:0:0:0
+F:EASY_KNOW
+D:A rune signifying the caster.
+
+N:680:Ray
+G:?:b
+I:105:2:0
+W:10:5:2:300
+A:10/1
+P:0:1d1:0:0:0
+F:IGNORE_COLD | IGNORE_ELEC | EASY_KNOW
+D:A rune signifying a beam or ray.
+
+N:681:Sphere
+G:?:b
+I:105:3:0
+W:15:5:2:1000
+A:15/1
+P:0:1d1:0:0:0
+F:IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD | EASY_KNOW
+D:A rune signifying a ball or sphere.
+
+N:682:Knowledge
+G:?:b
+I:104:91:0
+W:6:5:2:200
+A:6/1
+P:0:1d1:0:0:0
+F:EASY_KNOW
+D:A rune signifying knowledge.
+
+N:683:Life
+G:?:D
+I:104:53:0
+W:3:5:2:200
+A:3/1
+P:0:1d1:0:0:0
+F:EASY_KNOW
+D:A rune signifying life.
+
+N:684:Fire
+G:?:r
+I:104:5:0
+W:10:5:2:300
+A:10/1
+P:0:1d1:0:0:0
+F:IGNORE_FIRE | EASY_KNOW
+D:A rune signifying flame.
+
+N:685:Cold
+G:?:b
+I:104:4:0
+W:12:5:2:300
+A:12/1
+P:0:1d1:0:0:0
+F:IGNORE_COLD | EASY_KNOW
+D:A rune signifying cold.
+
+N:686:Lightning
+G:?:W
+I:104:1:0
+W:13:5:2:300
+A:13/1
+P:0:1d1:0:0:0
+F:IGNORE_ELEC | EASY_KNOW
+D:A rune signifying a lightning beam.
+
+N:687:Acid
+G:?:B
+I:104:3:0
+W:16:5:2:300
+A:16/1
+P:0:1d1:0:0:0
+F:IGNORE_ACID | EASY_KNOW
+D:A rune signifying acid.
+
+N:688:Element
+G:?:g
+I:104:10:0
+W:23:5:2:1000
+A:23/1
+P:0:1d1:0:0:0
+F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD | EASY_KNOW
+D:A rune signifying an element.
+
+N:689:Chaos
+G:?:v
+I:104:30:0
+W:26:5:2:2000
+A:26/1
+P:0:1d1:0:0:0
+F:ATTR_MULTI
+F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD | EASY_KNOW
+D:A rune signifying raw chaos.
+
+N:690:Mind
+G:?:D
+I:104:85:0
+W:19:5:2:3000
+A:19/1
+P:0:1d1:0:0:0
+F:IGNORE_ELEC | EASY_KNOW
+D:A rune signifying the mind.
+
+N:691:Holding
+G:?:B
+I:104:75:0
+W:5:5:2:500
+A:5/1
+P:0:1d1:0:0:0
+F:IGNORE_ACID | EASY_KNOW
+D:A rune signifying the action of holding, or sleep.
+
+N:692:Arrow
+G:?:b
+I:105:1:0
+W:6:5:2:100
+A:6/1
+P:0:1d1:0:0:0
+F:IGNORE_ELEC | EASY_KNOW
+D:A rune signifying an arrow.
+
+N:693:Power Surge
+G:?:b
+I:105:4:0
+W:50:5:2:5000
+A:50/1
+P:0:1d1:0:0:0
+F:IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD | IGNORE_ACID | EASY_KNOW
+D:A rune signifying a powerful surge.
+
+N:694:Armageddon
+G:?:b
+I:105:5:0
+W:30:5:2:4000
+A:30/1
+P:0:1d1:0:0:0
+F:IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD | IGNORE_ACID | EASY_KNOW
+D:A rune signifying a powerful blast.
+
+N:695:Gravity
+G:?:G
+I:104:35:0
+W:16:5:2:300
+A:16/1
+P:0:1d1:0:0:0
+F:IGNORE_ACID | EASY_KNOW
+D:A rune signifying the forces of gravity.
+
+# XXX
+
+N:697:Undeath
+G:?:G
+I:104:92:0
+W:35:5:2:1000
+A:35/1
+P:0:1d1:0:0:0
+F:IGNORE_ACID | EASY_KNOW
+D:A rune signifying undeath.
+
+N:698:Protection
+G:?:G
+I:104:74:0
+W:45:5:2:1500
+A:45/1
+P:0:1d1:0:0:0
+F:IGNORE_ACID | EASY_KNOW
+D:A rune signifying protection.
+
+# XXX
+
+# The Ring of Precognition (now a k_info.txt artifact)
+N:700:& Ring~ of Precognition
+G:=:d
+I:45:51:0
+W:90:0:2:300000
+A:90/100
+T:45:23
+F:PRECOGNITION |
+f:PRECOGNITION |
+F:NORM_ART | FULL_NAME
+F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD
+D:This magical ring allows you to know what you will encounter in the near future.
+
+# Athelas, cures Black Breath
+
+N:701:& Sprig~ of Athelas
+G:,:g
+I:80:40:0
+W:25:5:2:450
+A:25/2:55/1:85/1
+D:A sprig of a healing plant brought to Middle-Earth by the Numenoreans. Also known
+D:as Kingsfoil, it will cure you from the ravages of the Black Breath.
+
+# XXX
+# XXX
+# XXX
+# XXX
+# XXX
+# XXX
+# XXX
+# XXX
+# XXX
+# XXX
+# XXX
+# XXX
+# XXX
+# XXX
+# XXX
+# XXX
+# XXX
+# XXX
+
+# The Scroll of Deincarnation (now an artifact)
+
+N:720:& Old Scroll~ of Deincarnation
+G:?:d
+I:70:40:0
+W:90:0:5:160000
+A:90/140
+T:70:51
+F:NORM_ART | FULL_NAME
+F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD
+D:It allows you to leave your body to reincarnate into
+D:another one. However, your current body is lost in the process.
+
+N:721:& Dark Sword~
+G:|:D
+I:23:33:0
+W:25:0:70:500
+A:25/1:80/2
+P:0:3d7:0:0:0
+F:SHOW_MODS | ANTIMAGIC_50
+f:ANTIMAGIC_50
+D:A strange, very sharp long sword, which seems to drain light from its surroundings. As you
+D:wield it, you feel much less attuned to magic.
+
+N:722:Numenorean for Beginners (I)
+G:?:s
+I:8:101:0
+W:10:100:5:100
+A:10/2
+D:These ancient words still contain magic.
+
+N:723:Numenorean for Beginners (II)
+G:?:s
+I:8:102:0
+W:5:100:5:150
+A:5/2
+D:These ancient words still contain magic.
+
+N:724:Advanced Lessons of Numenorean
+G:?:s
+I:8:103:0
+W:20:100:5:300
+A:20/2
+D:These ancient words still contain magic.
+
+N:725:Advanced Lessons of Sindarin
+G:?:s
+I:8:104:0
+W:20:100:5:400
+A:20/2
+D:These ancient words still contain magic.
+
+##### Junk #####
+
+N:726:& Shard~ of Pottery
+G:~:r
+I:11:3:0
+W:0:0:5:0
+A:0/1
+P:0:1d1:0:0:0
+F:EASY_KNOW
+D:A piece of clay that looks like it got broken off something.
+
+N:727:& Broken Stick~
+G:~:r
+I:11:6:0
+W:0:0:3:0
+A:0/1
+P:0:1d1:0:0:0
+F:EASY_KNOW
+D:A piece of rotten wood.
+
+# XXX
+# XXX
+# XXX
+# XXX
+# XXX
+# XXX
+# XXX
+# XXX
+# XXX
+# XXX
+
+N:738:& Book~ of Beginner Cantrips
+G:?:w
+I:111:50:0
+W:5:0:30:100
+A:5/1
+P:0:1d1:0:0:0
+D:A standard beginner's spellbook with some useful spells.
+D:The cover is blood-stained and weather-worn.
+
+N:739:& Book~ of Teleportation
+G:?:w
+I:111:51:0
+W:10:0:30:1000
+A:10/1
+P:0:1d1:0:0:0
+D:A standard spellbook with a few spells.
+D:The smell of the cover makes you think of wind.
+
+# XXX
+
+N:741:& Book~ of Summoning
+G:?:w
+I:111:52:0
+W:7:0:30:700
+A:7/1
+P:0:1d1:0:0:0
+D:A standard spellbook with a few spells.
+D:It smells like camel.
+
+# XXX
+
+# The Potion of Learning - no longer an artifact in Theme
+
+N:743:Learning
+G:!:d
+I:71:12:200
+W:99:2:2:100000
+A:99/10
+P:0:1d1:0:0:0
+F:EASY_KNOW
+D:This old potion is supposed to grant more learning power
+D:to its user.
+
+# XXX
+# XXX
+# XXX
+# XXX
+# XXX
+# XXX
+# XXX
+
+N:751:Khuzdul - The Hidden Tongue of the Dwarves
+G:?:s
+I:8:105:0
+W:2:100:5:50
+A:2/2
+D:These ancient words still contain magic.
+
+N:752:Nandorin for Dummies
+G:?:s
+I:8:106:0
+W:20:100:5:100
+A:20/2
+D:These ancient words still contain magic.
+
+N:753:Advanced Lessons of Orcish
+G:?:s
+I:8:107:0
+W:30:100:5:200
+A:30/2
+D:These ancient words still contain magic.
+
+# Here's the Ring of Flying
+N:755:Flying
+G:=:d
+I:45:54:0
+W:20:0:2:16000
+A:20/3
+F:FLY | EASY_KNOW
+f:FLY |
+D:This ring is imbued with the power of eagles. It grants you the power of flight.
+
+N:756:& Tome~ of the Time
+G:?:b
+I:111:8:0
+W:50:0:30:25000
+A:50/4
+P:0:1d1:0:0:0
+F:FULL_NAME | EASY_KNOW
+D:This tome seems to have trouble deciding whether it really exists now. Its flickering pages
+D:contain all that is known about the currents of time.
+
+N:757:& Spellbook~ of #
+G:?:w
+I:111:255:0
+W:10:0:30:200
+A:10/1:20/1:30/1:40/1:50/1:60/1:70/1
+P:0:1d1:0:0:0
+D:This book contains a single spell within its pages.
+
+N:758:& Tome~ of Meta Spells
+G:?:v
+I:111:9:0
+W:50:0:30:25000
+A:50/4
+P:0:1d1:0:0:0
+F:FULL_NAME | EASY_KNOW | IGNORE_FIRE | ATTR_MULTI
+D:This tome gives you deeper insights on the works of magic.
+
+N:759:& Tome~ of the Mind
+G:?:B
+I:111:10:0
+W:50:0:30:25000
+A:50/4
+P:0:1d1:0:0:0
+F:FULL_NAME | EASY_KNOW
+D:This tome has no pages; knowledge is transferred to you if you simply
+D:hold it.
+
+N:760:& Holy Tome~ of Eru Iluvatar
+G:?:G
+I:111:20:0
+W:50:0:30:25000
+A:50/4
+P:0:1d1:0:0:0
+F:FULL_NAME | EASY_KNOW
+D:This dusty tome is filled with ancient rituals,
+D:designed to uncover all that is hidden.
+
+N:761:& Holy Tome~ of Manwe Sulimo
+G:?:B
+I:111:21:0
+W:50:0:30:25000
+A:50/4
+P:0:1d1:0:0:0
+F:FULL_NAME | EASY_KNOW
+D:A large jewel-encrusted tome that transfers
+D:wisdom and understanding to its bearer.
+
+N:762:& War Tome~ of Tulkas
+G:?:R
+I:111:22:0
+W:50:0:30:25000
+A:50/4
+P:0:1d1:0:0:0
+F:FULL_NAME | EASY_KNOW
+D:This tome fills you with glorious visions of total devastation.
+D:Anyone in your way shall be destroyed.
+
+N:763:& Unholy Tome~ of the Hellflame
+G:?:v
+I:111:11:0
+W:50:0:30:25000
+A:50/4
+P:0:1d1:0:0:0
+F:FULL_NAME | EASY_KNOW | ATTR_MULTI
+D:This singed book smells like burned flesh. Its power is as evident
+D:as its thirst for your blood.
+
+N:764:& Corrupted Tome~ of Melkor
+G:?:D
+I:111:23:0
+W:50:0:30:25000
+A:50/4
+P:0:1d1:0:0:0
+F:FULL_NAME | EASY_KNOW
+D:A black and scarlet flame springs from this tome, issuing
+D:a thunderous roar, and you hear the screams of tormented souls.
+
+N:765:& Ironclad Tome~ of Aule
+G:?:s
+I:111:63:0
+W:50:0:30:25000
+A:50/4
+P:0:1d1:0:0:0
+F:FULL_NAME | EASY_KNOW
+D:The sleek black cover of this tome is covered with intricate
+D:carved decorations, inset with rubies that sparkle like fire.
+
+N:766:& Shining Tome~ of Varda
+G:?:y
+I:111:64:0
+W:50:0:30:25000
+A:50/4
+P:0:1d1:0:0:0
+F:FULL_NAME | EASY_KNOW
+D:This tome's cover and pages radiate a soft white light.
+
+N:767:& Ocean Tome~ of Ulmo
+G:?:B
+I:111:65:0
+W:50:0:30:25000
+A:50/4
+P:0:1d1:0:0:0
+F:FULL_NAME | EASY_KNOW
+D:This book smells faintly of seaweed and appears to be wet.
+
+N:768:& Forest Tome~ of Yavanna
+G:?:G
+I:111:24:0
+W:50:0:30:25000
+A:50/4
+P:0:1d1:0:0:0
+F:FULL_NAME | EASY_KNOW
+D:The cover of this tome reminds you of tree bark.
+D:You feel the smell of grass and flowers as you read it.
+
+# for the Library Quest
+# Tome of PLAYER
+N:769:Tome of#
+G:?:v
+I:111:61:0
+W:50:0:30:25000
+A:50/4
+P:0:1d1:0:0:0
+F:FULL_NAME | EASY_KNOW | ATTR_MULTI | SPECIAL_GENE
+F:IGNORE_ACID | IGNORE_ELEC | IGNORE_FIRE | IGNORE_COLD | NORM_ART
+D:This book has some of your favourite spells inside.
+
+# The Ring of Phasing -- see artifact list
+
+N:770:& Ring~
+G:=:d
+I:45:55:0
+W:110:0:2:300000
+A:110/5
+F:INSTA_ART | SPECIAL_GENE
+
+N:771:& Holy Tome~ of Mandos
+G:?:w
+I:111:66:0
+W:50:0:30:25000
+A:50/4
+P:0:1d1:0:0:0
+F:FULL_NAME | EASY_KNOW
+D:Just holding this tome makes you fill with quiet strength.
+
+# XXX #
+# XXX #
+# XXX #
+# XXX #
+
+# Rod Tip of Home Summoning: now an artifact
+#N:776:& Great Rod Tip~ of Home Summoning
+N:776:Home Summoning
+G:-:d
+I:66:30:75
+W:90:0:15:150000
+A:100/14
+P:0:1d1:0:0:0
+T:66:1
+F:NORM_ART | FULL_NAME
+F:IGNORE_FIRE | IGNORE_ACID | IGNORE_COLD | IGNORE_ELEC
+D:This rod creates a little hatch, allowing access to your home no matter how far away it is.
+
+# Additional swords
+N:777:& Shadow Blade~
+G:|:D
+I:23:32:1
+W:50:900:45:2000
+A:48/4:60/2:80/1
+P:0:4d4:-2:2:0
+F:IGNORE_ACID | RES_DARK | STEALTH
+f:STEALTH
+D:A thin long sword made of a completely black metal, which reflects no light.
+
+N:778:& Bluesteel Blade~
+G:|:b
+I:23:31:0
+W:60:1800:50:6000
+A:60/20
+P:0:1d6:4:0:0
+F:SHOW_MODS | VORPAL
+D:A small sword made of a blueish metal with a strangely rough surface. As anything is hurt
+D:with it, the weapon will stick inside the wound and cause horrible wounds when torn away.
+
+# Amulet
+N:779:the Serpents
+G:":G
+I:40:17:0
+W:25:0:3:10000
+A:25/1
+a:HARDCORE=BA_POIS_4
+F:RES_POIS | DEX | ACTIVATE
+D:A petrified serpent's tongue, hung on a thin chain to be clasped around your neck. It makes you
+D:like a snake, able to wriggle out of tight corners, impervious to poisons and poisonous
+D:yourself.
+
+# XXX
+# XXX
+# XXX
+# XXX
+# XXX
+
+# The Nine Rings for mortal men doomed to die! When a Nazgul is
+# destroyed, it drops a Ring of Power with random powers.
+
+N:785:Ring~ of Power
+G:=:d
+I:45:5:0
+W:100:0:2:1
+A:100/100
+F:INVIS | DRAIN_EXP | CURSED | HEAVY_CURSE | CURSE_NO_DROP
+f:INVIS
+F:SPECIAL_GENE | FULL_NAME
+
+# To help people climb mountains...
+
+N:786:& Climbing Set~
+G:`:B
+I:12:0:0
+W:40:0:2:50000
+A:40/3
+F:CLIMB
+f:CLIMB
+D:A bunch of screws and hooks, a small pick and a very long rope. As long as a wall or rock face
+D:isn't really high, this collection of tools should help you across it.
+
+# Parchment to help beginners
+N:787:Adventurer's Guide to Middle-earth
+G:?:o
+I:8:20:0
+W:0:0:5:1
+A:0/1
+D:This parchment contains vital information no adventurer can live without.
+
+##### Demonblades #####
+N:788:& Demonblade~
+G:|:R
+I:115:55:0
+W:10:0:150:500
+A:10/1
+P:0:4d6:0:0:0
+F:SHOW_MODS | SLAY_DEMON | WIELD_CAST
+D:This blade has been taken from the corpse of a demon.
+D:Some demonic energy is still coursing through it, helping
+D:you slay other demons.
+
+N:789:& Demonshield~
+G:]:R
+I:115:56:0
+W:15:0:70:500
+A:15/1
+P:5:1d1:0:0:0
+F:REGEN | WIELD_CAST
+D:This shield has been taken from the corpse of a demon.
+D:Some demonic energy is still coursing through it, giving
+D:life to any that wield it.
+
+N:790:& Demonhorn~
+G:[:R
+I:115:57:0
+W:20:0:30:500
+A:20/1
+P:2:1d1:0:0:0
+F:LITE2 | WIELD_CAST
+D:This horn is about six feet long, and originates from a demon.
+D:Some demonic energy is still coursing through it.
+
+# XXX
+# XXX
+
+### Rods ###
+
+N:793:& Wooden Rod~ of#
+G:-:u
+I:67:10:0
+W:10:0:15:100
+A:5/1:10/1
+P:0:1d1:0:0:0
+D:The most common rod of all. It's the wood of oak, cut at midnight by a fair maiden.
+
+N:794:& Copper Rod~ of#
+G:-:s
+I:67:20:0
+W:15:0:15:200
+A:15/1
+P:0:1d1:0:0:0
+D:This is the common rod of the dwarves. It is created by chanting incessantly for 48 hours.
+
+N:795:& Iron Rod~ of#
+G:-:D
+I:67:50:0
+W:20:0:15:500
+A:20/1
+P:0:1d1:0:0:0
+D:This is the better version of the copper rod. It has been forged with iron that comes from
+D:the greatest depths, where even the Dwarves fear to go.
+
+N:796:& Moonstone Rod~ of#
+G:-:U
+I:67:75:0
+W:25:0:15:750
+A:25/1
+P:0:1d1:0:0:0
+D:This rod has been fashioned from moonrock. Its alien nature gives it quite a bit of capacity.
+
+N:797:& Silver Rod~ of#
+G:-:s
+I:67:100:0
+W:30:0:15:1000
+A:30/1
+P:0:1d1:0:0:0
+D:This rod is used often used by court mages. Its creation costs an insane amount of gold.
+
+N:798:& Golden Rod~ of#
+G:-:y
+I:67:125:0
+W:40:0:15:1250
+A:40/2
+P:0:1d1:0:0:0
+D:These rods are rare, since finding gold that can withstand the great magic
+D:capacity that this rod holds is very difficult.
+
+N:799:& Mithril Rod~ of#
+G:-:B
+I:67:160:0
+W:50:0:15:1600
+A:50/5
+P:0:1d1:0:0:0
+D:The mithril of this rod comes from very deep, too deep. Unknown powers have been
+D:infused in this rod, making it the second most powerful type of rod on Middle-earth.
+
+N:800:& Tilkal Rod~ of#
+G:-:v
+I:67:200:0
+W:70:0:15:2000
+A:70/30
+P:0:1d1:0:0:0
+F:ATTR_MULTI
+F:IGNORE_ACID | IGNORE_FIRE | IGNORE_COLD | IGNORE_ELEC
+D:This is the rarest and most powerful kind of rod there is. Its material was once used
+D:to chain Melkor Bauglir in the Halls of Mandos, and only Aule knows the secret of its
+D:making. Treasure this rod greatly.
+
+N:801:& Greater Ration~ of Health
+G:,:g
+I:80:41:0
+W:90:0:2:60000
+A:90/70
+D:This food will, once eaten, permanently add 70 HP.
+
+# Scroll of Mass Resurrection - artifact scroll
+N:802:& Crumpled Scroll~ of Mass Resurrection
+G:?:d
+I:70:43:0
+W:55:0:5:0
+A:55/1
+T:70:1
+F:NORM_ART | FULL_NAME
+F:IGNORE_FIRE | IGNORE_ACID | IGNORE_COLD | IGNORE_ELEC
+D:This magical scroll sends a call to the halls of Mandos, issuing forth all those who have been
+D:slain by the reader.
+
+### Axes ###
+
+N:803:& Cleaver~
+G:/:s
+I:24:2:0
+W:13:0:110:175
+A:13/1
+P:0:2d4:0:0:0
+F:SHOW_MODS
+D:A small axe with a heavy rectangular blade.
+
+N:804:& Light War Axe~
+G:/:s
+I:24:8:0
+W:16:0:140:300
+A:16/1
+P:0:2d5:0:0:0
+F:SHOW_MODS
+D:A broad-bladed axe, suited for battle.
+
+N:805:& Slaughter Axe~
+G:/:G
+I:24:30:0
+W:70:0:300:6000
+A:70/8
+P:0:5d7:0:0:0
+F:SLAY_ANIMAL | SHOW_MODS
+D:A huge axe, the sort used for slaughtering animals, this weapon is unusually deadly against
+D:natural creatures.
+
+N:806:& Runestone~
+G:?:v
+I:105:255:0
+W:10:5:2:300
+A:10/3:20/2:30/1:60/1
+P:0:1d1:0:0:0
+F:IGNORE_COLD | IGNORE_ELEC | IGNORE_FIRE | IGNORE_ACID
+D:A small oval stone. One surface is flat, as if something ought to be scratched or inscribed into
+D:it.
+
+N:807:& Fortune cookie~
+G:,:U
+I:80:42:500
+W:0:0:2:10
+A:0/1:5/1:10/1
+D:A small, sweet bakery product, with a scrap of paper inside.
+
+# 808 was Portable hole
+
+N:809:Critical Hits
+G:=:d
+I:45:59:0
+W:50:0:2:10000
+A:50/3
+F:CRIT
+f:CRIT
+D:A magical ring to make it likelier for the wearer to hit exceptionally heavily.
+
+# The Wand of Stone to Mud of Thrain
+N:810:& Wand~ of Digging of Thrain
+G:-:d
+I:65:26:-1:SPELL=Dig
+W:10:10:10:3200
+A:10/200
+P:0:10d10:0:0:0
+T:65:6
+F:RECHARGE | SPECIAL_GENE | EASY_USE | RECHARGED | NORM_ART | FULL_NAME
+D:The miner's friend. This wand was used by Thrain to dig into the
+D:walls of the dungeon. Its indestructible nature makes it quite useful.
+
+# The Staff of Holy Fire of Mithrandir
+N:811:& Gnarled Staff~ of Holy Fire of Mithrandir
+G:_:d
+I:55:22:-1:SPELL=Holy Fire of Mithrandir
+W:50:10:10:12000
+P:0:10d4:0:0:0
+A:50/200
+T:55:8
+F:RECHARGE | EASY_USE | RECHARGED | NORM_ART | FULL_NAME
+D:Mithrandir's staff that throws powerful fire attacks at all enemies. It
+D:can be recharged without blowing up, for it is built to hold
+D:much magical energy.
+
+### Summoner totems ###
+
+N:812:Partial Totem
+G:":v
+I:54:1:0
+W:10:10:10:120
+P:0:1d1:0:0:0
+A:10/200
+F:SPECIAL_GENE
+D:An item which a Summoner can use to animate a copy of a creature that
+D:only exists by the will of its master.
+
+N:813:True Totem
+G:":v
+I:54:2:0
+W:10:10:10:120
+P:0:1d1:0:0:0
+A:10/200
+F:SPECIAL_GENE
+D:An item which a Summoner can use to revive a true copy of a creature.
+
+### Holy relics for God Quests ###
+
+N:814:& Piece~ of the Relic of Eru
+G:~:v
+I:11:7:0
+W:0:0:0:1000
+A:0/1
+P:0:1d1:0:0:0
+F:SPECIAL_GENE | IGNORE_COLD | IGNORE_ELEC | IGNORE_FIRE | IGNORE_ACID
+D:Although it looks like a piece of junk, it is actually part of an ancient
+D:relic belonging to Priests of Eru. The relic now lies in pieces, hidden
+D:from all but but his most dedicated followers.
+
+N:815:& Piece~ of the Relic of Manwe
+G:~:v
+I:11:8:0
+W:0:0:0:1000
+A:0/1
+P:0:1d1:0:0:0
+F:SPECIAL_GENE | IGNORE_COLD | IGNORE_ELEC | IGNORE_FIRE | IGNORE_ACID
+D:Although it looks like a piece of junk, it is actually part of an ancient
+D:relic belonging to Priests of Manwe. The relic now lies in pieces, hidden
+D:from all but his most dedicated followers.
+
+N:816:& Piece~ of the Relic of Tulkas
+G:~:v
+I:11:9:0
+W:0:0:0:1000
+A:0/1
+P:0:1d1:0:0:0
+F:SPECIAL_GENE | IGNORE_COLD | IGNORE_ELEC | IGNORE_FIRE | IGNORE_ACID
+D:Although it looks like a piece of junk, it is actually part of an ancient
+D:relic belonging to worshippers of Tulkas. The relic now lies in pieces,
+D:hidden from all but his most dedicated followers.
+
+N:817:& Piece~ of the Relic of Melkor
+G:~:v
+I:11:10:0
+W:0:0:0:1000
+A:0/1
+P:0:1d1:0:0:0
+F:SPECIAL_GENE | IGNORE_COLD | IGNORE_ELEC | IGNORE_FIRE | IGNORE_ACID
+D:Although it looks like a piece of junk, it is actually part of an ancient
+D:relic belonging to Dark Priests. The relic now lies in pieces, hidden
+D:from all but the most faithful followers of Melkor.
+
+N:818:& Piece~ of the Relic of Yavanna
+G:~:v
+I:11:11:0
+W:0:0:0:1000
+A:0/1
+P:0:1d1:0:0:0
+F:SPECIAL_GENE | IGNORE_COLD | IGNORE_ELEC | IGNORE_FIRE | IGNORE_ACID
+D:Although it looks like a piece of junk, it is actually part of an ancient
+D:relic belonging to Druids. The relic now lies in pieces, hidden
+D:from all but the most faithful followers of Yavanna.
+
+### Dwarven Rings of Power were here
+
+# XXX #
+# XXX #
+# XXX #
+# XXX #
+# XXX #
+# XXX #
+
+### More God relics ###
+
+N:825:& Piece~ of the Relic of Aule
+G:~:v
+I:11:16:0
+W:0:0:0:1000
+A:0/1
+P:0:1d1:0:0:0
+F:SPECIAL_GENE | FULL_NAME
+F:IGNORE_ACID | IGNORE_COLD | IGNORE_ELEC | IGNORE_FIRE |
+D:Although it looks like a piece of junk, it is actually part of an ancient
+D:relic belonging to the Stonewrights. The relic now lies in pieces, hidden
+D:from all but the most faithful followers of Aule.
+
+N:826:& Piece~ of the Relic of Varda
+G:~:v
+I:11:17:0
+W:0:0:0:1000
+A:0/1
+P:0:1d1:0:0:0
+F:SPECIAL_GENE | FULL_NAME
+F:IGNORE_ACID | IGNORE_COLD | IGNORE_ELEC | IGNORE_FIRE |
+D:Although it looks like a piece of junk, it is actually part of an ancient
+D:relic belonging to the Priests of Varda. The relic now lies in pieces,
+D:hidden from all but the most faithful followers of Varda.
+
+N:827:& Piece~ of the Relic of Ulmo
+G:~:v
+I:11:18:0
+W:0:0:0:1000
+A:0/1
+P:0:1d1:0:0:0
+F:SPECIAL_GENE | FULL_NAME
+F:IGNORE_ACID | IGNORE_COLD | IGNORE_ELEC | IGNORE_FIRE |
+D:Although it looks like a piece of junk, it is actually part of an ancient
+D:relic belonging to the Priests of Ulmo. The relic now lies in pieces, hidden
+D:from all but the most faithful followers of Ulmo.
+
+N:828:& Piece~ of the Relic of Mandos
+G:~:v
+I:11:19:0
+W:0:0:0:1000
+A:0/1
+P:0:1d1:0:0:0
+F:SPECIAL_GENE | FULL_NAME
+F:IGNORE_ACID | IGNORE_COLD | IGNORE_ELEC | IGNORE_FIRE |
+D:Although it looks like a piece of junk, it is actually part of an ancient
+D:relic belonging to the Priests of Mandos. The relic now lies in pieces,
+D:hidden from all but the most faithful followers of Mandos.
+
+# XXX Orome's relic goes here #
+# XXX Lorien/Nienna's relic goes here #
+
+### New items for the Theme module ###
+
+### Food ###
+
+N:831:& Pinch~ of Longbottom Leaf
+G:.:g
+I:80:45:10
+#Prized at stores :P
+W:1:1:1:300
+A:1/1
+D:It's chewing tobacco, and not very nutritious. It is said to
+D:contain great stress-relieving properties.
+
+# XXX #
+# XXX #
+# XXX #
+# XXX #
+
+N:836:& Jar~ of Honey
+G:~:y
+I:80:43:1000
+W:1:1:10:50
+A:1/1:5/1:10/1:15/1
+D:A clay jar filled with pure honey. You can 'E'at it.
+
+N:837:& Jug~ of Milk
+G:~:w
+I:80:44:1000
+W:1:1:10:50
+A:1/1
+D:A clay jug filled with fresh milk. You wonder how that is
+D:possible in the dungeon. You can drink it by pressing 'E'.
+
+### Amulets and rings ###
+
+N:838:of War
+G:":d
+I:40:3:3
+W:70:12:3:55000
+A:70/12
+F:BLOWS | STR | DEX
+F:AGGRAVATE | DRAIN_MANA | DRAIN_EXP
+D:This rare amulet will magically improve your fighting prowess
+D:greatly, but this improvement comes at a cost. Nothing can
+D:ignore the challenge this amulet magically issues when worn.
+
+N:839:of Life
+G:":d
+I:40:16:1
+W:70:12:3:100000
+A:70/12
+F:LIFE | SUST_CON | HOLD_LIFE | DRAIN_MANA
+D:This rare amulet will magically increase your life force and
+D:even prevent it from being sapped. However, wearing this
+D:amulet makes you feel less adept at using magic.
+
+# New jewelry from T-Plus by Ingeborg S. Norden
+# They reuse some svals and so colours will match. This will change when ToME3 comes out.
+
+N:840:Wizardry
+G:=:d
+I:45:10:2
+W:100:0:2:125000
+A:100/10
+F:MANA | SPELL | SPELL_CONTAIN | WIELD_CAST | HIDE_TYPE |
+f:IGNORE_ACID | IGNORE_COLD | IGNORE_ELEC | IGNORE_FIRE | SPELL |
+D:This powerful ring not only stores a chosen spell (which must be
+D:engraved by 'copying' it); it also improves the power of cast spells
+D:and augments the wearer's magical reserves.
+
+N:841:Vitality
+G:=:d
+I:45:11:2
+W:100:0:2:125000
+A:100/10
+F:SUST_STR | SUST_DEX | SUST_CON | REGEN |
+F:HOLD_LIFE | LIFE |
+F:HIDE_TYPE | ACTIVATE |
+a:HARDCORE=CURE_HUNGER
+f:SUST_STR | SUST_DEX | SUST_CON | REGEN |
+D:This valuable ring enhances and protects the wearer's life force in every way.
+
+N:842:Clear Thought
+G:=:d
+I:45:12:0
+W:100:0:2:125000
+A:100/10
+F:SUST_INT | SUST_WIS | RES_FEAR | RES_CONF |
+F:ACTIVATE | EASY_KNOW |
+a:HARDCORE=CURE_INSANITY
+f:SUST_INT | SUST_WIS |
+D:This valuable ring protects the wearer's intellect and intuition, as well as
+D:guarding him from most mental attacks. From time to time, the wearer can
+D:even purge himself of insanity.
+
+### New scroll ###
+N:846:Sterilise
+G:?:d
+I:70:54:0
+W:40:0:5:200
+A:30/1
+D:This scroll humanely neuters all nearby monsters.
+
+### Maps ###
+
+### Massimiliano Marangio's map ###
+N:847:Map of Middle-earth
+G:?:s
+I:8:204:0
+W:70:100:30:100000
+A:70/3
+D:A large map describing all lands of Middle-earth.
+
+# Map of Edoras
+N:848:Map of Edoras
+G:?:s
+I:8:205:0
+W:10:100:5:500
+D:A map of the capital city of Rohan.
+
+# Map of Esgaroth
+N:849:Map of Esgaroth
+G:?:s
+I:8:206:0
+W:15:100:5:1500
+D:A map of the city upon the Long Lake at the foot
+D:of the Lonely Mountain.
+
+# Map of Hobbiton
+N:850:Map of Hobbiton
+G:?:s
+I:8:207:0
+W:5:100:5:150
+D:A map of the famous Halfling village.
+
+# Map of Osgiliath
+N:851:Map of Osgiliath
+G:?:s
+I:8:208:0
+W:25:100:5:10000
+D:A map of the proud stronghold of Gondor.
+
+# Map of Pelargir
+N:852:Map of Pelargir
+G:?:s
+I:8:209:0
+W:25:100:5:10000
+D:A map of the great city of Men at the mouth
+D:of the Anduin river.
+
+# Map of Beorn's domain
+N:853:Map of Beorn's domain
+G:?:s
+I:8:210:0
+W:20:100:5:3000
+D:A map showing the location of the house of Beorn.
+
+# Map of Dale
+N:854:Map of Dale
+G:?:s
+I:8:211:0
+W:10:100:5:200
+D:A map of the area where Dale is being rebuilt.
+
+# Map of Henneth Annun
+N:855:Map of Henneth Annun
+G:?:s
+I:8:212:0
+W:70:100:5:30000
+D:A map showing the secret location of the Ranger
+D:outpost in Ithilien.
+
+# Map of Helm's Deep
+N:856:Map of Helm's Deep
+G:?:s
+I:8:213:0
+W:50:100:5:3000
+D:A map showing the location of the greatest
+D:fortress in Rohan.
+
+# Map of Thranduil's realm
+N:857:Map of Thranduil's realm
+G:?:s
+I:8:214:0
+W:60:100:5:8000
+D:A map showing the location of the secret realm
+D:of the Wood-elves.
+
+# Map of Imladris
+N:858:Map of Imladris
+G:?:s
+I:8:215:0
+W:60:100:5:9000
+
+### Axes from T-Plus ###
+
+N:859:& Bearded Axe~
+G:\:s
+I:24:3:0
+W:8:0:35:100
+P:0:1d6:0:0:0
+A:8/1:15/1
+F:SHOW_MODS | COULD2H
+f:COULD2H
+D:A throwing-length axe with a "beard", an increased depth at the lower
+D:end of the blade. Surprisingly light and durable, it doubles as a
+D:wood-chopping implement in times of peace.
+
+N:860:& Double Axe~
+G:\:s
+I:24:4:0
+W:25:0:200:450
+P:0:3d6:0:0:0
+A:25/1:40/1
+F:SHOW_MODS | MUST2H
+f:MUST2H
+D:A mighty axe with two moon-shaped blades on each side of the headpiece,
+D:the immense weight leads to slow but powerful swings.
+
+N:861:& Crusader Axe~
+G:\:W
+I:24:6:0
+W:10:0:130:300
+A:10/1:20/1
+P:0:2d5:0:0:0
+F:SHOW_MODS
+D:The predecessor of the Battle Axe. Shorter and lighter, it delivers less
+D:of a punch, but is favored by mounted cavalry.
+
+N:862:& Reaper Axe~
+G:\:W
+I:24:7:0
+W:22:0:150:420
+A:22/1
+P:0:3d4:0:0:0
+F:SHOW_MODS | COULD2H
+f:COULD2H
+D:A large axe with an elongated moon shaped blade. Strikes a good balance
+D:between swinging power and speed.
+
+### New armour adapted from T-Plus (well, I had Mithril Helms before T-Plus
+### did, but they didn't work, so I took them out. :P)
+
+N:863:& Mithril Helm~
+G:]:B
+I:32:8:0
+W:50:0:60:2500
+P:7:1d2:0:0:5
+F:IGNORE_ACID
+D:A cone-shaped helm with cheekguards, made of True-silver.
+
+N:864:& Set~ of Mithril Gauntlets
+G:]:B
+I:31:4:0
+W:50:0:25:3500
+A:50/2
+P:4:1d2:0:0:5
+F:IGNORE_ACID
+D:Flexible and strong set of handguards, with a gripping
+D:surface and surprisingly smooth interior.
+
+N:865:& Small Mithril Shield~
+G:):B
+I:34:7:0
+W:50:0:65:5000
+A:50/2
+P:5:1d2:0:0:5
+F:IGNORE_ACID
+D:A light shield made of a metal alloy, with a mithril
+D:coating.
+
+### Added in Theme
+N:866:& Large Mithril Shield~
+G:):B
+I:34:8:0
+W:50:0:80:7000
+A:50/2
+P:8:1d2:0:0:10
+F:IGNORE_ACID
+D:A sturdy shield made of a metal alloy, with a mithril
+D:coating.
+
+### Artifacts ###
+
+# New artifacts needed for Erebor quest
+
+N:867:Map
+G:?:U
+I:8:33:0
+W:70:100:30:50000
+F:INSTA_ART |
+D:At first glance, this looks like another crumpled piece of paper.
+D:As you smooth out the parchment, you see the faint outline of a
+D:map... You have a feeling you might find use for this map one day.
+D:Better hang on to it, you never know when you might need it.
+
+N:868:& Key~
+G:-:W
+I:11:13:0
+W:70:100:5:50000
+F:INSTA_ART |
+D:As you clear away some mud from this item, you notice that it is
+D:actually a small silver key. You wonder what it opens. Perhaps
+D:you should hang on to this key, you might find it useful later.
+D:Better hang on to it, you never know when you might need it.
+
+# New artifact that acts as a junkart
+N:869:& Cup~
+G:+:y
+I:11:14:0
+W:70:100:50:100000
+F:INSTA_ART |
+D:It looks like a lump of clay, and as you prepare to throw it
+D:away, a piece breaks off, and you see a faint gleam of gold.
+D:Taking off the rest of the caked-on mud, you see that it is
+D:a golden cup with ornate jewels. It may hold hidden powers.
+
+# The Red Arrow of Gondor - see artifact list
+N:870:& Red Arrow~
+G:{:R
+I:11:15:0
+W:40:70:2:70000
+F:INSTA_ART
+D:As you clear away some dirt from this object, you notice that it is an arrow
+D:with steel barbs, black flights, and a red tip. Perhaps it isn't so useless.
+
+# The Sceptre of Numenor - see artifact list
+N:871:& Sceptre~
+G:|:B
+I:12:2:4
+W:50:40:24:80000
+F:INSTA_ART
+D:A beautiful golden sceptre of kings, encrusted with shining gems.
+
+# The Rod of Annuminas - see artifact list
+N:872:& Rod~
+G:|:G
+I:12:3:4
+W:60:50:24:80000
+F:INSTA_ART
+D:A royal sceptre made of gold and silver, inlaid with emeralds.
+
+# The Necklace of Girion - see artifact list
+N:873:& Necklace~
+G:":G
+I:40:4:5
+W:20:5:2:15000
+F:INSTA_ART
+
+# The Amulet of Faramir - see artifact list
+N:874:& Amulet~
+G:":B
+I:40:29:5
+W:10:2:2:10000
+F:INSTA_ART
+
+# The Black Banner of Gondor - see artifact list
+N:875:& Black Banner~
+G:~:D
+I:39:108:0
+W:60:30:50:50000
+F:LITE1 | INSTA_ART
+D:A strange banner of black thread rolled up as though it were a scroll.
+
+# The Pearl 'Nimphelos' - see artifact list
+N:876:& Pearl~
+G:~:w
+I:39:109:1
+W:20:10:10:40000
+P:0:1d1:0:0:0
+F:LITE3 | INSTA_ART | FULL_NAME
+D:A beautiful shining pearl, about the size of a dove's egg.
+
+# The Silmaril of Flames - see artifact list
+N:877:& Silmaril~
+G:*:R
+I:39:110:2
+W:75:90:200:100000
+P:0:10d10:0:0:0
+F:LITE2 | LITE3 | INSTA_ART | FULL_NAME
+D:A dazzling, mesmerizingly beautiful jewel, shining in pure white
+D:light with a slight tinge of red. It hurts your eyes to look at it,
+D:yet you cannot bear to turn away from it, either.
+
+# The Silmaril of the Seas - see artifact list
+N:878:& Silmaril~
+G:*:B
+I:39:111:2
+W:75:90:200:100000
+P:0:10d10:0:0:0
+F:LITE2 | LITE3 | INSTA_ART
+D:A dazzling, mesmerizingly beautiful jewel, shining in pure white
+D:light with a slight tinge of blue. It hurts your eyes to look at it,
+D:yet you cannot bear to turn away from it, either.
+
+### Golden Harp of Thorin - see artifact list.
+N:879:& Golden Harp~
+G:/:y
+I:14:59:2
+W:50:0:30:40000
+P:0:1d1:0:0:0
+F:INSTA_ART
+D:A musical instrument made of pure shining gold.
+
+### Map of the Northern Reaches
+
+N:880:Map of Forodwaith
+G:?:s
+I:8:216:0
+W:40:100:30:40000
+A:40/3
+D:A map showing the northern reaches of Middle-earth.
+
+N:881:& Ranger's Arrow~
+G:{:g
+I:17:3:0
+W:5:7:1:3
+P:0:2d6:0:0:0
+A:5/7:20/7:50/7
+F:SHOW_MODS
+F:SLAY_ANIMAL | ESP_ANIMAL
+D:A sharpened metal head on a piece of wood, fitted with decorative
+D:green feathers. You can use it for 'f'iring a bow.
+
+N:882:& Throwing Axe~
+G:/:s
+I:24:7:0
+A:0/2:5/2:10/2:20/2
+W:0:0:15:30
+P:0:1d3:0:0:0
+F:SHOW_MODS
+D:The smallest and lightest of its kind, this axe has a single blade
+D:with a sharp steel tip, counterbalanced by a pointed fluke.
+
+# Buckler adapted from FuryMod in Theme 1.1.5
+
+N:883:& Buckler~
+G:):U
+I:34:1:1
+W:10:9:50:10
+P:-30:1d1:0:0:0
+A:10/2:15/2:20/2
+F:BLOWS
+f:BLOWS
+D:A small, round fist-shield made of wood, with a central dome
+D:under which there is a handle. Generally used with smaller
+D:arms; the buckler does not afford much protection. Its chief
+D:use is as an aid in fighting.
+
+# Mithril boomerangs adapted from FuryMod in Theme 1.1.5
+
+N:884:& Small Mithril Boomerang~
+G:{:B
+I:15:3:0
+W:25:0:40:300
+A:25/1:35:/2
+P:0:2d5:0:0:0
+F:SHOW_MODS | IGNORE_ACID
+D:A small curved piece of wood with mithril blades on the "forward" edges.
+
+N:885:& Mithril Boomerang~
+G:{:B
+I:15:4:0
+W:35:5:40:1000
+A:35/1:50/2
+P:0:5d6:0:0:0
+F:SHOW_MODS | IGNORE_ACID
+D:A curved leaf-shaped piece of wood, its "forward" edges enhanced with mithril blades.
+
+# N: serial number : & object name~
+# G: symbol : color
+# I: tval : sval : pval
+# W: depth : rarity : weight : cost
+# P: base armor class : base damage : plus to-hit : plus to-dam : plus to-ac
+# A: depth/rarity : depth/rarity : etc
+# F: flag | flag | etc \ No newline at end of file
diff --git a/lib/mods/theme/edit/library.map b/lib/mods/theme/edit/library.map
new file mode 100644
index 00000000..2369fbd6
--- /dev/null
+++ b/lib/mods/theme/edit/library.map
@@ -0,0 +1,62 @@
+# Permanent wall
+F:X:63:3
+
+# Granite Wall
+F:#:57:3
+
+# Cobblestone Road
+F:O:200:3
+
+# Floor
+F:.:1:3
+
+# Lich
+F:l:200:3:518
+
+# Master lich
+F:L:200:3:658
+
+# Quest exit
+F:<:6:3
+
+D:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+D:X###############################################################X
+D:X#<OlOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO#X
+D:X#O#.###.#.###.#.###.#.###.#.###.O.###.#.###.#.###.#.###.#.###O#X
+D:X#O#.###.#.###.#.###.#.###.#.###.O.###.#.###.#.###.#.###.#.###O#X
+D:X#O#.###.#.###.#.###.#.###.#.###.O.###.#.###.#.###.#.###.#.###O#X
+D:X#O#.###.#.###.#.###.#.###.#.###.O.###.#.###.#.###.#.###.#.###O#X
+D:X#O#.###.#.###.#.###.#.###.#.###.O.###.#.###.#.###.#.###.#.###O#X
+D:X#O#.###.#.###.#.###.#.###.#.###.O.###.#.###.#.###.#.###.#.###O#X
+D:X#O#.###.#.###.#.###.#.###.#.###.O.###.#.###.#.###.#.###.#.###O#X
+D:X#O#.###.#.###.#.###.#.###.#.###.O.###.#.###.#.###.#.###.#.###O#X
+D:X#O#.###.#.###.#.###.#.###.#.###.O.###.#.###.#.###.#.###.#.###O#X
+D:X#O#.###.#.###.#.###.#.###.#.###.O.###.#.###.#.###.#.###.#.###O#X
+D:X#OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO#X
+D:X#O#.###.#.###.#.###.#.###.#.###.O.###.#.###.#.###.#.###.#.###O#X
+D:X#O#.###.#.###.#.###.#.###.#.###.O.###.#.###.#.###.#.###.#.###O#X
+D:X#O#.###.#.###.#.###.#.###.#.###.O.###.#.###.#.###.#.###.#.###O#X
+D:X#O#.###.#.###.#.###.#.###.#.###.O.###.#.###.#.###.#.###.#.###O#X
+D:X#O#.###.#.###.#.###.#.###.#.###.O.###.#.###.#.###.#.###.#.###O#X
+D:X#O#.###.#.###.#.###.#.###.#.###.O.###.#.###.#.###.#.###.#.###O#X
+D:X#O#.###.#.###.#.###.#.###.#.###.O.###.#.###.#.###.#.###.#.###O#X
+D:X#O#.###.#.###.#.###.#.###.#.###.O.###.#.###.#.###.#.###.#.###O#X
+D:X#O#.###.#.###.#.###.#.###.#.###.O.###.#.###.#.###.#.###.#.###O#X
+D:X#O#.###.#.###.#.###.#.###.#.###.O.###.#.###.#.###.#.###.#.###O#X
+D:X#OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO#X
+D:X#O#.###.#.###.#.###.#.###.#.###.O.###.#.###.#.###.#.###.#.###O#X
+D:X#O#.###.#.###.#.###.#.###.#.###.O.###.#.###.#.###.#.###.#.###O#X
+D:X#O#.###.#.###.#.###.#.###.#.###.O.###.#.###.#.###.#.###.#.###O#X
+D:X#O#.###.#.###.#.###.#.###.#.###.O.###.#.###.#.###.#.###.#.###O#X
+D:X#O#.###.#.###.#.###.#.###.#.###.O.###.#.###.#.###.#.###.#.###O#X
+D:X#O#.###.#.###.#.###.#.###.#.###.O.###.#.###.#.###.#.###.#.###O#X
+D:X#O#.###.#.###.#.###.#.###.#.###.O.###.#.###.#.###.#.###.#.###O#X
+D:X#O#.###.#.###.#.###.#.###.#.###.O.###.#.###.#.###.#.###.#.###O#X
+D:X#O#.###.#.###.#.###.#.###.#.###.O.###.#.###.#.###.#.###.#.###O#X
+D:X#O#.###.#.###.#.###.#.###.#.###.O.###.#.###.#.###.#.###.#.###O#X
+D:X#OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOL#X
+D:X###############################################################X
+D:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+
+# Starting position
+P:4:4
diff --git a/lib/mods/theme/edit/maeglin.map b/lib/mods/theme/edit/maeglin.map
new file mode 100644
index 00000000..e3be9972
--- /dev/null
+++ b/lib/mods/theme/edit/maeglin.map
@@ -0,0 +1,85 @@
+# Created by Mynstral (mynstral@thehelm.com)
+# Made for PernAngband on 26/07/2001
+
+# Monsters starts awake
+N:0
+
+# Permanent wall
+F:X:63:3
+
+# Marker
+F:<:172:3
+
+# up stairs with maeglin
+F:{:6:3:825:0:0:0:0:0:0:2
+
+# Floor with dirt
+F:.:88:5
+
+# Floor with dirt with an Ettin
+F:e:88:5:621
+
+# Floor with dirt with a War Troll
+F:w:88:5:631
+
+# Floor with dirt with a Troll Chieftan
+F:t:88:5:799
+
+# Floor with dirt with a Snagga sapper
+F:s:88:5:251
+
+# Floor with dirt with an Orc Captain
+F:o:88:5:285
+
+# Floor with dirt with an Elite Uruk
+F:u:88:5:866
+
+# Floor with dirt with an Ancient blue dragon
+F:L:88:5:601
+
+# Floor with dirt with an Ancient bronze dragon
+F:Z:88:5:602
+
+# Floor with dirt with an Ancient white dragon
+F:W:88:5:617
+
+# Floor with dirt with an Ancient green dragon
+F:G:88:5:618
+
+# Floor with dirt with an Ancient black dragon
+F:B:88:5:624
+
+# Floor with dirt with an Ancient red dragon
+F:R:88:5:644
+
+# Floor with dirt with an Ancient gold dragon
+F:O:88:5:645
+
+# Floor with dirt with a Lesser Balrog
+F:U:88:5:996:0:0:0:0:0:0:2
+
+# Granite wall
+F:#:56:5
+
+D:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+D:X##..#########...#........###..R.....###.e...{X
+D:X#.wt.######..O....#s..#..##w.#..###.....#.t..X
+D:X#wBLe.####.U.###....##.U.#...##..u####.#####.X
+D:X#eRe.####..#..######.B...w...#.U#uuu##.#U...eX
+D:X##...#...G###s...##....##..####..##uu#B..##..X
+D:X####...e...#####.t...####...####.###u#####.w#X
+D:X###....##.w.######.e.#..##...###..##uu#e...##X
+D:X##..W#####...###.....#...##.e####.L##...#####X
+D:X##...######e.##Z..w.###.......####.###t.#####X
+D:X....########s....#s...##R..#.U.##..####..####X
+D:Xs..####....##.tU####...#####t...#.######..###X
+D:X#...##..##..#..######.t..e..##.w...#####w.###X
+D:X##.....####s..######.e.#.#t...#.#U.####..####X
+D:X#...####uu##.t..#####...e####s#........w.####X
+D:X...####uou...##...#####.....###..#####...####X
+D:X..#####uu##...###s.##........##..#####..#####X
+D:X.o.#######...e.###.....o.###s.##..###s...#..#X
+D:X#s..o#......#s.......u...####..#s.##...o.G...X
+D:Xsss##o....u###....u..o.o.#####........###.OZ.X
+D:X<ss...###############...##################U.#X
+D:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
diff --git a/lib/mods/theme/edit/misc.txt b/lib/mods/theme/edit/misc.txt
new file mode 100644
index 00000000..2d380202
--- /dev/null
+++ b/lib/mods/theme/edit/misc.txt
@@ -0,0 +1,91 @@
+# File: misc.txt
+
+# Maximum number of towns
+M:T:100
+
+# Maximum number of non random towns(must be < 20)
+M:t:17
+
+# Maximum x size of the wilderness
+M:X:101
+
+# Maximum y size of the wilderness
+M:Y:66
+
+# Maximum number of randart parts in ra_info.txt
+M:Z:519
+
+# Maximum number of monsters in r_info.txt
+# WARNING ! add one more to the real count for the player ghost !!
+M:R:1081
+
+# Maximum number of monsters in re_info.txt
+# WARNING ! Use the exact amount of ego types used, if not you
+# will get weird results !
+M:r:14
+
+# Maximum number of items in k_info.txt
+M:K:886
+
+# Maximum number of vaults in v_info.txt
+M:V:108
+
+# Maximum number of terrain features in f_info.txt
+M:F:249
+
+# Maximum number of alchemist recipes
+M:a:1000
+
+# Maximum number of artifacts in a_info.txt
+M:A:257
+
+# Maximum number of sets types in set_info.txt
+M:s:17
+
+# Maximum number of ego-items in e_info.txt
+M:E:238
+
+# Maximum number of dungeon types in d_info.txt
+M:D:41
+
+# Maximum number of trap types in tr_info.txt
+M:U:176
+
+# Maximum number of terrain types in wf_info.txt
+M:W:64
+
+# Maximum number of owners types in ow_info.txt
+M:N:215
+
+# Maximum number of building actions in ba_info.txt
+M:B:70
+
+# Maximum number of store types in st_info.txt
+M:S:89
+
+# Maximum size for "o_list[]"
+M:O:1024
+
+# Maximum size for "m_list[]"
+M:M:768
+
+# Maximum number of race types in p_info.txt
+M:P:R:24
+
+# Maximum number of subrace types in p_info.txt
+M:P:S:26
+
+# Maximum number of class types in p_info.txt
+M:P:C:50
+
+# Maximum number of meta class types in p_info.txt
+M:P:M:1
+
+# Maximum number of histories types in p_info.txt
+M:P:H:294
+
+# Maximum number of skills in s_info.txt
+M:k:60
+
+# Maximum number of traits in ab_info.txt
+M:b:50
diff --git a/lib/mods/theme/edit/nirnaeth.map b/lib/mods/theme/edit/nirnaeth.map
new file mode 100644
index 00000000..a8c06999
--- /dev/null
+++ b/lib/mods/theme/edit/nirnaeth.map
@@ -0,0 +1,64 @@
+# Permanent wall
+F:X:63:3
+
+# up stairs
+F:<:6:3
+
+# Floor with dirt
+F:.:1:5
+
+# Dirt (no-tele)
+F:s:88:5
+
+# Shallow water
+F:V:84:5
+
+# Dirt with Olog
+F:a:88:5:538:0:0:0:0:0:0:2
+
+# Dirt with Cave Troll
+F:b:88:5:496:0:0:0:0:0:0:2
+
+# Dirt with with Eldrak
+F:c:88:1:620:0:0:0:0:0:0:2
+
+# Dirt with with Ettin
+F:e:88:1:621:0:0:0:0:0:0:2
+
+# Dirt with with War troll
+F:f:88:1:631:0:0:0:0:0:0:2
+
+# Dirt with with Hru
+F:g:88:1:709:0:0:0:0:0:0:2
+
+# Dirt with Ulik the Troll
+F:h:88:5:729:0:0:0:0:0:0:2
+
+# Dirt with Ancient green dragon
+F:i:88:5:618:0:0:0:0:0:0:2
+
+# Dungeon
+D:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+D:X...a.bab....f.....f.XXXXXXXXXXX
+D:X..ab...b..ff..aa..b..XXXXXXXXXX
+D:X.aa..b..fff...a..g.f.b.XXXXXXXX
+D:Xab.....b....f.......f..bf..XXXX
+D:X..b.f......ff.f..aa...f..b.XXXX
+D:X...ff..f..ff.c.a..f.g.a..fXXXXX
+D:Xb.f....fff.ff...aaa....f..XXXXX
+D:X...ff...ff...f......aa..a..XXXX
+D:Xb.ff.a...f...bbb..a..aa.....XXX
+D:X.f.a...a....bbebb......f.fa.XXX
+D:X.....a.....bbecebb..g.a.a....XX
+D:X.a.a....aa.beccceb....f.a..c.XX
+D:X......a..f.bbecebba.f....ea...X
+D:XX.b.aa.f..f.bbebb...a.aa...g.aX
+D:XX..bb...a..f.bbb..a..a..aae..iX
+D:XXX....aa.aa.f...aa...e..b..h..X
+D:XXXXXX........bb...g....aa...gcX
+D:XXXXXXXX.g..aa...a...a.e...ac.<X
+D:XXXXXXXX........bb....e.c.i.e.iX
+D:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+
+# Starting position
+P:3:3
diff --git a/lib/mods/theme/edit/numenor.txt b/lib/mods/theme/edit/numenor.txt
new file mode 100644
index 00000000..ec8621b1
--- /dev/null
+++ b/lib/mods/theme/edit/numenor.txt
@@ -0,0 +1,80 @@
+# File: numenor.txt
+
+# Way to the lost land of Numenor
+F:>:7:3:0:0:0:0:0:7
+
+############### Town Layout ###############
+
+D:######################################################################################################################################################################################################
+D:#WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW>VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV#
+D:#WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:######################################################################################################################################################################################################
+
+
+############### Starting positions ###############
+
+# Standard starting position for normal races
+?:[EQU $LEAVING_QUEST 0]
+P:46:128
diff --git a/lib/mods/theme/edit/ow_info.txt b/lib/mods/theme/edit/ow_info.txt
new file mode 100644
index 00000000..bf1283fb
--- /dev/null
+++ b/lib/mods/theme/edit/ow_info.txt
@@ -0,0 +1,1419 @@
+# File: ow_info.txt
+
+
+# This file is used to initialize the "lib/raw/ow_info.raw" file, which is
+# used to initialize the "owner info type" information for the Angband game.
+
+# Do not modify this file unless you know exactly what you are doing,
+# unless you wish to risk possible system crashes and broken savefiles.
+
+# N:<index>:<name>
+# I:<max_cost>:<max_inflate>:<min_inflate>:<haggle_per>:<insult_max>
+# C:<hated cost>:<normal cost>:<liked cost>
+# L:liked races
+# H:hated races
+
+# Version stamp (required)
+
+V:2.0.0
+
+# The zero index owner. If she owns a shop, there is a problem. :P
+N:0:Bell Goodchild(Hobbit)
+I:20000:170:108:5:15
+C:120:100:80
+L:Elf | Half-Elf | High-Elf | Dunadan | Hobbit | Dwarf | RohanKnight
+H:Dragon | Demon | Orc | Troll | Half-Ogre | Beorning | Druadan | Dark-Elf
+
+### The General Store - 1 ###
+
+N:1:Balin(Dwarf)
+I:25000:180:108:2:2
+C:150:100:50
+L:Dwarf | Petty-Dwarf
+H:Dragon | Demon | Orc | Dark-Elf | Half-Ogre | Troll
+
+N:2:Berylla Boffin(Hobbit)
+I:20000:190:109:3:4
+C:125:100:70
+L:Human | Hobbit
+H:Dragon | Demon | Beorning | Orc | Half-Ogre | Troll | Easterling
+
+N:3:Adrahil(Half-Elf)
+I:30000:170:107:1:1
+C:110:100:80
+L:Half-Elf | High-Elf | Dunadan | Elf
+H:Dragon | Demon | Orc | Dark-Elf | Half-Ogre | Petty-Dwarf | Dwarf | Troll
+
+N:4:Aegnor(Wood-Elf)
+I:10000:200:110:4:8
+C:110:100:80
+L:High-Elf | Dunadan | Elf
+H:Dragon | Demon | Orc | Half-Ogre | Troll | Easterling
+
+### The Armoury - 2 ###
+
+N:5:Bifur(Dwarf)
+I:20000:190:109:3:4
+C:125:100:70
+L:Hobbit | Petty-Dwarf | Dwarf
+H:Dragon | Demon | Beorning | Orc | Half-Ogre | Troll
+
+N:6:Lalia Clayhanger(Hobbit)
+I:25000:180:108:2:2
+C:125:100:50
+L:Human | Hobbit | Elf
+H:Dragon | Demon | Beorning | Orc | Half-Ogre | Troll
+
+N:7:Alcarin(Human)
+I:10000:200:110:4:8
+C:110:100:80
+L:Human | Half-Elf | RohanKnight | Dunadan
+H:Dragon | Demon | Beorning | Orc | Half-Ogre | Petty-Dwarf | Troll | Easterling
+
+N:8:Alatariel(High-Elf)
+I:30000:170:107:1:1
+C:110:100:80
+L:High-Elf | Dunadan | Elf
+H:Dragon | Demon | Orc | Dark-Elf | Half-Ogre | Petty-Dwarf | Troll | Easterling
+
+### The Weaponsmith - 3 ###
+
+N:9:Bofur(Dwarf)
+I:30000:170:107:1:1
+C:125:100:70
+L:Human | Dwarf
+H:Dragon | Demon | Beorning | Orc | Half-Ogre | Troll
+
+N:10:Daisy Gamgee(Hobbit)
+I:20000:190:109:3:4
+C:110:100:80
+L:Human | Hobbit
+H:Dragon | Demon | Beorning | Orc | Half-Ogre | Troll
+
+N:11:Beregond(Dunadan)
+I:25000:180:108:2:2
+C:110:100:80
+L:Human | High-Elf | Dunadan | Elf
+H:Dragon | Demon | Orc | Half-Ogre | Troll
+
+N:12:Amarie(Dark-Elf)
+I:10000:200:110:4:8
+C:125:100:50
+L:Dark-Elf | Elf
+H:Dragon | Demon | Orc | Half-Ogre | Petty-Dwarf | Dwarf | Troll | Easterling
+
+### The Temple - 4 ###
+
+N:13:Bombur(Dwarf)
+I:20000:190:109:3:4
+C:125:100:70
+L:Half-Elf | Petty-Dwarf | Dwarf
+H:Dragon | Demon | Beorning | Orc | Half-Ogre | Troll
+
+N:14:Dora Baggins(Hobbit)
+I:30000:170:107:1:1
+C:110:100:80
+L:Human | High-Elf | Hobbit | Elf
+H:Dragon | Demon | Beorning | Orc | Half-Ogre | Troll
+
+N:15:Bergil(Half-Elf)
+I:10000:200:110:4:8
+C:125:100:50
+L:Human | Half-Elf | Dunadan | Elf
+H:Dragon | Demon | Beorning | Orc | Dark-Elf | Half-Ogre | Troll | Easterling
+
+N:16:Amdir(Wood-Elf)
+I:25000:180:108:2:2
+C:110:100:80
+L:High-Elf | Dunadan | Hobbit | Elf
+H:Dragon | Demon | Orc | Dark-Elf | Half-Ogre | Dwarf | Troll | Easterling
+
+### The Alchemist - 5 ###
+
+N:17:Borin(Dwarf)
+I:20000:190:109:3:4
+C:110:100:80
+L:Petty-Dwarf | Dwarf
+H:Dragon | Demon | Orc | Dark-Elf | Half-Ogre | Elf | Troll
+
+N:18:Elfstan Fairbairn(Hobbit)
+I:10000:200:110:4:8
+C:125:100:50
+L:Human | Half-Elf | High-Elf | Hobbit | Elf
+H:Dragon | Demon | Beorning | Orc | Half-Ogre | Dwarf | Troll
+
+N:19:Cemendur(Human)
+I:25000:180:108:2:2
+C:110:100:80
+L:Human | Half-Elf | RohanKnight | Dunadan | Elf
+H:Dragon | Demon | Beorning | Orc | Dark-Elf | Half-Ogre | Troll | Easterling
+
+N:20:Annael(High-Elf)
+I:30000:170:107:1:1
+C:125:100:70
+L:Human | Half-Elf | High-Elf | Dunadan | Elf
+H:Dragon | Demon | Beorning | Orc | Dark-Elf | Half-Ogre | Dwarf | Troll
+
+### The Magic Shop - 6 ###
+
+N:21:Dis(Dwarf)
+I:30000:170:107:1:1
+C:125:100:50
+L:Petty-Dwarf | Dwarf | Half-Elf | Dunadan
+H:Dragon | Demon | Beorning | Orc | Dark-Elf | Half-Ogre | Human | Troll | Eagle
+
+N:22:Folco Boffin(Hobbit)
+I:10000:200:110:4:8
+C:110:100:80
+L:Hobbit
+H:Dragon | Demon | Orc | Troll
+
+N:23:Ciryon(Dunadan)
+I:25000:180:108:2:2
+C:110:100:80
+L:Human | Half-Elf | High-Elf | RohanKnight | Dunadan | Hobbit | Elf
+H:Dragon | Demon | Orc | Half-Ogre | Troll
+
+N:24:Arminas(Dark-Elf)
+I:20000:190:109:3:4
+C:125:100:70
+L:Human | Dark-Elf | Elf
+H:Dragon | Demon | Beorning | Orc | High-Elf | Half-Ogre | Petty-Dwarf | Troll | Easterling
+
+### The Black Market - 7 ###
+
+N:25:Dori(Dwarf)
+I:30000:210:120:8:8
+C:110:100:90
+L:Dwarf | Easterling
+H:Dragon | Demon | Orc
+
+N:26:Halfred Greenhand(Hobbit)
+I:30000:210:120:8:8
+C:110:100:90
+L:Hobbit
+H:Dragon | Demon | Troll
+
+N:27:Deorwine(Half-Elf)
+I:30000:210:120:8:8
+C:110:100:90
+L:Half-Elf | Easterling
+H:Dragon | Demon | Dark-Elf
+
+N:28:Artanis(Wood-Elf)
+I:30000:210:120:8:8
+C:110:100:90
+L:High-Elf | Elf | Easterling
+H:Dragon | Demon | Orc | Troll
+
+### The Bookstore - 9 ###
+
+N:29:Dwalin(Dwarf)
+I:20000:190:109:3:4
+C:125:100:70
+L:Human | Petty-Dwarf | Dwarf
+H:Dragon | Demon | Orc | Elf | Half-Ogre | Troll
+
+N:30:Tanta Hornblower(Hobbit)
+I:10000:200:110:4:8
+C:110:100:80
+L:Human | Hobbit | Elf
+H:Dragon | Demon | Beorning | Orc | Troll
+
+N:31:Dorlas(Human)
+I:30000:170:107:1:1
+C:150:100:50
+L:Human | RohanKnight | Dunadan
+H:Dragon | Demon | Beorning | Orc | Half-Ogre | Troll | Easterling
+
+N:32:Caranthir(High-Elf)
+I:25000:180:108:2:2
+C:110:100:80
+L:Half-Elf | High-Elf | Elf
+H:Dragon | Demon | Orc | Dark-Elf | Half-Ogre | Petty-Dwarf | Dwarf | Troll | Easterling
+
+### The Pet Shop - 0 ###
+
+N:33:Fili(Dwarf)
+I:20000:190:109:3:4
+C:125:100:70
+L:RohanKnight | Petty-Dwarf | Dwarf
+H:Dragon | Demon | Beorning | Orc | Half-Ogre | Troll
+
+N:34:Lalia Clayhanger(Hobbit)
+I:25000:180:108:2:2
+C:110:100:80
+L:Human | Hobbit | Elf
+H:Dragon | Demon | Beorning | Orc | Troll
+
+N:35:Elfwine(Dunadan)
+I:10000:200:110:4:8
+C:110:100:80
+L:Human | Half-Elf | High-Elf | RohanKnight | Dunadan | Elf
+H:Dragon | Demon | Beorning | Orc | Dark-Elf | Half-Ogre | Petty-Dwarf | Troll
+
+N:36:Edrahil(Dark-Elf)
+I:30000:170:107:1:1
+C:150:100:50
+L:Dark-Elf | Elf | Easterling
+H:Dragon | Demon | Orc | High-Elf | Half-Ogre | Dwarf | Troll
+
+### The Mayors/Kings/Rulers ###
+
+#Bree
+N:37:Uldrik(Human)
+I:0:0:0:0:0
+C:0:0:0
+L:Human | RohanKnight | Dunadan | Hobbit |
+H:Dragon | Demon | Orc | Half-Ogre | Troll
+
+#Minas Anor
+N:38:Aragorn (Dunadan)
+I:0:0:0:0:0
+C:0:0:0
+L:Human | High-Elf | RohanKnight | Dunadan | Hobbit | Elf
+H:Dragon | Demon | Orc | Half-Ogre | Petty-Dwarf | Troll
+
+#Khazad-Dum
+N:39:Gimli(Dwarf)
+I:0:0:0:0:0
+C:0:0:0
+L:RohanKnight | Dunadan | Hobbit | Elf | Dwarf
+H:Dragon | Demon | Orc | Half-Ogre | Troll
+
+#Beorn's Halls
+N:40:Deor(Beorning)
+I:100:100:100:0:0
+C:110:100:90
+L:Beorning | Dwarf | Maia | Hobbit | Ent
+H:Dragon | Demon | Orc | Half-Ogre | Troll
+
+#Dale
+N:41:Bard the Grim(Human)
+I:100:100:100:0:0
+C:110:100:90
+L:Human | Hobbit | Dwarf
+H:Dragon | Demon | Beorning | Orc | Half-Ogre | Troll
+
+#Henneth Annun
+N:42:Halbarad(Dunadan)
+I:100:100:100:0:0
+C:110:100:90
+L:Human | High-Elf | Dunadan | Hobbit | Elf
+H:Dragon | Demon | Orc | Half-Ogre | Troll
+
+#Imladris
+N:43:Elrond Half-Elven
+I:100:100:100:0:0
+C:110:100:90
+L:Human | Half-Elf | High-Elf | RohanKnight | Dunadan | Hobbit | Elf | Dwarf | Ent
+H:Dragon | Demon | Orc | Half-Ogre | Troll
+
+#Helm's Deep
+N:44:Erkenbrand(RohanKnight)
+I:100:100:100:0:0
+C:110:100:90
+L:Human | Maia | RohanKnight | Dunadan | Hobbit | Elf | Dwarf | Ent
+H:Dragon | Demon | Beorning | Orc | Dark-Elf | Half-Ogre | Petty-Dwarf | Troll
+
+#Thranduil's Halls
+N:45:Legolas Greenleaf(Wood-Elf)
+I:100:100:100:0:0
+C:110:100:90
+L:High-Elf | Dunadan | Ent | Elf
+H:Dragon | Demon | Orc | Half-Ogre | Petty-Dwarf | Troll
+
+#Edoras
+N:46:Theoden(RohanKnight)
+I:100:100:100:0:0
+C:110:100:90
+L:Human | RohanKnight | Dunadan | Hobbit | Elf
+H:Dragon | Demon | Orc | Half-Ogre | Troll
+
+#Esgaroth
+N:47:The Master(Human)
+I:100:100:100:0:0
+C:110:100:90
+L:Human
+H:Dragon | Demon | Beorning | Orc | Dark-Elf | Half-Ogre | Troll
+
+#Hobbiton
+N:48:Samwise Gamgee(Hobbit)
+I:100:100:100:0:0
+C:110:100:90
+L:Hobbit | Elf | High-Elf | Dark-Elf
+H:Dragon | Demon | Orc | Half-Ogre | Troll
+
+#Osgiliath
+N:49:Eldacar(Human)
+I:100:100:100:0:0
+C:110:100:90
+L:Human | Half-Elf | High-Elf | RohanKnight | Dunadan | Hobbit | Elf
+H:Dragon | Demon | Beorning | Orc | Dark-Elf | Half-Ogre | Petty-Dwarf | Dwarf | Troll
+
+#Pelargir
+N:50:Earnil(Dunadan)
+I:100:100:100:0:0
+C:110:100:90
+L:Human | Half-Elf | High-Elf | RohanKnight | Dunadan | Hobbit | Elf
+H:Dragon | Demon | Beorning | Orc | Dark-Elf | Half-Ogre | Petty-Dwarf | Dwarf | Troll
+
+### Caras Galadhon owners ###
+
+N:51:Galadriel(High-Elf)
+I:15000:120:105:6:16
+C:120:100:80
+L:High-Elf | Half-Elf | Elf
+H:Dragon | Demon | Orc | Troll | Half-Ogre | Beorning
+
+N:52:Celeborn(High-Elf)
+I:15000:120:105:6:16
+C:120:100:80
+L:High-Elf | Half-Elf | Elf
+H:Dragon | Demon | Orc | Troll | Half-Ogre | Beorning
+
+N:53:Aulendil(Elf)
+I:30000:140:105:6:12
+C:120:100:80
+#L:Warrior |
+H:Dragon | Demon | Orc | Troll | Half-Ogre | Beorning
+
+N:54:Valceronwe(Elf)
+I:30000:140:105:6:12
+C:120:100:80
+#L:Mage | Thaumaturgist | Sorceror
+H:Dragon | Demon | Orc | Troll | Half-Ogre | Beorning
+
+N:55:Voronwe(Elf)
+I:30000:140:105:6:12
+C:120:100:80
+#L:Priest | Paladin
+H:Dragon | Demon | Orc | Troll | Half-Ogre | Beorning
+
+N:56:Celegail(Elf)
+I:30000:140:105:6:12
+C:120:100:80
+#L:Ranger
+H:Dragon | Demon | Orc | Troll | Half-Ogre | Beorning
+
+### Gondolin owners ###
+
+N:57:Turgon(High-Elf)
+I:30000:120:105:6:16
+C:120:100:80
+L:High-Elf | Half-Elf | Elf
+H:Dragon | Demon | Orc | Troll | Half-Ogre | Beorning | Easterling
+
+N:58:Pengolodh(High-Elf)
+I:0:120:105:6:16
+C:120:100:80
+L:High-Elf | Half-Elf | Elf
+H:Dragon | Demon | Orc | Troll | Half-Ogre | Beorning | Easterling
+
+N:59:Aerandir(High-Elf)
+I:0:120:105:6:16
+C:120:100:80
+L:High-Elf | Half-Elf | Elf
+H:Dragon | Demon | Orc | Troll | Half-Ogre | Beorning | Easterling
+
+N:60:Celebrimbor(High-Elf)
+I:0:120:105:6:16
+C:120:100:80
+L:High-Elf | Half-Elf | Elf
+#L:Warrior |
+H:Dragon | Demon | Orc | Troll | Half-Ogre | Beorning | Easterling
+
+N:61:Lomelosse(High-Elf)
+I:0:120:105:6:16
+C:120:100:80
+L:High-Elf | Half-Elf | Elf |
+H:Dragon | Demon | Orc | Troll | Half-Ogre | Beorning | Easterling
+
+N:62:Arlindel(High-Elf)
+I:0:120:105:6:16
+C:120:100:80
+L:High-Elf | Half-Elf | Elf
+#L:Harper | Ranger
+H:Dragon | Demon | Orc | Troll | Half-Ogre | Beorning | Easterling
+
+N:63:Sulraen(High-Elf)
+I:0:120:105:6:16
+C:120:100:80
+L:High-Elf | Half-Elf | Elf
+#L:Mage | Sorceror
+H:Dragon | Demon | Orc | Troll | Half-Ogre | Beorning | Easterling
+
+N:64:Firiel(High-Elf)
+I:0:120:105:6:16
+C:120:100:80
+L:High-Elf | Half-Elf | Elf |
+H:Dragon | Demon | Orc | Troll | Half-Ogre | Beorning | Easterling
+
+N:65:Earendur(High-Elf)
+I:0:120:105:6:16
+C:120:100:80
+L:High-Elf | Half-Elf | Elf
+H:Dragon | Demon | Orc | Troll | Half-Ogre | Beorning | Easterling
+
+N:66:Glorfindel(High-Elf)
+I:0:120:105:6:16
+C:120:100:80
+L:High-Elf | Half-Elf
+#L:Ranger
+H:Dragon | Demon | Orc | Troll | Half-Ogre | Beorning | Easterling
+
+N:67:Ecthelion(High-Elf)
+I:0:120:105:6:16
+C:120:100:80
+L:High-Elf | Half-Elf
+#L:Paladin
+H:Dragon | Demon | Orc | Troll | Half-Ogre | Beorning | Easterling
+
+### The Inn-Keepers (minus Gondolin) ###
+
+#Bree
+N:68:Barliman Butterbur(Human)
+I:100:170:108:4:10
+C:120:100:80
+L:Dunadan | Hobbit | Human |
+H:Dragon | Demon | Orc | Troll | Half-Ogre | Beorning | Easterling
+
+#Pelargir
+N:69:Ciryatur(Dunadan)
+I:100:170:108:4:10
+C:110:100:80
+L:Dunadan | Human | RohanKnight
+H:Dragon | Demon | Orc | Troll | Half-Ogre | Beorning
+
+#Caras Galadhon
+N:70:Celebor(Elf)
+I:100:170:108:4:10
+C:110:100:80
+L:High-Elf | Elf
+H:Dragon | Demon | Beorning | Orc | Half-Ogre | Troll | Easterling
+
+#Minas Anor
+N:71:Bregolas(Human)
+I:100:170:108:4:10
+C:110:100:80
+L:Human | RohanKnight | Dunadan
+H:Dragon | Demon | Beorning | Orc | Half-Ogre | Troll | Easterling
+
+#Khazad-Dum
+N:72:Thror(Dwarf)
+I:100:170:108:4:10
+C:110:100:80
+L:Petty-Dwarf | Dwarf
+H:Dragon | Demon | Beorning | Orc | Dark-Elf | Half-Ogre | High-Elf | Troll
+
+#Dale
+N:73:Troin(Dwarf)
+I:100:170:108:4:10
+C:110:100:80
+L:Human | Dwarf
+H:Dragon | Demon | Orc | Half-Ogre | Troll
+
+#Edoras
+N:74:Theodwyn(Shieldmaiden)
+I:100:170:108:4:10
+C:110:100:80
+L:Human | RohanKnight | Dunadan
+H:Dragon | Demon | Beorning | Orc | Half-Ogre | Troll | Easterling
+
+#Esgaroth
+N:75:Garm(Human)
+I:100:170:108:4:10
+C:110:100:80
+L:Human | Dwarf
+H:Dragon | Demon | Beorning | Orc | Half-Ogre | Petty-Dwarf | Troll
+
+#Hobbiton
+N:76:Rose Cotton(Hobbit)
+I:100:170:108:4:10
+C:110:100:80
+L:Human | High-Elf | Hobbit
+H:Dragon | Demon | Orc | Half-Ogre | Troll | Easterling
+
+#Osgiliath
+N:77:Palantir(Human)
+I:100:170:108:4:10
+C:110:100:80
+L:Human | High-Elf | RohanKnight | Dunadan | Elf
+H:Dragon | Demon | Beorning | Orc | Half-Ogre | Troll | Easterling
+
+### The Soothsayers ###
+
+N:78:Ori(Dwarf)
+I:20000:190:109:3:4
+C:125:100:70
+L:Hobbit | Petty-Dwarf | Dwarf
+H:Dragon | Demon | Beorning | Orc | Half-Ogre | Troll
+
+N:79:Tolman Gardner(Hobbit)
+I:25000:180:108:2:2
+C:150:100:50
+L:Human | Hobbit | Elf
+H:Dragon | Demon | Beorning | Orc | Half-Ogre | Troll
+
+N:80:Inziladun(Human)
+I:10000:200:110:4:8
+C:110:100:80
+L:Human | Half-Elf | RohanKnight | Dunadan | Easterling
+H:Dragon | Demon | Beorning | Orc | Half-Ogre | Petty-Dwarf | Troll
+
+N:81:Gelmir(High-Elf)
+I:30000:170:107:1:1
+C:110:100:80
+L:High-Elf | Dunadan | Elf
+H:Dragon | Demon | Orc | Dark-Elf | Half-Ogre | Petty-Dwarf | Troll
+
+### The Eagles ###
+
+N:82:Palano(Eagle)
+I:30000:170:110:1:1
+C:125:100:50
+L:Eagle
+H:Dragon | Demon | RohanKnight
+
+N:83:Eglad(Eagle)
+I:30000:170:110:1:1
+C:125:100:50
+L:Eagle
+H:Dragon | Demon | Hobbit
+
+N:84:Hiron(Eagle)
+I:30000:170:110:1:1
+C:125:100:50
+L:Eagle
+H:Dragon | Demon | Dunadan
+
+N:85:Grada(Eagle)
+I:30000:170:110:1:1
+C:125:100:50
+L:Eagle
+H:Dragon | Demon | High-Elf
+
+### The Librarians ###
+
+N:86:Frerin(Dwarf)
+I:25000:180:108:2:2
+C:150:100:50
+L:Dwarf | Petty-Dwarf
+H:Dragon | Demon | Orc | Dark-Elf | Half-Ogre | Troll
+
+N:87:Malva Headstrong(Hobbit)
+I:20000:190:109:3:4
+C:125:100:70
+L:Human | Hobbit
+H:Dragon | Demon | Beorning | Orc | Half-Ogre | Troll
+
+N:88:Erendis(Half-Elf)
+I:30000:170:107:1:1
+C:110:100:80
+L:Half-Elf | High-Elf | Dunadan | Elf | Easterling
+H:Dragon | Demon | Orc | Dark-Elf | Half-Ogre | Petty-Dwarf | Dwarf | Troll
+
+N:89:Elemmakil(Wood-Elf)
+I:10000:200:110:4:8
+C:110:100:80
+L:High-Elf | Dunadan | Elf
+H:Dragon | Demon | Orc | Half-Ogre | Troll
+
+### The Casino Owners ###
+
+N:90:Fror(Dwarf)
+I:20000:190:109:3:4
+C:125:100:70
+L:Hobbit | Petty-Dwarf | Dwarf
+H:Dragon | Demon | Beorning | Orc | Half-Ogre | Troll
+
+N:91:Marmadas Brandybuck(Hobbit)
+I:25000:180:108:2:2
+C:150:100:50
+L:Human | Hobbit | Elf
+H:Dragon | Demon | Beorning | Orc | Half-Ogre | Troll
+
+N:92:Fastred(Human)
+I:10000:200:110:4:8
+C:110:100:80
+L:Human | Half-Elf | RohanKnight | Dunadan | Easterling
+H:Dragon | Demon | Beorning | Orc | Half-Ogre | Petty-Dwarf | Troll
+
+N:93:Elured(High-Elf)
+I:30000:170:107:1:1
+C:110:100:80
+L:High-Elf | Dunadan | Elf
+H:Dragon | Demon | Orc | Dark-Elf | Half-Ogre | Petty-Dwarf | Troll
+
+### The Beastmasters ###
+
+N:94:Gloin(Dwarf)
+I:30000:170:107:1:1
+C:125:100:70
+L:Human | Dwarf
+H:Dragon | Demon | Beorning | Orc | Half-Ogre | Troll
+
+N:95:Milo Burrows(Hobbit)
+I:20000:190:109:3:4
+C:110:100:80
+L:Human | Hobbit
+H:Dragon | Demon | Beorning | Orc | Half-Ogre | Troll
+
+N:96:Findegil(Dunadan)
+I:25000:180:108:2:2
+C:110:100:80
+L:Human | High-Elf | Dunadan | Elf
+H:Dragon | Demon | Orc | Half-Ogre | Troll
+
+N:97:Elurin(Dark-Elf)
+I:10000:200:110:4:8
+C:150:100:50
+L:Dark-Elf | Elf | Easterling
+H:Dragon | Demon | Orc | Half-Ogre | Petty-Dwarf | Dwarf | Troll
+
+### Gondor/Rohan owners ###
+
+#Fighters Hall
+
+N:98:Tarcil(Human)
+I:30000:170:107:1:1
+C:150:100:50
+L:Human | RohanKnight | Dunadan
+H:Dragon | Demon | Orc | Half-Ogre | Troll | Easterling
+
+N:99:Ulbar(Easterling)
+I:10000:200:110:4:8
+C:110:100:80
+L:Human | RohanKnight | Dunadan
+L:Half-Elf | High-Elf | Elf | Easterling
+
+N:100:Brego(RohanKnight)
+I:25000:180:108:2:2
+C:110:100:80
+L:Human | RohanKnight | Dunadan
+H:Dragon | Demon | Beorning | Dark-Elf | Petty-Dwarf | Troll | Easterling
+
+N:101:Ostoher(Dunadan)
+I:20000:190:109:3:4
+C:125:100:70
+L:Human | RohanKnight | Dunadan
+H:Dragon | Demon | Beorning | Orc | Half-Ogre | Dwarf | Troll | Easterling
+
+#Tower of Magery
+
+N:102:Arveleg(Human)
+I:25000:180:108:2:2
+C:125:100:70
+L:Human | RohanKnight | Dunadan
+H:Dragon | Demon | Orc | Half-Ogre | Troll | Easterling
+
+N:103:Uldar(Easterling)
+I:30000:170:107:1:1
+C:110:100:80
+L:Human | RohanKnight | Dunadan | Easterling
+L:Half-Elf | High-Elf | Elf
+
+N:104:Aldor(RohanKnight)
+I:20000:190:109:3:4
+C:150:100:50
+L:Human | RohanKnight | Dunadan
+H:Dragon | Demon | Beorning | Dark-Elf | Petty-Dwarf | Troll | Easterling
+
+N:105:Tarannon(Dunadan)
+I:10000:200:110:4:8
+C:110:100:80
+L:Human | RohanKnight | Dunadan
+H:Dragon | Demon | Beorning | Orc | Half-Ogre | Dwarf | Troll | Easterling
+
+#Inner Temple
+
+N:106:Eradan(Human)
+I:30000:170:107:1:1
+C:125:100:70
+L:Human | RohanKnight | Dunadan
+H:Dragon | Demon | Orc | Half-Ogre | Troll
+
+N:107:Ulwise(Easterling)
+I:25000:180:108:2:2
+C:150:100:50
+L:Human | RohanKnight | Dunadan | Easterling
+L:Half-Elf | High-Elf | Elf
+
+N:108:Gram(RohanKnight)
+I:20000:190:109:3:4
+C:110:100:80
+L:Human | RohanKnight | Dunadan
+H:Dragon | Demon | Beorning | Dark-Elf | Petty-Dwarf | Troll | Easterling
+
+N:109:Minalcar(Dunadan)
+I:10000:200:110:4:8
+C:110:100:80
+L:Human | RohanKnight | Dunadan
+H:Dragon | Demon | Beorning | Orc | Half-Ogre | Dwarf | Troll
+
+#Paladins Guild
+
+N:110:Herion(Human)
+I:30000:170:107:1:1
+C:150:100:50
+L:Human | RohanKnight | Dunadan | Easterling
+H:Dragon | Demon | Orc | Half-Ogre | Troll
+
+N:111:Ulgug(Easterling)
+I:10000:200:110:4:8
+C:110:100:80
+L:Human | RohanKnight | Dunadan | Easterling
+L:Half-Elf | High-Elf | Elf
+
+N:112:Walda(RohanKnight)
+I:25000:180:108:2:2
+C:110:100:80
+L:Human | RohanKnight | Dunadan
+H:Dragon | Demon | Beorning | Dark-Elf | Petty-Dwarf | Troll | Easterling
+
+N:113:Calimehtar(Dunadan)
+I:20000:190:109:3:4
+C:125:100:70
+L:Human | RohanKnight | Dunadan
+H:Dragon | Demon | Beorning | Orc | Half-Ogre | Dwarf | Troll | Easterling
+
+#Rangers Guild
+
+N:114:Egalmoth(Human)
+I:25000:180:108:2:2
+C:125:100:70
+L:Human | RohanKnight | Dunadan
+H:Dragon | Demon | Orc | Half-Ogre | Troll | Easterling
+
+N:115:Ulaf(Easterling)
+I:30000:170:107:1:1
+C:110:100:80
+L:Human | RohanKnight | Dunadan | Easterling
+L:Half-Elf | High-Elf | Elf
+
+N:116:Fengel(RohanKnight)
+I:20000:190:109:3:4
+C:150:100:50
+L:Human | RohanKnight | Dunadan
+H:Dragon | Demon | Beorning | Dark-Elf | Petty-Dwarf | Troll | Easterling
+
+N:117:Telemnar(Dunadan)
+I:10000:200:110:4:8
+C:110:100:80
+L:Human | RohanKnight | Dunadan
+H:Dragon | Demon | Beorning | Orc | Half-Ogre | Dwarf | Troll
+
+### Dungeon Markets ###
+
+### The Axesmiths ###
+
+N:118:Ris(Dwarf)
+I:30000:200:130:1:1
+C:150:100:50
+L:Dwarf
+H:Dragon | Demon | Orc
+
+N:119:Malach Aradan(Human)
+I:25000:300:150:2:2
+C:125:100:60
+L:Human | Easterling
+H:Dragon | Demon | Troll
+
+N:120:Indis(Half-Elf)
+I:20000:250:140:3:4
+C:115:100:70
+L:Half-Elf | Easterling
+H:Dragon | Demon | Half-Ogre
+
+N:121:Rogdug(Half-Orc)
+I:10000:150:120:4:8
+C:125:100:80
+L:Orc | Easterling
+H:Dragon | Demon | Elf
+
+### The Haftedsmiths ###
+
+N:122:Sogur(Dwarf)
+I:20000:250:140:3:4
+C:125:100:80
+L:Dwarf
+H:Dragon | Demon | Orc
+
+N:123:Manwendil(Human)
+I:25000:300:150:2:2
+C:115:100:70
+L:Human | Easterling
+H:Dragon | Demon | Troll
+
+N:124:Lenwe(Half-Elf)
+I:10000:150:120:4:8
+C:150:100:50
+L:Half-Elf | Easterling
+H:Dragon | Demon | Half-Ogre
+
+N:125:Ghaz(Half-Orc)
+I:30000:200:130:1:1
+C:125:100:60
+L:Orc | Easterling
+H:Dragon | Demon | Elf
+
+### The Polearmsmiths ###
+
+N:126:Tolin(Dwarf)
+I:10000:150:120:4:8
+C:115:100:70
+L:Dwarf
+H:Dragon | Demon | Orc
+
+N:127:Narmacil(Human)
+I:25000:300:150:2:2
+C:125:100:80
+L:Human | Easterling
+H:Dragon | Demon | Troll
+
+N:128:Lindir(Half-Elf)
+I:20000:250:140:3:4
+C:150:100:50
+L:Half-Elf | Easterling
+H:Dragon | Demon | Half-Ogre
+
+N:129:Stogash(Half-Orc)
+I:30000:200:130:1:1
+C:125:100:60
+L:Orc | Easterling
+H:Dragon | Demon | Elf
+
+### The Swordsmiths ###
+
+N:130:Tis(Dwarf)
+I:20000:250:140:3:4
+C:125:100:80
+L:Dwarf
+H:Dragon | Demon | Orc
+
+N:131:Nuneth(Human)
+I:10000:150:120:4:8
+C:125:100:60
+L:Human | Easterling
+H:Dragon | Demon | Troll
+
+N:132:Mahtan(Half-Elf)
+I:30000:200:130:1:1
+C:115:100:70
+L:Half-Elf | Easterling
+H:Dragon | Demon | Half-Ogre
+
+N:133:Rudak(Half-Orc)
+I:25000:300:150:2:2
+C:150:100:50
+L:Orc | Easterling
+H:Dragon | Demon | Elf
+
+### The Rare Jewellers ###
+
+N:134:Uin(Dwarf)
+I:25000:300:150:2:2
+C:115:100:70
+L:Dwarf
+H:Dragon | Demon | Orc
+
+N:135:Ornendil(Human)
+I:10000:150:120:4:8
+C:125:100:60
+L:Human | Easterling
+H:Dragon | Demon | Troll
+
+N:136:Malgalad(Half-Elf)
+I:30000:200:130:1:1
+C:125:100:80
+L:Half-Elf | Easterling
+H:Dragon | Demon | Half-Ogre
+
+N:137:Ghashuf(Half-Orc)
+I:20000:250:140:3:4
+C:150:100:50
+L:Orc | Easterling
+H:Dragon | Demon | Elf
+
+### The Jewellers ###
+
+N:138:Vali(Dwarf)
+I:25000:300:150:2:2
+C:150:100:50
+L:Dwarf
+H:Dragon | Demon | Orc
+
+N:139:Orodreth(Human)
+I:30000:200:130:1:1
+C:115:100:70
+L:Human | Easterling
+H:Dragon | Demon | Troll
+
+N:140:Theodred(Half-Elf)
+I:10000:150:120:4:8
+C:125:100:80
+L:Half-Elf | Easterling
+H:Dragon | Demon | Half-Ogre
+
+N:141:Rangush(Half-Orc)
+I:20000:250:140:3:4
+C:125:100:60
+L:Orc | Easterling
+H:Dragon | Demon | Elf
+
+### The Footwear Shop owners ###
+
+N:142:Nellas(Human)
+I:10000:150:120:4:8
+C:115:100:70
+L:Human | Easterling
+H:Dragon | Demon | Troll
+
+N:143:Tindomiel(Half-Elf)
+I:25000:300:150:2:2
+C:125:100:80
+L:Half-Elf | Easterling
+H:Dragon | Demon | Half-Ogre
+
+N:144:Ragnor(Half-Elf)
+I:20000:250:140:3:4
+C:150:100:50
+L:Half-Elf | Easterling
+H:Dragon | Demon | Half-Ogre
+
+N:145:Idrish(Half-Orc)
+I:30000:200:130:1:1
+C:125:100:60
+L:Orc | Easterling
+H:Dragon | Demon | Elf
+
+### The Rare Footwear Shop owners ###
+
+N:146:Nerwen(Human)
+I:20000:250:140:3:4
+C:125:100:80
+L:Human | Easterling
+H:Dragon | Demon | Troll
+
+N:147:Ulbar (Half-Elf)
+I:10000:150:120:4:8
+C:125:100:60
+L:Half-Elf | Easterling
+H:Dragon | Demon | Half-Ogre
+
+N:148:Pelendur(Half-Elf)
+I:30000:200:130:1:1
+C:115:100:70
+L:Half-Elf | Easterling
+H:Dragon | Demon | Half-Ogre
+
+N:149:Budgar(Half-Orc)
+I:25000:300:150:2:2
+C:150:100:50
+L:Orc | Easterling
+H:Dragon | Demon | Elf
+
+### The Dungeon Librarians ###
+
+N:150:Nom(Human)
+I:25000:300:150:2:2
+C:115:100:70
+L:Human | Easterling
+H:Dragon | Demon | Troll
+
+N:151:Urwen (Half-Elf)
+I:10000:150:120:4:8
+C:125:100:60
+L:Half-Elf | Easterling
+H:Dragon | Demon | Half-Ogre
+
+N:152:Rian(Half-Elf)
+I:30000:200:130:1:1
+C:125:100:80
+L:Half-Elf | Easterling
+H:Dragon | Demon | Half-Ogre
+
+N:153:Mosrog(Half-Orc)
+I:20000:250:140:3:4
+C:150:100:50
+L:Orc | Easterling
+H:Dragon | Demon | Elf
+
+### The Expensive Black Marketeers ###
+
+N:154:Olwe(Human)
+I:30000:300:150:8:8
+C:125:100:90
+L:Human | Easterling
+H:Dragon | Demon | Troll
+
+N:155:Valacar(Half-Elf)
+I:30000:300:150:8:8
+C:125:100:90
+L:Half-Elf | Easterling
+H:Dragon | Demon | Half-Ogre
+
+N:156:Silmarien(Half-Elf)
+I:30000:300:150:8:8
+C:125:100:90
+L:Half-Elf | Easterling
+H:Dragon | Demon | Half-Ogre
+
+N:157:Ghaz(Half-Orc)
+I:30000:300:150:8:8
+C:125:100:90
+L:Orc | Easterling
+H:Dragon | Demon | Elf
+
+### The Common Shop Owners ###
+
+N:158:Ioreth(Human)
+I:25000:300:150:2:2
+C:150:100:50
+L:Human | Easterling
+H:Dragon | Demon | Troll
+
+N:159:Vidugavia(Half-Elf)
+I:30000:200:130:1:1
+C:115:100:70
+L:Half-Elf | Easterling
+H:Dragon | Demon | Half-Ogre
+
+N:160:Soronto(Half-Elf)
+I:10000:150:120:4:8
+C:125:100:80
+L:Half-Elf | Easterling
+H:Dragon | Demon | Half-Ogre
+
+N:161:Nazg(Half-Orc)
+I:20000:250:140:3:4
+C:125:100:60
+L:Orc | Easterling
+H:Dragon | Demon | Elf
+
+### The Dragon Hunters ###
+
+N:162:Oropher(Human)
+I:10000:150:120:4:8
+C:115:100:70
+L:Human | Easterling
+H:Dragon | Demon | Troll
+
+N:163:Walda(Half-Elf)
+I:25000:300:150:2:2
+C:125:100:80
+L:Half-Elf | Easterling
+H:Dragon | Demon | Half-Ogre
+
+N:164:Mithrellas(Half-Elf)
+I:20000:250:140:3:4
+C:150:100:50
+L:Half-Elf | Easterling
+H:Dragon | Demon | Half-Ogre
+
+N:165:Urbag(Half-Orc)
+I:30000:200:130:1:1
+C:125:100:60
+L:Orc | Easterling
+H:Dragon | Demon | Elf
+
+### The Speed Ring Market Owners ###
+
+N:166:Orophin(Human)
+I:20000:250:140:3:4
+C:125:100:80
+L:Human | Easterling
+H:Dragon | Demon | Troll
+
+N:167:Wulf(Half-Orc)
+I:10000:150:120:4:8
+C:125:100:60
+L:Orc | Easterling
+H:Dragon | Demon | Elf
+
+N:168:Baguk(Half-Troll)
+I:30000:200:130:1:1
+C:115:100:70
+L:Troll | Easterling
+H:Dragon | Demon | Human
+
+N:169:Zikram(Half-Orc)
+I:25000:300:150:2:2
+C:150:100:50
+L:Orc | Easterling
+H:Dragon | Demon | Elf
+
+### The Scribes ###
+
+N:170:Rumil(Human)
+I:25000:300:150:2:2
+C:115:100:70
+L:Human | Easterling
+H:Dragon | Demon | Troll
+
+N:171:Saeros(Half-Elf)
+I:10000:150:120:4:8
+C:125:100:60
+L:Half-Elf | Easterling
+H:Dragon | Demon | Half-Ogre
+
+N:172:Zartosh(Half-Orc)
+I:30000:200:130:1:1
+C:125:100:80
+L:Orc | Easterling
+H:Dragon | Demon | Elf
+
+N:173:Shog(Half-Troll)
+I:20000:250:140:3:4
+C:150:100:50
+L:Troll | Easterling
+H:Dragon | Demon | Human
+
+### The Potion Peddlers ###
+
+N:174:Zamin(Human)
+I:25000:300:150:2:2
+C:150:100:50
+L:Human | Easterling
+H:Dragon | Demon | Troll
+
+N:175:Algosh(Half-Orc)
+I:30000:200:130:1:1
+C:115:100:70
+L:Orc | Easterling
+H:Dragon | Demon | Elf
+
+N:176:Seghash(Half-Troll)
+I:10000:150:120:4:8
+C:125:100:80
+L:Troll | Easterling
+H:Dragon | Demon | Human
+
+N:177:Kabbug(Half-Orc)
+I:20000:250:140:3:4
+C:125:100:60
+L:Orc | Easterling
+H:Dragon | Demon | Elf
+
+### The Master Archers ###
+
+N:178:Palin(Dwarf)
+I:30000:170:107:1:1
+C:125:100:70
+L:Human | Dwarf
+H:Dragon | Demon | Beorning | Orc | Half-Ogre | Troll | Easterling
+
+N:179:Wilcome Cotton(Hobbit)
+I:20000:190:109:3:4
+C:110:100:80
+L:Human | Hobbit
+H:Dragon | Demon | Beorning | Orc | Half-Ogre | Troll | Easterling
+
+N:180:Inzilbeth(Dunadan)
+I:25000:180:108:2:2
+C:110:100:80
+L:Human | High-Elf | Dunadan | Elf
+H:Dragon | Demon | Orc | Half-Ogre | Troll
+
+N:181:Gildor Inglorion(Dark-Elf)
+I:10000:200:110:4:8
+C:150:100:50
+L:Dark-Elf | Elf | Easterling
+H:Dragon | Demon | Orc | Half-Ogre | Petty-Dwarf | Dwarf | Troll
+
+### Theme stores ###
+
+### The Miners / Builders ###
+
+N:182:Gror(Dwarf)
+I:20000:190:109:3:4
+C:125:100:70
+L:Half-Elf | Petty-Dwarf | Dwarf
+H:Dragon | Demon | Beorning | Orc | Half-Ogre | Troll
+
+N:183:Saradoc Oldbuck(Hobbit)
+I:30000:170:107:1:1
+C:110:100:80
+L:Human | High-Elf | Hobbit | Elf
+H:Dragon | Demon | Beorning | Orc | Half-Ogre | Troll
+
+N:184:Gloredhel(Half-Elf)
+I:10000:200:110:4:8
+C:150:100:50
+L:Human | Half-Elf | Dunadan | Elf | Easterling
+H:Dragon | Demon | Beorning | Orc | Dark-Elf | Half-Ogre | Troll
+
+N:185:Erellont(Wood-Elf)
+I:25000:180:108:2:2
+C:110:100:80
+L:High-Elf | Dunadan | Hobbit | Elf
+H:Dragon | Demon | Orc | Dark-Elf | Half-Ogre | Dwarf | Troll | Easterling
+
+### The Hunters ###
+
+N:186:Kili(Dwarf)
+I:20000:190:109:3:4
+C:110:100:80
+L:Petty-Dwarf | Dwarf
+H:Dragon | Demon | Orc | Dark-Elf | Half-Ogre | Elf | Troll
+
+N:187:Ruby Bolger(Hobbit)
+I:10000:200:110:4:8
+C:150:100:50
+L:Human | Half-Elf | High-Elf | Hobbit | Elf | Easterling
+H:Dragon | Demon | Beorning | Orc | Half-Ogre | Dwarf | Troll
+
+N:188:Goldwine(Human)
+I:25000:180:108:2:2
+C:110:100:80
+L:Human | Half-Elf | RohanKnight | Dunadan | Elf | Easterling
+H:Dragon | Demon | Beorning | Orc | Dark-Elf | Half-Ogre | Troll
+
+N:189:Erestor(High-Elf)
+I:30000:170:107:1:1
+C:125:100:70
+L:Human | Half-Elf | High-Elf | Dunadan | Elf
+H:Dragon | Demon | Beorning | Orc | Dark-Elf | Half-Ogre | Dwarf | Troll | Easterling
+
+### The Runecrafters ###
+
+N:190:Nori(Dwarf)
+I:30000:170:107:1:1
+C:150:100:50
+L:Petty-Dwarf | Dwarf | Half-Elf | Dunadan
+H:Dragon | Demon | Beorning | Orc | Dark-Elf | Half-Ogre | Human | Troll | Eagle
+
+N:191:Camellia Sackville(Hobbit)
+I:10000:200:110:4:8
+C:110:100:80
+L:Hobbit | Easterling
+H:Dragon | Demon | Orc | Troll
+
+N:192:Hador Lorindol(Dunadan)
+I:25000:180:108:2:2
+C:110:100:80
+L:Human | Half-Elf | High-Elf | RohanKnight | Dunadan | Hobbit | Elf
+H:Dragon | Demon | Orc | Half-Ogre | Troll | Easterling
+
+N:193:Galathil(Dark-Elf)
+I:20000:190:109:3:4
+C:125:100:70
+L:Human | Dark-Elf | Elf
+H:Dragon | Demon | Beorning | Orc | High-Elf | Half-Ogre | Petty-Dwarf | Troll
+
+### The Musicians ###
+
+N:194:Oin(Dwarf)
+I:20000:190:109:3:4
+C:125:100:70
+L:Human | Petty-Dwarf | Dwarf
+H:Dragon | Demon | Orc | Elf | Half-Ogre | Troll | Easterling
+
+N:195:Robin Smallburrow(Hobbit)
+I:10000:200:110:4:8
+C:110:100:80
+L:Human | Hobbit | Elf
+H:Dragon | Demon | Beorning | Orc | Troll | Easterling
+
+N:196:Hareth(Half-Elf)
+I:30000:170:107:1:1
+C:150:100:50
+L:Human | RohanKnight | Dunadan
+H:Dragon | Demon | Beorning | Orc | Half-Ogre | Troll | Easterling
+
+N:197:Galdor(Wood-Elf)
+I:25000:180:108:2:2
+C:110:100:80
+L:Half-Elf | High-Elf | Elf
+H:Dragon | Demon | Orc | Dark-Elf | Half-Ogre | Petty-Dwarf | Dwarf | Troll | Easterling
+
+### The Precious Metalsmiths ###
+
+N:198:Gabil(Dwarf)
+I:10000:150:120:4:8
+C:115:100:70
+L:Dwarf
+H:Dragon | Demon | Orc
+
+N:199:Isil(Human)
+I:25000:300:150:2:2
+C:125:100:80
+L:Human | Easterling
+H:Dragon | Demon | Troll
+
+N:200:Grima(Half-Orc)
+I:20000:250:140:3:4
+C:150:100:50
+L:Orc | Easterling
+H:Dragon | Demon | Elf
+
+N:201:Kosh(Half-Troll)
+I:30000:200:130:1:1
+C:125:100:60
+L:Troll | Easterling
+H:Dragon | Demon | Human
+
+### The Mapmakers ###
+
+N:202:Pas(Dwarf)
+I:20000:190:109:3:4
+C:125:100:70
+L:Half-Elf | Petty-Dwarf | Dwarf
+H:Dragon | Demon | Beorning | Orc | Half-Ogre | Troll
+
+N:203:Isumbras Took(Hobbit)
+I:30000:170:107:1:1
+C:110:100:80
+L:Human | High-Elf | Hobbit | Elf
+H:Dragon | Demon | Beorning | Orc | Half-Ogre | Troll | Easterling
+
+N:204:Labadal(Half-Elf)
+I:10000:200:110:4:8
+C:150:100:50
+L:Human | Half-Elf | Dunadan | Elf | Easterling
+H:Dragon | Demon | Beorning | Orc | Dark-Elf | Half-Ogre | Troll
+
+N:205:Guilin(Wood-Elf)
+I:25000:180:108:2:2
+C:110:100:80
+L:High-Elf | Dunadan | Hobbit | Elf
+H:Dragon | Demon | Orc | Dark-Elf | Half-Ogre | Dwarf | Troll
+
+### The Farmers ###
+
+N:206:Rili(Dwarf)
+I:20000:190:109:3:4
+C:110:100:80
+L:Petty-Dwarf | Dwarf
+H:Dragon | Demon | Orc | Dark-Elf | Half-Ogre | Elf | Troll
+
+N:207:Wiseman Gamwich(Hobbit)
+I:10000:200:110:4:8
+C:150:100:50
+L:Human | Half-Elf | High-Elf | Hobbit | Elf
+H:Dragon | Demon | Beorning | Orc | Half-Ogre | Dwarf | Troll
+
+N:208:Lalaith(Human)
+I:25000:180:108:2:2
+C:110:100:80
+L:Human | Half-Elf | RohanKnight | Dunadan | Elf
+H:Dragon | Demon | Beorning | Orc | Dark-Elf | Half-Ogre | Troll | Easterling
+
+N:209:Gwindor(High-Elf)
+I:30000:170:107:1:1
+C:125:100:70
+L:Human | Half-Elf | High-Elf | Dunadan | Elf
+H:Dragon | Demon | Beorning | Orc | Dark-Elf | Half-Ogre | Dwarf | Troll
+
+### The Old Mage in Minas Anor ###
+
+N:210:Malbeth the Seer
+I:20000:170:110:4:4
+C:110:100:80
+L:Human | RohanKnight | Dunadan | High-Elf
+H:Dragon | Demon | Beorning | Orc | Half-Ogre | Troll | Easterling
+
+### For the Merchants' Guild ###
+N:211:Worm(Human)
+I:30000:180:110:0:0
+C:110:100:90 \ No newline at end of file
diff --git a/lib/mods/theme/edit/p_info.txt b/lib/mods/theme/edit/p_info.txt
new file mode 100644
index 00000000..49832c32
--- /dev/null
+++ b/lib/mods/theme/edit/p_info.txt
@@ -0,0 +1,2855 @@
+# File: p_info.txt
+
+
+# This file is used to initialize the "lib/raw/p_info.raw" file, which is
+# used to initialize the "player race/race mod/class" information for the
+# Angband game.
+
+# Do not modify this file unless you know exactly what you are doing,
+# unless you wish to risk possible system crashes and broken savefiles.
+
+V:2.0.0
+
+##############################################################################
+##############################################################################
+##############################################################################
+##############################################################################
+# General skills, that everybody starts with
+# G:k:value:modifier:skill name
+G:k:+0:+500:Monster-lore
+G:k:+1000:+0:Spell-learning
+G:k:+0:+500:Prayer
+G:k:+0:+400:Udun
+G:k:+1000:+1000:Magic-Device
+
+##############################################################################
+##############################################################################
+##############################################################################
+##############################################################################
+# C:N:index:name
+# C:D:0:class desc
+# C:D:1:titles
+# C:S:str:int:wis:dex:con:chr:mana:bonus blows
+# C:K:dis:dev:sav:stl:srh:fos:thn:thb
+# C:X:dis:dev:sav:stl:srh:fos:thn:thb
+# C:P:hitdie:xp%
+# C:B:num:wgt:mul
+# C:C:(H|L):(H|L):base:pl:plus
+# first (H|L) is for weapons/.. second is for magic things
+# H = heavy sensing, L = light sensing; result(lower = better) = base / (pl * plev + plus)
+# C:G:class flags
+# C:R:level:pval
+# C:F:flags
+# C:Z:power
+# C:E:weapons:torso:arms:finger:head:legs
+# C:O:tval:sval:xdy
+# C:k:value:modifier:skill name
+# C:b:level:ability
+
+# Specialities, autoskiller
+# C:a:N:Name
+# C:a:D:Desc
+# C:a:K:lvl 50 skill value:skill name
+# C:a:k:value:mod:skill name
+# C:a:b:level:ability
+# C:a:O:tval:sval:xdy
+
+C:N:0:Warrior
+C:D:0:Simple fighters, they hack away with their trusty weapon.
+C:D:1:Rookie
+C:D:1:Soldier
+C:D:1:Mercenary
+C:D:1:Veteran
+C:D:1:Swordsman
+C:D:1:Champion
+C:D:1:Hero
+C:D:1:Baron
+C:D:1:Duke
+C:D:1:Lord
+C:S:5:-2:-2:2:2:-1:0:3
+C:K:10:10:0:1:10:10:10:10
+C:X:0:0:0:0:0:0:0:0
+C:B:4:30:5
+C:C:H:L:9000:2:40
+C:P:9:0
+C:R:30:0
+C:F:RES_FEAR
+C:E:0:0:0:0:0:0
+C:O:45:38:1d1
+C:O:37:4:1d1
+C:k:+2000:+800:Combat
+C:k:+1000:+850:Weaponmastery
+C:k:+0:+400:Sword-mastery
+C:k:+0:+400:Axe-mastery
+C:k:+0:+400:Hafted-mastery
+C:k:+0:+400:Polearm-mastery
+C:k:+1000:+600:Archery
+C:k:+1000:+900:Sneakiness
+C:k:+0000:+400:Stealth
+C:k:+1000:+900:Disarming
+C:k:+1000:+300:Magic
+C:k:+1000:+400:Spirituality
+C:k:+0:+550:Antimagic
+C:k:+0:+150:Magic-Device
+C:b:25:Spread blows
+C:b:1:Extra Max Blow(1)
+C:b:1:Extra Max Blow(2)
+
+# Specialities, autoskiller
+C:a:N:Warrior
+C:a:D:Simple fighters, they hack away with their trusty weapon.
+C:a:O:23:16:1d1
+C:a:g:All Gods
+
+C:a:N:Swordmaster
+C:a:D:Fighters specialised in the use of swords
+C:a:k:+1000:+300:Sword-mastery
+C:a:k:+0:+100:Weaponmastery
+C:a:k:+0:+100:Combat
+C:a:k:+0:-100:Axe-mastery
+C:a:k:+0:-100:Hafted-mastery
+C:a:k:+0:-100:Polearm-mastery
+C:a:O:23:16:1d1
+C:a:g:Nobody
+C:a:g:Manwe Sulimo
+C:a:g:Tulkas
+C:a:g:Melkor Bauglir
+C:a:g:Yavanna Kementari
+C:a:g:Varda Elentari
+C:a:g:Aule the Smith
+C:a:g:Ulmo
+C:a:g:Mandos
+
+C:a:N:Axemaster
+C:a:D:Fighters specialised in the use of axes
+C:a:k:+0:+100:Weaponmastery
+C:a:k:+0:+100:Combat
+C:a:k:+1000:+300:Axe-mastery
+C:a:k:+0:-100:Sword-mastery
+C:a:k:+0:-100:Hafted-mastery
+C:a:k:+0:-100:Polearm-mastery
+C:a:O:24:1:1d1
+C:a:g:Nobody
+C:a:g:Manwe Sulimo
+C:a:g:Tulkas
+C:a:g:Melkor Bauglir
+C:a:g:Yavanna Kementari
+C:a:g:Varda Elentari
+C:a:g:Aule the Smith
+C:a:g:Ulmo
+C:a:g:Mandos
+
+C:a:N:Haftedmaster
+C:a:D:Fighters specialised in the use of hafted weapons
+C:a:k:+1000:+300:Hafted-mastery
+C:a:k:+0:+500:Stunning-blows
+C:a:k:+0:+100:Weaponmastery
+C:a:k:+0:+100:Combat
+C:a:k:+0:-100:Axe-mastery
+C:a:k:+0:-100:Sword-mastery
+C:a:k:+0:-100:Polearm-mastery
+C:a:O:21:13:1d1
+C:a:g:All Gods
+
+C:a:N:Polearmmaster
+C:a:D:Fighters specialised in the use of polearms
+C:a:k:+1000:+300:Polearm-mastery
+C:a:k:+0:+100:Weaponmastery
+C:a:k:+0:+100:Combat
+C:a:k:+0:-100:Axe-mastery
+C:a:k:+0:-100:Hafted-mastery
+C:a:k:+0:-100:Sword-mastery
+C:a:O:22:8:1d1
+C:a:b:20:Far reaching attack
+C:a:g:All Gods
+
+C:a:N:Unbeliever
+C:a:D:They don't believe in magic and can even prevent its usage around them
+C:a:k:=0:=0:Prayer
+C:a:k:=0:=0:Magic
+C:a:k:=0:=0:Magic-Device
+C:a:k:=0:=0:Spirituality
+C:a:k:+1000:+100:Antimagic
+C:a:O:23:33:1d1
+C:a:g:Nobody
+
+C:a:N:Demonologist
+C:a:D:Masters of the school of demonology, they are trained in both melee
+C:a:D:fighting and using demon spells to enhance their combat potential.
+C:a:O:115:55:1d1
+C:a:k:+0:-50:Combat
+C:a:k:+0:-100:Weaponmastery
+C:a:k:+0:+200:Sword-mastery
+C:a:k:=0:=0:Axe-mastery
+C:a:k:=0:=0:Hafted-mastery
+C:a:k:=0:=0:Polearm-mastery
+C:a:k:+1000:-200:Archery
+C:a:k:+1000:+900:Sneakiness
+C:a:k:+1000:+900:Disarming
+C:a:k:+1000:+400:Magic
+C:a:k:+1000:+300:Spirituality
+C:a:k:=0:=0:Antimagic
+C:a:k:+1000:+1000:Demonology
+C:a:g:Nobody
+C:a:g:Manwe Sulimo
+C:a:g:Tulkas
+C:a:g:Melkor Bauglir
+
+C:a:N:Wainrider
+C:a:D:A proud warrior riding a majestic chariot.
+C:a:D:Wainriders are traditionally aligned with Melkor.
+C:a:O:71:10:1d1
+C:a:O:23:32:1d1
+C:a:g:Melkor Bauglir
+C:a:k:+0:+600:Sword-mastery
+C:a:k:=0:=0:Axe-mastery
+C:a:k:=0:=0:Hafted-mastery
+C:a:k:=0:=0:Polearm-mastery
+C:a:k:+0:+500:Critical-hits
+C:a:k:+0:+500:Magic
+C:a:k:+0:+500:Spirituality
+C:a:k:+1000:+200:Prayer
+C:a:k:=0:=0:Antimagic
+
+C:N:1:Mage
+C:D:0:The basic spellcaster with lots of different skills
+C:D:1:Apprentice
+C:D:1:Trickster
+C:D:1:Illusionist
+C:D:1:Spellbinder
+C:D:1:Evoker
+C:D:1:Conjurer
+C:D:1:Warlock
+C:D:1:Sorcerer
+C:D:1:Ipsissimus
+C:D:1:Archimage
+C:S:-5:3:0:1:-2:1:50:0
+C:K:10:10:0:1:10:10:10:10
+C:X:0:0:0:0:0:0:0:0
+C:B:4:40:2
+C:C:L:H:240000:1:5
+C:P:0:30
+C:E:0:0:0:0:0:0
+C:k:+1000:+900:Magic
+C:k:+0:+200:Magic-Device
+C:k:+0:+600:Spell-power
+C:k:+1000:+600:Mana
+C:k:+0:+700:Fire
+C:k:+0:+700:Water
+C:k:+0:+700:Air
+C:k:+0:+700:Earth
+C:k:+0:+700:Temporal
+C:k:+0:+700:Divination
+C:k:+0:+700:Conveyance
+C:k:+0:+700:Nature
+C:k:+0:+700:Meta
+C:k:+0:+700:Mind
+C:k:+0:+700:Necromancy
+C:k:+0:+700:Runecraft
+C:k:+0:+700:Thaumaturgy
+C:k:+1000:+550:Spirituality
+C:k:+1000:+200:Combat
+C:k:+700:+500:Weaponmastery
+C:k:+1000:+900:Sneakiness
+C:k:+0000:+400:Stealth
+C:b:1:Perfect casting
+C:g:All Gods
+
+C:a:N:Mage
+C:a:D:The basic unspecialized warrior-spellcaster
+C:a:k:+0:+300:Combat
+C:a:k:+0:+200:Sorcery
+C:a:k:+0:+300:Mana
+C:a:k:+0:+200:Fire
+C:a:k:+0:+200:Water
+C:a:k:+0:+200:Air
+C:a:k:+0:+200:Earth
+C:a:k:+0:+200:Conveyance
+C:a:k:+0:+200:Nature
+C:a:k:+0:+200:Temporal
+C:a:k:+0:+200:Divination
+C:a:k:+0:+200:Meta
+C:a:k:+0:+200:Mind
+C:a:O:23:4:1d1
+C:a:O:111:50:1d1
+
+C:a:N:Geomancer
+C:a:D:The master of the four elements
+C:a:k:+0:-150:Magic-Device
+C:a:k:+1000:+100:Spell-power
+C:a:k:-1000:-600:Mana
+C:a:k:+1000:+700:Geomancy
+C:a:k:+1000:+350:Fire
+C:a:k:+1000:+350:Water
+C:a:k:+1000:+350:Air
+C:a:k:+1000:+350:Earth
+C:a:k:+0:-100:Weaponmastery
+C:a:O:6:1:1d1
+
+C:a:N:Warper
+C:a:D:The master of space and time
+C:a:k:+0:-150:Magic-Device
+C:a:k:+1000:+100:Spell-power
+C:a:k:+0:+100:Mana
+C:a:k:+0:+100:Fire
+C:a:k:+0:+100:Water
+C:a:k:+0:+100:Air
+C:a:k:+0:+100:Earth
+C:a:k:+0:+500:Conveyance
+C:a:k:+0:+100:Nature
+C:a:k:+0:+500:Temporal
+C:a:k:+0:+500:Divination
+C:a:k:+0:+100:Meta
+C:a:k:+0:-100:Weaponmastery
+C:a:O:23:4:1d1
+C:a:O:111:50:1d1
+
+C:a:N:Sorceror
+C:a:D:The master of all magic schools
+C:a:k:+0:-200:Magic-Device
+C:a:k:=0:=0:Weaponmastery
+C:a:k:=0:=0:Combat
+C:a:k:+1000:+700:Sorcery
+C:a:k:+0:+100:Magic
+C:a:k:-1000:+300:Mana
+C:a:k:+0:+300:Fire
+C:a:k:+0:+300:Water
+C:a:k:+0:+300:Air
+C:a:k:+0:+300:Earth
+C:a:k:+0:+300:Conveyance
+C:a:k:+0:+300:Nature
+C:a:k:+0:+300:Temporal
+C:a:k:+0:+300:Divination
+C:a:k:+0:+300:Meta
+C:a:k:+0:+300:Mind
+C:a:k:+0:+200:Necromancy
+C:a:k:+0:+200:Runecraft
+C:a:k:+0:+200:Thaumaturgy
+C:a:O:36:2:1d1
+C:a:O:111:50:1d1
+
+C:a:N:Necromancer
+C:a:D:The master of death, and undeath
+C:a:k:+0:+100:Weaponmastery
+C:a:k:+0:+200:Combat
+C:a:k:+1000:+300:Necromancy
+C:a:k:-1000:+0:Mana
+C:a:k:+0:+100:Fire
+C:a:k:+0:+100:Earth
+C:a:k:+0:-200:Nature
+C:a:k:+0:+100:Temporal
+C:a:k:+0:+200:Mind
+C:a:k:+1000:+600:Monster-lore
+C:a:k:+5000:+900:Corpse-preservation
+C:a:O:23:4:1d1
+C:a:O:111:50:1d1
+C:a:b:25:Undead Form
+
+C:a:N:Runecrafter
+C:a:D:Runecrafters use the runes found in Middle-earth to create
+C:a:D:finely tuned spells for each specific situation.
+C:a:k:+1000:+50:Magic
+C:a:k:+1000:+300:Runecraft
+C:a:k:+0:-100:Weaponmastery
+C:a:O:111:50:1d1
+C:a:O:105:1:1d1
+C:a:O:104:5:1d1
+C:a:O:23:4:1d1
+
+C:a:N:Thaumaturgist
+C:a:D:Thaumaturgy spells come from within and are different for each character.
+C:a:D:Since attack is the best defence, all their spells are offensive.
+C:a:k:+2000:+50:Magic
+C:a:k:=0:=0:Spell-power
+C:a:k:=0:=0:Mana
+C:a:k:=0:=0:Fire
+C:a:k:=0:=0:Water
+C:a:k:=0:=0:Air
+C:a:k:=0:=0:Earth
+C:a:k:=0:=0:Temporal
+C:a:k:=0:=0:Divination
+C:a:k:=0:=0:Conveyance
+C:a:k:=0:=0:Nature
+C:a:k:=0:=0:Meta
+C:a:k:=0:=0:Mind
+C:a:k:=0:=0:Necromancy
+C:a:k:=0:=0:Runecraft
+C:a:k:+1000:+300:Thaumaturgy
+C:a:k:+0:-100:Weaponmastery
+C:a:k:+0:-150:Magic-Device
+C:a:O:23:4:1d1
+C:a:O:111:50:1d1
+
+### Clairvoyant - new class added in Theme
+
+C:a:N:Clairvoyant
+C:a:D:The master of the mind who sacrifices breadth of
+C:a:D:ability for additional favour with their deity.
+C:a:k:=0:=0:Mana
+C:a:k:=0:=0:Fire
+C:a:k:=0:=0:Water
+C:a:k:=0:=0:Air
+C:a:k:=0:=0:Earth
+C:a:k:=0:=0:Conveyance
+C:a:k:=0:=0:Nature
+C:a:k:=0:=0:Temporal
+C:a:k:=0:=0:Meta
+C:a:k:=0:=0:Necromancy
+C:a:k:=0:=0:Runecraft
+C:a:k:=0:=0:Thaumaturgy
+C:a:k:+1000:+300:Divination
+C:a:k:+1000:+300:Mind
+C:a:k:+0:+500:Spirituality
+C:a:k:+0:+500:Prayer
+C:a:k:+1000:+700:Mindcraft
+C:a:O:111:50:1d1
+C:a:O:21:3:1d1
+
+C:N:2:Archer
+C:D:0:'Kill them before they see you' could be the motto of the archer class.
+C:D:0:As deadly with a bow as a warrior is with a sword.
+C:D:1:Rock Thrower
+C:D:1:Slinger
+C:D:1:Great Slinger
+C:D:1:Tosser
+C:D:1:Bowman
+C:D:1:Great Bowman
+C:D:1:Great Bowman
+C:D:1:Archer
+C:D:1:Archer
+C:D:1:Great Archer
+C:S:2:1:0:2:1:1:0:0
+C:K:10:10:0:1:10:10:10:10
+C:X:0:0:0:0:0:0:0:0
+C:B:4:35:4
+C:C:H:L:9000:2:40
+C:P:4:30
+C:E:0:0:0:0:0:0
+C:k:+1000:+800:Combat
+C:k:+1000:+500:Weaponmastery
+C:k:+1000:+750:Archery
+C:k:+0:+300:Bow-mastery
+C:k:+0:+300:Crossbow-mastery
+C:k:+0:+300:Sling-mastery
+C:k:+0:+300:Boomerang-mastery
+C:k:+0:%150:Boulder-throwing
+C:k:+1000:+900:Sneakiness
+C:k:+0000:+400:Stealth
+C:k:+1000:+900:Disarming
+C:k:+1000:+300:Magic
+C:k:+0:+100:Magic-Device
+C:k:+1000:+400:Spirituality
+C:b:2:Ammo creation
+
+C:a:N:Archer
+C:a:D:'Kill them before they see you' could be the motto of the archer class.
+C:a:D:As deadly with a bow as a warrior is with a sword.
+C:a:k:+0:+100:Archery
+C:a:k:+0:+200:Bow-mastery
+C:a:k:+0:+200:Crossbow-mastery
+C:a:k:+0:+200:Sling-mastery
+C:a:k:+0:+200:Boomerang-mastery
+C:a:k:-1000:-100:Magic
+C:a:O:19:12:1d1
+C:a:O:19:2:1d1
+C:a:O:17:1:10d3
+C:a:O:17:1:10d3
+C:a:g:All Gods
+
+C:a:N:Ranger
+C:a:D:Rangers are capable archers but are also trained in hand-to-hand combat,
+C:a:D:the nature and divination magic schools, and trapping.
+C:a:k:+0:+200:Weaponmastery
+C:a:k:+0:+400:Magic
+C:a:k:+0:+500:Nature
+C:a:k:+0:+500:Divination
+C:a:k:+0:+700:Disarming
+C:a:k:+0:+50:Sneakiness
+C:a:k:+0:+200:Monster-lore
+C:a:k:+0:+300:Summoning
+C:a:O:19:12:1d1
+C:a:O:17:1:10d3
+C:a:O:23:10:1d1
+C:a:O:46:1:1d1
+C:a:g:Nobody
+C:a:g:Manwe Sulimo
+C:a:g:Tulkas
+C:a:g:Yavanna Kementari
+C:a:g:Varda Elentari
+C:a:g:Aule the Smith
+C:a:g:Ulmo
+C:a:g:Mandos
+C:a:b:1:Trapping
+
+C:a:N:Sniper
+C:a:D:Snipers are very stealthy archers without much hand-to-hand combat
+C:a:D:ability, but with a penchant to disappear when it suits them.
+C:a:k:+0:-300:Combat
+C:a:k:+1000:+100:Sneakiness
+C:a:k:+1000:+700:Stealth
+C:a:k:+0:+100:Disarming
+C:a:k:+1000:+700:Backstab
+C:a:k:+0:+300:Magic
+C:a:k:+1000:+500:Conveyance
+C:a:O:19:12:1d1
+C:a:O:17:1:10d3
+C:a:g:All Gods
+
+C:N:3:Rogue
+C:D:0:Rogues are masters of tricks. They can steal from shops and monsters,
+C:D:0:and lure monsters into deadly monster traps.
+C:D:1:Cutpurse
+C:D:1:Robber
+C:D:1:Burglar
+C:D:1:Filcher
+C:D:1:Sharper
+C:D:1:Low Thief
+C:D:1:High Thief
+C:D:1:Master Thief
+C:D:1:Assassin
+C:D:1:Guildmaster
+C:S:2:1:-2:3:1:-1:0:0
+C:K:10:10:0:1:10:10:10:10
+C:X:0:0:0:0:0:0:0:0
+C:B:4:30:3
+C:C:H:H:20000:2:40
+C:P:6:25
+C:O:23:4:1d1
+C:G:EASE_STEAL
+C:R:3:1
+C:F:CRIT
+C:R:6:1
+C:F:CRIT
+C:R:9:1
+C:F:CRIT
+C:R:12:1
+C:F:CRIT
+C:R:15:1
+C:F:CRIT
+C:R:18:1
+C:F:CRIT
+C:R:21:1
+C:F:CRIT
+C:R:24:1
+C:F:CRIT
+C:R:27:1
+C:F:CRIT
+C:R:30:1
+C:F:CRIT
+C:R:33:1
+C:F:CRIT
+C:R:36:1
+C:F:CRIT
+C:R:39:1
+C:F:CRIT
+C:R:42:1
+C:F:CRIT
+C:R:45:1
+C:F:CRIT
+C:R:48:1
+C:F:CRIT
+C:E:0:0:0:0:0:0
+C:k:+1000:+700:Combat
+C:k:+1000:+700:Weaponmastery
+C:k:+1000:+300:Sword-mastery
+C:k:+1000:+500:Critical-hits
+C:k:+1000:+700:Magic
+C:k:+0:+550:Magic-Device
+C:k:+0:+500:Conveyance
+C:k:+0:+500:Divination
+C:k:+0:+500:Temporal
+C:k:+1000:+700:Spirituality
+C:k:+1000:+2000:Sneakiness
+C:k:+1000:+1500:Stealth
+C:k:+1000:+2000:Disarming
+C:k:+1000:+1000:Backstab
+C:k:+1000:+2000:Stealing
+C:k:+1000:+2000:Dodging
+C:g:All Gods
+C:b:10:Extra Max Blow(1)
+
+C:a:N:Rogue
+C:a:D:Rogues are masters of tricks. They can steal from shops and monsters,
+C:a:D:and lure monsters into deadly monster traps.
+C:a:b:1:Trapping
+C:a:O:46:1:1d1
+
+C:a:N:Assassin
+C:a:D:Assassins are stealthy killers.
+C:a:k:+0:+100:Combat
+C:a:k:+0:+100:Weaponmastery
+C:a:k:+0:+300:Sword-mastery
+C:a:k:+1000:+300:Critical-hits
+C:a:k:+1000:+300:Boomerang-mastery
+C:a:k:+0:-500:Magic
+C:a:k:+0:-400:Conveyance
+C:a:k:+0:-400:Divination
+C:a:k:+0:-300:Temporal
+C:a:k:+0:+500:Stealth
+C:a:k:+0:-1000:Disarming
+C:a:k:+0:+1000:Backstab
+C:a:k:+0:-1800:Stealing
+C:a:k:+0:-550:Magic-Device
+
+C:a:N:Mercenary
+C:a:D:Mercenaries are daring swashbucklers, masters of the blade.
+C:a:k:+0:+200:Weaponmastery
+C:a:k:+0:+400:Sword-mastery
+C:a:k:+0:+200:Critical-hits
+C:a:k:+0:+050:Magic-Device
+C:a:k:=0:=0:Conveyance
+C:a:k:=0:=0:Divination
+C:a:k:+0:+500:Temporal
+C:a:b:15:Extra Max Blow(2)
+C:a:O:23:7:1d1
+C:a:O:35:1:1d1
+
+C:N:4:Loremaster
+C:D:0:Loremasters are skilled in most combat and monster skills.
+C:D:1:Apprentice
+C:D:1:Apprentice
+C:D:1:Initiate
+C:D:1:Initiate
+C:D:1:Sage
+C:D:1:Sage
+C:D:1:Lorekeeper
+C:D:1:Lorekeeper
+C:D:1:Loremaster
+C:D:1:Loremaster
+C:S:1:-2:1:1:0:1:0:0
+C:K:10:10:0:1:10:10:10:10
+C:X:0:0:0:0:0:0:0:0
+C:B:4:30:3
+C:C:H:L:9000:2:40
+C:P:8:40
+C:E:0:0:0:0:0:0
+C:k:+1000:+700:Combat
+C:k:+1000:+700:Weaponmastery
+C:k:+1000:+700:Archery
+C:k:+1000:+700:Barehand-combat
+C:k:+0:+600:Magic
+C:k:+1000:+700:Sneakiness
+C:k:+1000:+700:Stealth
+C:k:+1000:+700:Disarming
+C:k:+1000:+700:Spirituality
+C:k:+1000:+600:Monster-lore
+C:k:+0:+500:Possession
+C:k:+1000:+700:Corpse-preservation
+C:k:+0:+500:Summoning
+C:k:+0:+500:Symbiosis
+C:k:+0:+500:Mimicry
+C:k:+0:+300:Music
+
+C:a:N:Loremaster
+C:a:D:Loremasters are skilled in most combat and monster skills.
+C:a:O:21:3:1d1
+C:a:O:36:6:1d1
+C:a:O:19:2:1d1
+C:a:O:16:0:3d10
+C:a:g:All Gods
+
+C:a:N:Possessor
+C:a:D:Only the soul matters; a possessor can abandon his/her current body to
+C:a:D:incarnate in the body of a dead monster, thus gaining its powers
+C:a:D:and weaknesses.
+C:a:O:71:37:1d1
+C:a:O:23:10:1d1
+C:a:O:36:6:1d1
+C:a:k:+0:-100:Combat
+C:a:k:+0:-100:Weaponmastery
+C:a:k:+0:-300:Archery
+C:a:k:-1000:-700:Barehand-combat
+C:a:k:+0:-200:Disarming
+C:a:k:+0:-200:Spirituality
+C:a:k:+1000:+300:Possession
+C:a:k:+0:+200:Corpse-preservation
+C:a:k:+0:-500:Summoning
+C:a:k:+0:-500:Symbiosis
+C:a:k:+0:-500:Mimicry
+C:a:g:All Gods
+
+C:a:N:Mimic
+C:a:D:Disguise is the way of the mimic. Through the use of cloaks of mimicry
+C:a:D:they can change shape for a limited time. They also can temporarily
+C:a:D:change part of their anatomy.
+C:a:O:71:37:1d1
+C:a:O:23:4:1d1
+C:a:k:+0:+100:Combat
+C:a:k:+0:+100:Weaponmastery
+C:a:k:+0:-100:Barehand-combat
+C:a:k:+1000:+100:Magic
+C:a:k:+0:+100:Sneakiness
+C:a:k:+0:+100:Stealth
+C:a:k:+0:-200:Spirituality
+C:a:k:+0:-400:Possession
+C:a:k:+0:+200:Corpse-preservation
+C:a:k:+0:-500:Summoning
+C:a:k:+0:-500:Symbiosis
+C:a:k:+1000:+300:Mimicry
+C:a:g:All Gods
+
+C:a:N:Symbiant
+C:a:D:A symbiant can merge his/her body with one of a monster unable to move
+C:a:D:by itself. They also have a few spells to help the symbiosis.
+C:a:O:23:4:1d1
+C:a:O:70:6:1d1
+C:a:k:+0:+100:Combat
+C:a:k:+0:+100:Weaponmastery
+C:a:k:+0:-100:Barehand-combat
+C:a:k:+1000:+100:Magic
+C:a:k:+0:+100:Sneakiness
+C:a:k:+0:+100:Stealth
+C:a:k:+0:-200:Spirituality
+C:a:k:+0:-400:Possession
+C:a:k:+0:+200:Corpse-preservation
+C:a:k:+0:-500:Summoning
+C:a:k:+1000:+300:Symbiosis
+C:a:k:+0:-500:Mimicry
+C:a:g:All Gods
+
+C:a:N:Summoner
+C:a:D:The summoner can conjure monsters from totems made from defeated foes.
+C:a:O:71:37:1d1
+C:a:O:23:10:1d1
+C:a:O:36:6:1d1
+C:a:k:+0:-100:Combat
+C:a:k:+0:-100:Weaponmastery
+C:a:k:+0:-300:Archery
+C:a:k:-1000:-700:Barehand-combat
+C:a:k:+1000:+200:Magic
+C:a:k:+0:+0:Sneakiness
+C:a:k:+0:+0:Stealth
+C:a:k:+0:-200:Disarming
+C:a:k:+0:-200:Spirituality
+C:a:k:+15000:+100:Monster-lore
+C:a:k:+0:-500:Possession
+C:a:k:+0:+300:Corpse-preservation
+C:a:k:+1000:+200:Summoning
+C:a:k:+0:-500:Symbiosis
+C:a:k:+0:-500:Mimicry
+C:a:g:All Gods
+
+C:a:N:Monk
+C:a:D:Barehanded, lightly armoured fighters, they wreak havoc with
+C:a:D:their bare fists, and can also use a few prayers.
+C:a:O:71:37:1d1
+C:a:O:36:4:1d1
+C:a:k:-1000:+200:Combat
+C:a:k:-1000:-400:Weaponmastery
+C:a:k:-1000:-300:Archery
+C:a:k:+0:+200:Barehand-combat
+C:a:k:+0:+0:Magic
+C:a:k:+0:+200:Sneakiness
+C:a:k:+0:+200:Stealth
+C:a:k:+0:+200:Disarming
+C:a:k:+0:+200:Spirituality
+C:a:k:+0:-400:Possession
+C:a:k:+0:-200:Corpse-preservation
+C:a:k:+0:-500:Summoning
+C:a:k:+0:-500:Symbiosis
+C:a:k:+0:-500:Mimicry
+C:a:k:+0:+500:Meta
+C:a:k:+0:+500:Mind
+C:a:k:+0:+500:Temporal
+C:a:k:+0:+700:Dodging
+C:a:g:All Gods
+
+C:a:N:Bard
+C:a:D:Bards sing and play songs full of power, beauty or sadness to affect
+C:a:D:everything that can hear them, using music instruments of various types.
+C:a:O:71:37:1d1
+C:a:O:23:10:1d1
+C:a:O:36:2:1d1
+C:a:O:14:59:1d1
+C:a:k:+1000:+0:Magic
+C:a:k:-1000:-700:Archery
+C:a:k:+0:-100:Barehand-combat
+C:a:k:+0:-100:Disarming
+C:a:k:+0:+100:Spirituality
+C:a:k:+0:-500:Possession
+C:a:k:+0:-100:Summoning
+C:a:k:+0:-100:Symbiosis
+C:a:k:+0:-100:Mimicry
+C:a:k:+1000:+500:Music
+C:a:g:All Gods
+
+C:a:N:Ascetic
+C:a:D:The monk who has sworn off all worldly things.
+C:a:D:The ascetics do not believe in magic or gods.
+C:a:k:+0:+200:Combat
+C:a:k:=0:=0:Weaponmastery
+C:a:k:+0:+200:Barehand-combat
+C:a:k:+1000:+1000:Antimagic
+C:a:k:+0:+200:Disarming
+C:a:k:+0:+300:Stealth
+C:a:k:+0:+1000:Dodging
+C:a:k:=0:=0:Magic
+C:a:k:=0:=0:Magic-Device
+C:a:k:=0:=0:Spell-power
+C:a:k:=0:=0:Meta
+C:a:k:=0:=0:Conveyance
+C:a:k:=0:=0:Divination
+C:a:k:=0:=0:Temporal
+C:a:k:=0:=0:Nature
+C:a:k:=0:=0:Prayer
+C:a:k:=0:=0:Music
+C:a:k:=0:=0:Summoning
+C:a:k:=0:=0:Symbiosis
+C:a:k:=0:=0:Possession
+C:a:k:=0:=0:Mimicry
+C:a:b:10:Spread blows
+C:a:b:1:Extra Max Blow(1)
+C:a:b:5:Extra Max Blow(2)
+C:a:O:71:37:1d1
+C:a:g:Nobody
+
+C:N:5:Pacifist
+C:D:0:Pacifists do not believe in violence and do not want to kill
+C:D:0:everything in sight.
+C:D:1:Novice
+C:D:1:Appeaser
+C:D:1:Arbitrator
+C:D:1:Elf-Friend
+C:D:1:Conciliator
+C:D:1:Diplomat
+C:D:1:Mediator
+C:D:1:Negotiator
+C:D:1:Pacifist
+C:D:1:Peacemaker
+C:S:0:2:2:2:0:4:0:0
+C:K:10:10:0:1:10:10:10:10
+C:X:0:0:0:0:0:0:0:0
+C:P:0:0
+C:B:0:0:0
+C:C:H:H:20000:2:40
+C:Z:detect doors and traps
+C:E:-1:0:0:0:0:0
+C:k:=0:=0:Combat
+C:k:=0:=0:Weaponmastery
+C:k:=0:=0:Archery
+C:k:=0:=0:Barehand-combat
+C:k:+0:+600:Sneakiness
+C:k:+0:+600:Stealth
+C:k:+1000:+700:Dodging
+C:k:+1000:+600:Disarming
+C:k:+1000:+600:Magic
+C:k:=0:=0:Magic-Device
+C:k:+0:+500:Spell-power
+C:k:+1000:+1000:Nature
+C:k:+0:+700:Spirituality
+C:k:+1000:+400:Monster-lore
+C:k:=0:=0:Possession
+C:k:=0:=0:Corpse-preservation
+C:k:=0:=0:Mimicry
+C:k:=0:=0:Music
+C:b:15:Perfect casting
+C:g:All Gods
+
+C:a:N:Trapper
+C:a:D:These pacifists use traps to snare monsters, and
+C:a:D:make totems from corpses to summon aid.
+C:O:46:1:1d1
+C:a:k:+1000:+600:Summoning
+C:a:b:1:Trapping
+C:a:b:10:Ammo creation
+
+C:a:N:Peace-mage
+C:a:D:These pacifists use magic to escape danger, and
+C:a:D:rely on symbiotic relationships to defend themselves.
+C:a:O:70:6:1d1
+C:a:k:+0:+700:Meta
+C:a:k:+1000:+700:Conveyance
+C:a:k:+0:+700:Divination
+C:a:k:+0:+700:Temporal
+C:a:k:+1000:+600:Symbiosis
+
+C:N:6:Priest
+C:D:0:A priest serves a god (Vala, Maia or Eru himself) to bring down
+C:D:0:the empire of fear and shadows of Morgoth.
+C:D:1:Believer
+C:D:1:Acolyte
+C:D:1:Adept
+C:D:1:Curate
+C:D:1:Canon
+C:D:1:Priest
+C:D:1:High Priest
+C:D:1:Cardinal
+C:D:1:Inquisitor
+C:D:1:Pope
+C:S:-1:-3:3:-1:0:2:0:0
+C:K:10:10:0:1:10:10:10:10
+C:X:0:0:0:0:0:0:0:0
+C:B:4:35:3
+C:C:L:H:10000:2:40
+C:P:2:20
+C:Z:detect curses
+C:G:GOD_FRIEND |
+C:E:0:0:0:0:0:0
+C:k:+1000:+900:Magic
+C:k:+0:+600:Spell-power
+C:k:+0:+600:Necromancy
+C:k:+0:+600:Mindcraft
+C:k:+1000:+1000:Spirituality
+C:k:+1000:+700:Prayer
+C:k:+2000:+700:Combat
+C:k:+1000:+700:Weaponmastery
+C:k:+1000:+900:Sneakiness
+C:k:+0000:+900:Disarming
+C:k:+0000:+400:Stealth
+C:k:+0:+50:Magic-Device
+C:b:1:Perfect casting
+
+C:a:N:Priest(Eru)
+C:a:D:A priest that serves Eru Iluvatar to bring down
+C:a:D:the empire of fear and shadows of Morgoth.
+C:a:O:21:5:1d1
+C:a:g:Eru Iluvatar
+C:a:k:+0:+300:Prayer
+C:a:k:+0:-600:Necromancy
+C:a:k:+0:+100:Spell-power
+
+C:a:N:Priest(Manwe)
+C:a:D:A priest that serves Manwe Sulimo to bring down
+C:a:D:the empire of fear and shadows of Morgoth.
+C:a:O:21:5:1d1
+C:a:g:Manwe Sulimo
+C:a:k:+0:+300:Prayer
+C:a:k:+0:-600:Necromancy
+C:a:k:+0:+50:Weaponmastery
+
+C:a:N:Druid
+C:a:D:A priest that serves Yavanna Kementari to protect
+C:a:D:and help the regrowth of nature on Arda.
+C:a:O:21:5:1d1
+C:a:g:Yavanna Kementari
+C:a:k:+0:+300:Prayer
+C:a:k:+0:-600:Necromancy
+C:a:k:+0:+50:Weaponmastery
+C:a:k:+1000:+700:Monster-lore
+C:a:k:+1000:+700:Summoning
+
+C:a:N:Dark-Priest
+C:a:D:A priest that serves Melkor Bauglir to bring chaos
+C:a:D:and destruction to Arda.
+C:a:O:21:5:1d1
+C:a:g:Melkor Bauglir
+C:a:k:+0:+200:Prayer
+C:a:k:+0:+200:Necromancy
+C:a:k:+0:-600:Mindcraft
+C:a:k:+0:+200:Spell-power
+C:a:k:+1000:+1000:Corpse-preservation
+
+C:a:N:Paladin
+C:a:D:A fighting priest that serves Tulkas to bring down
+C:a:D:the empire of fear and shadows of Morgoth.
+C:a:O:23:25:1d1
+C:a:g:Tulkas
+C:a:k:+0:+200:Prayer
+C:a:k:+0:-600:Necromancy
+C:a:k:+0:+100:Weaponmastery
+C:a:k:+0:+100:Combat
+C:a:k:+0:+900:Barehand-combat
+C:a:b:1:Extra Max Blow(1)
+
+C:a:N:Mindcrafter
+C:a:D:A priest who has learned to tap in his own mental powers
+C:a:O:21:5:1d1
+C:a:g:Eru Iluvatar
+C:a:g:Manwe Sulimo
+C:a:g:Tulkas
+C:a:g:Melkor Bauglir
+C:a:g:Yavanna Kementari
+C:a:g:Varda Elentari
+C:a:g:Aule the Smith
+C:a:g:Ulmo
+C:a:g:Mandos
+C:a:k:+0:-300:Prayer
+C:a:k:+0:-200:Necromancy
+C:a:k:+1000:+300:Mindcraft
+C:a:k:+0:+200:Sneakiness
+C:a:k:+0:+100:Magic-Device
+
+C:a:N:Stonewright
+C:a:D:A war-priest of Aule who serves to protect and
+C:a:D:further the works of the Valarin Smith.
+C:a:O:24:8:1d1
+C:a:g:Aule the Smith
+C:a:k:+0:+400:Axe-mastery
+C:a:k:+0:+300:Prayer
+C:a:k:+0:-600:Necromancy
+C:a:k:+0:+100:Spell-power
+C:a:b:10:Extra Max Blow(1)
+
+C:a:N:Priest(Varda)
+C:a:D:A priest who serves Varda to bring light
+C:a:D:to all the reaches of the world.
+C:a:O:21:5:1d1
+C:a:g:Varda Elentari
+C:a:k:+0:+300:Prayer
+C:a:k:+0:-600:Necromancy
+C:a:k:+0:+100:Spell-power
+C:a:k:+0:+400:Archery
+
+C:a:N:Priest(Ulmo)
+C:a:D:A priest that serves Eru Iluvatar to bring down
+C:a:D:the empire of fear and shadows of Morgoth.
+C:a:O:22:5:1d1
+C:a:g:Ulmo
+C:a:k:+0:+400:Polearm-mastery
+C:a:k:+0:+300:Prayer
+C:a:k:+0:-600:Necromancy
+C:a:k:+0:+100:Spell-power
+
+C:a:N:Priest(Mandos)
+C:a:D:A priest that serves Eru Iluvatar to bring down
+C:a:D:the empire of fear and shadows of Morgoth.
+C:a:O:21:5:1d1
+C:a:g:Mandos
+C:a:k:+0:+400:Hafted-mastery
+C:a:k:+0:+300:Prayer
+C:a:k:+0:-600:Necromancy
+C:a:k:+0:+100:Spell-power
+
+###############################TEST###############################
+C:N:30:Test
+C:D:0:Simple testers.
+C:D:1:Rookie
+C:D:1:Soldier
+C:D:1:Mercenary
+C:D:1:Veteran
+C:D:1:Swordsman
+C:D:1:Champion
+C:D:1:Hero
+C:D:1:Baron
+C:D:1:Duke
+C:D:1:Lord
+C:S:5:-2:-2:2:2:-1:0:3
+C:K:10:10:0:1:10:10:10:10
+C:X:0:0:0:0:0:0:0:0
+C:B:6:30:5
+C:C:H:L:9000:2:40
+C:P:9:0
+C:R:30:0
+C:F:RES_FEAR
+C:E:0:0:0:0:0:0
+C:O:45:38:1d1
+C:O:37:4:1d1
+C:k:+1000:+800:Combat
+C:k:+1000:+850:Weaponmastery
+C:k:+0:+200:Sword-mastery
+C:k:+0:+200:Axe-mastery
+C:k:+0:+200:Hafted-mastery
+C:k:+0:+200:Polearm-mastery
+C:k:+1000:+600:Archery
+C:k:+1000:+900:Sneakiness
+C:k:+1000:+900:Disarming
+C:k:+1000:+300:Magic
+C:k:+0:+550:Antimagic
+
+C:a:N:Shinny test
+C:a:D:Simple testers, they test all with their shiny hacks !
+C:a:O:23:16:1d1
+###############################TEST###############################
+
+
+
+
+
+
+##############################################################################
+##############################################################################
+##############################################################################
+##############################################################################
+# R: Race definition
+# R:N:index:name
+# R:D:race desc
+# R:S:str:int:wis:dex:con:chr:luck
+# R:K:dis:dev:sav:stl:srh:fos:thn:thb
+# R:P:hitdie:xp%:infra:history chart
+# R:M:b_age:m_age:m_b_ht:m_m_ht:m_b_wt:m_m_wt:f_b_ht:f_m_ht:f_b_wt:f_m_wt
+# R:E:weapons:torso:arms:finger:head:legs
+# R:C:allowed classes
+# R:G:race flags
+# R:R:level:pval
+# R:F:flags
+# R:k:value:modifier:skill name
+# R:b:level:ability
+
+I:
+
+R:N:0:Human
+R:D:Humans are the second born, the Edain.
+R:D:They are the basic race to which all others are compared.
+R:D:Average in ability, they can be any class.
+R:S:0:0:0:0:0:0:0
+R:K:0:0:0:0:0:10:0:0
+R:P:10:100:0:1
+R:M:14:6:72:6:180:25:66:4:150:20
+R:E:1:1:1:2:1:1
+R:C:Warrior | Archer | Mage | Rogue | Priest | Loremaster | Pacifist
+
+R:N:1:Half-Elf
+R:D:A crossbreed of elf and human, they get the best of the two races.
+R:S:0:1:1:1:-1:1:0
+R:K:2:3:3:1:6:11:-1:5
+R:P:9:110:2:4
+R:M:24:16:66:6:130:15:62:6:100:10
+R:E:1:1:1:2:1:1
+R:C:Warrior | Archer | Mage | Rogue | Priest | Loremaster | Pacifist
+R:G:ELF
+R:k:+200:+000:Disarming
+R:k:+300:+000:Magic-Device
+R:k:+1500:+000:Spirituality
+R:k:+1000:+000:Stealth
+R:k:+600:+000:Sneakiness
+R:k:-100:+000:Weaponmastery
+R:k:+500:+000:Archery
+
+R:N:2:Elf
+R:D:Elves are the first born, the Eldar.
+R:D:More spiritual than physical beings, they are weaker than humans
+R:D:but are more intelligent.
+R:S:-1:2:2:1:-2:2:0
+R:K:5:6:6:2:8:12:-5:15
+R:P:8:120:3:5
+R:M:75:75:60:4:100:6:54:4:80:6
+R:E:1:1:1:2:1:1
+R:R:1:0
+R:F:RES_LITE |
+R:C:Warrior | Archer | Mage | Priest | Loremaster | Pacifist
+R:G:ELF
+R:k:+500:+000:Disarming
+R:k:+600:+000:Magic-Device
+R:k:+3000:+000:Spirituality
+R:k:+2000:+000:Stealth
+R:k:+800:+000:Sneakiness
+R:k:-500:+000:Weaponmastery
+R:k:+1500:+000:Archery
+
+R:N:3:Hobbit
+R:D:An old but quiet race related to humans.
+R:D:They are small and quite weak but good at many things.
+R:S:-2:2:1:3:2:1:5
+R:K:15:18:18:5:12:15:-10:20
+R:P:7:110:4:10
+R:M:21:12:36:3:60:3:33:3:50:3
+R:E:1:1:1:2:1:0
+R:Z:create food
+R:G:RESIST_BLACK_BREATH | XTRA_MIGHT_SLING |
+R:R:1:0
+R:F:SUST_DEX |
+R:C:Warrior | Archer | Mage | Rogue | Loremaster | Pacifist
+R:k:+0:+300:Sling-mastery
+R:k:+1500:+000:Disarming
+R:k:+1800:+000:Magic-Device
+R:k:+9000:+000:Spirituality
+R:k:+6000:+000:Stealth
+R:k:+1200:+000:Sneakiness
+R:k:-1000:+000:Weaponmastery
+R:k:+2000:+000:Archery
+
+R:N:4:Gnome
+R:D:Related to dwarves, Gnomes are between Dwarves and Hobbits in size.
+R:D:Very good at magic use, they are poor as fighters.
+R:S:-1:2:0:2:1:-2:2
+R:K:10:12:12:3:6:13:-8:12
+R:P:8:135:4:13
+R:M:50:40:42:3:90:6:39:3:75:3
+R:E:1:1:1:2:1:1
+R:Z:blink
+R:R:1:0
+R:F:FREE_ACT |
+R:C:Warrior | Mage | Rogue | Pacifist
+R:k:+1000:+000:Disarming
+R:k:+1200:+000:Magic-Device
+R:k:+6000:+000:Spirituality
+R:k:+3000:+000:Stealth
+R:k:+600:+000:Sneakiness
+R:k:-800:+000:Weaponmastery
+R:k:+1200:+000:Archery
+
+R:N:5:Dwarf
+R:D:The children of Aule, a strong but small race.
+R:D:Miners and fighters of legend.
+R:S:2:-2:2:-2:2:-3:0
+R:K:2:9:10:-1:7:10:15:0
+R:P:11:125:5:16
+R:M:35:15:48:3:150:10:46:3:120:10
+R:E:1:1:1:2:1:1
+R:Z:find secret passages
+R:R:1:0
+R:F:RES_BLIND | LITE1
+R:C:Warrior | Priest | Pacifist
+R:k:+0:+200:Axe-mastery
+R:k:+200:+000:Disarming
+R:k:+900:+000:Magic-Device
+R:k:+5000:+000:Spirituality
+R:k:-1000:+000:Stealth
+R:k:+700:+000:Sneakiness
+R:k:+1500:+000:Weaponmastery
+R:k:+500:+000:Archery
+
+R:N:6:Orc
+R:D:Quite strong but not very smart.
+R:S:2:-1:0:1:1:-4:-3
+R:K:-3:-3:-3:-1:0:7:12:-5
+R:P:10:110:3:25
+R:M:11:4:66:1:150:5:62:1:120:5
+R:E:1:1:1:2:1:1
+R:Z:remove fear
+R:R:1:0
+R:F:RES_DARK |
+R:C:Warrior | Archer | Rogue | Priest
+R:k:-300:+000:Disarming
+R:k:-300:+000:Magic-Device
+R:k:-1000:+000:Spirituality
+R:k:-1000:+000:Stealth
+R:k:+000:+000:Sneakiness
+R:k:+1200:+000:Weaponmastery
+R:k:-500:+000:Archery
+
+R:N:7:Troll
+R:D:They can bear the light of the sun.
+R:D:They are extremely strong and dumb.
+R:S:4:-4:-2:-4:3:-6:-4
+R:K:-5:-8:-8:-2:-1:5:20:-10
+R:P:12:137:3:22
+R:M:20:10:96:10:250:50:84:8:225:40
+R:E:1:1:1:2:1:1
+R:Z:berserk
+R:R:1:0
+R:F:SUST_STR |
+R:R:15:0
+R:F:REGEN |
+R:C:Warrior
+R:k:-500:+000:Disarming
+R:k:-800:+000:Magic-Device
+R:k:-4000:+000:Spirituality
+R:k:-2000:+000:Stealth
+R:k:-100:+000:Sneakiness
+R:k:+2000:+000:Weaponmastery
+R:k:+0:+200:Hafted-mastery
+R:k:-1000:+000:Archery
+
+R:N:8:Dunadan
+R:D:The greatest of the Edain, humans in all respects but
+R:D:stronger, smarter and wiser.
+R:S:1:2:2:2:3:2:2
+R:K:4:5:5:2:3:13:15:10
+R:P:10:180:0:1
+R:M:50:50:82:5:190:20:78:6:180:15
+R:E:1:1:1:2:1:1
+R:R:1:0
+R:F:SUST_CON | REGEN |
+R:C:Warrior | Archer | Mage | Rogue | Priest | Loremaster | Pacifist
+R:k:+400:+000:Disarming
+R:k:+500:+000:Magic-Device
+R:k:+2500:+000:Spirituality
+R:k:+2000:+000:Stealth
+R:k:+800:+000:Sneakiness
+R:k:+1500:+000:Weaponmastery
+R:k:+1000:+000:Archery
+
+R:N:9:High-Elf
+R:D:Elves are the first born, the Eldar.
+R:D:High elves are the best of the Eldar, strong, fast, intellectual, though
+R:D:they sometimes lack wisdom.
+R:S:1:3:2:3:1:5:0
+R:K:4:20:20:4:3:14:10:25
+R:P:10:200:4:7
+R:M:100:30:90:10:190:20:82:10:180:15
+R:E:1:1:1:2:1:1
+R:R:1:0
+R:F:SEE_INVIS |
+R:F:RES_LITE |
+R:G:ELF
+R:C:Warrior | Archer | Mage | Priest | Loremaster | Pacifist
+R:k:+400:+000:Disarming
+R:k:+2000:+000:Magic-Device
+R:k:+10000:+000:Spirituality
+R:k:+4000:+000:Stealth
+R:k:+300:+000:Sneakiness
+R:k:+1000:+000:Weaponmastery
+R:k:+2500:+000:Archery
+
+R:N:10:Half-Ogre
+R:D:A crossbreed between a human and an ogre.
+R:D:They are similar to half-trolls, strong and dumb.
+R:S:3:-1:-1:-1:3:-3:-2
+R:K:-3:-5:-5:-2:-1:5:20:0
+R:P:12:130:3:74
+R:M:40:10:92:10:255:60:80:8:235:60
+R:E:1:1:1:2:1:1
+R:Z:set explosive rune
+R:R:1:0
+R:F:SUST_STR | RES_DARK |
+R:C:Warrior | Priest | Pacifist
+R:k:-300:+000:Disarming
+R:k:-500:+000:Magic-Device
+R:k:-2500:+000:Spirituality
+R:k:-2000:+000:Stealth
+R:k:-100:+000:Sneakiness
+R:k:+2000:+000:Weaponmastery
+R:k:+000:+000:Archery
+
+R:N:11:Beorning
+R:D:A race of men shapeshifters.
+R:D:They have the unique power of being able to polymorph to bear forms.
+R:S:4:-2:-2:-1:3:-5:1
+R:K:-6:-8:-6:-2:-1:5:25:5
+R:P:12:150:3:75
+R:M:40:10:100:10:255:65:80:10:240:64
+R:E:1:1:1:2:1:1
+R:Z:turn into a bear
+R:R:1:0
+R:F:SUST_STR |
+R:R:20:1
+R:F:STR |
+R:C:Warrior | Rogue | Loremaster
+R:k:+1000:+1000:Bearform-combat
+R:k:-600:+000:Disarming
+R:k:-800:+000:Magic-Device
+R:k:-3000:+000:Spirituality
+R:k:-2000:+000:Stealth
+R:k:-100:+000:Sneakiness
+R:k:+2500:+000:Weaponmastery
+R:k:+500:+000:Archery
+
+### Druedain - replace Kobolds in Theme
+
+R:N:12:Druadan
+R:D:Druedain are an ancient branch of the race of Men.
+R:D:Wiser and quicker than the Edain, but weaker and less intelligent.
+R:D:Not as pretty as their common human cousins, but sturdier.
+R:S:-2:-3:2:3:2:-2:1
+R:K:5:0:0:5:15:15:0:5
+R:P:9:115:0:82
+R:M:14:6:65:6:162:25:58:4:145:20
+R:E:1:1:1:2:1:1
+R:Z:poison dart
+R:R:1:0
+R:F:RES_POIS |
+R:C:Warrior | Archer | Rogue | Loremaster | Pacifist
+R:k:+0:+250:Boomerang-mastery
+R:k:-200:+000:Disarming
+R:k:-300:+000:Magic-Device
+R:k:-1000:+000:Spirituality
+R:k:+1000:+000:Stealth
+R:k:+100:+000:Sneakiness
+R:k:+1000:+000:Weaponmastery
+R:k:+800:+000:Archery
+
+R:N:13:Petty-Dwarf
+R:D:A nearly extinct subrace of dwarves.
+R:D:They prefer to live in the darkness.
+R:S:1:-1:2:0:2:-4:-5
+R:K:3:5:10:1:5:10:9:0
+R:P:11:135:5:87
+R:M:40:12:43:3:92:6:40:3:78:3
+R:E:1:1:1:2:1:1
+R:Z:detect doors and traps
+R:R:1:0
+R:F:RES_DARK | RES_DISEN | LITE1
+R:C:Warrior | Rogue
+R:k:+300:+000:Disarming
+R:k:+500:+000:Magic-Device
+R:k:+5000:+000:Spirituality
+R:k:+1000:+000:Stealth
+R:k:+500:+000:Sneakiness
+R:k:+000:+000:Weaponmastery
+R:k:+000:+000:Archery
+
+R:N:14:Dark-Elf
+R:D:Elves are the first born, the Eldar.
+R:D:Dark elves are rare on Middle-earth and even though not evil
+R:D:they are not good.
+R:S:-1:3:2:2:-2:1:-2
+R:K:5:15:20:3:8:12:-5:10
+R:P:9:150:5:69
+R:M:75:75:60:4:100:6:54:4:80:6
+R:E:1:1:1:2:1:1
+R:Z:magic missile
+R:R:1:0
+R:F:RES_DARK |
+R:R:20:0
+R:F:SEE_INVIS |
+R:C:Warrior | Archer | Mage | Rogue | Priest
+R:G:ELF
+R:k:+0:+200:Magic
+R:k:+500:+000:Disarming
+R:k:+1500:+000:Magic-Device
+R:k:+10000:+000:Spirituality
+R:k:+3000:+000:Stealth
+R:k:+800:+000:Sneakiness
+R:k:-500:+000:Weaponmastery
+R:k:+1000:+000:Archery
+
+R:N:15:Ent
+R:D:Guardian of the forests of Middle-earth, summoned by Yavanna before
+R:D:even the elves awoke. It is said 'Trolls are strong, Ents are STRONGER'.
+R:S:10:-3:2:-5:11:-3:-2
+R:K:5:5:20:-6:5:4:15:5
+R:P:14:210:5:95
+R:M:255:70:72:6:100:25:66:4:100:20
+R:E:1:1:1:2:1:1
+R:Z:grow trees
+R:G:NO_STUN | NO_FOOD |
+R:G:AC_LEVEL |
+R:R:1:-5
+R:F:SPEED | SENS_FIRE | SLOW_DIGEST | RES_POIS
+R:R:5:0
+R:F:SEE_INVIS |
+R:R:20:0
+R:F:ESP_ORC |
+R:F:ESP_TROLL | ESP_EVIL |
+R:C:Warrior | Priest | Loremaster | Pacifist
+R:O:70:32:2d3
+R:b:1:Tree walking
+R:k:+0:+200:Barehand-combat
+R:k:+0:+600:Boulder-throwing
+R:k:+500:+000:Disarming
+R:k:+500:+000:Magic-Device
+R:k:+10000:+000:Spirituality
+R:k:-6000:+000:Stealth
+R:k:+500:+000:Sneakiness
+R:k:-300:+000:Weaponmastery
+R:k:-200:+000:Archery
+
+R:N:16:RohanKnight
+R:D:Humans from the land of Rohan, riding the great Mearas.
+R:D:Fast and powerful in battle.
+R:S:4:-2:3:1:4:2:0
+R:K:10:5:5:-8:1:1:5:5
+R:P:10:220:0:84
+R:M:20:3:60:3:80:4:54:3:70:4
+R:E:1:1:1:2:1:1
+R:Z:Rohan Knight's Powers
+R:R:1:3
+R:F:SPEED |
+R:R:5:1
+R:F:SPEED |
+R:R:10:1
+R:F:SPEED |
+R:R:15:1
+R:F:SPEED |
+R:R:20:1
+R:F:SPEED |
+R:R:25:1
+R:F:SPEED |
+R:R:30:1
+R:F:SPEED |
+R:R:35:1
+R:F:SPEED |
+R:R:40:1
+R:F:SPEED |
+R:R:45:1
+R:F:SPEED |
+R:C:Warrior | Priest | Pacifist
+R:k:+1000:+000:Disarming
+R:k:+500:+000:Magic-Device
+R:k:+2500:+000:Spirituality
+R:k:-8000:+000:Stealth
+R:k:+100:+000:Sneakiness
+R:k:+100:+200:Weaponmastery
+R:k:+500:+000:Archery
+
+### Eagles - replace Thunderlords
+
+R:N:17:Eagle
+R:D:A Great Eagle of Manwe, his most faithful servant.
+R:D:They have been given many gifts from their master.
+R:S:6:2:1:-2:3:6:4
+R:K:6:0:10:-16:30:10:0:0
+R:P:12:300:5:89
+R:M:14:6:180:6:255:25:150:4:230:20
+R:E:0:1:0:4:1:1
+R:R:1:0
+R:F:FEATHER | FLY
+R:R:4:0
+R:F:ESP_DRAGON |
+R:R:5:0
+R:F:RES_ELEC |
+R:R:10:0
+R:F:RES_COLD |
+R:R:15:0
+R:F:RES_ACID |
+R:R:17:0
+R:F:RES_FIRE |
+R:R:35:0
+R:F:RES_POIS |
+R:R:45:0
+R:F:IM_ELEC |
+R:R:50:0
+R:F:CLIMB
+R:k:+1000:+300:Barehand-combat
+R:C:Loremaster | Mage | Priest | Pacifist
+R:k:+600:+000:Disarming
+R:k:+000:+000:Magic-Device
+R:k:+5000:+000:Spirituality
+R:k:-16000:+000:Stealth
+R:k:+3000:+000:Sneakiness
+
+### Base race characteristics tweaked from Annals of Ea for Theme.
+
+R:N:18:Dragon
+R:D:One of Morgoth's favourite pets.
+R:D:Very strong and smart, but unstealthy.
+R:D:They cannot play instruments or wield weapons.
+# R:S:str:int:wis:dex:con:chr:luck
+R:S:3:2:2:-2:2:-5:-2
+R:K:5:5:5:-10:5:5:5:-20
+R:P:9:250:5:100
+R:M:50:150:200:-200:80:120:54:-50:100:60
+# R:E:weapons:torso:arms:finger:head:legs
+R:E:0:1:0:6:1:1
+R:R:1:0
+R:k:=0:=0:Weaponmastery
+R:k:+0:+400:Barehand-combat
+R:k:=0:=0:Geomancy
+R:F:FLY
+R:C:Loremaster | Mage | Priest | Pacifist
+#R:G:EVIL
+R:k:+1000:+000:Disarming
+R:k:+500:+000:Magic-Device
+R:k:-4000:+000:Spirituality
+R:k:-10000:+000:Stealth
+R:k:+000:+000:Sneakiness
+
+R:N:19:Yeek
+R:D:The weakest of all the races, bad at everything except gaining levels quickly.
+R:S:-5:-5:-5:-5:-5:-5:-5
+R:K:-5:-5:-10:0:-5:0:-10:-10
+R:P:6:25:2:29
+R:M:10:4:40:5:50:10:35:4:45:10
+R:E:1:1:1:2:1:1
+R:C:Warrior | Archer | Mage | Rogue | Priest | Loremaster | Pacifist
+R:k:-500:+000:Disarming
+R:k:-500:+000:Magic-Device
+R:k:-2500:+000:Spirituality
+R:k:-5000:+000:Stealth
+R:k:-500:+000:Sneakiness
+R:k:-500:+000:Weaponmastery
+R:k:-500:+000:Archery
+
+### Wood-Elves tweaked in Theme.
+
+R:N:20:Wood-Elf
+R:D:Elves are the first born, the Eldar.
+R:D:Wood Elves live in the great forests of Middle-earth.
+R:D:They are more dangerous but less wise than High Elves.
+R:S:2:2:-3:5:0:1:0
+R:K:5:6:6:5:8:12:-5:40
+R:P:7:130:4:5
+R:M:75:75:60:4:100:6:54:4:80:6
+R:E:1:1:1:2:1:1
+R:G:XTRA_MIGHT_BOW |
+R:R:1:1
+R:F:XTRA_MIGHT | RES_LITE |
+R:C:Warrior | Archer | Mage | Priest | Loremaster | Pacifist
+R:G:ELF
+R:k:+0:+200:Archery
+R:b:1:Tree walking
+R:k:+500:+000:Disarming
+R:k:+600:+000:Magic-Device
+R:k:+3000:+000:Spirituality
+R:k:+5000:+000:Stealth
+R:k:+800:+000:Sneakiness
+R:k:+1000:+000:Weaponmastery
+R:k:+4000:+000:Archery
+
+### Maiar heavily tweaked in Theme
+
+R:N:21:Maia
+R:D:An old race, dating from before the creation of Arda, the Maiar were
+R:D:created by Eru to help the Valar in their task.
+R:S:0:0:0:0:0:0:4
+R:K:0:0:0:0:0:10:0:0
+R:P:10:100:0:91
+R:M:14:6:72:6:180:25:66:4:150:20
+R:E:1:1:1:2:1:1
+R:G:NO_GOD
+R:R:20:0
+R:F:DRAIN_EXP |
+R:R:6:1
+R:F:STR | INT | WIS | DEX | CON | CHR |
+R:R:12:1
+R:F:STR | INT | WIS | DEX | CON | CHR |
+R:R:18:1
+R:F:STR | INT | WIS | DEX | CON | CHR |
+R:R:24:1
+R:F:STR | INT | WIS | DEX | CON | CHR |
+R:R:30:1
+R:F:STR | INT | WIS | DEX | CON | CHR |
+R:R:36:1
+R:F:STR | INT | WIS | DEX | CON | CHR |
+R:R:42:1
+R:F:STR | INT | WIS | DEX | CON | CHR |
+R:R:48:1
+R:F:STR | INT | WIS | DEX | CON | CHR |
+R:C:Warrior | Archer | Mage | Pacifist
+R:k:+000:+000:Disarming
+R:k:+000:+000:Magic-Device
+R:k:+000:+000:Spirituality
+R:k:=0:=0:Prayer
+R:k:+000:+000:Stealth
+R:k:+000:+000:Sneakiness
+R:k:+000:+000:Weaponmastery
+R:k:+000:+000:Archery
+
+### Easterling -- new race added in Theme.
+
+R:N:22:Easterling
+R:D:The humans of the Southeast, servants of the Dark.
+R:D:They are traditional masters of many combat skills.
+R:D:Fanatical warriors, they do not trust magic.
+R:S:2:-2:-2:-2:2:-1:-1
+R:K:0:-5:-1:0:0:10:5:5
+R:P:10:140:0:105
+R:M:14:6:72:6:180:25:66:4:150:20
+R:E:1:1:1:2:1:1
+R:C:Warrior | Archer
+R:G:XTRA_MIGHT_XBOW | NO_STUN
+R:R:5:0
+R:F:FREE_ACT
+R:R:15:0
+R:F:RES_CONF
+R:k:+1000:+100:Combat
+R:k:+500:+100:Weaponmastery
+R:k:+0:+200:Sword-mastery
+R:k:+0:+200:Axe-mastery
+R:k:+0:+200:Hafted-mastery
+R:k:+0:+200:Polearm-mastery
+R:k:+2000:+200:Archery
+R:k:+1000:+300:Sneakiness
+R:k:+1000:+200:Stealth
+R:k:+1000:+200:Disarming
+R:k:=0:=0:Magic
+R:k:=0:=0:Magic-Device
+R:k:=0:=0:Spell-power
+R:k:+2500:+300:Spirituality
+
+### Demon -- new race added in Theme
+
+R:N:23:Demon
+R:D:Demons (Roeg) are minor servants of the Dark,
+R:D:they were once natural creatures and have been
+R:D:corrupted by Melkor to serve his ends.
+# They all get an inherent CHR penalty, other stats depend on subrace.
+R:S:0:0:0:0:0:-1:0
+# Again, here everything depends on subrace
+R:K:0:0:0:0:0:0:0:0
+R:P:10:170:3:109
+R:M:14:6:72:6:180:25:66:4:150:20
+# Everything at zero here, depends on type of demon.
+R:E:0:0:0:0:0:0
+R:C:Warrior | Archer | Mage | Rogue | Priest | Loremaster
+R:G:CORRUPT
+R:F:RES_FEAR | HOLD_LIFE | RES_DARK
+R:Z:spear of darkness
+R:k:+500:+000:Disarming
+R:k:+050:+000:Magic-Device
+R:k:-5000:+000:Spirituality
+R:k:+000:+000:Stealth
+R:k:+000:+000:Sneakiness
+R:k:+000:+000:Weaponmastery
+R:k:+000:+000:Archery
+
+##############################################################################
+##############################################################################
+##############################################################################
+##############################################################################
+# S: Subrace definition
+# S:N:index:name
+# S:D:'A'fter/'B'efore:subrace desc
+# S:S:str:int:wis:dex:con:chr:luck:mana
+# S:K:dis:dev:sav:stl:srh:fos:thn:thb
+# S:P:hitdie:xp%:infra
+# S:M:b_age:m_age:m_b_ht:m_m_ht:m_b_wt:m_m_wt:f_b_ht:f_m_ht:f_b_wt:f_m_wt
+# S:E:weapons:torso:arms:finger:head:legs
+# S:A:allowed races
+# S:C:'A'llow/'F'orbid:allowed/forbiden classes
+# S:G:subrace flags
+# S:R:level:pval
+# S:F:flags
+# S:k:value:modifier:skill name
+# S:b:level:ability
+
+# Make the parser actually work :)
+I:
+
+S:N:0:
+S:D:A:A normal member of the race.
+S:S:0:0:0:0:0:0:0:100
+S:K:0:0:0:0:0:0:0:0
+S:P:0:0:0
+S:M:0:0:0:0:0:0:0:0:0:0
+S:E:0:0:0:0:0:0
+S:A:Human | Half-Elf | Elf | Hobbit | Gnome | Dwarf |
+S:A:Orc | Troll | Dunadan | High-Elf | Half-Ogre | Beorning |
+S:A:Druadan | Petty-Dwarf | Dark-Elf | Ent | RohanKnight | Eagle |
+S:A:Yeek | Wood-Elf | Maia | Easterling
+
+# Just a place holder, the actualy setting are done with corruptions, see
+# corrupt.lua and player.lua
+S:N:1:Vampire
+S:D:B:Vampires are powerful undead, wielding great powers. They still fear the
+S:D:B:sunlight and cannot easily satiate their hunger.
+S:S:0:0:0:0:0:0:0:100
+S:K:0:0:0:0:0:0:0:0
+S:P:0:0:0
+S:M:0:0:0:0:0:0:0:0:0:0
+S:E:0:0:0:0:0:0
+S:A:Human | Half-Elf | Hobbit | Gnome | Dwarf | Orc |
+S:A:Troll | Dunadan | Half-Ogre | Beorning | Druadan | Petty-Dwarf |
+S:A:Dark-Elf | RohanKnight | Yeek | Easterling
+S:C:A:Mage
+S:O:70:0:5d3
+S:O:70:32:2d3
+
+S:N:2:Spectre
+S:D:B:Spectres only partially exist in the mortal world and so they can
+S:D:B:pass through walls. They are somewhat physically weak.
+S:S:-5:1:1:2:-3:-6:-3:105
+S:K:2:8:7:2:2:7:-5:-2
+S:P:-4:80:3
+S:M:50:15:0:0:-10:-5:0:0:-10:-5
+S:E:0:0:0:0:0:0
+S:A:Human | Half-Elf | Elf | Hobbit | Gnome | Dwarf |
+S:A:Orc | Troll | Dunadan | High-Elf | Half-Ogre | Beorning | Easterling |
+S:A:Druadan | Petty-Dwarf | Dark-Elf | RohanKnight | Yeek | Wood-Elf |
+S:C:F:Warrior | Archer
+S:G:UNDEAD | NO_CUT | NO_FOOD | SEMI_WRAITH | NO_SUBRACE_CHANGE
+S:R:1:0
+S:F:SEE_INVIS | HOLD_LIFE |
+S:F:SLOW_DIGEST | RES_COLD | RES_POIS | RES_NETHER |
+S:O:70:32:2d3
+S:k:+200:+000:Disarming
+S:k:+800:+000:Magic-Device
+S:k:+700:+000:Spirituality
+S:k:+2000:+000:Stealth
+S:k:+200:+000:Sneakiness
+S:k:-500:+000:Weaponmastery
+S:k:-200:+000:Archery
+
+S:N:3:Skeleton
+S:D:B:Yet an other kind of undead. Their physical 'body' is not very vulnerable
+S:D:B:to sharp things.
+S:S:0:-2:-2:0:1:-4:-3:70
+S:K:-5:-5:5:-1:-1:8:8:0
+S:P:0:45:1
+S:M:50:15:0:0:-10:-5:0:0:-10:-5
+S:E:0:0:0:0:0:0
+S:A:Human | Half-Elf | Elf | Hobbit | Gnome | Dwarf |
+S:A:Orc | Troll | Dunadan | High-Elf | Half-Ogre | Beorning | Easterling |
+S:A:Druadan | Petty-Dwarf | Dark-Elf | RohanKnight | Yeek | Wood-Elf |
+S:G:UNDEAD | NO_CUT | NO_FOOD | NO_SUBRACE_CHANGE
+S:R:1:0
+S:F:SEE_INVIS | HOLD_LIFE |
+S:F:RES_POIS | RES_SHARDS |
+S:R:10:0
+S:F:RES_COLD |
+S:O:70:32:2d3
+S:k:-500:+000:Disarming
+S:k:-500:+000:Magic-Device
+S:k:+500:+000:Spirituality
+S:k:-1000:+000:Stealth
+S:k:-100:+000:Sneakiness
+S:k:+800:+000:Weaponmastery
+S:k:+000:+000:Archery
+
+S:N:4:Zombie
+S:D:B:Strong and dumb is a zombie.
+S:S:2:-6:-6:1:4:-5:-4:70
+S:K:-2:-2:5:-1:-1:2:5:0
+S:P:3:45:1
+S:M:50:15:0:0:0:0:0:0:0:0
+S:E:0:0:0:0:0:0
+S:A:Human | Half-Elf | Elf | Hobbit | Gnome | Dwarf |
+S:A:Orc | Troll | Dunadan | High-Elf | Half-Ogre | Beorning | Easterling |
+S:A:Druadan | Petty-Dwarf | Dark-Elf | RohanKnight | Yeek | Wood-Elf |
+S:C:F:Mage
+S:G:UNDEAD | NO_FOOD | NO_SUBRACE_CHANGE
+S:R:1:0
+S:F:SEE_INVIS | HOLD_LIFE |
+S:F:SLOW_DIGEST | RES_POIS |
+S:R:5:0
+S:F:RES_COLD |
+S:O:70:32:2d3
+S:k:-200:+000:Disarming
+S:k:-200:+000:Magic-Device
+S:k:+500:+000:Spirituality
+S:k:-1000:+000:Stealth
+S:k:-100:+000:Sneakiness
+S:k:+500:+000:Weaponmastery
+S:k:+000:+000:Archery
+
+S:N:5:Barbarian
+S:D:A:Hardy members of their race, they are strong fighters but poor spellcasters.
+S:S:2:-3:-2:1:1:-3:1:50
+S:K:-2:-10:2:-2:0:1:12:5
+S:P:1:25:0
+S:M:0:0:0:0:0:0:0:0:0:0
+S:E:0:0:0:0:0:0
+S:A:Human | Dwarf | Orc | Troll | Half-Ogre | Beorning | Druadan | Easterling
+S:C:F:Mage
+S:R:10:0
+S:F:RES_FEAR |
+S:k:-200:+000:Disarming
+S:k:-1000:+000:Magic-Device
+S:k:+200:+000:Spirituality
+S:k:-2000:+000:Stealth
+S:k:+000:+000:Sneakiness
+S:k:+1200:+000:Weaponmastery
+S:k:+500:+000:Archery
+
+S:N:6:Hermit
+S:D:A:Through years of isolation hermits can manage to increase their mana
+S:D:A:reserves but at the cost of an increased physical weakness.
+S:S:-3:1:1:-3:-3:1:0:120
+S:K:5:10:5:3:4:10:-5:-5
+S:P:-3:20:1
+S:M:0:0:0:0:0:0:0:0:0:0
+S:E:0:0:0:0:0:0
+S:A:Human | Half-Elf | Elf | Hobbit | Gnome | Dwarf |
+S:A:Dunadan | High-Elf | Petty-Dwarf | Dark-Elf | Ent | RohanKnight |
+S:A:Eagle | Yeek | Wood-Elf | Maia |
+S:C:F:Warrior | Archer
+S:k:+500:+000:Disarming
+S:k:+1000:+000:Magic-Device
+S:k:+500:+000:Spirituality
+S:k:+3000:+000:Stealth
+S:k:+400:+000:Sneakiness
+S:k:-500:+000:Weaponmastery
+S:k:-500:+000:Archery
+
+S:N:8:LostSoul
+S:D:A:In some very rare occasions souls can come back from the Halls of Mandos.
+S:S:0:0:0:0:0:0:0:100
+S:K:0:0:0:0:0:0:0:0
+S:P:0:0:0
+S:M:0:0:0:0:0:0:0:0:0:0
+S:E:0:0:0:0:0:0
+S:G:ASTRAL | NO_SUBRACE_CHANGE
+S:R:1:0
+S:F:SEE_INVIS
+S:A:Half-Elf | Elf | High-Elf | Dark-Elf | Wood-Elf | Maia |
+S:A:Hobbit | Gnome | Dwarf | Petty-Dwarf | Ent | Eagle |
+S:O:70:32:25d2
+S:O:70:12:25d3
+
+# Used for corruptions that can change your subrace
+S:N:9:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+S:D:A:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+S:S:0:0:0:0:0:0:0:100
+S:K:0:0:0:0:0:0:0:0
+S:P:0:0:0
+S:M:0:0:0:0:0:0:0:0:0:0
+S:E:0:0:0:0:0:0
+
+### Dragon subraces added for Theme
+
+S:N:10:Red
+S:D:B:These majestic creatures are surrounded by a furious blaze.
+S:D:B:They are especially resistant to fire and with time learn
+S:D:B:to resist its effects entirely. They are stronger than other
+S:D:B:dragons and can prevent attacks from sapping their strength.
+S:S:3:0:0:0:0:0:0:100
+S:K:0:0:0:0:-2:2:5:0
+S:P:0:0:1
+S:M:0:0:0:0:0:0:0:0:0:0
+S:E:0:0:0:0:0:0
+S:A:Dragon
+S:C:F:Warrior | Archer
+S:G:NO_SUBRACE_CHANGE
+S:R:1:0
+S:F:SUST_STR | SH_FIRE | RES_FIRE
+S:R:5:1
+S:F:STR
+S:R:10:1
+S:F:STR
+S:R:15:1
+S:F:STR
+S:R:20:1
+S:F:STR
+S:R:30:1
+S:F:STR
+S:R:40:1
+S:F:STR
+S:R:45:0
+S:F:IM_FIRE
+S:R:50:1
+S:F:STR | CLIMB
+S:Z:fire breath
+S:k:+1000:+600:Fire
+
+S:N:11:Black
+S:D:B:The hide of these dragons glistens with droplets of viscous
+S:D:B:liquid. They are especially resistant to acid and with time
+S:D:B:will come to resist its effects entirely. They look more
+S:D:B:beautiful than other dragons and are expert at protecting that.
+S:S:0:0:0:0:0:3:0:100
+S:K:2:0:1:0:0:0:0:0
+S:P:0:0:0
+S:M:0:0:0:0:0:0:0:0:0:0
+S:E:0:0:0:0:0:0
+S:A:Dragon
+S:C:F:Archer | Warrior
+S:G:NO_SUBRACE_CHANGE
+S:R:1:0
+S:F:SUST_CHR | | RES_ACID
+S:R:5:1
+S:F:CHR
+S:R:10:1
+S:F:CHR
+S:R:15:1
+S:F:CHR
+S:R:20:1
+S:F:CHR
+S:R:30:1
+S:F:CHR
+S:R:40:1
+S:F:CHR
+S:R:45:0
+S:F:IM_ACID
+S:R:50:1
+S:F:CHR | CLIMB
+S:Z:spit acid
+S:k:+1000:+600:Water
+
+S:N:12:Green
+S:D:B:The entire forms of these creatures give off sickly greenish.
+S:D:B:vapours. They are especially resistant to poison and resist
+S:D:B:poison attacks exceptionally well. They are healthier and sturdier
+S:D:B:than other dragons and are not as susceptible to diseases.
+S:S:0:0:0:0:3:0:0:100
+S:K:0:0:2:0:0:0:0:0
+S:P:0:0:0
+S:M:0:0:0:0:0:0:0:0:0:0
+S:E:0:0:0:0:0:0
+S:A:Dragon
+S:C:F:Archer | Warrior
+S:G:NO_SUBRACE_CHANGE
+S:R:1:0
+S:F:SUST_CON | RES_POIS
+S:R:5:1
+S:F:CON
+S:R:10:1
+S:F:CON
+S:R:15:1
+S:F:CON
+S:R:20:1
+S:F:CON
+S:R:30:1
+S:F:CON
+S:R:40:1
+S:F:CON
+S:R:50:1
+S:F:CON | CLIMB
+S:Z:poison dart
+S:k:+1000:+600:Air
+
+S:N:13:Blue
+S:D:B:These enormous creatures are wreathed in living lightning.
+S:D:B:They are especially nimble and agile, and their dexterity
+S:D:B:is not sapped easily.
+S:S:0:0:0:3:0:0:0:100
+S:K:3:0:0:2:1:0:0:0
+S:P:0:0:1
+S:M:0:0:0:0:0:0:0:0:0:0
+S:E:0:0:0:0:0:0
+S:A:Dragon
+S:C:F:Archer | Warrior
+S:G:NO_SUBRACE_CHANGE
+S:R:1:0
+S:F:SUST_DEX | RES_ELEC | SH_ELEC
+S:R:5:1
+S:F:DEX
+S:R:10:1
+S:F:DEX
+S:R:15:1
+S:F:DEX
+S:R:20:1
+S:F:DEX
+S:R:30:1
+S:F:DEX
+S:R:40:1
+S:F:DEX
+S:R:45:0
+S:F:IM_ELEC
+S:R:50:1
+S:F:DEX | CLIMB
+S:Z:dazzle
+S:k:+1000:+600:Earth
+
+S:N:14:White
+S:D:B:These enormous dragons look like they'd been hewed from ice.
+S:D:B:They are the most cunning and calculating among their kind,
+S:D:B:and attacks against their intelligence are unlikely to succeed.
+S:S:0:3:0:0:0:0:0:100
+S:K:0:2:0:0:0:0:0:0
+S:P:0:0:0
+S:M:0:0:0:0:0:0:0:0:0:0
+S:E:0:0:0:0:0:0
+S:A:Dragon
+S:C:F:Archer | Warrior
+S:G:NO_SUBRACE_CHANGE
+S:R:1:0
+S:F:SUST_INT | RES_COLD | SENS_FIRE
+S:R:5:1
+S:F:INT
+S:R:10:1
+S:F:INT
+S:R:15:1
+S:F:INT
+S:R:20:1
+S:F:INT
+S:R:30:1
+S:F:INT
+S:R:40:1
+S:F:INT
+S:R:45:0
+S:F:IM_COLD
+S:R:50:1
+S:F:INT | CLIMB
+S:Z:cold breath
+S:k:+1000:+600:Divination
+
+S:N:15:Ethereal
+S:D:B:These dragons' body surfaces seem to be in constant flux.
+S:D:B:They are powerful undead beings and are thus wiser than other
+S:D:B:dragons. Wisdom-sapping and life-draining attacks are not
+S:D:B:very effective against them.
+S:S:0:0:3:0:0:0:0:100
+S:K:0:0:1:5:2:2:0:0
+S:P:0:0:3
+S:M:0:0:0:0:0:0:0:0:0:0
+S:E:0:0:0:0:0:0
+S:A:Dragon
+S:C:F:Archer | Warrior
+S:G:NO_SUBRACE_CHANGE | UNDEAD | SEMI_WRAITH
+S:R:1:0
+S:F:SUST_WIS | HOLD_LIFE
+S:R:5:1
+S:F:WIS
+S:R:10:1
+S:F:WIS
+S:R:15:1
+S:F:WIS
+S:R:20:1
+S:F:WIS
+S:R:30:1
+S:F:WIS
+S:R:40:1
+S:F:WIS
+S:R:50:1
+S:F:WIS | CLIMB
+S:Z:chaos breath
+S:k:+1000:+600:Meta
+
+### Demon subraces for Theme module
+
+S:N:16:(Narrog)
+S:D:A:These ratlike demons have fangs that drip with venom,
+S:D:A:quick, scurrying feet, and winglike appendages on their
+S:D:A:slick, black backs. They are somewhat weak and sickly,
+S:D:A:but sly, cunning, and agile.
+S:S:-1:1:1:1:-1:-2:0:100
+S:K:2:0:1:2:2:20:0:0
+S:P:1:20:1
+S:M:14:6:72:6:180:25:66:4:150:20
+S:E:1:1:1:2:1:1
+S:A:Demon
+S:C:F:Priest
+S:G:NO_SUBRACE_CHANGE
+S:R:1:0
+S:F:RES_POIS
+S:R:10:2
+S:F:SPEED
+S:R:30:2
+S:F:SPEED
+S:R:45:0
+S:F:FLY
+S:R:50:2
+S:F:SPEED
+S:Z:poison dart
+R:k:-200:+000:Weaponmastery
+R:k:+1000:+300:Archery
+R:k:+1000:+000:Sneakiness
+R:k:+500:+200:Disarming
+S:k:+1000:+500:Stealth
+R:k:+050:+000:Magic-Device
+S:k:+0:+200:Magic
+S:k:+1000:+300:Conveyance
+R:k:-500:+000:Spirituality
+
+S:N:17:(Aewrog)
+S:D:A:These birdlike demons' wings flap with blinding speed.
+S:D:A:They are somewhat physically weak, but may befuddle enemies
+S:D:A:so that they believe they'd never seen anything so beautiful.
+S:S:-2:0:0:0:0:+3:0:100
+S:K:0:0:1:-2:0:10:0:0
+S:P:1:0:1
+S:M:14:6:72:6:180:25:66:4:150:20
+# R:E:weapons:torso:arms:finger:head:legs
+S:E:0:1:2:4:1:1
+S:A:Demon
+S:C:F:Warrior | Archer | Priest
+S:G:NO_SUBRACE_CHANGE
+S:R:1:0
+S:F:SUST_CHR | FLY
+S:R:5:0
+S:F:FREE_ACT
+S:R:10:0
+S:F:RES_FIRE
+S:R:50:0
+S:F:CLIMB
+R:k:-400:+000:Weaponmastery
+R:k:+000:+300:Archery
+R:k:+1000:+000:Sneakiness
+R:k:+500:+100:Disarming
+S:k:+500:+200:Stealth
+S:k:+0:+200:Magic
+S:k:+1000:+300:Mind
+S:Z:dazzle
+
+S:N:18:(Hurog)
+S:D:A:These doglike demons are one of the lowest forms of Morgoth's
+S:D:A:corrupted races, though their sense of smell is uncanny, and
+S:D:A:increases with experience.
+S:S:-1:0:0:0:-1:0:0:100
+S:K:2:0:2:0:5:30:0:0
+S:P:0:-10:2
+S:M:14:6:72:6:180:25:66:4:150:20
+S:E:1:1:1:2:1:1
+S:A:Demon
+S:C:F:Priest
+S:G:NO_SUBRACE_CHANGE
+S:R:5:0
+S:F:ESP_ANIMAL
+S:R:10:1
+S:F:ESP_ORC | SEARCH
+S:R:15:0
+S:F:ESP_TROLL
+S:R:20:1
+S:F:ESP_DRAGON | SEARCH
+S:R:25:0
+S:F:ESP_UNDEAD
+S:R:30:1
+S:F:ESP_NONLIVING | SEARCH
+S:R:35:0
+S:F:ESP_EVIL
+S:R:40:1
+S:F:ESP_GOOD | SEARCH
+S:R:45:0
+S:F:ESP_DEMON
+S:R:50:1
+S:F:ESP_ALL | SEARCH
+S:Z:smell monsters
+S:Z:smell metal
+R:k:+500:+300:Stealth
+R:k:+500:+200:Sneakiness
+R:k:+000:+000:Weaponmastery
+R:k:+000:+000:Archery
+
+S:N:19:(Sarnrog)
+S:D:A:Medium-sized winged humanoids that look like living stone.
+S:D:A:They are clumsy and dumb, but very strong and stout, and
+S:D:A:resist the elements fairly well.
+S:S:2:-1:-2:-2:2:-1:0:100
+# S:K:dis:dev:sav:stl:srh:fos:thn:thb
+S:K:-1:0:0:-8:-2:-10:5:0
+S:P:2:20:0
+S:M:14:6:72:6:180:25:66:4:150:20
+S:E:1:1:1:2:1:1
+S:A:Demon
+S:C:F:Priest | Mage
+S:G:NO_SUBRACE_CHANGE | NO_STUN
+S:R:1:0
+S:F:RES_POIS
+S:R:10:1
+S:F:RES_FIRE | TUNNEL
+S:R:20:1
+S:F:RES_ACID | TUNNEL
+S:R:30:1
+S:F:RES_ELEC | TUNNEL
+S:R:40:1
+S:F:RES_COLD | TUNNEL
+S:R:45:1
+S:F:RES_SHARDS | TUNNEL
+S:R:50:1
+S:F:RES_SOUND | TUNNEL
+S:k:+1000:+500:Boulder-throwing
+S:Z:eat rock
+R:k:-800:+000:Stealth
+R:k:-500:+000:Sneakiness
+R:k:-500:+000:Archery
+
+S:N:20:(Caborrog)
+S:D:A:Among the foulest of Morgoth's servants, these froglike
+S:D:A:demons are fast and smart, but not very strong or stealthy.
+S:D:A:As a result of their corruption, they develop a strange
+S:D:A:protective layer around them as they mature.
+S:S:-1:2:1:0:0:-3:0:100
+# S:K:dis:dev:sav:stl:srh:fos:thn:thb
+S:K:0:0:1:-10:2:10:0:0
+S:P:2:10:0
+S:M:14:6:72:6:180:25:66:4:150:20
+S:E:1:1:1:2:1:1
+S:A:Demon
+S:C:F:Archer | Priest
+S:G:NO_SUBRACE_CHANGE | NO_STUN | AC_LEVEL
+S:R:1:0
+S:F:RES_POIS
+S:R:1:7
+S:F:SPEED
+S:R:10:2
+S:F:INT
+S:R:30:2
+S:F:INT
+S:R:50:2
+S:F:INT
+S:k:+1000:+400:Dodging
+S:k:+0:+200:Magic
+S:k:+0:+300:Conveyance
+S:k:+0:+300:Temporal
+S:Z:panic hit
+R:k:-1000:+000:Stealth
+R:k:-500:+000:Sneakiness
+
+S:N:21:(Draugrog)
+S:D:A:These doglike demons are of a higher order than the Huroeg,
+S:D:A:they learn more quickly and have more sophisticated magical
+S:D:A:powers. Their arrogant snarling, however, makes them quite
+S:D:A:unstealthy.
+S:S:1:1:1:1:1:-1:0:100
+S:K:2:0:2:-20:5:30:0:0
+S:P:0:-20:2
+S:M:14:6:72:6:180:25:66:4:150:20
+S:E:1:1:1:2:1:1
+S:A:Demon
+S:C:F:Priest
+S:G:NO_SUBRACE_CHANGE
+S:R:4:0
+S:F:ESP_ANIMAL
+S:R:8:1
+S:F:ESP_ORC | SEARCH
+S:R:12:0
+S:F:ESP_TROLL
+S:R:16:1
+S:F:ESP_DRAGON | SEARCH
+S:R:20:0
+S:F:ESP_UNDEAD
+S:R:24:1
+S:F:ESP_NONLIVING | SEARCH
+S:R:28:0
+S:F:ESP_EVIL
+S:R:32:1
+S:F:ESP_GOOD | SEARCH
+S:R:36:0
+S:F:ESP_DEMON
+S:R:40:1
+S:F:ESP_ALL | SEARCH
+S:R:50:0
+S:F:PRECOGNITION
+S:Z:smell monsters
+S:Z:smell metal
+S:k:+0:+200:Magic
+S:k:+0:+200:Spirituality
+S:k:+1000:+500:Mindcraft
+R:k:-10000:+000:Stealth
+R:k:-500:+200:Sneakiness
+R:k:+300:+000:Weaponmastery
+R:k:+200:+000:Archery
+
+### This is Theme's implementation of the Avatar subrace from T-Plus by Ingeborg S. Norden, with obvious limitations.
+
+S:N:22:(Lygrog)
+S:D:A:These slithering snakelike forms lack many physical
+S:D:A:advantages, but are no less deadly for it. Their magical
+S:D:A:abilities, stealth, and cunning are legendary.
+S:S:-3:5:5:5:-1:-6:0:200
+S:K:5:5:5:10:5:50:0:0
+S:P:2:40:3
+S:M:14:6:72:6:180:25:66:4:150:20
+S:E:0:1:0:1:1:0
+S:A:Demon
+S:C:F:Warrior | Archer | Priest | Rogue
+S:G:NO_SUBRACE_CHANGE
+S:R:1:0
+S:F:FEATHER | FREE_ACT | LITE1 | RES_POIS |
+S:R:1:0
+S:F:REGEN | SEE_INVIS | SLOW_DIGEST | SUST_CHR |
+S:R:1:10
+S:F:SPEED |
+S:R:5:0
+S:F:ESP_ANIMAL | RES_FIRE | RES_COLD | SUST_WIS |
+S:R:5:1
+S:F:LUCK | SPEED |
+S:R:10:0
+S:F:ESP_ORC | RES_ELEC | RES_ACID | SUST_INT | WATER_BREATH |
+S:R:10:1
+S:F:LUCK | SPEED |
+S:R:15:0
+S:F:ESP_TROLL | FLY | RES_CONF | RES_LITE | SUST_CON |
+S:R:15:1
+S:F:LUCK | SPEED | SPELL |
+S:R:20:0
+S:F:ESP_DRAGON | ESP_GIANT | LITE2 | RES_BLIND | SUST_DEX |
+S:R:20:1
+S:F:LUCK | SPEED |
+S:R:25:0
+S:F:ESP_UNDEAD | ESP_NONLIVING | RES_DISEN | RES_CHAOS | SUST_STR |
+S:R:25:1
+S:F:LUCK | SPEED |
+S:R:30:0
+S:F:ESP_EVIL | ESP_DEMON | RES_SOUND |
+S:R:30:1
+S:F:LUCK | SPEED | SPELL |
+S:R:35:0
+S:F:CLIMB | ESP_GOOD | ESP_THUNDERLORD | RES_SHARDS |
+S:R:35:1
+S:F:LUCK | SPEED |
+S:R:40:0
+S:F:ESP_UNIQUE | LITE3 | PRECOGNITION | RES_NEXUS | RES_NETHER |
+S:R:40:1
+S:F:LUCK | SPEED |
+S:R:45:0
+S:F:ESP_ALL | IM_ACID | IM_ELEC | IM_FIRE | IM_COLD | MAGIC_BREATH |
+S:R:45:1
+S:F:SPEED | SPELL |
+S:R:50:0
+S:F:IM_NETHER | REFLECT | WRAITH |
+S:R:50:1
+S:F:LUCK | SPEED |
+R:k:+25000:+500:Stealth
+R:k:+2000:+200:Sneakiness
+R:k:+2000:+300:Magic-Device
+
+S:N:23:(Limrog)
+S:D:A:Humanoid creatures with gill slits at the necks,
+S:D:A:they seem to flit in and out of existence.
+S:S:-2:1:1:3:-1:-1:2:150
+# S:K:dis:dev:sav:stl:srh:fos:thn:thb
+S:K:2:2:2:2:2:30:0:0
+S:P:1:50:2
+S:M:14:6:72:6:180:25:66:4:150:20
+S:E:1:1:1:2:1:1
+S:A:Demon
+S:C:F:Priest
+S:G:NO_SUBRACE_CHANGE
+S:R:1:0
+S:F:WATER_BREATH
+S:R:50:0
+S:F:MAGIC_BREATH
+R:k:+3000:+300:Stealth
+R:k:+500:+200:Sneakiness
+R:k:+2000:+200:Disarming
+S:k:+0:+200:Magic
+S:k:+0:+500:Conveyance
+S:k:+0:+500:Temporal
+S:k:+0:+500:Meta
+S:Z:teleport
+S:Z:blink
+S:Z:panic hit
+S:Z:find secret passages
+
+S:N:24:(Rawrog)
+S:D:A:These creatures resemble lions standing on two legs.
+S:D:A:Very strong and smart, they instill fear in all who
+S:D:A:encounter them and are afraid of nothing.
+S:S:2:1:1:-1:2:1:1:100
+S:K:0:0:4:-3:0:10:10:10
+S:P:2:30:0
+S:M:14:6:72:6:180:25:66:4:150:20
+S:E:1:1:1:2:1:1
+S:A:Demon
+S:C:F:Priest | Mage
+S:G:NO_SUBRACE_CHANGE
+S:R:5:0
+S:F:RES_FIRE | RES_COLD
+S:R:10:0
+S:F:RES_ELEC | RES_ACID
+S:R:15:0
+S:F:RES_POIS | RES_CONF
+S:k:+1000:+100:Combat
+S:k:+1000:+100:Weaponmastery
+R:k:+1000:+100:Archery
+R:k:-300:+000:Stealth
+R:k:+500:+200:Sneakiness
+R:k:+500:+100:Disarming
+S:Z:scare monster
+S:Z:berserk
+
+S:N:25:(Adanrog)
+S:D:A:Horrifying humanoids wreathed in flames.
+S:D:A:They can be equally skilled in combat and
+S:D:A:magic; and they can temporarily assume the
+S:D:A:forms of true Balrogs.
+S:S:1:1:1:1:1:1:0:150
+S:K:1:1:1:1:1:20:15:10
+S:P:3:50:2
+S:M:14:6:72:6:180:25:66:4:150:20
+S:E:1:1:1:2:1:1
+S:A:Demon
+S:C:F:Priest | Loremaster | Rogue
+S:G:NO_SUBRACE_CHANGE
+S:R:1:0
+S:F:IM_FIRE | SH_FIRE
+S:k:+0:+300:Combat
+S:k:+0:+300:Magic
+S:Z:turn into a Balrog
+R:k:+1000:+300:Weaponmastery
+R:k:+1000:+300:Archery
+R:k:+1000:+200:Stealth
+R:k:+500:+200:Sneakiness
+R:k:+1000:+200:Disarming
+R:k:+500:+200:Magic
+
+##############################################################################
+##############################################################################
+##############################################################################
+##############################################################################
+# H: Race history
+# H:index:chance:chart:next chart:social class bonus:desc
+
+# Dunadan, Human: 1 -> 2 -> 3 -> 50 -> 51 -> 52 -> 53.
+# RohanKnight: 84 -> 85 -> 50 -> 51 -> 52 -> 53.
+# Half-Ogre: 74 -> 20 -> 2 -> 3 -> 50 -> 51 -> 52 -> 53.
+# Beorning: 75 -> 76 -> 20 -> 2 -> 3 -> 50 -> 51 -> 52 -> 53.
+# Half-elf: 4 -> 1 -> 2 -> 3 -> 50 -> 51 -> 52 -> 53.
+# Elf, Wood-elf: 5 -> 6 -> 9 -> 54 -> 55 -> 56.
+# High-elf: 7 -> 8 -> 9 -> 54 -> 55 -> 56.
+# Dark-elf: 69 -> 70 -> 71 -> 72 -> 73.
+# Hobbit: 10 -> 11 -> 3 -> 50 -> 51 -> 52 -> 53.
+# Gnome: 13 -> 14 -> 3 -> 50 -> 51 -> 52 -> 53.
+# Dwarf: 16 -> 17 -> 18 -> 57 -> 58 -> 59 -> 60 -> 61.
+# Petty-Dwarf: 87 -> 88 -> 18 -> 57 -> 58 -> 59 -> 60 -> 61.
+# Eagle: 89 -> 90.
+# Maia: 91 -> 92 -> 93 -> 94.
+# Ent: 95 -> 96.
+# Troll: 22 -> 23 -> 24 -> 62 -> 63 -> 64 -> 65 -> 66.
+# Orc 25 -> 26 -> 27 -> 28 -> 80 -> 81 -> 65 -> 66.
+# Yeek: 29 -> 3 -> 50 -> 51 -> 52 -> 53.
+# (not used: 78 -> 79 -> 80 -> 81 -> 65 -> 66.)
+# Druadan: 82 -> 83 -> 71 -> 72 -> 73.
+# Dragon: 100 -> 101 -> 102 -> 103 -> 104.
+# Easterling: 105 -> 106 -> 107 -> 108.
+# Demon: 109 -> 110 -> 111 -> 112.
+
+H:0:10:1:2:25:You are the illegitimate and unacknowledged child
+H:1:20:1:2:35:You are the illegitimate but acknowledged child
+H:2:95:1:2:45:You are one of several children
+H:3:100:1:2:50:You are the first child
+
+H:4:40:2:3:65:of a Serf.
+H:5:65:2:3:80:of a Yeoman.
+H:6:80:2:3:90:of a Townsman.
+H:7:90:2:3:105:of a Guildsman.
+H:8:96:2:3:120:of a Landed Knight.
+H:9:99:2:3:130:of a Noble Lord.
+H:10:100:2:3:140:of the Royal Blood Line.
+
+H:11:20:3:50:20:You are the black sheep of the family.
+H:12:80:3:50:55:You are a credit to the family.
+H:13:100:3:50:60:You are a well-liked child.
+
+H:14:25:4:1:40:Your mother was of the Avari.
+H:15:40:4:1:50:Your father was of the Avari.
+H:16:65:4:1:60:Your mother was of the Nandor.
+H:17:80:4:1:60:Your father was of the Nandor.
+H:18:96:4:1:70:Your mother was of the Sindar.
+H:19:99:4:1:70:Your father was of the Sindar.
+H:20:100:4:1:100:Your ancestry traces to Elrond.
+
+H:21:60:5:6:50:You are one of several children
+H:22:100:5:6:55:You are the only child
+
+H:23:40:6:9:40:of an Avarin
+H:24:70:6:9:50:of a Nandorin
+H:25:100:6:9:60:of a Sindarin
+
+H:26:60:7:8:50:You are one of several children
+H:27:100:7:8:55:You are the only child
+
+H:28:75:8:9:50:of a Telerin
+H:29:95:8:9:55:of a Noldorin
+H:30:100:8:9:60:of a Vanyarin
+
+H:31:40:9:54:80:Ranger.
+H:32:70:9:54:90:Archer.
+H:33:87:9:54:110:Warrior.
+H:34:95:9:54:125:Mage.
+H:35:99:9:54:140:Prince.
+H:36:100:9:54:145:King.
+
+H:37:85:10:11:45:You are one of several children of a Hobbit
+H:38:100:10:11:55:You are the only child of a Hobbit
+
+H:39:20:11:3:55:Bum.
+H:40:30:11:3:80:Tavern Owner.
+H:41:40:11:3:90:Miller.
+H:42:50:11:3:100:Home Owner.
+H:43:80:11:3:110:Burglar.
+H:44:95:11:3:115:Warrior.
+H:45:99:11:3:125:Mage.
+H:46:100:11:3:140:Clan Elder.
+
+H:47:85:13:14:45:You are one of several children of a Gnome
+H:48:100:13:14:55:You are the only child of a Gnome
+
+H:49:20:14:3:55:Beggar.
+H:50:50:14:3:70:Braggart.
+H:51:75:14:3:85:Prankster.
+H:52:95:14:3:100:Warrior.
+H:53:100:14:3:125:Mage.
+
+H:54:25:16:17:40:You are one of two children of a Dwarven
+H:55:100:16:17:50:You are the only child of a Dwarven
+
+H:56:10:17:18:60:Thief.
+H:57:35:17:18:80:Smith.
+H:58:75:17:18:90:Miner.
+H:59:90:17:18:110:Warrior.
+H:60:99:17:18:130:Priest.
+H:61:100:17:18:150:King.
+
+H:62:15:18:57:10:You are the black sheep of the family.
+H:63:85:18:57:50:You are a credit to the family.
+H:64:100:18:57:55:You are a well liked child.
+
+H:65:100:20:2:50:You are the adopted child
+
+H:66:100:22:23:50:You are the offspring of a
+
+H:67:30:23:24:20:Forest-Troll
+H:68:60:23:24:25:Cave-Troll
+H:69:75:23:24:30:Hill-Troll
+H:70:90:23:24:35:Stone-Troll
+H:71:95:23:24:40:Snow-Troll
+H:72:100:23:24:45:Water-Troll
+
+H:73:25:24:62:50:Worker.
+H:74:95:24:62:55:Warrior.
+H:75:99:24:62:65:Shaman.
+H:76:100:24:62:80:Clan Chief.
+
+H:77:100:25:26:50:You are one of several children of
+
+H:78:40:26:27:40:a Snaga
+H:79:80:26:27:50:an Orc
+H:80:100:26:27:60:an Uruk
+
+H:81:30:27:28:20:Slave
+H:82:60:27:28:50:Archer
+H:83:90:27:28:60:Warrior
+H:84:95:27:28:80:Shaman
+H:85:100:27:28:100:Chieftain
+
+H:86:30:28:80:50:from the Misty Mountains.
+H:87:60:28:80:50:from the Grey Mountains.
+H:88:90:28:80:70:from the orc-hold of Mount Gundabad.
+H:89:100:28:80:80:from the Pits of Angband.
+
+H:90:25:29:3:50:You are one of five children of a blue Yeek.
+H:91:75:29:3:75:You are one of five children of a brown Yeek.
+H:92:100:29:3:100:You are one of five children of a master Yeek.
+
+H:93:20:50:51:50:You have dark brown eyes,
+H:94:60:50:51:50:You have brown eyes,
+H:95:70:50:51:50:You have hazel eyes,
+H:96:80:50:51:50:You have green eyes,
+H:97:90:50:51:50:You have blue eyes,
+H:98:100:50:51:50:You have blue-gray eyes,
+
+H:99:70:51:52:50:straight
+H:100:90:51:52:50:wavy
+H:101:100:51:52:50:curly
+
+H:102:30:52:53:50:black hair,
+H:103:70:52:53:50:brown hair,
+H:104:80:52:53:50:auburn hair,
+H:105:90:52:53:50:red hair,
+H:106:100:52:53:50:blond hair,
+
+H:107:10:53:0:50:and a very dark complexion.
+H:108:30:53:0:50:and a dark complexion.
+H:109:80:53:0:50:and an average complexion.
+H:110:90:53:0:50:and a fair complexion.
+H:111:100:53:0:50:and a very fair complexion.
+
+H:112:85:54:55:50:You have light grey eyes,
+H:113:95:54:55:50:You have light blue eyes,
+H:114:100:54:55:50:You have light green eyes,
+
+H:115:75:55:56:50:straight
+H:116:100:55:56:50:wavy
+
+H:117:75:56:0:50:black hair, and a fair complexion.
+H:118:85:56:0:50:brown hair, and a fair complexion.
+H:119:95:56:0:50:blond hair, and a fair complexion.
+H:120:100:56:0:50:silver hair, and a fair complexion.
+
+H:121:99:57:58:50:You have dark brown eyes,
+H:122:100:57:58:60:You have glowing red eyes,
+
+H:123:90:58:59:50:straight
+H:124:100:58:59:50:wavy
+
+H:125:75:59:60:50:black hair,
+H:126:100:59:60:50:brown hair,
+
+H:127:25:60:61:50:a one foot beard,
+H:128:60:60:61:51:a two foot beard,
+H:129:90:60:61:53:a three foot beard,
+H:130:100:60:61:55:a four foot beard,
+
+H:131:100:61:0:50:and a dark complexion.
+
+H:132:60:62:63:50:You have slime green eyes,
+H:133:85:62:63:50:You have puke yellow eyes,
+H:134:99:62:63:50:You have blue-bloodshot eyes,
+H:135:100:62:63:55:You have glowing red eyes,
+
+H:136:33:63:64:50:dirty
+H:137:66:63:64:50:mangy
+H:138:100:63:64:50:oily
+
+H:139:33:64:65:50:sea-weed green hair,
+H:140:66:64:65:50:bright red hair,
+H:141:100:64:65:50:dark purple hair,
+
+H:142:25:65:66:50:and green
+H:143:50:65:66:50:and blue
+H:144:75:65:66:50:and white
+H:145:100:65:66:50:and black
+
+H:146:33:66:0:50:ulcerous skin.
+H:147:66:66:0:50:scabby skin.
+H:148:100:66:0:50:leprous skin.
+
+H:149:85:69:70:45:You are one of several children of a Dark Elven
+H:150:100:69:70:55:You are the only child of a Dark Elven
+
+H:151:50:70:71:60:Warrior.
+H:152:80:70:71:75:Warlock.
+H:153:100:70:71:95:Noble.
+
+H:154:100:71:72:50:You have black eyes,
+
+H:155:70:72:73:50:straight
+H:156:90:72:73:50:wavy
+H:157:100:72:73:50:curly
+
+H:158:100:73:0:50:black hair and a very dark complexion.
+
+H:159:25:74:20:25:Your mother was an Ogre, but it is unacknowledged.
+H:160:100:74:20:25:Your father was an Ogre, but it is unacknowledged.
+
+H:161:90:75:76:50:You are a descendant of Beorn to the
+H:162:100:75:20:100:Your father was Beorn.
+
+H:163:13:76:20:55:9th degree.
+H:164:25:76:20:60:8th degree.
+H:165:38:76:20:65:7th degree.
+H:166:50:76:20:70:6th degree.
+H:167:63:76:20:75:5th degree.
+H:168:75:76:20:80:4th degree.
+H:169:88:76:20:85:3rd degree.
+H:170:100:76:20:90:2nd degree.
+
+H:171:100:78:79:50:You are one of several children of
+
+H:172:50:79:80:50:a Brown Yeek.
+H:173:75:79:80:50:a Blue Yeek.
+H:174:95:79:80:85:a Master Yeek.
+H:175:100:79:80:120:Boldor, the King of the Yeeks.
+
+H:176:25:80:81:50:You have pale eyes,
+H:177:50:80:81:50:You have glowing eyes,
+H:178:75:80:81:50:You have tiny black eyes,
+H:179:100:80:81:50:You have shining black eyes,
+
+H:180:20:81:65:50:no hair at all,
+H:181:40:81:65:50:short black hair,
+H:182:60:81:65:50:long black hair,
+H:183:80:81:65:50:bright red hair,
+H:184:100:81:65:50:colourless albino hair,
+
+### Kobold histories replaced by Druadan histories
+
+H:185:100:82:83:50:You are one of several children of
+
+H:186:40:83:71:50:a Druadan Gatherer.
+H:187:75:83:71:55:a Druadan Hunter.
+H:188:95:83:71:65:a Druadan Shaman.
+H:189:100:83:71:100:Ghan-buri-Ghan.
+
+H:190:85:84:85:45:You are one of several children
+H:191:100:84:85:50:You are the first child
+
+H:192:60:85:50:40:of a Serf.
+H:193:85:85:50:55:of a Devoted Mercenary.
+H:194:96:85:50:60:of a Landed Knight.
+H:195:99:85:50:100:of a Marshal of the Riddermark.
+H:196:100:85:50:120:of a King of the Mark.
+
+H:197:100:87:88:89:You are one of several children of
+
+H:198:30:88:18:20:a Petty-Dwarf Slave.
+H:199:50:88:18:40:a Petty-Dwarf Thief.
+H:200:70:88:18:60:a Petty-Dwarf Smith.
+H:201:90:88:18:75:a Petty-Dwarf Miner.
+H:202:95:88:18:100:a Petty-Dwarf Shaman.
+H:203:100:88:18:100:Mim, Betrayer of Turin.
+
+H:204:85:89:90:50:You are one of many Eagles of Manwe.
+H:205:100:89:90:60:You are the one of the most known Eagles of Manwe.
+
+H:206:90:90:0:100:Your back and breast are dark brown, and you have very large wings.
+H:207:100:90:0:120:Your back and breast are dazzling white, your wings magnificent.
+
+H:208:10:91:92:20:You are a unnoticed minion of
+H:209:25:91:92:30:You are a minor servant of
+H:210:45:91:92:40:You are a subject of
+H:211:65:91:92:50:You have attached yourself to
+H:212:85:91:92:65:You are associated with
+H:213:95:91:92:80:You are a notable follower of
+H:214:100:91:92:100:You are a celebrated assistant to
+
+H:215:20:92:93:55:Nessa.
+H:216:40:92:93:60:Vana.
+H:217:50:92:93:65:Tulkas.
+H:218:80:92:93:75:Mandos.
+H:219:90:92:93:80:Nienna.
+H:220:95:92:93:90:Varda.
+H:221:100:92:93:95:Manwe.
+
+H:222:100:93:94:50:In the past you dwelt on earth in the form of
+
+H:223:25:94:0:50:various animals.
+H:224:55:94:0:55:a spirit of forest and river.
+H:225:70:94:0:60:a beneficent but unseen force.
+H:226:96:94:0:70:a wise and ancient counsellor.
+H:227:100:94:0:80:a Wizard of legend.
+
+H:228:30:95:96:30:You are of an unknown generation of the Ents.
+H:229:40:95:96:50:You are of the third generation of the Ents.
+H:230:60:95:96:60:You are of the second generation of the Ents.
+H:231:100:95:96:80:You are one of the first beings who awoke on Arda.
+
+H:232:50:96:0:50:You have green skin and inflexible members.
+H:233:100:96:0:50:You have brown skin and inflexible members.
+
+### Death Mold histories have been replaced by Dragon histories.
+
+H:234:10:100:101:30:You were born in the land of Rhun,
+H:235:20:100:101:35:You were born in the Misty Mountains,
+H:236:30:100:101:40:You were born in the Blue Mountains,
+H:237:40:100:101:45:You were born in Dol Guldur,
+H:238:50:100:101:50:You were born in Angmar,
+H:239:60:100:101:50:You were born in Barad-dur,
+H:240:70:100:101:55:You were born at the foot of the Orodruin,
+H:241:80:100:101:60:You were born in Angband,
+H:242:90:100:101:65:You were born in Utumno,
+H:243:100:100:101:70:You were born in the Void,
+
+H:244:10:101:102:30:awakened by accident.
+H:245:20:101:102:35:awakened by hunger.
+H:246:30:101:102:40:awakened by the glint of jewels.
+H:247:40:101:102:45:awakened by an unsuspecting traveler.
+H:248:50:101:102:50:awakened by a corrupt Mage.
+H:249:60:101:102:50:awakened by an evil Sorcerer.
+H:250:70:101:102:55:awakened by a powerful evil Wizard.
+H:251:80:101:102:60:awakened by the Witch-King of Angmar.
+H:252:90:101:102:65:awakened by Gorthaur.
+H:253:100:101:102:70:awakened by Melkor Bauglir.
+
+H:254:100:102:103:50:Since then you have destroyed
+
+H:255:10:103:104:30:no
+H:256:20:103:104:35:one weak-willed
+H:257:30:103:104:40:two
+H:258:40:103:104:45:three
+H:259:50:103:104:50:four
+H:260:60:103:104:50:five
+H:261:70:103:104:55:about twenty
+H:262:80:103:104:60:dozens of
+H:263:90:103:104:65:hundreds of
+H:264:100:103:104:70:uncounted multitudes of
+
+H:265:100:104:0:50:enemies of the Dark.
+
+### Easterling histories added in the Theme module
+
+H:266:50:105:106:50:You are one of many children of
+H:267:100:105:106:50:You are the only child of
+
+H:268:20:106:107:35:an Easterling slave.
+H:269:30:106:107:40:an Easterling landlord.
+H:270:40:106:107:45:an Easterling squire.
+H:271:50:106:107:50:an Easterling warrior.
+H:272:60:106:107:55:a Wainrider from Near Harad.
+H:273:70:106:107:60:a warlord from Far Harad.
+H:274:80:106:107:65:a Corsair of Umbar.
+H:275:90:106:107:70:Ulfast, son of Ulfang.
+H:276:100:106:107:75:Ulwarth, son of Ulfang.
+
+H:277:25:107:108:10:You have brown eyes,
+H:278:50:107:108:30:You have piercing black eyes,
+H:279:100:107:108:60:You have alert yellow eyes,
+
+H:280:50:108:0:25:chestnut brown hair, and a dark complexion.
+H:281:100:108:0:50:jet-black hair, and a dark complexion.
+
+H:282:40:109:110:60:You have only recently been corrupted,
+H:283:60:109:110:70:You've been corrupted for quite a while,
+H:284:100:109:110:80:You were one of the first beings to be corrupted,
+
+H:285:40:110:111:60:and your entire being detests this fact.
+H:286:60:110:111:70:but you don't mind it so much anymore.
+H:287:100:110:111:80:and you consider that to have been your true birth.
+
+H:288:40:111:112:60:Your watery green eyes
+H:289:60:111:112:70:Your piercing black eyes
+H:290:100:111:112:80:Your glowing red eyes
+
+H:291:40:112:0:60:radiate miserable servility.
+H:292:60:112:0:70:radiate contempt.
+H:293:100:112:0:80:radiate pure evil.
+
+##############################################################################
+##############################################################################
+##############################################################################
+##############################################################################
+# M:N:idx:color:Meta class name
+# M:C:class name
+
+I:
+
+M:N:0:U:Classes -- The Classes of Middle-earth
+M:C:Warrior
+M:C:Archer
+M:C:Rogue
+M:C:Mage
+M:C:Priest
+M:C:Loremaster
+M:C:Pacifist
+#M:C:Test
+#M:C:Chaos-Warrior
+
+#M:N:1:B:Spellcasters -- Magic is The One True Way
+
+#M:N:2:y:Priests -- Hail the powers of the Ainur
+#M:C:Mindcrafter
+
+#M:N:3:G:Beastfriends -- Monsters are fun
+#M:C:BeastMaster
+
+#M:N:4:v:Others -- The way to your independence
+#M:C:Harper
+#M:C:Merchant
+
+#M:N:5:o:Tests -- Test is you dare !
+#M:C:Test
+#M:C:Blade
+#M:C:Black-Knight
diff --git a/lib/mods/theme/edit/qrand1.map b/lib/mods/theme/edit/qrand1.map
new file mode 100644
index 00000000..f42cbf1c
--- /dev/null
+++ b/lib/mods/theme/edit/qrand1.map
@@ -0,0 +1,32 @@
+# Floor
+F:.:1:6
+
+# Marker
+F:,:172:6
+
+# Princess
+F:p:1:6:969
+
+# Lit permanent wall
+F:x:61:6
+
+# Lit glass wall
+F:G:188:6
+
+# Door
+F:D:38:6
+
+# Floor with Trap
+F:t:1:8:0:0:0:0:*
+
+# Deep lava
+F:F:85:12
+
+# Dungeon layout
+D:
+D: xxxxxxx
+D: xpGF..x
+D: xGGF,.D
+D: xFFF..x
+D: xxxxxxx
+D:
diff --git a/lib/mods/theme/edit/qrand10.map b/lib/mods/theme/edit/qrand10.map
new file mode 100644
index 00000000..ae45b9cb
--- /dev/null
+++ b/lib/mods/theme/edit/qrand10.map
@@ -0,0 +1,36 @@
+# Floor
+F:.:1:6
+
+# Marker
+F:,:172:6
+
+# Princess
+F:p:1:6:969
+
+# Lit permanent wall
+F:x:61:6
+
+# Lit glass wall
+F:G:188:6
+
+# Door
+F:D:38:6
+
+# Floor with Trap
+F:t:1:2056:0:0:0:0:*
+
+# Deep lava
+F:F:85:12
+
+# Dungeon layout
+D:
+D: xxxxxxx
+D: xFFFFFx
+D: xxxxxx,t.ttxxxx
+D: xFFG,t....t,,,xxx
+D: xFpG.......t.t.DD
+D: xFFG,t....t,,,xxx
+D: xxxxxx,t.ttxxxx
+D: xFFFFFx
+D: xxxxxxx
+D:
diff --git a/lib/mods/theme/edit/qrand11.map b/lib/mods/theme/edit/qrand11.map
new file mode 100644
index 00000000..4af3c266
--- /dev/null
+++ b/lib/mods/theme/edit/qrand11.map
@@ -0,0 +1,36 @@
+# Floor
+F:.:1:6
+
+# Marker
+F:,:172:6
+
+# Princess
+F:p:1:6:969
+
+# Lit permanent wall
+F:x:61:6
+
+# Lit glass wall
+F:G:188:6
+
+# Door
+F:D:38:6
+
+# Floor with Trap
+F:t:1:8:0:0:0:0:*
+
+# Deep lava
+F:L:85:6
+
+# Shallow lava
+F:l:86:6
+
+# Dungeon layout
+D: ,llllllll ,
+D:, llLLLLLllll,
+D:llLLLGGGLLLlll,
+D:llLLLGpGLLLLlll
+D:lllLLGGGLLLllll
+D:lllllLLLLlllll,
+D:,lllllllllll,
+D: , ,llllll,
diff --git a/lib/mods/theme/edit/qrand12.map b/lib/mods/theme/edit/qrand12.map
new file mode 100644
index 00000000..4621ef0b
--- /dev/null
+++ b/lib/mods/theme/edit/qrand12.map
@@ -0,0 +1,36 @@
+# Floor
+F:.:1:6
+
+# Marker
+F:,:172:6
+
+# Princess
+F:p:1:6:969
+
+# Lit permanent wall
+F:x:61:6
+
+# Lit glass wall
+F:G:188:6
+
+# Door
+F:D:38:6
+
+# Floor with Trap
+F:t:1:8:0:0:0:0:*
+
+# Deep water
+F:W:187:6
+
+# Shallow water
+F:w:84:6
+
+# Dungeon wayout
+D: ,wwwwwwww ,
+D:,,wwWWWWWwwww,
+D:wwWWWGGGWWWwww,
+D:wwWWWGpGWWWWwww
+D:wwwWWGGGWWWwwww
+D:wwwwwWWWWwwwww,
+D:,wwwwwwwwwww,
+D: , ,wwwwww,
diff --git a/lib/mods/theme/edit/qrand14.map b/lib/mods/theme/edit/qrand14.map
new file mode 100644
index 00000000..9f339db0
--- /dev/null
+++ b/lib/mods/theme/edit/qrand14.map
@@ -0,0 +1,37 @@
+# Floor
+F:.:1:6
+
+# Marker
+F:,:172:6
+
+# Princess
+F:p:1:6:969
+
+# Lit permanent wall
+F:x:61:6
+
+# Lit glass wall
+F:G:188:6
+
+# Door
+F:D:38:6
+
+# Floor with Trap
+F:t:1:8:0:0:0:0:*
+
+# Deep water
+F:W:84:6
+
+# Shallow water
+F:w:187:6
+
+# Dungeon wayout
+D:
+D: xxxx xxxx
+D: x,,x x,,x
+D: xxDxxxxxxxDxx
+D: D,,,GpG,,,D
+D: xxDxxxxxxxDxx
+D: x,,x x,,x
+D: xxxx xxxx
+D:
diff --git a/lib/mods/theme/edit/qrand5.map b/lib/mods/theme/edit/qrand5.map
new file mode 100644
index 00000000..cc5d79ee
--- /dev/null
+++ b/lib/mods/theme/edit/qrand5.map
@@ -0,0 +1,27 @@
+# Floor
+F:.:1:6
+
+# Marker
+F:,:172:6
+
+# Princess
+F:p:1:6:969
+
+# Lit permanent wall
+F:x:61:6
+
+# Lit glass wall
+F:G:188:6
+
+# Dungeon layout
+D:
+D: xxxx.xxxx
+D: xx.......xx
+D: xxx..,...,..xxx
+D: xx.....GGG.....xx
+D: x......GpG......x
+D: xx..,..GGG..,..xx
+D: xxx....,....xxx
+D: xx.......xx
+D: xxxx.xxxx
+D:
diff --git a/lib/mods/theme/edit/qrand6.map b/lib/mods/theme/edit/qrand6.map
new file mode 100644
index 00000000..3b55e985
--- /dev/null
+++ b/lib/mods/theme/edit/qrand6.map
@@ -0,0 +1,37 @@
+# Floor
+F:.:1:6
+
+# Marker
+F:,:172:6
+
+# Princess
+F:p:1:6:969
+
+# Lit permanent wall
+F:x:61:6
+
+# Lit glass wall
+F:G:188:6
+
+# Door
+F:D:38:6
+
+# Floor with Trap
+F:t:1:8:0:0:0:0:*
+
+# Deep water
+F:W:84:6
+
+# Shallow water
+F:w:187:6
+
+# Dungeon wayout
+D:
+D: xxxx xxxx
+D: xxxx xxxx
+D: xxxxxxxxxxDxx
+D: D,,,GpG,,,D
+D: xxxxxxxxxxDxx
+D: xxxx xxxx
+D: xxxx xxxx
+D:
diff --git a/lib/mods/theme/edit/qrand7.map b/lib/mods/theme/edit/qrand7.map
new file mode 100644
index 00000000..a7c0607f
--- /dev/null
+++ b/lib/mods/theme/edit/qrand7.map
@@ -0,0 +1,35 @@
+# Floor
+F:.:1:6
+
+# Marker
+F:,:172:6
+
+# Princess
+F:p:1:6:969
+
+# Lit permanent wall
+F:x:61:6
+
+# Lit glass wall
+F:G:188:6
+
+# Door
+F:D:38:6
+
+# Floor with Trap
+F:t:1:8:0:0:0:0:*
+
+# Deep water
+F:W:84:6
+
+# Shallow water
+F:w:187:6
+
+# Dungeon wayout
+D:ttttt
+D:tGGGt ,x,
+D:tGpGt x,x
+D:tGGGt ,x,
+D:ttttt
+D: ,x,
+D:
diff --git a/lib/mods/theme/edit/r_info.txt b/lib/mods/theme/edit/r_info.txt
new file mode 100644
index 00000000..bcc46bd5
--- /dev/null
+++ b/lib/mods/theme/edit/r_info.txt
@@ -0,0 +1,19013 @@
+# File: r_info.txt
+# With new monsters for Zangband 2.2 (or 2.3)
+# With new monsters for PernAngband 3.x.x
+# With lots of monsters for PernAngband 4.x.x
+# With Spirits for ToME 2.1.x
+# With many new monsters replacing old ones for Theme (ToME module)
+
+# This file is used to initialize the "lib/raw/r_info.raw" file, which is
+# used to initialize the "monster race" information for the Angband game.
+
+# 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/r_info.raw" file.
+
+# PernAngband notes:
+
+# Currently, "unique" monsters are just "special" monster races, with
+# the requirement that only one monster of that race can exist at a time,
+# and when it is killed, it can never again be generated.
+
+# ATTR_CLEAR monsters acquire their attr from the item/floor below them,
+# and use "white" for the recall window. See "cave.c" for info.
+
+# ATTR_MULTI monsters have a "flickering" attr, and use "violet" for the
+# recall window. See "cave.c" for info.
+
+# CHAR_CLEAR monsters use special symbols (.) as given below,
+# and use those symbols for the recall window. In theory, normally,
+# these monsters cannot be targetted, and when examined look like normal
+# floors, until the player "notices" them (perhaps check "awake").
+
+# CHAR_MULTI monsters use special symbols (!, ?, =) as given below,
+# and use those symbols for the recall window. In theory, normally,
+# these monsters cannot be targetted, and when examined look like normal
+# objects, until the player "notices" them (perhaps check "awake").
+
+# Note that there are (a few) normal monsters who are "violet" but not
+# ATTR_MULTI, and a lot of monsters which are "white" but not ATTR_CLEAR.
+
+# Note that currently both CHAR_CLEAR and CHAR_MULTI monsters are treated
+# as normal monsters that are just a little hard to see.
+
+# Note that the monster list underwent several changes for Angband 2.7.9,
+# including some monster name changes, some symbol redistributions, and
+# some color changes.
+
+# The Umber Hulk joined the Xorn/Xaren (X). The ticks (t) joined the
+# spiders (S). The townspeople (t) left the people (p). The "Jabberwock"
+# became the "Chaos beetle" (K). The major demons (&) became (U) and the
+# minor demons (I) became (u). Multiplying insects (fleas, fruit flies,
+# hummerhorns) became (I), visually "matching" the multiplying lice (l).
+# The "ant lions" (a) became "ants" (a). The mummified monsters (M)
+# joined the zombified monsters (z). The multi-headed hydras (M) left
+# the reptiles (R). The snakes (J) left the reptiles (R).
+
+# Some of the old "red" or "brown" monsters became "pink" if they lower
+# strength, while some of the old "fire" monsters became simply "red"
+# monsters. The "dragons" and "hounds" and related monsters underwent
+# a "color scheme regularization" ('w' = White/Cold, 's' = Black/Acid,
+# 'o' = Lite/Dark, 'r' = Red/Fire, 'g' = Green/Poison, 'b' = Blue/Elec,
+# 'u' = Brown/Earth/Force, 'D' = Dark/etc, 'W' = Stone/Inertia/Gravity/etc,
+# 'v' = Multihued/Chaos/Disenchantment/etc, 'y' = Gold/Sound, 'R' = Nexus,
+# 'G' = Nether, 'B' = Left-overs, and 'U' = Bronze/Confusion).
+
+# In several situations, two or more monsters with identical symbols and
+# colors were changed so that maximal information is conveyed by the symbol
+# and color.
+
+# The "people" (p), with more than 50 entries, got a new "color scheme"
+# ('w' = Paladin, 's' = Knight, 'o' = Mystic, 'r' = Mage, 'g' = High Priest,
+# 'b' = Thief, 'u' = Warrior, 'D' = Death knight, 'W' = Ranger/Archer,
+# 'v' = Sorcerer, 'y' = Ninja, 'R' = High Mage, 'G' = Priest, 'B' = High
+# Thief, 'U' = High Warrior). Note that most non-unique "people" already
+# had these colors, or colors close to these colors. A similar color scheme
+# was enforced for the "humanoid" (h) monsters as well, more or less.
+
+# TY: This is no longer entirely accurate. The monster coloring has been
+# changed 'back' to pre-2.7.* coloring in several cases. For example, I
+# prefer "black" thief characters. Also color can be (and should) be used to
+# convey information, but more importantly it is a visual presentation
+# of the creature and should be what the creature "looks" like.
+
+# Many of the "unique" monsters were changed to "match" the "base" monster
+# from which they were derived. Angband 2.8.0 may require every "unique"
+# monster to be based on a "normal" monster, and may enforce color matching.
+# This may result in the addition of some new monsters, to serve as "base"
+# monsters, possibly including Ogre captains, Greater Balrogs, Black Trolls,
+# Vampire Queens, Giant Werewolves, and others. This may be accompanied by
+# a separation of the monster list into a "normal" monster list (r_info)
+# with 512 entries, and a "unique" monster list (u_info) with 128 entries,
+# which will require reorganization of the list. Some new "player ghost"
+# unique monsters will probably be added at the same time.
+
+# Mushrooms look just like food (and use the "," symbol for both the recall
+# window and for normal display), Creeping coins look just like coins (and
+# use the "$" symbol for both the recall window and for normal display), and
+# Trappers/Lurkers can never be seen (and use the "." symbol for the recall
+# window). All other monsters use "alphabetic" symbols, and "alphabetic"
+# symbols are used only for monsters.
+
+# The "0" and "9" symbols are reserved for internal debugging use.
+
+# The "&" symbol is reserved for future use as a special "terrain feature".
+
+# The "`" symbol is reserved as an "alternate" open door picture, since
+# the "'" symbol looks like the "," symbol in some fonts (esp. IBM).
+
+# The "x" symbol is free for use as an "attr/char mapping" for annoying
+# monsters, such as magic mushrooms, drolems, etc.
+
+# Certain symbols ("X", "Y", "B", "l", "I", etc) are used by
+# very few monsters, and could be reorganized somewhat.
+
+# There are still too many "p" monsters, perhaps they should be broken up.
+
+# As always, you can enforce any "visual picture" you want with a "pref file".
+
+
+###### Understanding the entries ######
+
+# N: serial number : monster name
+# G: symbol : color
+# I: speed : hit points : vision : armor class : alertness
+# W: depth : rarity : corpse weight : experience for kill
+# E: weapons : torso : arms : finger : head : leg
+# O: treasure : combat : magic : tool
+# B: attack method : attack effect : damage
+# F: flag | flag | etc
+# S: spell frequency |
+# S: spell type | spell type | etc
+# D: Description
+
+# 'N' indicates the beginning of an entry. The serial number must
+# increase for each new item. Entry 0 is used for the player.
+
+# 'G' is for graphics - symbol and color. There are 16 colors, as
+# follows:
+
+# D - Dark Gray w - White s - Gray o - Orange
+# r - Red g - Green b - Blue u - Brown
+# d - Black W - Light Gray v - Violet y - Yellow
+# R - Light Red G - Light Green B - Light Blue U - Light Brown
+
+# 'I' is for information - speed, health, vision in tens of feet,
+# armor class, and alertness. 110 is normal speed. Alertness ranges
+# from 0 (ever vigilant for intruders) to 255 (prefers to ignore
+# intruders).
+
+# 'W' is for more information - level, rarity, corpse weight (expressed
+# in deci-pounds) [19 deci-pounds seem to get added to these number
+# in practice], and experience for killing.
+
+# 'E' is for equipment slots - weapon slots, torso slots (the "on body"
+# and "about body" equipment slots), arm slots (expressed in number
+# of pairs), finger slots, head slots, and leg slots (expressed
+# in number of pairs).
+
+# 'O' is for object drop chances - % chance to drop treasure, % chance
+# to drop combat items, % chance to drop magic type items (not
+# items of good blessing), and % chance to drop tools. The four
+# percents added together must be equal to or less than 100. If
+# the percent is less than 100, that is the chance for the monster
+# to drop junk.
+
+# 'B' is for blows - method of attack, effect of attack, and damage
+# from attack. There may be up to four of these lines; effect and
+# damage are optional.
+
+# 'S' is for spells. The first S: line must be S:1_IN_X with X the
+# number of monster turns, on average, before the monster will cast
+# one of its spells. X must not be zero.
+
+# 'F' is for flags. These are fairly self-explanatory. As many F:
+# lines may be used as are needed to specify all the flags and flags
+# are separated by the '|' symbol. The '|' symbol must also be used
+# to end all but the last line.
+
+# 'D' is for description. As many D: lines may be used as are needed
+# to describe the monster. Note that lines may need spaces at their
+# ends to prevent words from running together in the monster memory.
+
+
+# Note that monster zero is used for the "player" picture.
+
+# Version stamp (required)
+
+V:2.2.0
+
+##### The Player #####
+
+N:0:Player
+G:@:w
+E:1:1:1:2:1:1
+O:0:0:0:0
+
+##### Town monsters #####
+
+N:1:Filthy street urchin
+G:t:D
+I:110:1d4:4:1:40
+W:0:2:1200:0
+E:1:1:1:2:1:1
+O:1:1:1:1
+B:BEG:*
+B:TOUCH:EAT_GOLD
+F:MALE | EVIL | WILD_TOWN | WILD_ONLY |
+F:RAND_25 | FRIENDS |
+F:TAKE_ITEM | OPEN_DOOR | DROP_CORPSE | DROP_SKELETON |
+F:MORTAL | BASEANGBAND | HAS_LITE
+D:He looks squalid and thoroughly revolting.
+
+N:2:Scrawny cat
+G:f:W
+I:110:1d2:30:1:255
+W:0:3:100:0
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:CLAW:HURT:1d1
+F:RAND_25 | WILD_GRASS | WILD_TOWN | WILD_ONLY |
+F:ANIMAL | DROP_CORPSE | DROP_SKELETON |
+F:MORTAL | BASEANGBAND | NEUTRAL | NO_TARGET
+D:A skinny little furball with sharp claws.
+
+N:3:Sparrow
+G:B:W
+I:110:1d1:30:1:255
+W:0:3:90:0
+E:0:1:1:0:1:0
+O:0:0:0:0
+B:BITE:HURT:1d1
+F:RAND_25 | CAN_FLY | WILD_TOWN | WILD_ONLY |
+F:ANIMAL | DROP_SKELETON | HAS_EGG | IMPRESED |
+F:MORTAL | BASEANGBAND | NEUTRAL | NO_TARGET | AQUATIC
+D:Utterly harmless, except when angry.
+
+N:4:Chaffinch
+G:B:R
+I:110:1d1:30:1:255
+W:0:3:80:0
+E:0:1:1:0:1:0
+O:0:0:0:0
+B:BITE:HURT:1d1
+F:RAND_25 | CAN_FLY | WILD_ONLY | WILD_WOOD | WILD_GRASS |
+F:ANIMAL | DROP_SKELETON | HAS_EGG | IMPRESED | AQUATIC
+F:MORTAL | BASEANGBAND | NEUTRAL | NO_TARGET
+D:Utterly harmless, except when angry.
+
+N:5:Wild rabbit
+G:r:U
+I:110:1d2:30:1:255
+W:0:3:100:0
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:BITE:HURT:1d1
+F:RAND_50 | WILD_ONLY | WILD_GRASS | WILD_WOOD |
+F:ANIMAL | DROP_SKELETON | DROP_CORPSE |
+F:MORTAL | BASEANGBAND | NEUTRAL | NO_TARGET
+D:It is not a carnivore, but will defend itself if you stray too
+D:close.
+
+N:6:Woodsman
+G:t:g
+I:110:3d3:10:1:255
+W:0:1:1000:0
+E:1:1:1:2:1:1
+O:0:0:0:0
+B:HIT:HURT:1d6
+F:MALE | WILD_ONLY | WILD_WOOD |
+F:RAND_25 | DROP_SKELETON | DROP_CORPSE |
+F:ONLY_GOLD | DROP_60 | HAS_LITE |
+F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR |
+F:MORTAL | BASEANGBAND | NEUTRAL | NO_TARGET |
+D:He has a strong axe with a sharp edge.
+
+N:7:Scruffy little dog
+G:C:s
+I:110:1d3:20:1:255
+W:0:3:300:0
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:BITE:HURT:1d1
+F:RAND_25 | DROP_SKELETON | DROP_CORPSE | WILD_TOWN | WILD_ONLY |
+F:ANIMAL | MORTAL | BASEANGBAND | NEUTRAL | NO_TARGET
+D:A thin flea-ridden mutt, growling as you get close.
+
+N:8:Farmer Maggot
+G:h:w
+I:110:35d10:40:10:3
+W:0:4:730:0
+E:0:1:1:2:1:1
+O:0:100:0:0
+F:UNIQUE | MALE | CAN_SPEAK | DROP_CORPSE |
+F:FORCE_MAXHP | WILD_TOWN | WILD_ONLY | NO_TARGET
+F:NEVER_MOVE
+F:OPEN_DOOR | BASH_DOOR | SPECIAL_GENE
+F:NEUTRAL | NO_TARGET | NO_DEATH
+F:MORTAL | BASEANGBAND | HAS_LITE
+D:A broad and thick-set hobbit with a round red face. "There's earth under
+D:his old feet, and clay on his fingers; wisdom in his bones, and both his
+D:eyes are open." He seems sad about something.
+
+N:9:Blubbering idiot
+G:t:W
+I:110:1d2:6:1:255
+W:0:1:1500:0
+E:1:1:1:2:1:1
+O:0:0:0:0
+B:DROOL:*
+F:MALE | DROP_CORPSE | DROP_SKELETON | WILD_TOWN | WILD_ONLY |
+F:RAND_25 | DROP_1D2 | TAKE_ITEM | NEUTRAL | NO_TARGET |
+F:MORTAL | BASEANGBAND | HAS_LITE
+D:He tends to blubber a lot.
+
+N:10:Boil-covered wretch
+G:t:R
+I:110:1d2:6:1:255
+W:0:1:1400:0
+E:1:1:1:2:1:1
+O:0:0:0:0
+B:DROOL:*
+F:MALE | DROP_SKELETON | DROP_CORPSE | WILD_TOWN | WILD_ONLY |
+F:RAND_25 | DROP_1D2 | NEUTRAL | NO_TARGET
+F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR |
+F:MORTAL | BASEANGBAND | HAS_LITE
+D:Ugly doesn't begin to describe him.
+
+N:11:Village idiot
+G:t:G
+I:120:4d4:6:1:255
+W:0:1:1400:0
+E:1:1:1:2:1:1
+O:0:0:0:0
+B:DROOL:*
+F:MALE | DROP_CORPSE | DROP_SKELETON | WILD_TOWN | WILD_ONLY |
+F:RAND_25 | DROP_1D2 | TAKE_ITEM | NEUTRAL | NO_TARGET
+F:MORTAL | BASEANGBAND | HAS_LITE
+D:Drooling and comical, he runs around town with a stupid grin.
+
+N:12:Pitiful-looking beggar
+G:t:U
+I:110:1d4:10:1:255
+W:0:1:1300:0
+E:1:1:1:2:1:1
+O:0:0:0:0
+B:BEG:*
+F:MALE | DROP_SKELETON | DROP_CORPSE |
+F:RAND_25 | WILD_TOWN | WILD_ONLY | DROP_1D2 |
+F:TAKE_ITEM | OPEN_DOOR | NEUTRAL | NO_TARGET
+F:MORTAL | BASEANGBAND | HAS_LITE
+D:You just can't help feeling sorry for him.
+
+N:13:Mangy-looking leper
+G:t:u
+I:110:1d1:10:1:255
+W:0:1:1300:0
+E:1:1:1:2:1:1
+O:0:0:0:0
+B:BEG:*
+B:TOUCH:DISEASE
+F:MALE | DROP_CORPSE | DROP_SKELETON |
+F:RAND_25 | WILD_TOWN | WILD_ONLY | DROP_1D2 |
+F:TAKE_ITEM | OPEN_DOOR | NEUTRAL | NO_TARGET
+F:MORTAL | BASEANGBAND | HAS_LITE
+D:You feel it isn't safe to touch him.
+
+N:14:Agent of the black market
+G:t:b
+I:110:2d8:10:8:99
+W:0:1:1200:0
+E:1:1:1:2:1:1
+O:25:50:20:5
+B:HIT:HURT:1d6
+B:TOUCH:EAT_ITEM
+B:INSULT:*
+F:MALE | DROP_CORPSE | DROP_SKELETON |
+F:DROP_60 | WILD_TOWN |
+F:WILD_WOOD | WILD_GRASS | WILD_MOUNTAIN | WILD_ONLY |
+F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR |
+F:EVIL | MORTAL | BASEANGBAND | HAS_LITE
+D:He 'finds' new wares for the Black Market. From unwary adventurers.
+
+N:15:Singing, happy drunk
+G:t:y
+I:110:2d3:10:1:0
+W:0:1:1100:0
+E:1:1:1:2:1:1
+O:0:0:0:0
+B:BEG:*
+F:MALE |
+F:RAND_50 | DROP_SKELETON | DROP_CORPSE |
+F:ONLY_GOLD | DROP_60 | WILD_TOWN | WILD_ONLY |
+F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR |
+F:MORTAL | BASEANGBAND | HAS_LITE | NEUTRAL | NO_TARGET
+D:He makes you glad to be sober.
+
+N:16:Aimless-looking merchant
+G:t:o
+I:110:3d3:10:1:255
+W:0:1:1500:0
+E:1:1:1:2:1:1
+O:0:0:0:0
+B:HIT:HURT:1d3
+F:MALE | RAND_50 |
+F:ONLY_GOLD | DROP_60 | DROP_SKELETON | DROP_CORPSE |
+F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | WILD_TOWN | WILD_ONLY |
+F:MORTAL | BASEANGBAND | HAS_LITE | NEUTRAL | NO_TARGET
+D:The typical ponce around town, with purse jingling, and looking for more
+D:amulets of adornment to buy.
+
+N:17:Mean-looking mercenary
+G:t:r
+I:110:5d8:10:20:250
+W:0:1:1700:0
+E:1:1:1:2:1:1
+O:0:100:0:0
+B:HIT:HURT:1d10
+F:MALE | DROP_SKELETON | DROP_CORPSE |
+F:RAND_50 | DROP_90 | WILD_GRASS | WILD_TOWN | WILD_WOOD | WILD_ONLY |
+F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR |
+F:EVIL | MORTAL | BASEANGBAND | HAS_LITE
+D:No job is too low for him.
+
+N:18:Battle-scarred veteran
+G:t:B
+I:110:7d8:10:30:250
+W:0:1:1650:0
+E:1:1:1:2:1:1
+O:25:50:25:0
+B:HIT:HURT:2d6
+F:MALE | DROP_SKELETON | DROP_CORPSE |
+F:RAND_50 | DROP_90 | WILD_TOWN | WILD_ONLY |
+F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR |
+F:MORTAL | BASEANGBAND | HAS_LITE
+D:He doesn't take to strangers kindly.
+
+N:19:The Squint-eyed Southerner
+G:t:s
+I:120:8d20:20:15:400
+W:10:4:1700:50
+E:1:1:1:2:1:1
+O:0:50:0:50
+B:HIT:HURT:3d8
+B:HIT:HURT:3d8
+B:PUNCH:HURT:3d8
+B:PUNCH:HURT:3d8
+F:UNIQUE | MALE | CAN_SPEAK | BASEANGBAND | HAS_LITE |
+F:FORCE_MAXHP | DROP_CORPSE | WILD_TOWN | WILD_ONLY | DROP_1D2 |
+F:ONLY_ITEM | DROP_GOOD | DROP_GREAT | DROP_RANDART | MORTAL
+D:He doesn't look like he's from around here, and a gut
+D:feeling tells you he's a spy.
+
+##### Normal monsters #####
+
+N:20:Grey mold
+G:m:s
+I:110:1d2:2:1:0
+W:1:1:20:3
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:SPORE:HURT:1d4
+B:SPORE:HURT:1d4
+F:NEVER_MOVE |
+F:STUPID | EMPTY_MIND |
+F:IM_POIS | DROP_CORPSE |
+F:NO_CONF | NO_SLEEP | NO_FEAR |
+F:MORTAL | BASEANGBAND | NO_CUT
+D:A small strange growth.
+
+N:21:Large white snake
+G:J:w
+I:100:3d6:4:30:99
+W:1:1:600:2
+E:0:0:0:0:1:0
+O:0:0:0:0
+B:BITE:HURT:1d1
+B:CRUSH:HURT:1d1
+F:RAND_50 | WILD_TOO |
+F:BASH_DOOR | DROP_SKELETON | DROP_CORPSE |
+F:ANIMAL | HAS_EGG | MORTAL | BASEANGBAND
+D:It is about eight feet long.
+
+N:22:Grey mushroom patch
+G:,:s
+I:110:1d2:2:1:0
+W:1:1:10:1
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:SPORE:CONFUSE:1d4
+F:NEVER_MOVE |
+F:STUPID | EMPTY_MIND |
+F:IM_POIS | DROP_CORPSE |
+F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT
+D:Yum! It looks quite tasty.
+
+N:23:Newt
+G:R:y
+I:110:2d6:8:12:30
+W:1:1:10:2
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:BITE:HURT:1d3
+B:BITE:HURT:1d3
+F:WEIRD_MIND | CAN_SWIM | WILD_TOO | DROP_CORPSE |
+F:WILD_GRASS | WILD_WASTE | WILD_SHORE | WILD_MOUNTAIN |
+F:ANIMAL | HAS_EGG | MORTAL | BASEANGBAND |
+D:A small, harmless lizard.
+
+# New monster added by furiosity for the Theme module
+N:24:Ox
+G:c:D
+I:50:10d10:0:50:255
+W:0:1:4000:0
+E:0:1:0:2:1:2
+O:0:0:0:0
+B:KICK:HURT:10d10
+B:KICK:HURT:10d10
+B:BUTT:HURT:10d10
+B:BUTT:HURT:10d10
+F:BASEANGBAND | ANIMAL | MORTAL | DROP_CORPSE | WILD_ONLY | WILD_GRASS
+F:FRIEND | FRIENDS | FORCE_SLEEP | STUPID | WEIRD_MIND |
+F:SUSCEP_POIS | KILL_BODY | NEUTRAL | NO_TARGET | KILL_ITEM |
+D:A strong and powerful animal with sharp-looking horns. Large cattle
+D:used to carry and draw burdens, and for milk and meat. It is domestic and
+D:utterly harmless, except when angry.
+
+# New monster added by furiosity for the Theme module
+N:25:Kine of Araw
+G:c:r
+I:80:20d20:0:50:255
+W:0:1:5000:0
+E:0:1:0:2:1:2
+O:0:0:0:0
+B:KICK:HURT:20d20
+B:KICK:HURT:20d20
+B:KICK:HURT:20d20
+B:KICK:HURT:20d20
+F:BASEANGBAND | ANIMAL | MORTAL | DROP_CORPSE | WILD_ONLY | WILD_GRASS |
+F:FRIEND | FRIENDS | FORCE_SLEEP | WEIRD_MIND | SUSCEP_POIS | GOOD |
+F:KILL_BODY | NEUTRAL | NO_TARGET | KILL_ITEM |
+D:The oxen that live on the lands around the Sea of Rhun are hardier
+D:and wilder than any others in Middle-earth. Legends claim that they
+D:are descended from the cattle of the Huntsman of the Valar, Orome
+D:himself, and so they are named the Kine of Araw (Araw being the Sindarin
+D:form of Orome's name). It is a huge four-legged beast that won't attack
+D:unless provoked.
+
+# New monster added by furiosity for the Theme module
+N:26:Sheep
+G:c:w
+I:70:5d5:0:30:255
+W:0:1:2000:0
+E:0:1:0:2:1:2
+O:0:0:0:0
+B:KICK:HURT:5d5
+B:KICK:HURT:5d5
+B:KICK:HURT:5d5
+B:KICK:HURT:5d5
+F:BASEANGBAND | ANIMAL | MORTAL | DROP_CORPSE | WILD_ONLY | WILD_GRASS |
+F:FRIEND | FRIENDS | FORCE_SLEEP | WEIRD_MIND | SUSCEP_POIS | NEUTRAL | NO_TARGET |
+D:Woolly grazing animals, especially common on the Barrow-downs
+D:and in the Vales of Anduin. Utterly harmless unless angered.
+
+N:27:Giant white mouse
+G:r:w
+I:110:1d3:8:4:20
+W:1:1:600:1
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:BITE:HURT:1d2
+F:RAND_50 | WILD_TOO | WILD_GRASS |
+F:CAN_SWIM |
+F:ANIMAL | DROP_CORPSE |
+F:MORTAL | BASEANGBAND |
+S:MULTIPLY
+D:It is about three feet long, with large teeth.
+
+N:28:Large brown snake
+G:J:u
+I:100:4d6:4:35:99
+W:1:1:800:3
+E:0:0:0:0:1:0
+O:0:0:0:0
+B:BITE:HURT:1d3
+B:CRUSH:HURT:1d4
+F:RAND_25 | CAN_SWIM |
+F:BASH_DOOR | DROP_SKELETON | DROP_CORPSE |
+F:ANIMAL | HAS_EGG | MORTAL | BASEANGBAND
+D:It is about eight feet long.
+
+# New monster added by furiosity for the Theme module
+N:29:Meara
+G:c:W
+I:130:10d12:0:70:255
+W:0:1:3500:0
+E:0:1:0:2:1:2
+O:0:0:0:0
+B:KICK:HURT:10d12
+B:KICK:HURT:10d12
+B:KICK:HURT:10d12
+B:KICK:HURT:10d12
+F:BASEANGBAND | ANIMAL | MORTAL | DROP_CORPSE | WILD_ONLY |
+F:WILD_GRASS | FORCE_SLEEP | WEIRD_MIND | NEUTRAL | NO_TARGET | GOOD |
+D:The great Mearas are legendary horses bred by the Rohirrim.
+D:Swift and sure they are, but only members of the royal
+D:family of Rohan are allowed to ride them. This animal will
+D:not attack unless angered.
+
+# New monster added by furiosity for the Theme module
+N:30:Horse
+G:c:s
+I:120:8d10:0:50:255
+W:0:1:3000:0
+E:0:1:0:2:1:2
+O:0:0:0:0
+B:KICK:HURT:8d10
+B:KICK:HURT:8d10
+B:KICK:HURT:8d10
+B:KICK:HURT:8d10
+F:BASEANGBAND | ANIMAL | MORTAL | DROP_CORPSE | WILD_ONLY | WILD_GRASS |
+F:FORCE_SLEEP | WEIRD_MIND | SUSCEP_POIS | WILD_TOWN | NEUTRAL | NO_TARGET |
+D:Beasts of burden and transport used by Elves and Men through the ages.
+D:A noble animal, it can be quite a sight as it prances gracefully
+D:through the fields. It won't attack you unless provoked.
+
+N:31:White worm mass
+G:w:w
+I:100:4d4:7:1:10
+W:1:1:30:2
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:CRAWL:POISON:1d2
+F:RAND_50 | RAND_25 | CAN_SWIM |
+F:STUPID | WEIRD_MIND |
+F:ANIMAL | IM_POIS | HURT_LITE | NO_FEAR
+F:MORTAL | BASEANGBAND | NO_CUT
+S:MULTIPLY
+D:It is a large slimy mass of worms.
+
+N:32:Floating eye
+G:e:o
+I:110:3d6:2:6:10
+W:1:1:500:1
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:GAZE:PARALYZE
+F:NEVER_MOVE | CAN_FLY | DROP_CORPSE |
+F:HURT_LITE | NO_FEAR | BASEANGBAND
+D:A disembodied eye, floating a few feet above the ground.
+
+N:33:Rock lizard
+G:R:U
+I:110:3d4:20:4:15
+W:1:1:100:2
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:BITE:HURT:1d1
+F:ANIMAL | CAN_SWIM | WILD_TOO | WILD_MOUNTAIN |
+F:DROP_CORPSE | HAS_EGG |
+F:MORTAL | BASEANGBAND
+D:It is a small lizard with a hardened hide.
+
+# New monster added by furiosity for the Theme module
+N:34:The Boar of Everholt
+G:c:R
+I:110:15d10:0:3:20
+W:5:1:1600:60
+E:0:1:0:2:1:2
+O:0:0:0:0
+B:BUTT:HURT:3d6
+B:BUTT:HURT:3d6
+B:BUTT:HURT:3d6
+F:BASEANGBAND | ANIMAL | MORTAL | DROP_CORPSE | WILD_TOO |
+F:WILD_GRASS | FORCE_SLEEP | WEIRD_MIND | WILD_WOOD | UNIQUE |
+D:A monstrous beast that inhabited Everholt in the Firien Wood,
+D:around the feet of the Halifirien in the White Mountains. It
+D:is twice the size of a regular boar, and twice as aggressive.
+D:King Folca of Rohan met his end at the tusks of this creature.
+
+N:35:Jackal
+G:C:y
+I:110:1d4:10:3:10
+W:1:1:400:1
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:BITE:HURT:1d1
+F:FRIENDS |
+F:WILD_TOO | WILD_WOOD | WILD_GRASS | DROP_SKELETON | DROP_CORPSE |
+F:ANIMAL | MORTAL | BASEANGBAND
+D:It is a yapping snarling wild dog, dangerous when in a pack.
+
+N:36:Soldier ant
+G:a:u
+I:110:2d5:10:3:10
+W:1:1:300:3
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:BITE:HURT:1d2
+F:WEIRD_MIND | BASH_DOOR | DROP_SKELETON |
+F:ANIMAL | WILD_TOO | WILD_GRASS |
+F:MORTAL | BASEANGBAND
+D:A large ant with powerful mandibles.
+
+N:37:Fruit bat
+G:b:o
+I:120:1d6:20:3:10
+W:1:1:20:1
+E:0:1:1:0:1:0
+O:0:0:0:0
+B:BITE:HURT:1d1
+F:ANIMAL | CAN_FLY | WILD_TOO | WILD_WOOD | DROP_CORPSE
+F:MORTAL | BASEANGBAND | AI_ANNOY
+D:A fast-moving pest.
+
+N:38:Insect swarm
+G:I:u
+I:120:1d5:20:4:10
+W:1:1:100:1
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:BITE:HURT:1d1
+B:STING:HURT:1d1
+F:ANIMAL | WEIRD_MIND | CAN_FLY | RAND_25 | WILD_TOO | WILD_GRASS |
+F:WILD_WOOD |
+F:MORTAL | SUSCEP_FIRE | BASEANGBAND | NO_CUT
+D:A lone insect may be harmless, but there's a whole swarm of
+D:them here!
+
+# New monster added by furiosity for the Theme module
+N:39:Boar
+G:c:o
+I:110:3d6:0:3:20
+W:3:1:800:5
+E:0:1:0:2:1:2
+O:0:0:0:0
+B:BUTT:HURT:3d3
+B:BUTT:HURT:3d3
+F:BASEANGBAND | ANIMAL | MORTAL | DROP_CORPSE | WILD_TOO |
+F:WILD_GRASS | FORCE_SLEEP | WEIRD_MIND | WILD_WOOD |
+D:Aggressive tusked beasts common to woodland regions.
+
+N:40:Shrieker mushroom patch
+G:,:R
+I:110:1d1:4:1:0
+W:2:1:40:1
+E:0:0:0:0:0:0
+O:0:0:0:0
+F:FORCE_SLEEP | NEVER_MOVE | NEVER_BLOW |
+F:STUPID | EMPTY_MIND |
+F:IM_POIS | WILD_TOO | DROP_CORPSE |
+F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT
+S:1_IN_4 |
+S:SHRIEK
+D:Yum! It looks quite tasty. It doesn't sound so nice, though.
+
+# New monster added by furiosity for the Theme module
+N:41:Cow
+G:c:u
+I:70:7d7:0:50:255
+W:0:1:3500:0
+E:0:1:0:2:1:2
+O:0:0:0:0
+B:KICK:HURT:7d7
+B:BUTT:HURT:7d7
+B:KICK:HURT:7d7
+B:BUTT:HURT:7d7
+F:BASEANGBAND | ANIMAL | MORTAL | DROP_CORPSE | WILD_ONLY | WILD_GRASS |
+F:FRIEND | FRIENDS | FORCE_SLEEP | WEIRD_MIND | SUSCEP_POIS | NEUTRAL | NO_TARGET |
+D:Domestic horned beasts kept throughout Middle-earth.
+D:Utterly harmless, unless angered.
+
+# New monster added by furiosity for the Theme module
+#N:42:Pony
+#G:c:y
+#I:120:4d5:0:200
+#W:0:1:1000:0
+#E:0:1:0:2:1:2
+#O:0:0:0:0
+#B:KICK:HURT:4d5
+#B:KICK:HURT:4d5
+#B:KICK:HURT:4d5
+#B:KICK:HURT:4d5
+#F:BASEANGBAND | ANIMAL | MORTAL | DROP_CORPSE | WILD_ONLY | WILD_GRASS |
+#F:FORCE_SLEEP | WEIRD_MIND | SUSCEP_POIS | NEUTRAL | NO_TARGET | WILD_TOWN |
+#D:It's a short, stocky pack animal, related to the horse, but smaller.
+#D:A common beast of burden in Middle-earth, especially used by Hobbits
+#D:and Dwarves. It won't attack you unless provoked.
+
+N:43:Novice warrior
+G:p:u
+I:110:9d4:20:16:5
+W:2:1:1600:6
+E:1:1:1:2:1:1
+O:25:50:0:20
+B:HIT:HURT:1d7
+B:HIT:HURT:1d6
+F:MALE |
+F:DROP_60 | WILD_TOO | DROP_SKELETON | DROP_CORPSE |
+F:OPEN_DOOR | BASH_DOOR |
+F:MORTAL | BASEANGBAND | HAS_LITE
+D:He looks inexperienced but tough.
+
+N:44:Novice rogue
+G:p:b
+I:110:8d4:20:12:5
+W:2:1:1400:6
+E:1:1:1:2:1:1
+O:50:25:0:20
+B:HIT:HURT:1d6
+B:TOUCH:EAT_GOLD
+F:MALE |
+F:DROP_60 | DROP_SKELETON | DROP_CORPSE |
+F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | WILD_TOO |
+F:EVIL | MORTAL | BASEANGBAND
+D:A rather shifty individual.
+
+N:45:Novice priest
+G:p:g
+I:110:7d4:20:10:10
+W:2:1:1500:6
+E:1:1:1:2:1:1
+O:25:0:50:20
+B:HIT:HURT:1d5
+F:MALE |
+F:FORCE_SLEEP | GOOD | WILD_TOO | DROP_SKELETON | DROP_CORPSE |
+F:DROP_60 |
+F:OPEN_DOOR | BASH_DOOR |
+F:MORTAL | BASEANGBAND | HAS_LITE
+S:1_IN_12 |
+S:HEAL | SCARE | CAUSE_1
+D:He is tripping over his priestly robes.
+
+N:46:Novice mage
+G:p:r
+I:110:6d4:20:6:5
+W:2:1:1400:6
+E:1:1:1:2:1:1
+O:25:0:70:0
+B:HIT:HURT:1d4
+F:MALE |
+F:FORCE_SLEEP | WILD_TOO | DROP_SKELETON | DROP_CORPSE |
+F:DROP_60 |
+F:OPEN_DOOR | BASH_DOOR |
+F:MORTAL | BASEANGBAND | HAS_LITE
+S:1_IN_12 |
+S:BLINK | BLIND | CONF | MISSILE
+D:He is leaving behind a trail of dropped spell components.
+
+N:47:Yellow mushroom patch
+G:,:y
+I:110:1d1:2:1:0
+W:2:1:30:2
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:SPORE:TERRIFY:1d6
+F:NEVER_MOVE | WILD_TOO |
+F:STUPID | EMPTY_MIND |
+F:IM_POIS |
+F:NO_CONF | NO_SLEEP | NO_FEAR |
+F:MORTAL | BASEANGBAND | NO_CUT
+D:Yum! It looks quite tasty.
+
+N:48:White jelly
+G:j:w
+I:120:8d8:2:1:99
+W:2:1:2000:10
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:TOUCH:POISON:1d2
+F:NEVER_MOVE | CAN_SWIM |
+F:STUPID | EMPTY_MIND |
+F:IM_POIS | HURT_LITE |
+F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT
+D:It's a large pile of white flesh.
+
+N:49:Giant black ant
+G:a:D
+I:110:3d6:8:20:80
+W:2:1:500:8
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:BITE:HURT:1d4
+F:RAND_25 |
+F:WEIRD_MIND | DROP_SKELETON |
+F:BASH_DOOR | WILD_TOO | WILD_WOOD | WILD_GRASS |
+F:ANIMAL | MORTAL | BASEANGBAND
+D:It is about three feet long.
+
+N:50:Salamander
+G:R:o
+I:110:4d6:8:20:80
+W:2:1:100:10
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:BITE:FIRE:1d3
+F:RAND_25 | CAN_SWIM | WILD_TOO | WILD_VOLCANO | DROP_CORPSE |
+F:ANIMAL | IM_FIRE | SUSCEP_COLD |
+F:MORTAL | BASEANGBAND
+D:A small black and orange lizard.
+
+N:51:White harpy
+G:H:w
+I:110:2d5:16:17:10
+W:2:1:500:5
+E:0:1:1:0:1:0
+O:0:0:0:0
+B:CLAW:HURT:1d1
+B:CLAW:HURT:1d1
+B:BITE:HURT:1d2
+F:FEMALE | CAN_FLY | WILD_TOO | WILD_MOUNTAIN |
+F:RAND_50 | DROP_CORPSE | ANIMAL | EVIL | MORTAL | BASEANGBAND
+D:A flying, screeching bird with a woman's face.
+
+# New monster added by furiosity for the Theme module
+N:52:Deer
+G:c:U
+I:110:8d8:0:30:255
+W:0:1:3000:0
+E:0:1:0:0:1:2
+O:0:0:0:0
+B:KICK:HURT:8d8
+B:BUTT:HURT:8d8
+B:KICK:HURT:8d8
+B:BUTT:HURT:8d8
+F:BASEANGBAND | ANIMAL | MORTAL | DROP_CORPSE | WILD_ONLY | WILD_GRASS |
+F:FORCE_SLEEP | WEIRD_MIND | SUSCEP_POIS | NEUTRAL | NO_TARGET | WILD_WOOD |
+D:Graceful creature found throughout Middle-earth. Deer are
+D:traditionally dedicated to the Vala Nessa, and are said to
+D:follow her as she travels through the wild lands. They will
+D:never attack without provocation.
+
+N:53:Grip, Farmer Maggot's dog
+G:C:w
+I:120:7d5:30:30:0
+W:2:2:600:30
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:BITE:HURT:1d6
+F:UNIQUE | SPECIAL_GENE
+F:FORCE_MAXHP | RAND_25 | DROP_CORPSE
+F:BASH_DOOR | ANIMAL
+F:MORTAL | BASEANGBAND
+D:A rather vicious dog belonging to Farmer Maggot. It thinks you are
+D:stealing mushrooms.
+
+N:54:Wolf, Farmer Maggot's dog
+G:C:w
+I:120:7d5:30:30:0
+W:2:2:650:30
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:BITE:HURT:1d6
+F:UNIQUE | SPECIAL_GENE
+F:FORCE_MAXHP | RAND_25 | DROP_CORPSE
+F:BASH_DOOR
+F:ANIMAL | MORTAL | BASEANGBAND
+D:A rather vicious dog belonging to Farmer Maggot. It thinks you are
+D:stealing mushrooms.
+
+N:55:Fang, Farmer Maggot's dog
+G:C:w
+I:120:7d5:30:30:0
+W:2:2:700:30
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:BITE:HURT:1d6
+F:UNIQUE | SPECIAL_GENE
+F:FORCE_MAXHP | RAND_25 | DROP_CORPSE
+F:BASH_DOOR
+F:ANIMAL | MORTAL | BASEANGBAND
+D:A rather vicious dog belonging to Farmer Maggot. It thinks you are
+D:stealing mushrooms.
+
+N:56:Giant green frog
+G:R:g
+I:110:2d8:12:8:30
+W:2:1:200:6
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:BITE:HURT:1d3
+F:RAND_25 | WILD_ONLY | WILD_SHORE | DROP_CORPSE |
+F:BASH_DOOR |
+F:ANIMAL | MORTAL | BASEANGBAND
+D:It is as big as a wolf.
+
+# New monster added by furiosity for the Theme module
+N:57:Lion
+G:f:R
+I:120:14d20:50:60:0
+W:24:2:3000:80
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:BITE:TERRIFY:2d8
+B:CLAW:HURT:2d16
+B:CLAW:HURT:2d16
+F:BASH_DOOR | WILD_TOO | WILD_GRASS | WILD_WOOD | WILD_MOUNTAIN |
+F:ANIMAL | DROP_SKELETON | DROP_CORPSE | MORTAL | BASEANGBAND
+D:Master of all felines, it's a huge cat with enormous paws
+D:and a thick mane. Its roar is deafeningly terrifying.
+
+N:58:Green worm mass
+G:w:g
+I:100:6d4:7:3:10
+W:2:1:40:3
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:CRAWL:ACID:1d3
+F:RAND_50 | RAND_25 |
+F:STUPID | WEIRD_MIND |
+F:ANIMAL | IM_ACID | CAN_SWIM |
+F:HURT_LITE | NO_FEAR |
+F:MORTAL | BASEANGBAND | NO_CUT
+S:MULTIPLY
+D:It is a large slimy mass of worms.
+
+N:59:Large yellow snake
+G:J:y
+I:100:4d8:5:38:75
+W:2:1:1000:9
+E:0:0:0:0:1:0
+O:0:0:0:0
+B:BITE:HURT:1d4
+B:CRUSH:HURT:1d6
+F:RAND_25 | CAN_SWIM | WILD_TOO | DROP_SKELETON | DROP_CORPSE
+F:BASH_DOOR | HAS_EGG | ANIMAL | MORTAL | BASEANGBAND
+D:It is about ten feet long.
+
+N:60:Cave spider
+G:S:D
+I:120:2d6:8:16:80
+W:2:1:400:7
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:BITE:HURT:1d4
+F:FRIENDS |
+F:WEIRD_MIND | BASH_DOOR | DROP_SKELETON | DROP_CORPSE |
+F:ANIMAL | SPIDER | HURT_LITE |
+F:MORTAL | BASEANGBAND
+D:It is a black spider that moves in fits and starts.
+
+N:61:Crow
+G:B:s
+I:120:3d5:40:12:0
+W:2:2:300:8
+E:0:1:1:0:1:0
+O:0:0:0:0
+B:BITE:HURT:1d3
+B:BITE:HURT:1d3
+F:ANIMAL | WILD_TOO | WILD_WOOD | CAN_FLY | DROP_CORPSE
+F:MORTAL | HAS_EGG | BASEANGBAND | AQUATIC
+D:It is a hooded crow, gray except for the black wings and head.
+
+N:62:Wild cat
+G:f:U
+I:120:3d5:40:12:0
+W:2:2:200:8
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:CLAW:HURT:1d3
+B:CLAW:HURT:1d3
+F:BASH_DOOR | WILD_TOO | DROP_SKELETON | DROP_CORPSE |
+F:ANIMAL | MORTAL | BASEANGBAND
+D:A larger than normal feline, hissing loudly. Its velvet claws conceal a
+D:fistful of needles.
+
+N:63:Smeagol
+G:h:B
+I:130:20d20:20:12:5
+W:7:2:670:16
+E:1:1:1:2:1:1
+O:50:50:0:0
+B:TOUCH:EAT_GOLD
+B:BITE:HURT:2d4
+F:UNIQUE | MALE | CAN_SWIM | DROP_SKELETON | DROP_CORPSE | DROP_CHOSEN |
+F:FORCE_MAXHP | CAN_SPEAK | SMART |
+F:RAND_50 | RAND_25 | WILD_TOO |
+F:ONLY_ITEM | DROP_90 | DROP_GOOD | DROP_GREAT |
+F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | INVISIBLE
+F:EVIL | BASEANGBAND
+S:1_IN_25 |
+S:S_SPIDER
+D:Also known as Gollum. He is of the Periannath, but does not look it.
+D:He is thin and frail, sneaking around in dark corners, hoping to
+D:reclaim his "precious," and he'll use any means necessary to do so.
+
+N:64:Green ooze
+G:j:g
+I:120:3d4:8:16:80
+W:3:2:300:4
+E:0:0:0:0:0:0
+O:50:0:25:20
+B:CRAWL:ACID:1d3
+F:RAND_50 | RAND_25 | DROP_90 |
+F:STUPID | EMPTY_MIND |
+F:IM_ACID | IM_POIS | CAN_SWIM |
+F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT
+D:It's green and it's oozing.
+
+N:65:Poltergeist
+G:G:s
+I:130:2d5:8:15:10
+W:3:1:0:8
+E:0:0:0:0:0:0
+O:50:5:30:10
+B:TOUCH:TERRIFY
+F:RAND_50 | RAND_25 | CAN_FLY |
+F:DROP_60 | DROP_90 |
+F:INVISIBLE | COLD_BLOOD | PASS_WALL | TAKE_ITEM |
+F:EVIL | UNDEAD |
+F:IM_COLD | IM_POIS | HURT_LITE | NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT
+S:1_IN_15 |
+S:BLINK
+D:It is a ghastly, ghostly form.
+
+N:66:Yellow jelly
+G:j:y
+I:120:10d8:2:1:99
+W:3:1:2000:12
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:TOUCH:POISON:1d3
+F:NEVER_MOVE | CAN_SWIM |
+F:STUPID | EMPTY_MIND |
+F:IM_POIS | HURT_LITE |
+F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT
+S:1_IN_15 |
+S:DRAIN_MANA
+D:It's a large pile of yellow flesh.
+
+# New monster added by furiosity for the Theme module
+N:67:Squirrel
+G:r:o
+I:110:1d2:30:1:10
+W:0:3:100:0
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:BITE:HURT:1d1
+F:WILD_ONLY | WILD_GRASS | WILD_WOOD |
+F:ANIMAL | DROP_SKELETON | DROP_CORPSE | NEUTRAL | NO_TARGET |
+F:MORTAL | BASEANGBAND
+D:A funny chittering creature, looking for nuts.
+
+N:68:Raven
+G:B:W
+I:120:4d5:40:12:0
+W:4:2:500:8
+E:0:1:1:0:1:0
+O:0:0:0:0
+B:BITE:HURT:1d4
+B:BITE:HURT:1d4
+F:ANIMAL | WILD_ONLY | WILD_WOOD | CAN_FLY | DROP_CORPSE
+F:MORTAL | HAS_EGG | NEUTRAL | NO_TARGET | IMPRESED | BASEANGBAND | AQUATIC
+D:Larger than a crow, and pitch black.
+
+N:69:White midge
+G:I:w
+I:120:1d1:6:5:10
+W:3:1:100:1
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:BITE:HURT:1d1
+F:RAND_50 | RAND_25 | CAN_FLY |
+F:WEIRD_MIND | ANIMAL | MORTAL | BASEANGBAND
+S:MULTIPLY
+D:It is an evil relative of the moth, native to marshlands.
+
+# New monster added by furiosity for the Theme module
+# Based on the Vorpal bunny from Zangband
+N:70:Squirrel of Mirkwood
+G:r:g
+I:120:10d10:40:40:0
+W:13:1:600:40
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:BITE:HURT:6d1
+B:BITE:HURT:7d1
+F:WILD_TOO | WILD_WOOD | DROP_CORPSE | CAN_FLY |
+F:ANIMAL | MORTAL | BASEANGBAND
+D:An ominous-looking squirrel with dark fur, covered in
+D:leaves for better masquerade. It has glowing eyes and
+D:unusually sharp teeth. It is a horrific creation of the
+D:Necromancer in Dol Guldur, a corrupted form of a normal
+D:squirrel.
+
+N:71:Black naga
+G:n:D
+I:110:6d8:16:40:120
+W:3:1:1700:20
+E:0:0:0:0:1:0
+O:0:75:20:5
+B:CRUSH:HURT:1d8
+F:FEMALE |
+F:RAND_25 | DROP_60 | DROP_CORPSE |
+F:BASH_DOOR | CAN_SWIM |
+F:EVIL | MORTAL | BASEANGBAND
+D:A large black serpent's body with a female torso.
+
+N:72:Spotted mushroom patch
+G:,:o
+I:110:1d1:2:1:0
+W:3:1:30:3
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:SPORE:POISON:2d4
+F:NEVER_MOVE | WILD_TOO |
+F:STUPID | EMPTY_MIND |
+F:IM_POIS |
+F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT
+D:Yum! It looks quite tasty.
+
+N:73:Silver jelly
+G:j:W
+I:120:10d8:2:1:99
+W:3:2:2000:12
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:TOUCH:EAT_LITE:1d3
+B:TOUCH:EAT_LITE:1d3
+F:NEVER_MOVE | CAN_SWIM |
+F:STUPID | EMPTY_MIND |
+F:IM_POIS | HURT_LITE |
+F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT
+S:1_IN_15 |
+S:DRAIN_MANA
+D:It is a large pile of silver flesh that sucks all light from its
+D:surroundings.
+
+N:74:Scruffy-looking hobbit
+G:h:s
+I:110:3d5:16:8:10
+W:3:1:1000:4
+E:1:1:1:2:1:1
+O:0:50:0:40
+B:HIT:HURT:1d4
+B:TOUCH:EAT_GOLD
+F:MALE |
+F:DROP_60 |
+F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | DROP_SKELETON | DROP_CORPSE |
+F:MORTAL | BASEANGBAND
+D:A short little guy, in bedraggled clothes. He appears to be looking
+D:for a good tavern.
+
+N:75:Giant white ant
+G:a:w
+I:110:3d6:8:16:80
+W:3:1:800:7
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:BITE:HURT:1d4
+F:WEIRD_MIND | BASH_DOOR | WILD_TOO | WILD_GRASS |
+F:ANIMAL | DROP_SKELETON |
+F:MORTAL | BASEANGBAND
+D:It is about two feet long and has sharp pincers.
+
+N:76:Yellow mold
+G:m:y
+I:110:8d8:2:10:99
+W:3:1:30:9
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:SPORE:HURT:1d4
+F:NEVER_MOVE |
+F:STUPID | EMPTY_MIND |
+F:IM_POIS |
+F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT
+D:It is a strange growth on the dungeon floor.
+
+# New monster added by furiosity for the Theme module
+N:77:Ape
+G:q:y
+I:115:5d10:8:10:2
+W:8:10:800:10
+E:1:1:1:2:1:1
+O:0:0:0:0
+B:BITE:HURT:2d2
+B:BITE:DISEASE:1d1
+B:BITE:EAT_FOOD:1d1
+F:BASEANGBAND | ANIMAL | MORTAL | AI_ANNOY |
+F:RAND_50 | RAND_25 | SMART | WEIRD_MIND |
+S:1_IN_10
+S:SHRIEK
+D:A large humanoid form, relatively rare on Middle-earth.
+D:It is bounding toward you, noisy and dirty.
+
+N:78:Yellow worm mass
+G:w:y
+I:100:4d8:7:4:10
+W:3:2:200:4
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:CRAWL:LOSE_DEX:1d3
+F:RAND_50 | RAND_25 | CAN_SWIM |
+F:STUPID | WEIRD_MIND |
+F:ANIMAL | HURT_LITE | NO_FEAR |
+F:MORTAL | BASEANGBAND | NO_CUT
+S:MULTIPLY
+D:It is a large slimy mass of worms.
+
+N:79:Clear worm mass
+G:w:B
+I:100:4d4:7:1:10
+W:3:2:200:4
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:CRAWL:POISON:1d2
+F:ATTR_CLEAR | CAN_SWIM |
+F:RAND_50 | RAND_25 |
+F:STUPID | WEIRD_MIND | INVISIBLE |
+F:ANIMAL |
+F:IM_POIS | HURT_LITE | NO_FEAR |
+F:MORTAL | BASEANGBAND | NO_CUT
+S:MULTIPLY
+D:It is a disgusting mass of poisonous worms.
+
+N:80:Radiation eye
+G:e:R
+I:110:3d6:2:6:10
+W:3:1:500:6
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:GAZE:LOSE_STR:1d6
+F:NEVER_MOVE | CAN_FLY | DROP_CORPSE |
+F:HURT_LITE | NO_FEAR | BASEANGBAND | HAS_LITE
+S:1_IN_11 |
+S:DRAIN_MANA
+D:A disembodied eye, crackling with energy.
+
+N:81:Yellow light
+G:*:y
+I:120:2d6:8:12:30
+W:4:1:0:4
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:EXPLODE:BLIND
+F:EMPTY_MIND | CAN_FLY | NONLIVING | SUSCEP_ELEC |
+F:BASEANGBAND | HAS_LITE | RAND_50 | RAND_25 | NO_CUT
+D:A fast-moving bright light, apparently totally random in its movement.
+
+N:82:Cave lizard
+G:R:u
+I:110:3d6:8:16:80
+W:4:1:100:8
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:BITE:HURT:1d5
+F:ANIMAL | CAN_SWIM | DROP_CORPSE | HAS_EGG | WILD_ONLY
+F:MORTAL | NEUTRAL | NO_TARGET | IMPRESED | BASEANGBAND
+D:It is an armoured lizard with a powerful bite.
+
+N:83:Novice ranger
+G:p:W
+I:110:6d8:20:8:5
+W:4:1:1400:18
+E:1:1:1:2:1:1
+O:25:45:25:0
+B:HIT:HURT:1d5
+B:HIT:HURT:1d5
+F:MALE |
+F:FORCE_SLEEP | DROP_SKELETON | DROP_CORPSE
+F:DROP_60 |
+F:OPEN_DOOR | BASH_DOOR | WILD_TOO | WILD_WOOD |
+F:MORTAL | BASEANGBAND | HAS_LITE
+S:1_IN_9 |
+S:ARROW_2 | MISSILE
+D:An agile hunter, ready and relaxed.
+
+N:84:Blue jelly
+G:j:b
+I:110:12d8:2:1:99
+W:4:1:2000:14
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:TOUCH:COLD:1d6
+F:NEVER_MOVE | COLD_BLOOD |
+F:STUPID | EMPTY_MIND | CAN_SWIM |
+F:IM_COLD | HURT_LITE |
+F:NO_CONF | NO_SLEEP | NO_FEAR | SUSCEP_FIRE | BASEANGBAND | NO_CUT
+D:It's a large pile of pulsing blue flesh.
+
+N:85:Creeping copper coins
+G:$:u
+I:100:7d8:3:24:10
+W:4:3:0:9
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:HIT:HURT:1d4
+B:TOUCH:POISON:2d4
+F:ONLY_GOLD | DROP_1D2 | SUSCEP_ACID |
+F:COLD_BLOOD | BASH_DOOR |
+F:IM_ELEC | IM_POIS | CHAR_MULTI |
+F:NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT
+D:It appears to be a pile of copper coins, until it starts crawling towards you
+D:on tiny legs.
+
+N:86:Giant white rat
+G:r:W
+I:110:2d2:8:7:30
+W:4:1:200:1
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:BITE:POISON:1d3
+F:RAND_25 |
+F:ANIMAL | MORTAL | BASEANGBAND
+S:MULTIPLY
+D:It is a very vicious rodent.
+
+N:87:Snotling
+G:o:U
+I:110:5d5:20:32:30
+W:4:1:900:15
+E:1:1:1:2:1:1
+O:25:50:0:20
+B:HIT:HURT:1d6
+F:MALE |
+F:FRIENDS | DROP_60 | RAND_50 | DROP_SKELETON | DROP_CORPSE |
+F:OPEN_DOOR | BASH_DOOR | WILD_TOO | WILD_WOOD |
+F:EVIL | ORC | HURT_LITE |
+F:MORTAL | BASEANGBAND | HAS_LITE
+D:Immature Orcling, running wild and screaming all the time.
+
+N:88:Swordfish
+G:~:W
+I:120:4d7:14:10:20
+W:4:2:800:15
+E:0:0:0:0:1:0
+O:0:0:0:0
+B:HIT:HURT:1d5
+B:HIT:HURT:1d5
+F:ANIMAL | AQUATIC | WILD_TOO | COLD_BLOOD |
+F:MORTAL | BASEANGBAND
+D:A fish with a swordlike "beak".
+
+N:89:Blue worm mass
+G:w:b
+I:100:5d8:7:12:10
+W:4:1:40:5
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:CRAWL:COLD:1d4
+F:RAND_50 | RAND_25 |
+F:STUPID | WEIRD_MIND | COLD_BLOOD |
+F:ANIMAL | IM_COLD | CAN_SWIM |
+F:HURT_LITE | NO_FEAR |
+F:MORTAL | SUSCEP_FIRE | BASEANGBAND | NO_CUT
+S:MULTIPLY
+D:It is a large slimy mass of worms.
+
+N:90:Large grey snake
+G:J:s
+I:100:6d8:6:41:50
+W:4:1:1300:14
+E:0:0:0:0:1:0
+O:0:0:0:0
+B:BITE:HURT:1d5
+B:CRUSH:HURT:1d8
+F:RAND_25 | CAN_SWIM | DROP_SKELETON | DROP_CORPSE | WILD_TOO |
+F:BASH_DOOR | HAS_EGG | ANIMAL | MORTAL | BASEANGBAND
+D:It is about ten feet long.
+
+# New monster added by furiosity for the Theme module
+# Ranger chieftain without the magic other than arrows
+N:91:Corsair of Umbar
+G:p:U
+I:120:50d20:20:60:10
+W:41:2:1800:1500
+E:1:1:1:2:1:1
+O:30:50:20:0
+B:HIT:HURT:5d5
+B:HIT:HURT:5d5
+B:HIT:HURT:5d5
+F:MALE |
+F:FORCE_SLEEP | FORCE_MAXHP | DROP_SKELETON | DROP_CORPSE
+F:ONLY_ITEM | DROP_2D2 | TAKE_ITEM |
+F:SMART | OPEN_DOOR | BASH_DOOR |
+F:EVIL | NO_CONF | NO_SLEEP | IM_FIRE | IM_ELEC | IM_COLD | IM_POIS |
+F:MORTAL | BASEANGBAND | HAS_LITE
+S:1_IN_4 |
+S:ARROW_2 | ARROW_3 | ARROW_4 | MISSILE |
+D:A person with no love for Gondor. He thinks you are a soldier in
+D:the King's army.
+
+# New monster added by furiosity for the Theme module
+# Master rogue with some tweaks
+N:92:Dunlending
+G:p:g
+I:120:15d9:20:30:40
+W:25:2:1600:130
+E:1:1:1:2:1:1
+O:80:10:10:0
+B:HIT:HURT:2d8
+B:HIT:HURT:2d8
+B:HIT:POISON:2d8
+F:MALE | DROP_SKELETON | DROP_CORPSE |
+F:DROP_2D2 | SUSCEP_ELEC | FRIENDS |
+F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR |
+F:EVIL | MORTAL | BASEANGBAND | HAS_LITE
+S:1_IN_5 |
+S:ARROW_1 |
+D:A person with no love for Rohan. He thinks you are a Rider of the
+D:Mark in disguise.
+
+N:93:Apprentice mage
+G:p:r
+I:110:6d4:20:6:10
+W:6:2:1400:6
+E:1:1:1:2:1:1
+O:25:0:70:0
+B:HIT:HURT:1d4
+F:MALE |
+F:FORCE_SLEEP |
+F:FRIENDS | DROP_60 | WILD_TOO | DROP_SKELETON | DROP_CORPSE |
+F:OPEN_DOOR | BASH_DOOR
+F:MORTAL | BASEANGBAND | HAS_LITE
+S:1_IN_12 |
+S:BLINK | BLIND | CONF | MISSILE
+D:He is leaving behind a trail of dropped spell components.
+
+N:94:Green naga
+G:n:g
+I:110:9d8:18:40:120
+W:5:1:1700:30
+E:0:0:0:0:1:0
+O:0:25:0:65
+B:CRUSH:HURT:1d8
+B:SPIT:ACID:2d6
+F:FEMALE |
+F:RAND_25 | TAKE_ITEM | DROP_60 | DROP_CORPSE |
+F:BASH_DOOR | CAN_SWIM | WILD_TOO | WILD_SHORE |
+F:EVIL | IM_ACID | MORTAL | BASEANGBAND
+D:A large green serpent with a female torso. Her green skin glistens with
+D:acid.
+
+N:95:Giant leech
+G:w:u
+I:120:6d8:10:20:50
+W:5:1:30:20
+E:0:0:0:0:1:0
+O:0:0:0:0
+B:BITE:HURT:3d1
+B:BITE:HURT:3d1
+F:ANIMAL | AQUATIC | WEIRD_MIND | RAND_25 | BASEANGBAND
+D:Yech! The disgusting thing only wants your blood!
+
+N:96:Barracuda
+G:~:G
+I:120:6d8:20:45:20
+W:5:2:150:30
+E:0:0:0:0:1:0
+O:0:0:0:0
+B:BITE:HURT:1d10
+B:BITE:HURT:1d10
+F:AQUATIC | ANIMAL | WILD_TOO | COLD_BLOOD |
+F:MORTAL | BASEANGBAND
+D:A predatory fish with razor-sharp teeth.
+
+N:97:Novice paladin
+G:p:w
+I:110:6d8:20:16:5
+W:4:1:1700:18
+E:1:1:1:2:1:1
+O:0:70:25:0
+B:HIT:HURT:1d7
+B:HIT:HURT:1d7
+F:MALE | GOOD | WILD_TOO | DROP_SKELETON | DROP_CORPSE |
+F:FORCE_SLEEP |
+F:DROP_60 |
+F:OPEN_DOOR | BASH_DOOR |
+F:MORTAL | BASEANGBAND | HAS_LITE
+S:1_IN_9 |
+S:SCARE | CAUSE_1
+D:An adventurer both devoutly religious and skillful in combat.
+D:He seems to consider you an agent of Morgoth.
+
+# New monster added by furiosity for the Theme module
+N:98:Man of Harad
+G:p:u
+I:110:16d10:20:50:40
+W:17:1:3000:70
+E:1:1:1:2:1:1
+O:30:70:0:0
+B:HIT:HURT:1d4
+B:HIT:HURT:1d4
+B:BITE:HURT:1d6
+F:MALE |
+F:FRIENDS | DROP_60 | WILD_TOO | WILD_WOOD | DROP_SKELETON | DROP_CORPSE |
+F:OPEN_DOOR | BASH_DOOR | REGENERATE | MALE |
+F:EVIL | HURT_LITE | BASEANGBAND
+D:A dark-skinned human who worships Sauron. A powerful warrior,
+D:almost as strong as a troll. He has bizarre white eyes.
+
+N:99:Blue ooze
+G:j:b
+I:110:3d4:8:16:80
+W:5:1:300:7
+E:0:0:0:0:0:0
+O:45:20:20:0
+B:CRAWL:COLD:1d4
+F:RAND_50 | RAND_25 | DROP_60 |
+F:STUPID | EMPTY_MIND | CAN_SWIM |
+F:IM_COLD | SUSCEP_FIRE
+F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT
+D:It's blue and it's oozing.
+
+N:100:Green glutton ghost
+G:G:g
+I:130:3d4:10:20:10
+W:5:1:0:15
+E:0:0:0:0:0:0
+O:30:30:30:5
+B:TOUCH:EAT_FOOD:1d1
+F:RAND_50 | RAND_25 |
+F:DROP_60 | DROP_90 | CAN_FLY |
+F:INVISIBLE | COLD_BLOOD | PASS_WALL |
+F:EVIL | UNDEAD | NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT
+D:It is a very ugly green ghost with a voracious appetite.
+
+N:101:Green jelly
+G:j:g
+I:120:22d8:2:1:99
+W:5:1:2500:18
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:TOUCH:ACID:1d2
+F:NEVER_MOVE |
+F:STUPID | EMPTY_MIND | CAN_SWIM |
+F:IM_ACID | HURT_LITE |
+F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT
+D:It is a large pile of pulsing green flesh.
+
+# New monster added for the Theme module
+# From UnAngband
+N:102:Lurtz, Uruk Captain of the White Hand
+G:o:g
+I:110:72d10:20:95:50
+W:22:3:1800:550
+E:1:1:1:2:1:1
+O:0:50:0:50
+B:HIT:HURT:3d8
+B:HIT:HURT:3d5
+B:HIT:HURT:3d5
+F:BASEANGBAND | UNIQUE | FORCE_MAXHP | CAN_SPEAK | SMART |
+F:EVIL | ORC | OPEN_DOOR | BASH_DOOR | IM_FIRE | IM_COLD |
+F:IM_POIS | ESCORT | ESCORTS | DROP_1D2 | DROP_GOOD | MALE |
+D:A strong and cunning orc warrior, a commander of Saruman's orcs.
+
+# New monster added for the Theme module
+# From T-Plus by Ingeborg S. Norden
+N:103:Munchkin
+G:l:B
+I:120:35d50:255:75:0
+W:60:5:330:20000
+E:1:1:1:2:1:1
+O:0:45:45:10
+B:INSULT:INSANITY:2d10
+B:INSULT:EAT_GOLD:2d10
+B:INSULT:EAT_ITEM:2d10
+F:MALE | SMART | CAN_SPEAK | JOKEANGBAND |
+F:FORCE_MAXHP |
+F:RAND_25 |
+F:DROP_90 | DROP_GOOD | DROP_GREAT |
+F:DROP_4D2 | DROP_2D2 | ONLY_ITEM | AI_ANNOY |
+F:OPEN_DOOR | BASH_DOOR | POWERFUL | KILL_BODY | RES_NETH | RES_DISE |
+F:IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | NO_CONF | NO_SLEEP |
+F:RES_NEXU | RES_PLAS | HAS_LITE | NO_CUT | NO_STUN |
+F:REFLECTING |
+S:1_IN_5
+S:HEAL | HASTE | TPORT | TELE_AWAY | BLIND | CONF | SCARE |
+S:CAUSE_2 | FORGET | TRAPS |
+S:BO_MANA | ROCKET |
+D:This annoying little gnome won't stop bragging about his great
+D:magical powers and shiny new equipment--unless someone silences
+D:him permanently. Unfortunately, your own weapons and spells
+D:don't seem to work as well as they should on this fellow...
+
+N:104:Disenchanter eye
+G:e:v
+I:100:7d8:2:10:10
+W:5:2:500:20
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:GAZE:UN_BONUS
+F:ATTR_MULTI | ATTR_ANY | RES_DISE | DROP_CORPSE |
+F:NEVER_MOVE | CAN_FLY |
+F:HURT_LITE | NO_FEAR | BASEANGBAND
+S:1_IN_9 |
+S:DRAIN_MANA
+D:A disembodied eye, crackling with magic.
+
+N:105:Red worm mass
+G:w:r
+I:100:5d8:7:12:10
+W:5:1:40:6
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:CRAWL:FIRE:1d6
+F:RAND_50 | RAND_25 | SUSCEP_COLD |
+F:STUPID | EMPTY_MIND | BASH_DOOR |
+F:ANIMAL | IM_FIRE | CAN_SWIM |
+F:HURT_LITE | NO_FEAR |
+F:MORTAL | BASEANGBAND | NO_CUT
+S:MULTIPLY
+D:It is a large slimy mass of worms.
+
+N:106:Copperhead snake
+G:J:o
+I:110:4d6:6:20:1
+W:5:1:200:15
+E:0:0:0:0:1:0
+O:0:0:0:0
+B:BITE:POISON:2d4
+F:RAND_50 | CAN_SWIM | WILD_TOO | DROP_SKELETON | DROP_CORPSE | BASH_DOOR |
+F:ANIMAL | IM_POIS | HAS_EGG | MORTAL | BASEANGBAND
+D:It has a copper head and sharp venomous fangs.
+
+N:107:Death sword
+G:|:W
+I:130:6d6:20:40:0
+W:6:5:0:30
+E:0:0:0:0:0:0
+O:50:0:50:0
+B:HIT:HURT:5d5
+B:HIT:HURT:5d5
+B:HIT:HURT:5d5
+B:HIT:HURT:5d5
+F:NEVER_MOVE | NONLIVING | NO_FEAR | SUSCEP_ACID |
+F:STUPID | EMPTY_MIND | COLD_BLOOD | CHAR_MULTI | NO_CONF | NO_SLEEP |
+F:DROP_90 | EVIL | IM_COLD | IM_FIRE | FORCE_MAXHP | IM_ELEC | IM_POIS |
+F:BASEANGBAND | HAS_LITE | NO_CUT
+D:A bloodthirsty blade lurking for prey. Beware!
+
+N:108:Purple mushroom patch
+G:,:v
+I:110:1d1:2:1:0
+W:6:2:40:15
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:SPORE:LOSE_CON:1d2
+B:SPORE:LOSE_CON:1d2
+B:SPORE:LOSE_CON:1d2
+F:NEVER_MOVE | CAN_SWIM |
+F:STUPID | EMPTY_MIND |
+F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT
+D:Yuck! It doesn't look so tasty.
+
+N:109:Apprentice priest
+G:p:g
+I:110:7d4:20:10:5
+W:6:2:1500:6
+E:1:1:1:2:1:1
+O:20:50:20:5
+B:HIT:HURT:1d5
+F:MALE | GOOD |
+F:FORCE_SLEEP | WILD_TOO | DROP_SKELETON | DROP_CORPSE |
+F:FRIENDS | DROP_60 |
+F:OPEN_DOOR | BASH_DOOR |
+F:MORTAL | BASEANGBAND | HAS_LITE
+S:1_IN_12 |
+S:HEAL | SCARE | CAUSE_1
+D:He is tripping over his priestly robes.
+
+N:110:Apprentice warrior
+G:p:u
+I:110:9d4:20:16:5
+W:6:2:1600:6
+E:1:1:1:2:1:1
+O:0:95:0:0
+B:HIT:HURT:1d7
+B:HIT:HURT:1d6
+F:MALE |
+F:FRIENDS | DROP_60 | WILD_TOO |
+F:OPEN_DOOR | BASH_DOOR | DROP_SKELETON | DROP_CORPSE |
+F:MORTAL | BASEANGBAND | HAS_LITE
+D:He looks inexperienced but tough.
+
+# New monster added for the Theme module
+# Suggested by Atarlost in the t-o-m-e.net forums
+N:111:Petty-dwarf
+G:k:s
+I:110:6d6:25:80:200
+W:8:4:0:30
+B:HIT:HURT:3d4
+B:TOUCH:EAT_GOLD
+F:MALE
+F:DROP_1D2 | DROP_GOOD
+F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR
+F:EVIL
+S:1_IN_8
+S:ARROW_1
+D:A filthy little dwarf. He wants your purse, and judging by the
+D:size of his axe, he's quite likely to get it.
+
+# New monster added for the Theme module
+# Suggested by Atarlost in the t-o-m-e.net forums
+N:112:Petty-dwarf mage
+G:k:R
+I:120:7d10:20:16:20
+W:10:1:0:50
+B:HIT:HURT:1d6
+B:HIT:HURT:UN_BONUS:1d6
+F:MALE
+F:FORCE_SLEEP
+F:ONLY_ITEM | DROP_1D2
+F:OPEN_DOOR | BASH_DOOR
+F:EVIL
+S:1_IN_5
+S:BLIND | CONF | MISSILE | DARKNESS | BA_POIS
+D:A small dwarf in mage's robes. He looks comical, but he has slain any
+D:adventurer foolish enough to laugh at him.
+
+N:113:Brown mold
+G:m:u
+I:110:15d8:2:12:99
+W:6:1:50:20
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:SPORE:CONFUSE:1d4
+F:NEVER_MOVE |
+F:STUPID | EMPTY_MIND |
+F:IM_POIS | CAN_SWIM |
+F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT
+D:A strange brown growth on the dungeon floor.
+
+N:114:Giant brown bat
+G:b:u
+I:130:3d8:10:15:30
+W:6:1:600:10
+E:0:1:1:0:1:0
+O:0:0:0:0
+B:BITE:HURT:1d3
+F:RAND_50 | CAN_FLY | WILD_TOO | WILD_MOUNTAIN | WILD_WOOD |
+F:ANIMAL | DROP_CORPSE | AI_ANNOY
+F:MORTAL | BASEANGBAND
+D:It screeches as it attacks.
+
+# New monster added by furiosity for the Theme module
+N:115:Butterfly
+G:I:B
+I:120:1d1:6:5:10
+W:3:1:100:1
+E:0:0:0:0:0:0
+O:0:0:0:0
+F:RAND_50 | RAND_25 | NEUTRAL | NO_TARGET | WILD_ONLY | WILD_WOOD | NEVER_BLOW |
+F:WEIRD_MIND | ANIMAL | MORTAL | BASEANGBAND | WILD_GRASS |
+D:A large insect with beautiful fluttering wings.
+
+N:116:Apprentice rogue
+G:p:b
+I:110:8d4:20:12:5
+W:6:2:1400:6
+E:1:1:1:2:1:1
+O:50:25:0:20
+B:HIT:HURT:1d6
+B:TOUCH:EAT_GOLD
+F:MALE | FRIENDS |
+F:DROP_60 | DROP_SKELETON | DROP_CORPSE |
+F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | WILD_TOO |
+F:EVIL | MORTAL | BASEANGBAND
+D:A rather shifty individual.
+
+N:117:Creeping silver coins
+G:$:s
+I:100:12d8:4:30:10
+W:6:3:0:18
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:HIT:HURT:1d6
+B:TOUCH:POISON:2d6
+F:ONLY_GOLD | DROP_60 | DROP_1D2 |
+F:COLD_BLOOD | BASH_DOOR | SUSCEP_ACID | CHAR_MULTI |
+F:IM_ELEC | IM_POIS | NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT
+D:It appears to be a pile of silver coins, until it starts crawling towards you
+D:on tiny legs.
+
+N:118:Snaga
+G:o:o
+I:110:8d8:20:32:30
+W:6:1:1600:15
+E:1:1:1:2:1:1
+O:20:50:5:15
+B:HIT:HURT:1d8
+F:MALE |
+F:FRIENDS | DROP_60 | WILD_TOO | DROP_SKELETON | DROP_CORPSE |
+F:OPEN_DOOR | BASH_DOOR |
+F:EVIL | ORC | HURT_LITE |
+F:MORTAL | BASEANGBAND | HAS_LITE
+D:He is one of the many weaker 'slave' orcs, often mistakenly known as a
+D:goblin.
+
+N:119:Rattlesnake
+G:J:r
+I:110:6d7:6:24:1
+W:6:1:200:20
+E:0:0:0:0:1:0
+O:0:0:0:0
+B:BITE:POISON:2d5
+F:RAND_50 | CAN_SWIM | WILD_TOO | DROP_SKELETON | DROP_CORPSE |
+F:BASH_DOOR | HAS_EGG | ANIMAL | IM_POIS | MORTAL | BASEANGBAND
+D:It is recognised by the hard-scaled end of its body that is often rattled
+D:to frighten its prey.
+
+N:120:Giant slug
+G:w:U
+I:100:12d9:10:25:25
+W:6:1:600:25
+E:0:0:0:0:1:0
+O:0:0:0:0
+B:BITE:ACID:2d4
+B:BITE:ACID:2d6
+F:ANIMAL | EMPTY_MIND | KILL_ITEM | KILL_BODY | CAN_SWIM | WILD_TOO |
+F:DROP_CORPSE |
+F:MORTAL | BASEANGBAND
+S:1_IN_10
+S:BR_ACID
+D:It is slowly making its way towards you, eating everything in
+D:its path...
+
+N:121:Giant pink frog
+G:R:r
+I:110:5d8:12:16:50
+W:7:1:200:16
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:BITE:LOSE_STR:2d4
+F:RAND_50 | WILD_ONLY | WILD_SHORE |
+F:BASH_DOOR | DROP_CORPSE |
+F:ANIMAL | MORTAL | BASEANGBAND
+D:It looks poisonous.
+
+N:122:Dark elf
+G:h:D
+I:110:7d10:20:16:20
+W:7:2:1200:25
+E:1:1:1:2:1:1
+O:20:20:50:10
+B:HIT:HURT:1d6
+B:HIT:HURT:1d6
+F:MALE |
+F:FORCE_SLEEP |
+F:DROP_90 |
+F:OPEN_DOOR | BASH_DOOR | DROP_SKELETON | DROP_CORPSE |
+F:EVIL | HURT_LITE | BASEANGBAND | HAS_LITE
+S:1_IN_10 |
+S:CONF | DARKNESS | MISSILE
+D:An elven figure with jet black skin and white hair, his eyes are large and
+D:twisted with evil.
+
+# New monster added by furiosity for the Theme module
+N:123:Moth
+G:I:W
+I:120:1d1:6:5:10
+W:3:1:100:1
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:BITE:EAT_LITE:1d1
+F:RAND_50 | RAND_25 | HURT_LITE | WILD_TOO | WILD_WOOD |
+F:WEIRD_MIND | ANIMAL | MORTAL | BASEANGBAND | WILD_GRASS |
+S:MULTIPLY
+D:Nocturnal insect of a kind closely related to butterflies.
+
+N:124:Crypt creep
+G:s:D
+I:110:6d8:20:12:14
+W:7:2:0:25
+E:1:1:1:2:1:1
+O:0:0:0:0
+B:CLAW:HURT:1d2
+B:CLAW:HURT:1d2
+B:BITE:POISON
+F:RAND_25
+F:COLD_BLOOD | OPEN_DOOR | BASH_DOOR | FRIENDS |
+F:EVIL | UNDEAD | IM_POIS | IM_COLD |
+F:NO_CONF | NO_SLEEP | HURT_LITE | BASEANGBAND | NO_CUT
+S:1_IN_10
+S:CAUSE_1 | S_UNDEAD
+D:A frightening skeletal figure in a black robe.
+
+N:125:Rotting corpse
+G:z:R
+I:110:8d8:20:20:20
+W:8:1:0:15
+E:1:1:1:2:1:1
+O:0:0:0:0
+B:CLAW:POISON:1d3
+B:CLAW:POISON:1d3
+F:OPEN_DOOR | BASH_DOOR | FRIENDS |
+F:NO_CONF | NO_SLEEP | UNDEAD | EVIL | NO_FEAR | IM_POIS |
+F:IM_COLD | COLD_BLOOD | EMPTY_MIND | BASEANGBAND | NO_CUT
+D:Corpses awakened from their sleep by dark sorcery.
+
+N:126:Cave orc
+G:o:G
+I:110:11d9:20:32:30
+W:7:1:1900:20
+E:1:1:1:2:1:1
+O:20:70:0:0
+B:HIT:HURT:1d8
+F:MALE |
+F:FRIENDS | DROP_60 | DROP_SKELETON | DROP_CORPSE |
+F:OPEN_DOOR | BASH_DOOR |
+F:EVIL | ORC | HURT_LITE |
+F:MORTAL | BASEANGBAND | HAS_LITE
+D:He is often found in huge numbers in deep caves.
+
+N:127:Wood spider
+G:S:U
+I:120:3d6:8:16:80
+W:7:3:600:15
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:BITE:HURT:1d3
+B:STING:POISON:1d4
+F:FRIENDS | DROP_SKELETON |
+F:WEIRD_MIND | BASH_DOOR | WILD_TOO | WILD_WOOD |
+F:ANIMAL | SPIDER | IM_POIS |
+F:MORTAL | BASEANGBAND
+D:It scuttles towards you.
+
+N:128:Hurog
+G:u:r
+I:110:8d8:20:32:30
+W:7:2:300:16
+E:1:1:1:2:1:1
+O:0:0:0:0
+B:HIT:HURT:1d8
+F:FRIENDS |
+F:OPEN_DOOR | BASH_DOOR |
+F:EVIL | DEMON | IM_FIRE | NO_FEAR | BASEANGBAND |
+S:1_IN_50 |
+S:BR_NETH
+D:A minor demonic servant of evil. Its features remind you of a dog - in fact,
+D:Huroeg are the result of the corruption of dogs by Morgoth.
+
+N:129:Bloodshot eye
+G:e:r
+I:110:10d8:2:6:10
+W:7:3:550:30
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:GAZE:BLIND:2d6
+F:NEVER_MOVE | CAN_FLY | DROP_CORPSE |
+F:HURT_LITE | NO_FEAR | BASEANGBAND | NO_CUT
+S:1_IN_7 |
+S:DRAIN_MANA
+D:A disembodied eye, bloodshot and nasty.
+
+N:130:Red naga
+G:n:R
+I:110:11d8:20:40:120
+W:7:2:1800:40
+E:0:0:0:0:1:0
+O:50:0:50:0
+B:CRUSH:HURT:1d10
+B:BITE:LOSE_STR:1d4
+F:FEMALE | CAN_SWIM | WILD_TOO | WILD_SHORE |
+F:RAND_25 | DROP_60 |
+F:TAKE_ITEM | BASH_DOOR | DROP_CORPSE |
+F:EVIL | MORTAL | BASEANGBAND
+D:A large red snake with a woman's torso.
+
+N:131:Red jelly
+G:j:r
+I:110:26d8:2:1:99
+W:7:1:2500:26
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:TOUCH:LOSE_STR:1d5
+F:NEVER_MOVE |
+F:STUPID | EMPTY_MIND |
+F:HURT_LITE | CAN_SWIM |
+F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT
+D:It is a large pulsating mound of red flesh.
+
+# New monster added by furiosity for the Theme module
+N:132:Nightingale
+G:B:B
+I:110:1d1:30:1:10
+W:0:3:80:0
+E:0:1:1:0:1:0
+O:0:0:0:0
+F:RAND_25 | CAN_FLY | WILD_ONLY | WILD_WOOD | WILD_GRASS |
+F:ANIMAL | DROP_SKELETON | NEVER_BLOW | NEUTRAL | NO_TARGET |
+F:MORTAL | BASEANGBAND | DG_CURSE |
+D:Small brown birds of thrush kind, famous for their clear
+D:singing, and the fact that they will sing during the night
+D:as well as the day (hence their name). Since the days of
+D:Luthien, the nightingales of Middle-earth are surrounded
+D:by a strange blue aura and are rumoured to be under great
+D:protection of the Valar.
+
+N:133:Lost soul
+G:G:W
+I:110:2d8:12:10:10
+W:7:2:0:18
+E:0:0:0:0:0:0
+O:60:0:25:0
+B:HIT:HURT:2d2
+B:TOUCH:LOSE_WIS
+F:RAND_50 | DROP_60 | DROP_90 | CAN_FLY |
+F:INVISIBLE | COLD_BLOOD | TAKE_ITEM | PASS_WALL |
+F:EVIL | UNDEAD |
+F:IM_COLD | NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT
+S:1_IN_15 |
+S:TPORT | DRAIN_MANA
+D:It is almost insubstantial.
+
+N:134:Night lizard
+G:R:b
+I:110:4d8:20:16:30
+W:7:2:400:35
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:BITE:HURT:1d6
+B:BITE:HURT:1d6
+F:ANIMAL | CAN_SWIM | WILD_TOO | DROP_CORPSE
+F:MORTAL | HAS_EGG | BASEANGBAND
+D:It is a black lizard with overlapping scales and a powerful jaw.
+
+# New monster added by furiosity for the Theme module
+N:135:Gorcrow
+G:B:G
+I:120:3d5:40:12:0
+W:3:2:300:10
+E:0:1:1:0:1:0
+O:0:0:0:0
+B:BITE:HURT:1d4
+B:BITE:HURT:1d4
+B:BITE:DISEASE:1d4
+F:ANIMAL | WILD_TOO | WILD_WOOD | CAN_FLY | DROP_CORPSE | WILD_SHORE |
+F:MORTAL | HAS_EGG | BASEANGBAND | EVIL | WILD_SWAMP | IMPRESED |
+D:It is a hooded crow, camouflaged well for a swampland or forest.
+D:It is a carrion bird that often lives close alongside the mewlips,
+D:the remains of whose prey it devours.
+
+N:136:Skeleton orc
+G:s:W
+I:110:10d8:20:36:40
+W:8:1:1700:26
+E:1:1:1:2:1:1
+O:0:0:0:0
+B:HIT:HURT:2d5
+F:COLD_BLOOD | EMPTY_MIND | OPEN_DOOR | BASH_DOOR |
+F:EVIL | ORC | UNDEAD |
+F:IM_COLD | IM_POIS |
+F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT
+D:It is an animated orc skeleton.
+
+N:137:Grima the Wormtongue, Agent of Saruman
+G:p:B
+I:110:28d10:20:30:20
+W:9:2:1500:150
+E:1:1:1:2:1:1
+O:10:50:35:0
+B:HIT:HURT:1d7
+B:HIT:HURT:1d7
+B:TOUCH:EAT_GOLD
+B:INSULT:*
+F:UNIQUE | MALE | CAN_SPEAK |
+F:FORCE_SLEEP | FORCE_MAXHP |
+F:ONLY_ITEM | DROP_1D2 | DROP_GOOD | DROP_GREAT |
+F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | DROP_SKELETON |
+F:EVIL | RES_TELE |
+F:MORTAL | BASEANGBAND | HAS_LITE
+S:1_IN_5 |
+S:HEAL | SLOW | TRAPS | BO_COLD | BA_POIS
+D:He was once the chief counsellor to King Theoden of Rohan.
+D:He betrayed king and country by becoming a spy for the
+D:corrupted Istari Saruman.
+
+N:138:Robin Hood, the Outlaw
+G:p:G
+I:120:16d12:20:30:20
+W:10:2:1600:150
+E:1:1:1:2:1:1
+O:20:80:0:0
+B:HIT:HURT:1d5
+B:HIT:HURT:1d5
+B:TOUCH:EAT_GOLD
+B:TOUCH:EAT_ITEM
+F:UNIQUE | MALE | FORCE_SLEEP | FORCE_MAXHP | CAN_SPEAK |
+F:ONLY_ITEM | DROP_1D2 | DROP_GOOD | DROP_GREAT | WILD_TOO | WILD_WOOD |
+F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | EVIL | DROP_SKELETON | DROP_CORPSE
+F:MORTAL | JOKEANGBAND | HAS_LITE
+S:1_IN_5
+S:ARROW_2 | HEAL | TRAPS
+D:The legendary archer who steals from the rich (you qualify).
+
+# New monster added by furiosity for the Theme module
+N:139:Gull
+G:B:o
+I:120:4d5:40:12:0
+W:4:2:500:8
+E:0:1:1:0:1:0
+O:0:0:0:0
+B:BITE:HURT:1d4
+B:BITE:HURT:1d4
+F:ANIMAL | WILD_ONLY | WILD_SHORE | CAN_FLY | DROP_CORPSE |
+F:MORTAL | BASEANGBAND | WILD_OCEAN | NEUTRAL | NO_TARGET |
+D:A sea-bird found around the shores of Middle-earth. The sound of a
+D:gull mewing is said to awaken the Sea-longing in the heart of an Elf.
+
+N:140:Lagduf, the Snaga
+G:o:o
+I:110:22d10:20:32:30
+W:8:2:1700:80
+E:1:1:1:2:1:1
+O:10:80:0:0
+B:HIT:HURT:1d11
+B:HIT:HURT:1d11
+B:HIT:HURT:1d10
+B:HIT:HURT:1d10
+F:UNIQUE | MALE | EVIL | ORC | FORCE_MAXHP | ESCORT |
+F:ONLY_ITEM | DROP_1D2 | DROP_GOOD | SPECIAL_GENE |
+F:OPEN_DOOR | BASH_DOOR | CAN_SPEAK | DROP_SKELETON | DROP_CORPSE |
+F:MORTAL | BASEANGBAND | HAS_LITE
+D:An orc soldier who served under Shagrat in the garrison of the Tower of Cirith Ungol.
+
+# New monster added by furiosity for the Theme module
+N:141:Kirinki
+G:B:R
+I:110:1d1:30:1:10
+W:1:9:80:0
+E:0:1:1:0:1:0
+O:0:0:0:0
+B:BITE:HURT:1d1
+F:RAND_25 | CAN_FLY | WILD_TOO | WILD_WOOD | WILD_GRASS |
+F:ANIMAL | DROP_SKELETON | HAS_EGG | IMPRESED |
+F:MORTAL | BASEANGBAND
+S:1_IN_10
+S:SHRIEK
+D:A tiny scarlet bird from Numenor, with a really high voice.
+
+N:142:Apprentice ranger
+G:p:W
+I:110:6d8:20:8:5
+W:8:2:1500:18
+E:1:1:1:2:1:1
+O:0:80:0:15
+B:HIT:HURT:1d5
+B:HIT:HURT:1d5
+F:MALE |
+F:FORCE_SLEEP | FRIENDS | DROP_60 | DROP_SKELETON | DROP_CORPSE |
+F:OPEN_DOOR | BASH_DOOR |
+F:MORTAL | BASEANGBAND | HAS_LITE
+S:1_IN_9 |
+S:ARROW_2 | MISSILE
+D:An agile hunter, ready and relaxed.
+
+N:143:Giant salamander
+G:R:R
+I:110:6d7:6:40:1
+W:8:1:600:50
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:BITE:FIRE:3d6
+F:FORCE_SLEEP | SUSCEP_COLD |
+F:RAND_25 |
+F:ANIMAL | IM_FIRE | CAN_SWIM | DROP_CORPSE |
+F:MORTAL | BASEANGBAND
+S:1_IN_9
+S:BR_FIRE
+D:A large black and yellow lizard. You'd better run away!
+
+N:144:Space monster
+G:.:d
+I:110:21d8:30:14:20
+W:8:2:0:28
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:HIT:TERRIFY:1d4
+F:PASS_WALL | NO_CONF | NO_SLEEP | NONLIVING | IM_ACID | CAN_FLY | JOKEANGBAND | NO_CUT
+D:A black hole in the fabric of reality.
+
+# New monster added by furiosity for the Theme module
+N:145:Swan
+G:B:w
+I:120:9d10:8:100:255
+W:20:3:300:0
+E:0:1:0:6:1:0
+O:0:0:0:0
+F:CAN_FLY | NEUTRAL | NO_TARGET | GOOD |
+F:MORTAL | NEVER_BLOW | DG_CURSE | WILD_ONLY |
+F:AQUATIC | WILD_SHORE | NO_TARGET | WILD_OCEAN
+D:Beautiful and graceful large white birds inhabiting aquatic
+D:regions. They never do any harm, and it is said that anyone
+D:who kills a swan incurs the wrath of the Valar.
+
+N:146:Green mold
+G:m:g
+I:110:21d8:2:14:75
+W:8:1:40:28
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:SPORE:TERRIFY:1d4
+F:NEVER_MOVE |
+F:STUPID | EMPTY_MIND |
+F:IM_ACID | IM_POIS | CAN_SWIM |
+F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT
+D:It is a strange growth on the dungeon floor.
+
+N:147:Apprentice paladin
+G:p:w
+I:110:6d8:20:16:5
+W:8:2:1500:18
+E:1:1:1:2:1:1
+O:30:55:10:0
+B:HIT:HURT:1d7
+B:HIT:HURT:1d7
+F:MALE | GOOD | WILD_TOO | DROP_SKELETON | DROP_CORPSE |
+F:FORCE_SLEEP |
+F:FRIENDS | DROP_60 |
+F:OPEN_DOOR | BASH_DOOR |
+F:MORTAL | BASEANGBAND | HAS_LITE
+S:1_IN_9 |
+S:SCARE | CAUSE_1
+D:He thinks you are an agent of Morgoth.
+
+N:148:Caborrog
+G:u:U
+I:110:13d9:20:32:30
+W:8:3:1000:16
+E:0:0:0:0:1:0
+O:0:0:0:0
+B:HIT:HURT:1d8
+F:FRIENDS |
+F:OPEN_DOOR | BASH_DOOR |
+F:EVIL | DEMON | IM_FIRE | NO_FEAR | BASEANGBAND |
+S:1_IN_50 |
+S:BR_NETH
+D:A minor demonic servant of evil. It resembles a frog - in fact,
+D:Caborroeg are the result of Morgoth's corruption of frogs.
+
+N:149:Hill orc
+G:o:u
+I:110:13d9:20:32:30
+W:8:1:2000:25
+E:1:1:1:2:1:1
+O:10:70:10:0
+B:HIT:HURT:1d10
+F:MALE |
+F:FRIENDS | DROP_60 |
+F:OPEN_DOOR | BASH_DOOR | DROP_SKELETON | DROP_CORPSE |
+F:EVIL | ORC | HURT_LITE |
+F:MORTAL | BASEANGBAND | HAS_LITE
+D:He is a hardy well-weathered survivor.
+
+N:150:Bandit
+G:p:b
+I:110:8d8:20:24:10
+W:10:2:1500:26
+E:1:1:1:2:1:1
+O:25:60:0:0
+B:HIT:HURT:2d4
+B:TOUCH:EAT_GOLD
+F:MALE |
+F:DROP_1D2 | WILD_TOO | WILD_WOOD |
+F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | DROP_SKELETON | DROP_CORPSE |
+F:EVIL | MORTAL | BASEANGBAND | HAS_LITE
+D:He is after your cash!
+
+N:151:Hunting hawk
+G:B:u
+I:120:8d8:30:25:10
+W:8:2:800:22
+E:0:1:1:0:1:0
+O:0:0:0:0
+B:CLAW:HURT:1d3
+B:CLAW:HURT:1d3
+B:BITE:HURT:1d4
+F:ANIMAL | NO_FEAR | CAN_FLY | WILD_WOOD | WILD_TOO | DROP_CORPSE
+F:MORTAL | HAS_EGG | IMPRESED | BASEANGBAND | AQUATIC
+D:Trained to hunt and kill without fear.
+
+N:152:Phantom warrior
+G:G:B
+I:110:5d5:20:10:40
+W:8:1:0:15
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:HIT:HURT:1d11
+B:HIT:HURT:1d11
+F:PASS_WALL | NO_SLEEP | FRIENDS | COLD_BLOOD | NONLIVING |
+F:NO_FEAR | EMPTY_MIND | CAN_FLY | BASEANGBAND | NO_CUT
+D:Spectral creatures that are half real, half illusion.
+
+# New monster added by furiosity for the Theme module
+N:153:Thrush
+G:B:U
+I:120:3d5:40:12:0
+W:0:2:400:0
+E:0:1:1:0:1:0
+O:0:0:0:0
+B:BITE:HURT:1d3
+B:BITE:HURT:1d3
+F:ANIMAL | WILD_ONLY | WILD_WOOD | CAN_FLY | DROP_CORPSE |
+F:MORTAL | HAS_EGG | BASEANGBAND | NEUTRAL | NO_TARGET | WILD_GRASS |
+D:Large speckled brown birds with a special fondness for snails,
+D:whose shells they remove by breaking them against stones.
+
+N:154:Yeti
+G:Y:w
+I:110:11d9:20:24:10
+W:9:3:3500:30
+E:1:1:1:2:1:1
+O:0:0:0:0
+B:CLAW:HURT:1d3
+B:CLAW:HURT:1d3
+B:BITE:HURT:1d4
+F:OPEN_DOOR | BASH_DOOR | WILD_TOO | WILD_MOUNTAIN | DROP_CORPSE |
+F:ANIMAL | IM_COLD |
+F:MORTAL | SUSCEP_FIRE | BASEANGBAND
+D:A large white figure covered in shaggy fur.
+
+# New monster added by furiosity for the Theme module
+N:155:Fox
+G:C:o
+I:120:7d7:30:30:20
+W:10:1:600:40
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:BITE:HURT:1d6
+F:BASH_DOOR | WILD_TOO | WILD_WOOD | WILD_WASTE | WILD_MOUNTAIN |
+F:ANIMAL | DROP_CORPSE | MORTAL | BASEANGBAND
+S:1_IN_8 |
+S:SHRIEK
+D:Dog-like carnivore of woodland and farmland, distinctive for
+D:its red-orange coats and its eerie plaintive cries.
+
+N:156:Giant grey rat
+G:r:s
+I:110:2d3:8:12:20
+W:9:1:250:2
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:BITE:POISON:1d4
+F:RAND_25 |
+F:ANIMAL | IM_POIS |
+F:MORTAL | BASEANGBAND
+S:MULTIPLY
+D:It is a rodent of unusual size.
+
+N:157:Black harpy
+G:H:D
+I:120:3d8:16:22:10
+W:9:1:600:19
+E:0:1:1:0:1:0
+O:0:0:0:0
+B:CLAW:HURT:1d2
+B:CLAW:HURT:1d2
+B:BITE:HURT:1d3
+F:FEMALE | CAN_FLY | WILD_TOO | WILD_MOUNTAIN | DROP_CORPSE |
+F:RAND_25 | ANIMAL | EVIL | MORTAL | BASEANGBAND
+D:A woman's face on the body of a vicious black bird.
+
+# New monster added by furiosity for the Theme module
+N:158:Fly of Mordor
+G:I:U
+I:120:1d1:6:5:10
+W:3:1:100:1
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:BITE:HURT:1d1
+F:RAND_50 | RAND_25 | EVIL |
+F:WEIRD_MIND | ANIMAL | MORTAL | BASEANGBAND
+S:SHRIEK
+D:An evil swarm of bloodsucking flies. They are grey, brown and black
+D:insects, together in a homogeneous mass. They are loud, hateful and
+D:hungry, and marked with a red eye-shape upon their backs.
+
+# New monster added by furiosity for the Theme module
+# Based on Serpent men from Zangband
+N:159:Limlug
+G:J:G
+I:120:15d10:20:40:20
+W:22:6:900:75
+E:1:1:1:2:1:1
+O:25:20:25:20
+B:BITE:POISON:5d5
+B:BITE:POISON:5d5
+F:MALE | CAN_SWIM | IM_POIS | IM_ACID | AQUATIC |
+F:DROP_60 | DROP_2D2 | FRIENDS | DROP_CORPSE |
+F:OPEN_DOOR | BASH_DOOR | EVIL | MORTAL | BASEANGBAND
+F:WILD_TOO | WILD_OCEAN | WILD_SHORE |
+S:1_IN_8
+S:BA_POIS | SCARE | HOLD
+D:A sea-serpent of Elvish legend.
+
+N:160:Cave bear
+G:q:u
+I:110:8d8:10:35:10
+W:9:1:3000:25
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:CLAW:HURT:1d6
+B:CLAW:HURT:1d6
+B:BITE:HURT:1d8
+F:BASH_DOOR | FORCE_MAXHP | FORCE_SLEEP | DROP_CORPSE |
+F:ANIMAL | WILD_TOO | WILD_WOOD | WILD_MOUNTAIN |
+F:MORTAL | BASEANGBAND
+D:A large bear appears to have made its home in this cave. It is hungry,
+D:and you are trespassing in its territory.
+
+N:161:Rock mole
+G:r:u
+I:110:10d10:20:30:75
+W:9:2:60:25
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:BITE:HURT:1d10
+B:BITE:HURT:1d10
+F:WEIRD_MIND | BASH_DOOR | KILL_WALL | KILL_ITEM | DROP_CORPSE |
+F:ANIMAL | MORTAL | BASEANGBAND
+D:Despite its unimpressive size, this mole creature has fangs powerful
+D:enough to bore through solid rock.
+
+N:162:Mindcrafter
+G:p:y
+I:110:9d8:20:15:20
+W:16:2:1700:50
+E:1:1:1:2:1:1
+O:30:40:30:0
+B:HIT:HURT:2d4
+B:HIT:HURT:2d4
+F:MALE |
+F:FORCE_SLEEP | DROP_90 | WILD_TOO |
+F:OPEN_DOOR | BASH_DOOR | DROP_SKELETON | DROP_CORPSE |
+F:EVIL | MORTAL | BASEANGBAND | HAS_LITE
+S:1_IN_3 |
+S:CONF | BLIND | HOLD | SLOW | MIND_BLAST | S_MONSTER | BLINK
+D:A master of the mental arts, able to damage or dominate the
+D:minds of others.
+
+N:163:Hatchling blue dragon
+G:d:b
+I:110:10d10:20:30:70
+W:9:2:4000:35
+E:0:1:0:6:1:0
+O:0:0:0:0
+B:CLAW:HURT:1d3
+B:CLAW:HURT:1d3
+B:BITE:HURT:1d5
+F:FORCE_MAXHP | FORCE_SLEEP | DROP_CORPSE |
+F:ONLY_GOLD | DROP_60 | DROP_1D2 | HAS_EGG | IMPRESED |
+F:OPEN_DOOR | BASH_DOOR | CAN_FLY |
+F:EVIL | DRAGON | IM_ELEC | BASEANGBAND | ATTR_MULTI | ATTR_MULTI
+S:1_IN_12 |
+S:BR_ELEC
+D:This newly-born dragon is still soft, its eyes unaccustomed to light and
+D:its scales a pale blue.
+
+N:164:Hatchling white dragon
+G:d:w
+I:110:10d10:20:30:70
+W:9:2:4000:35
+E:0:1:0:6:1:0
+O:0:0:0:0
+B:CLAW:HURT:1d3
+B:CLAW:HURT:1d3
+B:BITE:HURT:1d5
+F:FORCE_MAXHP | FORCE_SLEEP | DROP_CORPSE |
+F:ONLY_GOLD | DROP_60 | DROP_1D2 |
+F:OPEN_DOOR | BASH_DOOR | ATTR_MULTI
+F:EVIL | DRAGON | IM_COLD | SUSCEP_FIRE | HAS_EGG | IMPRESED | BASEANGBAND
+F:ATTR_MULTI
+S:1_IN_12 |
+S:BR_COLD
+D:This newly-born dragon is still soft, its eyes unaccustomed to light and
+D:its scales a pale white.
+
+N:165:Hatchling green dragon
+G:d:g
+I:110:10d10:20:30:70
+W:9:2:4000:35
+E:0:1:0:6:1:0
+O:0:0:0:0
+B:CLAW:HURT:1d3
+B:CLAW:HURT:1d3
+B:BITE:HURT:1d5
+F:FORCE_MAXHP | FORCE_SLEEP |
+F:ONLY_GOLD | DROP_60 | DROP_1D2 |
+F:OPEN_DOOR | BASH_DOOR | CAN_FLY | DROP_CORPSE |
+F:EVIL | DRAGON | IM_POIS | HAS_EGG | IMPRESED | BASEANGBAND | ATTR_MULTI
+S:1_IN_12 |
+S:BR_POIS
+D:This newly-born dragon is still soft, its eyes unaccustomed to light and
+D:its scales a sickly green.
+
+N:166:Hatchling black dragon
+G:d:s
+I:110:10d10:20:30:70
+W:9:2:4000:35
+E:0:1:0:6:1:0
+O:0:0:0:0
+B:CLAW:HURT:1d3
+B:CLAW:HURT:1d3
+B:BITE:HURT:1d5
+F:FORCE_MAXHP | FORCE_SLEEP | CAN_FLY | DROP_CORPSE |
+F:ONLY_GOLD | DROP_60 | DROP_1D2 |
+F:OPEN_DOOR | BASH_DOOR |
+F:EVIL | DRAGON | IM_ACID | HAS_EGG | IMPRESED | BASEANGBAND | ATTR_MULTI
+S:1_IN_12 |
+S:BR_ACID
+D:This newly-born dragon is still soft, its eyes unaccustomed to light and
+D:its scales a dull black.
+
+N:167:Hatchling red dragon
+G:d:r
+I:110:10d10:20:30:70
+W:9:2:4000:35
+E:0:1:0:6:1:0
+O:0:0:0:0
+B:CLAW:HURT:1d3
+B:CLAW:HURT:1d3
+B:BITE:HURT:1d5
+F:FORCE_MAXHP | FORCE_SLEEP | CAN_FLY | DROP_CORPSE | SUSCEP_COLD |
+F:ONLY_GOLD | DROP_60 | DROP_1D2 |
+F:OPEN_DOOR | BASH_DOOR |
+F:EVIL | DRAGON | IM_FIRE | HAS_EGG | IMPRESED | BASEANGBAND | HAS_LITE
+F:ATTR_MULTI
+S:1_IN_11 |
+S:BR_FIRE
+D:This newly-born dragon is still soft, its eyes unaccustomed to light and
+D:its scales a pale red.
+
+N:168:Giant red ant
+G:a:r
+I:110:4d8:12:34:60
+W:9:2:600:22
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:BITE:HURT:1d4
+B:STING:LOSE_STR:1d4
+F:WEIRD_MIND | BASH_DOOR | WILD_TOO | DROP_SKELETON
+F:ANIMAL | MORTAL | BASEANGBAND | HAS_LITE
+D:It is large and has venomous mandibles.
+
+N:169:Brodda, the Easterling
+G:p:U
+I:110:24d10:20:25:20
+W:9:2:2200:100
+E:1:1:1:2:1:1
+O:10:90:0:0
+B:HIT:HURT:1d13
+B:HIT:HURT:1d13
+B:HIT:HURT:1d13
+B:HIT:HURT:1d13
+F:UNIQUE | MALE | EVIL
+F:FORCE_MAXHP | CAN_SPEAK | WILD_TOO | DROP_SKELETON | DROP_CORPSE
+F:ONLY_ITEM | DROP_1D2 | DROP_GOOD |
+F:OPEN_DOOR | BASH_DOOR
+F:MORTAL | BASEANGBAND | HAS_LITE
+D:A nasty piece of work, Brodda picks on defenceless women and children.
+
+# New monster added for the Theme module
+# From UnAngband
+N:170:Radbug, the Goblin
+G:o:y
+I:110:15d10:20:20:60
+W:7:3:1500:100
+E:1:1:1:2:1:1
+O:10:90:0:0
+B:HIT:HURT:1d10
+B:HIT:HURT:1d10
+B:HIT:HURT:1d10
+F:BASEANGBAND | UNIQUE | MALE | EVIL | ORC | FORCE_MAXHP |
+F:CAN_SPEAK | DROP_CORPSE | WILD_TOO | OPEN_DOOR | BASH_DOOR |
+F:HURT_LITE | ONLY_ITEM | DROP_1D2 | DROP_GOOD | ESCORT |
+D:Strong and powerful, for a goblin.
+
+N:171:King cobra
+G:J:g
+I:110:8d10:8:30:1
+W:9:2:300:28
+E:0:0:0:0:1:0
+O:0:0:0:0
+B:SPIT:BLIND:1d2
+B:BITE:POISON:3d4
+F:RAND_50 | WILD_TOO | WILD_WOOD | DROP_SKELETON | DROP_CORPSE |
+F:BASH_DOOR | CAN_SWIM | ANIMAL | IM_POIS | HAS_EGG | MORTAL | BASEANGBAND
+D:It is a large snake with a hooded face.
+
+N:172:Eagle
+G:B:r
+I:120:9d9:30:25:10
+W:12:2:600:22
+E:0:1:1:0:1:0
+O:0:0:0:0
+B:CLAW:HURT:1d3
+B:CLAW:HURT:1d3
+B:BITE:HURT:1d6
+F:ANIMAL | CAN_FLY | WILD_ONLY | WILD_WASTE | WILD_MOUNTAIN | WILD_WOOD |
+F:DROP_CORPSE | MORTAL | BASEANGBAND | NEUTRAL | NO_TARGET | IMPRESED | HAS_EGG | AQUATIC
+D:A magnificent huge predatory bird.
+
+N:173:War bear
+G:q:r
+I:110:10d10:10:35:10
+W:9:1:2000:25
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:CLAW:HURT:1d4
+B:CLAW:HURT:1d4
+B:BITE:HURT:1d6
+F:WEIRD_MIND | BASH_DOOR | FRIENDS | DROP_SKELETON | DROP_CORPSE
+F:ANIMAL
+F:MORTAL | BASEANGBAND
+D:A bear with tusks, trained to kill.
+
+N:174:Killer bee
+G:I:o
+I:120:2d4:12:34:10
+W:9:2:50:22
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:STING:POISON:1d4
+B:STING:LOSE_STR:1d4
+F:WEIRD_MIND | FRIENDS | CAN_FLY | WILD_TOO |
+F:ANIMAL | MORTAL | BASEANGBAND
+D:It is poisonous and aggressive.
+
+N:175:Giant spider
+G:S:W
+I:110:10d10:8:16:80
+W:10:2:700:35
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:BITE:HURT:1d10
+B:BITE:POISON:1d6
+B:BITE:POISON:1d6
+B:BITE:HURT:1d10
+F:WEIRD_MIND | BASH_DOOR | WILD_TOO | DROP_SKELETON |
+F:ANIMAL | SPIDER | IM_POIS |
+F:MORTAL | BASEANGBAND
+D:It is a large spider whose bulbous body is bloated with poison.
+
+N:176:Giant white tick
+G:S:w
+I:100:12d8:12:40:20
+W:10:2:200:27
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:BITE:POISON:2d6
+F:WEIRD_MIND | BASH_DOOR | CAN_FLY |
+F:ANIMAL | IM_POIS |
+F:MORTAL | BASEANGBAND
+D:It is moving slowly towards you.
+
+# New monster added for the Theme module
+# Based on Nightshade from T-Plus by Ingeborg S. Norden
+N:177:The Lucky Hobbit
+G:h:D
+I:110:40d5:40:10:3
+W:10:2:660:0
+E:0:1:1:2:1:1
+O:0:40:10:40
+B:TOUCH:EAT_FOOD
+B:TOUCH:EAT_ITEM
+B:BEG:EAT_GOLD
+B:INSULT:*
+F:UNIQUE | MALE | CAN_SPEAK | DROP_CORPSE |
+F:FORCE_MAXHP | FORCE_DEPTH | WILD_TOWN | WILD_ONLY |
+F:OPEN_DOOR | BASH_DOOR | DROP_GOOD |
+F:RAND_25 | DROP_60 | DROP_2D2 | DROP_GREAT | ONLY_ITEM |
+F:MORTAL | JOKEANGBAND | HAS_LITE
+D:An obscenely lucky and very stealthy Halfling. You have an intense
+D:desire to kill this creature.
+
+N:178:Dark elven mage
+G:h:r
+I:120:7d10:20:16:20
+W:10:1:1200:50
+E:1:1:1:2:1:1
+O:0:0:100:0
+B:HIT:HURT:1d6
+B:HIT:HURT:1d6
+F:MALE |
+F:FORCE_SLEEP |
+F:ONLY_ITEM | DROP_1D2 | DROP_SKELETON | DROP_CORPSE |
+F:OPEN_DOOR | BASH_DOOR |
+F:EVIL | IM_POIS | HURT_LITE | BASEANGBAND | HAS_LITE
+S:1_IN_5 |
+S:BLIND | CONF | MISSILE | DARKNESS | BA_POIS
+D:A dark elven figure, dressed all in black, hurling spells at you.
+
+# New monster added for the Theme module
+# Suggested by Atarlost in the t-o-m-e.net forums
+N:179:Dark dwarven warrior
+G:k:u
+I:110:2d100:25:120:30
+W:20:2:0:160
+B:HIT:HURT:2d8
+B:HIT:HURT:2d8
+B:HIT:HURT:2d8
+B:HIT:HURT:2d8
+F:MALE
+F:FORCE_SLEEP | FRIENDS
+F:ONLY_ITEM | DROP_1D2 | DROP_GOOD
+F:OPEN_DOOR | BASH_DOOR
+D:The dwarves of Nogrod were ever greedy, and through this Morgoth was able to
+D:snare them. Now they act as slavemasters in his mines.
+
+# New monster added for the Theme module
+# Suggested by Atarlost in the t-o-m-e.net forums
+N:180:Dark dwarven smith
+G:k:w
+I:110:2d100:25:120:1
+W:22:1:0:175
+B:HIT:SHATTER:6d6
+F:MALE
+F:ONLY_ITEM | DROP_1D2 | DROP_GOOD
+F:OPEN_DOOR | BASH_DOOR
+F:EVIL
+D:The dwarves of Nogrod were ever greedy, and through this Morgoth was able to
+D:snare them. This smith has been forging blades for the Orcs.
+
+# New monster added for the Theme module
+# Suggested by Atarlost in the t-o-m-e.net forums
+N:181:Dark dwarven lord
+G:k:D
+I:110:5d100:25:150:180
+W:25:2:0:300
+B:HIT:HURT:3d6
+B:HIT:HURT:3d6
+B:HIT:HURT:3d6
+B:HIT:HURT:3d6
+F:MALE | EVIL
+F:FORCE_SLEEP | FORCE_MAXHP
+F:ONLY_ITEM | DROP_2D2 | DROP_GOOD
+F:OPEN_DOOR | BASH_DOOR
+F:IM_FIRE | IM_COLD | NO_CONF | NO_SLEEP
+S:1_IN_8
+S:HEAL | BO_FIRE | BO_ACID
+D:The dwarves of Nogrod were ever greedy, and through this Morgoth was able to
+D:snare them. This is a lord among the dark dwarves.
+
+# New monster added by furiosity for the Theme module
+# Based on Atarlost's suggestions for dark dwarves
+# and on dark elven priests.
+N:182:Dark dwarven priest
+G:k:g
+I:120:2d100:20:30:30
+W:27:1:1200:50
+E:1:1:1:2:1:1
+O:0:10:90:0
+B:HIT:HURT:2d8
+B:HIT:HURT:2d8
+F:MALE |
+F:FORCE_SLEEP |
+F:ONLY_ITEM | DROP_2D2 | DROP_GOOD |
+F:SMART | OPEN_DOOR | BASH_DOOR | DROP_SKELETON | DROP_CORPSE |
+F:EVIL | HURT_LITE | BASEANGBAND | HAS_LITE
+S:1_IN_5 |
+S:HEAL | BLIND | CONF | CAUSE_2 | DARKNESS | MISSILE
+D:The dwarves of Nogrod were ever greedy, and through this Morgoth was able to
+D:snare them. This priest serves Melkor unquestioningly, and today it is your
+D:turn to die.
+
+N:183:Dark elven warrior
+G:h:u
+I:110:10d11:20:16:20
+W:10:1:1400:50
+E:1:1:1:2:1:1
+O:10:90:0:0
+B:HIT:HURT:1d8
+B:HIT:HURT:1d8
+F:MALE |
+F:DROP_1D2 |
+F:OPEN_DOOR | BASH_DOOR | DROP_SKELETON | DROP_CORPSE |
+F:EVIL | HURT_LITE | BASEANGBAND | HAS_LITE
+S:1_IN_12
+S:MISSILE
+D:A dark elven figure in armour, ready with his sword.
+
+N:184:Clear mushroom patch
+G:,:B
+I:120:1d1:4:1:0
+W:10:2:30:3
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:SPORE:HURT:1d1
+F:ATTR_CLEAR |
+F:NEVER_MOVE | INVISIBLE | COLD_BLOOD |
+F:STUPID | EMPTY_MIND | CAN_SWIM |
+F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT
+S:MULTIPLY
+D:Yum! It smells quite tasty. If you could only see it.
+
+N:185:Quiver slot
+G:,:U
+I:120:1d1:4:1:0
+W:10:2:60:3
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:SPORE:CONFUSE:1d1
+F:NEVER_MOVE | COLD_BLOOD |
+F:STUPID | EMPTY_MIND |
+F:NO_CONF | NO_SLEEP | NO_FEAR | JOKEANGBAND | NO_CUT
+S:MULTIPLY |
+S:1_IN_5 | ARROW_1
+D:What looks like the remains of a quiver dropped by a past adventurer
+D:has become overgrown with a strange mold intent on using the contents
+D:of the quiver to grab prey.
+
+N:186:Grishnakh, the Hill Orc
+G:o:y
+I:110:25d10:20:20:20
+W:10:3:2300:160
+E:1:1:1:2:1:1
+O:0:100:0:0
+B:HIT:HURT:1d13
+B:HIT:HURT:1d11
+B:HIT:HURT:1d13
+B:HIT:HURT:1d11
+F:UNIQUE | MALE | CAN_SPEAK |
+F:FORCE_MAXHP | SPECIAL_GENE |
+F:ESCORT | WILD_TOO |
+F:ONLY_ITEM | DROP_1D2 | DROP_GOOD | DROP_SKELETON | DROP_CORPSE |
+F:OPEN_DOOR | BASH_DOOR |
+F:EVIL | ORC | IM_POIS |
+F:MORTAL | BASEANGBAND | HAS_LITE
+D:He is a cunning and devious orc. Short and broad, he has crooked
+D:legs and arms that hang almost to the ground.
+
+N:187:Giant tan bat
+G:b:U
+I:130:3d8:12:20:50
+W:10:2:600:18
+E:0:1:1:0:1:0
+O:0:0:0:0
+B:BITE:TERRIFY:1d3
+B:CLAW:HURT:1d2
+B:CLAW:HURT:1d2
+F:RAND_50 | CAN_FLY | WILD_TOO | WILD_MOUNTAIN | WILD_WOOD |
+F:FORCE_SLEEP | ANIMAL | DROP_CORPSE | AI_ANNOY |
+F:MORTAL | BASEANGBAND
+D:The beating of its wings produces a strangely unnerving noise.
+
+N:188:Owlbear
+G:H:o
+I:110:12d12:20:20:20
+W:10:1:2000:35
+E:0:1:1:0:1:0
+O:0:0:0:0
+B:CLAW:HURT:1d3
+B:CLAW:HURT:1d3
+B:CRUSH:HURT:1d10
+F:EVIL | ANIMAL | OPEN_DOOR | BASH_DOOR | DROP_CORPSE |
+F:MORTAL | BASEANGBAND
+D:A bizarre bear with the claws and the face of an owl.
+
+# New monster added by furiosity for the Theme module
+N:189:Clear mewlip
+G:i:w
+I:110:2d5:12:6:10
+W:1:1:0:2
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:TOUCH:HURT:1d2
+F:BASEANGBAND | EMPTY_MIND | STUPID | ATTR_CLEAR |
+F:UNDEAD | RAND_50 | CAN_SWIM | INVISIBLE | EVIL |
+D:An evil cannibal spirit from the marshlands.
+
+N:190:Hairy mold
+G:m:o
+I:110:15d8:2:15:70
+W:10:1:50:32
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:SPORE:POISON:1d3
+F:NEVER_MOVE | CAN_SWIM |
+F:STUPID | EMPTY_MIND |
+F:IM_POIS |
+F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT
+D:It is a strange hairy growth on the dungeon floor.
+
+N:191:Grizzly bear
+G:q:U
+I:110:15d15:10:35:10
+W:16:2:2600:55
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:CLAW:HURT:1d8
+B:CLAW:HURT:1d8
+B:BITE:HURT:1d12
+B:CRUSH:HURT:1d10
+F:WILD_TOO | WILD_WOOD | WILD_MOUNTAIN | DROP_CORPSE |
+F:ANIMAL | BASH_DOOR |
+F:MORTAL | BASEANGBAND
+D:A huge, beastly bear, more savage than most of its kind.
+
+N:192:Disenchanter mold
+G:m:v
+I:110:16d8:2:20:70
+W:10:1:40:40
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:SPORE:UN_BONUS:1d6
+F:NEVER_MOVE |
+F:STUPID | EMPTY_MIND | RES_DISE |
+F:IM_POIS | ATTR_MULTI | CAN_SWIM |
+F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT
+S:1_IN_11 |
+S:DRAIN_MANA
+D:It is a strange glowing growth on the dungeon floor.
+
+N:193:Pseudo-dragon
+G:d:o
+I:110:20d10:20:30:40
+W:10:2:10000:150
+E:0:1:0:6:1:0
+O:50:50:0:0
+B:CLAW:HURT:1d3
+B:CLAW:HURT:1d3
+B:BITE:HURT:1d5
+F:FORCE_MAXHP | FORCE_SLEEP | CAN_FLY | DROP_CORPSE |
+F:DROP_60 | BASH_DOOR | HAS_EGG |
+F:EVIL | DRAGON | BASEANGBAND | HAS_LITE | ATTR_MULTI
+S:1_IN_11 |
+S:CONF | SCARE | BR_LITE | BR_DARK
+D:A small relative of the dragon that inhabits dark caves.
+
+N:194:Limrog
+G:u:b
+I:120:16d9:20:32:30
+W:10:1:600:40
+E:1:1:1:2:1:1
+O:0:0:0:0
+B:HIT:HURT:1d8
+F:OPEN_DOOR | BASH_DOOR |
+F:EVIL | DEMON | IM_FIRE | NO_FEAR | RES_TELE | CAN_FLY | BASEANGBAND
+S:1_IN_3 |
+S:BLINK | TELE_TO | TELE_AWAY | TPORT
+D:It is a fast-moving demon that blinks quickly in and out of existence; no
+D:other demon matches its teleporting mastery. It resembles a fish - Limroeg
+D:are actually fish that were corrupted by Morgoth.
+
+N:195:Creeping gold coins
+G:$:y
+I:100:18d8:5:36:10
+W:10:3:0:32
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:HIT:HURT:2d5
+B:TOUCH:POISON:3d5
+F:ONLY_GOLD | DROP_90 | DROP_1D2 |
+F:COLD_BLOOD | BASH_DOOR |
+F:IM_ELEC | IM_POIS | NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT
+D:It appears to be a pile of gold coins, until it starts crawling towards you
+D:on tiny legs.
+
+N:196:Wolf
+G:C:u
+I:120:6d6:30:30:20
+W:10:1:600:30
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:BITE:HURT:1d6
+F:RAND_25 | FRIENDS |
+F:BASH_DOOR | WILD_TOO | WILD_WOOD | WILD_WASTE | WILD_MOUNTAIN |
+F:ANIMAL | DROP_CORPSE |
+F:MORTAL | BASEANGBAND
+D:It howls and snaps at you.
+
+N:197:Giant fruit fly
+G:I:G
+I:120:2d2:8:14:10
+W:10:3:100:4
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:BITE:HURT:1d2
+F:RAND_50 | RAND_25 | CAN_FLY | WEIRD_MIND |
+F:ANIMAL | MORTAL | BASEANGBAND
+S:MULTIPLY
+D:A fast-breeding, annoying pest.
+
+N:198:Panther
+G:f:D
+I:120:10d8:40:30:0
+W:10:2:1300:25
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:CLAW:HURT:1d8
+B:CLAW:HURT:1d8
+F:BASH_DOOR | WILD_TOO | WILD_WOOD | WILD_GRASS | DROP_SKELETON | DROP_CORPSE |
+F:ANIMAL | MORTAL | BASEANGBAND
+D:A large black cat, stalking you with intent. It thinks you're its next
+D:meal.
+
+N:199:Brigand
+G:p:b
+I:110:9d8:20:32:10
+W:10:2:1700:35
+E:1:1:1:2:1:1
+O:25:60:0:0
+B:HIT:HURT:2d4
+B:TOUCH:EAT_ITEM
+F:MALE |
+F:DROP_1D2 |
+F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR |
+F:EVIL | DROP_SKELETON |
+F:MORTAL | BASEANGBAND | HAS_LITE
+D:He is eyeing your backpack.
+
+# New monster added by furiosity for the Theme module
+N:200:Gray mewlip
+G:i:s
+I:110:4d7:12:9:10
+W:3:1:0:5
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:TOUCH:HURT:2d4
+F:BASEANGBAND | EMPTY_MIND | STUPID |
+F:UNDEAD | RAND_50 | CAN_SWIM | EVIL |
+D:An evil cannibal spirit from the marshlands. It is
+D:especially aggressive.
+
+# New monster added by furiosity for the Theme module
+N:201:Orange mewlip
+G:i:o
+I:110:6d9:12:12:10
+W:5:1:0:2
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:TOUCH:POISON:2d4
+F:BASEANGBAND | EMPTY_MIND | STUPID | IM_POIS
+F:UNDEAD | RAND_50 | CAN_SWIM | EVIL |
+D:An evil cannibal spirit from the marshlands. It is
+D:surrounded by a foul stench.
+
+N:202:Undead mass
+G:j:D
+I:110:8d8:70:12:5
+W:10:2:200:33
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:TOUCH:DISEASE:1d6
+B:TOUCH:LOSE_CON:1d6
+F:UNDEAD | EMPTY_MIND | NO_CONF | NO_SLEEP | IM_POIS | IM_COLD | NO_FEAR |
+F:HURT_LITE | COLD_BLOOD | EVIL | NEVER_MOVE | BASEANGBAND | NO_CUT
+S:MULTIPLY
+D:A sickening mound of decaying flesh, bones, hands and other body parts.
+D:It seems to be growing.
+
+# New monster added by furiosity for the Theme module
+N:203:Bloodshot mewlip
+G:i:r
+I:110:6d9:12:12:10
+W:5:1:0:2
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:TOUCH:LOSE_STR:2d4
+F:BASEANGBAND | EMPTY_MIND | STUPID | IM_POIS
+F:UNDEAD | RAND_50 | CAN_SWIM | EVIL |
+D:An evil cannibal spirit from the marshlands. Its form seems
+D:infused with blood, surely that of its victims.
+
+N:204:Hatchling multi-hued dragon
+G:d:v
+I:110:13d10:20:30:70
+W:11:2:5000:45
+E:0:1:0:6:1:0
+O:0:0:0:0
+B:CLAW:HURT:1d4
+B:CLAW:HURT:1d4
+B:BITE:HURT:1d6
+F:ATTR_MULTI |
+F:FORCE_MAXHP | FORCE_SLEEP |
+F:ONLY_GOLD | DROP_60 | DROP_1D2 |
+F:OPEN_DOOR | BASH_DOOR | DROP_CORPSE |
+F:EVIL | DRAGON | CAN_FLY |
+F:IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | HAS_EGG | IMPRESED |
+F:BASEANGBAND | HAS_LITE
+S:1_IN_12 |
+S:BR_ACID | BR_FIRE | BR_COLD | BR_ELEC | BR_POIS
+D:This newly-born dragon is still soft, its eyes unaccustomed to light and
+D:its scales shimmering with a hint of colour.
+
+# New monster added by furiosity for the Theme module
+N:205:Green mewlip
+G:i:g
+I:110:6d9:12:12:10
+W:5:1:0:2
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:TOUCH:POISON:2d4
+B:TOUCH:CONFUSE:3d5
+F:BASEANGBAND | EMPTY_MIND | STUPID | IM_POIS
+F:UNDEAD | RAND_50 | CAN_SWIM | EVIL
+D:An evil cannibal spirit from the marshlands. It is
+D:surrounded by a foul stench and an aura of mystery.
+
+N:206:Old Man Willow
+G:#:s
+I:110:32d30:20:20:20
+W:25:5:3000:150
+E:1:1:1:2:1:1
+O:0:50:50:0
+B:TOUCH:PARALYZE:1d14
+B:TOUCH:PARALYZE:1d14
+B:CRUSH:HURT:2d12
+F:ANIMAL | NEVER_MOVE | COLD_BLOOD | DROP_RANDART
+F:EMPTY_MIND | UNIQUE | FORCE_MAXHP | FORCE_SLEEP |
+F:RES_WATE | IM_POIS | IM_ACID | SUSCEP_FIRE | SPECIAL_GENE |
+F:DROP_1D2 | DROP_GOOD | ONLY_ITEM | BASEANGBAND | NO_CUT
+S:1_IN_10 |
+S:TELE_TO | HOLD |
+D:The ancient grey willow tree, ruler of the Old Forest. He despises
+D:trespassers in his territory. "...a huge willow-tree, old and hoary.
+D:Enormous it looked, its sprawling branches going up like racing arms
+D:with may long-fingered hands, its knotted and twisted trunk gaping in
+D:wide fissures that creaked faintly as the boughs moved."
+
+# New monster added by furiosity for the Theme module
+N:207:Blue mewlip
+G:i:b
+I:110:6d9:12:12:10
+W:5:1:0:2
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:TOUCH:ELEC:3d5
+F:BASEANGBAND | EMPTY_MIND | STUPID | IM_POIS |
+F:UNDEAD | RAND_50 | CAN_SWIM | EVIL | IM_ELEC |
+D:An evil cannibal spirit from the marshlands. It is
+D:surrounded by a barely noticeable aura of sparks.
+
+N:208:Zombified orc
+G:z:s
+I:110:11d8:20:24:25
+W:11:1:1800:30
+E:1:1:1:2:1:1
+O:0:0:0:0
+B:HIT:HURT:1d4
+B:HIT:HURT:1d4
+B:HIT:HURT:1d4
+F:COLD_BLOOD | EMPTY_MIND | OPEN_DOOR | BASH_DOOR |
+F:EVIL | ORC | UNDEAD |
+F:IM_COLD | IM_POIS |
+F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT
+D:It is a shambling orcish corpse leaving behind a trail of flesh.
+
+N:209:Hippogryph
+G:H:U
+I:110:20d9:12:14:10
+W:11:1:1500:30
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:HIT:HURT:2d5
+B:BITE:HURT:2d5
+F:BASH_DOOR | CAN_FLY | WILD_TOO | WILD_MOUNTAIN | WILD_GRASS |
+F:ANIMAL | DROP_CORPSE | MORTAL | BASEANGBAND
+D:A strange hybrid of eagle and horse.
+
+N:210:Black mamba
+G:J:D
+I:120:10d8:10:32:1
+W:12:3:300:40
+E:0:0:0:0:1:0
+O:0:0:0:0
+B:BITE:POISON:4d4
+F:RAND_50 | BASH_DOOR | CAN_SWIM |
+F:WILD_TOO | WILD_WOOD | WILD_GRASS |
+F:ANIMAL | IM_POIS | DROP_SKELETON | DROP_CORPSE | HAS_EGG |
+F:MORTAL | BASEANGBAND
+D:It has glistening black skin, a sleek body, and highly venomous fangs.
+
+N:211:White wolf
+G:C:w
+I:120:7d7:30:30:20
+W:12:1:700:30
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:BITE:HURT:1d3
+B:BITE:HURT:1d4
+F:RAND_25 |
+F:FRIENDS | SUSCEP_FIRE |
+F:BASH_DOOR | WILD_TOO | WILD_WASTE |
+F:ANIMAL | IM_COLD | DROP_SKELETON | DROP_CORPSE |
+F:MORTAL | BASEANGBAND
+D:A large and muscled wolf from the northern wastes. Its breath is cold and
+D:icy and its fur is coated with frost.
+
+N:212:Grape jelly
+G:j:v
+I:110:52d8:2:1:99
+W:12:3:2600:60
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:TOUCH:EXP_10
+F:NEVER_MOVE |
+F:STUPID | EMPTY_MIND |
+F:IM_POIS | HURT_LITE | CAN_SWIM |
+F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT
+S:1_IN_11 |
+S:DRAIN_MANA
+D:Yum! It looks quite tasty. It is a pulsing mound of glowing flesh.
+
+N:213:Nether worm mass
+G:w:D
+I:100:5d8:10:15:3
+W:12:4:200:6
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:TOUCH:EXP_10
+F:RAND_50 | RAND_25 | CAN_SWIM |
+F:STUPID | WEIRD_MIND | BASH_DOOR |
+F:ANIMAL | HURT_LITE | NO_FEAR | BASEANGBAND | NO_CUT
+S:MULTIPLY
+D:It is a disgusting mass of dark worms, eating each other, the floor,
+D:the air, you...
+
+# New monster added by furiosity for the Theme module
+N:214:Brown mewlip
+G:i:u
+I:110:6d9:12:12:10
+W:5:1:0:2
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:TOUCH:LOSE_CHR:3d5
+F:BASEANGBAND | EMPTY_MIND | STUPID | IM_POIS |
+F:UNDEAD | RAND_50 | CAN_SWIM | EVIL | NO_CUT |
+D:An evil cannibal spirit from the marshlands. It seems to
+D:be rising straight from the earth to get you.
+
+N:215:Golfimbul, the Hill Orc Chief
+G:o:y
+I:110:26d10:20:60:20
+W:12:3:2200:230
+E:1:1:1:2:1:1
+O:10:90:0:0
+B:HIT:HURT:1d13
+B:HIT:HURT:1d13
+B:HIT:HURT:1d11
+B:HIT:HURT:1d11
+F:UNIQUE | MALE |
+F:FORCE_MAXHP | WILD_TOO | SPECIAL_GENE |
+F:ESCORT | DROP_SKELETON | DROP_CORPSE |
+F:ONLY_ITEM | DROP_2D2 | DROP_GOOD |
+F:OPEN_DOOR | BASH_DOOR | CAN_SPEAK |
+F:EVIL | ORC | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS |
+F:MORTAL | BASEANGBAND | HAS_LITE
+D:A leader of a band of raiding orcs from the Misty Mountains
+D:He's been known to pick on Shire-folk.
+
+N:216:Swordsman
+G:p:u
+I:110:12d8:20:34:20
+W:12:1:1800:40
+E:1:1:1:2:1:1
+O:0:100:0:0
+B:HIT:HURT:3d5
+B:HIT:HURT:3d5
+F:MALE | WILD_TOO |
+F:DROP_1D2 | DROP_SKELETON | DROP_CORPSE
+F:OPEN_DOOR | BASH_DOOR
+F:MORTAL | BASEANGBAND | HAS_LITE
+D:A warrior of considerable skill.
+
+# New monster added by furiosity for the Theme module
+N:217:Stone mewlip
+G:i:W
+I:110:7d10:12:25:10
+W:10:5:0:2
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:TOUCH:HURT:3d5
+B:TOUCH:SHATTER:1d1
+# Yes, I'm nasty. :P -furiosity
+F:BASEANGBAND | EMPTY_MIND | STUPID | IM_POIS |
+F:UNDEAD | RAND_50 | CAN_SWIM | EVIL | NO_CUT | NO_STUN |
+D:An evil cannibal spirit from the marshlands. It seems to
+D:be coming from the walls.
+
+N:218:Hatchling bronze dragon
+G:d:U
+I:110:10d10:20:30:70
+W:9:2:4000:35
+E:0:1:0:6:1:0
+O:0:0:0:0
+B:CLAW:HURT:1d3
+B:CLAW:HURT:1d3
+B:BITE:HURT:1d5
+F:FORCE_MAXHP | FORCE_SLEEP | CAN_FLY | DROP_CORPSE |
+F:ONLY_GOLD | DROP_60 | DROP_1D2 |
+F:OPEN_DOOR | BASH_DOOR |
+F:EVIL | DRAGON | NO_CONF | HAS_EGG | IMPRESED | BASEANGBAND | ATTR_MULTI
+S:1_IN_12 |
+S:BR_CONF
+D:This newly-born dragon is still soft, its eyes unaccustomed to light and
+D:its scales a dull bronze.
+
+N:219:Hatchling gold dragon
+G:d:y
+I:110:10d10:20:30:70
+W:9:2:4000:35
+E:0:1:0:6:1:0
+O:0:0:0:0
+B:CLAW:HURT:1d3
+B:CLAW:HURT:1d3
+B:BITE:HURT:1d5
+F:FORCE_MAXHP | FORCE_SLEEP | CAN_FLY | DROP_CORPSE |
+F:ONLY_GOLD | DROP_60 | DROP_1D2 |
+F:OPEN_DOOR | BASH_DOOR |
+F:EVIL | DRAGON | NO_STUN | HAS_EGG | IMPRESED | BASEANGBAND | HAS_LITE
+F:ATTR_MULTI
+S:1_IN_12 |
+S:BR_SOUN
+D:This newly-born dragon is still soft, its eyes unaccustomed to light and
+D:its scales a pale gold.
+
+N:220:Evil eye
+G:e:D
+I:110:15d8:2:6:10
+W:18:3:600:80
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:GAZE:EXP_10
+B:GAZE:EXP_10
+F:NEVER_MOVE | EVIL | CAN_FLY | DROP_CORPSE |
+F:HURT_LITE | NO_FEAR | BASEANGBAND | NO_CUT
+S:1_IN_7 |
+S:HOLD | TELE_TO
+D:A huge disembodied eye. As you stare into the black nothingness of its pupil,
+D:you feel your will and vitality draining away, and are unable to do anything
+D:except approach it in horrified fascination.
+
+# New monster added by furiosity for the Theme module
+N:221:Yellow mewlip
+G:i:y
+I:110:7d10:12:25:10
+W:15:5:0:20
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:TOUCH:EAT_LITE:3d5
+F:BASEANGBAND | EMPTY_MIND | STUPID | IM_POIS |
+F:UNDEAD | RAND_50 | CAN_SWIM | EVIL | NO_CUT |
+D:An evil cannibal spirit from the marshlands. It seems to
+D:be surrounded with a strange aura of dark light.
+
+# New monster added by furiosity for the Theme module
+N:222:Pink mewlip
+G:i:R
+I:110:9d12:12:30:10
+W:20:5:0:30
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:TOUCH:LOSE_STR:4d4
+F:BASEANGBAND | EMPTY_MIND | STUPID | IM_POIS |
+F:UNDEAD | RAND_50 | CAN_SWIM | EVIL | NO_CUT |
+D:An evil cannibal spirit from the marshlands. It glows
+D:an eerily unnatural pink colour.
+
+# New monster added by furiosity for the Theme module
+N:223:Tree mewlip
+G:i:G
+I:110:10d12:12:40:10
+W:25:3:0:50
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:TOUCH:POISON:5d5
+B:TOUCH:LOSE_DEX:5d5
+F:BASEANGBAND | EMPTY_MIND | STUPID | IM_POIS |
+F:UNDEAD | RAND_50 | CAN_SWIM | EVIL | CAN_FLY |
+D:An evil cannibal spirit from the marshlands. It prefers
+D:to dwell in the trees and is rather stealthy.
+
+# New monster added by furiosity for the Theme module
+N:224:Air mewlip
+G:i:B
+I:110:11d12:12:45:10
+W:25:3:0:70
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:TOUCH:POISON:6d6
+B:TOUCH:BLIND:6d6
+F:BASEANGBAND | EMPTY_MIND | STUPID | IM_POIS |
+F:UNDEAD | RAND_50 | CAN_SWIM | EVIL | IM_ELEC |
+D:An evil cannibal spirit from the marshlands. It seems to
+D:be materializing out of thin air.
+
+N:225:Priest
+G:p:g
+I:110:12d8:20:22:40
+W:12:1:1500:36
+E:1:1:1:2:1:1
+O:0:20:80:0
+B:HIT:HURT:2d3
+B:HIT:HURT:2d3
+F:MALE | GOOD |
+F:FORCE_SLEEP |
+F:DROP_1D2 |
+F:SMART | OPEN_DOOR | BASH_DOOR | DROP_SKELETON | DROP_CORPSE |
+F:MORTAL | BASEANGBAND | HAS_LITE
+S:1_IN_3 |
+S:HEAL | SCARE | CAUSE_2 |
+S:S_MONSTER
+D:A robed man dedicated to his Vala. He believes you to be a
+D:servant of the Shadow.
+
+N:226:Dark elven priest
+G:h:g
+I:120:7d10:20:30:30
+W:12:1:1200:50
+E:1:1:1:2:1:1
+O:0:10:90:0
+B:HIT:HURT:1d9
+B:HIT:HURT:1d10
+F:MALE |
+F:FORCE_SLEEP |
+F:ONLY_ITEM | DROP_1D2 |
+F:SMART | OPEN_DOOR | BASH_DOOR | DROP_SKELETON | DROP_CORPSE |
+F:EVIL | HURT_LITE | BASEANGBAND | HAS_LITE
+S:1_IN_5 |
+S:HEAL | BLIND | CONF | CAUSE_2 | DARKNESS | MISSILE
+D:A dark elven figure, dressed all in black, chanting curses and waiting to
+D:deliver your soul to the Void.
+
+N:227:Air spirit
+G:E:B
+I:130:8d8:12:40:20
+W:12:2:0:40
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:HIT:HURT:1d3
+F:RAND_50 | RAND_25 | IM_ELEC | IM_POIS |
+F:EMPTY_MIND | INVISIBLE | COLD_BLOOD | BASH_DOOR |
+F:IM_POIS | CAN_FLY |
+F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT
+D:A whirlwind of sentient air.
+
+N:228:Skeleton human
+G:s:W
+I:110:10d8:20:30:30
+W:12:1:1500:38
+E:1:1:1:2:1:1
+O:0:0:0:0
+B:HIT:HURT:1d8
+F:EMPTY_MIND | COLD_BLOOD | OPEN_DOOR | BASH_DOOR |
+F:EVIL | UNDEAD | IM_COLD | IM_POIS |
+F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT
+D:It is an animated human skeleton.
+
+N:229:Zombified human
+G:z:s
+I:110:12d8:20:24:20
+W:12:1:1500:34
+E:1:1:1:2:1:1
+O:0:0:0:0
+B:HIT:HURT:1d4
+B:HIT:HURT:1d4
+F:EMPTY_MIND | COLD_BLOOD | OPEN_DOOR | BASH_DOOR |
+F:EVIL | UNDEAD | IM_COLD | IM_POIS |
+F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT
+D:It is a shambling human corpse dropping chunks of flesh behind it.
+
+N:230:Tiger
+G:f:o
+I:120:12d10:40:40:0
+W:12:2:1500:40
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:CLAW:HURT:1d8
+B:CLAW:HURT:1d8
+B:BITE:HURT:1d6
+F:BASH_DOOR | WILD_TOO | WILD_GRASS | WILD_WOOD | WILD_MOUNTAIN |
+F:ANIMAL | DROP_SKELETON | DROP_CORPSE |
+F:MORTAL | BASEANGBAND
+D:One of the largest of its species, a sleek orange and black shape creeps
+D:towards you, ready to pounce.
+
+N:231:Moaning spirit
+G:G:u
+I:120:5d8:14:20:10
+W:12:2:0:44
+E:0:0:0:0:0:0
+O:45:15:25:0
+B:WAIL:TERRIFY
+B:TOUCH:LOSE_DEX:1d8
+F:FORCE_SLEEP | RAND_25 |
+F:DROP_60 | DROP_90 | CAN_FLY |
+F:INVISIBLE | COLD_BLOOD | PASS_WALL |
+F:EVIL | UNDEAD | IM_COLD | NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT
+S:1_IN_15 |
+S:TPORT | SCARE
+D:A ghostly apparition that shrieks horribly.
+
+# New monster added by furiosity for the Theme module
+# Based on Plague worm mass from T-Plus by Ingeborg S. Norden
+N:232:Plague mewlip
+G:i:U
+I:110:100d11:15:70:20
+W:40:3:0:300
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:TOUCH:DISEASE:3d5
+B:TOUCH:PARASITE:6d5
+F:BASEANGBAND | EMPTY_MIND | STUPID | IM_POIS |
+F:UNDEAD | RAND_50 | CAN_SWIM | EVIL |
+D:An evil cannibal spirit from the marshlands. Foul stench
+D:of decay surrounds it, and you are afraid to let it get
+D:near you.
+
+N:233:Spotted jelly
+G:j:o
+I:120:13d8:12:18:1
+W:12:3:2500:33
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:TOUCH:ACID:1d10
+B:TOUCH:ACID:2d6
+B:TOUCH:ACID:2d6
+F:NEVER_MOVE |
+F:STUPID | EMPTY_MIND | COLD_BLOOD |
+F:IM_ACID | IM_POIS | HURT_LITE | CAN_SWIM |
+F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT
+D:A strange pile of flesh, covered in discoloured blotches.
+
+N:234:Drider
+G:S:b
+I:110:10d13:8:30:80
+W:13:2:2000:55
+E:1:1:1:2:1:0
+O:0:0:0:0
+B:HIT:HURT:1d12
+B:HIT:HURT:1d12
+B:BITE:POISON:1d6
+F:FORCE_SLEEP |
+F:BASH_DOOR | DROP_SKELETON |
+F:EVIL | IM_POIS |
+F:MORTAL | BASEANGBAND | HAS_LITE
+S:1_IN_8 |
+S:CONF | CAUSE_1 | DARKNESS | MISSILE | ARROW_2
+D:A dark elven torso merged with the bloated form of a giant spider.
+
+N:235:Mongbat
+G:b:B
+I:110:10d10:20:80:8
+W:13:2:800:65
+E:0:1:1:0:1:0
+O:0:0:0:0
+B:CLAW:HURT:1d4
+B:CLAW:HURT:1d4
+B:BITE:POISON:1d8
+F:ANIMAL | EVIL | FRIENDS | CAN_FLY | FORCE_MAXHP |
+F:IM_COLD | IM_ELEC | IM_POIS | WEIRD_MIND | DROP_CORPSE
+F:MORTAL | BASEANGBAND
+D:They say it is notoriously difficult to kill.
+
+N:236:Killer brown beetle
+G:K:u
+I:110:13d8:10:40:30
+W:13:1:500:38
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:BITE:HURT:3d4
+F:WEIRD_MIND | BASH_DOOR | CAN_FLY | DROP_CORPSE |
+F:ANIMAL | MORTAL | BASEANGBAND
+D:It is a vicious insect with a tough carapace.
+
+# New monster added by furiosity for the Theme module
+# Based on Charnel worm mass from T-Plus by Ingeborg S. Norden
+N:237:Death mewlip
+G:i:D
+I:130:44d100:255:75:10
+W:80:5:10:4000
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:TOUCH:EXP_20:7d5
+B:TOUCH:DISEASE:7d5
+B:TOUCH:PARASITE:14d10
+B:TOUCH:LOSE_ALL:7d5
+F:BASEANGBAND | EMPTY_MIND | STUPID | IM_POIS |
+F:UNDEAD | RAND_50 | CAN_SWIM | EVIL | NO_FEAR |
+F:FORCE_MAXHP | KILL_ITEM | KILL_BODY | NO_CONF |
+F:NO_SLEEP | NO_CUT | NO_STUN | REGENERATE | IM_COLD |
+F:RES_NETH | RES_PLAS | RES_WATE | RES_DISE | RES_NEXU |
+S:1_IN_5
+S:ANIM_DEAD |
+D:An evil cannibal spirit from the marshlands. It has been given
+D:additional power by necromantic magic, making it nearly invulnerable.
+# Wow, a dangerous icky thing :P
+
+N:238:Ogre
+G:O:U
+I:110:13d9:20:33:30
+W:13:2:2100:50
+E:1:1:1:2:1:1
+O:10:85:0:0
+B:HIT:HURT:2d8
+F:FRIENDS |
+F:DROP_60 | WILD_TOO | WILD_WOOD | WILD_MOUNTAIN | DROP_CORPSE |
+F:OPEN_DOOR | BASH_DOOR |
+F:EVIL | GIANT |
+F:MORTAL | BASEANGBAND | HAS_LITE
+D:A hideous, smallish giant that is often found near or with orcs.
+
+N:239:Creeping mithril coins
+G:$:B
+I:110:20d8:5:50:10
+W:13:3:0:45
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:HIT:HURT:2d5
+B:TOUCH:POISON:3d5
+F:ONLY_GOLD | DROP_90 | DROP_2D2 |
+F:COLD_BLOOD | BASH_DOOR | IM_ACID | CHAR_MULTI |
+F:IM_ELEC | IM_POIS | NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT
+D:It appears to be a pile of sentient mithril coins that doesn't like being
+D:picked up.
+
+N:240:Illusionist
+G:p:R
+I:110:12d8:20:10:10
+W:13:2:1500:50
+E:1:1:1:2:1:1
+O:20:0:80:0
+B:HIT:HURT:2d2
+F:MALE |
+F:FORCE_SLEEP | DROP_1D2 | DROP_SKELETON | DROP_CORPSE
+F:SMART | OPEN_DOOR | BASH_DOOR |
+F:EVIL | MORTAL | BASEANGBAND | HAS_LITE
+S:1_IN_3 |
+S:HASTE | BLINK | TPORT | BLIND | HOLD | SLOW | CONF | DARKNESS
+D:A deceptive spellcaster.
+
+N:241:Druid
+G:p:G
+I:110:12d12:20:10:10
+W:13:2:1400:50
+E:1:1:1:2:1:1
+O:20:0:80:0
+B:HIT:HURT:2d4
+B:HIT:HURT:2d4
+F:MALE | WILD_TOO | WILD_WOOD |
+F:FORCE_SLEEP | DROP_1D2 | DROP_SKELETON | DROP_CORPSE
+F:SMART | OPEN_DOOR | BASH_DOOR |
+F:MORTAL | BASEANGBAND | HAS_LITE
+S:1_IN_3 |
+S:HASTE | BLINK | BLIND | HOLD | SLOW | BO_FIRE | BO_ELEC | S_ANIMAL
+D:A priest devoted to Yavanna Kementari. He thinks you want to
+D:destroy the forests of Arda.
+
+# New monster added by furiosity for the Theme module
+# A Black Numenorean (hell knight) on steroids
+N:242:Fuinur, Lord of the Haradrim
+G:p:r
+I:140:80d100:50:300:0
+W:90:1:0:150000
+E:1:1:1:2:1:1
+O:0:40:60:0
+B:HIT:HURT:20d5
+B:HIT:EXP_80:20d5
+F:UNIQUE | MALE | MORTAL | BASEANGBAND | HAS_LITE |
+F:FORCE_MAXHP | SMART | IM_FIRE | IM_ELEC | IM_POIS |
+F:ONLY_ITEM | DROP_1D2 | DROP_2D2 | DROP_GREAT |
+F:RES_NETH | RES_NEXU | RES_PLAS | RES_WATE |
+F:COLD_BLOOD | OPEN_DOOR | BASH_DOOR | EVIL | SPECIAL_GENE |
+S:1_IN_5 |
+S:BLIND | SCARE | CAUSE_4 | BA_NETH | BA_FIRE | BO_PLAS
+S:S_HI_DEMON | S_HI_UNDEAD | HASTE |
+D:A Man of Numenor who fell under the influence of Sauron during the time
+D:the Dark Lord dwelt on that island. He sailed east to Middle-earth, with
+D:a companion named Herumor, and settled in the southern region of Harad.
+D:These two came to hold great power among the Haradrim. Fuinur has been
+D:appointed the task of guarding the realm of Angmar from intruders, in
+D:anticipation of Sauron's victory over the free People.
+
+N:243:Cloaker
+G:(:g
+I:130:7d7:20:40:0
+W:13:5:60:30
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:HIT:PARALYZE:5d5
+B:HIT:TERRIFY:5d5
+F:NEVER_MOVE | NO_FEAR |
+F:STUPID | EMPTY_MIND | COLD_BLOOD | CHAR_MULTI | NO_CONF | NO_SLEEP |
+F:DROP_90 | IM_COLD | FORCE_MAXHP | IM_ELEC | IM_POIS |
+F:BASEANGBAND | NO_CUT
+D:It resembles a normal cloak until some poor fool ventures too close.
+
+N:244:Black orc
+G:o:D
+I:110:12d10:20:36:20
+W:13:1:2000:45
+E:1:1:1:2:1:1
+O:10:50:20:15
+B:HIT:HURT:3d4
+B:HIT:HURT:3d4
+F:MALE | WILD_TOO | DROP_SKELETON | DROP_CORPSE |
+F:FRIENDS | DROP_60 |
+F:OPEN_DOOR | BASH_DOOR |
+F:EVIL | ORC | HURT_LITE |
+F:MORTAL | BASEANGBAND | HAS_LITE
+S:1_IN_9
+S:ARROW_2
+D:He is a large orc with powerful arms and deep black skin.
+
+N:245:Ochre jelly
+G:j:U
+I:120:13d8:12:18:1
+W:13:3:2300:40
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:TOUCH:ACID:1d10
+B:TOUCH:ACID:2d6
+B:TOUCH:ACID:2d6
+F:STUPID | EMPTY_MIND | COLD_BLOOD |
+F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR |
+F:IM_ACID | IM_POIS | CAN_SWIM |
+F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT
+D:A fast moving highly acidic pile of flesh. It is
+D:eating away the floor it rests on.
+
+N:246:Software bug
+G:I:R
+I:120:2d2:8:25:10
+W:14:1:0:4
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:BITE:HURT:1d2
+F:RAND_50 | RAND_25 |
+F:WEIRD_MIND | BASH_DOOR | CAN_FLY |
+F:ANIMAL | MORTAL | JOKEANGBAND
+S:MULTIPLY
+D:Oh no! They are everywhere!
+
+N:247:Lurker
+G:.:w
+I:110:20d10:30:25:10
+W:14:3:0:80
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:HIT:HURT:1d8
+B:HIT:HURT:1d8
+F:CHAR_CLEAR | ATTR_CLEAR | CHAR_MULTI |
+F:NEVER_MOVE | FORCE_MAXHP |
+F:EMPTY_MIND | INVISIBLE | COLD_BLOOD |
+F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND
+D:A strange creature that merges with the dungeon floor, trapping its
+D:victims by enveloping them within its perfectly disguised form.
+
+N:248:Tangleweed
+G:#:g
+I:100:5d5:5:5:5
+W:10:4:50:10
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:HIT:PARALYZE
+B:HIT:PARALYZE
+F:FORCE_SLEEP | NEVER_MOVE | STUPID | EMPTY_MIND | FRIENDS |
+F:KILL_TREES | SUSCEP_FIRE | ANIMAL |
+F:WILD_ONLY | COLD_BLOOD | WILD_WOOD | WILD_GRASS |
+F:NO_CONF | NO_SLEEP | NO_FEAR | MORTAL | BASEANGBAND | DROP_60 | NO_CUT
+D:A mass of vegetation. As you pass near it, it reaches out tendrils to
+D:ensnare you. You can just make out skeletons of its previous victims
+D:deep within the thickets.
+
+# New monster added by furiosity for the Theme module
+N:249:Glorfindel of Rivendell
+G:h:b
+I:120:8d90:20:70:10
+W:25:3:1400:25000
+E:1:1:1:2:1:1
+O:0:0:0:0
+B:HIT:HURT:10d8
+B:HIT:HURT:10d8
+B:HIT:HURT:10d8
+F:BASEANGBAND | WILD_TOO | WILD_WOOD | WILD_GRASS |
+F:UNIQUE | MALE | FORCE_MAXHP | GOOD | CAN_SPEAK |
+F:SMART | PET | HAS_LITE | OPEN_DOOR | BASH_DOOR |
+F:DROP_CORPSE | DROP_SKELETON | MORTAL | CAN_SWIM |
+F:RES_WATE | RES_NETH | IM_COLD | IM_ACID | IM_POIS |
+S:1_IN_2 |
+S:ARROW_4 | S_KIN |
+D:A fair Elf in a travel cloak, wielding a longbow and short sword.
+D:Stately and graceful, he rides his steed Asfaloth with great speed.
+D:It is rumoured that he is none other but Glorfindel of Gondolin, who
+D:has been sent back from the halls of Mandos to serve the Free People
+D:of Middle-earth in this time of darkness and sorrow.
+
+N:250:Giant white dragonfly
+G:F:w
+I:110:3d8:12:20:50
+W:14:2:150:60
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:BITE:COLD:1d6
+F:FORCE_SLEEP | WILD_TOO | WILD_WASTE |
+F:RAND_50 | CAN_FLY | SUSCEP_FIRE |
+F:WEIRD_MIND | BASH_DOOR |
+F:ANIMAL | IM_COLD |
+F:MORTAL | BASEANGBAND
+S:1_IN_10 |
+S:BR_COLD
+D:It is a large dragonfly that drips frost.
+
+N:251:Snaga sapper
+G:o:o
+I:111:8d8:20:32:30
+W:14:1:80:15
+E:1:1:1:2:1:1
+O:0:0:0:0
+B:HIT:HURT:1d8
+B:EXPLODE:HURT:20d2
+F:MALE |
+F:WILD_TOO | SUSCEP_FIRE |
+F:OPEN_DOOR | BASH_DOOR |
+F:EVIL | ORC | HURT_LITE |
+F:MORTAL | BASEANGBAND | HAS_LITE
+D:He is one of the many weaker 'slave' orcs, often mistakenly called a
+D:goblin. He is equipped with an explosive charge.
+
+# New monster added by furiosity for the Theme module
+# Powered-up high elf
+N:252:Finrod Felagund
+G:h:B
+I:120:50d50:20:80:10
+W:40:3:1400:1000
+E:1:1:1:2:1:1
+O:0:0:0:0
+B:HIT:HURT:10d10
+B:HIT:HURT:10d10
+B:HIT:HURT:10d10
+B:HIT:HURT:10d10
+F:MALE | OPEN_DOOR | BASH_DOOR | UNIQUE |
+F:GOOD | DROP_SKELETON | DROP_CORPSE | SMART | PET |
+F:IM_ACID | IM_COLD | RES_WATE | RES_NETH |
+F:MORTAL | BASEANGBAND | HAS_LITE
+S:1_IN_5 |
+S:S_KIN
+D:The eldest son of Finarfin and brother to Galadriel, who founded
+D:Minas Tirith in the Pass of Sirion, and delved his citadel at
+D:Nargothrond on the River Narog. He went with Beren on the Quest
+D:of the Silmaril, and was lost in the pits of Sauron on Tol-in-Gaurhoth.
+D:His spirit tarried at the Halls of Waiting, and he was allowed to return
+D:to Middle-earth in this time of strife.
+
+N:253:Gibbering mouther
+G:j:R
+I:110:8d6:15:20:20
+W:14:4:2600:20
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:CRAWL:POISON:1d4
+F:NEVER_MOVE | EVIL | CAN_SWIM |
+F:IM_POIS | EMPTY_MIND | NO_FEAR | BASEANGBAND | NO_CUT
+S:MULTIPLY |
+S:1_IN_7 |
+S:SCARE | CONF | BR_LITE
+D:A chaotic mass of pulsating flesh, mouths and eyes.
+
+# New monster added by furiosity for the Theme module
+N:254:Maedhros the Tall
+G:h:u
+I:120:60d25:20:80:10
+W:45:10:2300:2500
+E:1:1:1:1:1:1
+O:20:80:0:0
+B:HIT:HURT:10d10
+B:HIT:HURT:10d10
+B:HIT:HURT:10d10
+B:HIT:HURT:10d10
+F:MALE | NO_FEAR | NO_STUN | BASH_DOOR | KILL_BODY | FORCE_MAXHP |
+F:DROP_SKELETON | DROP_CORPSE | UNIQUE | SMART | DROP_4D2 |
+F:MORTAL | BASEANGBAND | HAS_LITE | DROP_GREAT | WILD_TOO | WILD_GRASS |
+S:1_IN_4 | HASTE | SCARE |
+D:The eldest of the Seven Sons of Feanor, and considered to be their
+D:leader. In Valinor he swore the Oath of Feanor, and followed his
+D:father back to Middle-earth. After Feanor's death, Morgoth captured
+D:Maedhros through trickery, and hung him by the wrist from the heights
+D:of Thangorodrim. Fingon succeeded in rescuing him, but he lost his right
+D:hand in their escape. He searches forever for the Silmarils of Feanor.
+
+N:255:Hill giant
+G:P:U
+I:110:30d15:20:45:50
+W:25:1:3500:150
+E:1:1:1:2:1:1
+O:20:50:20:5
+B:HIT:HURT:4d8
+B:HIT:HURT:4d8
+F:DROP_60 | WILD_TOO | WILD_MOUNTAIN | DROP_SKELETON | DROP_CORPSE |
+F:OPEN_DOOR | BASH_DOOR |
+F:EVIL | GIANT | MALE |
+F:MORTAL | BASEANGBAND | HAS_LITE
+D:A ten-foot-tall humanoid with powerful muscles.
+
+N:256:Flesh golem
+G:g:R
+I:110:12d8:12:30:10
+W:14:2:3000:50
+E:1:1:1:2:1:1
+O:0:0:0:0
+B:HIT:HURT:1d6
+B:HIT:HURT:1d6
+F:EMPTY_MIND | BASH_DOOR | CAN_SWIM |
+F:IM_ELEC | IM_COLD |
+F:NO_CONF | NO_SLEEP | NO_FEAR | NONLIVING |
+F:MORTAL | BASEANGBAND | NO_CUT
+D:A shambling humanoid monster with long scars.
+
+N:257:Warg
+G:C:D
+I:120:8d8:20:20:40
+W:16:2:700:40
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:BITE:HURT:1d6
+B:BITE:HURT:1d6
+F:RAND_25 | BASH_DOOR | FRIENDS |
+F:WILD_TOO | WILD_WOOD | WILD_MOUNTAIN | DROP_SKELETON | DROP_CORPSE |
+F:ANIMAL | EVIL | MORTAL | BASEANGBAND
+D:It is a large wolf with eyes full of cunning. If you see
+D:one, it usually means orcs are nearby.
+
+N:258:Cheerful leprawn
+G:l:G
+I:120:2d5:8:6:6
+W:14:2:800:23
+E:1:1:1:2:1:1
+O:0:0:0:0
+B:TOUCH:EAT_GOLD
+B:TOUCH:EAT_FOOD
+F:DROP_60 | ONLY_GOLD | RAND_50 | OPEN_DOOR | MALE |
+F:GOOD | MORTAL | BASEANGBAND | PET
+S:MULTIPLY |
+S:1_IN_6 |
+S:BLINK
+D:A merry little gnome.
+
+N:259:Giant flea
+G:I:s
+I:120:1d2:6:7:10
+W:14:3:90:3
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:BITE:HURT:1d2
+F:RAND_50 | CAN_FLY | WEIRD_MIND |
+F:ANIMAL | MORTAL | BASEANGBAND
+S:MULTIPLY
+D:Just looking at it makes you itchy all over.
+
+N:260:Ufthak of Cirith Ungol
+G:o:g
+I:110:34d10:20:50:20
+W:14:3:2600:250
+E:1:1:1:2:1:1
+O:0:100:0:0
+B:HIT:HURT:3d5
+B:HIT:HURT:3d5
+B:HIT:HURT:3d5
+B:HIT:HURT:3d5
+F:UNIQUE | MALE |
+F:FORCE_MAXHP | CAN_SPEAK | DROP_SKELETON | DROP_CORPSE |
+F:ESCORT |
+F:ONLY_ITEM | DROP_1D2 | DROP_GOOD |
+F:OPEN_DOOR | BASH_DOOR |
+F:EVIL | ORC | IM_COLD | IM_POIS |
+F:MORTAL | BASEANGBAND | HAS_LITE
+D:A strong orc guarding the pass of Cirith Ungol. He is mortally afraid of
+D:spiders: he was captured by Shelob once, but escaped when she forgot
+D:completely about him.
+
+N:261:Clay golem
+G:g:U
+I:110:14d8:12:30:10
+W:15:2:3200:60
+E:1:1:1:2:1:1
+O:0:0:0:0
+B:HIT:HURT:1d8
+B:HIT:HURT:1d8
+F:EMPTY_MIND | COLD_BLOOD | BASH_DOOR |
+F:IM_FIRE | IM_COLD | IM_ELEC | IM_POIS |
+F:HURT_ROCK |
+F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT
+D:It is a massive animated statue made out of hardened clay.
+
+N:262:Black ogre
+G:O:D
+I:110:20d9:20:33:30
+W:15:2:2300:70
+E:1:1:1:2:1:1
+O:0:70:0:15
+B:HIT:HURT:2d8
+B:HIT:HURT:2d8
+F:RAND_25 | WILD_TOO | WILD_MOUNTAIN | DROP_CORPSE |
+F:FRIENDS | DROP_60 |
+F:OPEN_DOOR | BASH_DOOR |
+F:EVIL | GIANT |
+F:MORTAL | BASEANGBAND | HAS_LITE
+D:A massive orc-like figure with black skin and powerful arms.
+
+# New monster added by furiosity for the Theme module
+N:263:Maglor the Mighty Singer
+G:h:g
+I:120:60d25:20:80:10
+W:45:10:2300:2500
+E:1:1:1:2:1:1
+O:0:20:80:0
+B:HIT:HURT:10d10
+B:HIT:HURT:10d10
+B:HIT:HURT:10d10
+B:HIT:HURT:10d10
+F:MALE | NO_FEAR | NO_STUN | BASH_DOOR | KILL_BODY | FORCE_MAXHP |
+F:DROP_SKELETON | DROP_CORPSE | UNIQUE | SMART | DROP_4D2 |
+F:MORTAL | BASEANGBAND | HAS_LITE | DROP_GREAT | WILD_TOO | WILD_GRASS |
+S:1_IN_3 |
+S:HEAL | SCARE | CAUSE_2 | HOLD | CONF | S_ANIMALS |
+D:The second son of Feanor, who inherited more of his mother Nerdanel's
+D:gentle spirit than any of his brothers. Maglor was famed as a poet and
+D:bard, but he took the Oath of Feanor in Tirion and shared in the woes
+D:that came of it. He searches forever for the Silmarils of Feanor.
+
+N:264:Half-orc
+G:o:s
+I:110:16d10:20:40:20
+W:15:2:1700:50
+E:1:1:1:2:1:1
+O:30:30:30:5
+B:HIT:HURT:3d4
+B:HIT:HURT:3d4
+F:MALE | WILD_TOO |
+F:FRIENDS | DROP_60 |
+F:OPEN_DOOR | BASH_DOOR | DROP_SKELETON | DROP_CORPSE |
+F:EVIL | ORC | MORTAL | BASEANGBAND | HAS_LITE
+D:He is a hideous deformed cross-breed with man and orc, combining man's
+D:strength and cunning with orcish evil. The Dunlendings fighting on
+D:Saruman's side were first noted to mix their blood with the orcs.
+
+N:265:Dark naga
+G:n:s
+I:110:22d11:60:65:60
+W:15:2:1900:90
+E:0:0:0:0:1:0
+O:0:0:80:20
+B:STING:HURT:1d10
+B:BITE:HURT:1d10
+F:FEMALE |
+F:RAND_25 | DROP_60 | DROP_1D2 | IM_POIS | IM_COLD | RES_WATE |
+F:OPEN_DOOR | BASH_DOOR | EMPTY_MIND | CAN_SWIM | DROP_CORPSE |
+F:EVIL | MORTAL | BASEANGBAND
+S:1_IN_8
+S:HOLD | CONF | BO_COLD | HEAL | DARKNESS
+D:A giant snake-like figure with a woman's torso, talented in magic.
+
+N:266:Poison ivy
+G:#:g
+I:100:5d5:5:5:5
+W:10:4:50:10
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:HIT:POISON:2d2
+B:HIT:POISON:2d2
+F:FORCE_SLEEP | NEVER_MOVE | STUPID | EMPTY_MIND | FRIENDS |
+F:KILL_TREES | SUSCEP_FIRE | ANIMAL |
+F:WILD_ONLY | COLD_BLOOD | WILD_WOOD | WILD_GRASS |
+F:NO_CONF | NO_SLEEP | NO_FEAR | MORTAL | BASEANGBAND | DROP_60 | NO_CUT
+S:MULTIPLY
+D:A mass of vegetation. It seems to be growing.
+
+N:267:Magic mushroom patch
+G:,:B
+I:140:1d1:40:10:0
+W:15:2:50:10
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:SPORE:CONFUSE
+B:SPORE:CONFUSE
+B:SPORE:HALLU
+B:SPORE:HALLU
+F:FORCE_SLEEP | NEVER_MOVE |
+F:STUPID | RES_TELE | CAN_SWIM |
+F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT
+S:1_IN_2 |
+S:BLINK | SLOW | SCARE | DARKNESS
+D:Yum! It looks quite tasty. It seems to glow with an unusual light.
+
+# New monster added by furiosity for the Theme module
+N:268:Celegorm the Fair
+G:h:o
+I:120:60d25:20:80:10
+W:45:10:2300:2500
+E:1:1:1:2:1:1
+O:0:20:80:0
+B:HIT:HURT:10d10
+B:HIT:HURT:10d10
+B:HIT:HURT:10d10
+B:HIT:HURT:10d10
+F:MALE | NO_FEAR | NO_STUN | BASH_DOOR | KILL_BODY | FORCE_MAXHP |
+F:DROP_SKELETON | DROP_CORPSE | UNIQUE | SMART | DROP_4D2 |
+F:MORTAL | BASEANGBAND | HAS_LITE | DROP_GREAT | WILD_TOO | WILD_GRASS |
+S:1_IN_3 |
+S:S_MONSTER | S_ANIMAL | S_KIN | S_MONSTERS | S_ANIMALS | S_KIN |
+D:Celegorm the Fair was the third of the seven sons of Feanor.
+D:The most ambitious of the seven, he followed the oath of his father
+D:with the greatest ardour. He searches forever for the Silmarils.
+
+N:269:Guardian naga
+G:n:y
+I:110:24d11:20:65:120
+W:15:2:1900:80
+E:0:0:0:0:1:0
+O:0:0:80:20
+B:CRUSH:HURT:2d8
+B:BITE:HURT:1d8
+B:BITE:HURT:1d8
+F:FEMALE |
+F:RAND_25 | DROP_60 | DROP_1D2 | DROP_CORPSE
+F:OPEN_DOOR | BASH_DOOR | CAN_SWIM |
+F:EVIL
+F:MORTAL | BASEANGBAND
+D:A giant snake-like figure with a woman's torso.
+
+N:270:Wererat
+G:r:D
+I:110:20d8:10:10:10
+W:15:2:30:55
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:CLAW:HURT:1d8
+B:CLAW:HURT:1d8
+B:BITE:HURT:2d6
+F:FORCE_SLEEP |
+F:ONLY_GOLD | DROP_60 | DROP_CORPSE
+F:OPEN_DOOR | BASH_DOOR |
+F:ANIMAL | EVIL
+F:MORTAL | BASEANGBAND
+S:1_IN_9 |
+S:BLINK | CAUSE_2 | BO_COLD | BA_POIS | S_KIN
+D:A large rat with glowing red eyes, which can also assume human form.
+D:It is a disgusting creature, relishing in filth and disease.
+
+N:271:Light hound
+G:Z:o
+I:110:6d6:30:30:0
+W:15:1:600:50
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:CLAW:HURT:1d4
+B:CLAW:HURT:1d4
+B:BITE:HURT:1d6
+F:FORCE_SLEEP | DROP_CORPSE |
+F:FRIENDS |
+F:BASH_DOOR |
+F:ANIMAL | MORTAL | BASEANGBAND | HAS_LITE
+S:1_IN_5 |
+S:BR_LITE
+D:A brilliant canine form whose light hurts your eyes, even at this distance.
+
+N:272:Dark hound
+G:Z:D
+I:110:6d6:30:30:0
+W:15:1:600:50
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:CLAW:HURT:1d4
+B:CLAW:HURT:1d4
+B:BITE:HURT:1d6
+F:FORCE_SLEEP | DROP_CORPSE |
+F:FRIENDS |
+F:BASH_DOOR | HURT_LITE |
+F:ANIMAL | MORTAL | BASEANGBAND
+S:1_IN_5 |
+S:BR_DARK
+D:A hole in the air in the shape of a huge hound. No light falls upon its
+D:form.
+
+N:273:Flying skull
+G:s:s
+I:110:10d10:30:30:20
+W:15:3:500:50
+E:0:0:0:0:1:0
+O:90:0:10:0
+B:BITE:POISON:1d3
+B:BITE:LOSE_STR:1d4
+F:UNDEAD | EVIL | IM_POIS | IM_COLD | WEIRD_MIND | NO_FEAR | CAN_FLY |
+F:NO_CONF | NO_SLEEP | DROP_60 | BASH_DOOR | FRIENDS | COLD_BLOOD |
+F:BASEANGBAND | NO_CUT
+D:A skull animated by necromantic spells. You'll seldom catch one alone.
+
+# New monster added by furiosity for the Theme module
+N:274:Caranthir the Dark
+G:h:D
+I:120:60d25:20:80:0
+W:45:10:2300:2500
+E:1:1:1:2:1:1
+O:0:20:80:0
+B:HIT:HURT:10d10
+B:HIT:HURT:10d10
+B:HIT:HURT:10d10
+B:TOUCH:EAT_ITEM:10d10
+F:MALE | NO_FEAR | NO_STUN | BASH_DOOR | KILL_BODY | FORCE_MAXHP |
+F:DROP_SKELETON | DROP_CORPSE | UNIQUE | SMART | DROP_4D2 |
+F:MORTAL | BASEANGBAND | HAS_LITE | DROP_GREAT | WILD_TOO | WILD_GRASS |
+S:1_IN_3 |
+S:TRAPS | CONF | SCARE |
+D:The fourth son of Feanor, who turned on his own kind because of the
+D:Oath of his father. He searches forever for the Silmarils of Feanor.
+
+N:275:Giant tarantula
+G:S:o
+I:120:10d15:8:32:80
+W:15:3:1100:70
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:BITE:POISON:1d6
+B:BITE:POISON:1d6
+B:BITE:POISON:1d6
+F:WEIRD_MIND | BASH_DOOR | WILD_TOO |
+F:ANIMAL | SPIDER | IM_POIS | DROP_SKELETON |
+F:MORTAL | BASEANGBAND
+D:A giant spider with hairy black and red legs.
+
+# New monster added by furiosity for the Theme module
+N:276:Curufin the Crafty
+G:h:y
+I:120:60d25:20:80:10
+W:45:10:2300:2500
+E:1:1:1:2:1:1
+O:0:80:0:20
+B:HIT:HURT:10d10
+B:HIT:EAT_ITEM:10d10
+B:HIT:EAT_ITEM:10d10
+B:HIT:EAT_ITEM:10d10
+F:MALE | NO_FEAR | NO_STUN | BASH_DOOR | KILL_BODY | FORCE_MAXHP |
+F:DROP_SKELETON | DROP_CORPSE | UNIQUE | SMART | DROP_4D2 |
+F:MORTAL | BASEANGBAND | HAS_LITE | DROP_GREAT | WILD_TOO | WILD_GRASS |
+S:1_IN_3 |
+S:TELE_TO | TELE_AWAY | TPORT | BLINK | TRAPS |
+D:The fifth son of Feanor, closely associated with his elder
+D:brother Celegorm. Bound by the Oath of Feanor, he searches
+D:forever for the Silmarils.
+
+N:277:Mirkwood spider
+G:S:G
+I:120:9d8:15:25:80
+W:15:2:1200:25
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:BITE:HURT:1d8
+B:BITE:POISON:1d6
+B:BITE:POISON:1d6
+F:FRIENDS | WILD_TOO | WILD_WOOD |
+F:WEIRD_MIND | BASH_DOOR | HURT_LITE |
+F:ANIMAL | SPIDER | EVIL | IM_POIS | DROP_SKELETON |
+F:MORTAL | BASEANGBAND
+D:A strong and powerful spider from Mirkwood forest. Cunning and evil, it
+D:seeks to taste your juicy insides.
+
+N:278:Frost giant
+G:P:w
+I:110:32d15:20:50:50
+W:28:1:4000:180
+E:1:1:1:2:1:1
+O:20:80:0:0
+B:HIT:COLD:5d8
+B:HIT:COLD:5d8
+F:DROP_60 | WILD_TOO | WILD_WASTE | WILD_MOUNTAIN |
+F:OPEN_DOOR | BASH_DOOR | DROP_SKELETON | DROP_CORPSE |
+F:EVIL | GIANT | MALE | AURA_COLD | SUSCEP_FIRE |
+F:IM_COLD | BASEANGBAND | HAS_LITE | MORTAL
+D:A twelve-foot-tall giant covered in furs.
+
+N:279:Griffon
+G:H:u
+I:110:30d8:12:15:10
+W:15:1:2500:70
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:HIT:HURT:3d4
+B:BITE:HURT:2d6
+F:BASH_DOOR | CAN_FLY | WILD_TOO | WILD_WOOD | WILD_MOUNTAIN | WILD_GRASS |
+F:ANIMAL | DROP_CORPSE | MORTAL | BASEANGBAND
+D:It is half lion, half eagle. It flies menacingly towards you.
+
+N:280:Aewrog
+G:u:y
+I:110:8d8:20:32:30
+W:15:3:100:40
+E:1:1:1:2:1:1
+O:0:0:0:0
+B:HIT:PARALYZE:1d2
+B:HIT:HURT:1d10
+F:OPEN_DOOR | BASH_DOOR | NONLIVING | CAN_FLY |
+F:EVIL | DEMON | IM_FIRE | NO_FEAR | BASEANGBAND | HAS_LITE
+S:1_IN_50 |
+S:BR_NETH
+D:A minor demonic servant of evil. It resembles a bird - in fact,
+D:the Aewroeg are the result of the corruption of smaller birds by Morgoth.
+
+N:281:Gnome mage
+G:l:R
+I:110:7d8:20:20:20
+W:15:2:900:40
+E:1:1:1:2:1:1
+O:20:0:80:0
+B:HIT:HURT:1d5
+F:MALE |
+F:FORCE_SLEEP | FRIENDS | DROP_60 |
+F:OPEN_DOOR | BASH_DOOR | DROP_SKELETON |
+F:EVIL | MORTAL | BASEANGBAND | HAS_LITE
+S:1_IN_4 |
+S:BLINK | DARKNESS | BO_COLD |
+S:S_MONSTER
+D:A mage of short stature.
+
+N:282:Clear hound
+G:Z:B
+I:110:6d6:30:30:0
+W:15:1:600:50
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:CLAW:HURT:1d6
+B:CLAW:HURT:1d6
+B:BITE:HURT:1d8
+F:ATTR_CLEAR |
+F:FRIENDS | DROP_SKELETON | DROP_CORPSE |
+F:INVISIBLE | BASH_DOOR |
+F:ANIMAL | MORTAL | BASEANGBAND
+D:A faint sense of motion in the air, hound-shaped, stands before you.
+
+N:283:Umber hulk
+G:X:U
+I:110:20d10:20:50:10
+W:16:1:5000:75
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:GAZE:CONFUSE
+B:HIT:HURT:1d6
+B:HIT:HURT:1d6
+B:BITE:HURT:2d6
+F:EMPTY_MIND | COLD_BLOOD |
+F:BASH_DOOR | KILL_WALL | DROP_SKELETON |
+F:ANIMAL | EVIL |
+F:IM_POIS |
+F:HURT_ROCK | NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT
+D:This bizarre creature has glaring eyes and large mandibles capable of
+D:slicing through rock.
+
+N:284:Rust monster
+G:q:o
+I:110:20d15:12:55:10
+W:16:2:900:50
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:TOUCH:ACID:1d10
+B:TOUCH:ACID:1d10
+B:TOUCH:ACID:1d10
+B:TOUCH:ACID:1d10
+F:STUPID | WEIRD_MIND | KILL_ITEM |
+F:IM_ACID | IM_POIS | DROP_CORPSE |
+F:NO_CONF |
+F:MORTAL | BASEANGBAND
+D:It is a weird, small animal with two antennae popping forth from
+D:its forehead. It looks hungry.
+
+N:285:Ogrillon
+G:O:w
+I:110:22d9:20:33:30
+W:16:2:2400:75
+E:1:1:1:2:1:1
+O:20:70:0:10
+B:HIT:HURT:2d10
+B:HIT:HURT:2d10
+F:FRIENDS | DROP_60 | DROP_CORPSE |
+F:OPEN_DOOR | BASH_DOOR |
+F:EVIL | GIANT | ORC |
+F:MORTAL | BASEANGBAND | HAS_LITE
+D:An unnatural hybrid of ogre and orc.
+
+N:286:Gelatinous cube
+G:j:G
+I:110:36d10:12:18:1
+W:16:4:40000:80
+E:0:0:0:0:0:0
+O:40:30:20:0
+B:TOUCH:ACID:1d10
+B:TOUCH:ACID:1d10
+B:TOUCH:ACID:1d10
+F:FORCE_MAXHP |
+F:DROP_1D2 | DROP_4D2 |
+F:STUPID | EMPTY_MIND | COLD_BLOOD |
+F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | CAN_SWIM |
+F:IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS |
+F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT
+D:It is a strange, vast gelatinous structure that assumes cubic proportions
+D:as it lines all four walls of the corridors it patrols. Through its
+D:transparent jelly structure you can see treasures it has engulfed, and a
+D:few corpses as well.
+
+N:287:Giant green dragonfly
+G:F:G
+I:110:3d8:12:20:50
+W:16:2:150:65
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:BITE:POISON:1d6
+F:FORCE_SLEEP | RAND_50 | RAND_25 | WILD_TOO | WILD_SWAMP |
+F:WEIRD_MIND | BASH_DOOR | CAN_FLY |
+F:ANIMAL | IM_POIS |
+F:MORTAL | BASEANGBAND
+S:1_IN_10 |
+S:BR_POIS
+D:A large, foul-smelling dragonfly.
+
+N:288:Fire giant
+G:P:r
+I:110:34d16:20:60:50
+W:30:1:5000:220
+E:1:1:1:2:1:1
+O:20:80:0:0
+B:HIT:FIRE:6d8
+B:HIT:FIRE:6d8
+F:DROP_60 |
+F:OPEN_DOOR | BASH_DOOR | WILD_TOO | WILD_VOLCANO | SUSCEP_COLD |
+F:EVIL | GIANT | MALE | AURA_FIRE | DROP_SKELETON | DROP_CORPSE |
+F:IM_FIRE | BASEANGBAND | HAS_LITE | MORTAL
+D:A glowing fourteen-foot-tall giant. Flames surround his red skin.
+
+N:289:Hummerhorn
+G:I:y
+I:120:2d2:8:14:10
+W:16:4:100:4
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:BITE:CONFUSE:2d2
+F:RAND_50 | RAND_25 | CAN_FLY | WILD_TOO |
+F:WEIRD_MIND | ANIMAL | BASEANGBAND
+S:MULTIPLY
+D:A giant buzzing wasp, its stinger drips venom.
+
+N:290:Lizard man
+G:l:g
+I:110:16d10:20:40:20
+W:16:3:1300:55
+E:1:1:1:2:1:1
+O:50:50:0:0
+B:HIT:HURT:4d4
+B:HIT:HURT:4d4
+F:MALE | CAN_SWIM | IM_ACID |
+F:FRIENDS | DROP_60 | WILD_TOO | WILD_SHORE |
+F:OPEN_DOOR | BASH_DOOR | DROP_SKELETON
+F:EVIL
+F:MORTAL | BASEANGBAND | HAS_LITE
+D:Intelligent lizard being from the depths.
+
+N:291:Ulfast, Son of Ulfang
+G:p:U
+I:110:37d10:20:40:40
+W:16:3:1700:200
+E:1:1:1:2:1:1
+O:0:100:0:0
+B:HIT:HURT:3d6
+B:HIT:HURT:3d6
+B:HIT:HURT:3d6
+B:HIT:HURT:3d6
+F:UNIQUE | CAN_SPEAK | DROP_SKELETON | DROP_CORPSE |
+F:MALE |
+F:FORCE_MAXHP |
+F:ONLY_ITEM | DROP_90 | DROP_GOOD |
+F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR |
+F:EVIL | MORTAL | BASEANGBAND | HAS_LITE
+D:A short and swarthy Easterling. He professed to follow
+D:Caranthir, but turned on the Sons of Feanor, and so
+D:brought about their defeat.
+
+N:292:Crebain
+G:B:D
+I:120:3d5:40:12:0
+W:16:4:500:20
+E:0:1:1:0:1:0
+O:0:0:0:0
+B:CLAW:HURT:1d4
+B:CLAW:HURT:1d4
+F:ANIMAL | EVIL | MORTAL | FRIENDS | BASEANGBAND | DROP_CORPSE | HAS_EGG |
+F:WILD_TOO | WILD_WASTE | WILD_MOUNTAIN | WILD_WOOD | WILD_VOLCANO |
+F:WILD_GRASS | WILD_SWAMP | WILD_SHORE | WILD_OCEAN | CAN_FLY | AQUATIC
+S:1_IN_8 | SHRIEK
+D:A type of crow, specially bred by the forces of evil as spies; their
+D:rudimentary intelligence guided by an evil mind has tracked you down,
+D:and now they seek to alert other evil creatures to your presence.
+
+N:293:Berserker
+G:p:u
+I:120:60d25:20:80:10
+W:45:2:2300:2500
+E:1:1:1:2:1:1
+O:20:80:0:0
+B:HIT:HURT:7d7
+B:HIT:HURT:7d7
+B:HIT:HURT:7d7
+F:MALE | NO_FEAR | NO_STUN | BASH_DOOR | KILL_BODY | FORCE_MAXHP |
+F:DROP_SKELETON | DROP_CORPSE
+F:MORTAL | BASEANGBAND | HAS_LITE
+S:1_IN_4 | HASTE | SCARE
+D:He can drive himself into such a terrible battle-frenzy that he
+D:can survive blows which should kill him, and still apparently feel
+D:no pain. He tramples weaker creatures underfoot in his eagerness
+D:to get to his real enemy, and his battle-cry strikes terror into
+D:his foes.
+
+N:294:Draugrog
+G:u:o
+I:110:6d8:20:30:20
+W:16:2:500:50
+E:1:1:1:2:1:1
+O:0:50:30:10
+B:BITE:LOSE_DEX:1d6
+B:CLAW:HURT:1d3
+B:CLAW:HURT:1d3
+F:FORCE_SLEEP |
+F:RAND_25 |
+F:ONLY_ITEM | DROP_1D2 |
+F:SMART | INVISIBLE | BASH_DOOR |
+F:EVIL | DEMON | IM_FIRE | NONLIVING | BASEANGBAND | HAS_LITE
+S:1_IN_10 |
+S:BLINK | TPORT | TELE_TO | TELE_LEVEL | BLIND | CONF | SCARE
+D:Draugroeg are doglike demons, dogs corrupted by Morgoth.
+
+N:295:Sphinx
+G:H:G
+I:110:60d5:20:60:20
+W:17:2:6000:80
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:CLAW:HURT:2d6
+B:CLAW:HURT:2d6
+F:FORCE_SLEEP |
+F:ONLY_GOLD | DROP_1D2 | CAN_FLY | DROP_CORPSE |
+F:OPEN_DOOR | BASH_DOOR | WILD_TOO | WILD_MOUNTAIN |
+F:ANIMAL | MORTAL | BASEANGBAND
+S:1_IN_11 |
+S:SCARE | CONF
+D:It will eat you if you cannot answer its riddle.
+D:Unfortunately, you do not understand the language
+D:it speaks.
+
+N:296:Narrog
+G:u:g
+I:110:6d8:20:30:20
+W:17:2:400:55
+E:0:1:1:0:1:0
+O:30:20:50:0
+B:HIT:POISON:3d4
+B:HIT:POISON:3d4
+F:FORCE_SLEEP | CAN_FLY |
+F:RAND_25 |
+F:ONLY_ITEM | DROP_1D2 |
+F:SMART | INVISIBLE | COLD_BLOOD | BASH_DOOR |
+F:EVIL | DEMON | IM_FIRE | RES_TELE | BASEANGBAND | HAS_LITE
+S:1_IN_10 |
+S:BLINK | TPORT | TELE_TO | TELE_LEVEL | BLIND | CONF | SCARE | BO_FIRE
+D:A minor demonic servant of evil. It resembles a rat - in fact,
+D:the Narroeg are the result of the corruption of rats by Morgoth.
+
+N:297:Forest troll
+G:T:g
+I:110:20d10:20:50:40
+W:17:1:3000:70
+E:1:1:1:2:1:1
+O:30:70:0:0
+B:HIT:HURT:1d4
+B:HIT:HURT:1d4
+B:BITE:HURT:1d6
+F:MALE |
+F:FRIENDS | DROP_60 | WILD_TOO | WILD_WOOD | DROP_SKELETON | DROP_CORPSE |
+F:OPEN_DOOR | BASH_DOOR | SUSCEP_FIRE | REGENERATE |
+F:EVIL | TROLL | HURT_LITE | BASEANGBAND
+D:Trolls were made by Melkor Bauglir in mockery of the Ents. This one
+D:is green-skinned and very ugly.
+
+N:298:Freezing sphere
+G:*:w
+I:120:6d6:100:30:0
+W:17:1:0:50
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:EXPLODE:COLD:8d8
+F:FORCE_SLEEP | CAN_FLY | SUSCEP_FIRE | RAND_50 | RAND_25 |
+F:EMPTY_MIND | AURA_COLD |
+F:IM_COLD | NO_FEAR | NO_CONF | NO_SLEEP | NONLIVING | BASEANGBAND | HAS_LITE | NO_CUT
+D:A semi-sentient snowball, hurling itself at targets at random.
+
+N:299:Jumping fireball
+G:*:r
+I:120:6d6:100:30:0
+W:17:1:0:50
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:EXPLODE:FIRE:8d8
+F:FORCE_SLEEP | CAN_FLY | SUSCEP_COLD |
+F:EMPTY_MIND | AURA_FIRE | RAND_50 | RAND_25 |
+F:IM_FIRE | NO_FEAR | NO_CONF | NO_SLEEP | NONLIVING | BASEANGBAND | HAS_LITE | NO_CUT
+D:A semi-sentient fireball that moves around randomly.
+
+N:300:Ball lightning
+G:*:B
+I:120:6d6:100:30:0
+W:17:1:0:50
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:EXPLODE:ELEC:8d8
+F:FORCE_SLEEP | CAN_FLY | RAND_25 | RAND_50 |
+F:EMPTY_MIND | AURA_ELEC |
+F:IM_ELEC | NO_FEAR | NO_CONF | NO_SLEEP | NONLIVING | BASEANGBAND | HAS_LITE |NO_CUT
+D:A crackling ball of energy, zooming about seemingly at random.
+
+N:301:2-headed hydra
+G:M:u
+I:110:100d3:20:60:20
+W:17:2:4000:80
+E:0:1:0:2:2:0
+O:0:0:0:0
+B:BITE:HURT:2d6
+B:BITE:HURT:2d6
+F:FORCE_SLEEP | WILD_TOO | WILD_SHORE | WILD_SWAMP |
+F:ONLY_GOLD | DROP_1D2 | CAN_SWIM | DROP_SKELETON | DROP_CORPSE |
+F:OPEN_DOOR | BASH_DOOR | MOVE_BODY | HAS_EGG | IMPRESED |
+F:ANIMAL | MORTAL | BASEANGBAND
+S:1_IN_11 |
+S:SCARE
+D:A strange reptilian creature with two heads, guarding its hoard.
+
+N:302:Swamp thing
+G:H:g
+I:110:8d12:20:60:30
+W:17:2:2000:80
+E:1:1:1:2:1:1
+O:0:0:0:0
+B:CLAW:TERRIFY:2d5
+B:CLAW:TERRIFY:5d2
+F:CAN_SWIM | OPEN_DOOR | BASH_DOOR | WILD_TOO | WILD_SWAMP
+F:MORTAL | BASEANGBAND
+D:A creature that was once human, but is now as green as moss.
+
+N:303:Water spirit
+G:E:b
+I:120:9d8:12:28:40
+W:17:2:0:58
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:HIT:HURT:2d4
+B:HIT:HURT:2d4
+F:RAND_25 |
+F:EMPTY_MIND | COLD_BLOOD | BASH_DOOR |
+F:IM_POIS | IM_ACID | CAN_FLY |
+F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT
+D:A whirlpool of sentient liquid.
+
+N:304:Giant red scorpion
+G:S:r
+I:110:11d8:12:44:20
+W:17:1:1000:62
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:BITE:HURT:2d4
+B:STING:LOSE_STR:1d7
+F:WEIRD_MIND | BASH_DOOR | WILD_TOO |
+F:ANIMAL | DROP_SKELETON |
+F:MORTAL | BASEANGBAND
+D:It is fast and poisonous.
+
+N:305:Earth spirit
+G:E:u
+I:120:13d8:10:40:50
+W:17:2:0:64
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:HIT:HURT:1d8
+B:HIT:HURT:1d8
+F:RAND_25 |
+F:EMPTY_MIND | COLD_BLOOD |
+F:PASS_WALL | CAN_FLY |
+F:IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | HURT_ROCK |
+F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT
+D:A whirling form of sentient rock.
+
+N:306:Fire spirit
+G:E:r
+I:120:10d9:16:30:20
+W:18:2:0:75
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:HIT:FIRE:2d6
+B:HIT:FIRE:2d6
+F:RAND_25 |
+F:EMPTY_MIND | BASH_DOOR | CAN_FLY | SUSCEP_COLD |
+F:IM_FIRE | IM_POIS | WILD_TOO | WILD_VOLCANO |
+F:NO_CONF | NO_SLEEP | NO_FEAR | AURA_FIRE | BASEANGBAND | HAS_LITE | NO_CUT
+D:A whirlwind of sentient flame.
+
+N:307:Fire hound
+G:Z:r
+I:110:10d6:30:30:0
+W:18:1:600:70
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:CLAW:HURT:3d3
+B:CLAW:HURT:3d3
+B:BITE:FIRE:2d6
+F:FORCE_SLEEP |
+F:FRIENDS |
+F:BASH_DOOR | SUSCEP_COLD |
+F:ANIMAL | IM_FIRE | DROP_SKELETON | DROP_CORPSE |
+F:MORTAL | BASEANGBAND | HAS_LITE
+S:1_IN_10 |
+S:BR_FIRE
+D:Flames lick at its feet and its tongue is a blade of fire. You can feel a
+D:furnace heat radiating from this creature.
+
+N:308:Cold hound
+G:Z:w
+I:110:10d6:30:30:0
+W:18:1:600:70
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:CLAW:HURT:3d3
+B:CLAW:HURT:3d3
+B:BITE:COLD:2d6
+F:FORCE_SLEEP |
+F:FRIENDS |
+F:BASH_DOOR | DROP_SKELETON | DROP_CORPSE |
+F:ANIMAL | IM_COLD | SUSCEP_FIRE |
+F:MORTAL | BASEANGBAND
+S:1_IN_10 |
+S:BR_COLD
+D:A hound as tall as a man, this creature appears to be composed of angular
+D:planes of ice. Cold radiates from it and freezes your breath in the air.
+
+N:309:Energy hound
+G:Z:b
+I:110:10d6:30:30:0
+W:18:1:600:70
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:CLAW:HURT:3d3
+B:CLAW:HURT:3d3
+B:BITE:ELEC:2d6
+F:FORCE_SLEEP |
+F:FRIENDS | DROP_SKELETON | DROP_CORPSE |
+F:BASH_DOOR |
+F:ANIMAL | IM_ELEC |
+F:MORTAL | BASEANGBAND | HAS_LITE
+S:1_IN_10 |
+S:BR_ELEC
+D:An aura of lightning forms a ghostly halo around this hound, and
+D:sparks sting your fingers as energy builds up in the air around you.
+
+N:310:Lesser mimic
+G:m:y
+I:110:10d10:25:30:250
+W:18:3:100:60
+E:0:0:0:0:0:0
+O:10:10:10:10
+B:HIT:POISON:3d4
+B:HIT:HURT:2d3
+B:HIT:HURT:2d3
+F:MIMIC |
+F:FORCE_SLEEP | NEVER_MOVE | SUSCEP_COLD |
+F:EMPTY_MIND | COLD_BLOOD |
+F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT
+S:1_IN_6 |
+S:BLIND | CONF | SCARE | CAUSE_2 | BO_COLD
+D:A strange creature that disguises itself as some object to lure
+D:unsuspecting adventurers within reach of its venomous claws.
+
+N:311:Door mimic
+G:+:U
+I:110:10d10:25:30:0
+W:18:6:100:70
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:HIT:POISON:3d4
+B:HIT:CONFUSE:2d3
+B:HIT:PARALYZE:2d3
+F:CHAR_MULTI |
+F:FORCE_SLEEP | NEVER_MOVE |
+F:EMPTY_MIND | COLD_BLOOD |
+F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT
+S:1_IN_6 |
+S:BLIND | CONF | SCARE | CAUSE_2 | BO_COLD
+D:A strange creature that disguises itself as a door to lure
+D:unsuspecting adventurers within reach of its venomous claws.
+
+N:312:Blink dog
+G:C:B
+I:120:8d8:20:20:10
+W:18:2:400:50
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:BITE:HURT:1d8
+F:RAND_25 | FRIENDS | BASH_DOOR | DROP_SKELETON | DROP_CORPSE |
+F:ANIMAL | RES_TELE | MORTAL | BASEANGBAND
+S:1_IN_4 | BLINK | TELE_TO
+D:A strange magical member of the canine race, its form seems to shimmer and
+D:fade in front of your very eyes.
+
+N:313:Uruk
+G:o:B
+I:110:8d10:20:50:20
+W:16:1:2300:60
+E:1:1:1:2:1:1
+O:20:80:0:0
+B:HIT:HURT:3d5
+B:HIT:HURT:3d5
+F:MALE |
+F:FORCE_MAXHP | FRIENDS | DROP_60 |
+F:OPEN_DOOR | BASH_DOOR | DROP_SKELETON | DROP_CORPSE |
+F:EVIL | ORC | IM_POIS |
+F:MORTAL | BASEANGBAND | HAS_LITE
+S:1_IN_9 |
+S:ARROW_2
+D:It is a cunning orc of power, as tall as a man, and stronger. It fears
+D:little. His armour bears the mark of Saruman - a large white hand.
+
+N:314:Shagrat, the Orc Captain
+G:o:g
+I:110:42d10:20:60:20
+W:19:2:2600:400
+E:1:1:1:2:1:1
+O:10:90:0:0
+B:HIT:HURT:3d9
+B:HIT:HURT:3d9
+B:HIT:HURT:3d6
+B:HIT:HURT:3d6
+F:UNIQUE | MALE | CAN_SPEAK |
+F:FORCE_MAXHP | SPECIAL_GENE
+F:ESCORT | DROP_SKELETON | DROP_CORPSE |
+F:ONLY_ITEM | DROP_1D2 | DROP_GOOD |
+F:OPEN_DOOR | BASH_DOOR |
+F:EVIL | ORC | IM_POIS |
+F:MORTAL | BASEANGBAND | HAS_LITE
+D:He has power and great cunning, as leader of the garrison at Cirith Ungol.
+D:He is a large Uruk with an evil face, protruding fangs and long arms.
+
+N:315:Gorbag, the Orc Captain
+G:o:g
+I:110:42d10:20:60:20
+W:19:2:2600:400
+E:1:1:1:2:1:1
+O:10:90:0:0
+B:HIT:HURT:3d9
+B:HIT:HURT:3d9
+B:HIT:HURT:3d6
+B:HIT:HURT:3d6
+F:UNIQUE | MALE | CAN_SPEAK |
+F:FORCE_MAXHP |
+F:ESCORT | DROP_SKELETON | DROP_CORPSE
+F:ONLY_ITEM | DROP_1D2 | DROP_GOOD |
+F:OPEN_DOOR | BASH_DOOR |
+F:EVIL | ORC | IM_POIS
+F:MORTAL | BASEANGBAND | HAS_LITE
+D:He is an orc of power and great cunning, leader of the garrison at Minas Morgul.
+
+N:316:Shambling mound
+G:,:g
+I:110:20d6:20:16:40
+W:18:2:3000:75
+E:1:1:1:2:1:1
+O:0:0:0:0
+B:HIT:HURT:1d8
+B:HIT:HURT:1d8
+F:ONLY_GOLD | DROP_90 | WILD_TOO | WILD_SWAMP |
+F:STUPID | EMPTY_MIND | OPEN_DOOR | BASH_DOOR |
+F:EVIL | NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT
+S:1_IN_4 |
+S:SHRIEK
+D:A pile of rotting vegetation that slides towards you with a disgusting
+D:stench, waking all it nears.
+
+N:317:Venus Flytrap
+G:#:g
+I:120:10d10:20:5:0
+W:15:5:200:30
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:HIT:PARALYZE:3d3
+B:HIT:PARALYZE:3d3
+B:HIT:PARALYZE:3d3
+F:NEVER_MOVE | EMPTY_MIND | STUPID | CHAR_CLEAR | CHAR_MULTI | BASEANGBAND |
+F:WILD_ONLY | WILD_WOOD | WILD_SWAMP | ANIMAL | SUSCEP_FIRE | NO_CUT
+D:A carnivorous plant that is difficult to detect, until it suddenly snaps shut
+D:around its prey and releases paralysing enzymes to stop its struggles.
+
+# New monster added by furiosity for the Theme module
+N:318:Amrod, Son of Feanor
+G:h:W
+I:120:60d25:20:80:10
+W:45:10:2300:2500
+E:1:1:1:2:1:1
+O:0:80:0:20
+B:HIT:HURT:10d10
+B:HIT:HURT:10d10
+B:HIT:HURT:10d10
+B:HIT:HURT:10d10
+F:MALE | NO_FEAR | NO_STUN | BASH_DOOR | KILL_BODY | FORCE_MAXHP |
+F:DROP_SKELETON | DROP_CORPSE | UNIQUE | SMART | DROP_4D2 |
+F:MORTAL | BASEANGBAND | HAS_LITE | DROP_GREAT | WILD_TOO | WILD_GRASS |
+S:1_IN_3 |
+S:ARROW_1 | ARROW_2 | ARROW_3 | ARROW_4 | MISSILE
+D:The youngest son of Feanor along with his twin brother Amras.
+D:He is bound by the Oath of Feanor and searches forever for the
+D:Silmarils.
+
+# New monster added by furiosity for the Theme module
+N:319:Amras, Son of Feanor
+G:h:w
+I:120:60d25:20:80:10
+W:45:10:2300:2500
+E:1:1:1:2:1:1
+O:0:80:0:20
+B:HIT:HURT:10d10
+B:HIT:HURT:10d10
+B:HIT:HURT:10d10
+B:HIT:HURT:10d10
+F:MALE | NO_FEAR | NO_STUN | BASH_DOOR | KILL_BODY | FORCE_MAXHP |
+F:DROP_SKELETON | DROP_CORPSE | UNIQUE | SMART | DROP_4D2 |
+F:MORTAL | BASEANGBAND | HAS_LITE | DROP_GREAT | WILD_TOO | WILD_GRASS |
+S:1_IN_3 |
+S:ARROW_1 | ARROW_2 | ARROW_3 | ARROW_4 | MISSILE |
+S:TPORT | BLINK | TELE_TO | TELE_AWAY | S_MONSTER
+D:The youngest son of Feanor along with his twin brother Amrod.
+D:He is bound by the Oath of Feanor and searches forever for the
+D:Silmarils.
+
+N:320:Giant bronze dragonfly
+G:F:U
+I:120:3d8:12:20:50
+W:18:2:150:80
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:BITE:CONFUSE:1d6
+F:FORCE_SLEEP | RAND_50 | RAND_25 | CAN_FLY |
+F:WEIRD_MIND | BASH_DOOR | WILD_TOO | WILD_MOUNTAIN |
+F:ANIMAL | NO_CONF | NO_SLEEP |
+F:MORTAL | BASEANGBAND
+S:1_IN_10 |
+S:BR_CONF
+D:This gleaming dragonfly's wings beat mesmerizingly fast.
+
+N:321:Stone giant
+G:P:W
+I:110:35d18:20:75:50
+W:33:1:7000:250
+E:1:1:1:2:1:1
+O:10:90:0:0
+B:HIT:HURT:3d8
+B:HIT:HURT:3d8
+F:DROP_60 |
+F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | DROP_SKELETON | DROP_CORPSE |
+F:EVIL | GIANT | MALE | WILD_TOO | WILD_MOUNTAIN | BASEANGBAND | HAS_LITE
+D:He is eighteen feet tall and looking at you.
+
+N:322:Giant black dragonfly
+G:F:s
+I:120:3d8:12:20:50
+W:20:2:150:70
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:BITE:ACID:1d6
+F:FORCE_SLEEP | RAND_50 | RAND_25 |
+F:WEIRD_MIND | BASH_DOOR | CAN_FLY | WILD_TOO | WILD_SWAMP |
+F:ANIMAL | IM_ACID |
+F:MORTAL | BASEANGBAND
+S:1_IN_10 |
+S:BR_ACID
+D:The size of a large bird, this dragonfly drips caustic acid.
+
+N:323:Stone golem
+G:g:W
+I:100:28d8:12:75:10
+W:19:2:3500:100
+E:1:1:1:2:1:1
+O:0:0:0:0
+B:HIT:HURT:1d10
+B:HIT:HURT:1d10
+F:COLD_BLOOD | EMPTY_MIND | BASH_DOOR |
+F:IM_FIRE | IM_COLD | IM_ELEC | IM_POIS |
+F:HURT_ROCK |
+F:NO_CONF | NO_SLEEP | NO_FEAR | NONLIVING | BASEANGBAND | NO_CUT
+D:It is a massive animated statue of hard stone.
+
+N:324:Red mold
+G:m:r
+I:110:17d8:2:16:70
+W:19:1:40:64
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:SPORE:FIRE:4d4
+F:NEVER_MOVE | SUSCEP_COLD |
+F:STUPID | EMPTY_MIND |
+F:IM_FIRE | IM_POIS | CAN_SWIM |
+F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT
+D:It is a strange growth on the dungeon floor, glowing red.
+
+N:325:Giant gold dragonfly
+G:F:y
+I:120:3d8:12:20:50
+W:22:2:150:75
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:BITE:HURT:1d6
+F:FORCE_SLEEP |
+F:RAND_50 | RAND_25 | WILD_TOO | WILD_MOUNTAIN |
+F:WEIRD_MIND | BASH_DOOR |
+F:ANIMAL | IM_FIRE | CAN_FLY |
+F:MORTAL | BASEANGBAND
+S:1_IN_10 |
+S:BR_SOUN
+D:Large beating wings support this dazzling insect. A loud buzzing noise
+D:pervades the air.
+
+# New monster added by furiosity for the Theme module
+# Anti-Naugladur
+N:326:Telchar the Smith
+G:k:w
+I:110:20d100:30:200:200
+W:70:1:0:12000
+B:HIT:HURT:4d6
+B:HIT:HURT:4d6
+B:HIT:HURT:4d6
+B:HIT:HURT:4d6
+F:UNIQUE | MALE | CAN_SPEAK |
+F:FORCE_MAXHP | SMART | PET |
+F:ONLY_ITEM | DROP_2D2 | DROP_GOOD | DROP_GREAT
+F:OPEN_DOOR | BASH_DOOR
+F:GOOD | IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS
+D:A Dwarf of Nogrod in the Blue Mountains, and one of the
+D:greatest smiths in the history of Middle-earth. Among his
+D:works were Angrist, Narsil, and the Dragon-helm of Dor-lómin.
+D:He is he last among the Dwarves of Nogrod to be on the
+D:side of the Light.
+
+N:327:Ghast
+G:z:u
+I:120:30d10:40:40:20
+W:30:1:1500:130
+E:1:1:1:2:1:1
+O:20:35:25:10
+B:CLAW:PARALYZE:2d4
+B:CLAW:PARALYZE:2d4
+B:BITE:LOSE_CON:2d4
+B:BITE:LOSE_CHR:2d4
+F:DROP_60 | OPEN_DOOR | BASH_DOOR | ESCORT |
+F:NO_SLEEP | NO_CONF | UNDEAD | EVIL | IM_POIS | IM_COLD |
+F:COLD_BLOOD | HURT_LITE | CAN_SWIM | BASEANGBAND | NO_CUT
+D:This vile abomination is a relative of ghouls, and often leads packs
+D:of them. It smells foul, and its bite carries a rotting disease.
+
+N:328:Neekerbreeker
+G:I:g
+I:120:3d2:8:18:10
+W:19:4:100:4
+B:BITE:POISON:2d2
+F:RAND_50 | RAND_25 | CAN_FLY | WILD_SWAMP | WILD_TOO |
+F:WEIRD_MIND | ANIMAL | EVIL | BASEANGBAND
+S:MULTIPLY |
+S:1_IN_12 |
+S:SHRIEK
+D:Believed to be an evil relative of the cricket, this creature gets its name
+D:from its incessant squeaking, which can best be described as "neek-breek,
+D:neek-breek". The noise can drive people frantic, and worse still, can be
+D:heard for quite some distance, alerting other monsters to your presence.
+
+N:329:Huorn
+G:#:g
+I:110:50d10:40:45:20
+W:19:1:4000:75
+E:0:0:0:0:0:0
+O:30:30:30:5
+B:CRUSH:HURT:3d6
+B:CRUSH:HURT:3d6
+B:CRUSH:HURT:3d6
+B:CRUSH:HURT:3d6
+F:DROP_60 | NO_SLEEP | NO_CONF | ANIMAL | WEIRD_MIND | SUSCEP_FIRE |
+F:RES_WATE | IM_COLD | NEVER_MOVE | WILD_ONLY | WILD_WOOD |
+F:BASEANGBAND | NO_CUT
+S:1_IN_9
+S:BLINK | TELE_TO
+D:A very strong near-sentient tree, which has become hostile to other living things.
+
+N:330:Bolg, Son of Azog
+G:o:R
+I:120:52d10:20:50:20
+W:20:4:2300:800
+E:1:1:1:2:1:1
+O:0:100:0:0
+B:HIT:HURT:3d7
+B:HIT:HURT:3d7
+B:HIT:HURT:3d7
+B:HIT:HURT:3d7
+F:UNIQUE | MALE | CAN_SPEAK |
+F:FORCE_MAXHP | SPECIAL_GENE |
+F:ESCORT | DROP_SKELETON | DROP_CORPSE |
+F:ONLY_ITEM | DROP_2D2 | DROP_GOOD |
+F:OPEN_DOOR | BASH_DOOR |
+F:EVIL | ORC | IM_POIS |
+F:MORTAL | BASEANGBAND | HAS_LITE
+D:A large and powerful orc, he looks just like his father. He is tall and
+D:fast, and he hates all dwarves and their friends.
+
+N:331:Phase spider
+G:S:B
+I:120:6d8:15:25:80
+W:20:2:500:60
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:BITE:HURT:1d8
+B:BITE:POISON:1d6
+B:BITE:POISON:1d6
+F:FRIENDS | WILD_TOO | WILD_WOOD | DROP_SKELETON |
+F:WEIRD_MIND | BASH_DOOR | CAN_SWIM |
+F:ANIMAL | SPIDER | IM_POIS | RES_TELE |
+F:MORTAL | BASEANGBAND
+S:1_IN_5 |
+S:BLINK | TELE_TO
+D:A spider that never seems quite there. Everywhere you look it is just
+D:half-seen in the corner of one eye.
+
+N:332:Lizard king
+G:l:r
+I:120:18d11:20:40:20
+W:20:3:1600:150
+E:1:1:1:2:1:1
+O:50:50:0:0
+B:HIT:HURT:5d5
+B:HIT:HURT:5d5
+B:WAIL:TERRIFY
+F:MALE | CAN_SWIM | IM_ACID | IM_POIS | WILD_SHORE |
+F:DROP_60 | DROP_1D2 | DROP_CORPSE |
+F:OPEN_DOOR | BASH_DOOR |
+F:EVIL | FORCE_MAXHP |
+F:MORTAL | BASEANGBAND | HAS_LITE
+D:A leader of lizard men, coming from the depths.
+
+N:333:Landmine
+G:.:w
+I:110:6d6:30:25:10
+W:20:5:300:50
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:EXPLODE:HURT:25d2
+F:CHAR_CLEAR | ATTR_CLEAR | CHAR_MULTI |
+F:NEVER_MOVE | FORCE_MAXHP |
+F:EMPTY_MIND | INVISIBLE | COLD_BLOOD |
+F:NO_CONF | NO_SLEEP | NO_FEAR | JOKEANGBAND | NO_CUT
+D:It was left here to be used against intruders.
+
+# New monster added by furiosity for the Theme module
+N:334:Roac, son of Carc
+G:B:W
+I:120:30d10:40:12:0
+W:0:2:500:500
+E:0:1:1:0:1:0
+O:0:0:0:0
+B:BITE:HURT:2d4
+B:BITE:HURT:2d4
+F:BASEANGBAND | UNIQUE | MALE | CAN_SPEAK | FORCE_MAXHP | PET |
+F:WILD_ONLY | WILD_WOOD | WILD_MOUNTAIN | WILD_GRASS | WILD_WASTE |
+F:ANIMAL | CAN_FLY | DROP_CORPSE | SMART | GOOD | MORTAL |
+S:1_IN_2
+S:S_MONSTER | S_MONSTERS
+D:One of the ravens who lived on Ravenhill, one of the foothills of Erebor,
+D:the Lonely Mountain. Roac is a very ancient bird indeed: his father Carc
+D:had seen Smaug descend on the mountain, and Roac was no less than 153 years
+D:old ('out of the egg', as he put it) when Smaug was destroyed. He is a
+D:leader among the ravens and his cunning is not to be underestimated.
+
+N:335:Great eagle
+G:B:r
+I:120:100d5:20:65:20
+W:20:2:1000:150
+E:0:1:1:0:1:0
+O:0:0:0:0
+B:CLAW:HURT:6d3
+B:CLAW:HURT:6d3
+B:BITE:HURT:3d6
+F:CAN_FLY | NEUTRAL | NO_TARGET |
+F:WILD_MOUNTAIN | WILD_VOLCANO | WILD_WASTE | WILD_WOOD | WILD_ONLY |
+F:ANIMAL | GOOD | DROP_CORPSE | BASEANGBAND | IMPRESED | HAS_EGG | AQUATIC |
+D:Greater and more intelligent than most of its kind, this eagle is
+D:a messenger between the forces of good. It answers to Manwe Sulimo.
+
+N:336:Livingstone
+G:#:W
+I:110:6d8:45:28:20
+W:20:4:1000:56
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:HIT:HURT:2d5
+B:HIT:HURT:2d5
+F:NEVER_MOVE | IM_COLD | COLD_BLOOD | IM_ACID | IM_ELEC | NO_FEAR |
+F:IM_FIRE | IM_POIS | NO_CONF | NO_SLEEP | FRIENDS | CHAR_MULTI | HURT_ROCK |
+F:BASEANGBAND | NO_CUT
+S:MULTIPLY
+D:A sentient section of wall.
+
+N:337:Earth hound
+G:Z:u
+I:110:15d8:30:30:0
+W:20:1:600:200
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:BITE:HURT:1d8
+B:BITE:HURT:1d8
+B:CLAW:HURT:3d3
+B:CLAW:HURT:3d3
+F:FORCE_SLEEP |
+F:FRIENDS | DROP_SKELETON | DROP_CORPSE |
+F:BASH_DOOR |
+F:ANIMAL | MORTAL | BASEANGBAND | NO_CUT
+S:1_IN_10 |
+S:BR_SHAR
+D:A beautiful crystalline shape does not disguise the danger this hound
+D:clearly presents. Your flesh tingles as it approaches.
+
+N:338:Air hound
+G:Z:g
+I:110:15d8:30:30:0
+W:20:1:600:200
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:BITE:POISON:1d8
+B:BITE:POISON:1d8
+B:CLAW:HURT:3d3
+B:CLAW:HURT:3d3
+F:FORCE_SLEEP |
+F:FRIENDS | CAN_FLY |
+F:BASH_DOOR | DROP_SKELETON | DROP_CORPSE |
+F:ANIMAL | IM_POIS | MORTAL | BASEANGBAND
+S:1_IN_10 |
+S:BR_POIS
+D:Swirling vapours surround this beast as it floats towards you, seemingly
+D:walking on air. Noxious gases sting your throat.
+
+N:339:Sabre-tooth tiger
+G:f:y
+I:120:20d14:40:50:0
+W:20:2:1800:120
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:CLAW:HURT:1d10
+B:CLAW:HURT:1d10
+B:BITE:HURT:1d10
+B:BITE:HURT:1d10
+F:BASH_DOOR | WILD_WOOD | WILD_TOO | WILD_GRASS |
+F:ANIMAL | DROP_SKELETON | DROP_CORPSE
+F:MORTAL | BASEANGBAND
+D:A fierce and dangerous cat, its huge tusks and sharp claws would lacerate
+D:even the strongest armour.
+
+N:340:Acid hound
+G:Z:s
+I:110:15d8:30:30:0
+W:20:1:600:200
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:BITE:ACID:1d8
+B:BITE:ACID:1d8
+B:CLAW:HURT:3d3
+B:CLAW:HURT:3d3
+F:FORCE_SLEEP |
+F:FRIENDS |
+F:BASH_DOOR | CAN_SWIM | DROP_SKELETON | DROP_CORPSE |
+F:ANIMAL | IM_ACID | MORTAL | BASEANGBAND
+S:1_IN_10 |
+S:BR_ACID
+D:Footprints are burned in the ground behind this hound as it pads
+D:around the dungeon. An acrid smell of acid rises from its pelt.
+
+N:341:Chimaera
+G:H:r
+I:110:20d15:12:15:10
+W:20:2:1600:200
+E:0:1:0:2:2:0
+O:0:0:0:0
+B:BUTT:HURT:2d8
+B:BITE:HURT:2d10
+B:BITE:FIRE:2d6
+F:FORCE_SLEEP | CAN_FLY | DROP_CORPSE | SUSCEP_COLD |
+F:BASH_DOOR | WILD_TOO | WILD_MOUNTAIN |
+F:IM_FIRE | MORTAL | BASEANGBAND | HAS_LITE
+S:1_IN_10 |
+S:BR_FIRE
+D:It is a strange hybrid of goat, lion and dragon, with the heads of all
+D:three beasts.
+
+N:342:Quylthulg
+G:Q:y
+I:110:6d8:10:1:0
+W:20:1:3000:250
+E:0:0:0:0:0:0
+O:0:0:0:0
+F:FORCE_SLEEP | NEVER_MOVE | NEVER_BLOW
+F:EMPTY_MIND | INVISIBLE | ANIMAL |
+F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND
+S:1_IN_4 |
+S:BLINK |
+S:S_MONSTER
+D:It is a strange pulsing mound of flesh. It looks harmless.
+
+N:343:Sasquatch
+G:Y:W
+I:120:20d19:15:40:10
+W:20:3:3500:180
+E:1:1:1:2:1:1
+O:0:0:0:0
+B:CLAW:HURT:1d10
+B:CLAW:HURT:1d10
+B:BITE:HURT:2d8
+F:OPEN_DOOR | BASH_DOOR | WILD_TOO | WILD_MOUNTAIN | WILD_WOOD | WILD_WASTE |
+F:ANIMAL | IM_COLD | DROP_SKELETON | DROP_CORPSE |
+F:MORTAL | BASEANGBAND
+D:A tall shaggy, furry humanoid, related to the yeti.
+
+# New monster added by furiosity for the Theme module
+N:344:Carc of Ravenhill
+G:B:W
+I:120:6d100:40:12:0
+W:0:2:500:500
+E:0:1:1:0:1:0
+O:0:0:0:0
+B:BITE:HURT:4d8
+B:BITE:HURT:4d8
+F:BASEANGBAND | UNIQUE | MALE | CAN_SPEAK | FORCE_MAXHP | PET |
+F:WILD_ONLY | WILD_WOOD | WILD_MOUNTAIN | WILD_GRASS | WILD_WASTE |
+F:ANIMAL | CAN_FLY | DROP_CORPSE | SMART | GOOD | MORTAL |
+S:1_IN_2
+S:S_ANIMAL | S_ANIMALS
+D:One of the ravens who lived on Ravenhill, one of the foothills of Erebor,
+D:the Lonely Mountain. Carc seems to have been the chief of those birds,
+D:and dwelt with his wife above the Dwarves' guard-chamber on the hill.
+D:He is a wise old bird who knows what is best for his folk and Arda.
+
+N:345:Ranger
+G:p:W
+I:110:15d11:20:40:40
+W:20:1:1700:55
+E:1:1:1:2:1:1
+O:20:50:20:0
+B:HIT:HURT:5d4
+B:HIT:HURT:5d4
+F:MALE |
+F:DROP_1D2 |
+F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR |
+F:DROP_SKELETON | DROP_CORPSE | BASEANGBAND | MORTAL | HAS_LITE
+S:1_IN_4 |
+S:ARROW_2 | MISSILE | BO_COLD | BO_ELEC | BLINK | S_ANIMAL
+D:A warrior who is at one with nature. A master of both bow and sword, with
+D:minor spellcasting skills.
+
+N:346:Paladin
+G:p:w
+I:110:15d11:20:40:40
+W:20:1:1700:55
+E:1:1:1:2:1:1
+O:20:60:0:10
+B:HIT:HURT:4d5
+B:HIT:HURT:4d5
+F:MALE | GOOD | DROP_SKELETON | DROP_CORPSE |
+F:DROP_1D2 |
+F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR |
+F:BASEANGBAND | MORTAL | HAS_LITE
+S:1_IN_4 |
+S:HEAL | CAUSE_2 | SLOW | SCARE | BLIND
+D:A warrior devoted to Tulkas Astaldo. He considers you to be an
+D:agent of Morgoth.
+
+N:347:Werewolf
+G:C:D
+I:110:20d22:15:30:70
+W:20:2:900:150
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:CLAW:HURT:2d6
+B:CLAW:HURT:2d6
+B:BITE:HURT:2d10
+F:RAND_25 |
+F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | DROP_SKELETON |
+F:ANIMAL | EVIL | MORTAL | BASEANGBAND
+D:It is a huge wolf with eyes that glow with manly intelligence.
+
+N:348:Dark elven lord
+G:h:D
+I:120:18d15:20:40:30
+W:20:2:1400:500
+E:1:1:1:2:1:1
+O:0:80:20:0
+B:HIT:HURT:3d8
+B:HIT:HURT:3d5
+F:MALE | FORCE_SLEEP |
+F:ONLY_ITEM | DROP_2D2 | DROP_SKELETON | DROP_CORPSE |
+F:OPEN_DOOR | BASH_DOOR |
+F:EVIL | HURT_LITE | BASEANGBAND | HAS_LITE
+S:1_IN_5 |
+S:HASTE | BLIND | CONF | DARKNESS | BO_FIRE | BO_COLD | MISSILE
+D:A dark elven figure in armour, radiating evil power.
+
+N:349:Cloud giant
+G:P:b
+I:110:35d20:20:60:50
+W:36:1:9000:500
+E:1:1:1:2:1:1
+O:10:90:0:0
+B:HIT:ELEC:8d8
+B:HIT:ELEC:8d8
+F:DROP_90 |
+F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | DROP_SKELETON | DROP_CORPSE |
+F:EVIL | GIANT | IM_ELEC | MALE | BASEANGBAND | HAS_LITE
+D:It is a twenty-foot-tall humanoid, wreathed in clouds.
+
+N:350:Ugluk, the Uruk
+G:o:R
+I:110:72d10:20:95:20
+W:21:3:2400:600
+E:1:1:1:2:1:1
+O:10:90:0:0
+B:HIT:HURT:3d8
+B:HIT:HURT:3d8
+B:HIT:HURT:3d5
+B:HIT:HURT:3d5
+F:UNIQUE | MALE | CAN_SPEAK |
+F:FORCE_MAXHP | DROP_SKELETON | DROP_CORPSE |
+F:ESCORT |
+F:ONLY_ITEM | DROP_1D2 | DROP_GOOD |
+F:OPEN_DOOR | BASH_DOOR |
+F:EVIL | ORC | IM_FIRE | IM_COLD | IM_POIS
+F:MORTAL | BASEANGBAND | HAS_LITE
+D:A strong and cunning orc warrior, the commander of Saruman's orcish horde.
+D:He was raised on man-flesh at Isengard, and bears the mark of the White Hand.
+
+N:351:Blue dragon bat
+G:b:b
+I:130:4d4:12:26:50
+W:21:1:100:54
+E:0:1:1:0:1:0
+O:0:0:0:0
+B:BITE:ELEC:1d3
+F:FORCE_SLEEP |
+F:RAND_50 |
+F:BASH_DOOR | CAN_FLY |
+F:ANIMAL | IM_ELEC | AI_ANNOY
+F:MORTAL | BASEANGBAND
+S:1_IN_4 |
+S:BR_ELEC
+D:It is a glowing blue bat with a sharp tail.
+
+N:352:Mimic
+G:m:y
+I:110:10d14:30:40:0
+W:21:3:100:70
+E:0:0:0:0:0:0
+O:20:20:20:20
+B:HIT:POISON:3d4
+B:HIT:POISON:3d4
+B:HIT:HURT:2d3
+B:HIT:HURT:2d3
+F:MIMIC |
+F:FORCE_SLEEP | NEVER_MOVE |
+F:EMPTY_MIND | COLD_BLOOD | SUSCEP_FIRE |
+F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT
+S:1_IN_5 |
+S:BLIND | CONF | SCARE | CAUSE_2 | BO_FIRE |
+S:S_MONSTER
+D:A strange creature that disguises itself as an object to lure
+D:unsuspecting adventurers within reach of its venomous claws.
+
+N:353:Ultimate mimic
+G:m:y
+I:110:15d40:30:40:0
+W:35:4:100:250
+E:0:0:0:0:0:0
+O:25:25:25:25
+B:BITE:POISON:4d4
+B:BITE:POISON:4d4
+B:BUTT:CONFUSE:4d4
+B:SPIT:BLIND:4d4
+F:MIMIC |
+F:FORCE_SLEEP | NEVER_MOVE |
+F:EMPTY_MIND | COLD_BLOOD
+F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT
+S:1_IN_5 |
+S:BLIND | CONF | SCARE | CAUSE_2 | BA_POIS |
+S:S_MONSTER
+D:A strange creature that disguises itself as an object to lure
+D:unsuspecting adventurers within reach of its venomous claws.
+
+
+N:354:Fire vortex
+G:v:r
+I:110:9d9:100:30:0
+W:21:1:0:100
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:ENGULF:FIRE:3d3
+F:FORCE_SLEEP | RAND_50 | CAN_FLY | WILD_VOLCANO | WILD_TOO | SUSCEP_COLD |
+F:EMPTY_MIND | BASH_DOOR | POWERFUL | AURA_FIRE |
+F:IM_FIRE | NO_FEAR | NO_CONF | NO_SLEEP | NONLIVING | BASEANGBAND | HAS_LITE
+F:NO_CUT
+S:1_IN_6 |
+S:BR_FIRE
+D:A whirling maelstrom of fire.
+
+N:355:Acid vortex
+G:v:s
+I:110:9d9:100:30:0
+W:21:1:0:100
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:ENGULF:ACID:3d3
+F:FORCE_SLEEP | RAND_50 |
+F:EMPTY_MIND | BASH_DOOR | POWERFUL | CAN_FLY |
+F:IM_ACID | NO_FEAR | NO_CONF | NO_SLEEP | NONLIVING | BASEANGBAND | NO_CUT
+S:1_IN_6 |
+S:BR_ACID
+D:A caustic spinning whirlpool of foaming, steaming water.
+
+N:356:Lugdush, the Uruk
+G:o:R
+I:110:66d10:20:90:20
+W:21:4:2500:550
+E:1:1:1:2:1:1
+O:10:90:0:0
+B:HIT:HURT:3d6
+B:HIT:HURT:3d6
+B:HIT:HURT:3d6
+B:HIT:HURT:3d6
+F:UNIQUE | MALE | CAN_SPEAK |
+F:FORCE_MAXHP | DROP_SKELETON | DROP_CORPSE |
+F:ESCORT |
+F:ONLY_ITEM | DROP_1D2 | DROP_GOOD |
+F:OPEN_DOOR | BASH_DOOR |
+F:EVIL | ORC | IM_POIS |
+F:MORTAL | BASEANGBAND | HAS_LITE
+D:A large and powerful orc, captain of one of Saruman's orcish regiments.
+
+# New monster added by furiosity for the Theme module
+N:357:Alatar, the Blue Wizard
+G:p:b
+I:120:49d101:101:100:0
+W:110:7:1600:35000
+E:1:1:1:2:1:1
+O:0:0:100:0
+B:HIT:UN_BONUS:8d12
+B:HIT:TERRIFY:7d7
+F:BASEANGBAND | FORCE_DEPTH | FORCE_MAXHP | FORCE_SLEEP |
+F:UNIQUE | MALE | CAN_SPEAK | PET | DROP_CORPSE |
+F:REFLECTING | RES_TELE | SMART | GOOD |
+F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 | DROP_GREAT |
+F:OPEN_DOOR | BASH_DOOR | HAS_LITE | TAKE_ITEM |
+F:IM_FIRE | IM_COLD | IM_ELEC | IM_ACID | IM_POIS |
+F:RES_NETH | NO_CONF | NO_SLEEP | NO_FEAR |
+S:1_IN_2 |
+S:HEAL | HASTE | TPORT | TELE_AWAY | BLIND | CONF | SCARE |
+S:CAUSE_4 | BRAIN_SMASH | FORGET | TRAPS | CAUSE_4 |
+S:BA_FIRE | BA_MANA | BO_FIRE | BO_MANA | BO_PLAS | BR_PLAS |
+S:S_MONSTERS | S_HI_DRAGON | S_KIN | S_ANIMALS |
+D:He is dressed in blue from head to toe. He is one of the five Istari
+D:who came to the northwest of Middle-earth in the Third Age; he
+D:journeyed into the east with Pallando, and never returned to the western
+D:lands. They stumbled upon a magical portal to the remnants of Utumno and
+D:could not find their way back. Alatar is still trying to continue the
+D:task the Valar have appointed him.
+
+N:358:Cold vortex
+G:v:w
+I:110:9d9:100:30:0
+W:21:1:0:100
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:ENGULF:COLD:3d3
+F:FORCE_SLEEP | RAND_50 | AURA_COLD | COLD_BLOOD | SUSCEP_FIRE |
+F:EMPTY_MIND | BASH_DOOR | POWERFUL | CAN_FLY |
+F:IM_COLD | NO_FEAR | NO_CONF | NO_SLEEP | NONLIVING | BASEANGBAND | NO_CUT
+S:1_IN_6 |
+S:BR_COLD
+D:A twisting whirlpool of frost.
+
+N:359:Energy vortex
+G:v:b
+I:110:9d9:100:30:0
+W:21:1:0:100
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:ENGULF:ELEC:3d3
+F:FORCE_SLEEP | RAND_50 | CAN_FLY | HAS_LITE |
+F:EMPTY_MIND | BASH_DOOR | POWERFUL | AURA_ELEC |
+F:IM_ELEC | NO_FEAR | NO_CONF | NO_SLEEP | NONLIVING | BASEANGBAND | NO_CUT
+S:1_IN_6 |
+S:BR_ELEC
+D:A shimmering tornado of air; sparks crackle along its length.
+
+N:360:Globefish
+G:~:w
+I:110:10d10:20:30:30
+W:21:1:600:111
+E:0:0:0:0:1:0
+O:0:0:0:0
+B:BITE:POISON:10d5
+B:BITE:POISON:10d5
+F:EMPTY_MIND | BASH_DOOR | POWERFUL | AQUATIC |
+F:IM_POIS | NO_STUN | WILD_TOO | COLD_BLOOD |
+F:ANIMAL | MORTAL | BASEANGBAND
+S:1_IN_8 |
+S:BR_POIS
+D:This fish is among the most poisonous creatures there are.
+
+N:361:Giant firefly
+G:I:r
+I:120:3d2:8:18:10
+W:24:4:100:4
+B:BITE:BLIND:1d2
+F:RAND_50 | RAND_25 | CAN_FLY | HAS_LITE |
+F:WEIRD_MIND | ANIMAL | BASEANGBAND
+S:MULTIPLY
+D:Clouds of these monsters light up the dungeon - so brightly that you can
+D:barely see through them.
+
+N:362:Mummified orc
+G:z:w
+I:110:15d8:20:28:75
+W:21:1:1700:56
+E:1:1:1:2:1:1
+O:10:70:0:10
+B:HIT:HURT:2d4
+B:HIT:HURT:2d4
+F:DROP_90 |
+F:EMPTY_MIND | COLD_BLOOD | OPEN_DOOR | BASH_DOOR |
+F:EVIL | ORC | UNDEAD |
+F:IM_COLD | IM_POIS |
+F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT
+D:It is an orc-like figure covered in wrappings.
+
+N:363:Wolf chieftain
+G:C:g
+I:120:22d22:20:20:5
+W:26:5:1000:120
+B:CLAW:HURT:2d6
+B:CLAW:HURT:2d6
+B:BITE:HURT:2d10
+B:WAIL:TERRIFY
+F:ESCORTS | FORCE_MAXHP | IM_COLD | IM_ACID |
+F:SMART | ESCORT | ANIMAL | EVIL | MORTAL | BASEANGBAND |
+F:OPEN_DOOR | BASH_DOOR | NO_FEAR | MALE
+S:1_IN_8 | DARKNESS
+D:A great Wolf leader whose pack is in the service of the Dark Lord,
+D:and whose howls strike fear into the boldest hearts.
+
+# New monster added by furiosity for the Theme module
+N:364:Pallando, the Blue Wizard
+G:p:b
+I:120:49d101:101:100:0
+W:120:7:1600:45000
+E:1:1:1:2:1:1
+O:0:0:100:0
+B:HIT:UN_BONUS:10d14
+B:HIT:TERRIFY:9d9
+F:BASEANGBAND | FORCE_DEPTH | FORCE_MAXHP | FORCE_SLEEP |
+F:UNIQUE | MALE | CAN_SPEAK | DROP_CORPSE |
+F:REFLECTING | RES_TELE | SMART | EVIL |
+F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 | DROP_GREAT |
+F:OPEN_DOOR | BASH_DOOR | HAS_LITE | TAKE_ITEM |
+F:IM_FIRE | IM_COLD | IM_ELEC | IM_ACID | IM_POIS |
+F:RES_NETH | NO_CONF | NO_SLEEP | NO_FEAR |
+S:1_IN_2 |
+S:HEAL | HASTE | TPORT | TELE_AWAY | BLIND | CONF | SCARE |
+S:CAUSE_4 | BRAIN_SMASH | FORGET | TRAPS |
+S:BA_FIRE | BA_MANA | BO_FIRE | BO_MANA | BO_PLAS | BR_PLAS |
+S:S_HI_UNDEAD | S_HI_DRAGON | S_HI_DEMON |
+D:He is dressed in blue from head to toe. He is one of the five Istari
+D:who came to the northwest of Middle-earth in the Third Age; he
+D:journeyed into the east with Alatar, and never returned to the western
+D:lands. They stumbled upon a magical portal to the remnants of Utumno and
+D:could not find their way back. Pallando has fallen into the Shadow
+D:since being in Utumno, and has designs on ruling the free people.
+
+N:365:Vampiric mist
+G:#:D
+I:110:10d8:12:55:30
+W:22:1:0:40
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:ENGULF:EXP_20:1d6
+B:ENGULF:EXP_20:1d6
+F:RAND_25 | SUSCEP_ELEC | UNDEAD |
+F:IM_COLD | IM_POIS | IM_ACID | RES_NETH | WILD_TOO | WILD_SWAMP |
+F:EVIL | EMPTY_MIND | COLD_BLOOD | FRIENDS | BASEANGBAND | NO_CUT
+D:A cloud of evil, sentient mist.
+
+N:366:Killer stag beetle
+G:K:g
+I:110:15d8:12:55:30
+W:22:1:500:80
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:CLAW:HURT:1d12
+B:CLAW:HURT:1d12
+F:RAND_25 | WILD_TOO | DROP_CORPSE |
+F:WEIRD_MIND | BASH_DOOR |
+F:ANIMAL | CAN_FLY | MORTAL | BASEANGBAND
+D:It is a giant beetle with vicious claws.
+
+N:367:Iron golem
+G:g:s
+I:110:80d12:12:80:10
+W:22:2:3800:160
+E:1:1:1:2:1:1
+O:0:0:0:0
+B:HIT:HURT:1d12
+F:FORCE_SLEEP | SUSCEP_ACID |
+F:EMPTY_MIND | COLD_BLOOD | BASH_DOOR |
+F:IM_FIRE | IM_COLD | IM_ELEC | IM_POIS |
+F:NO_CONF | NO_SLEEP | NO_FEAR | NONLIVING | BASEANGBAND | NO_CUT
+S:1_IN_7 |
+S:SLOW
+D:It is a massive metal statue that moves steadily towards you.
+
+N:368:Auto-roller
+G:g:s
+I:120:70d12:10:80:12
+W:22:2:0:230
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:CRUSH:HURT:1d8
+B:CRUSH:HURT:1d8
+B:CRUSH:HURT:1d8
+B:CRUSH:HURT:1d8
+F:FORCE_SLEEP | RES_TELE
+F:EMPTY_MIND | COLD_BLOOD | BASH_DOOR | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS
+F:NO_FEAR | NO_CONF | NO_SLEEP | NONLIVING | JOKEANGBAND | NO_CUT
+D:It looks like a huge spiked roller, moving on its own towards you.
+
+N:369:Giant yellow scorpion
+G:S:y
+I:110:12d8:12:38:20
+W:22:1:1200:60
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:BITE:HURT:1d8
+B:STING:POISON:2d5
+F:WEIRD_MIND | BASH_DOOR | WILD_TOO |
+F:ANIMAL | DROP_SKELETON |
+F:MORTAL | BASEANGBAND
+D:It is a giant scorpion with a sharp stinger.
+
+# New monster added by furiosity for the Theme module
+# Powered-up Lagduf
+N:370:Muzgash, the Snaga
+G:o:o
+I:110:33d10:20:32:30
+W:22:3:1700:80
+E:1:1:1:2:1:1
+O:10:80:0:0
+B:HIT:HURT:3d11
+B:HIT:HURT:3d11
+B:HIT:HURT:3d10
+B:HIT:HURT:3d10
+F:UNIQUE | MALE | EVIL | ORC | FORCE_MAXHP | ESCORT |
+F:ONLY_ITEM | DROP_1D2 | DROP_GOOD | SMART | CAN_SPEAK |
+F:OPEN_DOOR | BASH_DOOR | CAN_SPEAK | DROP_SKELETON | DROP_CORPSE |
+F:MORTAL | BASEANGBAND | HAS_LITE
+D:A friend of Lagduf's, he is no less evil but more cunning.
+
+N:371:Black ooze
+G:j:D
+I:90:6d8:10:6:1
+W:23:1:400:7
+E:0:0:0:0:0:0
+O:30:0:40:15
+B:TOUCH:ACID:2d6
+F:RAND_50 | DROP_60 | STUPID | EMPTY_MIND | CAN_SWIM |
+F:TAKE_ITEM | KILL_BODY | OPEN_DOOR | BASH_DOOR |
+F:IM_POIS | NO_FEAR |
+F:MORTAL | BASEANGBAND | NO_CUT
+S:MULTIPLY
+S:1_IN_11 |
+S:DRAIN_MANA
+D:It is a strangely moving puddle.
+
+N:372:Hardened warrior
+G:p:u
+I:110:15d11:20:40:40
+W:23:1:1900:60
+E:1:1:1:2:1:1
+O:0:100:0:0
+B:HIT:HURT:6d5
+B:HIT:HURT:6d5
+F:MALE |
+F:DROP_1D2 |
+F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | DROP_SKELETON | DROP_CORPSE |
+F:EVIL | MORTAL | BASEANGBAND | HAS_LITE
+D:A scarred warrior who moves with confidence.
+
+N:373:Azog, King of the Uruk-Hai
+G:o:R
+I:120:94d10:20:80:20
+W:23:5:2700:1111
+E:1:1:1:2:1:1
+O:10:90:0:0
+B:HIT:HURT:5d6
+B:HIT:HURT:5d5
+B:HIT:HURT:5d5
+F:UNIQUE | MALE | CAN_SPEAK |
+F:FORCE_MAXHP | DROP_SKELETON | DROP_CORPSE |
+F:ESCORT | ESCORTS | SPECIAL_GENE |
+F:ONLY_ITEM | DROP_2D2 | DROP_GOOD |
+F:OPEN_DOOR | BASH_DOOR |
+F:EVIL | ORC | IM_POIS |
+F:MORTAL | BASEANGBAND | HAS_LITE
+D:A large, strong and agile orc, the slayer of dwarven king Thror.
+
+# New monster added for the Theme module
+# From UnAngband
+N:374:Bill Ferny
+G:p:b
+I:120:6d10:16:8:5
+W:5:3:180:90
+E:1:1:1:2:1:1
+O:0:50:50:0
+B:HIT:HURT:1d8
+B:HIT:HURT:1d8
+B:HIT:EAT_GOLD:1d8
+F:BASEANGBAND | UNIQUE | MALE | FORCE_MAXHP | CAN_SPEAK |
+F:OPEN_DOOR | BASH_DOOR | HAS_LITE | SMART | EVIL |
+F:ONLY_ITEM | DROP_4D2 | DROP_GOOD |
+D:A swarthy man of Bree. He has heavy black brows and dark scornful
+D:eyes; his large mouth is curled in a sneer. He sells anything to
+D:anybody and enjoys making mischief for his personal amusement.
+
+N:375:Dark elven warlock
+G:h:v
+I:120:7d10:20:16:20
+W:23:1:1700:75
+E:1:1:1:2:1:1
+O:0:0:100:0
+B:HIT:HURT:1d6
+B:HIT:HURT:1d6
+F:MALE |
+F:FORCE_SLEEP |
+F:ONLY_ITEM | DROP_1D2 | DROP_SKELETON | DROP_CORPSE
+F:OPEN_DOOR | BASH_DOOR | FRIENDS
+F:EVIL | IM_POIS | HURT_LITE | BASEANGBAND | HAS_LITE
+S:1_IN_5 |
+S:CONF | MISSILE | DARKNESS | BO_MANA
+D:A dark elven mage with spells of frighteningly destructive power.
+
+N:376:Master rogue
+G:p:b
+I:120:15d9:20:30:40
+W:23:2:1600:110
+E:1:1:1:2:1:1
+O:80:10:10:0
+B:HIT:HURT:2d8
+B:HIT:HURT:2d8
+B:HIT:EAT_GOLD:4d4
+F:MALE | DROP_SKELETON | DROP_CORPSE |
+F:DROP_2D2 | SUSCEP_ELEC |
+F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR |
+F:EVIL | MORTAL | BASEANGBAND | HAS_LITE
+D:A thief of great power and shifty speed.
+
+N:377:Red dragon bat
+G:b:r
+I:130:3d8:12:28:50
+W:23:1:100:60
+E:0:1:1:0:1:0
+O:0:0:0:0
+B:BITE:FIRE:1d3
+F:FORCE_SLEEP | RAND_50 | SUSCEP_COLD |
+F:BASH_DOOR | CAN_FLY | DROP_CORPSE | AI_ANNOY
+F:ANIMAL | IM_FIRE | BASEANGBAND
+S:1_IN_4 |
+S:BR_FIRE
+D:It is a sharp-tailed bat, wreathed in fire.
+
+N:378:Killer white beetle
+G:K:w
+I:110:18d8:14:55:30
+W:23:1:500:85
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:BITE:HURT:4d5
+F:RAND_25 |
+F:WEIRD_MIND | BASH_DOOR | WILD_TOO | DROP_CORPSE |
+F:ANIMAL | CAN_FLY | MORTAL | BASEANGBAND
+D:It is looking for prey.
+
+N:379:Ice skeleton
+G:s:w
+I:110:16d9:20:34:60
+W:23:1:0:70
+E:1:1:1:2:1:1
+O:20:0:80:0
+B:CLAW:COLD:2d3
+B:CLAW:COLD:2d3
+F:ONLY_ITEM | DROP_90 |
+F:COLD_BLOOD | OPEN_DOOR | BASH_DOOR | SUSCEP_FIRE |
+F:EVIL | UNDEAD | IM_COLD | IM_POIS |
+F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT
+D:It is a skeleton covered in frost.
+
+N:380:Angamaite of Umbar
+G:p:U
+I:110:82d10:25:80:25
+W:24:2:2400:400
+E:1:1:1:2:1:1
+O:0:80:20:0
+B:HIT:HURT:4d7
+B:HIT:HURT:4d7
+B:HIT:HURT:4d6
+B:HIT:HURT:4d6
+F:UNIQUE | MALE | CAN_SPEAK | DROP_SKELETON | DROP_CORPSE |
+F:FORCE_SLEEP | FORCE_MAXHP |
+F:ONLY_ITEM | DROP_90 | DROP_1D2 | DROP_GOOD |
+F:OPEN_DOOR | BASH_DOOR |
+F:EVIL | IM_FIRE | IM_ELEC
+F:MORTAL | BASEANGBAND | HAS_LITE
+S:1_IN_4 |
+S:SLOW | FORGET
+D:A Black Numenorean who hates the men of the West. He is a descendant
+D:of Castamir, the Usurper of Gondor.
+
+N:381:Forest wight
+G:W:g
+I:110:12d8:20:30:30
+W:24:1:0:140
+E:0:0:0:0:0:0
+O:0:50:50:0
+B:HIT:HURT:1d6
+B:HIT:HURT:1d6
+B:TOUCH:EXP_20
+F:FORCE_SLEEP | RAND_25 |
+F:DROP_60 | DROP_90 |
+F:COLD_BLOOD | OPEN_DOOR | BASH_DOOR | CAN_FLY |
+F:EVIL | UNDEAD | IM_COLD | IM_POIS | HURT_LITE |
+F:NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT
+S:1_IN_10 |
+S:SCARE | DRAIN_MANA
+D:It is a ghostly apparition, arisen when a humanoid was killed violently
+D:in a forest. It remembers its past life and wants revenge.
+
+N:382:Khim, Son of Mim
+G:k:o
+I:110:84d10:20:80:10
+W:24:2:2300:300
+E:1:1:1:2:1:1
+O:10:80:0:10
+B:HIT:HURT:3d8
+B:HIT:HURT:3d8
+B:HIT:HURT:3d7
+B:HIT:UN_BONUS
+F:UNIQUE | MALE | CAN_SPEAK | DROP_SKELETON | DROP_CORPSE
+F:FORCE_SLEEP | FORCE_MAXHP | RES_TELE
+F:ONLY_ITEM | DROP_1D2 | DROP_GOOD |
+F:OPEN_DOOR | BASH_DOOR |
+F:IM_FIRE | IM_COLD
+F:MORTAL | BASEANGBAND | HAS_LITE
+S:1_IN_8 |
+S:HEAL | SLOW | BO_FIRE
+D:One of the last of the Petty-Dwarves. Khim is a tricky sorcerous little
+D:being, full of mischief.
+
+N:383:Ibun, Son of Mim
+G:k:o
+I:110:84d10:20:80:10
+W:24:2:2300:300
+E:1:1:1:2:1:1
+O:10:80:0:5
+B:HIT:HURT:3d8
+B:HIT:HURT:3d8
+B:HIT:HURT:3d7
+B:HIT:UN_BONUS
+F:UNIQUE | MALE | CAN_SPEAK | DROP_SKELETON | DROP_CORPSE |
+F:FORCE_SLEEP | FORCE_MAXHP | RES_TELE |
+F:ONLY_ITEM | DROP_1D2 | DROP_GOOD |
+F:OPEN_DOOR | BASH_DOOR |
+F:IM_FIRE | IM_COLD
+F:MORTAL | BASEANGBAND | HAS_LITE
+S:1_IN_8 |
+S:HEAL | SLOW | BO_FIRE
+D:One of the last of the Petty-Dwarves. Ibun is a tricky sorcerous little
+D:being, full of mischief.
+
+N:384:Meneldor the Swift
+G:B:v
+I:140:80d10:20:65:20
+W:24:6:1200:360
+E:0:1:1:0:1:0
+O:0:0:0:0
+B:CLAW:HURT:7d3
+B:CLAW:HURT:7d3
+B:BITE:HURT:3d7
+F:CAN_FLY | UNIQUE | FORCE_MAXHP | DROP_CORPSE | CAN_SPEAK |
+F:WILD_ONLY | WILD_MOUNTAIN | WILD_VOLCANO | PET |
+F:ANIMAL | GOOD | BASEANGBAND
+D:Among all the eagles of Middle-earth he is the swiftest, and in his time
+D:has borne messages between all of the Wise. It was Meneldor who bore the
+D:Ring-bearer away from the destruction of Mount Doom.
+
+N:385:Phantom beast
+G:G:B
+I:110:12d12:20:40:40
+W:24:1:0:100
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:HIT:HURT:2d33
+B:HIT:HURT:2d44
+F:PASS_WALL | NO_SLEEP | COLD_BLOOD | NONLIVING | NO_FEAR |
+F:FORCE_MAXHP | RES_TELE | EMPTY_MIND | CAN_FLY | BASEANGBAND | NO_CUT
+D:A creature that is half real, half illusion.
+
+N:386:Giant silver ant
+G:a:W
+I:110:9d8:10:38:40
+W:23:1:800:45
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:BITE:ACID:4d4
+F:RAND_25 |
+F:WEIRD_MIND | BASH_DOOR | WILD_TOO | DROP_SKELETON |
+F:ANIMAL | MORTAL | BASEANGBAND | HAS_LITE
+D:A giant silver ant with a caustic bite.
+
+N:387:4-headed hydra
+G:M:y
+I:120:100d6:20:70:20
+W:24:2:5000:450
+E:0:1:0:2:2:0
+O:0:0:0:0
+B:BITE:HURT:2d6
+B:BITE:HURT:2d6
+B:BITE:HURT:2d6
+B:BITE:HURT:2d6
+F:FORCE_SLEEP |
+F:ONLY_GOLD | DROP_4D2 | WILD_TOO | WILD_SWAMP | WILD_SHORE |
+F:OPEN_DOOR | BASH_DOOR | MOVE_BODY | DROP_SKELETON | DROP_CORPSE |
+F:ANIMAL | MORTAL | BASEANGBAND
+S:1_IN_7 |
+S:SCARE
+D:A strange reptilian creature with four heads, guarding its hoard.
+
+# New monster added by furiosity for the Theme module
+N:388:Beruthiel, Queen of Cats
+G:f:B
+I:115:7d100:100:200:10
+W:33:5:0:30000
+E:0:1:0:2:1:0
+O:30:60:0:10
+B:CLAW:HURT:8d11
+B:CLAW:EAT_LITE:8d11
+B:CLAW:LOSE_INT:8d11
+F:BASEANGBAND | WILD_TOO | WILD_WOOD | WILD_GRASS | WILD_MOUNTAIN |
+F:UNIQUE | FEMALE | CAN_SPEAK | SMART | FORCE_MAXHP | EVIL | MORTAL |
+F:OPEN_DOOR | BASH_DOOR | MOVE_BODY | ANIMAL | FORCE_SLEEP |
+F:HURT_LITE | IM_FIRE | IM_POIS | RES_NETH | NO_SLEEP | NO_CONF |
+S:1_IN_5
+S:S_KIN | SHRIEK | S_ANIMALS | BLINK | S_MONSTERS
+D:The dark and mournful Queen to Tarannon Falastur, the twelfth King
+D:of Gondor. She owned ten marvellous and magical cats, that she set
+D:to spy on the doings of the people of Gondor. Her scheming was her
+D:undoing, though, since her husband set her adrift on the Great Sea,
+D:with only her cats for company. She sailed into the far south and
+D:encountered a mysterious wizard dressed in blue, who granted her
+D:one wish - to become a cat herself. She met Tevildo on her travels,
+D:and became his consort and a servant of Morgoth.
+
+# New monster added by furiosity for the Theme module
+N:389:The Hunter
+G:H:v
+I:130:10d500:60:150:0
+W:80:1:0:80000
+E:0:1:0:2:2:2
+O:20:40:20:10
+B:HIT:UN_BONUS:5d10
+B:HIT:EXP_80:5d10
+B:HIT:ABOMINATION:5d10
+B:HIT:DISEASE:5d10
+F:BASEANGBAND | UNIQUE | FORCE_MAXHP |
+F:ELDRITCH_HORROR | REFLECTING |
+F:NO_SLEEP | NO_CUT | NO_STUN | NO_CONF | NO_FEAR |
+F:ONLY_ITEM | DROP_4D2 | DROP_GREAT | DROP_RANDART |
+F:IM_FIRE | IM_COLD | IM_ACID | IM_POIS | SPECIAL_GENE |
+F:RES_NETH | RES_PLAS | EVIL | EMPTY_MIND |
+D:A shadowy creature of Elvish legend, said to have plagued the
+D:newly-awakened Elves at Cuivienen. Those Elves captured by the
+D:Hunter were thought to have been corrupted by Melkor to form
+D:the race of Orcs. You sense corruption all around you as it
+D:approaches. Your heart fills with despair and anguish, and you
+D:can just barely resist fleeing as far away from it as possible.
+
+
+N:390:Mummified human
+G:z:w
+I:110:17d9:20:34:60
+W:24:1:1500:70
+E:1:1:1:2:1:1
+O:20:40:20:10
+B:HIT:HURT:2d4
+B:HIT:HURT:2d4
+F:ONLY_ITEM | DROP_90 |
+F:EMPTY_MIND | COLD_BLOOD | OPEN_DOOR | BASH_DOOR |
+F:EVIL | UNDEAD | IM_COLD | IM_POIS |
+F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT
+D:It is a human form encased in mouldy wrappings.
+
+N:391:Vampire bat
+G:b:D
+I:120:9d10:12:40:50
+W:24:2:50:150
+E:0:1:1:0:1:0
+O:0:0:0:0
+B:BITE:EXP_40:1d4
+B:BITE:EXP_40:1d4
+F:RAND_50 | COLD_BLOOD | REGENERATE | CAN_FLY |
+F:EVIL | ANIMAL | UNDEAD | IM_COLD | IM_POIS |
+F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT
+D:A blood-sucking bat that flies at your neck hungrily.
+
+N:392:Sangahyando of Umbar
+G:p:U
+I:110:82d10:25:80:25
+W:24:2:2400:400
+E:1:1:1:2:1:1
+O:0:90:10:0
+B:HIT:HURT:4d7
+B:HIT:HURT:4d7
+B:HIT:HURT:4d7
+B:HIT:HURT:4d7
+F:UNIQUE | MALE | CAN_SPEAK | DROP_SKELETON | DROP_CORPSE |
+F:FORCE_SLEEP | FORCE_MAXHP |
+F:ONLY_ITEM | DROP_90 | DROP_1D2 | DROP_GOOD |
+F:OPEN_DOOR | BASH_DOOR |
+F:EVIL | IM_FIRE | IM_ELEC
+F:MORTAL | BASEANGBAND | HAS_LITE
+S:1_IN_4 |
+S:SLOW | FORGET
+D:A Black Numenorean with a blacker heart. He is a descendant
+D:of Castamir, the usurper of Gondor's throne.
+
+N:393:It
+G:.:W
+I:110:77d9:25:80:25
+W:24:3:500:400
+E:0:0:0:0:0:0
+O:10:0:90:0
+B:GAZE:BLIND:8d8
+B:TOUCH:TERRIFY
+B:GAZE:EXP_40
+B:TOUCH:EAT_ITEM
+F:ONLY_ITEM | DROP_90 | DROP_1D2 | DROP_GOOD | DROP_GREAT | DROP_CORPSE |
+F:CHAR_MULTI | CHAR_CLEAR | ATTR_CLEAR | INVISIBLE | COLD_BLOOD |
+F:NO_CONF | UNIQUE | FORCE_MAXHP | NO_SLEEP | CAN_SPEAK | REFLECTING |
+F:IM_FIRE | IM_ELEC | EMPTY_MIND | EVIL | SMART | RES_TELE | CAN_FLY |
+F:JOKEANGBAND
+S:1_IN_4
+S:DRAIN_MANA | BLINK | BLIND | SCARE | CONF | S_UNDEAD | S_MONSTER |
+S:HEAL | TELE_AWAY | DARKNESS | S_HYDRA | TRAPS | FORGET | TELE_TO | SHRIEK
+D:Nobody has ever seen It.
+
+N:394:Banshee
+G:G:b
+I:120:6d8:20:24:10
+W:24:2:0:60
+E:0:0:0:0:0:0
+O:80:0:0:15
+B:WAIL:TERRIFY
+B:TOUCH:EXP_20
+F:FEMALE |
+F:RAND_50 | DROP_1D2 |
+F:INVISIBLE | COLD_BLOOD | TAKE_ITEM | PASS_WALL | CAN_FLY |
+F:EVIL | UNDEAD | IM_COLD | IM_POIS | NO_CONF | NO_SLEEP | BASEANGBAND
+F:NO_CUT
+S:1_IN_15 |
+S:TPORT | DRAIN_MANA
+D:It is a ghostly woman's form that wails mournfully.
+
+# New monster added by furiosity for the Theme module
+# Basically an insanely OOD Black Numenorean (hell knight)
+N:395:Herumor, Lord of the Haradrim
+G:p:o
+I:120:50d100:40:160:0
+W:25:1:0:29000
+E:1:1:1:2:1:1
+O:0:40:60:0
+B:HIT:HURT:10d5
+B:HIT:EXP_80:10d5
+F:UNIQUE | MALE | MORTAL | BASEANGBAND | HAS_LITE | CAN_SPEAK |
+F:FORCE_MAXHP | SMART | IM_FIRE | IM_COLD | IM_POIS | IM_COLD |
+F:ONLY_ITEM | DROP_1D2 | DROP_2D2 | RES_NETH | RES_NEXU | RES_PLAS |
+F:COLD_BLOOD | OPEN_DOOR | BASH_DOOR | EVIL | SPECIAL_GENE |
+S:1_IN_5 |
+S:BLIND | SCARE | CAUSE_3 | BA_NETH | BA_FIRE | BO_PLAS
+S:S_MONSTERS | S_DEMON
+D:One of the many Numenoreans who fell under the shadow of Sauron
+D:after Ar-Pharazon brought the Dark Lord to Numenor. With another
+D:named Fuinur, he settled among the Haradrim on Middle-Earth, and
+D:became a lord in the lands of Harad. From this, and his worship of
+D:Sauron's darkness, he must have taken taken his name: Herumor means
+D:'lord of the dark'.
+
+# New monster added by furiosity for the Theme module
+N:396:Fimbrethil
+G:#:s
+I:120:50d100:30:120:40
+W:42:3:6000:13500
+E:1:1:1:2:1:1
+O:0:50:50:0
+B:CRUSH:HURT:12d12
+B:CRUSH:HURT:12d12
+B:CRUSH:HURT:12d12
+B:CRUSH:HURT:12d12
+F:FORCE_SLEEP | FORCE_MAXHP | UNIQUE | SUSCEP_FIRE |
+F:WILD_ONLY | WILD_WOOD | WILD_GRASS | WILD_MOUNTAIN | WILD_SHORE |
+F:ONLY_ITEM | DROP_4D2 | DROP_GOOD | MOVE_BODY | DROP_CORPSE |
+F:SMART | TAKE_ITEM | BASH_DOOR | KILL_WALL | NO_SLEEP |
+F:GOOD | NEUTRAL | NO_TARGET | BASEANGBAND | NO_CUT | FEMALE | CAN_FLY |
+F:DG_CURSE | WYRM_PROTECT |
+D:She is one of the Ent-wives who disappeared into the East a
+D:long time ago. She was the wife of Fangorn the Treebeard when
+D:the separation occurred, and she seems to have taken it quite
+D:badly. Her leaves are all withered to a dull gray and she is
+D:just standing there and crying. You should leave her alone.
+
+N:397:Silent watcher
+G:g:s
+I:110:80d25:60:80:0
+W:35:3:4000:800
+E:3:0:3:3:2:0
+O:0:0:0:0
+B:GAZE:TERRIFY
+B:GAZE:PARALYZE
+B:GAZE:LOSE_STR
+B:GAZE:HALLU
+F:EMPTY_MIND | COLD_BLOOD | NONLIVING | NEVER_MOVE |
+F:IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | EVIL |
+F:HURT_ROCK | COLD_BLOOD | HURT_LITE | NO_FEAR |
+F:NO_CONF | NO_SLEEP | NO_STUN | NONLIVING | RES_TELE | BASEANGBAND | NO_CUT
+S:1_IN_3 |
+S:SHRIEK | S_MONSTER | S_MONSTERS | HOLD | CONF | MIND_BLAST | DRAIN_MANA
+D:A figure carved from stone, with three vulture faces whose eyes glow
+D:with a malevolent light. None escape its vigilance.
+
+N:398:Pukelman
+G:g:D
+I:110:80d12:12:80:10
+W:25:3:10000:600
+E:1:1:1:2:1:1
+O:0:0:0:0
+B:HIT:HURT:1d12
+B:HIT:HURT:3d6
+F:FORCE_SLEEP |
+F:EMPTY_MIND | COLD_BLOOD | BASH_DOOR |
+F:IM_FIRE | IM_COLD | IM_ELEC | IM_POIS |
+F:HURT_ROCK |
+F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT
+S:1_IN_4 |
+S:SLOW | CONF | BO_ACID
+D:A stumpy figure carved from stone, with glittering eyes.
+
+# New monster added by furiosity for the Theme module
+# Basically Lugdush with extra power.
+N:399:Mauhur, the Uruk
+G:o:y
+I:110:66d10:20:90:20
+W:31:4:2500:850
+E:1:1:1:2:1:1
+O:10:90:0:0
+B:HIT:HURT:4d8
+B:HIT:HURT:4d8
+B:HIT:HURT:4d8
+B:HIT:HURT:4d8
+F:UNIQUE | MALE | CAN_SPEAK |
+F:FORCE_MAXHP | DROP_SKELETON | DROP_CORPSE |
+F:ESCORT |
+F:ONLY_ITEM | DROP_1D2 | DROP_GOOD |
+F:OPEN_DOOR | BASH_DOOR |
+F:EVIL | ORC | IM_POIS |
+F:MORTAL | BASEANGBAND | HAS_LITE
+D:A large and powerful orc, captain of one of Saruman's orcish regiments.
+
+N:400:Dark elven druid
+G:h:G
+I:120:20d20:15:75:10
+W:25:3:1200:500
+E:1:1:1:2:1:1
+O:10:0:80:10
+B:HIT:HURT:1d7
+B:HIT:HURT:1d7
+B:HIT:HURT:3d8
+F:MALE |
+F:FORCE_SLEEP |
+F:ONLY_ITEM | DROP_1D2 | DROP_SKELETON | DROP_CORPSE
+F:OPEN_DOOR | BASH_DOOR |
+F:EVIL | IM_POIS | HURT_LITE | NO_CONF | NO_SLEEP | BASEANGBAND | HAS_LITE
+S:1_IN_6 |
+S:HEAL | CONF | DARKNESS |
+S:S_MONSTER | S_SPIDER | S_ANIMAL
+D:A powerful dark elf, with mighty nature-controlling enchantments.
+
+N:401:Stone troll
+G:T:W
+I:110:23d10:20:50:50
+W:25:1:5000:85
+E:1:1:1:2:1:1
+O:0:100:0:0
+B:HIT:HURT:1d6
+B:HIT:HURT:1d6
+B:BITE:HURT:3d4
+F:MALE |
+F:FRIENDS | DROP_60 | DROP_SKELETON | DROP_CORPSE |
+F:OPEN_DOOR | BASH_DOOR | REGENERATE |
+F:EVIL | TROLL | HURT_LITE | HURT_ROCK | BASEANGBAND | NO_CUT
+D:It is said that Melkor created trolls in mockery of the Ents.
+D:This giant creature has scabby black skin and powerful fists.
+
+# New monster added by furiosity for the Theme module
+N:402:Prince Imrahil the Proud
+G:p:w
+I:110:10d100:10:60:0
+W:35:1:1800:6000
+E:1:1:1:2:1:1
+O:0:50:50:0
+B:HIT:HURT
+B:HIT:HURT
+B:WAIL:TERRIFY
+B:INSULT:*
+F:BASEANGBAND | SPECIAL_GENE | UNIQUE | MALE | CAN_SPEAK |
+F:OPEN_DOOR | BASH_DOOR | TAKE_ITEM | HAS_LITE | SUSCEP_POIS |
+F:ONLY_ITEM | DROP_3D2 | DROP_GOOD | DROP_RANDART | FORCE_MAXHP |
+F:IM_FIRE | IM_COLD | IM_ELEC | IM_ACID | RES_NETH | RES_WATE |
+S:1_IN_8 |
+S:S_UNDEAD | S_KIN | S_DEMON | S_DRAGON |
+D:The proud ruler of the gray-eyed Men of Dol Amroth, Imrahil
+D:had been aligned with the forces of good for most of his life.
+D:However, Sauron has managed to sway Imrahil to the Shadow by
+D:making him jealous of King Elessar and the splendour of Gondor.
+D:He now sits sullenly upon his throne in Dol Amroth, unable to
+D:resist Sauron's enchantments, and growing ever more bitter and
+D:vengeful against the Free People.
+
+N:403:Hill troll
+G:T:s
+I:110:21d10:20:65:40
+W:21:1:4000:75
+E:1:1:1:2:1:1
+O:30:70:0:0
+B:HIT:HURT:1d5
+B:HIT:HURT:1d5
+B:BITE:HURT:2d6
+F:MALE |
+F:FRIENDS | DROP_60 | WILD_TOO | WILD_WASTE | WILD_MOUNTAIN |
+F:DROP_SKELETON | DROP_CORPSE |
+F:OPEN_DOOR | BASH_DOOR | SUSCEP_FIRE | REGENERATE |
+F:EVIL | TROLL | HURT_LITE | BASEANGBAND
+D:It is said that Melkor created trolls in mockery of the Ents.
+D:This creature has an extremely tough hide, covered with warts.
+
+N:404:Wereworm
+G:w:u
+I:110:100d11:15:70:20
+W:25:3:6000:300
+E:0:0:0:0:1:0
+O:0:0:0:0
+B:GAZE:EXP_20
+B:CRAWL:ACID:2d4
+B:BITE:HURT:1d10
+B:BITE:POISON:1d6
+F:BASH_DOOR | EVIL | CAN_SWIM | WILD_TOO | WILD_SWAMP |
+F:ANIMAL | IM_ACID | DROP_CORPSE |
+F:MORTAL | BASEANGBAND
+D:A huge wormlike shape dripping acid, twisted by evil sorcery into a foul
+D:monster that breeds on death.
+
+N:405:Killer red beetle
+G:K:r
+I:110:20d8:14:50:30
+W:25:1:600:90
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:BITE:LOSE_STR:4d4
+F:RAND_25 | WILD_TOO |
+F:WEIRD_MIND | BASH_DOOR | DROP_CORPSE |
+F:ANIMAL | CAN_FLY | MORTAL | BASEANGBAND
+D:A giant beetle with poisonous mandibles.
+
+N:406:Disenchanter bat
+G:b:v
+I:130:6d8:12:28:50
+W:26:4:50:75
+E:0:1:1:0:1:0
+O:0:0:0:0
+B:HIT:UN_BONUS
+B:HIT:UN_BONUS
+F:FORCE_SLEEP | RAND_50 | ANIMAL | MORTAL | ATTR_MULTI |
+F:DROP_CORPSE | AI_ANNOY | CAN_FLY | BASEANGBAND | WEIRD_MIND
+D:A giant bat that feeds on raw magical energy.
+
+# New monster added for the Theme module
+# Adapted from UnAngband
+N:407:Umuiyan, Doorkeeper of Tevildo
+G:f:s
+I:120:48d100:100:200:2
+W:66:3:0:30000
+E:0:1:0:2:1:0
+O:30:60:0:10
+B:HIT:CONFUSE:12d12
+B:TOUCH:LOSE_CHR:2d12
+B:HIT:BLIND:10d5
+B:HIT:TERRIFY:15d1
+F:UNIQUE | MALE | CAN_SPEAK | FORCE_MAXHP |
+F:EVIL | OPEN_DOOR | BASH_DOOR | ANIMAL |
+F:INVISIBLE | NO_SLEEP | NO_FEAR | MORTAL |
+F:DROP_4D2 | DROP_GOOD | ONLY_ITEM |
+F:IM_FIRE | IM_COLD | IM_POIS | NO_CONF |
+S:1_IN_3
+S:TELE_AWAY | S_KIN |
+D:A giant cat, servant of Tevildo. His yellow eyes look
+D:upon you with a baleful stare.
+
+N:408:Giant grey ant
+G:a:s
+I:110:19d8:10:40:40
+W:26:1:700:90
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:BITE:HURT:2d12
+F:RAND_25 | KILL_BODY | DROP_SKELETON
+F:WEIRD_MIND | BASH_DOOR |
+F:ANIMAL | BASEANGBAND
+D:It is an ant encased in shaggy grey fur.
+
+# New monster added for the Theme module
+# From UnAngband
+N:409:Oikeroi, Bodyguard of Tevildo
+G:f:r
+I:130:48d100:100:200:2
+W:66:3:0:30000
+E:0:1:0:2:1:0
+O:30:60:0:10
+B:HIT:CONFUSE:12d12
+B:TOUCH:LOSE_DEX:2d12
+B:HIT:BLIND:10d5
+B:HIT:PARALYZE:15d1
+F:UNIQUE | MALE | CAN_SPEAK | FORCE_MAXHP |
+F:EVIL | OPEN_DOOR | BASH_DOOR | ANIMAL |
+F:INVISIBLE | NO_STUN | NO_SLEEP | MORTAL |
+F:DROP_4D2 | DROP_GOOD | ONLY_ITEM |
+F:IM_FIRE | IM_COLD | IM_POIS | NO_CONF |
+S:1_IN_3 |
+S:TELE_TO | S_KIN |
+D:A fierce and warlike cat, serving as a bodyguard of Tevildo.
+D:This giant cat looks down upon you with disdain.
+
+N:410:Gwaihir the Windlord
+G:B:v
+I:130:85d10:20:65:20
+W:24:6:1200:360
+E:0:1:1:0:1:0
+O:0:0:0:0
+B:CLAW:HURT:15d2
+B:CLAW:HURT:15d2
+B:BITE:HURT:3d10
+F:CAN_FLY | UNIQUE | FORCE_MAXHP | DROP_CORPSE | CAN_SPEAK |
+F:WILD_ONLY | WILD_MOUNTAIN | WILD_VOLCANO | PET |
+F:ANIMAL | GOOD | BASEANGBAND
+D:The greatest of eagles in the Third Age of Middle-earth, Gwaihir rescued
+D:Gandalf the Wizard from Orthanc, and has twice brought his flock to the
+D:aid of Sauron's enemies in battle - first outside the gates of Erebor in
+D:the Battle of Five Armies, and then before the Black Gate of Mordor itself.
+
+N:411:Giant fire tick
+G:S:R
+I:110:16d8:14:54:20
+W:26:2:200:90
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:BITE:FIRE:3d6
+F:RAND_25 | SUSCEP_COLD |
+F:WEIRD_MIND | BASH_DOOR |
+F:ANIMAL | IM_FIRE | CAN_FLY |
+F:MORTAL | BASEANGBAND | HAS_LITE
+D:It is smoking and burning with great heat.
+
+# New monster added by furiosity for the Theme module
+# From UnAngband
+N:412:Lotho Sackville-Baggins, Betrayer of the Shire
+G:h:s
+I:120:6d10:16:8:5
+W:5:3:800:90
+E:1:1:1:2:1:1
+O:40:60:0:0
+B:HIT:HURT:1d8
+B:HIT:HURT:1d8
+F:BASEANGBAND | WILD_TOO | WILD_TOWN | MORTAL |
+F:UNIQUE | MALE | CAN_SPEAK | DROP_CORPSE |
+F:HAS_LITE | OPEN_DOOR | BASH_DOOR | EVIL |
+F:FORCE_MAXHP | FORCE_SLEEP |
+F:ONLY_ITEM | DROP_2D2 | DROP_GOOD |
+D:The 'Chief Shiriff' of Bag End. Using money obtained from Isengard
+D:and the sale of pipe-weed, he bought up much property in the Shire
+D:and supported the ruffians known as `The Chief's Men'. After
+D:imprisoning Will Whitfoot, the rightful Mayor of the Shire, Lotho
+D:took over and began industrializing and regimenting life in the Shire.
+
+N:413:Ulwarth, Son of Ulfang
+G:p:U
+I:110:85d10:20:40:40
+W:26:4:1800:500
+E:1:1:1:2:1:1
+O:40:60:0:0
+B:HIT:HURT:4d6
+B:HIT:HURT:4d6
+B:HIT:HURT:4d6
+F:UNIQUE | MALE | CAN_SPEAK | DROP_SKELETON | DROP_CORPSE |
+F:FORCE_MAXHP | WILD_TOO |
+F:ONLY_ITEM | DROP_90 | DROP_GOOD |
+F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR |
+F:EVIL
+F:MORTAL | BASEANGBAND | HAS_LITE
+D:A short and swarthy Easterling, faithless and treacherous.
+D:Along with his brother, he brought about the fall of the
+D:Sons of Feanor.
+
+N:414:Werebear
+G:q:D
+I:110:25d25:20:50:20
+W:24:2:0:200
+E:0:1:0:2:1:0
+O:25:25:25:20
+B:CLAW:HURT:1d10
+B:CLAW:HURT:1d10
+B:BITE:HURT:2d8
+B:CRUSH:HURT:2d6
+F:BASH_DOOR | OPEN_DOOR |
+F:WILD_TOO | WILD_WOOD | WILD_MOUNTAIN | DROP_CORPSE |
+F:ANIMAL | EVIL | DROP_1D2 | BASEANGBAND
+D:In the eyes of this bear, there glimmers the faintest light of intelligence.
+D:And then its form begins to change... The combination of animal cunning,
+D:human intelligence and the great physical strength of the bear makes for
+D:a dangerous enemy.
+
+N:415:Cave ogre
+G:O:u
+I:110:30d9:20:33:30
+W:26:2:2500:80
+E:1:1:1:2:1:1
+O:20:70:0:10
+B:HIT:HURT:3d8
+B:HIT:HURT:3d8
+F:FRIENDS | DROP_60 | DROP_CORPSE |
+F:OPEN_DOOR | BASH_DOOR |
+F:EVIL | GIANT |
+F:MORTAL | BASEANGBAND | HAS_LITE
+D:A giant orc-like figure with an awesomely muscled frame.
+
+N:416:White wraith
+G:W:w
+I:110:15d8:20:40:10
+W:26:1:0:175
+E:0:0:0:0:0:0
+O:0:50:50:0
+B:HIT:HURT:1d6
+B:HIT:HURT:1d6
+B:TOUCH:EXP_20
+F:FORCE_SLEEP |
+F:DROP_1D2 |
+F:COLD_BLOOD | OPEN_DOOR | BASH_DOOR | CAN_FLY |
+F:EVIL | UNDEAD | IM_COLD | IM_POIS | HURT_LITE |
+F:NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT
+S:1_IN_8 |
+S:SCARE | CAUSE_2 | DARKNESS
+D:It is a tangible but ghostly form made of white fog.
+
+# New monster added for the Theme module
+# Adapted from UnAngband
+N:417:Thranduil, King of the Wood Elves
+G:h:G
+I:120:11d100:20:80:10
+W:32:4:0:1000
+E:1:1:1:2:1:1
+O:0:40:30:30
+B:HIT:HURT:3d8
+B:HIT:HURT:3d8
+B:HIT:HURT:3d8
+#Force him into Mirkwood:
+F:FORCE_DEPTH | ONLY_DEPTH |
+F:BASEANGBAND | WILD_TOO | WILD_WOOD | WILD_GRASS |
+F:UNIQUE | MALE | CAN_SPEAK | MORTAL | TAKE_ITEM |
+F:CAN_SWIM | OPEN_DOOR | BASH_DOOR | HAS_LITE |
+F:PET | NO_CONF | NO_SLEEP | GOOD |
+F:ONLY_ITEM | DROP_2D2| DROP_GREAT | NO_FEAR |
+F:IM_POIS | IM_COLD | RES_WATE | RES_TELE |
+S:1_IN_5
+S:BO_FIRE | BO_COLD | BLIND | CONF | HASTE | S_KIN |
+S:DARKNESS | S_MONSTER | S_ANIMALS | S_SPIDER |
+D:A strong wood-elf with a penchant for treasure. He is
+D:wise and powerful, and it is said that even the independent
+D:dark elves will rally to his side when he travels.
+
+N:418:Ghoul
+G:z:U
+I:110:15d9:30:30:20
+W:25:1:0:95
+E:1:1:1:2:1:1
+O:0:45:35:10
+B:CLAW:DISEASE:1d4
+B:CLAW:DISEASE:1d4
+B:BITE:PARALYZE:1d5
+F:DROP_60 | OPEN_DOOR | BASH_DOOR | CAN_SWIM |
+F:EVIL | UNDEAD | FRIENDS | IM_POIS | IM_COLD | NO_CONF | NO_SLEEP |
+F:COLD_BLOOD | HURT_LITE | BASEANGBAND | NO_CUT
+S:1_IN_9
+S:SCARE | HOLD
+D:Flesh is falling off in chunks from this decaying abomination.
+
+N:419:Mim, Betrayer of Turin
+G:k:o
+I:120:11d105:20:80:20
+W:27:4:1200:1000
+E:1:1:1:2:1:1
+O:10:80:10:0
+B:HIT:HURT:3d9
+B:HIT:HURT:3d9
+B:HIT:HURT:3d9
+B:HIT:UN_BONUS:3d12
+F:UNIQUE | MALE | CAN_SPEAK |
+F:FORCE_MAXHP | FORCE_SLEEP | DROP_SKELETON | DROP_CORPSE |
+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:RES_DISE | RES_TELE |
+F:MORTAL | BASEANGBAND | HAS_LITE
+S:1_IN_6 |
+S:HEAL | SCARE | BO_ACID | BA_ACID | TPORT | S_MONSTER
+D:A Petty-Dwarf, one of the last of his race. He betrayed Turin
+D:Turambar and gave him up to Morgoth's forces.
+
+N:420:Hellblade
+G:|:v
+I:120:13d13:20:40:20
+W:27:2:0:130
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:HIT:EXP_20:2d13
+B:HIT:EXP_20:2d13
+F:CHAR_MULTI | EVIL | IM_POIS | IM_COLD |
+F:FORCE_SLEEP | FORCE_MAXHP | CAN_FLY | SUSCEP_ACID |
+F:COLD_BLOOD | BASH_DOOR | NONLIVING |
+F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | HAS_LITE | NO_CUT
+D:A deadly blade of chaos, moving of its own volition.
+
+N:421:Killer fire beetle
+G:K:R
+I:110:22d8:14:45:30
+W:27:1:600:95
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:BITE:HURT:3d4
+B:SPIT:FIRE:4d5
+F:WEIRD_MIND | BASH_DOOR | WILD_TOO | WILD_VOLCANO | DROP_CORPSE |
+F:ANIMAL | IM_FIRE | CAN_FLY | SUSCEP_COLD |
+F:MORTAL | BASEANGBAND | HAS_LITE
+D:It is a giant beetle wreathed in flames.
+
+# New monster added by furiosity for the Theme module
+# From UnAngband
+N:422:Denethor, Steward of Gondor
+G:p:r
+I:120:55d100:40:160:10
+W:61:3:0:25000
+E:1:1:1:2:1:1
+O:20:50:10:5
+B:HIT:FIRE:9d12
+B:HIT:HURT:10d10
+F:UNIQUE | MALE | SMART | CAN_SPEAK | MORTAL |
+F:BASEANGBAND | FORCE_MAXHP | WEIRD_MIND | EVIL |
+F:HAS_LITE | ESCORT | ESCORTS | ONLY_ITEM |
+F:DROP_4D2 | DROP_3D2 | DROP_GOOD | TAKE_ITEM |
+F:OPEN_DOOR | BASH_DOOR | DROP_USEFUL |
+F:IM_ACID | IM_ELEC | IM_FIRE | IM_POIS | RES_PLAS |
+S:1_IN_2 |
+S:BA_FIRE | BRAIN_SMASH | CAUSE_2 | BO_FIRE | BO_MANA |
+S:BO_PLAS | SCARE | CONF | HASTE | HEAL | TPORT |
+S:TELE_TO | TELE_AWAY | TRAPS | FORGET | S_KIN |
+D:The proud former 'king' of Gondor, he has been driven mad
+D:by his contact with Sauron through the Palantir. You see
+D:the glint of a terrible fire in his eyes.
+
+N:423:Creeping adamantite coins
+G:$:G
+I:120:20d25:5:50:10
+W:27:3:0:60
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:BITE:POISON:3d4
+B:TOUCH:POISON:3d5
+B:HIT:HURT:1d12
+B:HIT:HURT:1d12
+F:ONLY_GOLD | DROP_90 | DROP_2D2 |
+F:COLD_BLOOD | BASH_DOOR | CHAR_MULTI |
+F:IM_ELEC | IM_ACID | IM_POIS | NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT
+D:It appears to be a pile of coins made of precious adamant, slithering toward
+D:you on lots of tiny legs.
+
+N:424:Algroth
+G:T:o
+I:110:21d12:20:60:40
+W:27:1:6000:150
+E:1:1:1:2:1:1
+O:10:80:0:10
+B:CLAW:POISON:3d3
+B:CLAW:POISON:3d3
+B:BITE:HURT:1d6
+F:FRIENDS | DROP_60 | WILD_WOOD | WILD_MOUNTAIN | WILD_TOO | WILD_SWAMP |
+F:OPEN_DOOR | BASH_DOOR | DROP_CORPSE | REGENERATE |
+F:EVIL | TROLL | BASEANGBAND
+D:Trolls were created by Melkor in mockery of the Ents. This one is
+D:a powerful troll form. Venom drips from its needle-like claws.
+
+# New monster added for the Theme module
+# From UnAngband
+
+N:425:Boromir, Son of Denethor
+G:p:W
+I:110:10d100:20:90:30
+W:34:5:0:1200
+E:1:1:1:2:1:1
+O:10:80:0:10
+B:HIT:HURT:5d5
+B:HIT:HURT:5d5
+B:HIT:HURT:5d5
+F:BASEANGBAND | WILD_TOO | WILD_WOOD |
+F:UNIQUE | MALE | CAN_SPEAK | SMART |
+F:FORCE_MAXHP | MORTAL | HAS_LITE | PET |
+F:OPEN_DOOR | BASH_DOOR | TAKE_ITEM |
+F:DROP_2D2 | DROP_GOOD | ONLY_ITEM |
+S:1_IN_10 |
+S:ARROW_2 | S_KIN |
+D:A noble son of the Steward of Gondor.
+
+N:426:Roper
+G:#:D
+I:115:30d10:30:60:255
+W:27:5:0:235
+E:0:0:0:6:0:0
+O:0:0:0:0
+B:CRUSH:PARALYZE:3d5
+B:CRUSH:PARALYZE:3d5
+B:CRUSH:PARALYZE:3d5
+B:CRUSH:PARALYZE:3d5
+F:FORCE_MAXHP | FORCE_SLEEP | NO_FEAR | NEVER_MOVE |
+F:ONLY_GOLD | DROP_2D2 | DROP_60 | DROP_1D2 | EVIL |
+F:IM_ACID | IM_POIS | NO_CONF | NO_SLEEP | IM_COLD | IM_FIRE | BASEANGBAND
+F:NO_CUT
+S:1_IN_5 |
+S:BA_FIRE | BA_ELEC | BA_POIS | HASTE |
+S:TRAPS | SHRIEK | HOLD | CONF
+D:This creature look like a pillar of rock. However, a closer
+D:inspection reveals a glaring eye and powerful tentacles,
+D:which crush its prey and feed it to the creature's hungry
+D:mouth.
+
+N:427:Headless
+G:H:W
+I:110:25d12:20:50:40
+W:27:1:1600:175
+E:1:1:1:2:0:1
+O:0:100:0:0
+B:HIT:HURT:1d8
+B:HIT:HURT:1d8
+F:FRIENDS | DROP_60 | OPEN_DOOR | BASH_DOOR | WILD_TOO |
+F:WILD_MOUNTAIN | WILD_WASTE | DROP_SKELETON | DROP_CORPSE |
+F:EVIL | BASEANGBAND
+S:1_IN_6
+S:SCARE
+D:Headless humanoid abomination, ever hungry for blood.
+
+N:428:Vibration hound
+G:Z:y
+I:110:25d10:30:30:0
+W:27:2:600:250
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:BITE:HURT:2d8
+B:BITE:HURT:2d8
+B:CLAW:HURT:3d3
+B:CLAW:HURT:3d3
+F:FORCE_SLEEP |
+F:FRIENDS |
+F:BASH_DOOR |
+F:ANIMAL | NO_CONF | NO_SLEEP | DROP_SKELETON | DROP_CORPSE |
+F:MORTAL | BASEANGBAND
+S:1_IN_5 |
+S:BR_SOUN
+D:A blurry canine form which seems to be moving as fast as the eye can
+D:follow. You can feel the earth resonating beneath your feet.
+
+N:429:Nexus hound
+G:Z:v
+I:110:25d10:30:30:0
+W:27:2:600:250
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:BITE:HURT:2d8
+B:BITE:HURT:2d8
+B:CLAW:HURT:3d3
+B:CLAW:HURT:3d3
+F:FORCE_SLEEP | RES_NEXU | DROP_SKELETON | DROP_CORPSE |
+F:FRIENDS |
+F:BASH_DOOR |
+F:ANIMAL | RES_TELE | NO_SLEEP | MORTAL | BASEANGBAND
+S:1_IN_5 |
+S:BR_NEXU
+D:A locus of conflicting points coalesce to form the vague shape of a huge
+D:hound. Or is it just your imagination?
+
+N:430:Half-ogre
+G:O:o
+I:110:35d9:20:33:30
+W:27:2:2700:80
+E:1:1:1:2:1:1
+O:20:70:0:10
+B:HIT:HURT:4d8
+B:HIT:HURT:4d8
+F:FRIENDS | DROP_60 | DROP_CORPSE | SMART |
+F:OPEN_DOOR | BASH_DOOR |
+F:EVIL | GIANT |
+F:MORTAL | BASEANGBAND | HAS_LITE
+D:A giant, brutish figure, as ugly as an orc, but with some of the
+D:intelligence of his half-human ancestry.
+
+N:431:Lokkak, the Ogre Chieftain
+G:O:v
+I:120:15d103:20:100:20
+W:32:2:3000:1500
+E:1:1:1:2:1:1
+O:5:85:0:5
+B:HIT:HURT:6d7
+B:HIT:HURT:6d7
+B:HIT:HURT:6d7
+F:UNIQUE | MALE | CAN_SPEAK | WILD_TOO | WILD_SWAMP | WILD_SHORE |
+F:FORCE_MAXHP | ESCORT |
+F:ONLY_ITEM | DROP_2D2 | DROP_GOOD | DROP_CORPSE |
+F:OPEN_DOOR | BASH_DOOR | CAN_SWIM |
+F:EVIL | GIANT | IM_POIS |
+F:MORTAL | BASEANGBAND | HAS_LITE
+D:An ogre renowned for acts of surprising cruelty, Lokkak is the leader of a large
+D:band of violent ogres.
+
+N:432:Vampire
+G:V:W
+I:110:25d12:20:45:10
+W:27:1:1700:175
+E:1:1:1:2:1:1
+O:20:40:20:10
+B:HIT:HURT:1d6
+B:HIT:HURT:1d6
+B:BITE:EXP_20:2d6
+B:BITE:EXP_20:2d6
+F:FORCE_SLEEP | FORCE_MAXHP |
+F:COLD_BLOOD | DROP_60 | DROP_1D2 |
+F:OPEN_DOOR | BASH_DOOR | REGENERATE | CAN_FLY |
+F:EVIL | UNDEAD | IM_COLD | IM_POIS | HURT_LITE | NO_CONF | NO_SLEEP |
+F:BASEANGBAND | NO_CUT
+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.
+
+N:433:Gorgimaera
+G:H:R
+I:110:25d20:12:55:10
+W:27:2:2300:400
+E:0:1:0:2:2:0
+O:0:0:0:0
+B:BUTT:HURT:2d10
+B:BITE:FIRE:2d10
+B:GAZE:PARALYZE:2d6
+F:FORCE_SLEEP | SUSCEP_COLD |
+F:BASH_DOOR | CAN_FLY | DROP_CORPSE |
+F:IM_FIRE | BASEANGBAND
+S:1_IN_8 |
+S:BR_FIRE
+D:It has three heads - goat, dragon and gorgon - all attached to a
+D:lion's body.
+
+# New monster added for the Theme module
+# From UnAngband
+N:434:Faramir, Son of Denethor
+G:p:W
+I:110:10d100:20:90:30
+W:34:5:0:1200
+E:1:1:1:2:1:1
+O:20:50:10:5
+B:HIT:HURT:5d5
+B:HIT:HURT:5d5
+B:HIT:HURT:5d5
+B:HIT:HURT:5d5
+F:BASEANGBAND | UNIQUE | MALE | CAN_SPEAK | PET |
+F:WILD_TOO | WILD_WOOD | FORCE_MAXHP | MORTAL |
+F:OPEN_DOOR | BASH_DOOR | TAKE_ITEM | HAS_LITE |
+F:ONLY_ITEM | DROP_2D2 | DROP_GOOD |
+S:1_IN_10 |
+S:ARROW_2 | S_KIN
+D:The noble son of the Steward of Gondor guards the depths
+D:of Ithilien against the Enemy.
+
+N:435:Colbran
+G:g:y
+I:120:80d12:12:80:10
+W:27:2:0:900
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:HIT:ELEC:3d8
+B:HIT:ELEC:3d8
+F:FORCE_SLEEP |
+F:EMPTY_MIND | COLD_BLOOD | BASH_DOOR | CAN_FLY |
+F:IM_ELEC | IM_POIS | AURA_ELEC | REFLECTING |
+F:NO_CONF | NO_SLEEP | NO_FEAR | NONLIVING | BASEANGBAND | NO_CUT
+S:1_IN_3 |
+S:BO_ELEC
+D:A man-shaped form of living lightning, sparks and shocks crackle all over
+D:this madly capering figure, as it leaps and whirls around and about you.
+
+N:436:Spirit naga
+G:n:w
+I:110:30d15:20:75:120
+W:28:2:0:60
+E:0:0:0:0:1:0
+O:20:0:80:0
+B:CRUSH:HURT:2d8
+B:CRUSH:HURT:2d8
+B:BITE:HURT:1d8
+B:BITE:HURT:1d8
+F:FEMALE |
+F:FORCE_SLEEP | CAN_FLY |
+F:ONLY_ITEM | DROP_90 | DROP_2D2 | DROP_CORPSE |
+F:INVISIBLE | OPEN_DOOR | BASH_DOOR |
+F:EVIL | NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT
+S:1_IN_4 |
+S:HEAL | BLIND | MIND_BLAST | DARKNESS
+D:A wraithly snake-like form with the torso of a beautiful woman, it is the
+D:most powerful of its kind.
+
+# New monster added by furiosity for the Theme module
+# from UnAngband
+N:437:Harry Goatleaf, Gatekeeper of Bree
+G:p:w
+I:100:8d10:40:10:5
+W:5:4:1200:0
+E:1:1:1:2:1:1
+O:20:20:20:20
+B:GAZE:*
+B:WAIL:*
+B:INSULT:*
+B:CHARGE:HURT:1d2
+F:BASEANGBAND | WILD_TOO | WILD_TOWN | WILD_WOOD |
+F:UNIQUE | CAN_SPEAK | MALE | HAS_LITE | MORTAL |
+F:OPEN_DOOR | BASH_DOOR | TAKE_ITEM |
+F:ONLY_ITEM | DROP_1D2 | DROP_GOOD |
+D:The suspicious and gruff keeper of the West-gate of Bree. He betrayed his
+D:people by letting Saruman's thugs into the city, and so has been turned out.
+
+# New monster added for the Theme module
+# Description from UnAngband
+# Basically just an upgrade on the silent watcher.
+N:438:The Watcher of Cirith Ungol
+G:g:s
+I:140:60d200:100:300:0
+W:60:10:4000:80000
+E:3:0:3:3:2:0
+O:0:0:0:0
+B:GAZE:TERRIFY:5d8
+B:GAZE:PARALYZE:5d8
+B:GAZE:LOSE_STR:5d8
+B:GAZE:HALLU:5d8
+F:UNIQUE | FORCE_MAXHP | INVISIBLE | WEIRD_MIND |
+F:EMPTY_MIND | COLD_BLOOD | NONLIVING | NEVER_MOVE |
+F:IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | EVIL |
+F:HURT_ROCK | COLD_BLOOD | HURT_LITE | NO_FEAR |
+F:NO_CONF | NO_SLEEP | NO_STUN | NONLIVING | RES_TELE |
+F:BASEANGBAND | NO_CUT | REGENERATE |
+S:1_IN_3 |
+S:SHRIEK | S_SPIDER | S_HI_UNDEAD | MIND_BLAST | DRAIN_MANA
+D:It looks like a great figure seated upon a throne, with three joined
+D:bodies and three vulture-like heads. It seems to be carved out of huge
+D:blocks of stone, immovable, and yet strangely aware of your presence.
+D:The black stones of its eyes glitter with its dreadful will. Visible or
+D:invisible, none shall pass by this guardian.
+
+N:439:Stairway to Hell
+G:>:W
+I:120:15d8:90:40:20
+W:28:5:0:125
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:WAIL:UN_BONUS
+B:WAIL:EXP_20
+B:WAIL:EAT_GOLD
+B:WAIL:EAT_ITEM
+F:CHAR_MULTI | COLD_BLOOD | EVIL | NO_CONF | NO_SLEEP | NO_FEAR | NONLIVING |
+F:UNDEAD | FORCE_MAXHP | IM_FIRE | IM_ELEC | IM_POIS | IM_ACID | EMPTY_MIND
+F:NEVER_MOVE | JOKEANGBAND | HAS_LITE | NO_CUT
+S:1_IN_15
+S:S_DEMON | SHRIEK
+D:Often found in graveyards.
+
+N:440:5-headed hydra
+G:M:g
+I:120:100d8:20:80:20
+W:28:2:5500:650
+E:0:1:0:2:2:0
+O:0:0:0:0
+B:BITE:POISON:4d4
+B:BITE:POISON:4d4
+B:BITE:POISON:4d4
+B:BITE:POISON:4d4
+F:FORCE_SLEEP |
+F:ONLY_GOLD | DROP_1D2 | DROP_4D2 | DROP_SKELETON | DROP_CORPSE
+F:BASH_DOOR | MOVE_BODY | CAN_SWIM |
+F:ANIMAL | IM_POIS | WILD_TOO | WILD_SHORE | WILD_SWAMP |
+F:MORTAL | BASEANGBAND
+S:1_IN_5 |
+S:SCARE | BA_POIS
+D:A strange reptilian creature with five heads dripping venom.
+
+# New monster added for the Theme module
+# Adapted from UnAngband
+N:441:Tom Bombadil
+G:Y:b
+I:140:440d100:255:10000:0
+W:127:5:0:0
+E:1:1:1:2:1:1
+O:0:0:0:0
+B:SHOW:*
+F:BASEANGBAND | WILD_ONLY | WILD_GRASS | WILD_WOOD | WILD_SHORE |
+F:UNIQUE | MALE | FORCE_MAXHP | GOOD | HAS_LITE | CAN_SPEAK |
+F:NO_THEFT | CAN_FLY | NO_CUT | DEATH_ORB |
+F:WYRM_PROTECT | DG_CURSE | GOOD | OPEN_DOOR | BASH_DOOR | SMART |
+F:RES_NETH | NEVER_BLOW | REFLECTING | WEIRD_MIND |
+F:REGENERATE | IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS |
+F:RES_TELE | RES_WATE | RES_PLAS | RES_NEXU | RES_DISE | PET |
+F:NO_FEAR | NO_STUN | NO_CONF | NO_SLEEP | CAN_SWIM | AQUATIC |
+S:1_IN_5 |
+S:CONF | MIND_BLAST | BRAIN_SMASH |
+S:BA_MANA | CAUSE_4 | MISSILE | SCARE | SLOW | HOLD | BO_MANA |
+S:HASTE | HAND_DOOM | HEAL | BLINK | BR_MANA | S_MONSTERS |
+D:A mysterious figure in a blue coat, his face creased in laughter.
+D:Legend has it that he is older than Arda itself, and will aid
+D:the forces of good in any way he can.
+
+N:442:Wainrider
+G:p:s
+I:120:30d10:20:70:10
+W:28:1:2400:240
+E:1:1:1:2:1:1
+O:0:90:10:0
+B:HIT:HURT:5d5
+B:HIT:HURT:5d5
+B:HIT:HURT:5d5
+F:MALE |
+F:FORCE_SLEEP | DROP_1D2 |
+F:OPEN_DOOR | BASH_DOOR | DROP_SKELETON | DROP_CORPSE |
+F:EVIL | MORTAL | BASEANGBAND | HAS_LITE
+S:1_IN_8 |
+S:BLIND | SCARE | CAUSE_3 | DARKNESS
+D:He is a figure riding a majestic war chariot; he looks at you
+D:menacingly.
+
+N:443:Seahorse
+G:~:o
+I:120:111d7:20:60:20
+W:28:2:3000:360
+E:0:0:0:0:1:0
+O:0:0:0:0
+B:BITE:PARALYZE:4d5
+B:BITE:LOSE_DEX:4d5
+B:BITE:LOSE_CON:4d5
+F:FORCE_SLEEP | AQUATIC | GOOD | ANIMAL | NEUTRAL | NO_TARGET |
+F:IM_COLD | IM_POIS | IM_FIRE | IM_ELEC | WILD_ONLY | WILD_OCEAN
+F:MORTAL | BASEANGBAND
+S:1_IN_5 |
+S:BO_WATE | BO_COLD | BO_ICEE | BO_MANA
+D:Your mind is filled with admiration as you view this wondrous,
+D:magical seahorse.
+
+N:444:Cyclops
+G:P:u
+I:120:60d20:20:90:20
+W:45:2:3500:1500
+E:1:1:1:2:1:1
+O:0:100:0:0
+B:HIT:HURT:9d9
+B:HIT:HURT:9d9
+F:FORCE_SLEEP |
+F:DROP_1D2 | TAKE_ITEM | WILD_TOO | WILD_SHORE | WILD_MOUNTAIN |
+F:BASH_DOOR | OPEN_DOOR | MOVE_BODY | DROP_CORPSE |
+F:EVIL | IM_POIS | IM_ACID | IM_FIRE | IM_COLD | GIANT |
+F:MORTAL | BASEANGBAND | HAS_LITE
+S:1_IN_8 |
+S:ARROW_4
+D:A gigantic humanoid with only one eye.
+
+N:445:Clairvoyant
+G:p:y
+I:120:25d10:100:50:10
+W:28:3:1600:250
+E:1:1:1:2:1:1
+O:0:0:90:10
+B:HIT:CONFUSE:5d5
+B:HIT:TERRIFY:5d5
+F:MALE |
+F:FORCE_SLEEP | DROP_1D2 | DROP_SKELETON | DROP_CORPSE
+F:OPEN_DOOR | BASH_DOOR | SMART |
+F:EVIL | MORTAL | BASEANGBAND | HAS_LITE
+S:1_IN_8 |
+S:BLIND | MIND_BLAST | HOLD | CAUSE_3 | FORGET | S_MONSTER
+D:He is using his supernatural talents to bring about your
+D:destruction.
+
+N:446:Purple worm
+G:w:v
+I:110:65d8:14:65:30
+W:29:4:1000:400
+E:0:0:0:0:1:0
+O:0:0:0:0
+B:HIT:HURT:1d8
+B:BITE:ACID:2d8
+B:STING:POISON:1d8
+F:BASH_DOOR | DROP_CORPSE |
+F:ANIMAL | IM_ACID | IM_POIS | CAN_SWIM |
+F:MORTAL | BASEANGBAND
+D:It is a massive worm form, many feet in length. Its vast maw drips acid
+D:and poison.
+
+N:447:Catoblepas
+G:q:g
+I:110:30d10:15:55:40
+W:29:2:0:400
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:GAZE:TERRIFY:2d4
+B:GAZE:BLIND:2d4
+B:BUTT:HURT:2d6
+B:BITE:HURT:2d12
+F:ONLY_GOLD | DROP_2D2 | DROP_CORPSE
+F:BASH_DOOR | CAN_SWIM | WILD_TOO | WILD_SWAMP |
+F:ANIMAL | IM_POIS
+F:MORTAL | BASEANGBAND
+D:A strange ox-like form with a huge head but a thin, weak neck.
+
+N:448:Lesser wall monster
+G:#:W
+I:110:13d8:20:75:40
+W:28:4:0:600
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:HIT:HURT:2d6
+B:HIT:HURT:2d6
+B:HIT:HURT:2d6
+F:FORCE_SLEEP | COLD_BLOOD | EMPTY_MIND | KILL_WALL | RAND_50 |
+F:BASH_DOOR | IM_COLD | IM_ACID | IM_FIRE | IM_ELEC | IM_POIS | NONLIVING |
+F:HURT_ROCK | NO_CONF | NO_SLEEP | CHAR_MULTI | BASEANGBAND | NO_CUT
+S:MULTIPLY
+D:A sentient, moving section of wall.
+
+N:449:Mage
+G:p:r
+I:110:15d8:20:40:10
+W:28:1:1500:150
+E:1:1:1:2:1:1
+O:10:0:90:0
+B:HIT:HURT:2d5
+B:HIT:HURT:2d5
+F:MALE |
+F:FORCE_SLEEP |
+F:ONLY_ITEM | DROP_1D2 | DROP_SKELETON | DROP_CORPSE |
+F:SMART | OPEN_DOOR | BASH_DOOR |
+F:EVIL | MORTAL | BASEANGBAND | HAS_LITE
+S:1_IN_3 |
+S:HASTE | TPORT | TELE_TO | BLIND | CONF |
+S:BO_FIRE | BO_COLD | BO_ELEC |
+S:S_MONSTER
+D:A fat mage with glasses. And considerable power, too - as you can
+D:tell from the size of his hat.
+
+N:450:Mind flayer
+G:h:y
+I:110:15d10:20:60:10
+W:28:1:1400:200
+E:1:1:1:2:1:1
+O:0:10:90:0
+B:CRUSH:LOSE_INT:2d6
+B:GAZE:INSANITY:2d6
+F:FORCE_SLEEP | FORCE_MAXHP | DROP_CORPSE
+F:ONLY_ITEM | DROP_60 | DROP_1D2 |
+F:OPEN_DOOR | BASH_DOOR |
+F:EVIL | NO_CONF | NO_SLEEP
+F:MORTAL | BASEANGBAND
+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.
+
+N:451:The Ultimate Dungeon Cleaner
+G:g:D
+I:120:70d12:10:80:12
+W:28:2:0:555
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:CRUSH:HURT:2d10
+B:CRUSH:HURT:2d10
+B:CRUSH:HURT:2d10
+B:CRUSH:HURT:2d10
+F:FORCE_SLEEP | FORCE_MAXHP | KILL_BODY | KILL_ITEM | UNIQUE | REFLECTING |
+F:EMPTY_MIND | COLD_BLOOD | BASH_DOOR | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS
+F:NO_FEAR | NO_CONF | NO_SLEEP | NONLIVING | RES_TELE | JOKEANGBAND | NO_CUT
+D:It looks like a huge spiked roller. It was designed to keep this dungeon
+D:clean, and you are the biggest spot of dirt in sight.
+
+# New monster added by furiosity for the Theme module
+# Based partly on the Icky queen.
+N:452:The Mewlip Queen
+G:i:v
+I:120:3d100:30:100:15
+W:30:5:10:4000
+E:0:0:0:0:0:0
+O:40:30:10:10
+B:CRAWL:POISON:5d7
+B:CRAWL:EAT_FOOD:5d7
+F:BASEANGBAND | EMPTY_MIND | SMART | IM_POIS |
+F:UNDEAD | RAND_50 | CAN_SWIM | EVIL | NO_FEAR |
+F:FORCE_MAXHP | UNIQUE | FEMALE | REGENERATE |
+F:ONLY_ITEM | DROP_2D2 | DROP_GREAT | ESCORT | ESCORTS |
+S:1_IN_5
+S:ANIM_DEAD | S_KIN
+D:A ruler of mewlips. She might not be the most powerful of
+D:them all, but she is the smartest, and has her minions
+D:at her beck and call.
+
+N:453:Basilisk
+G:R:s
+I:120:20d30:15:90:30
+W:28:3:400:350
+E:0:1:0:2:1:0
+O:50:0:30:20
+B:GAZE:PARALYZE
+B:BITE:HURT:2d12
+B:BITE:HURT:2d12
+B:BITE:HURT:2d12
+F:ONLY_ITEM | DROP_1D2 | WILD_TOO | WILD_MOUNTAIN |
+F:OPEN_DOOR | BASH_DOOR | EVIL | IM_POIS | DROP_CORPSE |
+F:ANIMAL | NO_CONF | NO_SLEEP | CAN_SWIM |
+F:MORTAL | BASEANGBAND
+S:1_IN_8 |
+S:BR_POIS
+D:An evil reptile that preys on unsuspecting travellers. Its eyes stare
+D:deeply at you and your soul starts to wilt!
+
+N:454:Snow-troll
+G:T:w
+I:110:24d10:20:56:50
+W:28:1:5000:200
+E:1:1:1:2:1:1
+O:0:100:0:0
+B:HIT:HURT:1d5
+B:HIT:HURT:1d5
+B:BITE:COLD:2d6
+B:BITE:COLD:2d6
+F:MALE |
+F:FRIENDS | DROP_60 | WILD_TOO | WILD_WASTE | DROP_SKELETON | DROP_CORPSE |
+F:OPEN_DOOR | BASH_DOOR | SUSCEP_FIRE | REGENERATE |
+F:EVIL | TROLL | IM_COLD | HURT_LITE | BASEANGBAND
+D:Melkor created trolls in mockery of Yavanna's Ents. This
+D:is a white troll with powerfully clawed hands.
+
+# New monster added for the Theme module
+# From UnAngband
+N:455:Fluithuin the Ogress, Consort of Morgoth
+G:O:b
+I:120:53d100:40:140:30
+W:69:3:3000:29000
+E:1:1:1:2:1:1
+O:5:85:0:5
+B:HIT:HURT:11d10
+B:HIT:HURT:11d10
+B:HIT:SHATTER:11d10
+F:UNIQUE | CAN_SPEAK | FEMALE |
+F:RAND_25 | EVIL | GIANT | FORCE_MAXHP |
+F:DROP_GOOD | ONLY_ITEM | DROP_4D2 |
+F:OPEN_DOOR | BASH_DOOR | MOVE_BODY | KILL_ITEM |
+F:IM_ACID | IM_FIRE | IM_COLD | IM_POIS |
+S:1_IN_5
+S:BA_ACID | BA_WATE | BO_ICEE
+D:A powerful, fierce ogress, consort to Morgoth, rumoured to
+D:be the mother of Gothmog, high captain of Balrogs.
+
+# New monster added by furiosity for the Theme module
+# Based on UnAngband, though there Ulbandi is male and same as ToME's Lokkak
+
+N:456:Ulbandi the Ogress, Consort of Morgoth
+G:O:R
+I:110:15d100:20:100:50
+W:40:5:3000:15000
+E:1:1:1:2:1:1
+O:5:85:0:5
+B:HIT:HURT:8d8
+B:HIT:HURT:8d8
+B:HIT:POISON:8d8
+F:UNIQUE | FEMALE | CAN_SPEAK |
+F:EVIL | GIANT | FORCE_MAXHP |
+F:DROP_GOOD | DROP_2D2 | ONLY_ITEM |
+F:OPEN_DOOR | ESCORTS | IM_POIS |
+S:1_IN_9 |
+S:CONF | SCARE | HEAL | SHRIEK | S_KIN
+D:A powerful ogress, consort to Morgoth, rumoured to be
+D:the mother of Gothmog, high captain of Balrogs, also
+D:rumoured to be related to Lokkak, the Ogre Chieftain.
+
+# New monster added for the Theme module
+# Suggested by Atarlost in the t-o-m-e.net forum
+N:457:Naugladur, Lord of Nogrod
+G:k:G
+I:110:20d100:30:200:200
+W:70:1:0:12000
+B:HIT:HURT:4d6
+B:HIT:HURT:4d6
+B:HIT:HURT:4d6
+B:HIT:HURT:4d6
+F:UNIQUE | MALE | ESCORT | ESCORTS | CAN_SPEAK |
+F:FORCE_MAXHP | SMART | SPECIAL_GENE
+F:ONLY_ITEM | DROP_2D2 | DROP_GOOD | DROP_GREAT
+F:OPEN_DOOR | BASH_DOOR
+F:EVIL | IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS
+D:The slayer of Thingol, and the thief of the Nauglamir. He leads the dark
+D:dwarves who escaped from Nogrod.
+
+N:458:Greater mimic
+G:m:y
+I:120:10d35:30:60:100
+W:29:3:100:200
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:HIT:POISON:3d4
+B:HIT:POISON:3d4
+B:HIT:POISON:3d4
+B:HIT:POISON:3d4
+F:MIMIC |
+F:FORCE_SLEEP | NEVER_MOVE | SUSCEP_ACID |
+F:EMPTY_MIND | COLD_BLOOD |
+F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT
+S:1_IN_4 |
+S:BLIND | CONF | SCARE | CAUSE_2 | FORGET |
+S:BO_ACID | BO_FIRE | BO_COLD | BO_ELEC |
+S:S_MONSTER
+D:A strange creature that disguises itself as an object to lure
+D:unsuspecting adventurers within reach of its venomous claws.
+
+N:459:Young blue dragon
+G:d:b
+I:110:27d10:20:50:70
+W:29:1:20000:500
+E:0:1:0:6:1:0
+O:50:50:0:0
+B:CLAW:HURT:2d4
+B:CLAW:HURT:2d4
+B:BITE:HURT:2d6
+F:FORCE_SLEEP | FORCE_MAXHP | WILD_TOO | WILD_MOUNTAIN | WILD_WOOD |
+F:DROP_2D2 | DROP_CORPSE | ATTR_MULTI
+F:OPEN_DOOR | BASH_DOOR | CAN_FLY |
+F:EVIL | DRAGON | IM_ELEC | BASEANGBAND | ATTR_MULTI
+S:1_IN_10 |
+S:SCARE |
+S:BR_ELEC
+D:It has a form that legends are made of. Its still-tender scales are a
+D:deep blue in hue. Sparks crackle along its length.
+
+N:460:Young white dragon
+G:d:w
+I:110:27d10:20:50:70
+W:29:1:20000:500
+E:0:1:0:6:1:0
+O:50:50:0:0
+B:CLAW:HURT:2d4
+B:CLAW:HURT:2d4
+B:BITE:HURT:2d6
+F:FORCE_SLEEP | FORCE_MAXHP | WILD_TOO | WILD_MOUNTAIN | WILD_WASTE |
+F:DROP_2D2 | DROP_CORPSE | ATTR_MULTI
+F:OPEN_DOOR | BASH_DOOR | SUSCEP_FIRE |
+F:EVIL | DRAGON | IM_COLD | BASEANGBAND | ATTR_MULTI
+S:1_IN_10 |
+S:SCARE |
+S:BR_COLD
+D:It has a form that legends are made of. Its still-tender scales are a
+D:frosty white in hue. Icy blasts of cold air come from it as it breathes.
+
+N:461:Young green dragon
+G:d:g
+I:110:27d10:20:50:70
+W:29:1:20000:500
+E:0:1:0:6:1:0
+O:50:50:0:0
+B:CLAW:HURT:2d4
+B:CLAW:HURT:2d4
+B:BITE:HURT:2d6
+F:FORCE_SLEEP | FORCE_MAXHP | WILD_TOO | WILD_MOUNTAIN | WILD_SWAMP |
+F:DROP_2D2 | DROP_CORPSE |
+F:OPEN_DOOR | BASH_DOOR | CAN_FLY |
+F:EVIL | DRAGON | IM_POIS | BASEANGBAND | ATTR_MULTI
+S:1_IN_10 |
+S:SCARE |
+S:BR_POIS
+D:It has a form that legends are made of. Its still-tender scales are a
+D:deep green in hue. Foul gas seeps through its scales.
+
+N:462:Young bronze dragon
+G:d:U
+I:110:27d10:20:50:70
+W:29:1:20000:500
+E:0:1:0:6:1:0
+O:50:50:0:0
+B:CLAW:HURT:2d4
+B:CLAW:HURT:2d4
+B:BITE:HURT:2d6
+F:FORCE_SLEEP | FORCE_MAXHP | WILD_TOO | WILD_MOUNTAIN |
+F:DROP_2D2 | DROP_CORPSE |
+F:OPEN_DOOR | BASH_DOOR | CAN_FLY |
+F:EVIL | DRAGON | NO_CONF | BASEANGBAND | ATTR_MULTI
+S:1_IN_10 |
+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.
+
+# New monster added for the Theme module
+# From the Annals of Ea module (by Feanor)
+N:463:Androg the Outlaw
+G:p:b
+I:110:72d10:20:95:20
+W:21:3:2400:600
+E:1:1:1:2:1:1
+O:30:8:0:0
+B:HIT:HURT:3d8
+B:HIT:HURT:3d8
+B:HIT:HURT:3d5
+B:HIT:HURT:3d5
+F:UNIQUE | MALE | CAN_SPEAK |
+F:FORCE_MAXHP | DROP_SKELETON | DROP_CORPSE |
+F:ESCORT |
+F:ONLY_ITEM | DROP_1D2 | DROP_GOOD |
+F:OPEN_DOOR | BASH_DOOR |
+F:EVIL | IM_FIRE | IM_COLD | IM_POIS |
+F:MORTAL | BASEANGBAND | HAS_LITE |
+D:A member of a band of outlaws, he was spared his life when
+D:Neithan (that is, Turin) killed Forweg, the previous leader.
+
+N:464:Mithril golem
+G:g:B
+I:110:80d15:12:100:10
+W:30:4:10000:500
+E:1:1:1:2:1:1
+O:0:0:0:0
+B:HIT:HURT:3d8
+B:HIT:HURT:3d8
+B:HIT:HURT:5d5
+B:HIT:HURT:5d5
+F:ONLY_GOLD | DROP_2D2 |
+F:EMPTY_MIND | COLD_BLOOD | BASH_DOOR | REFLECTING |
+F:IM_FIRE | IM_COLD | IM_ELEC | IM_POIS |
+F:NO_CONF | NO_SLEEP | NO_FEAR | NONLIVING | BASEANGBAND | NO_CUT
+D:It is a massive statue of pure mithril. It looks expensive.
+
+N:465:Skeleton troll
+G:s:W
+I:110:20d10:20:55:20
+W:30:1:5000:225
+E:1:1:1:2:1:1
+O:0:0:0:0
+B:HIT:HURT:1d6
+B:HIT:HURT:1d6
+B:BITE:HURT:3d4
+F:EMPTY_MIND | COLD_BLOOD | OPEN_DOOR | BASH_DOOR |
+F:EVIL | TROLL | UNDEAD |
+F:IM_COLD | IM_POIS |
+F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT
+D:It is a troll skeleton animated by dark magic.
+
+# New monster added for the Theme module
+# From Annals of Ea module (by Feanor)
+
+N:466:Amlach, son of Imlach
+G:p:s
+I:110:28d10:20:30:20
+W:9:2:1500:150
+E:1:1:1:2:1:1
+O:10:50:35:0
+B:HIT:HURT:1d7
+B:HIT:HURT:1d7
+B:TOUCH:EAT_GOLD
+B:INSULT:*
+F:UNIQUE | MALE | CAN_SPEAK |
+F:FORCE_SLEEP | FORCE_MAXHP |
+F:ONLY_ITEM | DROP_1D2 | DROP_GOOD | DROP_GREAT |
+F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | DROP_SKELETON |
+F:EVIL | RES_TELE |
+F:MORTAL | BASEANGBAND | HAS_LITE
+S:1_IN_5 |
+S:HEAL | SLOW | TRAPS | BO_COLD | BA_POIS
+D:He's a trustworthy man... or is he? Morgoth seem's sending spies in
+D:disguise, and perhaps this is one of them.
+
+N:467:Beorn, the Shape-Changer
+G:q:D
+I:120:20d70:25:60:25
+W:28:3:0:1000
+E:0:1:0:2:1:0
+O:20:60:20:0
+B:CLAW:HURT:2d10
+B:CLAW:HURT:2d10
+B:BITE:HURT:4d8
+B:CRUSH:HURT:3d6
+F:UNIQUE | MALE | FORCE_MAXHP | FORCE_SLEEP |
+F:BASH_DOOR | ANIMAL | MOVE_BODY | SMART | PET | CAN_SPEAK |
+F:WILD_TOO | WILD_WOOD | WILD_MOUNTAIN | DROP_CORPSE |
+F:ONLY_ITEM | DROP_2D2 | DROP_GOOD | BASEANGBAND
+S:1_IN_6 | S_ANIMAL
+D:Beorn is only occasionally seen in human form these days, preferring to
+D:appear in the shape of a giant black bear: he also prefers the company of
+D:beasts to that of humans. He has never taken kindly to strangers, even in
+D:human form - and still less when in bear's shape, as he is now.
+
+N:468:Thorondor, Lord of Eagles
+G:B:v
+I:130:85d12:20:65:20
+W:30:6:1600:555
+E:0:1:1:0:1:0
+O:0:0:0:0
+B:CLAW:HURT:16d2
+B:CLAW:HURT:16d2
+B:BITE:HURT:4d10
+F:CAN_FLY | UNIQUE | FORCE_MAXHP | DROP_CORPSE | CAN_SPEAK |
+F:WILD_ONLY | WILD_MOUNTAIN | WILD_VOLCANO | PET |
+F:ANIMAL | GOOD | BASEANGBAND
+D:Among the mightiest of birds, Thorondor is the messenger of the Valar, and
+D:brings news of Middle-earth to Valinor itself. Nothing that can be seen
+D:from the airs of the world is hidden from him.
+
+N:469:Giant blue ant
+G:a:b
+I:110:8d8:10:50:60
+W:30:2:600:80
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:BITE:ELEC:5d5
+F:RAND_25 | WILD_TOO | DROP_SKELETON
+F:WEIRD_MIND | BASH_DOOR |
+F:ANIMAL | IM_ELEC
+F:MORTAL | BASEANGBAND
+D:It is a giant ant that crackles with energy.
+
+N:470:Grave wight
+G:W:b
+I:110:12d10:20:50:30
+W:30:1:0:325
+E:0:0:0:0:0:0
+O:0:50:50:0
+B:HIT:HURT:1d7
+B:HIT:HURT:1d7
+B:TOUCH:EXP_20
+F:FORCE_SLEEP | RAND_25 |
+F:ONLY_ITEM | DROP_1D2 |
+F:COLD_BLOOD | OPEN_DOOR | BASH_DOOR |
+F:EVIL | UNDEAD | CAN_FLY |
+F:IM_COLD | IM_POIS | HURT_LITE | NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT
+S:1_IN_8 |
+S:SCARE | CAUSE_3 | DARKNESS
+D:It is a ghostly form with eyes that haunt you. It appeared when a
+D:humanoid creature died a violent death in a graveyard. It remembers
+D:its past life and seeks revenge.
+
+N:471:Shadow drake
+G:d:G
+I:110:30d10:20:70:70
+W:33:3:18000:1100
+E:0:1:0:6:1:0
+O:50:50:0:0
+B:CLAW:HURT:2d4
+B:CLAW:HURT:2d4
+B:BITE:EXP_10:3d6
+F:FORCE_SLEEP | FORCE_MAXHP | PASS_WALL |
+F:ONLY_ITEM | DROP_3D2 | CAN_FLY | DROP_CORPSE |
+F:INVISIBLE | OPEN_DOOR | BASH_DOOR |
+F:EVIL | DRAGON | NO_CONF | NO_SLEEP | BASEANGBAND | ATTR_MULTI
+S:1_IN_6 |
+S:BR_NETH | SLOW | CONF | SCARE | DARKNESS
+D:It is a dragon-like form wrapped in shadow. Glowing red eyes shine out in
+D:the dark, and it is surrounded by an aura of unearthly cold that chills
+D:the soul rather than the body.
+
+N:472:Manticore
+G:H:y
+I:120:25d10:12:15:10
+W:30:2:1900:300
+E:1:1:1:2:1:0
+O:0:0:0:0
+B:HIT:HURT:3d4
+B:HIT:HURT:3d4
+B:HIT:HURT:3d4
+B:HIT:HURT:3d4
+F:FORCE_SLEEP | FORCE_MAXHP |
+F:BASH_DOOR | CAN_FLY | WILD_TOO | WILD_WOOD | DROP_CORPSE |
+F:EVIL | MORTAL | BASEANGBAND
+S:1_IN_5 |
+S:ARROW_4
+D:It is a winged lion's body with a human torso and a tail covered in
+D:vicious spikes.
+
+N:473:Giant army ant
+G:a:o
+I:120:19d6:10:40:40
+W:30:3:600:90
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:BITE:HURT:2d12
+F:RAND_25 | KILL_BODY | FRIENDS | DROP_SKELETON
+F:WEIRD_MIND | BASH_DOOR |
+F:ANIMAL
+F:MORTAL | BASEANGBAND
+D:An armoured form moving with purpose. Powerful on its own, flee when
+D:hordes of them march.
+
+N:474:Killer slicer beetle
+G:K:y
+I:110:25d10:14:60:30
+W:30:2:600:200
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:BITE:HURT:5d8
+B:BITE:HURT:5d8
+F:WEIRD_MIND | BASH_DOOR | WILD_TOO | WILD_GRASS | DROP_CORPSE
+F:ANIMAL | CAN_FLY | MORTAL | BASEANGBAND
+D:It is a beetle with deadly sharp cutting mandibles and a rock-hard
+D:carapace.
+
+N:475:Gorgon
+G:H:b
+I:110:30d20:12:88:20
+W:31:2:3000:275
+E:1:1:1:2:1:1
+O:0:0:0:0
+B:BUTT:HURT:3d9
+B:BUTT:HURT:3d9
+B:BITE:POISON:1d10
+B:KICK:HURT:2d4
+F:FORCE_SLEEP | ANIMAL | MOVE_BODY | WILD_TOO | WILD_WOOD |
+F:BASH_DOOR | IM_POIS | IM_ACID | DROP_CORPSE |
+F:MORTAL | BASEANGBAND
+S:1_IN_8 |
+S:BR_POIS
+D:A bull-like creature whose skin is made of steel plates.
+
+# New monster added for the Theme module
+# From T-Plus module by Ingeborg S. Norden
+
+N:476:Radagast the Brown
+G:p:u
+I:120:35d101:101:100:0
+W:55:7:1600:21000
+E:1:1:1:2:1:1
+O:0:0:100:0
+B:HIT:HURT:6d4
+B:HIT:HURT:6d4
+F:UNIQUE | MALE | CAN_SPEAK | PET | DROP_CORPSE |
+F:FORCE_SLEEP | FORCE_MAXHP | REFLECTING | RES_TELE | CAN_FLY |
+F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 | DROP_GOOD |
+F:SMART | OPEN_DOOR | BASH_DOOR |
+F:GOOD | IM_COLD | IM_FIRE |
+F:IM_ELEC | IM_POIS | RES_WATE | BASEANGBAND | HAS_LITE
+S:1_IN_6 |
+S:HEAL | HASTE | BLINK | TPORT | BLIND | CONF | SCARE |
+S:CAUSE_2 | FORGET | TRAPS |
+S:BA_ELEC | BA_COLD | BA_WATE | BO_WATE | BO_ICEE | BO_ELEC |
+S:S_ANIMAL |
+D:Sometimes belittled as a bird-loving fool, Radagast is weaker
+D:mentally and magically than his fellows among the Istari.
+D:Nonetheless, his knowledge of woodcraft and command over the
+D:sky-borne elements makes Radagast a force to be reckoned with.
+
+N:477:Ghost
+G:G:w
+I:120:13d8:20:30:10
+W:31:1:0:350
+E:0:0:0:0:0:0
+O:30:40:0:20
+B:WAIL:TERRIFY
+B:TOUCH:EXP_20
+B:CLAW:LOSE_INT:1d6
+B:CLAW:LOSE_WIS:1d6
+F:FORCE_SLEEP | RAND_25 | DROP_60 | DROP_1D2 |
+F:INVISIBLE | COLD_BLOOD | TAKE_ITEM | PASS_WALL |
+F:EVIL | UNDEAD | IM_COLD | CAN_FLY |
+F:IM_POIS | NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT
+S:1_IN_15 |
+S:BLIND | HOLD | DRAIN_MANA
+D:An apparition from beyond. It does not seem friendly.
+
+N:478:Death watch beetle
+G:K:D
+I:110:25d12:16:60:30
+W:31:3:800:220
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:BITE:HURT:5d4
+B:WAIL:TERRIFY:5d6
+F:WEIRD_MIND | BASH_DOOR | WILD_TOO | DROP_CORPSE |
+F:ANIMAL | CAN_FLY | MORTAL | BASEANGBAND
+D:It is a giant beetle that produces a chilling sound.
+
+N:479:Mountain ogre
+G:O:s
+I:110:40d9:20:33:30
+W:30:2:3000:100
+E:1:1:1:2:1:1
+O:20:70:0:10
+B:HIT:HURT:5d8
+B:HIT:HURT:5d8
+F:FRIENDS | DROP_60 | DROP_CORPSE |
+F:OPEN_DOOR | BASH_DOOR |
+F:EVIL | GIANT |
+F:MORTAL | BASEANGBAND | HAS_LITE
+D:The largest breed of ogre, he is awesomely strong and awesomely ugly.
+
+N:480:Nexus quylthulg
+G:Q:v
+I:110:10d12:10:1:0
+W:32:1:3000:300
+E:0:0:0:0:0:0
+O:0:0:0:0
+F:FORCE_SLEEP | NEVER_MOVE | NEVER_BLOW |
+F:INVISIBLE | EMPTY_MIND | RES_NEXU | ANIMAL |
+F:NO_CONF | NO_SLEEP | NO_FEAR | RES_TELE | BASEANGBAND
+S:1_IN_1 |
+S:BLINK | TELE_AWAY
+D:It is a very unstable, strange pulsing mound of flesh.
+
+N:481:Shelob, Spider of Darkness
+G:S:D
+I:120:35d100:30:120:80
+W:55:3:1400:27000
+E:0:1:0:2:1:0
+O:20:30:40:0
+B:CLAW:POISON:5d6
+B:CLAW:POISON:5d6
+B:BITE:PARALYZE:5d10
+B:STING:LOSE_STR:5d4
+F:UNIQUE | FEMALE |
+F:FORCE_SLEEP | FORCE_MAXHP | SPECIAL_GENE |
+F:ESCORT | ESCORTS | DROP_CORPSE |
+F:ONLY_ITEM | DROP_1D2 | DROP_2D2 | DROP_GOOD | DROP_RANDART
+F:SMART | BASH_DOOR | IM_POIS | IM_ACID |
+F:ANIMAL | SPIDER | EVIL | HURT_LITE | NO_SLEEP | BASEANGBAND
+S:1_IN_4 |
+S:HEAL | BLIND | SLOW | CONF | SCARE | CAUSE_3 | CAUSE_4 |
+S:TRAPS | BR_DARK | BR_POIS |
+S:S_SPIDER
+D:Shelob is an enormous bloated spider, the last daughter of Ungoliant the
+D:Unlight. She normally guards the pass through Cirith Ungol, but
+D:occasionally goes out foraging for food to feed her voracious appetite.
+
+N:482:Giant squid
+G:~:g
+I:110:80d10:8:80:80
+W:32:3:3000:600
+E:3:0:3:6:1:0
+O:0:0:0:0
+B:CRUSH:HURT:8d4
+B:CRUSH:HURT:8d4
+B:CRUSH:HURT:8d4
+F:IM_ACID | RES_WATE | AQUATIC | ANIMAL | IM_COLD | MOVE_BODY
+F:FORCE_MAXHP | WILD_TOO | WILD_OCEAN | BASEANGBAND | COLD_BLOOD
+S:1_IN_8
+S:BR_ELEC | BR_ACID | BR_POIS
+D:Besides being capable of dragging whole ships underwater,
+D:this creature can also reach you from a distance.
+
+N:483:Ghoulking
+G:z:D
+I:120:40d12:20:60:10
+W:32:2:0:340
+E:1:1:1:2:1:1
+O:20:40:30:0
+B:CLAW:LOSE_STR:3d4
+B:CLAW:DISEASE:3d4
+B:CLAW:DISEASE:3d4
+B:BITE:PARALYZE:3d5
+F:DROP_60 | OPEN_DOOR | BASH_DOOR | CAN_SWIM |
+F:DROP_1D2 | FORCE_MAXHP | ESCORT | FORCE_SLEEP |
+F:EVIL | UNDEAD | IM_POIS | IM_COLD | NO_CONF | NO_SLEEP |
+F:COLD_BLOOD | HURT_LITE | BASEANGBAND | NO_CUT
+S:1_IN_7
+S:SCARE | HOLD | DARKNESS | SCARE | S_UNDEAD | ANIM_DEAD
+D:Flesh is falling off in chunks from this decaying abomination.
+
+N:484:Doombat
+G:b:R
+I:120:24d14:16:75:30
+W:32:2:150:250
+E:0:1:1:0:1:0
+O:0:0:0:0
+B:BITE:FIRE:5d4
+B:BITE:FIRE:5d4
+B:BITE:FIRE:5d4
+F:WEIRD_MIND | BASH_DOOR | AURA_FIRE | CAN_FLY | DROP_CORPSE |
+F:IM_FIRE | AI_ANNOY |
+F:ANIMAL | MORTAL | BASEANGBAND
+D:It is a fast moving creature of chaos, a gigantic black bat
+D:surrounded by flickering bright red flames.
+
+N:485:Easterling
+G:p:U
+I:120:13d12:20:60:10
+W:32:2:1600:300
+E:1:1:1:2:1:1
+O:0:100:0:0
+B:HIT:POISON:3d4
+B:HIT:LOSE_STR:3d4
+B:HIT:LOSE_STR:3d4
+F:MALE |
+F:DROP_1D2 |
+F:OPEN_DOOR | BASH_DOOR | DROP_SKELETON | DROP_CORPSE |
+F:EVIL | NO_CONF | NO_SLEEP | FRIENDS |
+F:MORTAL | BASEANGBAND | HAS_LITE
+D:One of the Swarthy Men, allied with the Dark since time
+D:immemorable.
+
+N:486:Memory moss
+G:,:b
+I:110:1d2:30:1:5
+W:32:3:50:150
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:HIT:CONFUSE:1d4
+B:HIT:CONFUSE:1d4
+F:FORCE_SLEEP | NEVER_MOVE |
+F:STUPID | EMPTY_MIND |
+F:NO_CONF | NO_SLEEP | NO_FEAR |
+F:MORTAL | BASEANGBAND | NO_CUT
+S:1_IN_6 |
+S:FORGET
+D:A mass of vegetation. You don't remember seeing anything like it
+D:before.
+
+N:487:Storm giant
+G:P:B
+I:110:40d20:20:60:40
+W:40:1:13000:1000
+E:1:1:1:2:1:1
+O:10:90:0:0
+B:HIT:ELEC:10d8
+B:HIT:ELEC:10d8
+F:FORCE_SLEEP | FORCE_MAXHP | DROP_1D2 | WILD_TOO | WILD_MOUNTAIN |
+F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | AURA_ELEC | DROP_SKELETON | DROP_CORPSE |
+F:EVIL | GIANT | IM_COLD | IM_ELEC | MALE | BASEANGBAND | HAS_LITE
+S:1_IN_8 |
+S:BLINK | TELE_TO | CONF | SCARE | BO_ELEC | BA_ELEC
+D:It is a twenty-five-foot tall giant wreathed in lightning.
+
+N:488:Spectator
+G:e:B
+I:110:15d13:30:1:5
+W:28:2:1600:150
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:GAZE:PARALYZE:1d4
+B:GAZE:CONFUSE:1d4
+B:BITE:HURT:1d8
+F:FORCE_SLEEP | FORCE_MAXHP |
+F:STUPID | EMPTY_MIND | CAN_FLY | DROP_CORPSE |
+F:NO_CONF | NO_SLEEP | NO_FEAR |
+F:MORTAL | BASEANGBAND
+S:1_IN_6 |
+S:FORGET | CAUSE_2 | HOLD | SLOW
+D:A lesser relative of the beholder: a globular body with a large toothy mouth,
+D:a large central eye, and four smaller eyes on stalks protruding from the top
+D:of its body.
+
+# New monster added by furiosity for the Theme module
+N:489:Bjorn the Warper
+G:q:D
+I:115:22d10:6:92:0
+W:31:10:3040:2000
+E:0:1:0:2:1:0
+O:20:60:20:0
+B:CLAW:HURT:2d10
+B:CLAW:HURT:2d10
+B:BITE:HURT:4d8
+B:CRUSH:HURT:3d6
+F:JOKEANGBAND | WILD_TOO | WILD_GRASS | WILD_WOOD | WILD_SHORE |
+F:UNIQUE | MALE | FORCE_MAXHP | HAS_LITE | CAN_SPEAK |
+F:ANIMAL | MOVE_BODY | GOOD | SMART | BASH_DOOR | ONLY_ITEM |
+F:DROP_2D2 | DROP_GOOD | DROP_GREAT | FORCE_SLEEP | NO_CUT |
+F:NO_SLEEP | IM_ACID | IM_ELEC | IM_COLD | SUSCEP_POIS | IM_FIRE |
+S:1_IN_5 |
+S:BLINK | TELE_TO | TELE_AWAY | TPORT
+D:He is a descendant of Beorn to the 3.79th degree (his mother was
+D:Swedish, hence his name). He has blue eyes, bleached blond hair,
+D:and a tanned complexion. He signed up at the Adventurer's Guild
+D:because he thought the advertised position was "Surfer". He thinks
+D:you're the one responsible for tricking him.
+
+# New monster added by furiosity for the Theme module
+N:490:Vaire, the Weaver
+G:A:W
+I:200:440d100:255:1000:0
+W:0:50:0:0
+E:0:0:0:0:0:0
+O:0:0:0:0
+F:BASEANGBAND | WILD_ONLY | FORCE_DEPTH | WILD_TOWN |
+F:WILD_GRASS | WILD_MOUNTAIN | WILD_WOOD | WILD_SHORE |
+F:UNIQUE | FEMALE | FORCE_MAXHP | HAS_LITE | POWERFUL |
+F:NO_THEFT | CAN_FLY | NO_CUT | DEATH_ORB | CAN_SPEAK |
+F:WYRM_PROTECT | DG_CURSE | GOOD | SMART | NEUTRAL | NO_TARGET | NEVER_MOVE |
+F:RES_NETH | NEVER_BLOW | REFLECTING | WEIRD_MIND | NO_DEATH |
+F:REGENERATE | IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS |
+F:RES_TELE | RES_WATE | RES_PLAS | RES_NEXU | RES_DISE |
+F:NO_FEAR | NO_STUN | NO_CONF | NO_SLEEP | CAN_SWIM | AQUATIC |
+S:1_IN_1
+S:HAND_DOOM | BR_MANA | HAND_DOOM | BR_MANA | HAND_DOOM
+D:A Queen of the Valar, the spouse of Mandos, who weaves the
+D:tales of the history of Arda.
+
+N:491:Half-troll
+G:T:U
+I:110:25d14:20:50:50
+W:34:2:3000:400
+E:1:1:1:2:1:1
+O:20:80:0:0
+B:CLAW:HURT:1d5
+B:CLAW:HURT:1d5
+B:BITE:HURT:2d6
+B:BITE:HURT:2d6
+F:MALE |
+F:FRIENDS |
+F:ONLY_ITEM | DROP_90 | DROP_SKELETON | DROP_CORPSE |
+F:OPEN_DOOR | BASH_DOOR | REGENERATE |
+F:EVIL | TROLL | IM_POIS | BASEANGBAND
+D:An unwholesome breed between a human and a troll. It is
+D:somewhat smarter than regular trolls.
+
+# New monster added by furiosity for the Theme module
+N:492:Irmo of Lorien
+G:A:g
+I:200:440d100:255:1000:0
+W:0:50:0:0
+E:0:0:0:0:0:0
+O:0:0:0:0
+F:BASEANGBAND | WILD_ONLY | FORCE_DEPTH | WILD_TOWN |
+F:WILD_GRASS | WILD_MOUNTAIN | WILD_WOOD | WILD_SHORE |
+F:UNIQUE | MALE | FORCE_MAXHP | HAS_LITE | POWERFUL |
+F:NO_THEFT | CAN_FLY | NO_CUT | DEATH_ORB | CAN_SPEAK |
+F:WYRM_PROTECT | DG_CURSE | GOOD | SMART | NEUTRAL | NO_TARGET | NEVER_MOVE |
+F:RES_NETH | NEVER_BLOW | REFLECTING | WEIRD_MIND | NO_DEATH |
+F:REGENERATE | IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS |
+F:RES_TELE | RES_WATE | RES_PLAS | RES_NEXU | RES_DISE |
+F:NO_FEAR | NO_STUN | NO_CONF | NO_SLEEP | CAN_SWIM | AQUATIC |
+S:1_IN_1
+S:HAND_DOOM | BR_MANA | HAND_DOOM | BR_MANA | HAND_DOOM
+D:A Vala more commonly called Lorien, from the gardens of
+D:Lorien in Valinor.
+
+
+N:493:Bert the Stone Troll
+G:T:W
+I:120:11d100:20:70:50
+W:34:7:5000:2000
+E:1:1:1:2:1:1
+O:0:100:0:0
+B:HIT:HURT:6d6
+B:HIT:HURT:6d6
+B:BITE:HURT:3d10
+F:UNIQUE | MALE |
+F:FORCE_MAXHP |
+F:ESCORT | SPECIAL_GENE | MOVE_BODY | REGENERATE |
+F:ONLY_ITEM | DROP_1D2 | DROP_GOOD | WILD_TOO | WILD_WOOD |
+F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | DROP_SKELETON | DROP_CORPSE |
+F:EVIL | TROLL | IM_COLD | IM_POIS | HURT_LITE | HURT_ROCK | BASEANGBAND | NO_CUT
+D:Big, brawny, powerful and with a taste for hobbit. He has friends called
+D:Bill and Tom.
+
+N:494:Bill the Stone Troll
+G:T:W
+I:120:11d100:20:70:50
+W:34:7:5000:2000
+E:1:1:1:2:1:1
+O:0:100:0:0
+B:HIT:HURT:6d6
+B:HIT:HURT:6d6
+B:BITE:HURT:3d10
+F:UNIQUE | MALE |
+F:FORCE_MAXHP |
+F:ESCORT | SPECIAL_GENE | MOVE_BODY | REGENERATE |
+F:ONLY_ITEM | DROP_1D2 | DROP_GOOD | WILD_TOO | WILD_WOOD |
+F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | DROP_SKELETON | DROP_CORPSE
+F:EVIL | TROLL | IM_COLD | IM_POIS | HURT_LITE | HURT_ROCK | BASEANGBAND | NO_CUT
+D:Big, brawny, powerful and with a taste for hobbit. He has friends called
+D:Bert and Tom.
+
+N:495:Tom the Stone Troll
+G:T:W
+I:120:11d100:20:70:50
+W:34:7:5000:2000
+E:1:1:1:2:1:1
+O:0:100:0:0
+B:HIT:HURT:6d6
+B:HIT:HURT:6d6
+B:BITE:HURT:3d10
+F:UNIQUE | MALE |
+F:FORCE_MAXHP |
+F:ESCORT | SPECIAL_GENE | MOVE_BODY | REGENERATE |
+F:ONLY_ITEM | DROP_1D2 | DROP_GOOD | WILD_TOO | WILD_WOOD |
+F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | DROP_SKELETON | DROP_CORPSE |
+F:EVIL | TROLL | IM_COLD | IM_POIS | HURT_LITE | HURT_ROCK | BASEANGBAND | NO_CUT
+D:Big, brawny, powerful and with a taste for hobbit. He has friends called
+D:Bert and Bill.
+
+N:496:Cave troll
+G:T:u
+I:110:24d12:20:50:50
+W:33:1:6000:350
+E:1:1:1:2:1:1
+O:20:80:0:0
+B:HIT:HURT:3d5
+B:HIT:HURT:3d5
+B:BITE:HURT:1d8
+B:BITE:HURT:1d8
+F:MALE |
+F:FRIENDS | DROP_60 | DROP_SKELETON | DROP_CORPSE |
+F:OPEN_DOOR | BASH_DOOR | SUSCEP_FIRE | REGENERATE |
+F:EVIL | TROLL | IM_POIS | HURT_LITE | BASEANGBAND
+D:Trolls were created by Morgoth in mockery of the Ents.
+D:He is a vicious monster, feared for his ferocity.
+
+# New monster added by furiosity for the Theme module
+N:497:Este, the Gentle
+G:A:B
+I:200:440d100:255:1000:0
+W:0:50:0:0
+E:0:0:0:0:0:0
+O:0:0:0:0
+F:BASEANGBAND | WILD_ONLY | FORCE_DEPTH | WILD_TOWN |
+F:WILD_GRASS | WILD_MOUNTAIN | WILD_WOOD | WILD_SHORE |
+F:UNIQUE | FEMALE | FORCE_MAXHP | HAS_LITE | POWERFUL |
+F:NO_THEFT | CAN_FLY | NO_CUT | DEATH_ORB | CAN_SPEAK |
+F:WYRM_PROTECT | DG_CURSE | GOOD | SMART | NEUTRAL | NO_TARGET | NEVER_MOVE |
+F:RES_NETH | NEVER_BLOW | REFLECTING | WEIRD_MIND | NO_DEATH |
+F:REGENERATE | IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS |
+F:RES_TELE | RES_WATE | RES_PLAS | RES_NEXU | RES_DISE |
+F:NO_FEAR | NO_STUN | NO_CONF | NO_SLEEP | CAN_SWIM | AQUATIC |
+S:1_IN_1
+S:HAND_DOOM | BR_MANA | HAND_DOOM | BR_MANA | HAND_DOOM
+D:A lady of the Valar, the spouse of Irmo.
+
+# New monster added by furiosity for the Theme module
+#N:498:Nienna, the Sorrowful
+#G:A:D
+#I:200:440d100:255:1000:0
+#W:0:50:0:0
+#E:0:0:0:0:0:0
+#O:0:0:0:0
+#F:BASEANGBAND | WILD_ONLY | FORCE_DEPTH | WILD_TOWN |
+#F:WILD_GRASS | WILD_MOUNTAIN | WILD_WOOD | WILD_SHORE |
+#F:UNIQUE | FEMALE | FORCE_MAXHP | HAS_LITE | POWERFUL |
+#F:NO_THEFT | CAN_FLY | NO_CUT | DEATH_ORB | CAN_SPEAK |
+#F:WYRM_PROTECT | DG_CURSE | GOOD | SMART | NEUTRAL | NO_TARGET | NEVER_MOVE |
+#F:RES_NETH | NEVER_BLOW | REFLECTING | WEIRD_MIND | NO_DEATH |
+#F:REGENERATE | IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS |
+#F:RES_TELE | RES_WATE | RES_PLAS | RES_NEXU | RES_DISE |
+#F:NO_FEAR | NO_STUN | NO_CONF | NO_SLEEP | CAN_SWIM | AQUATIC |
+#S:1_IN_1
+#S:HAND_DOOM | BR_MANA | HAND_DOOM | BR_MANA | HAND_DOOM
+#D:A Queen of the Valar, the sister of Namo and Irmo, who dwells
+#D:alone on the western borders of the World. Nienna ranks as one of
+#D:the eight Aratar, the most powerful of the Valar. Grief and mourning
+#D:are Nienna's province; she weeps for the suffering of Arda. She teaches
+#D:pity and endurance; she often goes to the halls of Mandos to comfort
+#D:and counsel those in the Halls of Waiting. The Maia Olorin was her
+#D:student and learned much from her.
+
+N:499:Barrow wight
+G:W:B
+I:110:15d10:20:40:10
+W:33:3:0:375
+E:0:0:0:0:0:0
+O:0:50:50:0
+B:HIT:HURT:1d8
+B:HIT:HURT:1d8
+B:TOUCH:EXP_40
+F:FORCE_SLEEP | FRIENDS | DROP_60 |
+F:COLD_BLOOD | OPEN_DOOR | BASH_DOOR | CAN_FLY |
+F:EVIL | UNDEAD | IM_COLD | IM_POIS | HURT_LITE |
+F:NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT
+S:1_IN_8 |
+S:HOLD | SCARE | CAUSE_2 | DARKNESS
+D:An evil spirit sent to dwell in the Barrow-downs by the Witch-king
+D:of Angmar during his wars with Arnor.
+
+N:500:Skeleton ettin
+G:s:W
+I:110:45d10:20:50:20
+W:33:1:7000:325
+E:1:1:1:2:2:1
+O:0:0:0:0
+B:HIT:HURT:1d9
+B:HIT:HURT:1d9
+B:BITE:HURT:1d5
+B:BITE:HURT:1d5
+F:FORCE_MAXHP |
+F:EMPTY_MIND | COLD_BLOOD | OPEN_DOOR | BASH_DOOR |
+F:EVIL | TROLL | UNDEAD |
+F:IM_COLD | IM_POIS |
+F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT
+D:It is the animated skeleton of a massive two-headed troll.
+
+N:501:Chaos drake
+G:d:v
+I:110:50d10:20:70:70
+W:33:3:18000:1400
+E:0:1:0:6:1:0
+O:50:50:0:0
+B:CLAW:HURT:2d4
+B:CLAW:HURT:2d4
+B:BITE:HURT:3d6
+F:ATTR_MULTI | ATTR_ANY | CAN_FLY |
+F:FORCE_SLEEP | FORCE_MAXHP |
+F:ONLY_ITEM | DROP_3D2 | RES_DISE |
+F:OPEN_DOOR | BASH_DOOR | DROP_CORPSE |
+F:EVIL | DRAGON |
+F:IM_FIRE | NO_CONF | NO_SLEEP | BASEANGBAND | HAS_LITE
+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.
+
+N:502:Law drake
+G:d:B
+I:110:50d10:20:70:70
+W:33:3:18000:1400
+E:0:1:0:6:1:0
+O:50:50:0:0
+B:CLAW:HURT:2d4
+B:CLAW:HURT:2d4
+B:BITE:HURT:3d6
+F:FORCE_SLEEP | FORCE_MAXHP |
+F:ONLY_ITEM | DROP_3D2 | CAN_FLY |
+F:OPEN_DOOR | BASH_DOOR | DROP_CORPSE |
+F:DRAGON | EVIL |
+F:IM_COLD | NO_CONF | NO_SLEEP | BASEANGBAND | HAS_LITE | NO_CUT | ATTR_MULTI
+S:1_IN_6 |
+S:SLOW | CONF | SCARE |
+S:BR_SOUN | BR_SHAR
+D:This dragon is clever and cunning. You hear strange humming and
+D:rustling sounds as it approaches.
+
+N:503:Balance drake
+G:d:v
+I:110:60d10:20:70:70
+W:33:3:18000:1600
+E:0:1:0:6:1:0
+O:50:50:0:0
+B:CLAW:HURT:2d4
+B:CLAW:HURT:2d4
+B:BITE:HURT:3d6
+F:FORCE_SLEEP | FORCE_MAXHP |
+F:ONLY_ITEM | DROP_3D2 | RES_DISE |
+F:OPEN_DOOR | BASH_DOOR | DROP_CORPSE
+F:EVIL | DRAGON | CAN_FLY |
+F:IM_FIRE | IM_COLD | NO_CONF | NO_SLEEP | BASEANGBAND | HAS_LITE | NO_CUT
+F:ATTR_MULTI
+S:1_IN_6 |
+S:SLOW | CONF | SCARE |
+S:BR_SOUN | BR_SHAR | BR_DISE | BR_CHAO
+D:A mighty dragon, the balance drake seeks to maintain balance,
+D:and despises your efforts to upset it.
+
+N:504:Ethereal drake
+G:d:o
+I:110:40d10:20:70:70
+W:33:3:0:1200
+E:0:1:0:6:1:0
+O:40:50:10:0
+B:CLAW:HURT:2d4
+B:CLAW:HURT:2d4
+B:BITE:HURT:3d6
+F:FORCE_SLEEP | FORCE_MAXHP |
+F:ONLY_ITEM | DROP_3D2 | CAN_FLY |
+F:INVISIBLE | PASS_WALL |
+F:EVIL | DRAGON | NO_CONF | NO_SLEEP | BASEANGBAND | ATTR_MULTI
+S:1_IN_6 |
+S:SLOW | CONF | SCARE |
+S:BR_LITE | BR_DARK | BR_CONF
+D:A dragon of great power with control over light and dark, the
+D:ethereal drake's eyes glare with white hatred from the shadows.
+
+N:505:Groo, the Wanderer
+G:p:U
+I:120:13d113:20:70:50
+W:35:7:5000:2000
+E:1:1:1:2:1:1
+O:0:100:0:0
+B:HIT:HURT:9d1
+B:HIT:HURT:6d5
+B:HIT:HURT:25d1
+B:HIT:HURT:6d5
+F:UNIQUE | MALE | WEIRD_MIND | CAN_SPEAK |
+F:FORCE_MAXHP | WILD_TOO | DROP_CORPSE |
+F:ONLY_ITEM | DROP_1D2 | DROP_GOOD |
+F:DROP_CHOSEN |
+F:OPEN_DOOR | BASH_DOOR |
+F:IM_COLD | IM_POIS | JOKEANGBAND
+D:He who laughs at Groo's brains will find there is nothing to laugh
+D:about... erm, nobody laughs at Groo and lives.
+
+# New monster added by furiosity for the Theme module
+N:506:Nessa the Lithe
+G:A:b
+I:200:440d100:255:1000:0
+W:0:50:0:0
+E:0:0:0:0:0:0
+O:0:0:0:0
+F:BASEANGBAND | WILD_ONLY | FORCE_DEPTH | WILD_TOWN |
+F:WILD_GRASS | WILD_MOUNTAIN | WILD_WOOD | WILD_SHORE |
+F:UNIQUE | FEMALE | FORCE_MAXHP | HAS_LITE | POWERFUL |
+F:NO_THEFT | CAN_FLY | NO_CUT | DEATH_ORB | CAN_SPEAK |
+F:WYRM_PROTECT | DG_CURSE | GOOD | SMART | NEUTRAL | NO_TARGET | NEVER_MOVE |
+F:RES_NETH | NEVER_BLOW | REFLECTING | WEIRD_MIND | NO_DEATH |
+F:REGENERATE | IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS |
+F:RES_TELE | RES_WATE | RES_PLAS | RES_NEXU | RES_DISE |
+F:NO_FEAR | NO_STUN | NO_CONF | NO_SLEEP | CAN_SWIM | AQUATIC |
+S:1_IN_1
+S:HAND_DOOM | BR_MANA | HAND_DOOM | BR_MANA | HAND_DOOM
+D:The spouse of Tulkas and sister to Orome, who delights in dancing
+D:on the green lawns of Valimar.
+
+N:507:Shade
+G:G:D
+I:120:14d20:20:30:10
+W:33:3:0:350
+E:0:0:0:0:0:0
+O:0:0:100:0
+B:WAIL:TERRIFY
+B:TOUCH:EXP_40
+B:CLAW:LOSE_INT:1d10
+F:FORCE_SLEEP | RAND_25 |
+F:ONLY_ITEM | DROP_90 | DROP_2D2 |
+F:INVISIBLE | COLD_BLOOD | TAKE_ITEM | PASS_WALL |
+F:EVIL | UNDEAD | IM_COLD | IM_POIS | CAN_FLY |
+F:NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT
+S:1_IN_15 |
+S:BLIND | HOLD | DRAIN_MANA | FORGET
+D:A shadowy form clutches at you from the darkness. A powerful undead with
+D:a deadly touch.
+
+N:508:Spectre
+G:G:U
+I:120:14d20:20:30:10
+W:33:3:0:350
+E:0:0:0:0:0:0
+O:0:0:100:0
+B:WAIL:TERRIFY
+B:TOUCH:EXP_40
+B:CLAW:LOSE_WIS:5d5
+F:FORCE_SLEEP | RAND_25 |
+F:ONLY_ITEM | DROP_90 | DROP_2D2 | CAN_FLY |
+F:COLD_BLOOD | TAKE_ITEM | PASS_WALL |
+F:EVIL | UNDEAD | IM_COLD | IM_POIS |
+F:NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT
+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.
+
+N:509:Water troll
+G:T:B
+I:110:36d10:20:50:50
+W:35:1:4000:420
+E:1:1:1:2:1:1
+O:0:100:0:0
+B:HIT:HURT:1d9
+B:HIT:HURT:1d9
+B:HIT:HURT:2d2
+B:HIT:HURT:2d2
+F:MALE | WILD_TOO | WILD_SHORE | WILD_SWAMP |
+F:FORCE_MAXHP | DROP_SKELETON | DROP_CORPSE |
+F:FRIENDS | DROP_60 | REGENERATE |
+F:OPEN_DOOR | BASH_DOOR | CAN_SWIM |
+F:EVIL | TROLL | IM_COLD | IM_POIS | HURT_LITE | BASEANGBAND
+D:Trolls are said to have been created by Melkor in mockery of
+D:the Ents. He reeks of brackish water and mud.
+
+N:510:Fire elemental
+G:E:r
+I:110:30d8:12:50:50
+W:33:2:0:350
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:HIT:FIRE:4d6
+B:HIT:FIRE:4d6
+F:FORCE_SLEEP | RAND_25 |
+F:EMPTY_MIND | CAN_FLY | WILD_TOO | WILD_VOLCANO |
+F:KILL_ITEM | KILL_BODY | BASH_DOOR | POWERFUL | AURA_FIRE |
+F:IM_FIRE | IM_POIS | IM_ELEC | IM_ACID |
+F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | HAS_LITE | NO_CUT
+S:1_IN_6 |
+S:BO_FIRE
+D:It is a towering inferno of flames.
+
+# New monster added by furiosity for the Theme module
+#N:511:Orome, the Huntsman of the Valar
+#G:A:G
+#I:200:440d100:255:1000:0
+#W:0:50:0:0
+#E:0:0:0:0:0:0
+#O:0:0:0:0
+#F:BASEANGBAND | WILD_ONLY | FORCE_DEPTH | WILD_TOWN |
+#F:WILD_GRASS | WILD_MOUNTAIN | WILD_WOOD | WILD_SHORE |
+#F:UNIQUE | MALE | FORCE_MAXHP | HAS_LITE | POWERFUL |
+#F:NO_THEFT | CAN_FLY | NO_CUT | DEATH_ORB | CAN_SPEAK |
+#F:WYRM_PROTECT | DG_CURSE | GOOD | SMART | NEUTRAL | NO_TARGET | NEVER_MOVE |
+#F:RES_NETH | NEVER_BLOW | REFLECTING | WEIRD_MIND | NO_DEATH |
+#F:REGENERATE | IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS |
+#F:RES_TELE | RES_WATE | RES_PLAS | RES_NEXU | RES_DISE |
+#F:NO_FEAR | NO_STUN | NO_CONF | NO_SLEEP | CAN_SWIM | AQUATIC |
+#S:1_IN_1
+#S:HAND_DOOM | BR_MANA | HAND_DOOM | BR_MANA | HAND_DOOM
+#D:The brother of Nessa and one of the eight Aratar. In ancient times,
+#D:he rode often in the forests of Middle-earth, and it was he who first
+#D:discovered the Eldar at Cuivienen.
+
+N:512:Water elemental
+G:E:b
+I:110:25d8:12:40:50
+W:33:2:0:325
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:HIT:HURT:1d10
+B:HIT:HURT:1d10
+B:HIT:HURT:1d10
+F:FORCE_SLEEP | RAND_25 |
+F:EMPTY_MIND | COLD_BLOOD | CAN_FLY |
+F:KILL_BODY | KILL_ITEM | BASH_DOOR | POWERFUL |
+F:IM_POIS | IM_ACID | IM_FIRE | IM_COLD |
+F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT
+S:1_IN_6 |
+S:BO_COLD
+D:It is a towering tempest of water.
+
+N:513:Multi-hued hound
+G:Z:v
+I:110:30d10:25:40:0
+W:33:3:600:600
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:CLAW:HURT:2d8
+B:CLAW:HURT:2d8
+B:BITE:HURT:4d4
+B:BITE:HURT:4d4
+F:FORCE_SLEEP |
+F:FRIENDS |
+F:BASH_DOOR | ATTR_MULTI | DROP_SKELETON | DROP_CORPSE |
+F:ANIMAL | NO_CONF | NO_SLEEP |
+F:IM_ELEC | IM_POIS | IM_ACID | IM_FIRE | IM_COLD |
+F:MORTAL | BASEANGBAND | HAS_LITE
+S:1_IN_5 |
+S:BR_ACID | BR_POIS | BR_COLD | BR_FIRE | BR_ELEC
+D:Shimmering in rainbow hues, this hound is beautiful and deadly.
+
+N:514:Invisible stalker
+G:E:y
+I:130:19d12:20:46:20
+W:35:3:0:300
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:HIT:HURT:1d6
+B:HIT:HURT:1d6
+B:HIT:HURT:1d6
+F:RAND_50 |
+F:RES_TELE |
+F:EMPTY_MIND | INVISIBLE | COLD_BLOOD |
+F:OPEN_DOOR | BASH_DOOR | POWERFUL |
+F:EVIL | IM_ELEC | IM_POIS |
+F:NO_CONF | NO_SLEEP | NO_FEAR | NONLIVING
+F:BASEANGBAND | NO_CUT
+D:It is impossible to define its form but its violence is legendary.
+
+# New monster added by furiosity for the Theme module
+N:515:Vana, the Ever-young
+G:A:y
+I:200:440d100:255:1000:0
+W:0:50:0:0
+E:0:0:0:0:0:0
+O:0:0:0:0
+F:BASEANGBAND | WILD_ONLY | FORCE_DEPTH | WILD_TOWN |
+F:WILD_GRASS | WILD_MOUNTAIN | WILD_WOOD | WILD_SHORE |
+F:UNIQUE | FEMALE | FORCE_MAXHP | HAS_LITE | POWERFUL |
+F:NO_THEFT | CAN_FLY | NO_CUT | DEATH_ORB | CAN_SPEAK |
+F:WYRM_PROTECT | DG_CURSE | GOOD | SMART | NEUTRAL | NO_TARGET | NEVER_MOVE |
+F:RES_NETH | NEVER_BLOW | REFLECTING | WEIRD_MIND | NO_DEATH |
+F:REGENERATE | IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS |
+F:RES_TELE | RES_WATE | RES_PLAS | RES_NEXU | RES_DISE |
+F:NO_FEAR | NO_STUN | NO_CONF | NO_SLEEP | CAN_SWIM | AQUATIC |
+S:1_IN_1
+S:HAND_DOOM | BR_MANA | HAND_DOOM | BR_MANA | HAND_DOOM
+D:The sister of Yavanna and spouse of Orome.
+D:Flowers open and birds sing at her passing.
+
+N:516:Master thief
+G:p:b
+I:130:18d10:20:30:40
+W:34:2:1300:350
+E:1:1:1:2:1:1
+O:90:10:0:0
+B:HIT:HURT:2d8
+B:HIT:HURT:3d4
+B:HIT:EAT_GOLD:4d4
+B:HIT:EAT_ITEM:4d5
+F:MALE |
+F:DROP_90 | DROP_2D2 | DROP_SKELETON | DROP_CORPSE |
+F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR |
+F:EVIL | MORTAL | BASEANGBAND | HAS_LITE
+S:1_IN_6
+S:TRAPS | ARROW_2 | BLINK
+D:Cool and confident, fast and lithe; protect your possessions quickly!
+
+N:517:The Watcher in the Water
+G:~:v
+I:120:27d100:30:100:80
+W:45:3:7000:12000
+E:3:0:3:6:1:0
+O:50:50:0:0
+B:CRUSH:ACID:8d8
+B:CRUSH:POISON:8d8
+B:CRUSH:PARALYZE:8d8
+F:UNIQUE | FORCE_SLEEP | FORCE_MAXHP | CAN_SWIM | AQUATIC | ANIMAL |
+F:IM_ACID | IM_COLD | IM_POIS | RES_WATE | RES_TELE | DROP_CORPSE |
+F:NO_CONF | NO_FEAR | EVIL | COLD_BLOOD | BASEANGBAND |
+F:ONLY_ITEM | DROP_GOOD | DROP_4D2 | DROP_1D2 | SPECIAL_GENE | DROP_RANDART
+S:1_IN_5 | BA_WATE | BO_WATE | HOLD | BR_POIS | BO_ICEE | TELE_TO
+D:A vile creature which seems to consist mostly of tentacles, it seeks to
+D:drag people to their doom in the water. Few have ever escaped its grasp.
+
+N:518:Lich
+G:L:o
+I:110:30d10:20:60:60
+W:34:2:0:1000
+E:1:1:1:2:1:1
+O:0:10:90:0
+B:TOUCH:EXP_40
+B:TOUCH:UN_POWER
+B:TOUCH:LOSE_DEX:2d8
+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 | BASEANGBAND | NO_CUT
+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 vast evil power.
+
+N:519:Gas spore
+G:e:g
+I:110:25d10:30:1:5
+W:34:4:0:100
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:EXPLODE:DISEASE:30d2
+F:FORCE_SLEEP |
+F:STUPID | EMPTY_MIND | CAN_FLY |
+F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT
+D:It does not look dangerous, yet you don't want to get
+D:any closer.
+
+N:520:Master vampire
+G:V:g
+I:110:34d20:20:60:10
+W:36:1:1600:750
+E:1:1:1:2:1:1
+O:20:40:30:0
+B:HIT:HURT:2d6
+B:HIT:HURT:2d6
+B:BITE:EXP_40:3d6
+B:BITE:EXP_40:3d6
+F:FORCE_SLEEP | FORCE_MAXHP |
+F:DROP_4D2 |
+F:COLD_BLOOD | OPEN_DOOR | BASH_DOOR | REGENERATE | CAN_FLY |
+F:EVIL | UNDEAD | IM_COLD | IM_POIS | HURT_LITE | NO_CONF | NO_SLEEP |
+F:BASEANGBAND | NO_CUT
+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.
+
+N:521:Oriental vampire
+G:V:s
+I:110:30d30:20:60:10
+W:40:3:0:750
+E:1:1:1:2:1:1
+O:10:45:35:0
+B:HIT:HURT:3d6
+B:HIT:HURT:3d6
+B:BITE:EXP_40:3d6
+B:BITE:EXP_40:3d6
+F:FORCE_SLEEP | FORCE_MAXHP |
+F:DROP_4D2 | CAN_FLY |
+F:COLD_BLOOD | OPEN_DOOR | BASH_DOOR | REGENERATE | INVISIBLE | PASS_WALL |
+F:EVIL | UNDEAD | IM_COLD | IM_POIS | HURT_LITE | NO_CONF | NO_SLEEP | RES_TELE |
+F:BASEANGBAND | NO_CUT
+S:1_IN_6 |
+S:TELE_TO | HOLD | CONF | SCARE | CAUSE_3 | MIND_BLAST | FORGET |
+S:DARKNESS | BO_NETH
+D:This ancient creature can transform into a mist at will.
+
+N:522:Greater mummy
+G:z:y
+I:110:34d10:30:68:255
+W:36:3:0:800
+E:1:1:1:2:1:1
+O:50:50:0:0
+B:CLAW:LOSE_CON:3d6
+B:CLAW:DISEASE:3d6
+B:GAZE:EXP_40:3d4
+B:GAZE:TERRIFY:3d4
+F:FORCE_SLEEP | FORCE_MAXHP | NO_FEAR | EVIL | UNDEAD |COLD_BLOOD |
+F:ONLY_ITEM | DROP_1D2 | DROP_2D2 | RES_TELE |
+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 | BASEANGBAND | NO_CUT
+S:1_IN_3 |
+S:HEAL | HASTE | BLIND | SCARE | S_UNDEAD | ANIM_DEAD |
+S:BA_POIS | BA_NETH | BA_COLD | DRAIN_MANA |
+S:MIND_BLAST | CAUSE_3 | DARKNESS | FORGET
+D:Once a powerful ruler, now an even more powerful undead menace.
+
+# New monster added for the Theme module
+# From T-Plus module by Ingeborg S. Norden
+
+N:523:Ingeborg, the Runemistress
+G:p:y
+I:155:180d75:111:175:0
+W:127:7:1600:444444
+E:2:1:2:6:1:1
+O:20:20:20:20
+B:GAZE:EAT_GOLD:10d10
+B:CRUSH:HURT:10d10
+B:TOUCH:UN_BONUS
+B:TOUCH:UN_POWER
+F:UNIQUE | CAN_SPEAK | ATTR_MULTI | ATTR_ANY | FEMALE |
+F:FORCE_MAXHP | WEIRD_MIND | DROP_CORPSE | DROP_SKELETON |
+F:REFLECTING | AURA_FIRE | AURA_ELEC | AURA_COLD |
+F:ONLY_ITEM | DROP_1D2 | DROP_2D2 | DROP_3D2 | DROP_4D2 |
+F:DROP_GOOD | DROP_GREAT | INVISIBLE |
+F:SMART | MOVE_BODY | TAKE_ITEM | POWERFUL | RES_TELE |
+F:REGENERATE | CAN_FLY | CAN_SWIM | DG_CURSE | WYRM_PROTECT |
+F:GOOD | IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS |
+F:RES_PLAS | RES_DISE | RES_NETH | RES_NEXU | RES_WATE |
+F:NO_CONF | NO_FEAR | NO_SLEEP | NO_STUN | RES_TELE
+F:MORTAL | PET | JOKEANGBAND | HAS_LITE
+S:1_IN_2 |
+S:S_BUG | S_HI_DRAGON | S_KIN | S_RNG | S_UNIQUE |
+S:TELE_AWAY | TELE_LEVEL | TELE_TO | TPORT |
+S:HAND_DOOM | HEAL |
+S:BO_ICEE | BO_MANA | BO_PLAS |
+S:BA_COLD | BA_MANA | BA_WATE | ROCKET |
+S:BR_LITE | BR_DISE | BR_INER | BR_MANA | BR_NEXU | BR_SOUN | BR_TIME |
+S:BRAIN_SMASH | FORGET |
+D:A heavy-set, fair-haired figure who cruises through the dungeon in
+D:a strangely made magical cart of some kind. Wherever she travels,
+D:monsters and magical devices appear which no one on Arda has seen
+D:before. Rumor has it that she's planning to foil the Dark Lord
+D:by reshaping the entire world, and traveling through time to ensure
+D:that NO Rings of Power ever get forged.
+
+N:524:Giant grey scorpion
+G:S:s
+I:120:18d20:12:50:40
+W:34:4:1200:275
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:BITE:HURT:1d6
+B:STING:POISON:1d4
+F:WEIRD_MIND | BASH_DOOR | WILD_TOO | DROP_SKELETON |
+F:ANIMAL
+F:MORTAL | BASEANGBAND
+D:It is a giant grey scorpion. It looks poisonous.
+
+N:525:Earth elemental
+G:E:u
+I:100:30d10:10:60:90
+W:34:2:0:375
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:HIT:HURT:4d6
+B:HIT:HURT:4d6
+B:HIT:HURT:4d6
+F:FORCE_SLEEP |
+F:EMPTY_MIND | COLD_BLOOD |
+F:KILL_ITEM | KILL_BODY | PASS_WALL | POWERFUL |
+F:IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | HURT_ROCK |
+F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT
+S:1_IN_8 |
+S:BO_ACID
+D:It is a towering form composed of rock with fists of awesome power.
+
+N:526:Air elemental
+G:E:B
+I:120:30d5:12:50:50
+W:34:2:0:390
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:HIT:HURT:1d10
+B:HIT:CONFUSE:1d4
+B:HIT:HURT:1d10
+F:FORCE_SLEEP | RAND_25 |
+F:EMPTY_MIND | COLD_BLOOD | CAN_FLY |
+F:KILL_BODY | KILL_ITEM | BASH_DOOR | POWERFUL |
+F:IM_ACID | IM_COLD | IM_ELEC | IM_POIS |
+F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT
+S:1_IN_8 |
+S:BO_ELEC
+D:It is a towering tornado of winds.
+
+N:527:Shimmering mold
+G:m:b
+I:110:32d8:2:24:70
+W:27:1:0:140
+B:SPORE:ELEC:5d4
+B:SPORE:ELEC:5d4
+F:NEVER_MOVE |
+F:STUPID | EMPTY_MIND |
+F:IM_ELEC | IM_POIS | CAN_SWIM |
+F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT
+D:It is a strange growth on the dungeon floor, glowing and crackling with sparks.
+
+N:528:Sarnrog
+G:u:s
+I:110:18d12:10:50:15
+W:34:2:3000:110
+E:1:1:1:2:1:1
+O:0:0:0:0
+B:CLAW:HURT:2d6
+B:CLAW:HURT:2d6
+B:BITE:HURT:1d6
+F:DROP_60 | ONLY_GOLD | EVIL | DEMON | FRIENDS | HURT_LITE |
+F:WILD_TOO | WILD_MOUNTAIN | WILD_WASTE |
+F:IM_POIS | IM_FIRE | IM_COLD | IM_ELEC | HURT_ROCK | NONLIVING |
+F:BASEANGBAND | NO_CUT
+S:1_IN_12
+S:BR_ELEC | BR_FIRE
+D:A minor demonic servant of evil, it looks like it is made of stone.
+
+N:529:Malicious leprawn
+G:l:v
+I:120:4d5:8:13:8
+W:35:4:1200:85
+E:1:1:1:2:1:1
+O:0:0:0:0
+B:TOUCH:EAT_GOLD
+B:TOUCH:EAT_ITEM
+F:INVISIBLE | RAND_25 | TAKE_ITEM | COLD_BLOOD |
+F:HURT_LITE | EVIL | OPEN_DOOR | MALE |
+F:MORTAL | BASEANGBAND
+S:MULTIPLY |
+S:1_IN_6 |
+S:BLINK | TPORT | TELE_TO | CAUSE_1
+D:This little gnome has a fiendish gleam in his eyes.
+
+N:530:Eog golem
+G:g:u
+I:100:100d20:12:125:10
+W:34:4:12000:1200
+E:1:1:1:2:1:1
+O:0:0:0:0
+B:HIT:HURT:8d6
+B:HIT:HURT:8d6
+B:HIT:HURT:6d6
+B:HIT:HURT:6d6
+F:ONLY_GOLD | DROP_2D2 |
+F:EMPTY_MIND | COLD_BLOOD | BASH_DOOR | REFLECTING |
+F:IM_FIRE | IM_COLD | IM_ELEC | IM_POIS |
+F:NO_CONF | NO_SLEEP | NO_FEAR | NONLIVING | BASEANGBAND | NO_CUT
+D:It is a massive deep brown statue, striding towards you with an
+D:all-too-familiar purpose.
+
+# New monster added by furiosity for the Theme module
+# Based on actual character's stats
+
+N:531:Lindal Lossehelin
+G:h:R
+I:123:8d80:4:105:0
+W:49:3:970:2000
+E:1:1:1:2:1:1
+O:25:25:25:25
+B:HIT:HURT:10d8
+B:HIT:HURT:10d8
+# Wearing a Greater Mimic for a symbiote
+B:HIT:POISON:3d4
+B:HIT:POISON:3d4
+F:JOKEANGBAND | WILD_TOO | WILD_WOOD | WILD_GRASS |
+F:UNIQUE | MALE | GOOD | DROP_CORPSE | SMART | PET |
+F:OPEN_DOOR | BASH_DOOR | MORTAL | HAS_LITE | CAN_SWIM |
+F:CAN_SPEAK | DROP_4D2 | DROP_GREAT | FORCE_MAXHP |
+F:NO_SLEEP | NO_CONF | NO_CUT | RES_NEXU | MOVE_BODY |
+F:IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS |
+F:RES_NETH | RES_DISE | AURA_FIRE | CAN_FLY |
+#Spells chez archery
+S:1_IN_3
+S:ARROW_1 | ARROW_2 | ARROW_3 | ARROW_4 |
+#Spells chez a Greater Mimic named Glorp
+S:CAUSE_3 | BO_ACID | BO_ELEC | BO_FIRE | BO_COLD |
+S:SCARE | BLIND | CONF | FORGET | S_MONSTER
+D:An elf cloaked in green wielding a crossbow. He has sky blue
+D:eyes, straight black hair, and a fair face. He is the only
+D:child of a Telerin mage, and serves in King Thranduil's army.
+D:He has been sent on a quest by a strange wizard, and his
+D:aims are not so different from your own.
+
+N:532:Variag
+G:p:r
+I:120:13d25:20:70:10
+W:35:4:1600:500
+E:1:1:1:2:1:1
+O:0:100:0:0
+B:HIT:POISON:3d4
+B:HIT:LOSE_STR:3d4
+B:HIT:LOSE_STR:3d4
+B:HIT:POISON:3d4
+F:MALE |
+F:DROP_1D2 |
+F:OPEN_DOOR | BASH_DOOR | DROP_SKELETON | DROP_CORPSE |
+F:EVIL | NO_CONF | NO_SLEEP |
+F:MORTAL | BASEANGBAND | HAS_LITE
+D:A human warrior from Khand, moving with lightning speed.
+
+N:533:Headless ghost
+G:G:u
+I:120:20d25:20:30:10
+W:35:3:0:550
+E:0:0:0:0:0:0
+O:35:25:25:0
+B:TOUCH:TERRIFY
+B:TOUCH:EXP_40
+B:CLAW:LOSE_INT:5d5
+B:CLAW:LOSE_WIS:5d5
+F:FORCE_SLEEP | RAND_25 |
+F:ONLY_ITEM | DROP_90 | DROP_2D2 | CAN_FLY |
+F:COLD_BLOOD | TAKE_ITEM | PASS_WALL |
+F:EVIL | UNDEAD | IM_COLD | IM_POIS |
+F:NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT
+S:1_IN_15 |
+S:BLIND | DRAIN_MANA | SCARE | BO_COLD | FORGET
+D:A phantasmal apparition with no head.
+
+N:534:Dread
+G:G:o
+I:120:25d20:20:30:10
+W:35:2:0:600
+E:0:0:0:0:0:0
+O:0:50:50:0
+B:HIT:HURT:6d6
+B:HIT:HURT:6d6
+B:HIT:LOSE_STR:3d4
+F:FORCE_SLEEP | RAND_25 |
+F:ONLY_ITEM | DROP_60 | DROP_2D2 |
+F:TAKE_ITEM | INVISIBLE | COLD_BLOOD | PASS_WALL |
+F:EVIL | UNDEAD | IM_COLD | IM_POIS | CAN_FLY |
+F:NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT
+S:1_IN_15 |
+S:BLIND | HOLD | CONF | DRAIN_MANA | BO_NETH
+D:Death incarnate, its hideous black body seems to struggle
+D:against reality as the universe itself struggles to banish it.
+
+# New monster added by furiosity for the Theme module
+# Based on character dump current as of May 7, 2004
+# http://www.killerbunnies.org/angband/ladder/zizzo/zizzo_15.html
+N:535:Zizzo, Last of the Yeeks
+G:y:G
+I:110:5d10:3:35:0
+W:26:3:240:2000
+E:1:1:1:2:1:1
+O:50:0:50:0
+# Poor at combat:
+B:BITE:HURT:1d1
+B:INSULT:*
+B:WAIL:*
+F:JOKEANGBAND | WILD_TOO | WILD_WOOD | WILD_GRASS |
+F:UNIQUE | MALE | GOOD | DROP_CORPSE | SMART | ANIMAL |
+F:OPEN_DOOR | BASH_DOOR | MORTAL | HAS_LITE |
+F:CAN_SPEAK | DROP_4D2 | DROP_GREAT | FORCE_MAXHP |
+F:AI_ANNOY | WEIRD_MIND | TAKE_ITEM | IM_POIS |
+F:IM_ACID | IM_ELEC | IM_FIRE | IM_COLD | POWERFUL |
+S:1_IN_1 |
+# Good at sorcery:
+S:BO_MANA | BO_MANA | BR_ELEC | BR_ACID | BO_MANA |
+S:BR_LITE | BR_WALL | BR_FIRE | BR_COLD | BR_POIS |
+D:He is one of five children of a brown Yeek. He is a credit to the
+D:family. He has dark brown eyes, straight black hair, and a dark
+D:complexion. He has an annoying habit of making strange "zizz" noises,
+D:hence his nickname. He is a sorcerer of some renown, and he thinks
+D:you have just the thing he needs to make it to the next level.
+
+N:536:Gauth
+G:e:s
+I:110:15d20:20:50:20
+W:36:2:1600:600
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:GAZE:UN_BONUS:5d2
+B:GAZE:UN_BONUS:5d2
+B:GAZE:UN_POWER:5d2
+B:GAZE:UN_POWER:5d2
+F:FORCE_SLEEP | FORCE_MAXHP | CAN_FLY | DROP_CORPSE |
+F:BASH_DOOR | EVIL | BASEANGBAND | MORTAL
+S:1_IN_5 |
+S:CAUSE_2 | TELE_AWAY | BA_COLD | BO_ELEC | HOLD | DRAIN_MANA
+D:This six-eyed creature feeds on magic.
+
+N:537:Smoke elemental
+G:E:R
+I:120:15d10:10:80:90
+W:36:3:0:375
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:ENGULF:HURT:2d6
+B:ENGULF:HURT:2d6
+F:FORCE_SLEEP |
+F:EMPTY_MIND |
+F:KILL_ITEM | KILL_BODY | BASH_DOOR | POWERFUL |
+F:IM_FIRE | IM_COLD | IM_ELEC | IM_POIS |
+F:NO_CONF | NO_SLEEP | NO_FEAR | CAN_FLY | BASEANGBAND | NO_CUT
+S:1_IN_5 |
+S:DARKNESS | BO_FIRE
+D:It is a towering blackened form, crackling with heat.
+
+N:538:Olog
+G:T:y
+I:110:42d10:20:50:50
+W:36:1:6000:450
+E:1:1:1:2:1:1
+O:10:90:0:0
+B:HIT:HURT:1d12
+B:HIT:HURT:1d12
+B:BITE:HURT:2d3
+B:BITE:HURT:2d3
+F:FORCE_MAXHP | OPEN_DOOR | FRIENDS | DROP_60 | REGENERATE |
+F:SMART | BASH_DOOR | DROP_SKELETON | DROP_CORPSE |
+F:EVIL | TROLL | IM_POIS | BASEANGBAND
+D:They say Melkor created trolls in mockery of the Ents. This is a
+D:massive troll, more intelligent than most of its kind, with needle-
+D:sharp fangs.
+
+N:539:Halfling slinger
+G:h:U
+I:110:30d9:20:40:30
+W:35:1:900:330
+E:1:1:1:2:1:1
+O:100:0:0:0
+B:HIT:HURT:2d6
+B:HIT:HURT:2d6
+F:FORCE_MAXHP | OPEN_DOOR | FRIENDS | DROP_90 |
+F:SMART | EVIL | IM_POIS | IM_COLD | MALE | DROP_SKELETON | DROP_CORPSE
+F:MORTAL | BASEANGBAND | HAS_LITE
+S:1_IN_3
+S:ARROW_4
+D:A rebel halfling who has rejected the tradition of archery.
+
+N:540:Gravity hound
+G:Z:U
+I:110:35d10:30:30:0
+W:35:2:700:500
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:CLAW:HURT:2d8
+B:CLAW:HURT:2d8
+B:BITE:HURT:2d8
+B:BITE:HURT:2d8
+F:FORCE_SLEEP | FRIENDS | DROP_SKELETON | DROP_CORPSE |
+F:BASH_DOOR |
+F:ANIMAL | NO_CONF | NO_SLEEP |
+F:MORTAL | BASEANGBAND
+S:1_IN_5 |
+S:BR_GRAV
+D:Unfettered by the usual constraints of gravity, these unnatural creatures
+D:are walking on the walls and even the ceiling! The earth suddenly feels
+D:rather less solid as you see gravity warp all round these monsters.
+
+N:541:Acidic cytoplasm
+G:j:B
+I:120:40d10:12:18:1
+W:35:5:3000:180
+E:0:0:0:0:0:0
+O:50:0:50:0
+B:TOUCH:ACID:1d10
+B:TOUCH:ACID:1d10
+B:TOUCH:ACID:1d10
+B:TOUCH:ACID:1d10
+F:FORCE_MAXHP | TAKE_ITEM | COLD_BLOOD |
+F:DROP_1D2 | DROP_4D2 | CAN_SWIM |
+F:STUPID | EMPTY_MIND | OPEN_DOOR | BASH_DOOR |
+F:IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS |
+F:NO_FEAR | NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT
+D:A disgusting animated blob of destruction.
+
+N:542:Inertia hound
+G:Z:W
+I:110:35d10:30:30:0
+W:35:2:700:500
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:CLAW:HURT:2d8
+B:CLAW:HURT:2d8
+B:BITE:HURT:2d8
+B:BITE:HURT:2d8
+F:FORCE_SLEEP | FRIENDS | DROP_SKELETON | DROP_CORPSE |
+F:BASH_DOOR |
+F:ANIMAL | NO_CONF | NO_SLEEP |
+F:MORTAL | BASEANGBAND
+S:1_IN_5 |
+S:BR_INER
+D:Bizarrely, this hound seems to be hardly moving at all, yet it approaches
+D:you with deadly menace. It makes you tired just to look at it.
+
+N:543:Impact hound
+G:Z:u
+I:110:35d10:30:30:0
+W:35:2:700:500
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:CLAW:HURT:2d8
+B:CLAW:HURT:2d8
+B:BITE:HURT:2d8
+B:BITE:HURT:2d8
+F:FORCE_SLEEP |
+F:FRIENDS |
+F:BASH_DOOR | DROP_SKELETON | DROP_CORPSE |
+F:ANIMAL | NO_CONF | NO_SLEEP
+F:MORTAL | BASEANGBAND
+S:1_IN_5 |
+S:BR_WALL
+D:A deep brown shape is visible before you, its canine form strikes you with
+D:an almost physical force. The dungeon floor buckles as if struck by a
+D:powerful blow as it stalks towards you.
+
+N:544:Shardstorm
+G:v:u
+I:120:32d10:40:12:0
+W:37:1:0:800
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:ENGULF:HURT:6d6
+F:FORCE_SLEEP | RAND_50 | NONLIVING | CAN_FLY |
+F:EMPTY_MIND | BASH_DOOR | POWERFUL |
+F:NO_FEAR | NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT
+S:1_IN_4 |
+S:BR_SHAR
+D:A howling blast of razor-sharp mountain fragments.
+
+N:545:Ooze elemental
+G:E:g
+I:110:13d10:10:80:90
+W:36:3:0:300
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:TOUCH:ACID:1d10
+B:TOUCH:ACID:1d10
+B:TOUCH:ACID:1d10
+F:FORCE_SLEEP |
+F:EMPTY_MIND | COLD_BLOOD | WILD_TOO | WILD_SHORE | WILD_SWAMP |
+F:KILL_ITEM | KILL_BODY | BASH_DOOR | POWERFUL |
+F:IM_ACID | IM_FIRE | CAN_SWIM | IM_COLD | IM_POIS |
+F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT
+S:1_IN_5 |
+S:BO_ACID | BA_ACID
+D:It is a towering mass of filth and ooze.
+
+N:546:Young black dragon
+G:d:s
+I:110:30d10:20:60:70
+W:31:1:20000:700
+E:0:1:0:6:1:0
+O:50:50:0:0
+B:CLAW:HURT:2d6
+B:CLAW:HURT:2d6
+B:BITE:HURT:2d8
+F:FORCE_SLEEP | FORCE_MAXHP | WILD_TOO | WILD_SWAMP |
+F:DROP_3D2 | DROP_CORPSE |
+F:OPEN_DOOR | BASH_DOOR | CAN_FLY |
+F:EVIL | DRAGON | IM_ACID | BASEANGBAND | ATTR_MULTI
+S:1_IN_10 |
+S:SCARE |
+S:BR_ACID
+D:It has a form that legends are made of. Its still-tender scales are a
+D:darkest black hue. Acid drips from its body.
+
+N:547:Mumak
+G:q:s
+I:110:90d10:20:55:100
+W:35:3:150000:2100
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:BUTT:HURT:8d6
+B:BUTT:HURT:8d6
+B:CRUSH:HURT:8d4
+F:BASH_DOOR | DROP_CORPSE |
+F:ANIMAL | MORTAL | BASEANGBAND
+D:A massive elephantine form with eyes twisted by madness.
+
+N:548:Giant fire ant
+G:a:R
+I:110:20d10:14:49:40
+W:35:1:700:350
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:BITE:FIRE:3d12
+B:BITE:FIRE:3d12
+F:FORCE_MAXHP | KILL_BODY | FRIENDS | DROP_SKELETON
+F:WEIRD_MIND | BASH_DOOR | SUSCEP_COLD |
+F:ANIMAL | IM_FIRE
+F:MORTAL | BASEANGBAND
+D:A giant ant covered in shaggy fur. Its powerful jaws glow with heat.
+
+N:549:Cold-drake
+G:d:w
+I:110:40d10:20:70:70
+W:34:1:110000:1200
+E:0:1:0:6:1:0
+O:50:50:0:0
+B:CLAW:HURT:2d8
+B:CLAW:HURT:2d8
+B:BITE:HURT:4d8
+F:FORCE_SLEEP | FORCE_MAXHP | DROP_4D2 | DROP_CORPSE |
+F:OPEN_DOOR | BASH_DOOR | CAN_FLY | WILD_TOO | WILD_WASTE | WILD_MOUNTAIN |
+F:EVIL | DRAGON | IM_COLD | NO_CONF | NO_SLEEP | SUSCEP_FIRE | BASEANGBAND |
+F:HAS_LITE | ATTR_MULTI
+S:1_IN_9 |
+S:SCARE |
+S:BR_COLD
+D:A large dragon, scales gleaming bright white.
+
+N:550:Xorn
+G:X:u
+I:110:16d10:20:80:10
+W:36:2:30000:650
+E:0:0:0:3:0:0
+O:0:0:0:0
+B:HIT:HURT:1d6
+B:HIT:HURT:1d6
+B:HIT:HURT:1d6
+B:HIT:HURT:1d6
+F:FORCE_MAXHP |
+F:EMPTY_MIND | COLD_BLOOD |
+F:KILL_ITEM | PASS_WALL |
+F:IM_FIRE | IM_COLD | IM_ELEC | IM_POIS |
+F:HURT_ROCK | NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT
+D:A huge creature of the Earth. Able to merge with its element, it
+D:has four huge arms protruding from its enormous torso.
+
+N:551:Rogrog the Black Troll
+G:T:D
+I:120:15d100:20:70:50
+W:41:5:9000:5000
+E:1:1:1:2:1:1
+O:0:100:0:0
+B:HIT:HURT:6d7
+B:HIT:HURT:6d7
+B:BITE:HURT:4d10
+B:SPIT:ACID:4d8
+F:UNIQUE | MALE |
+F:FORCE_MAXHP |
+F:ESCORT | MOVE_BODY |
+F:ONLY_ITEM | DROP_2D2 | DROP_GOOD | DROP_CORPSE |
+F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | REGENERATE |
+F:EVIL | TROLL | IM_COLD | IM_POIS | BASEANGBAND
+D:Trolls are abominations created by Melkor in mockery of the Ents.
+D:A massive and cruel troll of great power, drool slides caustically down
+D:his muscular frame. Despite his bulk, he strikes with stunning speed.
+
+# New monster added by furiosity for the Theme module
+# Based on character dump as of May 7, 2004
+# http://angband.oook.cz/ladder-show.php?id=2884
+N:552:Erianyth, the Sorceress
+G:A:r
+I:120:40d100:0:130:0
+W:50:7:1830:2000
+E:1:1:1:2:1:1
+O:25:25:25:25
+B:HIT:HURT:5d12
+B:HIT:HURT:5d12
+B:HIT:SHATTER:5d12
+F:JOKEANGBAND | WILD_TOO | WILD_MOUNTAIN | WILD_WASTE |
+F:UNIQUE | FEMALE | GOOD | DROP_CORPSE | SMART |
+F:OPEN_DOOR | BASH_DOOR | HAS_LITE | CAN_SWIM |
+F:CAN_SPEAK | DROP_4D2 | DROP_GREAT | FORCE_MAXHP |
+F:NO_SLEEP | NO_CONF | NO_CUT | RES_NEXU | MOVE_BODY |
+F:IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS |
+F:RES_NETH | RES_DISE | CAN_FLY | NO_FEAR | PASS_WALL |
+F:REFLECTING | REGENERATE | WEIRD_MIND |
+F:KILL_BODY | RES_TELE | INVISIBLE | NO_STUN |
+S:1_IN_4 |
+# Spells chez Thaumaturgy, dead Morgy, and her being Maia:
+S:BR_POIS | ROCKET | SHRIEK | BR_WALL | BR_INER |
+# Spells chez Master Q named 'Fear' (though not all, she *is* Maia):
+S:BLINK | TELE_TO | S_MONSTERS | S_ANIMALS |
+D:A mighty Maia of legend, associated with Vana. In the past, she
+D:dwelt on Middle-earth in the form of a beneficent but unseen force.
+D:She looks like she is a wall. It is rumoured that she has once
+D:destroyed Morgoth Bauglir and is out to banish him from the Void as
+D:well. It is a matter of principle for this sorceress, and you are
+D:blocking her path to justice.
+
+N:553:Phantom
+G:G:v
+I:120:20d25:30:30:20
+W:36:3:0:400
+E:0:0:0:0:0:0
+O:0:0:100:0
+B:TOUCH:EXP_80
+B:TOUCH:EXP_40
+B:CLAW:LOSE_INT:1d10
+B:CLAW:LOSE_WIS:1d10
+F:FORCE_SLEEP |
+F:ONLY_ITEM | DROP_1D2 |
+F:INVISIBLE | COLD_BLOOD | PASS_WALL | CAN_FLY |
+F:EVIL | UNDEAD | IM_COLD | IM_POIS | NO_CONF | NO_SLEEP | BASEANGBAND
+F:NO_CUT
+S:1_IN_5 |
+S:FORGET | MIND_BLAST
+D:An unholy creature of darkness. The aura emanating from this evil being
+D:saps your very soul.
+
+N:554:Grey wraith
+G:W:s
+I:110:19d10:20:50:10
+W:36:1:0:700
+E:0:0:0:0:0:0
+O:0:50:50:0
+B:HIT:HURT:1d10
+B:HIT:HURT:1d10
+B:TOUCH:EXP_40
+F:FORCE_SLEEP | FORCE_MAXHP |
+F:DROP_60 | DROP_90 |
+F:COLD_BLOOD | OPEN_DOOR | BASH_DOOR |
+F:EVIL | UNDEAD | HURT_LITE | IM_COLD | IM_POIS |
+F:NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT
+S:1_IN_7 |
+S:HOLD | SCARE | CAUSE_3 | DARKNESS
+D:A tangible but ghostly form, made of grey fog. The air around it feels
+D:deathly cold.
+
+N:555:Revenant
+G:W:u
+I:110:2d111:20:50:10
+W:36:1:0:725
+E:1:1:1:2:1:1
+O:0:0:100:0
+B:GAZE:PARALYZE
+B:CLAW:LOSE_CON:1d10
+B:CLAW:LOSE_CON:1d10
+B:GAZE:EXP_40
+F:FORCE_SLEEP | FORCE_MAXHP | REGENERATE |
+F:DROP_60 | DROP_90 |
+F:COLD_BLOOD | OPEN_DOOR | BASH_DOOR | MOVE_BODY |
+F:EVIL | UNDEAD | HURT_LITE | IM_COLD | IM_POIS |
+F:NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT
+S:1_IN_7 |
+S:CONF | SCARE | CAUSE_3 | DARKNESS
+D:Back from the grave, to wreak vengeance upon the living. A skeletal figure
+D:wearing a black robe, with eyes that burn with undying hatred.
+
+N:556:Young multi-hued dragon
+G:d:v
+I:110:32d10:20:60:70
+W:32:1:20000:900
+E:0:1:0:6:1:0
+O:50:50:0:0
+B:CLAW:HURT:2d6
+B:CLAW:HURT:2d6
+B:BITE:HURT:3d8
+F:ATTR_MULTI |
+F:FORCE_SLEEP | FORCE_MAXHP | DROP_CORPSE
+F:DROP_1D2 | DROP_3D2 | CAN_FLY |
+F:OPEN_DOOR | BASH_DOOR |
+F:EVIL | DRAGON | IM_ACID | IM_FIRE | IM_COLD | IM_ELEC |
+F:IM_POIS | NO_CONF | NO_SLEEP | BASEANGBAND | HAS_LITE
+S:1_IN_8 |
+S:SCARE |
+S:BR_ACID | BR_FIRE | BR_COLD | BR_ELEC | BR_POIS
+D:It has a form that legends are made of. Beautiful scales of shimmering
+D:and magical colours cover it.
+
+# New monster added by furiosity for the Theme module
+# Based on "Day in the life Of..." forum thread:
+# http://www.t-o-m-e.net/forum/viewtopic.php?t=4377
+N:557:Karrazix the Brave
+G:D:u
+I:120:22d100:5:100:0
+W:29:3:20000:2000
+E:0:1:0:6:1:0
+O:50:50:0:0
+B:CLAW:HURT:10d8
+B:CLAW:HURT:10d8
+B:CLAW:HURT:10d8
+F:JOKEANGBAND | WILD_TOO | WILD_WOOD | WILD_MOUNTAIN |
+F:UNIQUE | FEMALE | CAN_SPEAK | GOOD | DROP_CORPSE |
+F:SMART | PET | OPEN_DOOR | BASH_DOOR | HAS_LITE |
+F:CAN_FLY | DROP_4D2 | DROP_GREAT | FORCE_MAXHP | DRAGON |
+F:NO_SLEEP | NO_CONF | NO_FEAR | MOVE_BODY | POWERFUL |
+F:IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS |
+S:1_IN_4 |
+S:BR_FIRE | BR_COLD | BR_ELEC | BR_ACID | BR_POIS |
+D:She is a small, but fierce dragon - so fierce that in her fury she
+D:appears to be one of the Great Worms. She has turned away from
+D:Morgoth and worships Tulkas Astaldo. She intensely dislikes vampires
+D:in general and Thuringwethil in particular. She has red eyes and
+D:glittering scales.
+
+N:558:Colossus
+G:g:G
+I:110:30d100:15:150:10
+W:36:4:35000:900
+E:1:1:1:2:1:1
+O:0:0:0:0
+B:HIT:HURT:10d10
+B:HIT:HURT:10d10
+B:HIT:HURT:6d6
+B:HIT:HURT:6d6
+F:FORCE_MAXHP |
+F:EMPTY_MIND | COLD_BLOOD | BASH_DOOR |
+F:IM_FIRE | IM_COLD | IM_ELEC |
+F:IM_POIS | NONLIVING | REFLECTING |
+F:NO_CONF | NO_SLEEP | NO_FEAR
+F:MORTAL | BASEANGBAND | NO_CUT
+S:1_IN_8
+S:ARROW_4
+D:An enormous construct resembling a titan made from stone. It strides
+D:purposefully towards you, swinging its slow fists with earth-shattering
+D:power.
+
+N:559:Young gold dragon
+G:d:y
+I:110:30d10:20:60:70
+W:31:1:20000:700
+E:0:1:0:6:1:0
+O:50:50:0:0
+B:CLAW:HURT:2d6
+B:CLAW:HURT:2d6
+B:BITE:HURT:2d8
+F:FORCE_SLEEP | FORCE_MAXHP | CAN_FLY |
+F:DROP_3D2 | DROP_CORPSE |
+F:OPEN_DOOR | BASH_DOOR | WILD_TOO | WILD_MOUNTAIN |
+F:EVIL | DRAGON | BASEANGBAND | NO_STUN | HAS_LITE | ATTR_MULTI
+S:1_IN_10 |
+S:SCARE |
+S:BR_SOUN
+D:It has a form that legends are made of. Its still-tender scales are a
+D:tarnished gold hue, and light is reflected from its form.
+
+N:560:Blue drake
+G:d:b
+I:110:40d10:20:70:70
+W:34:1:110000:1200
+E:0:1:0:6:1:0
+O:50:50:0:0
+B:CLAW:HURT:2d8
+B:CLAW:HURT:2d8
+B:BITE:HURT:4d8
+F:FORCE_SLEEP | FORCE_MAXHP | CAN_FLY |
+F:DROP_4D2 | DROP_CORPSE
+F:BASH_DOOR | WILD_TOO | WILD_MOUNTAIN | WILD_WOOD |
+F:EVIL | DRAGON | IM_ELEC | NO_CONF | NO_SLEEP | BASEANGBAND | HAS_LITE
+F:ATTR_MULTI
+S:1_IN_9 |
+S:SCARE |
+S:BR_ELEC
+D:A large dragon, scales tinted deep blue.
+
+N:561:Green drake
+G:d:g
+I:110:40d10:20:70:70
+W:34:1:110000:1200
+E:0:1:0:6:1:0
+O:50:50:0:0
+B:CLAW:HURT:2d8
+B:CLAW:HURT:2d8
+B:BITE:HURT:4d8
+F:FORCE_SLEEP | FORCE_MAXHP | CAN_FLY |
+F:DROP_4D2 | DROP_CORPSE |
+F:BASH_DOOR | WILD_TOO | WILD_MOUNTAIN | WILD_WOOD |
+F:EVIL | DRAGON | IM_POIS | NO_CONF | NO_SLEEP | BASEANGBAND | HAS_LITE
+F:ATTR_MULTI
+S:1_IN_9 |
+S:SCARE |
+S:BR_POIS
+D:A large dragon, scales tinted deep green.
+
+N:562:Bronze drake
+G:d:U
+I:110:40d10:20:70:70
+W:34:1:110000:1200
+E:0:1:0:6:1:0
+O:50:50:0:0
+B:CLAW:HURT:2d8
+B:CLAW:HURT:2d8
+B:BITE:HURT:4d8
+F:FORCE_SLEEP | FORCE_MAXHP | WILD_TOO | WILD_MOUNTAIN |
+F:DROP_4D2 | CAN_FLY |
+F:BASH_DOOR | DROP_CORPSE |
+F:EVIL | DRAGON | NO_CONF | NO_SLEEP | BASEANGBAND | HAS_LITE | ATTR_MULTI
+S:1_IN_9 |
+S:CONF | SCARE |
+S:BR_CONF
+D:A large dragon with scales of rich bronze.
+
+N:563:Young red dragon
+G:d:r
+I:110:30d10:20:60:70
+W:31:1:20000:700
+E:0:1:0:6:1:0
+O:50:50:0:0
+B:CLAW:HURT:2d6
+B:CLAW:HURT:2d6
+B:BITE:HURT:2d8
+F:FORCE_SLEEP | FORCE_MAXHP | CAN_FLY | SUSCEP_COLD |
+F:DROP_3D2 | WILD_TOO | WILD_MOUNTAIN | WILD_VOLCANO |
+F:OPEN_DOOR | BASH_DOOR | DROP_CORPSE
+F:EVIL | DRAGON | IM_FIRE | BASEANGBAND | HAS_LITE | ATTR_MULTI
+S:1_IN_10 |
+S:SCARE |
+S:BR_FIRE
+D:It has a form that legends are made of. Its still-tender scales are a
+D:deepest red hue. Heat radiates from its form.
+
+# New monster added by furiosity for the Theme module
+# Based on character dump as of May 10, 2004
+# http://angband.oook.cz/ladder-show.php?id=2933
+N:564:Sir Physt
+G:V:y
+I:140:20d100:0:170:0
+W:45:3:1940:2000
+E:1:1:1:2:1:1
+O:25:25:25:25
+B:CHARGE:HURT:10d8
+# Wearing an Ultimate Mimic for a symbiote
+B:BITE:POISON:4d4
+B:BUTT:CONFUSE:4d4
+B:SPIT:BLIND:4d4
+F:JOKEANGBAND | WILD_TOO | WILD_WOOD | WILD_GRASS |
+F:WILD_WASTE | WILD_MOUNTAIN | WILD_SHORE |
+F:UNIQUE | MALE | GOOD | SMART | UNDEAD | REFLECTING |
+F:OPEN_DOOR | BASH_DOOR | HAS_LITE | CAN_SWIM |
+F:CAN_SPEAK | DROP_4D2 | DROP_GREAT | FORCE_MAXHP |
+F:NO_SLEEP | NO_CONF | NO_CUT | RES_NEXU | MOVE_BODY |
+F:IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS |
+F:RES_NETH | RES_DISE | AURA_FIRE | CAN_FLY | REGENERATE |
+F:NO_STUN | KILL_BODY | NO_FEAR | WEIRD_MIND |
+#Spells chez Mindcraft
+S:1_IN_3
+S:BRAIN_SMASH | FORGET | MIND_BLAST |
+#Spells chez an Ultimate Mimic:
+S:CAUSE_3 | BA_POIS | SCARE | BLIND | CONF | S_MONSTER
+D:He is the head of the unholy holy order of Nosferatu. His nephew
+D:Sir Otilc played with swords and died as a result. Sir Physt is
+D:out to rectify the situation with his fists and his mind. Tulkas
+D:Astaldo has given this former Dunadan his blessings to go and
+D:destroy Morgoth Bauglir, Lord of Darkness. He believes it is his
+D:job and no one else's, and he approaches you with a menacing stare.
+
+N:565:Trapper
+G:.:w
+I:120:60d10:30:75:10
+W:36:3:1300:580
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:HIT:HURT:3d8
+B:HIT:HURT:3d8
+B:HIT:PARALYZE:15d1
+B:HIT:PARALYZE:15d1
+F:CHAR_CLEAR | ATTR_CLEAR | CHAR_MULTI |
+F:NEVER_MOVE | FORCE_MAXHP |
+F:INVISIBLE | EMPTY_MIND | COLD_BLOOD |
+F:NO_CONF | NO_SLEEP | NO_FEAR |
+F:MORTAL | BASEANGBAND
+D:This creature traps unsuspecting victims
+D:and paralyzes them, to be slowly digested later.
+
+N:566:Adanrog
+G:u:R
+I:110:35d10:10:68:90
+W:36:2:0:750
+E:1:1:1:2:1:1
+O:0:0:0:0
+B:HIT:FIRE:4d6
+B:HIT:FIRE:4d6
+B:GAZE:EXP_20
+F:FORCE_SLEEP |
+F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | AURA_FIRE | NONLIVING |
+F:EVIL | DEMON | IM_FIRE | IM_POIS | NO_CONF | NO_SLEEP | BASEANGBAND
+F:HAS_LITE
+S:1_IN_4 |
+S:BO_FIRE | BA_FIRE |
+S:S_DEMON |
+D:It is a humanoid form composed of flames and hatred. Adanroeg are
+D:humans corrupted by the evil forces of Morgoth into demonic slaves
+D:to evil.
+
+N:567:Time bomb
+G:.:w
+I:130:12d12:30:40:0
+W:36:5:0:50
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:EXPLODE:TIME:30d2
+F:CHAR_CLEAR | ATTR_CLEAR | CHAR_MULTI |
+F:NEVER_MOVE | FORCE_MAXHP |
+F:EMPTY_MIND | INVISIBLE | COLD_BLOOD |
+F:NO_CONF | NO_SLEEP | NO_FEAR | JOKEANGBAND | NO_CUT
+D:It was left here to be used against intruders.
+
+N:568:Rawrog
+G:u:B
+I:110:40d10:10:68:90
+W:36:2:0:750
+E:1:1:1:0:1:1
+O:0:0:0:0
+B:CLAW:HURT:5d6
+B:CLAW:HURT:5d6
+F:FORCE_SLEEP | PASS_WALL | INVISIBLE |
+F:IM_POIS | IM_COLD | IM_ACID | IM_FIRE |
+F:NO_SLEEP | NO_CONF | NO_STUN | NONLIVING |
+F:EVIL | DEMON | BASEANGBAND
+S:1_IN_4 |
+S:BLINK | DARKNESS | S_DEMON
+D:It resembles a lion standing on two feet. In fact, Rawroeg are
+D:lions corrupted by Morgoth into demonic servants of evil.
+
+# New monster added by furiosity for the Theme module
+# Based on character dump as of May 7, 2004
+# http://angband.oook.cz/ladder-show.php?id=2838
+N:569:Nick LeYeek, Second Last of the Yeeks
+G:y:o
+I:130:35d100:127:100:0
+W:50:6:650:2000
+E:1:1:1:2:1:1
+O:25:25:25:25
+# Not good at melee:
+B:HIT:HURT:1d1
+B:INSULT:*
+B:SHOW:*
+F:JOKEANGBAND | WILD_TOO | WILD_WOOD | WILD_GRASS |
+F:UNIQUE | MALE | GOOD | DROP_CORPSE | SMART | ANIMAL |
+F:OPEN_DOOR | BASH_DOOR | MORTAL | HAS_LITE | CAN_SWIM |
+F:CAN_SPEAK | DROP_4D2 | DROP_GREAT | FORCE_MAXHP |
+F:PASS_WALL | NO_SLEEP | REGENERATE | REFLECTING |
+F:AURA_FIRE | IM_ACID | IM_ELEC | IM_FIRE | IM_COLD |
+F:IM_POIS | NO_CONF | RES_PLAS | RES_DISE | RES_NEXU |
+F:RES_NETH | RES_WATE |
+S:1_IN_5
+# Spells chez symbiote skull druj:
+S:BA_WATE | MIND_BLAST | BRAIN_SMASH | CAUSE_2 |
+S:BO_PLAS | SLOW | TRAPS | S_UNDEAD | BO_NETH |
+# Spells chez thaumaturgy and having killed Morgy:
+S:BR_SOUN | BR_MANA | BR_NUKE | BR_DISI | ROCKET |
+D:A yeek bard more famous for his buff physique and marriage to the beautiful
+D:but dumb Jessica Yeekson than his music. The dark forces of Morgoth killed
+D:his friend Justin TimberYeek and kidnapped poor Jessica Yeekson, and Nick
+D:vowed revenge. He is the only yeek that could be called powerful. It is rumoured
+D:that he had been successful in defeating Morgoth in a previous incarnation, and
+D:now he is back to finish the job for good. You are all that he perceives to
+D:stand in his way.
+
+N:570:Ice elemental
+G:E:w
+I:110:35d10:10:60:90
+W:37:3:0:650
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:TOUCH:COLD:4d3
+B:HIT:HURT:4d6
+B:TOUCH:COLD:4d3
+F:FORCE_SLEEP |
+F:EMPTY_MIND | COLD_BLOOD | AURA_COLD |
+F:KILL_ITEM | KILL_BODY | BASH_DOOR | POWERFUL |
+F:IM_COLD | IM_ELEC | CAN_SWIM | IM_POIS | IM_ACID |
+F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT
+S:1_IN_5 |
+S:BO_ICEE | BA_COLD
+D:It is a towering glacier.
+
+N:571:Necromancer
+G:p:R
+I:110:28d10:20:50:10
+W:36:2:1600:666
+E:1:1:1:2:1:1
+O:10:0:90:0
+B:HIT:HURT:2d6
+B:HIT:HURT:2d6
+F:MALE |
+F:FORCE_SLEEP | FORCE_MAXHP |
+F:ONLY_ITEM | DROP_1D2 | DROP_SKELETON
+F:SMART | OPEN_DOOR | BASH_DOOR |
+F:EVIL
+F:MORTAL | BASEANGBAND | HAS_LITE
+S:1_IN_3 |
+S:HASTE | TPORT | TELE_TO | BLIND | HOLD | SCARE | CAUSE_3 |
+S:BO_NETH | MIND_BLAST | FORGET |
+S:S_UNDEAD | ANIM_DEAD
+D:A gaunt figure, clothed in black robes.
+
+# New monster added by furiosity for the Theme module
+# Based on oook character dump as of May 7, 2004
+# http://angband.oook.cz/ladder-show.php?id=2616
+N:572:Slappy, Abbess of Pain
+G:h:U
+I:120:39d10:4:128:0
+W:33:3:780:2000
+E:1:1:1:2:1:1
+O:34:0:33:33
+B:HIT:HURT:10d8
+B:PUNCH:HURT:10d8
+B:KICK:HURT:10d8
+B:CHARGE:HURT:10d8
+F:JOKEANGBAND | WILD_TOO | WILD_WOOD | WILD_GRASS|
+F:UNIQUE | FEMALE | GOOD | DROP_CORPSE | SMART |
+F:CAN_SPEAK | DROP_4D2 | DROP_GREAT | FORCE_MAXHP |
+F:OPEN_DOOR | BASH_DOOR | MORTAL | HAS_LITE |
+F:NO_SLEEP | NO_CONF | CAN_SWIM | REGENERATE |
+F:IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS |
+F:RES_NEXU | MOVE_BODY | KILL_WALL | CAN_FLY |
+#Well, she has a boomerang:
+S:1_IN_4 |
+S:ARROW_2
+D:A lithe female wood-elf wearing no armour - she is
+D:a monk of Manwe Sulimo, one of the most feared of her order.
+D:She is one of several children of an Avarin Prince. She has
+D:light grey eyes, straight black hair, and a fair face. She
+D:has unfinished business with some Basilisks and then she's
+D:going after Morgoth's crown. You are in her way.
+
+N:573:Lorgan, Chief of the Easterlings
+G:p:v
+I:120:18d100:25:100:10
+W:36:2:0:1200
+E:1:1:1:2:1:1
+O:0:100:0:0
+B:HIT:HURT:6d6
+B:HIT:HURT:6d6
+B:HIT:HURT:3d8
+B:HIT:HURT:3d8
+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:BASEANGBAND | HAS_LITE
+S:1_IN_4 |
+S:TELE_TO | S_MONSTERS
+D:A mighty warrior from the east, Lorgan hates everything that he cannot
+D:control.
+
+# New monster added by furiosity for the Theme module
+N:574:Snow tiger
+G:f:w
+I:120:12d10:40:40:0
+W:12:2:1500:40
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:CLAW:HURT:1d8
+B:CLAW:HURT:1d8
+B:BITE:HURT:1d6
+F:BASH_DOOR | WILD_TOO | WILD_GRASS | WILD_WOOD | WILD_MOUNTAIN |
+F:ANIMAL | DROP_SKELETON | DROP_CORPSE | IM_COLD |
+F:MORTAL | BASEANGBAND
+D:A large feline that is well-adapted to extremely cold
+D:environments.
+
+N:575:Mummified troll
+G:z:w
+I:110:25d10:20:50:50
+W:34:1:5000:420
+E:1:1:1:2:1:1
+O:0:100:0:0
+B:HIT:HURT:4d6
+B:HIT:HURT:4d6
+F:FORCE_MAXHP |
+F:DROP_60 |
+F:EMPTY_MIND | COLD_BLOOD | OPEN_DOOR | BASH_DOOR | REGENERATE |
+F:EVIL | TROLL | UNDEAD | IM_COLD | IM_POIS |
+F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT
+D:It is a massive figure clothed in wrappings. You are wary of its massive
+D:fists.
+
+N:576:Storm of Unmagic
+G:v:v
+I:130:32d20:50:40:0
+W:53:3:0:4000
+B:ENGULF:EXP_80:5d5
+B:ENGULF:UN_POWER:5d5
+B:ENGULF:UN_BONUS:5d5
+B:HIT:LOSE_ALL:5d5
+F:ATTR_MULTI |
+F:FORCE_SLEEP | FORCE_MAXHP |
+F:RAND_50 | RAND_25 | NONLIVING | CAN_FLY |
+F:EMPTY_MIND | BASH_DOOR | POWERFUL |
+F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT
+S:1_IN_6 |
+S:BR_TIME | BR_DISE
+D:Howling through the disintegrating dungeon, this awesome whirlpool of Unmagic
+D:rips the enchantments from everything it touches.
+
+N:577:Crypt thing
+G:L:G
+I:120:80d10:20:60:60
+W:37:2:0:2500
+E:1:1:1:2:1:1
+O:50:50:0:0
+B:TOUCH:EXP_40
+B:TOUCH:UN_POWER
+B:TOUCH:LOSE_DEX:2d10
+B:TOUCH:LOSE_DEX:2d10
+F:FORCE_SLEEP | FORCE_MAXHP | DROP_1D2 | RES_TELE |
+F:SMART | COLD_BLOOD | OPEN_DOOR | BASH_DOOR |
+F:EVIL | UNDEAD | IM_COLD | IM_POIS | HURT_LITE |
+F:NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT
+S:1_IN_3 |
+S:BLINK | TELE_TO | TELE_AWAY | TELE_LEVEL |
+S:CAUSE_3 | DRAIN_MANA | BRAIN_SMASH
+D:It is a skeletal form dressed in robes. It looks evil and devious.
+
+N:578:Chaos butterfly
+G:I:v
+I:120:60d10:40:60:10
+W:37:2:0:1000
+E:1:1:1:2:1:1
+O:0:0:0:0
+B:CLAW:HURT:3d7
+B:CLAW:HURT:3d7
+B:CRUSH:HURT:10d5
+F:FORCE_SLEEP |
+F:CAN_FLY |
+F:WEIRD_MIND | BASH_DOOR | ATTR_MULTI | ATTR_ANY |
+F:NO_CONF | NO_SLEEP | MORTAL | JOKEANGBAND
+S:1_IN_9
+S:BR_CONF | BR_CHAO
+D:With fractal patterns on its wings, it is clearly one of those butterflies
+D:that mathematicians keep talking about - the ones that flap their wings on the
+D:other side of the world to cause storms here. Now's your chance to stop it.
+
+N:579:Time elemental
+G:E:G
+I:120:35d10:90:70:10
+W:39:2:0:1000
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:TOUCH:TIME:3d4
+B:TOUCH:TIME:3d4
+F:PASS_WALL | IM_POIS | IM_FIRE | IM_ELEC | IM_FIRE | IM_ACID | CAN_FLY |
+F:NO_CONF | NO_SLEEP | EMPTY_MIND | KILL_ITEM | RAND_50 |
+F:BASEANGBAND | NO_CUT
+S:1_IN_7
+S:SLOW | BR_TIME |
+D:You have not seen it yet.
+
+N:580:Blue yeek
+G:y:B
+I:110:2d6:18:14:10
+W:2:1:700:4
+E:1:1:1:2:1:1
+O:25:0:0:55
+B:HIT:HURT:1d5
+F:DROP_60 |
+F:OPEN_DOOR | BASH_DOOR | DROP_CORPSE |
+F:ANIMAL | IM_ACID |
+F:MORTAL | BASEANGBAND
+D:A small humanoid figure.
+
+N:581:The Queen Ant
+G:a:v
+I:120:15d100:30:100:10
+W:37:2:2000:1000
+E:0:1:0:2:1:0
+O:50:50:0:0
+B:BITE:HURT:2d12
+B:BITE:HURT:2d12
+B:BITE:HURT:2d8
+B:BITE:HURT:2d8
+F:UNIQUE | FEMALE | GOOD | DROP_CORPSE
+F:FORCE_SLEEP | FORCE_MAXHP |
+F:ESCORT | ESCORTS | CAN_FLY |
+F:ONLY_ITEM | DROP_2D2 | DROP_GOOD |
+F:WEIRD_MIND | OPEN_DOOR | BASH_DOOR |
+F:ANIMAL |
+F:MORTAL | BASEANGBAND
+S:1_IN_2 |
+S:S_KIN
+D:She's upset because she thinks you hurt her children.
+
+N:582:Will o' the wisp
+G:E:W
+I:130:20d10:30:150:0
+W:38:4:0:500
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:HIT:HURT:1d9
+B:HIT:HURT:1d9
+B:HIT:HALLU:1d9
+B:HIT:HALLU:1d9
+F:FORCE_SLEEP | FORCE_MAXHP | RAND_50 |
+F:SMART | EMPTY_MIND | INVISIBLE |
+F:PASS_WALL | POWERFUL | CAN_FLY | WILD_TOO | WILD_SWAMP |
+F:IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS |
+F:NO_CONF | NO_SLEEP | NO_FEAR | NONLIVING | BASEANGBAND | HAS_LITE | NO_CUT
+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.
+
+N:583:Brown yeek
+G:y:u
+I:110:4d8:18:18:10
+W:8:1:800:11
+E:1:1:1:2:1:1
+O:0:50:0:30
+B:HIT:HURT:1d6
+F:DROP_60 | DROP_CORPSE |
+F:OPEN_DOOR | BASH_DOOR |
+F:ANIMAL | IM_ACID |
+F:MORTAL | BASEANGBAND
+D:It is a strange small humanoid.
+
+N:584:Magma elemental
+G:E:o
+I:110:35d10:10:70:90
+W:37:3:0:950
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:HIT:FIRE:3d7
+B:HIT:HURT:4d6
+B:HIT:FIRE:3d7
+F:FORCE_SLEEP |
+F:EMPTY_MIND | AURA_FIRE | WILD_TOO | WILD_VOLCANO |
+F:KILL_ITEM | KILL_BODY | PASS_WALL | POWERFUL |
+F:IM_FIRE | IM_ELEC | IM_ACID | IM_POIS |
+F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | HAS_LITE | NO_CUT
+S:1_IN_7 |
+S:BO_PLAS | BA_FIRE
+D:It is a towering glowing form of molten rock.
+
+N:585:Black pudding
+G:j:D
+I:110:40d10:12:18:1
+W:37:5:300:50
+E:0:0:0:0:0:0
+O:90:0:0:0
+B:TOUCH:ACID:1d10
+B:TOUCH:ACID:1d10
+B:TOUCH:ACID:1d10
+B:TOUCH:ACID:1d10
+F:FORCE_MAXHP |
+F:FRIENDS |
+F:DROP_60 | DROP_90 | DROP_1D2 |
+F:STUPID | EMPTY_MIND | COLD_BLOOD |
+F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR |
+F:IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS |
+F:NO_CONF | NO_SLEEP | NO_FEAR | CAN_SWIM | BASEANGBAND | NO_CUT
+D:A lump of rotting black flesh that slurps across the dungeon floor.
+
+N:586:Killer iridescent beetle
+G:K:v
+I:110:25d15:16:60:30
+W:37:2:600:850
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:CLAW:ELEC:1d12
+B:CLAW:ELEC:1d12
+B:GAZE:PARALYZE
+F:ATTR_MULTI | FORCE_MAXHP |
+F:WEIRD_MIND | BASH_DOOR | AURA_ELEC | DROP_CORPSE |
+F:ANIMAL | IM_ELEC | CAN_FLY |
+F:MORTAL | BASEANGBAND | HAS_LITE
+D:It is a giant beetle, whose carapace shimmers with vibrant energies.
+
+N:587:Nexus vortex
+G:v:v
+I:120:32d10:100:40:0
+W:37:1:0:800
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:ENGULF:HURT:5d5
+F:FORCE_SLEEP |
+F:RAND_50 | RAND_25 | RES_NEXU | CAN_FLY |
+F:EMPTY_MIND | BASH_DOOR | POWERFUL | RES_TELE |
+F:NO_CONF | NO_SLEEP | NO_FEAR | NONLIVING | BASEANGBAND | HAS_LITE | NO_CUT
+S:1_IN_6 |
+S:BR_NEXU
+D:A maelstrom of potent magical energy.
+
+N:588:Plasma vortex
+G:v:R
+I:120:32d10:100:40:0
+W:37:1:0:800
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:ENGULF:FIRE:4d8
+B:ENGULF:ELEC:4d8
+F:FORCE_SLEEP | SUSCEP_COLD |
+F:RAND_50 | RAND_25 | RES_PLAS | AURA_FIRE | AURA_ELEC |
+F:EMPTY_MIND | BASH_DOOR | POWERFUL |
+F:IM_FIRE | CAN_FLY |
+F:NO_CONF | NO_SLEEP | NO_FEAR | NONLIVING | BASEANGBAND | HAS_LITE | NO_CUT
+S:1_IN_6 |
+S:BR_PLAS
+D:A whirlpool of intense flame, charring the stones at your feet.
+
+N:589:Fire-drake
+G:d:r
+I:110:50d10:20:80:70
+W:36:1:110000:1500
+E:0:1:0:6:1:0
+O:50:50:0:0
+B:CLAW:HURT:2d10
+B:CLAW:HURT:2d10
+B:BITE:HURT:4d10
+F:FORCE_SLEEP | FORCE_MAXHP | WILD_TOO | WILD_MOUNTAIN | WILD_VOLCANO |
+F:DROP_1D2 | DROP_4D2 | CAN_FLY | DROP_CORPSE | SUSCEP_COLD |
+F:BASH_DOOR |
+F:EVIL | DRAGON | IM_FIRE | NO_CONF | NO_SLEEP | BASEANGBAND | HAS_LITE
+F:ATTR_MULTI
+S:1_IN_9 |
+S:CONF | SCARE |
+S:BR_FIRE
+D:A large dragon, scales tinted deep red.
+
+N:590:Golden drake
+G:d:y
+I:110:50d10:20:80:70
+W:36:1:110000:1500
+E:0:1:0:6:1:0
+O:50:50:0:0
+B:CLAW:HURT:2d10
+B:CLAW:HURT:2d10
+B:BITE:HURT:4d10
+F:FORCE_SLEEP | FORCE_MAXHP | WILD_TOO | WILD_MOUNTAIN |
+F:DROP_1D2 | DROP_4D2 | CAN_FLY | DROP_CORPSE |
+F:BASH_DOOR |
+F:EVIL | DRAGON | NO_STUN | NO_SLEEP | BASEANGBAND | HAS_LITE | ATTR_MULTI
+S:1_IN_9 |
+S:CONF | SCARE |
+S:BR_SOUN
+D:A large dragon with scales of gleaming gold.
+
+N:591:Crystal drake
+G:d:u
+I:110:45d10:20:70:70
+W:33:3:18000:1350
+E:0:1:0:6:1:0
+O:50:50:0:0
+B:CLAW:HURT:2d4
+B:CLAW:HURT:2d4
+B:BITE:HURT:3d6
+F:FORCE_SLEEP | FORCE_MAXHP | DROP_CORPSE |
+F:ONLY_ITEM | DROP_3D2 | REFLECTING |
+F:OPEN_DOOR | BASH_DOOR | CAN_FLY |
+F:EVIL | DRAGON | IM_COLD | NO_CONF | NO_SLEEP | BASEANGBAND | HAS_LITE | NO_CUT
+F:ATTR_MULTI
+S:1_IN_6 |
+S:SLOW | CONF | SCARE |
+S:BR_SHAR
+D:A dragon of strange crystalline form. Light shines through it, dazzling
+D:your eyes with spectra of colour.
+
+N:592:Black drake
+G:d:s
+I:110:50d10:20:80:70
+W:36:1:110000:1500
+E:0:1:0:6:1:0
+O:50:50:0:0
+B:CLAW:HURT:2d10
+B:CLAW:HURT:2d10
+B:BITE:HURT:4d10
+F:FORCE_SLEEP | FORCE_MAXHP | CAN_FLY | DROP_CORPSE |
+F:DROP_1D2 DROP_4D2 | WILD_TOO | WILD_SWAMP | WILD_MOUNTAIN |
+F:BASH_DOOR |
+F:EVIL | DRAGON | IM_ACID | NO_CONF | NO_SLEEP | BASEANGBAND | ATTR_MULTI
+S:1_IN_9 |
+S:SCARE |
+S:BR_ACID
+D:A large dragon, with scales of deepest black.
+
+N:593:Multi-hued drake
+G:d:v
+I:110:60d10:20:80:70
+W:38:1:110000:1800
+E:0:1:0:6:1:0
+O:50:50:0:0
+B:CLAW:HURT:2d12
+B:CLAW:HURT:2d12
+B:BITE:HURT:4d12
+F:ATTR_MULTI |
+F:FORCE_SLEEP | FORCE_MAXHP | CAN_FLY |
+F:DROP_2D2 | DROP_4D2 | DROP_CORPSE |
+F:OPEN_DOOR | BASH_DOOR |
+F:EVIL | DRAGON | IM_ACID | IM_FIRE | IM_COLD |
+F:IM_ELEC | IM_POIS | NO_CONF | NO_SLEEP | BASEANGBAND | HAS_LITE
+S:1_IN_7 |
+S:BLIND | CONF | SCARE |
+S:BR_ACID | BR_FIRE | BR_COLD | BR_ELEC | BR_POIS
+D:A large dragon, scales shimmering many colours.
+
+N:594:Master yeek
+G:y:g
+I:110:12d9:18:24:10
+W:12:2:600:28
+E:1:1:1:2:1:1
+O:0:0:100:0
+B:HIT:HURT:1d8
+F:FORCE_SLEEP |
+F:DROP_60 |
+F:OPEN_DOOR | BASH_DOOR |
+F:ANIMAL | EVIL | IM_ACID | DROP_CORPSE |
+F:MORTAL | BASEANGBAND
+S:1_IN_4 |
+S:BLINK | TPORT | BLIND | SLOW | BA_POIS |
+S:S_MONSTER
+D:A small humanoid that radiates some power.
+
+N:595:Orfax, son of Boldor
+G:y:R
+I:120:14d10:18:20:10
+W:11:3:600:80
+E:1:1:1:2:1:1
+O:0:50:50:0
+B:HIT:HURT:1d10
+B:HIT:HURT:1d9
+B:INSULT:*
+B:INSULT:*
+F:UNIQUE | MALE | CAN_SPEAK | DROP_CORPSE |
+F:FORCE_SLEEP | FORCE_MAXHP |
+F:ESCORT | ESCORTS |
+F:ONLY_ITEM | DROP_90 | DROP_GOOD |
+F:SMART | OPEN_DOOR | BASH_DOOR |
+F:ANIMAL | EVIL | IM_ACID |
+F:MORTAL | BASEANGBAND
+S:1_IN_4 |
+S:HEAL | BLINK | TELE_TO | SLOW | CONF |
+S:S_MONSTER
+D:The son of the yeek King, he has some power, but he's still a yeek.
+
+N:596:Boldor, King of the Yeeks
+G:y:r
+I:120:20d10:18:24:10
+W:13:3:650:200
+E:1:1:1:2:1:1
+O:0:90:10:0
+B:HIT:HURT:1d10
+B:HIT:HURT:1d10
+B:HIT:HURT:1d9
+F:UNIQUE | MALE |
+F:FORCE_SLEEP | FORCE_MAXHP |
+F:ESCORT | ESCORTS |
+F:ONLY_ITEM | DROP_90 | DROP_1D2 | DROP_GOOD |
+F:SMART | OPEN_DOOR | BASH_DOOR | CAN_SPEAK | DROP_CORPSE |
+F:ANIMAL | EVIL | IM_ACID |
+F:MORTAL | BASEANGBAND
+S:1_IN_2 |
+S:HEAL | BLINK | TPORT | BLIND | SLOW |
+S:S_KIN | S_MONSTER
+D:A great yeek, powerful in magic and sorcery, but a yeek all the same.
+
+N:597:Black Numenorean
+G:p:D
+I:120:60d10:20:100:10
+W:38:1:2700:1111
+E:1:1:1:2:1:1
+O:0:90:0:10
+B:HIT:EXP_20:6d6
+B:HIT:HURT:5d5
+B:HIT:HURT:5d5
+F:FORCE_SLEEP | FORCE_MAXHP | SMART | RES_NETH |
+F:ONLY_ITEM | DROP_1D2 | DROP_2D2 |
+F:COLD_BLOOD | OPEN_DOOR | BASH_DOOR |
+F:EVIL | IM_COLD | BASEANGBAND | HAS_LITE | NO_CUT
+S:1_IN_5 |
+S:BLIND | SCARE | CAUSE_3 | BO_NETH |
+S:S_MONSTERS
+D:It is a humanoid figure 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. Ever a faithful servant of Sauron, he'll stop at nothing to destroy
+D:you.
+
+N:598:Castamir the Usurper
+G:p:R
+I:120:88d10:20:90:40
+W:38:5:0:1600
+E:1:1:1:2:1:1
+O:10:60:10:10
+B:HIT:HURT:5d5
+B:HIT:HURT:5d5
+B:HIT:HURT:5d5
+B:HIT:HURT:5d5
+F:UNIQUE | MALE |
+F:FORCE_SLEEP | FORCE_MAXHP |
+F:ONLY_ITEM | DROP_2D2 | DROP_GOOD |
+F:SMART | OPEN_DOOR | TAKE_ITEM | BASH_DOOR |
+F:EVIL | BASEANGBAND | HAS_LITE
+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.
+
+N:599:Time vortex
+G:v:B
+I:130:32d10:100:40:0
+W:38:4:0:800
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:ENGULF:TIME:5d5
+F:FORCE_SLEEP |
+F:RAND_50 | RAND_25 |
+F:EMPTY_MIND | BASH_DOOR | POWERFUL | CAN_FLY |
+F:NO_CONF | NO_SLEEP | NO_FEAR | NONLIVING | BASEANGBAND | NO_CUT
+S:1_IN_6 |
+S:BR_TIME
+D:You haven't seen it yet.
+
+N:600:Shimmering vortex
+G:v:o
+I:140:32d10:100:40:0
+W:38:4:0:800
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:ENGULF:BLIND:4d4
+B:ENGULF:BLIND:4d4
+F:FORCE_SLEEP |
+F:RAND_50 | RAND_25 | CAN_FLY |
+F:EMPTY_MIND | BASH_DOOR | POWERFUL | RES_TELE |
+F:NO_CONF | NO_SLEEP | NO_FEAR | NONLIVING | BASEANGBAND | HAS_LITE | NO_CUT
+S:1_IN_4 |
+S:BR_LITE | SHRIEK
+D:A strange pillar of shining light that hurts your eyes. Its shape changes
+D:constantly as it cuts through the air towards you. It is like a beacon,
+D:waking monsters from their slumber.
+
+N:601:Ancient blue dragon
+G:D:b
+I:120:72d10:20:90:80
+W:40:1:170000:2000
+E:0:1:0:6:1:0
+O:50:50:0:0
+B:CLAW:HURT:4d8
+B:CLAW:HURT:4d8
+B:BITE:ELEC:7d8
+F:FORCE_SLEEP | FORCE_MAXHP |
+F:DROP_3D2 | DROP_4D2 | DROP_CORPSE |
+F:SMART | BASH_DOOR | POWERFUL | MOVE_BODY | CAN_FLY |
+F:EVIL | DRAGON | IM_ELEC | NO_CONF | NO_SLEEP | BASEANGBAND | HAS_LITE
+F:ATTR_MULTI
+S:1_IN_6 |
+S:BLIND | CONF | SCARE |
+S:BR_ELEC
+D:A huge draconic form. Lightning crackles along its length.
+
+N:602:Ancient bronze dragon
+G:D:U
+I:120:72d10:20:90:80
+W:40:1:170000:2000
+E:0:1:0:6:1:0
+O:50:50:0:0
+B:CLAW:HURT:4d8
+B:CLAW:HURT:4d8
+B:BITE:HURT:7d8
+F:FORCE_SLEEP | FORCE_MAXHP | DROP_CORPSE |
+F:DROP_3D2 | DROP_4D2 | CAN_FLY |
+F:SMART | BASH_DOOR | POWERFUL | MOVE_BODY |
+F:EVIL | DRAGON | NO_CONF | NO_SLEEP | BASEANGBAND | HAS_LITE | ATTR_MULTI
+S:1_IN_6 |
+S:BLIND | CONF | SCARE |
+S:BR_CONF
+D:A huge draconic form enveloped in a cascade of colour.
+
+N:603:Beholder
+G:e:U
+I:120:16d100:30:80:10
+W:40:3:1600:6000
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:GAZE:EXP_20:2d6
+B:GAZE:UN_POWER:2d6
+B:GAZE:INSANITY:2d6
+B:BITE:HURT:6d6
+F:FORCE_SLEEP | FORCE_MAXHP | RES_TELE | CAN_FLY |
+F:BASH_DOOR | DROP_CORPSE |
+F:EVIL | IM_POIS | NO_CONF | NO_SLEEP | BASEANGBAND
+S:1_IN_2 |
+S:BLIND | SLOW | CONF | SCARE | DRAIN_MANA | MIND_BLAST |
+S:FORGET | DARKNESS | BO_ACID | BO_FIRE | BO_COLD | BO_ELEC
+D:A vile creature with one huge central eye, twelve smaller eyes on stalks, and
+D:a huge mouth filled with sharp teeth.
+
+N:604:Emperor wight
+G:W:r
+I:120:38d10:20:40:10
+W:38:2:0:1600
+E:0:0:0:0:0:0
+O:0:40:60:0
+B:HIT:HURT:1d12
+B:HIT:HURT:1d12
+B:TOUCH:EXP_80
+B:TOUCH:EXP_80
+F:FORCE_SLEEP | FORCE_MAXHP |
+F:ONLY_ITEM | DROP_90 | DROP_4D2 | CAN_FLY |
+F:COLD_BLOOD | OPEN_DOOR | BASH_DOOR |
+F:EVIL | UNDEAD | IM_COLD | IM_POIS | HURT_LITE |
+F:NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT
+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.
+
+# New monster added by furiosity for the Theme module
+N:605:Giant tree ant
+G:a:G
+I:110:20d10:14:49:40
+W:35:1:700:350
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:BITE:POISON:3d12
+B:BITE:POISON:3d12
+F:FORCE_MAXHP | KILL_BODY | FRIENDS | DROP_SKELETON
+F:WEIRD_MIND | BASH_DOOR |
+F:ANIMAL | IM_POIS |
+F:MORTAL | BASEANGBAND
+D:A giant ant covered in shaggy fur. Its powerful jaws drip venom.
+
+N:606:Vargo, Tyrant of Fire
+G:E:r
+I:120:24d100:12:50:50
+W:43:3:0:4000
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:HIT:FIRE:6d6
+B:HIT:FIRE:6d6
+B:HIT:FIRE:6d6
+B:HIT:FIRE:6d6
+F:UNIQUE | SUSCEP_COLD |
+F:FORCE_SLEEP | FORCE_MAXHP | RAND_25 | CAN_SPEAK |
+F:EMPTY_MIND | CAN_SPEAK | MALE | AURA_FIRE |
+F:KILL_ITEM | KILL_BODY | BASH_DOOR | POWERFUL |
+F:IM_FIRE | IM_ACID | IM_POIS | IM_ELEC | NO_STUN |
+F:NO_CONF | NO_SLEEP | BASEANGBAND | HAS_LITE | NO_CUT
+S:1_IN_4 |
+S:BO_PLAS | BA_FIRE
+D:A towering fire elemental, Vargo burns everything beyond recognition.
+
+N:607:Black wraith
+G:W:D
+I:120:50d10:20:55:10
+W:38:2:0:1700
+E:0:0:0:0:0:0
+O:50:0:50:0
+B:HIT:HURT:1d12
+B:HIT:HURT:1d12
+B:TOUCH:EXP_40
+B:TOUCH:EXP_40
+F:FORCE_SLEEP | FORCE_MAXHP | CAN_FLY |
+F:ONLY_ITEM | DROP_1D2 | DROP_2D2 |
+F:COLD_BLOOD | OPEN_DOOR | BASH_DOOR |
+F:EVIL | UNDEAD | IM_COLD | IM_POIS | HURT_LITE | NO_CONF | NO_SLEEP
+F:BASEANGBAND | NO_CUT
+S:1_IN_7 |
+S:BLIND | HOLD | SCARE | CAUSE_3 | BO_NETH
+D:A figure that seems made of void, its strangely human shape is cloaked in
+D:shadow. It reaches out at you.
+
+# New monster added by furiosity for the Theme module
+N:608:Giant yellow ant
+G:a:y
+I:110:20d10:14:49:40
+W:35:1:700:350
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:BITE:BLIND:3d12
+B:BITE:BLIND:3d12
+F:FORCE_MAXHP | KILL_BODY | FRIENDS | DROP_SKELETON
+F:WEIRD_MIND | BASH_DOOR | ANIMAL |
+F:MORTAL | BASEANGBAND
+D:A giant ant covered in shaggy fur. Its powerful jaws click with blinding speed.
+
+# New monster added by furiosity for the Theme module
+N:609:Giant green ant
+G:a:g
+I:110:20d10:14:49:40
+W:35:1:700:350
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:BITE:CONFUSE:3d12
+B:BITE:CONFUSE:3d12
+F:FORCE_MAXHP | KILL_BODY | FRIENDS | DROP_SKELETON
+F:WEIRD_MIND | BASH_DOOR | ANIMAL | NO_CONF |
+F:MORTAL | BASEANGBAND
+D:A giant ant covered in shaggy fur. Its powerful jaws make puzzling
+D:noises as they snap shut.
+
+# New monster added by furiosity for the Theme module
+N:610:Aquatic ant
+G:a:B
+I:110:20d10:14:49:40
+W:35:1:700:350
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:BITE:HURT:3d12
+B:BITE:HURT:3d12
+F:FORCE_MAXHP | KILL_BODY | FRIENDS | DROP_SKELETON
+F:WEIRD_MIND | BASH_DOOR | CAN_SWIM |
+F:ANIMAL | RES_WATE | AQUATIC |
+F:MORTAL | BASEANGBAND
+S:1_IN_4
+S:BA_WATE
+D:A strange antlike creature, animated by a powerful wizard you
+D:cannot see.
+
+N:611:Monastic lich
+G:L:u
+I:120:12d100:30:80:30
+W:39:2:2000:5000
+E:1:1:1:2:1:1
+O:0:50:50:0
+B:KICK:HURT:24d1
+B:KICK:HURT:24d1
+B:CLAW:EXP_80:4d2
+B:CLAW:LOSE_DEX:4d2
+F:FORCE_SLEEP | FORCE_MAXHP | SMART | RES_TELE |
+F:ONLY_ITEM | DROP_2D2 | DROP_4D2 |
+F:COLD_BLOOD | OPEN_DOOR | BASH_DOOR | SMART |
+F:EVIL | UNDEAD | IM_COLD | IM_POIS | NO_CONF | NO_SLEEP | BASEANGBAND
+F:NO_CUT
+S:1_IN_3 |
+S:BLINK | TELE_TO | BLIND | HOLD | CONF | SCARE | CAUSE_3 | CAUSE_4 |
+S:DRAIN_MANA | BRAIN_SMASH | ANIM_DEAD
+D:A skeletal form wrapped in priestly robes. Before its un-death, it
+D:was a monk in an evil order.
+
+N:612:Nether wraith
+G:W:G
+I:120:48d10:20:55:10
+W:39:2:0:1700
+E:0:0:0:0:0:0
+O:50:0:50:0
+B:HIT:HURT:1d12
+B:HIT:HURT:1d12
+B:TOUCH:EXP_80
+B:TOUCH:EXP_80
+F:FORCE_SLEEP | FORCE_MAXHP | CAN_FLY |
+F:ONLY_ITEM | DROP_90 | DROP_4D2 |
+F:INVISIBLE | COLD_BLOOD | PASS_WALL |
+F:EVIL | UNDEAD | IM_COLD | IM_POIS |
+F:HURT_LITE | NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT
+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.
+
+N:613:Hellhound
+G:C:R
+I:120:48d10:25:80:30
+W:35:3:600:600
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:BITE:FIRE:3d12
+B:BITE:FIRE:3d12
+B:BITE:FIRE:3d12
+F:FORCE_SLEEP | FORCE_MAXHP | DROP_CORPSE
+F:RAND_25 | FRIENDS | AURA_FIRE | SUSCEP_COLD |
+F:BASH_DOOR | MOVE_BODY |
+F:ANIMAL | EVIL | IM_FIRE | BASEANGBAND | HAS_LITE |
+S:1_IN_5 | BR_FIRE
+D:It is a giant dog that glows with heat. Flames pour from its nostrils.
+
+N:614:7-headed hydra
+G:M:G
+I:120:100d10:20:90:20
+W:39:2:7000:2000
+E:0:1:0:2:2:0
+O:0:0:0:0
+B:BITE:POISON:3d9
+B:BITE:POISON:3d9
+B:BITE:POISON:3d9
+B:SPIT:BLIND:1d2
+F:FORCE_SLEEP | WILD_TOO | WILD_SHORE | WILD_SWAMP |
+F:ONLY_GOLD | DROP_2D2 | DROP_4D2 | CAN_SWIM | DROP_CORPSE
+F:BASH_DOOR | MOVE_BODY |
+F:ANIMAL | IM_POIS | MORTAL | BASEANGBAND
+S:1_IN_5 |
+S:SCARE | BA_POIS |
+S:BR_POIS
+D:A strange reptilian creature with seven heads dripping venom.
+
+N:615:Waldern, King of Water
+G:E:b
+I:130:25d100:12:80:50
+W:43:3:0:4250
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:HIT:HURT:8d5
+B:HIT:HURT:8d5
+B:HIT:HURT:8d5
+B:HIT:HURT:8d5
+F:UNIQUE |
+F:FORCE_SLEEP | FORCE_MAXHP |
+F:EMPTY_MIND | COLD_BLOOD |
+F:KILL_ITEM | KILL_BODY | BASH_DOOR | POWERFUL |
+F:IM_ACID | IM_FIRE | IM_POIS | IM_COLD |
+F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT
+S:1_IN_3 |
+S:BO_ICEE | BO_WATE | BA_COLD | BA_WATE
+D:A towering water elemental, Waldern is master of all things liquid.
+D:Wave after wave drowns your frail body.
+
+# New monster added by furiosity for the Theme module
+N:616:Termite
+G:a:U
+I:110:2d10:4:9:40
+W:20:1:1:100
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:BITE:HURT:1d6
+B:BITE:HURT:1d6
+F:FORCE_MAXHP | KILL_BODY | FRIENDS | DROP_SKELETON
+F:WEIRD_MIND | BASH_DOOR | SUSCEP_FIRE |
+F:ANIMAL | AI_ANNOY | KILL_TREES |
+F:MORTAL | BASEANGBAND
+S:MULTIPLY
+D:An extremely annoying antlike creature. Its bulbous eyes seem
+D:almost covetous as they focus on your wooden paraphernalia.
+
+N:617:Ancient white dragon
+G:D:w
+I:120:72d10:20:90:80
+W:40:1:170000:2000
+E:0:1:0:6:1:0
+O:50:50:0:0
+B:CLAW:HURT:4d8
+B:CLAW:HURT:4d8
+B:BITE:COLD:7d8
+F:FORCE_SLEEP | FORCE_MAXHP |
+F:DROP_3D2 | DROP_4D2 | DROP_CORPSE |
+F:SMART | BASH_DOOR | POWERFUL | MOVE_BODY |
+F:EVIL | DRAGON | IM_COLD | NO_CONF | NO_SLEEP | SUSCEP_FIRE | BASEANGBAND
+F:HAS_LITE | ATTR_MULTI
+S:1_IN_6 |
+S:BLIND | CONF | SCARE |
+S:BR_COLD
+D:A huge draconic form. Frost covers it from head to tail.
+
+N:618:Ancient green dragon
+G:D:g
+I:120:72d10:20:90:80
+W:40:1:170000:2000
+E:0:1:0:6:1:0
+O:50:50:0:0
+B:CLAW:HURT:4d8
+B:CLAW:HURT:4d8
+B:BITE:POISON:7d8
+F:FORCE_SLEEP | FORCE_MAXHP | DROP_CORPSE |
+F:DROP_3D2 | DROP_4D2 | CAN_FLY |
+F:SMART | BASH_DOOR | POWERFUL | MOVE_BODY |
+F:EVIL | DRAGON | IM_POIS | NO_CONF | NO_SLEEP | BASEANGBAND | HAS_LITE
+F:ATTR_MULTI
+S:1_IN_6 |
+S:BLIND | CONF | SCARE |
+S:BR_POIS
+D:A huge draconic form enveloped in clouds of poisonous vapour.
+
+# New monster added by furiosity for the Theme module
+N:619:Giant snow bat
+G:b:w
+I:130:3d8:12:20:50
+W:10:2:600:18
+E:0:1:1:0:1:0
+O:0:0:0:0
+B:BITE:TERRIFY:1d3
+B:CLAW:COLD:1d2
+B:CLAW:COLD:1d2
+F:RAND_50 | CAN_FLY | WILD_TOO | WILD_MOUNTAIN | WILD_WOOD |
+F:FORCE_SLEEP | ANIMAL | DROP_CORPSE | AI_ANNOY | IM_COLD |
+F:SUSCEP_FIRE | MORTAL | BASEANGBAND
+D:A giant bat adapted to extremely cold temperatures.
+
+N:620:Eldrak
+G:T:r
+I:110:75d10:20:80:50
+W:38:3:7000:1500
+E:1:1:1:2:1:1
+O:0:100:0:0
+B:HIT:HURT:3d6
+B:HIT:HURT:3d6
+B:BITE:HURT:3d4
+B:BITE:HURT:3d4
+F:FORCE_MAXHP | MOVE_BODY |
+F:ONLY_ITEM | DROP_2D2 | REGENERATE |
+F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | WILD_SHORE | WILD_WOOD |
+F:EVIL | TROLL | IM_POIS | NO_CONF | NO_SLEEP | DROP_CORPSE | BASEANGBAND
+D:Melkor created trolls in mockery of the Ents. A massive troll of
+D:huge strength, extremely stupid and extremely violent.
+
+N:621:Ettin
+G:T:b
+I:110:15d100:20:100:30
+W:39:3:8000:2000
+E:1:1:1:2:2:1
+O:0:100:0:0
+B:HIT:HURT:3d8
+B:HIT:HURT:3d8
+B:BITE:HURT:3d8
+B:BITE:HURT:3d8
+F:FORCE_MAXHP | REGENERATE | MOVE_BODY |
+F:ONLY_ITEM | DROP_1D2 | WILD_TOO | WILD_MOUNTAIN | WILD_WOOD | WILD_SWAMP |
+F:OPEN_DOOR | BASH_DOOR | DROP_CORPSE |
+F:EVIL | TROLL | IM_POIS | NO_CONF | NO_SLEEP | BASEANGBAND
+D:Melkor created trolls in mockery of the Ents. A massive two-headed troll,
+D:larger and stronger than many men together.
+
+N:622:Night mare
+G:q:G
+I:120:15d100:30:85:0
+W:39:3:6000:2900
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:BITE:EXP_80:2d6
+B:HIT:HURT:3d8
+B:HIT:HURT:3d8
+B:HIT:CONFUSE:6d6
+F:FORCE_MAXHP |
+F:ONLY_GOLD | DROP_2D2 |
+F:COLD_BLOOD | OPEN_DOOR | BASH_DOOR | CAN_FLY |
+F:EVIL | UNDEAD | IM_COLD | IM_POIS | NO_CONF | NO_SLEEP | BASEANGBAND
+F:HAS_LITE | NO_CUT
+D:A fearsome skeletal horse with glowing eyes that watch you with little
+D:more than hatred for all that lives. Its flying hooves do not touch the
+D:ground.
+
+N:623:Vampire lord
+G:V:b
+I:120:20d100:20:70:10
+W:42:1:1700:1800
+E:1:1:1:2:1:1
+O:0:70:30:0
+B:HIT:HURT:3d6
+B:HIT:HURT:3d6
+B:BITE:EXP_80:4d6
+B:BITE:EXP_80:4d6
+F:FORCE_SLEEP | FORCE_MAXHP | CAN_FLY |
+F:DROP_60 | DROP_4D2 |
+F:COLD_BLOOD | OPEN_DOOR | BASH_DOOR | REGENERATE | RES_TELE |
+F:EVIL | UNDEAD | IM_COLD | IM_POIS | HURT_LITE |
+F:NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT
+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:624:Ancient black dragon
+G:D:s
+I:120:10d100:20:90:80
+W:41:1:170000:2500
+E:0:1:0:6:1:0
+O:50:50:0:0
+B:CLAW:HURT:4d9
+B:CLAW:HURT:4d9
+B:BITE:ACID:7d9
+F:FORCE_SLEEP | FORCE_MAXHP | CAN_FLY |
+F:DROP_3D2 | DROP_4D2 | DROP_CORPSE |
+F:SMART | BASH_DOOR | POWERFUL | MOVE_BODY |
+F:EVIL | DRAGON | IM_ACID | NO_CONF | NO_SLEEP | BASEANGBAND | ATTR_MULTI
+S:1_IN_6 |
+S:BLIND | CONF | SCARE |
+S:BR_ACID
+D:A huge draconic form. Pools of acid melt the floor around it.
+
+N:625:Weird fume
+G:#:v
+I:120:35d10:100:40:0
+W:40:2:0:800
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:ENGULF:CONFUSE:8d4
+B:ENGULF:CONFUSE:8d4
+F:FORCE_SLEEP |
+F:RAND_50 | RAND_25 | RES_NEXU | AURA_ELEC | IM_FIRE | IM_ELEC |
+F:EMPTY_MIND | BASH_DOOR | POWERFUL |
+F:CAN_FLY | ATTR_MULTI | ATTR_ANY |
+F:NO_CONF | NO_SLEEP | NO_FEAR | NONLIVING | JOKEANGBAND | NO_CUT
+S:1_IN_6 |
+S:BR_CHAO | BR_NEXU | BR_NUKE
+D:A swirling spiral of mist, constantly changing its appearance.
+
+# New monster added by furiosity for the Theme module
+N:626:Giant grey bat
+G:b:s
+I:130:3d8:12:20:50
+W:10:2:600:18
+E:0:1:1:0:1:0
+O:0:0:0:0
+B:BITE:TERRIFY:1d3
+B:CLAW:PARALYZE:1d2
+B:CLAW:HURT:1d2
+F:RAND_50 | CAN_FLY | WILD_TOO | WILD_MOUNTAIN | WILD_WOOD |
+F:FORCE_SLEEP | ANIMAL | DROP_CORPSE | AI_ANNOY |
+F:MORTAL | BASEANGBAND
+D:A giant bat whose very presence makes you feel weary.
+
+# New monster added by furiosity for the Theme module
+N:627:Giant silver bat
+G:b:W
+I:130:3d8:12:20:50
+W:10:2:600:18
+E:0:1:1:0:1:0
+O:0:0:0:0
+B:BITE:LOSE_DEX:1d3
+B:CLAW:HALLU:1d2
+B:CLAW:HURT:1d2
+F:RAND_50 | CAN_FLY | WILD_TOO | WILD_MOUNTAIN | WILD_WOOD |
+F:FORCE_SLEEP | ANIMAL | DROP_CORPSE | AI_ANNOY |
+F:MORTAL | BASEANGBAND
+D:A giant bat, its wings shimmering a pale mesmerizing silver.
+
+# New monster added by furiosity for the Theme module
+N:628:Giant yellow bat
+G:b:y
+I:130:3d8:12:20:50
+W:10:2:600:18
+E:0:1:1:0:1:0
+O:0:0:0:0
+B:BITE:LOSE_CHR:1d3
+B:CLAW:EAT_LITE:1d2
+B:CLAW:EAT_LITE:1d2
+F:RAND_50 | CAN_FLY | WILD_TOO | WILD_MOUNTAIN | WILD_WOOD |
+F:FORCE_SLEEP | ANIMAL | DROP_CORPSE | AI_ANNOY |
+F:MORTAL | BASEANGBAND
+D:A giant bat which seems to absorb all light as it passes.
+
+N:629:Shadowfax, steed of Gandalf
+G:c:v
+I:130:30d100:20:100:50
+W:40:3:2600:2000
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:KICK:HURT:5d5
+B:KICK:HURT:5d5
+B:BITE:HURT:6d6
+F:FORCE_MAXHP | UNIQUE | ANIMAL | GOOD | NEUTRAL | NO_TARGET |
+F:REGENERATE | BASH_DOOR | IM_FIRE | IM_COLD | IM_ELEC |
+F:IM_POIS | NO_FEAR | DROP_CORPSE | WILD_ONLY | WILD_WOOD | WILD_GRASS |
+F:MORTAL | BASEANGBAND
+D:Shadowfax is the chief of the Mearas, the greatest of all horses that are
+D:bred in the fields of Rohan. Although the Mearas should technically be only
+D:ridden by the royal family of Rohan, only Gandalf the Wizard has ever
+D:succeeded in taming Shadowfax: and even then, Shadowfax will not be subjected
+D:to a bridle or saddle, but must be ridden bareback.
+
+N:630:Spirit troll
+G:G:G
+I:110:10d100:20:90:5
+W:40:3:0:900
+E:0:0:0:0:0:0
+O:10:90:0:0
+B:HIT:HURT:3d6
+B:HIT:HURT:3d5
+B:HIT:HURT:3d5
+F:FORCE_MAXHP |
+F:DROP_90 |
+F:INVISIBLE | PASS_WALL | CAN_FLY |
+F:EVIL | TROLL | IM_COLD | IM_ELEC | IM_POIS |
+F:NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT
+D:A ghostly troll-like being from the ethereal plane.
+
+N:631:War troll
+G:T:R
+I:120:50d10:20:100:50
+W:40:3:6500:800
+E:1:1:1:2:1:1
+O:0:100:0:0
+B:HIT:HURT:5d5
+B:HIT:HURT:5d5
+B:BITE:HURT:3d5
+B:BITE:HURT:3d5
+F:FORCE_MAXHP | SUSCEP_FIRE | REGENERATE |
+F:DROP_90 | REGENERATE | FRIENDS |
+F:OPEN_DOOR | BASH_DOOR | DROP_CORPSE |
+F:EVIL | TROLL | IM_POIS | NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND
+D:An corruption of Morgoth, it was made in mockery of the Ents.
+D:A massive troll, equipped with a scimitar and heavy armour.
+
+N:632:Disenchanter worm mass
+G:w:v
+I:100:10d8:7:5:10
+W:40:3:50:30
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:CRAWL:UN_BONUS:1d4
+F:RAND_50 | RES_DISE | ATTR_MULTI | CAN_SWIM |
+F:STUPID | WEIRD_MIND | BASH_DOOR |
+F:ANIMAL | HURT_LITE | NO_FEAR | BASEANGBAND | NO_CUT
+S:MULTIPLY
+D:It is a strange mass of squirming worms. Magical energy crackles
+D:around its disgusting form.
+
+N:633:Rotting quylthulg
+G:Q:u
+I:120:48d10:20:1:0
+W:45:1:3000:3000
+E:0:0:0:0:0:0
+O:0:0:0:0
+F:FORCE_SLEEP | FORCE_MAXHP | NEVER_MOVE | NEVER_BLOW |
+F:INVISIBLE | EMPTY_MIND | ANIMAL |
+F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND
+S:1_IN_2 |
+S:BLINK | TPORT |
+S:S_UNDEAD
+D:It is a pulsing flesh mound that reeks of death and putrefaction.
+
+N:634:Lesser titan
+G:P:y
+I:120:24d100:30:80:15
+W:56:3:30000:6000
+E:1:1:1:2:1:1
+O:0:100:0:0
+B:HIT:CONFUSE:9d9
+B:HIT:CONFUSE:9d9
+B:HIT:CONFUSE:9d9
+B:HIT:CONFUSE:9d9
+F:FORCE_SLEEP | FORCE_MAXHP |
+F:DROP_GOOD | DROP_4D2 | DROP_SKELETON | DROP_CORPSE |
+F:SMART | TAKE_ITEM | OPEN_DOOR | BASH_DOOR |
+F:EVIL | GIANT | MALE | BASEANGBAND | HAS_LITE
+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.
+
+N:635:9-headed hydra
+G:M:r
+I:120:100d12:20:95:20
+W:40:2:8000:3000
+E:0:1:0:2:2:0
+O:0:0:0:0
+B:BITE:FIRE:3d10
+B:BITE:FIRE:3d10
+B:BITE:FIRE:3d10
+B:BITE:FIRE:3d10
+F:FORCE_SLEEP | WILD_TOO | WILD_SHORE | WILD_SWAMP |
+F:ONLY_GOLD | DROP_3D2 | DROP_4D2 | CAN_SWIM |
+F:OPEN_DOOR | BASH_DOOR | MOVE_BODY | DROP_CORPSE |
+F:ANIMAL | IM_FIRE | MORTAL | BASEANGBAND
+S:1_IN_4 |
+S:SCARE | BO_FIRE | BR_FIRE
+D:A strange reptilian creature with nine smouldering heads.
+
+N:636:Enchantress
+G:p:R
+I:130:52d10:20:60:10
+W:40:4:1700:2100
+E:1:1:1:2:1:1
+O:0:0:100:0
+B:HIT:HURT:2d6
+B:HIT:HURT:2d6
+B:HIT:HURT:2d8
+F:FEMALE |
+F:FORCE_SLEEP | FORCE_MAXHP | DROP_SKELETON | DROP_CORPSE
+F:ONLY_ITEM | DROP_2D2 | DROP_GOOD |
+F:OPEN_DOOR | BASH_DOOR |
+F:EVIL | NO_CONF | NO_SLEEP
+F:MORTAL | BASEANGBAND | HAS_LITE
+S:1_IN_2 |
+S:BLIND |
+S:S_DRAGON
+D:This elusive female spellcaster has a special affinity for dragons, whom
+D:she rarely fights without.
+
+N:637:Ranger chieftain
+G:p:W
+I:120:50d20:20:60:10
+W:41:2:1800:1800
+E:1:1:1:2:1:1
+O:30:50:20:0
+B:HIT:HURT:5d5
+B:HIT:HURT:5d5
+B:HIT:HURT:5d5
+F:MALE | INVISIBLE |
+F:FORCE_SLEEP | FORCE_MAXHP | DROP_SKELETON | DROP_CORPSE
+F:ONLY_ITEM | DROP_2D2 | TAKE_ITEM |
+F:SMART | OPEN_DOOR | BASH_DOOR |
+F:EVIL | NO_CONF | NO_SLEEP | IM_FIRE | IM_ELEC | IM_COLD | IM_POIS |
+F:MORTAL | BASEANGBAND | HAS_LITE
+S:1_IN_4 |
+S:S_MONSTERS |
+S:ARROW_2 | ARROW_3 | ARROW_4 | MISSILE | BO_FIRE | BO_ELEC | BA_COLD |
+S:HASTE | BLINK | S_ANIMALS
+D:A chieftain among the Rangers. His understanding of nature gives him
+D:powerful elemental spells to use against you, in addition to his skills
+D:as an archer and a warrior. Furthermore, he is a master of camouflage, so
+D:you will need magically enhanced seeing to spot him.
+
+N:638:Sorcerer
+G:p:R
+I:130:52d10:20:60:10
+W:40:2:1700:2150
+E:1:1:1:2:1:1
+O:0:0:100:0
+B:HIT:HURT:2d8
+B:HIT:HURT:2d8
+B:HIT:HURT:2d8
+F:MALE |
+F:FORCE_SLEEP | FORCE_MAXHP | DROP_SKELETON | DROP_CORPSE |
+F:ONLY_ITEM | DROP_90 | DROP_4D2 |
+F:OPEN_DOOR | BASH_DOOR |
+F:EVIL | NO_CONF | NO_SLEEP |
+F:MORTAL | BASEANGBAND | HAS_LITE
+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
+D:hands are ablur with spellcasting.
+
+N:639:Xaren
+G:X:s
+I:120:32d10:20:80:10
+W:40:1:500000:1200
+E:0:0:0:3:0:0
+O:0:0:0:0
+B:HIT:HURT:3d4
+B:HIT:HURT:3d4
+B:HIT:HURT:3d4
+B:HIT:HURT:3d4
+F:FORCE_MAXHP | SUSCEP_ACID |
+F:EMPTY_MIND | COLD_BLOOD |
+F:ONLY_GOLD | DROP_2D2 |
+F:KILL_ITEM | PASS_WALL |
+F:IM_FIRE | IM_COLD | IM_ELEC | IM_POIS |
+F:HURT_ROCK | NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT
+D:It is a tougher relative of the Xorn. Its hide glitters with metal ores.
+
+# New monster added by furiosity for the Theme module
+N:640:Giant green bat
+G:b:G
+I:130:3d8:12:20:50
+W:20:2:600:18
+E:0:1:1:0:1:0
+O:0:0:0:0
+B:BITE:TERRIFY:1d3
+B:CLAW:LOSE_INT:1d2
+B:CLAW:DISEASE:1d2
+F:RAND_50 | CAN_FLY | WILD_TOO | WILD_MOUNTAIN | WILD_WOOD |
+F:FORCE_SLEEP | ANIMAL | DROP_CORPSE | AI_ANNOY |
+F:MORTAL | BASEANGBAND
+D:A giant bat which is an expert at disguise in a forest.
+
+# New monster added by furiosity for the Theme module
+N:641:Death vortex
+G:v:D
+I:130:40d20:100:40:0
+W:60:2:0:6000
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:ENGULF:LOSE_ALL:5d5
+B:ENGULF:EXP_80:5d5
+B:ENGULF:LOSE_ALL:5d5
+B:ENGULF:EXP_80:5d5
+F:FORCE_SLEEP | CAN_FLY |
+F:RAND_50 | RAND_25 | RES_DISE | RES_NETH | RES_NEXU |
+F:EMPTY_MIND | BASH_DOOR | POWERFUL | BASEANGBAND | NO_CUT
+F:IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS |
+F:NO_CONF | NO_SLEEP | NO_FEAR | NONLIVING | RES_PLAS |
+S:1_IN_6 |
+S:ANIM_DEAD | BO_MANA | DARKNESS | BA_DARK | DRAIN_MANA |
+D:A whirlpool of darkness that smells like death and decay.
+
+# New monster added by furiosity for the Theme module
+N:642:Gas vortex
+G:v:g
+I:110:9d9:100:30:0
+W:21:1:0:100
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:ENGULF:POISON:3d3
+F:FORCE_SLEEP | RAND_50 | CAN_FLY | WILD_WASTE |
+F:EMPTY_MIND | BASH_DOOR | POWERFUL | WILD_TOO |
+F:IM_FIRE | NO_FEAR | NO_CONF | NO_SLEEP |
+F:NONLIVING | BASEANGBAND | HAS_LITE | NO_CUT |
+S:1_IN_6 |
+S:BR_POIS |
+D:A whirlpool of noxious gases.
+
+N:643:Death drake
+G:D:G
+I:120:21d100:25:100:80
+W:45:2:170000:10000
+E:0:1:0:6:1:0
+O:50:50:0:0
+B:CLAW:HURT:4d10
+B:CLAW:HURT:4d10
+B:BITE:EXP_80:7d10
+F:FORCE_SLEEP | FORCE_MAXHP |
+F:ONLY_ITEM | DROP_2D2 | DROP_4D2 | RES_TELE
+F:INVISIBLE | TAKE_ITEM | CAN_FLY |
+F:PASS_WALL | POWERFUL | MOVE_BODY | RES_NETH |
+F:EVIL | DRAGON | IM_COLD | NO_CONF | NO_SLEEP | BASEANGBAND | ATTR_MULTI
+S:1_IN_6 |
+S:SLOW | CONF | SCARE |
+S:BR_NETH
+D:It is a dragon-like form wrapped in darkness. You cannot make out its
+D:true form but you sense its evil.
+
+N:644:Ancient red dragon
+G:D:r
+I:120:10d100:20:90:80
+W:41:1:170000:2500
+E:0:1:0:6:1:0
+O:50:50:0:0
+B:CLAW:HURT:4d9
+B:CLAW:HURT:4d9
+B:BITE:FIRE:7d9
+F:FORCE_SLEEP | FORCE_MAXHP | DROP_CORPSE
+F:DROP_3D2 | DROP_4D2 | CAN_FLY | SUSCEP_COLD |
+F:SMART | BASH_DOOR | POWERFUL | MOVE_BODY |
+F:EVIL | DRAGON | IM_FIRE | NO_CONF | NO_SLEEP | BASEANGBAND | HAS_LITE
+F:ATTR_MULTI
+S:1_IN_6 |
+S:BLIND | CONF | SCARE |
+S:BR_FIRE
+D:A huge draconic form. Wisps of smoke steam from its nostrils and the
+D:extreme heat surrounding it makes you gasp for breath.
+
+N:645:Ancient gold dragon
+G:D:y
+I:120:10d100:20:90:80
+W:41:1:170000:2500
+E:0:1:0:6:1:0
+O:50:50:0:0
+B:CLAW:HURT:4d9
+B:CLAW:HURT:4d9
+B:BITE:HURT:7d9
+F:FORCE_SLEEP | FORCE_MAXHP | DROP_CORPSE
+F:DROP_3D2 | DROP_4D2 | CAN_FLY |
+F:SMART | BASH_DOOR | POWERFUL | MOVE_BODY |
+F:EVIL | DRAGON | NO_STUN | NO_SLEEP | BASEANGBAND | HAS_LITE | ATTR_MULTI
+S:1_IN_6 |
+S:BLIND | CONF | SCARE |
+S:BR_SOUN
+D:A huge draconic form wreathed in a nimbus of light. Its roar stuns and
+D:deafens you.
+
+N:646:Great crystal drake
+G:D:U
+I:120:21d100:25:100:80
+W:45:2:170000:10000
+E:0:1:0:6:1:0
+O:50:50:0:0
+B:CLAW:HURT:4d10
+B:CLAW:HURT:4d10
+B:BITE:HURT:7d10
+F:FORCE_SLEEP | FORCE_MAXHP | REFLECTING | DROP_CORPSE
+F:ONLY_ITEM | DROP_2D2 | DROP_4D2 | CAN_FLY |
+F:OPEN_DOOR | BASH_DOOR | POWERFUL | MOVE_BODY |
+F:EVIL | DRAGON | IM_COLD | NO_CONF | NO_SLEEP | BASEANGBAND | HAS_LITE | NO_CUT
+F:ATTR_MULTI
+S:1_IN_6 |
+S:SLOW | CONF | SCARE |
+S:BR_SHAR
+D:A huge crystalline dragon. Its claws could cut you to shreds and its
+D:teeth are razor sharp. Strange colours ripple through it as it moves in
+D:the light.
+
+# New monster added by furiosity for the Theme module
+N:647:Mana vortex
+G:v:y
+I:110:9d9:100:30:0
+W:21:1:0:100
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:ENGULF:LOSE_ALL:3d3
+F:FORCE_SLEEP | RAND_50 | CAN_FLY | WILD_WASTE |
+F:EMPTY_MIND | BASH_DOOR | WILD_TOO | POWERFUL |
+F:IM_FIRE | NO_FEAR | NO_CONF | NO_SLEEP |
+F:NONLIVING | BASEANGBAND | HAS_LITE | NO_CUT |
+S:1_IN_8 |
+S:BR_MANA |
+D:A whirlpool of pure magical energy.
+
+N:648:Helcungol
+G:U:W
+I:110:40d10:20:50:80
+W:40:2:2700:2000
+E:1:1:1:2:1:1
+O:0:50:50:0
+B:STING:POISON:3d4
+B:SPIT:COLD:3d4
+B:HIT:HURT:3d4
+B:CRUSH:HURT:8d12
+F:FORCE_SLEEP | FORCE_MAXHP |
+F:FRIENDS |
+F:ONLY_ITEM | DROP_60 |
+F:OPEN_DOOR | BASH_DOOR | POWERFUL | IM_FIRE |
+F:EVIL | DEMON | IM_COLD | NO_CONF | NO_SLEEP | BASEANGBAND
+S:1_IN_8 |
+S:BLIND | CONF | SLOW
+D:One of the spider demons, spawn of Ungoliant. It looks like
+D:a giant bloated spider and its claws are icy cold.
+
+N:649:Lygrog
+G:u:D
+I:130:44d10:20:80:0
+W:40:3:600:1000
+E:1:1:1:2:1:1
+O:0:50:50:0
+B:BITE:LOSE_DEX:3d6
+B:CLAW:HURT:3d3
+B:CLAW:HURT:3d3
+F:FORCE_SLEEP | FORCE_MAXHP |
+F:ONLY_ITEM | DROP_90 | DROP_2D2 | DROP_4D2 | NONLIVING |
+F:SMART | INVISIBLE | PASS_WALL | CAN_FLY |
+F:EVIL | DEMON | IM_FIRE | IM_POIS | RES_TELE
+F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND
+S:1_IN_10 |
+S:BLIND | CONF | SCARE | CAUSE_3 | FORGET |
+S:S_DEMON
+D:Lygroeg are corrupted demonic snakelike forms, an evil creation
+D:of Morgoth.
+
+# New monster added by furiosity for the Theme module
+N:650:Slow vortex
+G:v:W
+I:80:9d9:100:30:0
+W:21:1:0:100
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:ENGULF:PARALYZE:3d3
+F:FORCE_SLEEP | RAND_50 | CAN_FLY | WILD_WASTE |
+F:EMPTY_MIND | BASH_DOOR | WILD_TOO | POWERFUL |
+F:NO_FEAR | NO_CONF | NO_SLEEP |
+F:NONLIVING | BASEANGBAND | HAS_LITE | NO_CUT |
+S:1_IN_8 |
+S:BR_INER | BR_GRAV |
+D:A whirlpool of inertia and gravity, twisting slowly.
+
+# New monster added by furiosity for the Theme module
+N:651:Nether vortex
+G:v:G
+I:110:9d9:100:30:0
+W:21:1:0:100
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:ENGULF:EXP_40:3d3
+F:FORCE_SLEEP | RAND_50 | CAN_FLY | WILD_WASTE |
+F:EMPTY_MIND | BASH_DOOR | WILD_TOO | POWERFUL |
+F:IM_FIRE | NO_FEAR | NO_CONF | NO_SLEEP |
+F:NONLIVING | BASEANGBAND | HAS_LITE | NO_CUT |
+S:1_IN_8 |
+S:BR_NETH |
+D:A whirlpool of nether forces.
+
+# New monster added by furiosity for the Theme module
+N:652:Puzzling vortex
+G:v:U
+I:110:9d9:100:30:0
+W:21:1:0:100
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:ENGULF:CONFUSE:3d3
+F:FORCE_SLEEP | RAND_50 | CAN_FLY | WILD_WASTE |
+F:EMPTY_MIND | BASH_DOOR | WILD_TOO | POWERFUL |
+F:IM_FIRE | NO_FEAR | NO_CONF | NO_SLEEP |
+F:NONLIVING | BASEANGBAND | HAS_LITE | NO_CUT |
+S:1_IN_8 |
+S:BR_CONF |
+D:A whirlpool of something strange.
+
+# New monster added by furiosity for the Theme module
+N:653:Dark yeek
+G:y:D
+I:110:4d8:18:18:10
+W:8:1:800:15
+E:1:1:1:2:1:1
+O:0:50:0:30
+B:HIT:HURT:3d6
+F:DROP_60 | DROP_CORPSE |
+F:OPEN_DOOR | BASH_DOOR |
+F:ANIMAL | IM_ACID |
+F:MORTAL | BASEANGBAND
+S:1_IN_9
+S:S_KIN | CAUSE_1
+D:It is a strange small humanoid with a malevolent stare.
+
+N:654:Judge Fire
+G:s:R
+I:120:18d100:90:70:10
+W:41:3:0:12000
+E:1:1:1:2:1:1
+O:0:50:50:0
+B:HIT:FIRE:5d5
+B:HIT:FIRE:5d5
+B:GAZE:EXP_80
+B:WAIL:TERRIFY
+F:UNIQUE | MALE | CAN_SPEAK | SUSCEP_COLD |
+F:FORCE_SLEEP | FORCE_MAXHP |
+F:ONLY_ITEM | DROP_4D2 | DROP_GOOD | POWERFUL |
+F:OPEN_DOOR | BASH_DOOR | MOVE_BODY |
+F:EVIL | UNDEAD | SUSCEP_COLD | IM_POIS | IM_FIRE | RES_PLAS |
+F:NO_CONF | NO_SLEEP | JOKEANGBAND | HAS_LITE | NO_CUT | NO_STUN
+S:1_IN_3 |
+S:CAUSE_3 | BO_FIRE | BA_FIRE | BR_FIRE | BO_PLAS
+S:DARKNESS | S_MONSTER | S_DEMON | S_UNDEAD | TPORT | BLINK | SCARE
+D:One of the Dark Judges, he has come to punish your crime of living.
+D:He looks like a skeleton enveloped in flames.
+
+# New monster added by furiosity for the Theme module
+N:655:White yeek
+G:y:w
+I:110:4d8:18:18:10
+W:8:1:800:11
+E:1:1:1:2:1:1
+O:0:50:0:30
+B:HIT:HURT:1d6
+F:DROP_60 | DROP_CORPSE |
+F:OPEN_DOOR | BASH_DOOR |
+F:ANIMAL | IM_ACID | IM_COLD |
+F:MORTAL | BASEANGBAND
+S:1_IN_10
+S:BO_COLD | BO_ICEE |
+D:It is a strange small humanoid adapted to cold environments.
+
+N:656:Judge Mortis
+G:z:G
+I:120:18d100:90:70:10
+W:41:3:0:13000
+E:1:1:1:2:1:1
+O:0:75:0:15
+B:HIT:POISON:5d5
+B:HIT:DISEASE:5d5
+B:TOUCH:LOSE_ALL
+B:TOUCH:EXP_80
+F:UNIQUE | MALE | CAN_SPEAK |
+F:FORCE_SLEEP | FORCE_MAXHP |
+F:ONLY_ITEM | DROP_4D2 | DROP_GOOD |
+F:COLD_BLOOD | OPEN_DOOR | BASH_DOOR | MOVE_BODY |
+F:EVIL | UNDEAD | SUSCEP_FIRE | IM_COLD | IM_POIS |
+F:NO_CONF | NO_SLEEP | JOKEANGBAND | NO_CUT | NO_STUN
+S:1_IN_3 |
+S:BLIND | SCARE | CAUSE_3 | BO_ACID | BO_NETH | BR_POIS |
+S:BR_NETH | BO_NETH | BLINK | TPORT | ANIM_DEAD
+S:BO_POIS | S_UNDEAD
+D:Another Dark Judge, he is a rotting humanoid with a cow's skull as
+D:his head.
+
+N:657:Dark elven sorcerer
+G:h:R
+I:130:80d10:20:70:10
+W:41:2:1300:3000
+E:1:1:1:2:1:1
+O:0:0:100:0
+B:HIT:HURT:2d8
+B:HIT:HURT:2d8
+B:HIT:HURT:2d8
+F:MALE |
+F:FORCE_SLEEP | FORCE_MAXHP | DROP_SKELETON | DROP_CORPSE
+F:ONLY_ITEM | DROP_90 | DROP_4D2 |
+F:SMART | OPEN_DOOR | BASH_DOOR |
+F:EVIL | HURT_LITE | NO_CONF | NO_SLEEP | BASEANGBAND | HAS_LITE
+S:1_IN_2 |
+S:HEAL | BLINK | TELE_TO | BLIND | CONF | CAUSE_3 | DARKNESS |
+S:BO_ACID | BA_FIRE | BA_COLD | ANIM_DEAD
+S:S_MONSTER | S_UNDEAD | S_DEMON | MISSILE
+D:A dark elven figure, dressed in deepest black. Power seems to crackle
+D:from his slender frame.
+
+N:658:Master lich
+G:L:r
+I:120:18d100:20:80:50
+W:41:2:1800:7000
+E:1:1:1:2:1:1
+O:10:45:25:10
+B:TOUCH:EXP_80
+B:TOUCH:UN_POWER
+B:TOUCH:LOSE_DEX:2d12
+B:TOUCH:LOSE_DEX:2d12
+F:FORCE_SLEEP | FORCE_MAXHP | SMART | RES_TELE |
+F:ONLY_ITEM | DROP_2D2 | DROP_4D2 |
+F:COLD_BLOOD | OPEN_DOOR | BASH_DOOR |
+F:EVIL | UNDEAD | IM_COLD | IM_POIS | NO_CONF | NO_SLEEP | BASEANGBAND
+F:NO_CUT
+S:1_IN_3 |
+S:BLINK | TELE_TO | BLIND | HOLD | CONF | SCARE | CAUSE_3 | CAUSE_4 |
+S:DRAIN_MANA | BRAIN_SMASH | S_UNDEAD
+D:A skeletal form wrapped in robes. Powerful magic crackles along its
+D:bony fingers.
+
+# New monster added by furiosity for the Theme module
+N:659:Gray yeek
+G:y:s
+I:110:4d8:18:18:10
+W:8:1:800:11
+E:1:1:1:2:1:1
+O:0:50:0:30
+B:HIT:HURT:1d6
+F:DROP_60 | DROP_CORPSE |
+F:OPEN_DOOR | BASH_DOOR |
+F:ANIMAL | IM_ACID |
+F:MORTAL | BASEANGBAND
+S:1_IN_6
+S:BO_ACID |
+D:It is a strange small humanoid cloaked in gray. You notice
+D:some suspicious-looking vials in his pack.
+
+N:660:Eol, the Dark Elf
+G:h:D
+I:130:80d30:20:100:60
+W:49:2:1400:25000
+E:1:1:1:2:1:1
+O:10:40:40:10
+B:HIT:HURT:3d8
+B:HIT:HURT:3d8
+B:HIT:HURT:3d8
+F:UNIQUE | MALE |
+F:FORCE_SLEEP | FORCE_MAXHP | DROP_CORPSE | CAN_SPEAK |
+F:ONLY_ITEM | DROP_4D2 | DROP_2D2 | DROP_GOOD | DROP_CHOSEN |
+F:SMART | IM_ELEC | IM_COLD | IM_POIS | IM_FIRE |
+F:REFLECTING | OPEN_DOOR | BASH_DOOR | SPECIAL_GENE |
+F:HURT_LITE | BASEANGBAND | HAS_LITE
+S:1_IN_3 |
+S:HEAL | BLINK | TELE_TO | BLIND | CONF | CAUSE_4 | DARKNESS |
+S:BA_NETH | BA_ELEC | BA_ACID | BA_FIRE | BA_COLD | BO_MANA |
+S:S_MONSTERS | S_UNDEAD | S_DRAGON | S_DEMON
+D:A lord of the Teleri, Eol is a mighty metalsmith, the first
+D:one to ever forge weapons of meteorite iron. His dark
+D:countenance glares at you in disdain.
+
+# New monster added by furiosity for the Theme module
+N:661:Yellow yeek
+G:y:y
+I:110:4d8:18:18:10
+W:8:1:800:11
+E:1:1:1:2:1:1
+O:0:50:0:30
+B:HIT:HURT:1d6
+F:DROP_60 | DROP_CORPSE |
+F:OPEN_DOOR | BASH_DOOR |
+F:ANIMAL | IM_ACID | IM_POIS |
+F:MORTAL | BASEANGBAND
+S:1_IN_7 |
+S:BA_POIS
+D:It is a strange small humanoid. He's strangely stinky.
+
+# New monster added by furiosity for the Theme module
+# A brown yeek with the PET flag.
+N:662:Adventurer yeek
+G:y:U
+I:110:4d8:18:18:10
+W:8:1:800:11
+E:1:1:1:2:1:1
+O:0:50:0:30
+B:HIT:HURT:1d6
+F:DROP_60 | DROP_CORPSE |
+F:OPEN_DOOR | BASH_DOOR |
+F:ANIMAL | IM_ACID | PET |
+F:MORTAL | BASEANGBAND
+D:It is a strange small humanoid, a fellow adventurer.
+
+# New monster added by furiosity for the Theme module
+N:663:Dark mushroom patch
+G:,:D
+I:110:1d2:2:1:0
+W:8:1:10:1
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:SPORE:EXP_10:1d4
+F:NEVER_MOVE |
+F:STUPID | EMPTY_MIND |
+F:IM_POIS | DROP_CORPSE |
+F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT
+S:1_IN_10 |
+S:DARKNESS
+D:Yum! It looks quite tasty.
+
+N:664:Undead beholder
+G:e:u
+I:120:27d100:30:100:10
+W:45:3:1600:8000
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:GAZE:EXP_40:3d6
+B:GAZE:UN_POWER:3d6
+B:GAZE:INSANITY:3d6
+B:BITE:EXP_40:7d6
+F:FORCE_SLEEP | FORCE_MAXHP | RES_TELE |
+F:COLD_BLOOD | BASH_DOOR |
+F:EVIL | UNDEAD | CAN_FLY |
+F:IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS |
+F:NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT
+S:1_IN_2 |
+S:SLOW | CONF | CAUSE_4 | DRAIN_MANA | MIND_BLAST | FORGET |
+S:BO_MANA | BO_NETH | BRAIN_SMASH | BA_FIRE | BA_COLD | BO_ACID |
+S:S_UNDEAD | ANIM_DEAD
+D:A beholder which has cheated death. Black nether storms rage around the
+D:bloodshot pupil of its central giant eye, and light seems to bend as it
+D:sucks its power from the very air around it. Your soul chills as it drains
+D:your vitality for its evil enchantments.
+
+N:665:Shadow
+G:G:D
+I:120:10d20:30:30:20
+W:37:3:0:400
+E:0:0:0:0:0:0
+O:90:10:0:0
+B:TOUCH:EXP_80
+B:TOUCH:EXP_40
+B:CLAW:LOSE_INT:1d10
+B:CLAW:LOSE_WIS:1d10
+F:FORCE_SLEEP | CAN_FLY |
+F:ONLY_ITEM | DROP_1D2 | POWERFUL | REGENERATE | HURT_LITE |
+F:INVISIBLE | COLD_BLOOD | PASS_WALL | RES_NETH |
+F:EVIL | UNDEAD | IM_COLD | IM_POIS | NO_CONF | NO_SLEEP | BASEANGBAND
+F:NO_CUT
+S:1_IN_8 |
+S:BO_NETH | TELE_TO | SLOW
+D:A mighty spirit of darkness of vaguely humanoid form. Razor-edged claws
+D:reach out to end your life as it glides towards you, seeking to suck the
+D:energy from your soul to feed its power.
+
+N:666:Iron lich
+G:L:W
+I:120:22d100:30:100:10
+W:42:4:0:10000
+E:0:0:0:0:1:0
+O:0:0:100:0
+B:BUTT:COLD:3d6
+B:BUTT:FIRE:3d6
+B:BUTT:ELEC:3d6
+F:FORCE_SLEEP | FORCE_MAXHP | REFLECTING |
+F:COLD_BLOOD | BASH_DOOR | CAN_FLY | SUSCEP_ACID |
+F:EVIL | UNDEAD | POWERFUL | SMART |
+F:IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | RES_TELE |
+F:ONLY_ITEM | DROP_60 | DROP_GOOD |
+F:NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT
+S:1_IN_2 |
+S:BA_WATE | BA_FIRE | BO_ICEE | BA_ELEC | BA_COLD |
+S:CAUSE_4 | DRAIN_MANA | BRAIN_SMASH | S_UNDEAD
+D:It is a huge, twisted grey skull floating through the air. Its cold eyes
+D:burn with hatred towards all who live.
+
+N:667:Dread
+G:G:o
+I:120:25d20:20:30:10
+W:42:1:1000:600
+E:0:0:0:0:0:0
+O:0:50:50:0
+B:HIT:HURT:6d6
+B:HIT:HURT:6d6
+B:HIT:LOSE_STR:3d4
+F:FORCE_SLEEP |
+F:RAND_25 | FRIENDS | CAN_FLY |
+F:ONLY_ITEM | DROP_60 |
+F:TAKE_ITEM | INVISIBLE | COLD_BLOOD | PASS_WALL |
+F:EVIL | UNDEAD | IM_COLD | IM_POIS |
+F:NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT
+S:1_IN_15 |
+S:BLIND | HOLD | CONF | DRAIN_MANA | BO_NETH
+D:Death incarnate, its hideous black body seems to struggle against
+D:reality as the universe itself struggles to banish it.
+
+N:668:Greater basilisk
+G:R:D
+I:120:20d100:25:100:15
+W:42:2:3000:10000
+E:0:1:0:2:1:0
+O:0:50:50:0
+B:GAZE:PARALYZE:3d12
+B:GAZE:PARALYZE:3d12
+B:BITE:POISON:2d12
+B:BITE:POISON:2d12
+F:ONLY_ITEM | DROP_1D2 | DROP_GOOD | POWERFUL |
+F:OPEN_DOOR | BASH_DOOR | EVIL | IM_POIS | DROP_CORPSE |
+F:ANIMAL | NO_CONF | NO_SLEEP | CAN_SWIM |
+F:MORTAL | BASEANGBAND
+S:1_IN_8
+S:BR_POIS | BR_DARK | BR_NEXU
+D:A large basilisk, whose shape resembles that of a great worm.
+
+# New monster added by furiosity for the Theme module
+N:669:White mushroom patch
+G:,:w
+I:110:1d2:2:1:0
+W:1:1:10:1
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:SPORE:COLD:1d4
+F:NEVER_MOVE |
+F:STUPID | EMPTY_MIND |
+F:IM_POIS | DROP_CORPSE |
+F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT
+D:Yum! It looks quite tasty.
+
+# New monster added by furiosity for the Theme module
+N:670:Brown mushroom patch
+G:,:u
+I:110:1d2:2:1:0
+W:1:1:10:1
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:SPORE:DISEASE:1d4
+F:NEVER_MOVE |
+F:STUPID | EMPTY_MIND |
+F:IM_POIS | DROP_CORPSE |
+F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT
+D:Yum! It looks quite tasty.
+
+# New monster added by furiosity for the Theme module
+N:671:Silver mushroom patch
+G:,:W
+I:110:1d2:2:1:0
+W:1:1:10:1
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:SPORE:EAT_LITE:1d4
+F:NEVER_MOVE |
+F:STUPID | EMPTY_MIND |
+F:IM_POIS | DROP_CORPSE |
+F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT
+D:Yum! It looks quite tasty.
+
+# New monster added by furiosity for the Theme module
+N:672:Green mushroom patch
+G:,:G
+I:110:1d2:2:1:0
+W:1:1:10:1
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:SPORE:POISON:1d4
+F:NEVER_MOVE |
+F:STUPID | EMPTY_MIND |
+F:IM_POIS | DROP_CORPSE |
+F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT
+D:Yum! It looks quite tasty.
+
+N:673:Mumak
+G:q:s
+I:110:90d10:20:55:100
+W:63:2:150000:2100
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:BUTT:HURT:8d6
+B:BUTT:HURT:8d6
+B:CRUSH:HURT:8d4
+F:FRIENDS | DROP_CORPSE |
+F:BASH_DOOR | ANIMAL | MORTAL | BASEANGBAND
+D:A massive elephantine form with eyes twisted by madness.
+
+N:674:Judge Fear
+G:W:y
+I:120:18d100:90:70:10
+W:43:4:0:12000
+E:1:1:1:2:1:1
+O:100:0:0:0
+B:GAZE:TERRIFY
+B:GAZE:EXP_40
+B:GAZE:EXP_40
+B:GAZE:HURT:2d20
+F:UNIQUE | MALE | CAN_SPEAK |
+F:FORCE_SLEEP | FORCE_MAXHP |
+F:ONLY_ITEM | DROP_4D2 | DROP_GOOD |
+F:INVISIBLE | COLD_BLOOD | OPEN_DOOR | BASH_DOOR | MOVE_BODY |
+F:EVIL | UNDEAD | IM_FIRE | IM_COLD | IM_POIS |
+F:HURT_LITE | NO_CONF | NO_SLEEP | JOKEANGBAND | NO_CUT | NO_STUN
+S:1_IN_3 |
+S:BLIND | HOLD | SCARE | CAUSE_3 | MIND_BLAST | BRAIN_SMASH |
+S:S_UNDEAD | DRAIN_MANA | FORGET | ANIM_DEAD
+D:A Dark Judge, reputedly so frightening that his gaze can kill.
+
+N:675:Ancient multi-hued dragon
+G:D:v
+I:120:21d100:25:100:80
+W:43:1:170000:13000
+E:0:1:0:6:1:0
+O:50:50:0:0
+B:CLAW:HURT:4d10
+B:CLAW:HURT:4d10
+B:BITE:HURT:7d10
+F:ATTR_MULTI |
+F:FORCE_SLEEP | FORCE_MAXHP | CAN_FLY | DROP_CORPSE
+F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 |
+F:SMART | OPEN_DOOR | BASH_DOOR | POWERFUL | MOVE_BODY |
+F:EVIL | DRAGON | IM_ACID | IM_FIRE | IM_COLD |
+F:IM_ELEC | IM_POIS | NO_CONF | NO_SLEEP | BASEANGBAND | HAS_LITE
+S:1_IN_5 |
+S:BLIND | CONF | SCARE |
+S:BR_ACID | BR_FIRE | BR_COLD | BR_ELEC | BR_POIS
+D:A huge draconic form. Many colours ripple down its massive frame. Few
+D:live to see another.
+
+N:676:Ethereal dragon
+G:D:o
+I:120:21d100:25:100:80
+W:45:2:170000:10000
+E:0:1:0:6:1:0
+O:50:50:0:0
+B:CLAW:HURT:4d10
+B:CLAW:HURT:4d10
+B:BITE:HURT:7d10
+F:FORCE_SLEEP | FORCE_MAXHP |
+F:ONLY_ITEM | DROP_2D2 | DROP_4D2 |
+F:INVISIBLE | CAN_FLY |
+F:PASS_WALL | POWERFUL | MOVE_BODY |
+F:DRAGON | NO_CONF | NO_SLEEP | BASEANGBAND | ATTR_MULTI
+S:1_IN_6 |
+S:BLIND | CONF |
+S:BR_LITE | BR_DARK | BR_CONF
+D:A huge dragon emanating from the ethereal plane, this terrible dragon is
+D:a master of light and dark. Its form disappears from sight as it cloaks
+D:itself in unearthly shadows.
+
+# New monster added by furiosity for the Theme module
+N:677:Dark elemental
+G:E:D
+I:110:30d8:12:50:50
+W:33:2:0:350
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:HIT:BLIND:4d6
+B:HIT:EAT_LITE:4d6
+F:FORCE_SLEEP | RAND_25 |
+F:EMPTY_MIND | CAN_FLY | WILD_TOO | WILD_VOLCANO |
+F:KILL_ITEM | KILL_BODY | BASH_DOOR | POWERFUL |
+F:IM_FIRE | IM_POIS | IM_ELEC | IM_ACID |
+F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | HAS_LITE | NO_CUT
+S:1_IN_6 |
+S:BR_DARK
+D:It is a twisting pillar of pure darkness.
+
+# New monster added by furiosity for the Theme module
+N:678:Slow elemental
+G:E:s
+I:100:30d8:12:50:50
+W:33:2:0:350
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:HIT:PARALYZE:4d6
+B:HIT:PARALYZE:4d6
+F:FORCE_SLEEP | RAND_25 |
+F:EMPTY_MIND | CAN_FLY | WILD_TOO | WILD_VOLCANO |
+F:KILL_ITEM | KILL_BODY | BASH_DOOR | POWERFUL |
+F:IM_FIRE | IM_POIS | IM_ELEC | IM_ACID |
+F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | HAS_LITE | NO_CUT
+S:1_IN_6 |
+S:BR_INER
+D:It is a slowly twisting pillar of energy.
+
+N:679:Quaker, Master of Earth
+G:E:u
+I:110:28d100:10:97:90
+W:43:3:0:4500
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:HIT:HURT:6d6
+B:HIT:HURT:6d6
+B:HIT:HURT:6d6
+B:HIT:SHATTER:10d10
+F:UNIQUE | MALE | CAN_SPEAK |
+F:FORCE_SLEEP | FORCE_MAXHP |
+F:EMPTY_MIND | COLD_BLOOD | KILL_WALL |
+F:KILL_ITEM | KILL_BODY | PASS_WALL | POWERFUL |
+F:IM_FIRE | IM_COLD | IM_ELEC | IM_POIS |
+F:HURT_ROCK |
+F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT | NO_STUN
+S:1_IN_6 |
+S:BO_ACID | BA_ACID
+D:A towering stone elemental stands before you. The walls and ceiling are
+D:reduced to rubble as Quaker advances.
+
+N:680:Death leprawn
+G:l:D
+I:120:6d6:8:13:8
+W:44:6:0:85
+E:1:1:1:2:1:1
+O:0:0:0:0
+B:TOUCH:EXP_40:1d10
+B:TOUCH:EAT_GOLD
+B:TOUCH:EAT_ITEM
+F:INVISIBLE | RAND_25 | TAKE_ITEM | COLD_BLOOD | SMART |
+F:HURT_LITE | EVIL | OPEN_DOOR | MALE | UNDEAD | RES_NETH | JOKEANGBAND | NO_CUT
+S:MULTIPLY |
+S:1_IN_6 |
+S:BLINK | TPORT | TELE_TO | CAUSE_3 | ANIM_DEAD
+D:Nasty undead little gnomes.
+
+# New monster added by furiosity for the Theme module
+N:681:Chaos elemental
+G:E:v
+I:110:30d8:12:50:50
+W:33:2:0:350
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:HIT:EXP_40:4d6
+B:HIT:INSANITY:4d6
+F:FORCE_SLEEP | RAND_25 |
+F:EMPTY_MIND | CAN_FLY | WILD_TOO | WILD_VOLCANO |
+F:KILL_ITEM | KILL_BODY | BASH_DOOR | POWERFUL |
+F:IM_FIRE | IM_POIS | IM_ELEC | IM_ACID | ELDRITCH_HORROR |
+F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | HAS_LITE | NO_CUT
+S:1_IN_6 |
+S:BR_CHAO
+D:It is a massive tornado of raw chaos.
+
+# New monster added by furiosity for the Theme module
+N:682:Confusion elemental
+G:E:U
+I:110:30d8:12:50:50
+W:33:2:0:350
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:HIT:CONFUSE:4d6
+B:HIT:CONFUSE:4d6
+F:FORCE_SLEEP | RAND_25 |
+F:EMPTY_MIND | CAN_FLY | WILD_TOO | WILD_VOLCANO |
+F:KILL_ITEM | KILL_BODY | BASH_DOOR | POWERFUL |
+F:IM_FIRE | IM_POIS | IM_ELEC | IM_ACID |
+F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | HAS_LITE | NO_CUT
+S:1_IN_6 |
+S:BR_CONF
+D:It is confusing sight to behold.
+
+# New monster added by furiosity for the Theme module
+N:683:Large blue snake
+G:J:b
+I:100:4d8:5:38:75
+W:4:1:1000:9
+E:0:0:0:0:1:0
+O:0:0:0:0
+B:BITE:HURT:1d4
+B:CRUSH:ELEC:1d6
+F:RAND_25 | CAN_SWIM | WILD_TOO | DROP_SKELETON | DROP_CORPSE
+F:BASH_DOOR | HAS_EGG | ANIMAL | MORTAL | BASEANGBAND | IM_ELEC |
+D:It is about ten feet long, its lithe form crackling with sparks.
+
+# New monster added by furiosity for the Theme module
+N:684:Large silver snake
+G:J:W
+I:100:4d8:5:38:75
+W:4:1:1000:9
+E:0:0:0:0:1:0
+O:0:0:0:0
+B:BITE:HURT:1d4
+B:CRUSH:EAT_LITE:1d6
+F:RAND_25 | CAN_SWIM | WILD_TOO | DROP_SKELETON | DROP_CORPSE
+F:BASH_DOOR | HAS_EGG | ANIMAL | MORTAL | BASEANGBAND
+D:It is about ten feet long, and seems to feed on light.
+
+# New monster added by furiosity for the Theme module
+N:685:Large purple snake
+G:J:v
+I:100:4d8:5:38:75
+W:2:1:1000:9
+E:0:0:0:0:1:0
+O:0:0:0:0
+B:BITE:LOSE_CON:1d4
+B:CRUSH:HURT:1d6
+F:RAND_25 | CAN_SWIM | WILD_TOO | DROP_SKELETON | DROP_CORPSE
+F:BASH_DOOR | HAS_EGG | ANIMAL | MORTAL | BASEANGBAND
+D:It is about ten feet long and looks diseased.
+
+N:686:Judge Death
+G:W:R
+I:120:45d50:90:90:10
+W:43:3:0:14000
+E:1:1:1:2:1:1
+O:0:20:80:0
+B:CLAW:POISON:10d5
+B:CLAW:POISON:10d5
+B:CLAW:EXP_40:10d1
+B:GAZE:TERRIFY
+F:UNIQUE | MALE | CAN_SPEAK |
+F:FORCE_SLEEP | FORCE_MAXHP |
+F:ONLY_ITEM | DROP_4D2 | DROP_GOOD |
+F:SMART | COLD_BLOOD | OPEN_DOOR | BASH_DOOR | MOVE_BODY |
+F:EVIL | UNDEAD | IM_ELEC | IM_COLD | SUSCEP_FIRE |
+F:IM_POIS | NO_CONF | NO_SLEEP | JOKEANGBAND | NO_CUT | NO_STUN
+S:1_IN_3 |
+S:BLIND | HOLD | SCARE | CAUSE_4 | BA_FIRE | BA_NETH | ANIM_DEAD
+S:S_MONSTERS | S_UNDEAD | S_HI_UNDEAD | DRAIN_MANA |
+D:The most powerful Dark Judge, whose touch means death.
+
+N:687:Ariel, Queen of Air
+G:E:B
+I:130:27d100:12:50:50
+W:43:3:0:4750
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:HIT:HURT:4d6
+B:HIT:CONFUSE:4d4
+B:HIT:HURT:4d6
+B:HIT:CONFUSE:4d4
+F:UNIQUE | FEMALE | AURA_ELEC | CAN_SPEAK |
+F:FORCE_SLEEP | FORCE_MAXHP |
+F:RAND_25 | CAN_FLY |
+F:EMPTY_MIND | COLD_BLOOD |
+F:KILL_ITEM | KILL_BODY | BASH_DOOR | POWERFUL |
+F:IM_ACID | IM_COLD | IM_ELEC | IM_POIS |
+F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT
+S:1_IN_5 |
+S:BO_ELEC | BA_COLD | BA_ELEC
+D:A towering air elemental, Ariel the sorceress avoids your blows
+D:with her extreme speed.
+
+N:688:11-headed hydra
+G:M:R
+I:120:100d18:20:100:20
+W:44:2:8500:6000
+E:0:1:0:2:2:0
+O:0:0:0:0
+B:BITE:FIRE:3d12
+B:BITE:FIRE:3d12
+B:BITE:FIRE:3d12
+B:BITE:FIRE:3d12
+F:FORCE_SLEEP | WILD_TOO | WILD_SHORE | WILD_SWAMP |
+F:ONLY_GOLD | DROP_2D2 | DROP_4D2 | DROP_CORPSE |
+F:OPEN_DOOR | BASH_DOOR | MOVE_BODY |
+F:ANIMAL | IM_FIRE | CAN_SWIM |
+F:MORTAL | BASEANGBAND
+S:1_IN_4 |
+S:SCARE | BO_FIRE | BO_PLAS | BA_FIRE | BR_FIRE
+D:A strange reptilian hybrid with eleven smouldering heads.
+
+N:689:Patriarch
+G:p:G
+I:120:52d10:20:60:10
+W:40:2:1800:1800
+E:1:1:1:2:1:1
+O:0:10:90:0
+B:HIT:HURT:3d4
+B:HIT:HURT:3d4
+B:HIT:HURT:3d5
+F:MALE |
+F:FORCE_SLEEP | FORCE_MAXHP | DROP_SKELETON | DROP_CORPSE |
+F:ONLY_ITEM | DROP_90 | DROP_2D2 |
+F:SMART | OPEN_DOOR | BASH_DOOR |
+F:EVIL | NO_CONF | NO_SLEEP |
+F:MORTAL | BASEANGBAND | HAS_LITE
+S:1_IN_2 |
+S:HEAL | BLIND | HOLD | CAUSE_4 | CAUSE_3 | ANIM_DEAD |
+S:S_MONSTERS | 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
+D:pitiful frame.
+
+N:690:Dreadmaster
+G:G:y
+I:120:12d100:20:100:10
+W:44:2:1000:8000
+E:0:0:0:0:0:0
+O:10:40:25:10
+B:HIT:HURT:6d6
+B:HIT:HURT:6d6
+B:HIT:LOSE_STR:3d4
+B:HIT:LOSE_STR:3d4
+F:FORCE_SLEEP | FORCE_MAXHP | RAND_25 |
+F:ONLY_ITEM | DROP_1D2 | DROP_4D2 | CAN_FLY |
+F:SMART | TAKE_ITEM | INVISIBLE | COLD_BLOOD | PASS_WALL |
+F:EVIL | UNDEAD | IM_COLD | IM_POIS | NO_CONF | NO_SLEEP | BASEANGBAND
+F:NO_CUT
+S:1_IN_9 |
+S:TELE_LEVEL | BLIND | HOLD | CONF | CAUSE_4 | DRAIN_MANA | BO_NETH |
+S:S_UNDEAD
+D:It is an unlife of power almost unequalled. An affront to existence, its
+D:very touch abuses and disrupts the flow of life, and its unearthly limbs,
+D:of purest black, crush rock and flesh with ease.
+
+N:691:Drolem
+G:g:g
+I:120:30d100:25:130:30
+W:44:3:40000:12000
+E:0:1:0:6:1:0
+O:0:0:0:0
+B:CLAW:HURT:3d10
+B:CLAW:HURT:3d10
+B:BITE:POISON:5d10
+B:BITE:POISON:5d10
+F:FORCE_SLEEP | FORCE_MAXHP | RES_TELE |
+F:EMPTY_MIND | COLD_BLOOD | OPEN_DOOR | BASH_DOOR |
+F:DRAGON | IM_FIRE | IM_COLD |
+F:IM_ELEC | IM_POIS | CAN_SWIM |
+F:NO_CONF | NO_SLEEP | NO_FEAR | NONLIVING | BASEANGBAND | NO_CUT
+F:ATTR_MULTI
+S:1_IN_6 |
+S:BLIND | SLOW | CONF | ARROW_3 |
+S:BR_POIS
+D:A constructed dragon, the drolem has massive strength. Powerful spells
+D:weaved during its creation make it a fearsome adversary. Its eyes show
+D:little intelligence, but it has been instructed to destroy all it meets.
+
+N:692:Scatha the Worm
+G:D:W
+I:120:22d100:30:130:70
+W:46:2:210000:17000
+E:0:1:0:6:1:0
+O:50:50:0:0
+B:CLAW:HURT:4d10
+B:CLAW:HURT:4d10
+B:BITE:COLD:4d14
+B:BITE:COLD:4d14
+F:UNIQUE | MALE |
+F:FORCE_SLEEP | FORCE_MAXHP | SUSCEP_FIRE |
+F:ONLY_ITEM | DROP_3D2 | DROP_4D2 | DROP_GOOD | DROP_CORPSE
+F:BASH_DOOR | POWERFUL | MOVE_BODY | CAN_FLY |
+F:EVIL | DRAGON | IM_COLD | NO_CONF | BASEANGBAND | HAS_LITE
+S:1_IN_4 |
+S:CONF | CAUSE_3 |
+S:BR_COLD
+D:An ancient and wise Dragon. Scatha has grown clever over the long years.
+D:His scales are covered with frost, and his breath sends a shower of ice
+D:into the air.
+
+N:693:Warrior of the Dawn
+G:p:R
+I:120:25d25:20:70:20
+W:45:2:1600:500
+E:1:1:1:2:1:1
+O:0:0:0:0
+B:HIT:HURT:5d5
+B:HIT:HURT:5d5
+F:IM_POIS | IM_FIRE | IM_ELEC | IM_ACID | IM_COLD |
+F:NO_SLEEP | NO_FEAR |
+F:FRIENDS |
+F:MALE | OPEN_DOOR | BASH_DOOR | JOKEANGBAND | HAS_LITE
+D:Fierce, barbaric warriors, armed with great spiked clubs, and surrounded
+D:in an aura of scarlet. Whenever one of them is slain, another appears
+D:out of nowhere to take his place.
+
+N:694:Lesser black reaver
+G:L:s
+I:120:25d100:20:120:50
+W:45:3:2600:12000
+E:0:0:0:0:0:0
+O:0:0:100:0
+B:HIT:UN_BONUS:4d8
+B:HIT:UN_BONUS:4d8
+B:HIT:LOSE_STR:4d6
+B:HIT:LOSE_STR:4d6
+F:FORCE_SLEEP | FORCE_MAXHP | SMART |
+F:ONLY_ITEM | DROP_2D2 | DROP_GOOD | CAN_SWIM |
+F:COLD_BLOOD | OPEN_DOOR | BASH_DOOR |
+F:EVIL | UNDEAD | IM_COLD | IM_POIS | RES_TELE
+F:NO_CONF | NO_SLEEP | KILL_WALL | NO_FEAR
+F:BASEANGBAND | NO_CUT
+S:1_IN_3 |
+S:TELE_TO | BLIND | HOLD | CONF | CAUSE_3 | DRAIN_MANA |
+S:MIND_BLAST | BA_NETH | ANIM_DEAD
+D:A humanoid form, black as night, advancing steadily and unstoppably.
+
+# New monster added by furiosity for the Theme module
+N:695:Large red snake
+G:J:R
+I:100:4d8:5:38:75
+W:4:1:1000:10
+E:0:0:0:0:1:0
+O:0:0:0:0
+B:BITE:HURT:1d4
+B:CRUSH:FIRE:1d6
+F:RAND_25 | CAN_SWIM | WILD_TOO | DROP_SKELETON | DROP_CORPSE
+F:BASH_DOOR | HAS_EGG | ANIMAL | MORTAL | BASEANGBAND
+D:It is about ten feet long, its form glowing with fire.
+
+N:696:Grand master thief
+G:p:b
+I:130:15d100:50:75:40
+W:46:2:0:1500
+E:1:1:1:2:1:1
+O:70:10:10:10
+B:HIT:EAT_ITEM:5d5
+B:HIT:EAT_ITEM:5d5
+B:HIT:EAT_GOLD:5d5
+B:HIT:EAT_GOLD:5d5
+F:MALE | DROP_2D2 |
+F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR |
+F:EVIL | BASEANGBAND
+S:1_IN_2 |
+S:BLINK | TPORT | TELE_TO | CONF | TRAPS | ARROW_2
+D:A class of its own: you are already too late to protect your possessions -
+D:and he seems to have studied magic too, and is a master of setting traps.
+
+N:697:Smaug the Golden
+G:D:R
+I:120:24d100:30:150:80
+W:48:2:230000:23000
+E:0:1:0:6:1:0
+O:50:50:0:0
+B:CLAW:HURT:4d12
+B:CLAW:HURT:4d12
+B:BITE:FIRE:5d14
+B:BITE:FIRE:5d14
+F:UNIQUE | MALE | REFLECTING | CAN_FLY | DROP_CORPSE |
+F:FORCE_SLEEP | FORCE_MAXHP | CAN_SPEAK | SPECIAL_GENE |
+F:ONLY_ITEM | DROP_4D2 | DROP_GOOD | DROP_GREAT |
+F:OPEN_DOOR | BASH_DOOR | POWERFUL | MOVE_BODY |
+F:SMART | EVIL | DRAGON | IM_FIRE | BASEANGBAND
+F:HAS_LITE
+S:1_IN_4 |
+S:CONF | CAUSE_3 |
+S:BR_FIRE
+D:Smaug is one of the great dragons that still survive, a fire-drake of immense
+D:cunning and intelligence. His speed through air is matched by few other
+D:dragons, his dragonfire is what legends are made of, and his hide is
+D:armoured with diamonds: he is believed to be the greatest dragon still
+D:surviving into the Third Age.
+
+N:698:The Stormbringer
+G:|:D
+I:120:13d123:20:99:20
+W:45:2:0:13333
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:WAIL:TERRIFY
+B:HIT:EXP_80:64d1
+B:HIT:EXP_80:64d1
+B:HIT:EXP_80:8d8
+F:CHAR_MULTI | EVIL | IM_POIS | IM_COLD | IM_FIRE | RES_NETH |
+F:FORCE_SLEEP | UNIQUE | FORCE_MAXHP | CAN_FLY |
+F:COLD_BLOOD | BASH_DOOR | NONLIVING |
+F:NO_CONF | NO_SLEEP | NO_FEAR | JOKEANGBAND | HAS_LITE | NO_CUT | NO_STUN
+D:The mightiest of hellblades, a black runesword which thirsts for
+D:your soul.
+
+N:699:Knight Templar
+G:p:w
+I:120:60d20:20:60:10
+W:44:2:1800:2000
+E:1:1:1:2:1:1
+O:0:100:0:0
+B:HIT:HURT:5d5
+B:HIT:HURT:5d5
+B:HIT:HURT:5d5
+F:IM_POIS | IM_FIRE | IM_ELEC | IM_ACID | IM_COLD | GOOD |
+F:RES_NETH | RES_NEXU | RES_DISE | RES_TELE | DROP_SKELETON | DROP_CORPSE
+F:NO_SLEEP | NO_CONF | NO_FEAR | NO_STUN |
+F:DROP_2D2 | DROP_90 | REFLECTING |
+F:MALE | OPEN_DOOR | BASH_DOOR | FORCE_MAXHP |
+F:MORTAL | BASEANGBAND | HAS_LITE
+S:1_IN_4 |
+S:HEAL | CAUSE_3 | CAUSE_4 | HASTE | SCARE | BLIND |
+D:It seems that the more devout the person, the more likely they are to cross
+D:the boundary between piety and sanctimoniousness. And such is the case with
+D:the Order of the Knights Templar; they are among the most pious and
+D:powerful of the religious knightly orders, but noted for their intolerance.
+D:Thus it is Morgoth's will that is unwittingly done, as the forces of good
+D:are set against each other.
+
+# New monster added by furiosity for the Theme module
+N:700:Large eel
+G:J:U
+I:100:4d8:5:38:75
+W:2:1:1000:9
+E:0:0:0:0:1:0
+O:0:0:0:0
+B:BITE:HURT:1d4
+B:CRUSH:TERRIFY:1d6
+F:RAND_25 | CAN_SWIM | WILD_ONLY | DROP_SKELETON | DROP_CORPSE | WILD_SHORE
+F:BASH_DOOR | HAS_EGG | ANIMAL | MORTAL | BASEANGBAND | NEUTRAL | NO_TARGET |
+D:It is about ten feet long. Its survival depends on being
+D:confused for a much more dangerous snake.
+
+N:701:Dracolich
+G:D:G
+I:120:35d100:25:120:80
+W:55:2:180000:18000
+E:0:1:0:6:1:0
+O:10:50:40:0
+B:CLAW:HURT:4d12
+B:CLAW:HURT:4d12
+B:BITE:EXP_80:7d14
+F:FORCE_SLEEP | FORCE_MAXHP |
+F:ONLY_ITEM | DROP_4D2 | DROP_GOOD | RES_TELE |
+F:COLD_BLOOD | CAN_FLY |
+F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | POWERFUL | MOVE_BODY |
+F:EVIL | DRAGON | UNDEAD | IM_COLD | IM_POIS |
+F:NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT | ATTR_MULTI
+S:1_IN_6 |
+S:CONF | SCARE |
+S:BR_COLD | BR_NETH
+D:The skeletal form of a once-great dragon, enchanted by magic most
+D:perilous. Its animated form strikes with speed and drains life from its
+D:prey to satisfy its hunger.
+
+N:702:Greater titan
+G:P:o
+I:120:38d100:30:125:15
+W:66:3:50000:23500
+E:1:1:1:2:1:1
+O:0:100:0:0
+B:HIT:CONFUSE:12d12
+B:HIT:CONFUSE:12d12
+B:HIT:CONFUSE:12d12
+B:HIT:CONFUSE:12d12
+F:FORCE_SLEEP | FORCE_MAXHP | DROP_SKELETON | DROP_CORPSE |
+F:ONLY_ITEM | DROP_4D2 | DROP_1D2 | DROP_GOOD | MOVE_BODY |
+F:SMART | TAKE_ITEM | OPEN_DOOR | BASH_DOOR |
+F:EVIL | GIANT | MALE | BASEANGBAND | HAS_LITE
+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
+D:defiance.
+
+N:703:Dracolisk
+G:D:R
+I:120:35d100:25:120:80
+W:55:2:180000:18000
+E:0:1:0:6:1:0
+O:0:50:40:10
+B:CLAW:HURT:4d12
+B:CLAW:HURT:4d12
+B:BITE:FIRE:7d14
+B:GAZE:PARALYZE
+F:FORCE_SLEEP | FORCE_MAXHP | CAN_FLY |
+F:ONLY_ITEM | DROP_4D2 | DROP_GOOD | DROP_CORPSE |
+F:OPEN_DOOR | BASH_DOOR | RES_NEXU | RES_TELE |
+F:ANIMAL | EVIL | DRAGON | IM_ACID | IM_FIRE | NO_CONF | NO_SLEEP |
+F:BASEANGBAND | ATTR_MULTI
+S:1_IN_6 |
+S:HOLD | SCARE |
+S:BR_FIRE | BR_NEXU
+D:A mixture of dragon and basilisk, the dracolisk stares at you with deep
+D:piercing eyes, its evil breath burning the ground where it stands.
+
+N:704:Winged Horror
+G:B:D
+I:120:25d80:30:80:5
+W:48:3:4500:4000
+B:CLAW:HURT:3d8
+B:CLAW:HURT:3d8
+B:BITE:EXP_40:4d6
+B:BITE:EXP_40:4d6
+F:ANIMAL | MORTAL | EVIL | CAN_FLY | BASH_DOOR | IM_COLD | IM_POIS
+F:WILD_TOO | WILD_WASTE | WILD_WOOD | WILD_SWAMP | BASEANGBAND
+S:1_IN_6
+S:BR_NETH | BR_DARK | BR_POIS
+D:A terrifying sight: a winged creature greater than any bird you have ever
+D:seen, and with no feathers on its horrid black leathery wings. Descended
+D:from a creature of an older world perhaps, bred by Sauron to be a winged
+D:steed for his Ringwraiths.
+
+# New monster added by furiosity for the Theme module
+N:705:Killer gray beetle
+G:K:s
+I:110:22d8:14:45:30
+W:27:1:600:95
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:BITE:HURT:3d4
+B:SPIT:ACID:4d5
+F:WEIRD_MIND | BASH_DOOR | WILD_TOO | DROP_CORPSE |
+F:ANIMAL | IM_ACID | CAN_FLY |
+F:MORTAL | BASEANGBAND | HAS_LITE
+D:It is a giant beetle surrounded by droplets of acid.
+
+# New monster added by furiosity for the Theme module
+N:706:Killer orange beetle
+G:K:o
+I:110:22d8:14:45:30
+W:27:1:600:95
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:BITE:HURT:3d4
+B:SPIT:BLIND:4d5
+F:WEIRD_MIND | BASH_DOOR | WILD_TOO | DROP_CORPSE |
+F:ANIMAL | CAN_FLY |
+F:MORTAL | BASEANGBAND | HAS_LITE
+D:It is a giant beetle with a corrosive spit.
+
+# New monster added by furiosity for the Theme module
+N:707:Killer blue beetle
+G:K:b
+I:110:22d8:14:45:30
+W:27:1:600:95
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:BITE:HURT:3d4
+B:SPIT:ELEC:4d5
+F:WEIRD_MIND | BASH_DOOR | WILD_TOO | DROP_CORPSE |
+F:ANIMAL | IM_ELEC | CAN_FLY |
+F:MORTAL | BASEANGBAND | HAS_LITE
+D:It is a giant beetle surrounded by sparks.
+
+N:708:Ent
+G:#:G
+I:110:40d100:30:120:15
+W:46:3:0:12500
+E:1:1:1:2:1:1
+O:30:50:20:0
+B:CRUSH:HURT:12d13
+B:CRUSH:HURT:12d13
+B:CRUSH:HURT:12d13
+B:CRUSH:HURT:12d13
+F:FORCE_SLEEP | FORCE_MAXHP | PET | SUSCEP_FIRE |
+F:ONLY_ITEM | DROP_4D2 | DROP_GOOD | MOVE_BODY |
+F:SMART | TAKE_ITEM | KILL_WALL | BASH_DOOR |
+F:GOOD | BASEANGBAND | NO_CUT
+D:Ents are some of the oldest creatures that awoke on Arda. It is a
+D:tree-herd: a sentient, moving tree. Its wrath is fearsome, and it could
+D:split stones and even the very rock of Isengard with its roots.
+
+N:709:Rock giant
+G:P:s
+I:120:40d100:30:150:15
+W:54:3:40000:14500
+E:1:1:1:2:1:1
+O:0:0:0:0
+B:HIT:SHATTER:12d13
+B:HIT:SHATTER:12d13
+B:HIT:SHATTER:12d13
+B:HIT:SHATTER:12d13
+F:FORCE_SLEEP | FORCE_MAXHP | HURT_ROCK |
+F:ONLY_GOLD | DROP_4D2 | MOVE_BODY | KILL_WALL |
+F:SMART | TAKE_ITEM | OPEN_DOOR | BASH_DOOR |
+F:EVIL | GIANT | MALE | HAS_LITE | NO_CUT
+D:A being made of living stone.
+
+N:710:Itangast the Fire Drake
+G:D:R
+I:120:22d100:30:120:70
+W:47:2:220000:20000
+E:0:1:0:6:1:0
+O:50:50:0:0
+B:CLAW:HURT:4d10
+B:CLAW:HURT:4d10
+B:BITE:FIRE:4d14
+B:BITE:FIRE:4d14
+F:UNIQUE | MALE |
+F:FORCE_SLEEP | FORCE_MAXHP | CAN_FLY | DROP_CORPSE
+F:ONLY_ITEM | DROP_3D2 | DROP_4D2 | DROP_GOOD | SUSCEP_COLD |
+F:BASH_DOOR | POWERFUL | MOVE_BODY |
+F:EVIL | DRAGON | IM_FIRE | BASEANGBAND | HAS_LITE
+S:1_IN_4 |
+S:CONF | CAUSE_3 |
+S:BR_FIRE
+D:A mighty ancient dragon, Itangast's form scorches your flesh. Wisps of
+D:smoke curl up from his nostrils as he regards you with disdain.
+
+N:711:Death mold
+G:m:D
+I:140:100d20:200:60:0
+W:47:1:100:1000
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:SPORE:UN_BONUS:7d7
+B:SPORE:UN_BONUS:7d7
+B:SPORE:UN_BONUS:7d7
+B:SPORE:EXP_80:5d5
+F:FORCE_SLEEP | NEVER_MOVE | CAN_SWIM |
+F:EVIL | IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS |
+F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT
+D:It is the epitome of all that is evil, in a mold. Its lifeless form draws
+D:power from sucking the souls of those that approach it, a nimbus of pure
+D:evil surrounds it. Luckily for you, it can't move...
+
+# New monster added by furiosity for the Theme module
+N:712:Killer silver beetle
+G:K:W
+I:110:22d8:14:45:30
+W:27:1:600:95
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:BITE:HURT:3d4
+B:SPIT:EAT_LITE:4d5
+F:WEIRD_MIND | BASH_DOOR | WILD_TOO | DROP_CORPSE |
+F:ANIMAL | HURT_LITE | CAN_FLY |
+F:MORTAL | BASEANGBAND | HAS_LITE
+D:It is a giant beetle surrounded by a strange dark light.
+
+# New monster added by furiosity for the Theme module
+N:713:Killer green beetle
+G:K:G
+I:110:22d8:14:45:30
+W:27:1:600:95
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:BITE:HURT:3d4
+B:SPIT:CONFUSE:4d5
+F:WEIRD_MIND | BASH_DOOR | WILD_TOO | DROP_CORPSE |
+F:ANIMAL | NO_CONF | CAN_FLY |
+F:MORTAL | BASEANGBAND | HAS_LITE
+D:It is a giant beetle surrounded by a puzzling green aura.
+
+N:714:Quickbeam, the Ent
+G:#:G
+I:120:40d100:30:120:15
+W:47:3:0:13500
+E:1:1:1:2:1:1
+O:10:50:20:10
+B:CRUSH:HURT:12d13
+B:CRUSH:HURT:12d13
+B:CRUSH:HURT:12d13
+B:CRUSH:HURT:12d13
+F:FORCE_SLEEP | FORCE_MAXHP | UNIQUE | CAN_SPEAK |
+F:ONLY_ITEM | DROP_4D2 | DROP_GOOD | MOVE_BODY | SUSCEP_FIRE |
+F:SMART | TAKE_ITEM | KILL_WALL | BASH_DOOR |
+F:GOOD | PET | BASEANGBAND | NO_CUT
+D:Also known as Bregalad. Unusually hasty, for an ent. He hates evil creatures,
+D:orcs in particular, since the destruction of his beloved rowan-trees to feed the
+D:fires of Orthanc.
+
+N:715:Glaurung, Father of the Dragons
+G:D:R
+I:130:120d100:20:125:70
+W:70:2:300000:50000
+E:0:1:0:6:1:0
+O:30:70:0:0
+B:CLAW:HURT:5d12
+B:CLAW:HURT:5d12
+B:BITE:FIRE:8d14
+B:BITE:POISON:8d14
+F:UNIQUE | MALE | CAN_SPEAK | DROP_CORPSE |
+F:FORCE_SLEEP | FORCE_MAXHP | DROP_RANDART | KILL_TREES |
+F:ONLY_ITEM | DROP_3D2 | DROP_4D2 | DROP_GOOD | DROP_GREAT |
+F:OPEN_DOOR | BASH_DOOR | POWERFUL | MOVE_BODY |
+F:SMART | EVIL | DRAGON | IM_POIS | IM_FIRE |
+F:BASEANGBAND | HAS_LITE
+S:1_IN_3 |
+S:BLIND | CONF | SCARE | BRAIN_SMASH |
+S:BR_FIRE | BR_POIS | BR_SOUN | S_HI_DRAGON
+D:Glaurung is the father of all dragons, and was for a long time the most
+D:powerful. Though this is no longer so, he still has full command over
+D:his brood and can command them to appear whenever he so wishes. He is
+D:the definition of dragonfire.
+
+N:716:Behemoth
+G:H:B
+I:120:50d100:25:180:30
+W:49:3:6000:16000
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:BITE:HURT:5d8
+B:BITE:HURT:5d8
+B:CRUSH:HURT:3d15
+B:CRUSH:HURT:3d15
+F:FORCE_SLEEP | FORCE_MAXHP | CAN_SWIM | ANIMAL | AQUATIC |
+F:IM_FIRE | IM_ACID | IM_COLD | IM_POIS | DROP_CORPSE |
+F:NO_CONF | NO_SLEEP | NO_FEAR | NEUTRAL | NO_TARGET |
+F:WILD_ONLY | WILD_SHORE | WILD_OCEAN | MORTAL | BASEANGBAND
+D:A great water-beast, with an almost unpenetrable skin.
+
+# New monster added by furiosity for the Theme module
+N:717:Killer aquatic beetle
+G:K:B
+I:110:22d8:14:45:30
+W:27:1:600:95
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:BITE:HURT:3d4
+B:SPIT:COLD:4d5
+F:WEIRD_MIND | BASH_DOOR | WILD_TOO | DROP_CORPSE |
+F:ANIMAL | RES_WATE | CAN_FLY | SUSCEP_FIRE |
+F:MORTAL | BASEANGBAND | HAS_LITE | AQUATIC |
+D:It is a giant beetle that prefers to live in water.
+
+N:718:Greater wall monster
+G:#:W
+I:120:15d40:20:80:20
+W:44:4:0:900
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:HIT:HURT:3d6
+B:HIT:HURT:3d6
+B:HIT:HURT:3d6
+F:FORCE_SLEEP | COLD_BLOOD | EMPTY_MIND | PASS_WALL | RAND_50 |
+F:BASH_DOOR | IM_COLD | IM_ACID | IM_FIRE | IM_ELEC | IM_POIS | NONLIVING |
+F:HURT_ROCK | NO_CONF | NO_SLEEP | CHAR_MULTI | CAN_FLY | BASEANGBAND
+F:NO_CUT
+S:MULTIPLY |
+D:A sentient, moving section of wall.
+
+N:719:Menelrog
+G:U:U
+I:120:40d120:20:80:80
+W:60:3:0:10000
+E:1:1:1:2:1:1
+O:50:0:50:0
+B:GAZE:TERRIFY
+B:HIT:POISON:6d6
+B:SPIT:FIRE:6d6
+B:SPIT:ACID:6d6
+F:FORCE_SLEEP | FORCE_MAXHP | AURA_FIRE | NONLIVING |
+F:REGENERATE | IM_ACID | IM_COLD | IM_FIRE | CAN_FLY |
+F:NO_SLEEP | NO_STUN | NO_CONF | EVIL | DEMON | SMART |
+F:KILL_WALL | WILD_TOO |
+F:ONLY_ITEM | DROP_GREAT | DROP_GOOD | BASEANGBAND
+S:1_IN_4 |
+S:HOLD | BLINK | CONF | S_DEMON | BRAIN_SMASH | BO_PLAS
+D:Morgoth's horrific corruption of Manwe's Great Eagles, with the feathers
+D:devolved into scales, and the talons so powerful they can tear down
+D:stone walls. This demon is a power to be reckoned with; it is powerful
+D:in both combat and magic, and it's the only demon which may roam the wild.
+
+N:720:Mornungol
+G:U:s
+I:120:120d10:25:60:80
+W:55:2:0:3000
+E:1:1:1:2:1:1
+O:20:40:20:20
+B:HIT:HURT:4d10
+B:HIT:LOSE_CHR:10d2
+B:SPIT:ACID:4d10
+B:STING:POISON:5d5
+F:FORCE_SLEEP | FORCE_MAXHP | FRIENDS |
+F:ONLY_ITEM | DROP_1D2 | NONLIVING | BASEANGBAND |
+F:OPEN_DOOR | BASH_DOOR | POWERFUL |
+F:EVIL | DEMON | IM_POIS | NO_CONF | NO_SLEEP
+S:1_IN_7 |
+S:SCARE | CONF
+D:One of the spider demons, spawn of Ungoliant. It looks like
+D:a giant bloated spider, and its claws are dripping with acid.
+
+# New monster added by furiosity for the Theme module
+N:721:Killer tree beetle
+G:K:U
+I:110:22d8:14:45:30
+W:27:1:600:95
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:BITE:HURT:3d4
+B:SPIT:HALLU:4d5
+F:WEIRD_MIND | BASH_DOOR | WILD_TOO | DROP_CORPSE |
+F:ANIMAL | KILL_TREES | CAN_FLY | SUSCEP_COLD |
+F:MORTAL | BASEANGBAND | HAS_LITE
+D:It is a giant beetle, a relative of the termite.
+
+N:722:Nightwing
+G:W:D
+I:120:60d60:20:120:10
+W:61:4:0:10000
+E:1:1:1:2:1:1
+O:0:0:100:0
+B:TOUCH:POISON:6d5
+B:TOUCH:POISON:6d5
+B:HIT:UN_BONUS:6d8
+B:HIT:UN_BONUS:6d8
+F:FORCE_SLEEP | FORCE_MAXHP | CAN_FLY |
+F:ONLY_ITEM | DROP_2D2 | DROP_GOOD |
+F:SMART | COLD_BLOOD | OPEN_DOOR | BASH_DOOR | RES_TELE |
+F:EVIL | UNDEAD | IM_COLD | IM_POIS | HURT_LITE |
+F:NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT
+S:1_IN_4 |
+S:BLIND | SCARE | CAUSE_4 | BRAIN_SMASH |
+S:BO_MANA | BO_NETH | BA_NETH | 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
+D:as the nightwing reaches out to draw you into oblivion. Your muscles sag
+D:and your mind loses all will to fight as you stand in awe of this mighty
+D:being.
+
+# New monster added by furiosity for the Theme module
+# From EyAngband
+N:723:6-headed hydra
+G:M:w
+I:115:37d10:20:80:20
+W:29:2:6000:800
+E:0:1:0:2:3:0
+O:0:0:0:0
+B:BITE:POISON:4d4
+B:BITE:POISON:4d4
+B:BITE:POISON:4d4
+B:BITE:POISON:4d4
+F:BASEANGBAND | ANIMAL | MORTAL | WILD_TOO | WILD_SHORE | WILD_SWAMP |
+F:FORCE_SLEEP | CAN_SWIM | FORCE_SLEEP | DROP_CORPSE | MOVE_BODY |
+F:IM_POIS | SUSCEP_FIRE | ONLY_GOLD | DROP_4D2 | DROP_2D2 | IM_COLD |
+S:1_IN_5 |
+S:SCARE | BA_POIS | BR_POIS |
+D:A strange reptilian creature with 6 heads dripping venom. It has
+D:adapted to living in cold environments.
+
+N:724:Nether hound
+G:Z:G
+I:120:60d10:30:100:0
+W:51:2:800:5000
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:CLAW:HURT:2d12
+B:CLAW:HURT:2d12
+B:BITE:HURT:2d12
+B:BITE:HURT:2d12
+F:FORCE_SLEEP |
+F:FRIENDS | RES_NETH | DROP_SKELETON | DROP_CORPSE |
+F:OPEN_DOOR | BASH_DOOR |
+F:ANIMAL | NO_CONF | NO_SLEEP |
+F:MORTAL | BASEANGBAND | NO_CUT
+S:1_IN_5 |
+S:BR_NETH
+D:You feel a soul-tearing chill upon viewing this beast, a ghostly form of
+D:darkness in the shape of a large dog.
+
+N:725:Time hound
+G:Z:B
+I:130:60d10:30:100:0
+W:51:2:800:5000
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:CLAW:HURT:2d12
+B:CLAW:HURT:2d12
+B:BITE:HURT:2d12
+B:BITE:HURT:2d12
+F:FORCE_SLEEP |
+F:FRIENDS |
+F:OPEN_DOOR | BASH_DOOR | DROP_SKELETON | DROP_CORPSE |
+F:ANIMAL | NO_CONF | NO_SLEEP |
+F:MORTAL | BASEANGBAND
+S:1_IN_5 |
+S:BR_TIME
+D:You get a terrible sense of deja vu, or is it a premonition? All at once
+D:you see a little puppy and a toothless old dog. Perhaps you should give
+D:up and go to bed.
+
+N:726:Plasma hound
+G:Z:R
+I:120:60d10:30:100:0
+W:51:2:800:5000
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:CLAW:HURT:2d12
+B:CLAW:HURT:2d12
+B:BITE:HURT:2d12
+B:BITE:HURT:2d12
+F:FORCE_SLEEP | SUSCEP_COLD |
+F:FRIENDS | RES_PLAS |
+F:OPEN_DOOR | BASH_DOOR | DROP_SKELETON | DROP_CORPSE |
+F:ANIMAL | IM_FIRE | NO_CONF | NO_SLEEP |
+F:MORTAL | BASEANGBAND | HAS_LITE | NO_CUT
+S:1_IN_5 |
+S:BR_PLAS
+D:The very air warps as pure elemental energy stalks towards you in the
+D:shape of a giant hound. Your hair stands on end and your palms itch as
+D:you sense trouble.
+
+N:727:Demonic quylthulg
+G:Q:r
+I:120:48d10:20:1:0
+W:45:1:3000:3000
+E:0:0:0:0:0:0
+O:0:0:0:0
+F:FORCE_SLEEP | FORCE_MAXHP | NEVER_MOVE | NEVER_BLOW |
+F:INVISIBLE | EMPTY_MIND | ANIMAL |
+F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND
+S:1_IN_2 |
+S:BLINK | TPORT |
+S:S_DEMON
+D:A pile of pulsing flesh that glows with an inner dark fire. The world
+D:itself seems to cry out against it.
+
+N:728:Great Storm Worm
+G:D:b
+I:120:40d100:30:150:80
+W:63:2:190000:20000
+E:0:1:0:6:1:0
+O:50:50:0:0
+B:CLAW:HURT:4d12
+B:CLAW:HURT:4d12
+B:BITE:ELEC:6d14
+B:BITE:ELEC:6d14
+F:FORCE_SLEEP | FORCE_MAXHP | AURA_ELEC | CAN_FLY |
+F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 | DROP_GOOD |
+F:BASH_DOOR | POWERFUL | MOVE_BODY | DROP_CORPSE |
+F:EVIL | DRAGON | IM_ELEC | NO_CONF | NO_SLEEP | BASEANGBAND | HAS_LITE
+F:ATTR_MULTI
+S:1_IN_4 |
+S:BLIND | CONF | SCARE |
+S:BR_ELEC
+D:A vast dragon of power. Storms and lightning crash around its titanic
+D:form. Deep blue scales reflect the flashes and highlight the creature's
+D:great muscles. It regards you with contempt.
+
+N:729:Ulik the Troll
+G:T:v
+I:130:35d100:30:120:30
+W:51:4:16000:18000
+E:1:1:1:2:1:1
+O:0:100:0:0
+B:HIT:SHATTER:20d12
+B:HIT:SHATTER:20d12
+B:BITE:POISON:6d14
+F:UNIQUE | MALE | CAN_SPEAK |
+F:FORCE_SLEEP | FORCE_MAXHP | SPECIAL_GENE |
+F:ONLY_ITEM | DROP_1D2 | DROP_4D2 | DROP_GOOD |
+F:DROP_90 | REGENERATE | KILL_WALL | RES_TELE | KILL_BODY |
+F:OPEN_DOOR | BASH_DOOR | DROP_CORPSE |
+F:EVIL | TROLL | IM_POIS |
+F:IM_ELEC | IM_COLD | IM_FIRE | BASEANGBAND
+D:Trolls are said to be corruptions of Morgoth, made in mockery of Ents.
+D:Ulik is the strongest troll who has ever lived. He could challenge
+D:the immortals and pound them to dust with his great strength.
+
+# New monster added by furiosity for the Theme module
+# From UnAngband
+N:730:8-headed hydra
+G:M:s
+I:120:100d11:20:92:20
+W:39:2:6500:1000
+E:0:1:0:2:4:0
+O:0:0:0:0
+B:BITE:ACID:3d8
+B:BITE:ACID:3d8
+B:SPIT:ACID:3d4
+B:SPIT:ACID:3d4
+F:BASEANGBAND | ANIMAL | MORTAL | WILD_TOO | WILD_SHORE | WILD_SWAMP |
+F:FORCE_SLEEP | CAN_SWIM | FORCE_SLEEP | DROP_CORPSE | MOVE_BODY |
+F:IM_ACID | BASH_DOOR | ONLY_GOLD | DROP_4D2 | DROP_2D2 |
+S:1_IN_5 |
+S:SCARE | BR_ACID | BA_ACID
+D:A strange reptilian creature with eight heads spewing acid.
+
+N:731:Oathbreaker
+G:p:D
+I:120:15d100:20:100:10
+W:52:1:2200:10000
+E:1:1:1:2:1:1
+O:0:40:60:0
+B:HIT:HURT:10d5
+B:HIT:HURT:10d5
+B:HIT:EXP_80:10d5
+B:HIT:EXP_80:10d5
+F:FORCE_SLEEP | FORCE_MAXHP | SMART | IM_FIRE | IM_COLD | IM_POIS |
+F:ONLY_ITEM | DROP_1D2 | DROP_2D2 | RES_NETH | RES_NEXU | RES_PLAS |
+F:COLD_BLOOD | OPEN_DOOR | BASH_DOOR |
+F:EVIL | IM_COLD |
+F:UNDEAD | BASEANGBAND | HAS_LITE
+S:1_IN_5 |
+S:BLIND | SCARE | CAUSE_3 | BA_NETH | BA_FIRE | BO_PLAS
+S:S_MONSTERS | S_DEMON
+D:He is one of the warriors of old who broke their promise to the
+D:King of Gondor. A terrible curse now haunts all of them.
+
+# New monster added by furiosity for the Theme module
+# From UnAngband
+N:732:10-headed hydra
+G:M:b
+I:120:100d15:20:97:20
+W:42:2:6500:8000
+E:0:1:0:2:2:0
+O:0:0:0:0
+B:BITE:FIRE:3d9
+B:BITE:ACID:3d9
+B:BITE:ELEC:3d9
+B:BITE:COLD:3d9
+F:BASEANGBAND | ANIMAL | MORTAL | WILD_TOO | WILD_SHORE | WILD_SWAMP |
+F:FORCE_SLEEP | CAN_SWIM | FORCE_SLEEP | DROP_CORPSE | MOVE_BODY |
+F:IM_ACID | IM_ELEC | IM_FIRE | IM_COLD | BASH_DOOR |
+F:ONLY_GOLD | DROP_4D2 | DROP_2D2 |
+S:1_IN_4 |
+S:SCARE
+D:A strange reptilian creature with ten multicoloured heads.
+
+# New monster added by furiosity for the Theme module
+# From UnAngband
+N:733:12-headed hydra
+G:M:W
+I:120:100d27:20:110:20
+W:47:2:7000:10000
+E:0:1:0:2:2:0
+O:0:0:0:0
+B:BITE:FIRE:4d12
+B:BITE:FIRE:4d12
+B:BITE:POISON:4d12
+B:BITE:POISON:4d12
+F:BASEANGBAND | ANIMAL | MORTAL | WILD_TOO | WILD_SHORE | WILD_SWAMP |
+F:FORCE_SLEEP | CAN_SWIM | FORCE_SLEEP | DROP_CORPSE | MOVE_BODY |
+F:IM_FIRE | IM_POIS | RES_PLAS | BASH_DOOR | ONLY_GOLD | DROP_4D2 | DROP_2D2 |
+S:1_IN_4 |
+S:SCARE | BA_FIRE | BA_POIS | BO_FIRE | BO_PLAS |
+D:A strange reptilian creature with twelve smouldering heads.
+
+# New monster added by furiosity for the Theme module
+# From UnAngband
+N:734:13-headed hydra
+G:M:v
+I:120:36d100:20:120:20
+W:51:2:7500:15000
+E:0:1:0:2:2:0
+O:0:0:0:0
+B:BITE:POISON:8d6
+B:BITE:POISON:8d6
+B:BITE:FIRE:12d6
+B:BITE:FIRE:12d6
+F:BASEANGBAND | ANIMAL | MORTAL | WILD_TOO | WILD_SHORE | WILD_SWAMP |
+F:FORCE_SLEEP | CAN_SWIM | FORCE_SLEEP | DROP_CORPSE |
+F:IM_FIRE | IM_POIS | RES_PLAS | NO_CONF | NO_SLEEP | BASH_DOOR |
+F:ONLY_GOLD | DROP_4D2 | DROP_2D2 | DROP_2D2 | SMART |
+S:1_IN_3
+S:SCARE | BA_FIRE | BA_POIS | BO_FIRE | BO_PLAS | S_KIN
+D:A strange reptilian creature with thirteen smouldering heads dripping venom.
+
+# New monster added by furiosity for the Theme module
+N:735:14-headed hydra
+G:M:B
+I:120:40d100:20:130:20
+W:55:2:8000:20000
+E:0:1:0:2:2:0
+O:0:0:0:0
+B:BITE:FIRE:4d10
+B:BITE:ACID:4d10
+B:BITE:ELEC:4d10
+B:BITE:COLD:4d10
+F:BASEANGBAND | ANIMAL | MORTAL | WILD_TOO | WILD_SHORE | WILD_SWAMP |
+F:FORCE_SLEEP | CAN_SWIM | FORCE_SLEEP | DROP_CORPSE |
+F:IM_FIRE | IM_COLD | IM_ELEC | IM_ACID | IM_POIS | RES_PLAS | SMART |
+F:NO_CONF | NO_SLEEP | BASH_DOOR | ONLY_GOLD | DROP_4D2 | DROP_4D2 |
+S:1_IN_3
+S:SCARE | BA_FIRE | BA_POIS | BA_COLD | BA_ELEC | BA_ACID
+S:S_KIN |
+D:A cunning reptilian creature with fourteen multicoloured heads.
+
+# New monster added by furiosity for the Theme module
+N:736:15-headed hydra
+G:M:U
+I:120:44d100:20:140:20
+W:59:2:8500:25000
+E:0:1:0:2:2:0
+O:0:0:0:0
+B:BITE:FIRE:5d11
+B:BITE:ACID:5d11
+B:BITE:COLD:5d11
+B:BITE:ELEC:5d11
+F:BASEANGBAND | ANIMAL | MORTAL | WILD_TOO | WILD_SHORE | WILD_SWAMP |
+F:FORCE_SLEEP | CAN_SWIM | AQUATIC | DROP_CORPSE | WILD_OCEAN |
+F:IM_FIRE | IM_COLD | IM_ELEC | IM_ACID | IM_POIS | RES_PLAS | SMART |
+F:NO_CONF | NO_SLEEP | BASH_DOOR | ONLY_GOLD | DROP_4D2 | DROP_4D2 |
+S:1_IN_3
+S:SCARE | BA_FIRE | BA_POIS | BA_COLD | BA_ELEC | BA_ACID | CONF |
+S:BO_FIRE | BO_COLD | BO_ELEC | BO_ACID | S_KIN |
+D:A cunning reptilian creature with fifteen multicoloured heads.
+
+# New monster added by furiosity for the Theme module
+N:737:Killer hydra
+G:M:D
+I:120:50d100:20:150:20
+W:65:5:9000:40000
+E:0:1:0:2:2:0
+O:0:0:0:0
+B:BITE:FIRE:6d12
+B:BITE:ACID:6d12
+B:BITE:COLD:6d12
+B:BITE:ELEC:6d12
+F:BASEANGBAND | ANIMAL | MORTAL | WILD_TOO | WILD_SHORE | WILD_SWAMP |
+F:FORCE_SLEEP | CAN_SWIM | AQUATIC | DROP_CORPSE | WILD_OCEAN |
+F:IM_FIRE | IM_COLD | IM_ELEC | IM_ACID | IM_POIS | RES_PLAS | RES_NETH |
+F:RES_TELE | SMART | NO_CONF | NO_SLEEP | BASH_DOOR | ONLY_GOLD | DROP_4D2 |
+F:RES_NEXU | DROP_4D2 | RES_WATE | NO_STUN | EVIL |
+S:1_IN_3 |
+S:SCARE | BA_FIRE | BA_POIS | BA_COLD | BA_ELEC | BA_ACID | CONF |
+S:BO_FIRE | BO_COLD | BO_ICEE | BA_WATE | BO_ELEC | BO_ACID | BR_NETH |
+S:S_KIN | S_ANIMALS | S_MONSTERS |
+D:A cunning, evil reptile from the depths. It has so many heads that you
+D:give up after losing count twice.
+
+N:738:Old Sorcerer
+G:p:R
+I:130:52d25:20:60:10
+W:54:2:0:5000:0
+E:1:1:1:2:1:1
+O:0:0:100:0
+B:HIT:HURT:6d8
+B:HIT:HURT:6d8
+B:HIT:HURT:6d8
+F:MALE |
+F:FORCE_SLEEP | FORCE_MAXHP |
+F:ONLY_ITEM | DROP_4D2 |
+F:OPEN_DOOR | BASH_DOOR | TAKE_ITEM |
+F:EVIL | NO_CONF | NO_SLEEP | BASEANGBAND | HAS_LITE
+S:1_IN_2 |
+S:BLINK | TELE_TO | BLIND | CONF | CAUSE_3 | CAUSE_4 | TRAPS |
+S:BO_ACID | BA_FIRE | BA_COLD | BA_POIS |
+S:S_MONSTER | S_DEMON | S_HI_DRAGON | S_UNDEAD
+D:A human figure in robes, he moves with magically improved speed, and his
+D:hands are ablur with spellcasting. You stagger at the mighty sound of his
+D:spells as they echo hollowly through the dungeon.
+
+N:739:Ethereal hound
+G:Z:G
+I:120:60d15:30:100:0
+W:55:3:900:6000
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:BITE:HURT:2d12
+B:BITE:HURT:2d12
+B:BITE:HURT:2d12
+B:CLAW:HURT:2d12
+F:FORCE_SLEEP | FRIENDS |
+F:INVISIBLE | PASS_WALL |
+F:ANIMAL | NO_CONF | NO_SLEEP |
+F:MORTAL | BASEANGBAND
+S:1_IN_5 |
+S:BR_NETH
+D:A pale green hound. Pulsing red lines and strange fluorescent light
+D:hints at internal organs best left to the imagination.
+
+N:740:Lesser kraken
+G:~:G
+I:120:30d100:30:150:80
+W:54:2:8000:20000
+E:3:0:3:0:1:0
+O:25:25:50:0
+B:CRUSH:HURT:16d12
+B:CRUSH:HURT:16d12
+B:CRUSH:HURT:16d12
+B:CRUSH:HURT:16d12
+F:FORCE_SLEEP | FORCE_MAXHP | AQUATIC | WILD_TOO | WILD_OCEAN |
+F:ONLY_ITEM | DROP_3D2 | DROP_GOOD | DROP_CORPSE |
+F:BASH_DOOR | POWERFUL | MOVE_BODY | SMART | RES_WATE |
+F:EVIL | IM_ELEC | NO_CONF | NO_SLEEP | IM_POIS | IM_FIRE | BASEANGBAND
+S:1_IN_4 |
+S:BLIND | CONF | SCARE | CAUSE_4 | CAUSE_3 |
+S:BA_WATE | DARKNESS | BR_DARK | TELE_TO
+D:An enormously fearsome and powerful inhabitant of the depths. It
+D:resembles a gargantuan octopus and its evil is almost tangible.
+
+N:741:Great Ice Worm
+G:D:w
+I:120:40d100:30:150:80
+W:63:2:190000:20000
+E:0:1:0:6:1:0
+O:50:50:0:0
+B:CLAW:HURT:4d12
+B:CLAW:HURT:4d12
+B:BITE:COLD:6d14
+B:BITE:COLD:6d14
+F:FORCE_SLEEP | FORCE_MAXHP | AURA_COLD |
+F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 | DROP_GOOD | SUSCEP_FIRE |
+F:BASH_DOOR | POWERFUL | MOVE_BODY | DROP_CORPSE
+F:EVIL | DRAGON | IM_COLD | NO_CONF | NO_SLEEP | BASEANGBAND | HAS_LITE
+F:ATTR_MULTI
+S:1_IN_4 |
+S:BLIND | CONF | SCARE |
+S:BR_COLD
+D:An immense dragon capable of awesome destruction. You have never felt
+D:such extreme cold, or witnessed such an icy stare. Begone quickly or feel
+D:its wrath!
+
+N:742:Demilich
+G:L:U
+I:120:35d100:20:100:50
+W:54:2:3000:12500
+E:0:0:0:0:0:0
+O:0:0:100:0
+B:TOUCH:EXP_80
+B:TOUCH:UN_POWER
+B:TOUCH:LOSE_DEX:4d12
+B:TOUCH:LOSE_DEX:4d12
+F:FORCE_SLEEP | FORCE_MAXHP | SMART | RES_TELE |
+F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_GOOD |
+F:COLD_BLOOD | OPEN_DOOR | BASH_DOOR | CAN_FLY |
+F:EVIL | UNDEAD | IM_COLD | IM_POIS | NO_CONF | NO_SLEEP | BASEANGBAND
+F:NO_CUT
+S:1_IN_3 |
+S:BLINK | TELE_TO | BLIND | HOLD | CONF | SCARE | CAUSE_3 | CAUSE_4 |
+S:DRAIN_MANA | BRAIN_SMASH | S_HI_UNDEAD | S_UNDEAD | FORGET | S_DEMON |
+S:TPORT | HEAL | ANIM_DEAD
+D:A lich who is partially immaterial, on its way to a new, ethereal form.
+
+N:743:The Phoenix
+G:B:R
+I:120:36d100:60:130:0
+W:54:3:6000:40000
+E:0:1:1:0:1:0
+O:0:50:50:0
+B:BITE:FIRE:12d6
+B:BITE:FIRE:12d6
+B:HIT:FIRE:9d12
+B:HIT:FIRE:9d12
+F:UNIQUE | CAN_SPEAK | RES_PLAS | AURA_FIRE |
+F:FORCE_SLEEP | FORCE_MAXHP | CAN_FLY | SUSCEP_COLD |
+F:ONLY_ITEM | DROP_2D2 | DROP_GOOD |
+F:OPEN_DOOR | BASH_DOOR |
+F:ANIMAL | IM_ACID | IM_FIRE | IM_ELEC | IM_POIS | NO_CONF | NO_SLEEP
+F:JOKEANGBAND | HAS_LITE | REGENERATE
+S:1_IN_3 |
+S:BO_FIRE | BO_PLAS | BA_FIRE |
+S:BR_FIRE | BR_LITE | BR_PLAS
+D:A massive glowing eagle bathed in flames. The searing heat chars your
+D:skin and melts your armour.
+
+N:744:Nightcrawler
+G:W:D
+I:120:80d60:20:160:10
+W:69:3:10000:1500
+E:0:0:0:0:1:0
+O:40:0:50:10
+B:STING:LOSE_CON:8d8
+B:STING:LOSE_CON:8d8
+B:BITE:ACID:10d10
+B:BITE:ACID:10d10
+F:FORCE_SLEEP | SMART | KILL_WALL | CAN_SWIM | FORCE_MAXHP |
+F:ONLY_ITEM | DROP_1D2 | DROP_2D2 | DROP_GOOD |
+F:COLD_BLOOD | OPEN_DOOR | BASH_DOOR |
+F:EVIL | UNDEAD | IM_FIRE | IM_COLD | IM_POIS | RES_TELE |
+F:HURT_LITE | NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT
+S:1_IN_4 |
+S:BLIND | SCARE | BRAIN_SMASH |
+S:BO_MANA | BO_NETH | BA_NETH | BR_NETH | 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.
+D:It is like nothing you have ever seen before, and a terrible chill runs
+D:down your spine as you face it.
+
+# New monster added by furiosity for the Theme module
+N:745:Forest ogre
+G:O:g
+I:110:13d10:20:37:30
+W:18:2:2100:70
+E:1:1:1:2:1:1
+O:10:85:0:0
+B:HIT:HURT:3d9
+B:BITE:POISON:2d8
+F:FRIENDS |
+F:DROP_60 | WILD_TOO | WILD_WOOD | WILD_MOUNTAIN | DROP_CORPSE |
+F:OPEN_DOOR | BASH_DOOR | IM_POIS | CAN_FLY
+F:EVIL | GIANT |
+F:MORTAL | BASEANGBAND | HAS_LITE
+D:A hideous, smallish giant that is often found near or with orcs.
+D:This ogre prefers living in the forest and can pass through
+D:thick forests with ease.
+
+# New monster added by furiosity for the Theme module
+# A pet ogre without friends
+N:746:Rebel ogre
+G:O:y
+I:110:13d9:20:33:30
+W:13:2:2100:50
+E:1:1:1:2:1:1
+O:10:85:0:0
+B:HIT:HURT:2d8
+F:DROP_60 | WILD_TOO | WILD_WOOD | WILD_MOUNTAIN | DROP_CORPSE |
+F:OPEN_DOOR | BASH_DOOR | PET |
+F:GOOD | GIANT |
+F:MORTAL | BASEANGBAND | HAS_LITE
+D:A rebel among ogres, who has joined the forces of the Light to
+D:fight agains the Shadow.
+
+# New monster added by furiosity for the Theme module
+# A pet hill giant
+N:747:Rebel giant
+G:P:R
+I:110:30d15:20:45:50
+W:25:3:3500:150
+E:1:1:1:2:1:1
+O:20:50:20:5
+B:HIT:HURT:4d8
+B:HIT:HURT:4d8
+F:DROP_60 | WILD_TOO | WILD_MOUNTAIN | DROP_SKELETON | DROP_CORPSE |
+F:OPEN_DOOR | BASH_DOOR | PET |
+F:GOOD | GIANT | MALE |
+F:MORTAL | BASEANGBAND | HAS_LITE
+D:A ten foot tall humanoid with powerful muscles. This giant has
+D:abandoned the Darkness in favour of the forces of good. Thus he
+D:is a rebel and hated among his kind.
+
+N:748:Hand druj
+G:s:y
+I:130:60d10:20:110:10
+W:57:2:10:18000
+E:0:0:0:1:0:0
+O:0:0:0:0
+F:FORCE_SLEEP | FORCE_MAXHP | NEVER_MOVE | NEVER_BLOW | RES_TELE |
+F:SMART | COLD_BLOOD | CAN_SWIM |
+F:EVIL | UNDEAD | IM_COLD | IM_POIS |
+F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT
+S:1_IN_1 |
+S:TELE_AWAY | BLIND | CONF | SCARE | CAUSE_3 | FORGET | DARKNESS |
+S:BO_FIRE | BO_ACID | BO_COLD | BO_ELEC
+D:A skeletal hand floating in the air, motionless except for its flexing
+D:fingers.
+
+N:749:Eye druj
+G:s:r
+I:130:10d100:20:90:10
+W:58:2:2:21000
+E:0:0:0:0:0:0
+O:0:0:0:0
+F:FORCE_SLEEP | FORCE_MAXHP | NEVER_MOVE | NEVER_BLOW | RES_TELE |
+F:SMART | COLD_BLOOD |
+F:EVIL | UNDEAD | CAN_SWIM |
+F:IM_FIRE | IM_COLD | IM_POIS |
+F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT
+S:1_IN_1 |
+S:BO_MANA | BO_NETH | BA_NETH | BRAIN_SMASH | S_UNDEAD
+D:A bloodshot eyeball floating in the air, you'd be forgiven for assuming it
+D:harmless.
+
+N:750:Skull druj
+G:s:o
+I:130:14d100:20:120:10
+W:59:2:1000:24000
+E:0:0:0:0:1:0
+O:0:0:0:0
+F:FORCE_SLEEP | FORCE_MAXHP | NEVER_MOVE | RES_TELE |
+F:SMART | COLD_BLOOD |
+F:EVIL | UNDEAD | CAN_SWIM |
+F:IM_FIRE | IM_COLD | IM_POIS |
+F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT
+S:1_IN_1 |
+S:SLOW | CAUSE_4 | MIND_BLAST | BRAIN_SMASH | TRAPS | BO_PLAS |
+S:BO_NETH | BA_WATE | S_UNDEAD
+D:A glowing skull possessed by sorcerous power. It need not move, but
+D:merely blast you with mighty magic.
+
+N:751:Chaos vortex
+G:v:v
+I:140:32d20:100:80:0
+W:53:1:0:4000
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:ENGULF:CONFUSE:5d5
+B:ENGULF:CONFUSE:5d5
+B:ENGULF:HURT:5d5
+B:ENGULF:HURT:5d5
+F:ATTR_MULTI | ATTR_ANY | FORCE_SLEEP |
+F:RAND_50 | RAND_25 | CAN_FLY |
+F:EMPTY_MIND | BASH_DOOR | POWERFUL |
+F:NO_CONF | NO_SLEEP | NO_FEAR | NONLIVING | BASEANGBAND | NO_CUT
+S:1_IN_6 |
+S:BR_CHAO
+D:Void, nothingness, spinning destructively.
+
+N:752:Aether vortex
+G:v:v
+I:130:40d20:100:40:0
+W:54:2:0:5000
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:ENGULF:ELEC:5d5
+B:ENGULF:FIRE:5d5
+B:ENGULF:ACID:5d5
+B:ENGULF:COLD:5d5
+F:ATTR_MULTI | ATTR_ANY | FORCE_SLEEP | CAN_FLY |
+F:RAND_50 | RAND_25 | AURA_COLD | RES_WATE | RES_DISE |
+F:EMPTY_MIND | BASH_DOOR | POWERFUL | RES_NETH | RES_NEXU |
+F:IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | AURA_FIRE | AURA_ELEC |
+F:NO_CONF | NO_SLEEP | NO_FEAR | NONLIVING | RES_PLAS | BASEANGBAND | NO_CUT
+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.
+
+# New monster added by furiosity for the Theme module
+N:753:Spider quylthulg
+G:Q:D
+I:120:48d10:20:1:0
+W:45:1:3000:3000
+E:0:0:0:0:0:0
+O:0:0:0:0
+F:FORCE_SLEEP | FORCE_MAXHP | NEVER_MOVE | NEVER_BLOW |
+F:INVISIBLE | EMPTY_MIND | ANIMAL |
+F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND
+S:1_IN_2 |
+S:BLINK | TPORT |
+S:S_SPIDER
+D:It is a pulsing flesh mound that was once a spider.
+
+# New monster added by furiosity for the Theme module
+N:754:Canine quylthulg
+G:Q:s
+I:120:48d10:20:1:0
+W:45:1:3000:3000
+E:0:0:0:0:0:0
+O:0:0:0:0
+F:FORCE_SLEEP | FORCE_MAXHP | NEVER_MOVE | NEVER_BLOW |
+F:INVISIBLE | EMPTY_MIND | ANIMAL |
+F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND
+S:1_IN_2 |
+S:BLINK | TPORT |
+S:S_HOUND
+D:It is a pulsing flesh mound that was once a hound.
+
+N:755:Thuringwethil, the Vampire Messenger
+G:V:v
+I:130:50d100:20:145:10
+W:67:3:1500:23000
+E:1:1:1:2:1:1
+O:0:50:50:0
+B:BITE:EXP_80:6d6
+B:BITE:EXP_80:6d6
+B:HIT:CONFUSE:6d6
+B:HIT:CONFUSE:6d6
+F:UNIQUE | FEMALE | SPECIAL_GENE |
+F:FORCE_SLEEP | FORCE_MAXHP | SMART | CAN_SPEAK | CAN_FLY |
+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 | NO_STUN
+F:RES_TELE | BASEANGBAND | NO_CUT
+S:1_IN_3 |
+S:BLIND | HOLD | SCARE | CAUSE_3 | CAUSE_4 | DRAIN_MANA |
+S:BRAIN_SMASH | BA_NETH | S_KIN | S_HI_UNDEAD
+D:Chief messenger between Sauron and Morgoth, she is the most deadly of the
+D:vampire race on Middle-earth. At first she is charming to meet, but her
+D:wings and eyes give away her true form.
+
+N:756:Great Worm of Fire
+G:D:r
+I:120:50d100:30:150:80
+W:67:2:190000:23000
+E:0:1:0:6:1:0
+O:50:50:0:0
+B:CLAW:HURT:4d12
+B:CLAW:HURT:4d12
+B:BITE:FIRE:6d14
+B:BITE:FIRE:6d14
+F:FORCE_SLEEP | FORCE_MAXHP | CAN_FLY | DROP_CORPSE |
+F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 | DROP_GOOD | SUSCEP_COLD |
+F:BASH_DOOR | POWERFUL | MOVE_BODY | AURA_FIRE |
+F:EVIL | DRAGON | IM_FIRE | NO_CONF | NO_SLEEP | BASEANGBAND | HAS_LITE
+F:ATTR_MULTI
+S:1_IN_4 |
+S:BLIND | CONF | SCARE |
+S:BR_FIRE
+D:A vast dragon of immense power. Fire leaps continuously from its huge
+D:form. The air around it scalds you. Its slightest glance burns you, and
+D:you realise how truly insignificant you are.
+
+# New monster added by furiosity for the Theme module
+N:757:Aquatic quylthulg
+G:Q:b
+I:120:48d10:20:1:0
+W:45:1:3000:3000
+E:0:0:0:0:0:0
+O:0:0:0:0
+F:FORCE_SLEEP | FORCE_MAXHP | NEVER_MOVE | NEVER_BLOW |
+F:INVISIBLE | EMPTY_MIND | ANIMAL | AQUATIC |
+F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND
+S:1_IN_2 |
+S:BLINK | TPORT |
+S:S_HYDRA
+D:It is a pulsing flesh mound that was once a many-headed reptile.
+
+# New monster added by furiosity for the Theme module
+N:758:Adventurer quylthulg
+G:Q:w
+I:120:48d10:20:1:0
+W:45:3:3000:3000
+E:0:0:0:0:0:0
+O:0:0:0:0
+F:FORCE_SLEEP | FORCE_MAXHP | NEVER_MOVE | NEVER_BLOW |
+F:INVISIBLE | EMPTY_MIND | ANIMAL | PET |
+F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND
+S:1_IN_2 |
+S:BLINK | TPORT |
+S:S_KIN
+D:It is a pulsing flesh mound that was once a fellow adventurer.
+
+N:759:Draconic quylthulg
+G:Q:g
+I:120:48d10:20:1:0
+W:45:1:3000:3000
+E:0:0:0:0:0:0
+O:0:0:0:0
+F:FORCE_SLEEP | FORCE_MAXHP | NEVER_MOVE | NEVER_BLOW |
+F:INVISIBLE | EMPTY_MIND | ANIMAL |
+F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND
+S:1_IN_2 |
+S:BLINK | TPORT |
+S:S_DRAGON
+D:It looks like it was once a dragon corpse, now deeply infected with
+D:bacteria that make it pulse in a foul way.
+
+# New monster added by furiosity for the Theme module
+N:760:White hulk
+G:X:w
+I:110:20d10:20:60:10
+W:20:1:5000:90
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:GAZE:CONFUSE
+B:HIT:COLD:2d6
+B:HIT:HURT:2d6
+B:BITE:COLD:3d6
+F:EMPTY_MIND | COLD_BLOOD | IM_COLD |
+F:BASH_DOOR | KILL_WALL | DROP_SKELETON |
+F:ANIMAL | EVIL | SUSCEP_FIRE | AURA_COLD |
+F:IM_POIS |
+F:HURT_ROCK | NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT
+D:This bizarre creature has glaring eyes and large mandibles capable of
+D:slicing through rock. It is adapted to extreme cold environments.
+
+# New monster added by furiosity for the Theme module
+N:761:Death hulk
+G:X:D
+I:110:99d10:20:80:10
+W:40:1:5000:1000
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:GAZE:CONFUSE
+B:HIT:EXP_40:3d8
+B:HIT:HURT:3d8
+B:BITE:HURT:3d8
+F:EMPTY_MIND | COLD_BLOOD | SMART |
+F:BASH_DOOR | KILL_WALL | DROP_SKELETON |
+F:ANIMAL | EVIL | RES_NETH | HURT_LITE |
+F:IM_POIS |
+F:HURT_ROCK | NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT
+S:1_IN_8 |
+S:DARKNESS | S_UNDEAD
+D:This bizarre creature has glaring eyes and large mandibles capable of
+D:slicing through rock. It seems to be surrounded by an impenetrable
+D:shadow.
+
+N:762:Fundin Bluecloak
+G:k:B
+I:130:50d100:25:195:10
+W:56:2:1400:20000
+E:1:1:1:2:1:1
+O:0:80:20:0
+B:HIT:HURT:10d10
+B:HIT:HURT:8d6
+B:HIT:HURT:8d6
+B:HIT:HURT:8d6
+F:UNIQUE | MALE | CAN_SPEAK | DROP_CORPSE
+F:FORCE_SLEEP | FORCE_MAXHP | PET |
+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 |
+F:MORTAL | BASEANGBAND | HAS_LITE
+S:1_IN_4 |
+S:HEAL | BLIND | CONF | SCARE | CAUSE_3 | CAUSE_4 | BRAIN_SMASH |
+S:FORGET | S_MONSTERS | S_ANIMALS
+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
+D:spell only justify his position further. His combination of Dwarven
+D:strength and priestly wisdom are a true match for any adventurer.
+
+N:763:Black Balrog
+G:U:D
+I:120:20d100:20:50:80
+W:61:4:9000:10000
+E:1:1:1:2:1:1
+O:0:50:50:0
+B:HIT:ACID:4d12
+B:HIT:ACID:4d12
+B:CRUSH:HURT:3d12
+B:TOUCH:UN_POWER
+F:FORCE_SLEEP | FORCE_MAXHP | KILL_WALL |
+F:ONLY_ITEM | DROP_1D2 | DROP_2D2 | DROP_GOOD |
+F:OPEN_DOOR | BASH_DOOR | POWERFUL | MOVE_BODY |
+F:EVIL | DEMON | IM_ACID | NO_CONF | NO_SLEEP | NONLIVING |
+F:BASEANGBAND | HAS_LITE
+S:1_IN_4 |
+S:BLIND | CONF | SCARE | HASTE |
+S:BR_ACID |
+S:S_DEMON
+D:The greatest of the demons, potent in both magical might
+D:and sheer battle power. This corrupted Maia's form is
+D:surrounded by whirlpools of acid.
+
+# New monster added by furiosity for the Theme module
+N:764:Orange hulk
+G:X:o
+I:110:20d10:20:60:10
+W:20:1:5000:90
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:GAZE:CONFUSE
+B:HIT:POISON:2d6
+B:HIT:HURT:2d6
+B:BITE:POISON:3d6
+F:EMPTY_MIND | COLD_BLOOD |
+F:BASH_DOOR | KILL_WALL | DROP_SKELETON |
+F:ANIMAL | EVIL |
+F:IM_POIS |
+F:HURT_ROCK | NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT
+D:This bizarre creature has glaring eyes and large mandibles capable of
+D:slicing through rock. It looks poisonous.
+
+# New monster added by furiosity for the Theme module
+N:765:Fire hulk
+G:X:r
+I:110:20d10:20:60:10
+W:20:1:5000:90
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:GAZE:CONFUSE
+B:HIT:FIRE:2d6
+B:HIT:HURT:2d6
+B:BITE:FIRE:3d6
+F:EMPTY_MIND | COLD_BLOOD | IM_FIRE |
+F:BASH_DOOR | KILL_WALL | DROP_SKELETON |
+F:ANIMAL | EVIL | SUSCEP_COLD | AURA_FIRE |
+F:IM_POIS |
+F:HURT_ROCK | NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT
+D:This bizarre creature has glaring eyes and large mandibles capable of
+D:slicing through rock. It is surrounded by flames.
+
+N:766:Ancalagon the Black
+G:D:D
+I:140:180d100:40:170:70
+W:90:1:330000:60000
+E:0:1:0:6:1:0
+O:60:40:0:0
+B:CLAW:HURT:10d12
+B:CLAW:HURT:10d12
+B:BITE:HURT:10d14
+B:BITE:HURT:10d14
+F:UNIQUE | MALE | CAN_FLY | DROP_CORPSE |
+F:FORCE_SLEEP | FORCE_MAXHP |
+F:ESCORT |
+F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 | DROP_GOOD | DROP_GREAT |
+F:OPEN_DOOR | BASH_DOOR | POWERFUL | MOVE_BODY |
+F:EVIL | DRAGON |
+F:IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | NO_CONF |
+F:BASEANGBAND | HAS_LITE
+S:1_IN_3 |
+S:BR_ACID | BR_FIRE | BR_DISI | BR_WALL | BR_TIME |
+S:S_HI_DRAGON | S_KIN
+D:"Rushing Jaws" is his name, and death is his game; the greatest and most
+D:terrible of all dragonkind, his power dismayed even the Valar for a time.
+
+# New monster added by furiosity for the Theme module
+N:767:Forest hulk
+G:X:g
+I:110:20d10:20:60:10
+W:20:1:5000:90
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:GAZE:CONFUSE
+B:HIT:POISON:2d6
+B:HIT:HURT:2d6
+B:BITE:PARALYZE:3d6
+F:EMPTY_MIND | COLD_BLOOD |
+F:BASH_DOOR | KILL_WALL | DROP_SKELETON |
+F:ANIMAL | EVIL |
+F:IM_POIS |
+F:NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT
+D:This bizarre creature has glaring eyes and large mandibles capable of
+D:slicing through rock. Its preferred habitat is a forest, however.
+
+N:768:Nightwalker
+G:W:D
+I:130:80d70:20:175:10
+W:73:3:75000:20000
+E:1:1:1:2:1:1
+O:30:0:70:0
+B:HIT:UN_BONUS:10d10
+B:HIT:UN_BONUS:10d10
+B:HIT:UN_BONUS:7d7
+B:HIT:UN_BONUS:7d7
+F:FORCE_SLEEP | FORCE_MAXHP |
+F:ONLY_ITEM | DROP_4D2 | DROP_GOOD | CAN_SWIM |
+F:SMART | COLD_BLOOD | OPEN_DOOR | BASH_DOOR | RES_TELE |
+F:EVIL | UNDEAD | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS |
+F:HURT_LITE | NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT
+S:1_IN_4 |
+S:BLIND | SCARE | BRAIN_SMASH |
+S:BO_MANA | BO_NETH | BA_NETH | S_UNDEAD
+D:A huge giant garbed in black, more massive than a titan and stronger than
+D:a dragon. With terrible blows, it breaks your armour from your back,
+D:leaving you defenceless against its evil wrath. It can smell your fear,
+D:and you in turn smell the awful stench of death as this ghastly figure
+D:strides towards you menacingly.
+
+# New monster added by furiosity for the Theme module
+N:769:Night hulk
+G:X:b
+I:110:20d10:20:60:10
+W:20:1:5000:90
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:GAZE:CONFUSE
+B:HIT:BLIND:2d6
+B:HIT:HURT:2d6
+B:BITE:EAT_LITE:3d6
+F:EMPTY_MIND | COLD_BLOOD |
+F:BASH_DOOR | KILL_WALL | DROP_SKELETON |
+F:ANIMAL | EVIL | HURT_LITE |
+F:IM_POIS |
+F:HURT_ROCK | NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT
+D:This bizarre creature has glaring eyes and large mandibles capable of
+D:slicing through rock. It prefers to dwell in dark caves where there is
+D:no sun.
+
+# New monster added by furiosity for the Theme module
+N:770:Silver hulk
+G:X:W
+I:110:20d10:20:60:10
+W:20:1:5000:90
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:GAZE:CONFUSE
+B:HIT:HALLU:2d6
+B:HIT:HURT:2d6
+B:BITE:INSANITY:3d6
+F:EMPTY_MIND | COLD_BLOOD | IM_COLD |
+F:BASH_DOOR | KILL_WALL | DROP_SKELETON |
+F:ANIMAL | EVIL |
+F:IM_POIS |
+F:HURT_ROCK | NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT
+D:This bizarre creature has glaring eyes and large mandibles capable of
+D:slicing through rock. It is an extremely confusing sight to behold.
+
+N:771:Saruman of Many Colours
+G:p:v
+I:120:70d100:100:100:0
+W:60:1:1600:35000
+E:1:1:1:2:1:1
+O:0:0:100:0
+B:HIT:UN_BONUS:6d8
+B:HIT:UN_BONUS:6d8
+B:HIT:HURT:5d5
+B:HIT:HURT:5d5
+F:UNIQUE | MALE | ATTR_MULTI | CAN_SPEAK |
+F:FORCE_SLEEP | FORCE_MAXHP | REFLECTING | RES_TELE
+F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 | DROP_GOOD |
+F:DROP_GREAT | DROP_CHOSEN | SPECIAL_GENE
+F:SMART | OPEN_DOOR | BASH_DOOR |
+F:EVIL | IM_FIRE | IM_COLD |
+F:IM_ELEC | IM_POIS | BASEANGBAND | HAS_LITE
+S:1_IN_2 |
+S:HEAL | HASTE | TPORT | TELE_AWAY | BLIND | CONF | SCARE |
+S:CAUSE_4 | MIND_BLAST | FORGET | TRAPS | ANIM_DEAD | BO_MANA |
+S:BO_ICEE | BA_ACID | BA_FIRE | BA_COLD | BA_WATE | BA_CHAO |
+S:S_UNDEAD | S_DEMON | S_HI_DRAGON | S_ANIMALS |
+D:Originally known as the White, Saruman fell prey to Sauron's wiles. He
+D:searches forever for the One Ring, to become a mighty Sorcerer-King of the
+D:world.
+
+N:772:Harowen the Black Hand
+G:p:B
+I:140:25d100:30:36:0
+W:51:3:0:20000
+E:1:1:1:2:1:1
+O:90:10:0:0
+B:TOUCH:EAT_GOLD:5d5
+B:TOUCH:EAT_ITEM:5d5
+B:HIT:BLIND:10d5
+B:HIT:POISON:8d5
+F:UNIQUE | MALE | CAN_SPEAK | SMART |
+F:FORCE_SLEEP | FORCE_MAXHP | MOVE_BODY |
+F:ONLY_ITEM | DROP_1D2 | DROP_4D2 | DROP_GOOD |
+F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR |
+F:IM_POIS | BASEANGBAND
+S:1_IN_6 |
+S:TELE_TO | TRAPS
+D:He is a master of disguise, an expert of stealth, a genius at traps, and
+D:moves with blinding speed.
+
+N:773:Blue Balrog
+G:U:b
+I:120:20d100:20:50:80
+W:61:4:9000:10000
+E:1:1:1:2:1:1
+O:0:50:50:0
+B:HIT:ELEC:4d12
+B:HIT:ELEC:4d12
+B:CRUSH:HURT:3d12
+B:TOUCH:UN_POWER
+F:FORCE_SLEEP | FORCE_MAXHP | AURA_ELEC | KILL_WALL |
+F:ONLY_ITEM | DROP_1D2 | DROP_2D2 | DROP_GOOD |
+F:OPEN_DOOR | BASH_DOOR | POWERFUL | MOVE_BODY |
+F:EVIL | DEMON | IM_ELEC | NO_CONF | NO_SLEEP | NONLIVING |
+F:BASEANGBAND | HAS_LITE
+S:1_IN_4 |
+S:BLIND | CONF | SCARE | HASTE |
+S:BR_ELEC |
+S:S_DEMON
+D:The greatest of the demons, potent in both magical might
+D:and sheer battle power. This corrupted Maia's form is
+D:surrounded by living lightning.
+
+N:774:Dreadlord
+G:G:r
+I:120:30d100:20:150:10
+W:62:2:0:20000
+E:0:0:0:0:0:0
+O:10:10:60:10
+B:HIT:EXP_40:6d6
+B:HIT:EXP_40:6d6
+B:HIT:LOSE_STR:4d6
+B:HIT:LOSE_STR:4d6
+F:FORCE_SLEEP | FORCE_MAXHP |
+F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 |
+F:INVISIBLE | COLD_BLOOD | TAKE_ITEM | PASS_WALL |
+F:EVIL | UNDEAD | CAN_FLY |
+F:IM_COLD | IM_POIS | NO_CONF | NO_SLEEP | RES_TELE | BASEANGBAND | NO_CUT
+S:1_IN_3 |
+S:HOLD | DRAIN_MANA | BLIND | S_UNDEAD | CONF |
+S:SCARE | TELE_TO | TPORT | BRAIN_SMASH | ANIM_DEAD
+S:BA_NETH | DARKNESS
+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
+D:the stench of death.
+
+N:775:Greater kraken
+G:~:G
+I:120:40d100:30:175:80
+W:60:2:10000:25000
+E:3:0:3:0:1:0
+O:10:80:0:10
+B:CRUSH:HURT:15d15
+B:CRUSH:HURT:15d15
+B:CRUSH:HURT:15d15
+B:CRUSH:HURT:15d15
+F:FORCE_SLEEP | FORCE_MAXHP | AQUATIC | WILD_TOO | WILD_OCEAN |
+F:ONLY_ITEM | DROP_3D2 | DROP_GOOD | DROP_CORPSE |
+F:BASH_DOOR | POWERFUL | MOVE_BODY | SMART | RES_WATE |
+F:EVIL | IM_ELEC | NO_CONF | NO_SLEEP | IM_POIS | IM_FIRE | BASEANGBAND
+S:1_IN_3 |
+S:BLIND | CONF | SCARE | CAUSE_4 | CAUSE_3 | TELE_TO | TELE_AWAY |
+S:BA_WATE | DARKNESS | BR_DARK | BR_ACID | BR_POIS
+D:An enormously fearsome and powerful inhabitant of the depths. It
+D:resembles a gargantuan octopus and its evil is almost tangible.
+
+N:776:Archlich
+G:L:B
+I:120:45d100:20:120:50
+W:64:2:0:20000
+E:0:0:0:0:0:0
+O:0:0:100:0
+B:TOUCH:EXP_80
+B:TOUCH:UN_POWER
+B:TOUCH:LOSE_DEX:8d12
+B:TOUCH:LOSE_DEX:8d12
+F:FORCE_SLEEP | FORCE_MAXHP | SMART | RES_TELE | CAN_FLY |
+F:ONLY_ITEM | DROP_4D2 | DROP_2D2 | DROP_GOOD |
+F:COLD_BLOOD | OPEN_DOOR | BASH_DOOR | PASS_WALL |
+F:EVIL | UNDEAD | IM_COLD | IM_POIS | NO_CONF | NO_SLEEP | BASEANGBAND
+F:NO_CUT
+S:1_IN_3 |
+S:BLINK | TELE_TO | BLIND | HOLD | SCARE | CAUSE_4 |
+S:DRAIN_MANA | BRAIN_SMASH | S_HI_UNDEAD | FORGET |
+S:TPORT | HEAL | S_DEMON | BA_NETH | ANIM_DEAD
+D:A lich who has reached its ultimate evolutionary stage: a completely
+D:immaterial state.
+
+# Description of Tevildo taken from UnAngband
+N:777:Tevildo, Prince of Cats
+G:f:v
+I:130:48d100:100:200:0
+W:66:3:0:30000
+E:0:1:0:2:1:0
+O:30:60:0:10
+B:CLAW:CONFUSE:12d12
+B:CLAW:LOSE_DEX:2d12
+B:CLAW:BLIND:10d5
+B:BITE:PARALYZE:15d1
+F:UNIQUE | MALE |
+F:FORCE_SLEEP | FORCE_MAXHP |
+F:ESCORT | ESCORTS |
+F:ONLY_ITEM | DROP_4D2 | DROP_GOOD |
+F:INVISIBLE | OPEN_DOOR | BASH_DOOR |
+F:IM_FIRE | IM_COLD | IM_POIS | NO_CONF | BASEANGBAND
+S:1_IN_3 |
+S:TELE_TO | S_KIN
+D:Master of all things feline and mighty servant of Morgoth. A great cat, coal-black and evil to look upon. His eyes are long and very narrow and slanted, and gleam both red and green. His great grey whiskers are as stout and sharp as needles. His purr is like the roll of drums and his growl like thunder.
+
+N:778:Jabberwock
+G:H:v
+I:130:32d100:35:125:255
+W:68:3:2300:19000
+E:0:1:0:2:1:0
+O:20:50:20:0
+B:CLAW:HURT:10d10
+B:CLAW:HURT:10d10
+B:BITE:HURT:10d10
+B:BITE:HURT:10d10
+F:ATTR_MULTI |
+F:FORCE_SLEEP | FORCE_MAXHP | RES_TELE |
+F:ONLY_ITEM | DROP_60 | DROP_90 |
+F:BASH_DOOR | CAN_FLY | DROP_CORPSE |
+F:ANIMAL | MORTAL | JOKEANGBAND |
+S:1_IN_5 |
+S:CAUSE_4 |
+S:BR_CHAO
+D:"Beware the Jabberwock, my son! The jaws that bite, the claws that catch!"
+
+N:779:Chaos hound
+G:Z:v
+I:120:60d30:30:100:0
+W:65:2:900:10000
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:BITE:HURT:2d12
+B:BITE:HURT:2d12
+B:BITE:HURT:2d12
+B:CLAW:HURT:2d12
+F:ATTR_MULTI | ATTR_ANY | DROP_SKELETON | DROP_CORPSE |
+F:FORCE_SLEEP | FRIENDS | BASH_DOOR |
+F:ANIMAL | NO_CONF | NO_SLEEP | BASEANGBAND
+S:1_IN_5 |
+S:BR_CHAO
+D:A constantly changing canine form, this hound rushes towards you as if
+D:expecting mayhem and chaos ahead. It appears to have an almost kamikaze
+D:relish for combat. You suspect all may not be as it seems.
+
+# New monster added by furiosity for the Theme module
+N:780:Chaos hulk
+G:X:v
+I:110:25d10:20:80:10
+W:30:1:5000:110
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:GAZE:CONFUSE
+B:HIT:HALLU:2d6
+B:HIT:LOSE_ALL:2d6
+B:BITE:EXP_40:3d6
+F:EMPTY_MIND | COLD_BLOOD |
+F:BASH_DOOR | KILL_WALL | DROP_SKELETON |
+F:ANIMAL | EVIL |
+F:IM_POIS |
+F:HURT_ROCK | NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT
+D:This bizarre creature has glaring eyes and large mandibles capable of
+D:slicing through rock. It is surrounded by an aura of chaotic forces.
+
+N:781:Beholder hive-mother
+G:e:y
+I:120:40d100:30:80:10
+W:67:3:2600:17000
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:BITE:EXP_80:6d6
+B:GAZE:PARALYZE:5d5
+B:GAZE:INSANITY:5d5
+B:GAZE:UN_POWER:5d5
+F:FORCE_SLEEP | FORCE_MAXHP | RES_TELE | CAN_FLY |
+F:BASH_DOOR | FEMALE | SMART | DROP_CORPSE |
+F:EVIL | IM_POIS | NO_CONF | NO_SLEEP | BASEANGBAND
+S:1_IN_2 |
+S:BLIND | CONF | FORGET | SCARE | DRAIN_MANA | BRAIN_SMASH |
+S:BA_DARK | BO_MANA | BA_ACID | BA_FIRE | BA_COLD | BO_NETH |
+S:S_KIN
+D:A mother of the race of beholders, she can summon her brood to her aid
+D:whenever she wishes.
+
+N:782:Leviathan
+G:~:v
+I:120:50d100:40:180:30
+W:67:3:300000:28000
+E:0:1:0:6:1:0
+O:0:0:0:0
+B:BITE:FIRE:5d12
+B:BITE:FIRE:5d12
+B:CRUSH:HURT:6d15
+B:CRUSH:HURT:6d15
+F:FORCE_SLEEP | FORCE_MAXHP | AQUATIC | WILD_TOO | WILD_OCEAN |
+F:IM_FIRE | IM_ACID | IM_COLD | IM_POIS |
+F:ANIMAL | NO_CONF | NO_SLEEP | NO_FEAR | DROP_CORPSE | BASEANGBAND
+S:1_IN_9
+S:BR_FIRE | BR_ACID | BR_DARK | BR_POIS | BA_WATE |
+S:S_DRAGON | S_HYDRA | HEAL | CONF | DARKNESS
+D:An enormous, terrible sea-monster, the true master of the ocean.
+
+N:783:Great Worm of Chaos
+G:D:v
+I:120:60d100:40:170:100
+W:75:2:190000:29000
+E:0:1:0:6:1:0
+O:50:50:0:0
+B:CLAW:HURT:5d12
+B:CLAW:HURT:5d12
+B:BITE:HURT:7d14
+B:BITE:HURT:7d14
+F:ATTR_MULTI | ATTR_ANY |
+F:FORCE_SLEEP | FORCE_MAXHP | RES_DISE | DROP_CORPSE |
+F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 | DROP_GOOD |
+F:BASH_DOOR | POWERFUL | MOVE_BODY | CAN_FLY |
+F:EVIL | DRAGON | NO_CONF | NO_SLEEP | BASEANGBAND | HAS_LITE
+S:1_IN_4 |
+S:BLIND | CONF | SCARE |
+S:BR_CHAO | BR_DISE |
+S:S_DRAGON | S_HI_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
+D:stay real. Its very existence distorts the universe around it.
+
+N:784:Great Worm of Law
+G:D:B
+I:120:60d100:40:170:100
+W:75:2:190000:29000
+E:0:1:0:6:1:0
+O:50:50:0:0
+B:CLAW:HURT:5d12
+B:CLAW:HURT:5d12
+B:BITE:HURT:7d14
+B:BITE:HURT:7d14
+F:FORCE_SLEEP | FORCE_MAXHP | DROP_CORPSE |
+F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 | DROP_GOOD |
+F:BASH_DOOR | POWERFUL | MOVE_BODY | CAN_FLY |
+F:EVIL | DRAGON | NO_STUN | NO_SLEEP | BASEANGBAND | HAS_LITE | NO_CUT
+F:ATTR_MULTI
+S:1_IN_4 |
+S:BLIND | CONF | SCARE |
+S:BR_SOUN | BR_SHAR |
+S:S_DRAGON | S_HI_DRAGON
+D:A massive dragon of powerful intellect. It seeks to dominate the universe
+D:and despises all other life. It sees all who do not obey it as mere
+D:insects to be crushed underfoot.
+
+N:785:Great Worm of Balance
+G:D:v
+I:120:70d100:40:170:100
+W:80:2:190000:31000
+E:0:1:0:6:1:0
+O:50:50:0:0
+B:CLAW:HURT:6d12
+B:CLAW:HURT:6d12
+B:BITE:HURT:8d14
+B:BITE:HURT:8d14
+F:DRAGON | EVIL | DROP_CORPSE |
+F:FORCE_SLEEP | FORCE_MAXHP | CAN_FLY |
+F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 | DROP_GOOD |
+F:BASH_DOOR | POWERFUL | MOVE_BODY | RES_DISE |
+F:NO_STUN | NO_CONF | NO_SLEEP | BASEANGBAND | HAS_LITE | NO_CUT | ATTR_MULTI
+S:1_IN_4 |
+S:BLIND | CONF | SCARE |
+S:BR_SOUN | BR_CHAO | BR_SHAR | BR_DISE |
+S:S_DRAGON | S_HI_DRAGON
+D:A massive dragon, it is thousands of
+D:years old and seeks to maintain the Cosmic Balance. It sees you as an
+D:upstart troublemaker without the wisdom to control your actions.
+
+# New monster added by furiosity for the Theme module
+N:786:Yellow hulk
+G:X:y
+I:120:32d10:20:80:10
+W:40:1:500000:1200
+E:0:0:0:3:0:0
+O:0:0:0:0
+B:HIT:ACID:3d4
+B:HIT:ACID:3d4
+B:HIT:ACID:3d4
+B:HIT:ACID:3d4
+F:FORCE_MAXHP | IM_ACID | HURT_LITE |
+F:EMPTY_MIND | COLD_BLOOD |
+F:ONLY_GOLD | DROP_2D2 |
+F:KILL_ITEM | PASS_WALL |
+F:IM_FIRE | IM_COLD | IM_ELEC | IM_POIS |
+F:HURT_ROCK | NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT
+D:It is a tougher relative of the Xorn. Its hide glitters with drops of acid.
+
+N:787:White Balrog
+G:U:w
+I:120:20d100:20:50:80
+W:61:4:9000:10000
+E:1:1:1:2:1:1
+O:0:50:50:0
+B:HIT:COLD:4d12
+B:HIT:COLD:4d12
+B:CRUSH:HURT:3d12
+B:TOUCH:UN_POWER
+F:FORCE_SLEEP | FORCE_MAXHP | AURA_COLD | KILL_WALL |
+F:ONLY_ITEM | DROP_1D2 | DROP_2D2 | DROP_GOOD |
+F:OPEN_DOOR | BASH_DOOR | POWERFUL | MOVE_BODY |
+F:EVIL | DEMON | IM_COLD | NO_CONF | NO_SLEEP | NONLIVING |
+F:BASEANGBAND | HAS_LITE
+S:1_IN_4 |
+S:BLIND | CONF | SCARE | HASTE |
+S:BR_COLD |
+S:S_DEMON
+D:The greatest of the demons, potent in both magical might
+D:and sheer battle power. This corrupted Maia's form is
+D:surrounded by frost.
+
+# New monster added by furiosity for the Theme module
+N:788:Red hulk
+G:X:R
+I:120:32d10:20:80:10
+W:40:1:500000:1200
+E:0:0:0:3:0:0
+O:0:0:0:0
+B:HIT:FIRE:3d4
+B:HIT:FIRE:3d4
+B:HIT:FIRE:3d4
+B:HIT:FIRE:3d4
+F:FORCE_MAXHP | IM_ACID | SUSCEP_COLD |
+F:EMPTY_MIND | COLD_BLOOD | HURT_LITE |
+F:ONLY_GOLD | DROP_2D2 | AURA_FIRE |
+F:KILL_ITEM | PASS_WALL |
+F:IM_FIRE | IM_ELEC | IM_POIS |
+F:HURT_ROCK | NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT
+D:It is a tougher relative of the Xorn. Its hide is wreathed in flames.
+
+N:789:Trone, the Rebel Thunderlord
+G:B:D
+I:130:80d100:20:120:80
+W:72:2:400000:45000
+E:1:1:1:2:1:1
+O:50:50:0:0
+B:HIT:HURT:12d10
+B:HIT:HURT:12d10
+B:CHARGE:HURT:10d10
+B:CHARGE:HURT:10d10
+F:UNIQUE | MALE | CAN_SPEAK | RES_TELE | SPECIAL_GENE |
+F:FORCE_MAXHP | REGENERATE | THUNDERLORD | CAN_FLY |
+F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 | DROP_GOOD | DROP_GREAT |
+F:SMART | OPEN_DOOR | BASH_DOOR | DROP_CHOSEN |
+F:EVIL | IM_FIRE | IM_COLD | IM_POIS |
+F:MORTAL | HAS_LITE
+S:1_IN_4 |
+S:TELE_TO | SCARE | BR_TIME | BR_FIRE |
+S:BO_MANA | S_THUNDERLORD
+D:As the Thunderlords came from afar to help the Elves, Trone and his rebel
+D:wing came to defend Morgoth. He is an evil and powerful Thunderlord.
+
+N:790:Great Worm of Many Colours
+G:D:v
+I:120:70d100:40:170:255
+W:80:2:190000:31000
+E:0:1:0:6:1:0
+O:50:50:0:0
+B:CLAW:HURT:6d12
+B:CLAW:HURT:6d12
+B:CLAW:HURT:8d14
+B:BITE:HURT:8d14
+F:ATTR_MULTI | CAN_FLY |
+F:FORCE_SLEEP | FORCE_MAXHP | AURA_FIRE | AURA_ELEC | RES_TELE |
+F:IM_FIRE | IM_ACID | IM_POIS | IM_COLD | IM_ELEC | AURA_COLD |
+F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 | DROP_GOOD |
+F:BASH_DOOR | POWERFUL | MOVE_BODY | DROP_CORPSE |
+F:DRAGON | NO_CONF | NO_SLEEP | BASEANGBAND | HAS_LITE
+S:1_IN_4 |
+S:BR_POIS | BR_ELEC | BR_ACID | BR_FIRE | BR_COLD |
+S:CONF | SCARE | BLIND
+D:A huge dragon whose scales shimmer in myriad hues.
+
+N:791:Marda, rider of gold Laronth
+G:B:y
+I:130:100d85:100:100:50
+W:75:6:420000:35000
+E:1:1:1:2:1:1
+O:50:50:0:0
+B:HIT:HURT:12d15
+B:HIT:HURT:12d15
+B:HIT:HURT:12d15
+B:HIT:HURT:12d15
+F:UNIQUE | FEMALE | CAN_SPEAK | THUNDERLORD | ONLY_ITEM | RES_TELE |
+F:DROP_CHOSEN | DROP_CORPSE | DROP_SKELETON | CAN_FLY |
+F:FORCE_SLEEP | FORCE_MAXHP | SPECIAL_GENE |
+F:DROP_4D2 | DROP_1D2 | DROP_GOOD | DROP_60 | DROP_90 |
+F:EVIL | IM_POIS | IM_ELEC | SMART | REGENERATE | OPEN_DOOR | BASH_DOOR |
+F:MORTAL | HAS_LITE | AQUATIC |
+S:1_IN_4 |
+S:SCARE | BLIND | TPORT | BLINK | TELE_AWAY | TELE_TO |
+S:BR_FIRE | BA_MANA | S_THUNDERLORD
+D:Former leader among the Thunderlords, she and Trone have fallen under the
+D:control of Morgoth. Laronth, her eagle, can summon Thunderlords to her aid.
+D:She has somehow broken through to the Lonely Isle and is killing the swans
+D:The magic of the Valar is for some reason powerless against her, and they
+D:have opened a path to Tol Eressea in case a hero wants to try their luck
+D:at destroying her.
+
+N:792:Tselakus, the Dreadlord
+G:G:R
+I:130:65d100:20:150:10
+W:68:2:1000:35000
+E:1:1:1:2:1:1
+O:0:80:20:0
+B:HIT:HURT:10d10
+B:HIT:HURT:10d10
+B:HIT:LOSE_STR:4d6
+B:HIT:LOSE_STR:4d6
+F:UNIQUE | MALE |
+F:FORCE_SLEEP | FORCE_MAXHP | CAN_SPEAK | CAN_FLY |
+F:ONLY_ITEM | DROP_3D2 | DROP_4D2 | DROP_GOOD |
+F:INVISIBLE | COLD_BLOOD | PASS_WALL |
+F:EVIL | UNDEAD | IM_COLD | AURA_COLD |
+F:IM_POIS | NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT | NO_STUN
+S:1_IN_3 |
+S:BLIND | HOLD | CONF |
+S:BA_DARK | BA_NETH |
+S:S_WRAITH | S_HI_UNDEAD | S_KIN
+D:This huge affront to existence twists and tears at the fabric of space.
+D:Darkness itself recoils from the touch of Tselakus as he leaves a trail
+D:of death and destruction. Mighty claws rend reality as he
+D:annihilates all in his path to your soul!
+
+N:793:Sky Drake
+G:D:B
+I:130:60d100:40:200:255
+W:77:2:220000:40000
+E:0:1:0:6:1:0
+O:50:50:0:0
+B:CLAW:HURT:6d12
+B:CLAW:HURT:6d12
+B:BITE:ELEC:8d14
+B:BITE:ELEC:8d14
+F:FORCE_SLEEP | FORCE_MAXHP | AURA_ELEC | AURA_COLD | DROP_CORPSE |
+F:IM_ELEC | EVIL | CAN_FLY |
+F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 | DROP_GOOD |
+F:BASH_DOOR | POWERFUL | MOVE_BODY |
+F:DRAGON | NO_CONF | NO_SLEEP | RES_TELE | BASEANGBAND | HAS_LITE
+F:ATTR_MULTI
+S:1_IN_4 |
+S:BR_ELEC | BR_GRAV | BR_LITE |
+S:S_DRAGON | S_HI_DRAGON |
+S:SCARE | BLIND
+D:The mightiest elemental dragon of air, it can destroy you with ease.
+
+N:794:Eilinel the Entrapped
+G:p:D
+I:120:90d10:10:40:1
+W:42:10:0:3500
+E:1:1:1:2:1:1
+O:20:20:50:10
+B:HIT:HURT:3d5
+B:HIT:HURT:3d5
+B:TOUCH:UN_POWER:3d3
+B:TOUCH:UN_BONUS:3d3
+F:UNIQUE | FEMALE |
+F:FORCE_MAXHP |
+F:DROP_1D2 | DROP_2D2 | DROP_3D2 | DROP_GOOD |
+F:SMART | OPEN_DOOR | BASH_DOOR |
+F:EVIL | UNDEAD | IM_COLD | IM_FIRE | NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT | NO_STUN
+S:1_IN_2 |
+S:BLINK | TELE_TO | HEAL | S_MONSTER | BO_ACID | BO_MANA | CAUSE_3
+D:In life, she was the wife of Gorlim. In death, her shade was
+D:entrapped by Morgoth and used to trick her husband into betraying
+D:Barahir. Now she is totally entrapped by Morgoth's power, and uses
+D:her magic to do his bidding.
+
+N:795:Dagorrog
+G:U:u
+I:130:50d100:40:120:80
+W:72:3:0:18000
+E:1:1:1:2:1:1
+O:0:100:0:0
+B:HIT:HURT:11d11
+B:HIT:HURT:11d11
+B:HIT:HURT:11d11
+B:HIT:HURT:11d11
+F:FORCE_SLEEP | FORCE_MAXHP | REGENERATE | NONLIVING |
+F:ONLY_ITEM | DROP_GOOD | DROP_4D2 | DROP_2D2 | BASEANGBAND |
+F:OPEN_DOOR | BASH_DOOR | KILL_BODY | POWERFUL |
+F:EVIL | DEMON | NO_CONF | NO_SLEEP | CAN_FLY |
+F:IM_FIRE | IM_COLD | IM_POIS | IM_ACID | IM_ELEC
+S:1_IN_5 |
+S:HASTE | SLOW | SCARE | S_HI_DEMON
+D:Festooned with horns and fierce claws, these monstrous forms are the
+D:shock troops of Morgoth, known for their strength and fierce weapons.
+D:A giant humanoid demon wielding a massive, heavy and sharp scythe.
+D:Feared by foes and friends alike when it flies into one of its berserk
+D:rages, the War demon will cut down anything in its path between it and
+D:you.
+
+# New monster added by furiosity for the Theme module
+N:796:Green hulk
+G:X:G
+I:115:32d10:20:80:10
+W:40:1:500000:1200
+E:0:0:0:3:0:0
+O:0:0:0:0
+B:HIT:POISON:3d4
+B:HIT:POISON:3d4
+B:HIT:POISON:3d4
+B:HIT:POISON:3d4
+F:FORCE_MAXHP | IM_ACID | HURT_LITE |
+F:EMPTY_MIND | COLD_BLOOD |
+F:ONLY_GOLD | DROP_2D2 |
+F:KILL_ITEM | KILL_WALL |
+F:IM_FIRE | IM_COLD | IM_ELEC | IM_POIS |
+F:HURT_ROCK | NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT
+D:It is a tougher relative of the Xorn. Its hide glitters with drops of venom.
+
+# New monster added by furiosity for the Theme module
+N:797:Blue hulk
+G:X:B
+I:115:32d10:20:80:10
+W:40:1:500000:1200
+E:0:0:0:3:0:0
+O:0:0:0:0
+B:HIT:ELEC:3d4
+B:HIT:ELEC:3d4
+B:HIT:ELEC:3d4
+B:HIT:ELEC:3d4
+F:FORCE_MAXHP | IM_ACID | HURT_LITE |
+F:EMPTY_MIND | COLD_BLOOD |
+F:ONLY_GOLD | DROP_2D2 | AURA_ELEC |
+F:KILL_ITEM | KILL_WALL |
+F:IM_FIRE | IM_COLD | IM_ELEC | IM_POIS |
+F:HURT_ROCK | NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT
+D:It is a tougher relative of the Xorn. It is surrounded by sparks.
+
+N:798:Black reaver
+G:L:D
+I:120:50d100:20:170:50
+W:74:3:1900:23000
+E:0:0:0:0:0:0
+O:0:60:40:0
+B:HIT:UN_BONUS:6d8
+B:HIT:UN_BONUS:6d8
+B:HIT:LOSE_STR:4d6
+B:HIT:LOSE_STR:4d6
+F:FORCE_SLEEP | FORCE_MAXHP | SMART | CAN_SWIM |
+F:ONLY_ITEM | DROP_1D2 | DROP_2D2 | DROP_GOOD |
+F:COLD_BLOOD | OPEN_DOOR | BASH_DOOR |
+F:EVIL | UNDEAD | IM_COLD | IM_POIS | RES_TELE |
+F:NO_CONF | NO_SLEEP | KILL_WALL | NO_FEAR |
+F:BASEANGBAND | NO_CUT
+S:1_IN_3 |
+S:TELE_TO | BLIND | HOLD | CONF | CAUSE_3 | CAUSE_4 | DRAIN_MANA |
+S:BRAIN_SMASH | BA_MANA | BA_NETH | S_UNDEAD
+D:A humanoid form, black as night, advancing steadily and unstoppably, even
+D:the very rock of the dungeon cannot prevent it reaching you.
+
+N:799:Master mindcrafter
+G:p:y
+I:120:80d10:20:60:10
+W:40:2:1700:2000
+E:1:1:1:2:1:1
+O:20:40:40:0
+B:HIT:HURT:4d5
+B:HIT:HURT:4d5
+B:HIT:HURT:4d5
+F:MALE | ONLY_ITEM | FORCE_SLEEP | FORCE_MAXHP | DROP_4D2 |
+F:SMART | BASH_DOOR | TAKE_ITEM | MOVE_BODY |
+F:EVIL | IM_FIRE | IM_ELEC | IM_POIS | BASEANGBAND |
+F:NO_CONF | NO_SLEEP | NO_STUN | NO_FEAR
+S:1_IN_2 |
+S:HEAL | BLIND | HOLD | CONF | SCARE | TPORT | BA_COLD | BA_FIRE |
+S:MIND_BLAST | BRAIN_SMASH | S_MONSTERS | TELE_AWAY | BLINK | BO_NETH
+D:A mindcrafter of the highest order. Powerful and evil, and a dangerous
+D:enemy: a master of mind over matter, of his own mind, and of the minds of
+D:others, who slavishly follow him into battle when he calls them.
+
+N:800:Greater demonic quylthulg
+G:Q:R
+I:120:15d100:20:1:0
+W:71:2:5000:10500
+E:0:0:0:0:0:0
+O:0:0:0:0
+F:FORCE_SLEEP | FORCE_MAXHP | NEVER_MOVE | NEVER_BLOW |
+F:INVISIBLE | EMPTY_MIND | ANIMAL | RES_TELE |
+F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND
+S:1_IN_2 |
+S:BLINK | TELE_TO |
+S:S_HI_DEMON
+D:A massive pulsating mound of flesh, glowing with an inner hellish light.
+
+N:801:Greater draconic quylthulg
+G:Q:G
+I:120:15d100:20:1:0
+W:71:2:5000:10500
+E:0:0:0:0:0:0
+O:0:0:0:0
+F:FORCE_SLEEP | FORCE_MAXHP | NEVER_MOVE | NEVER_BLOW |
+F:INVISIBLE | EMPTY_MIND | ANIMAL | RES_TELE |
+F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND
+S:1_IN_2 |
+S:BLINK | TELE_TO |
+S:S_HI_DRAGON
+D:A massive mound of scaled flesh, throbbing and pulsating with multi-hued
+D:light.
+
+N:802:Greater rotting quylthulg
+G:Q:U
+I:120:15d100:20:1:0
+W:71:2:5000:10500
+E:0:0:0:0:0:0
+O:0:0:0:0
+F:FORCE_SLEEP | FORCE_MAXHP | NEVER_MOVE | NEVER_BLOW |
+F:INVISIBLE | EMPTY_MIND | ANIMAL | RES_TELE |
+F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND |NO_CUT
+S:1_IN_2 |
+S:BLINK | TELE_TO |
+S:S_HI_UNDEAD
+D:A massive pile of rotting flesh. A disgusting stench fills the air as it
+D:throbs and writhes.
+
+# Joke monster added by furiosity for the Theme module
+
+N:803:Invisible Horror
+G:.:v
+I:100:4d9:20:1:0
+W:20:5:0:300
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:CHARGE:TERRIFY
+B:CHARGE:TERRIFY
+B:CHARGE:TERRIFY
+B:CHARGE:TERRIFY
+F:CHAR_CLEAR | ATTR_CLEAR | FORCE_MAXHP | SMART |
+F:INVISIBLE | COLD_BLOOD | EMPTY_MIND | WEIRD_MIND |
+F:PASS_WALL | UNDEAD | EVIL | NONLIVING | HURT_LITE |
+F:IM_POIS | RES_TELE | NO_FEAR | NO_STUN | NO_SLEEP |
+F:CAN_SWIM | NO_TARGET | AI_ANNOY | NO_CUT | CAN_SPEAK |
+F:JOKEANGBAND
+S:1_IN_2
+S:SCARE
+D:You can't see it.
+
+N:804:Feagwath, the Undead Sorcerer
+G:L:y
+I:130:60d100:20:85:50
+W:77:2:1900:30000
+E:1:1:1:2:1:1
+O:0:50:50:0
+B:TOUCH:EXP_80:6d12
+B:TOUCH:UN_POWER:6d12
+B:TOUCH:LOSE_DEX:6d12
+B:TOUCH:LOSE_DEX:6d12
+F:UNIQUE | MALE | CAN_SPEAK | RES_TELE |
+F:FORCE_SLEEP | FORCE_MAXHP |
+F:ESCORT | SPECIAL_GENE |
+F:ONLY_ITEM | DROP_2D2 | DROP_4D2 | DROP_GOOD | DROP_GREAT |
+F:SMART | COLD_BLOOD | OPEN_DOOR | BASH_DOOR |
+F:EVIL | UNDEAD | IM_COLD |
+F:IM_POIS | NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT
+S:1_IN_2 |
+S:BLINK | TELE_TO | HOLD | SCARE | CAUSE_4 |
+S:BRAIN_SMASH | TRAPS | BA_MANA |
+S:BO_MANA | BA_NETH |
+S:S_MONSTERS | S_UNDEAD | S_KIN | ANIM_DEAD
+D:A stench of corruption and decay surrounds this sorcerer, who has
+D:risen from the dead to continue his foul plots and schemes.
+
+# New monster added by furiosity for the Theme module
+N:805:Silver wraith
+G:W:B
+I:110:15d10:20:40:10
+W:33:3:0:375
+E:0:0:0:0:0:0
+O:0:50:50:0
+B:HIT:HURT:1d8
+B:HIT:EAT_LITE:1d8
+B:TOUCH:EXP_40
+F:FORCE_SLEEP | DROP_60 |
+F:COLD_BLOOD | OPEN_DOOR | BASH_DOOR | CAN_FLY |
+F:EVIL | UNDEAD | IM_COLD | IM_POIS |
+F:NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT
+S:1_IN_8 |
+S:HOLD | SCARE | CAUSE_2 | DARKNESS
+D:An almost imperceptible silvery shimmer in the air. It
+D:seems to absorb light wherever it goes.
+
+# New monster added by furiosity for the Theme module
+# Pet barrow wight, basically.
+N:806:Adventurer wraith
+G:W:U
+I:110:15d10:20:40:10
+W:33:3:0:375
+E:0:0:0:0:0:0
+O:0:50:50:0
+B:HIT:HURT:1d8
+B:HIT:HURT:1d8
+B:TOUCH:EXP_40
+F:FORCE_SLEEP | DROP_60 | PET |
+F:COLD_BLOOD | OPEN_DOOR | BASH_DOOR | CAN_FLY |
+F:GOOD | UNDEAD | IM_COLD | IM_POIS |
+F:NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT
+S:1_IN_8 |
+S:HOLD | SCARE | CAUSE_2 | DARKNESS
+D:A fellow adventurer wraith.
+
+N:807:Balrog Captain
+G:U:G
+I:130:75d100:40:140:40
+W:80:3:0:25000
+E:1:1:1:2:1:1
+O:0:50:50:0
+B:HIT:FIRE:8d12
+B:HIT:FIRE:8d12
+B:CRUSH:HURT:7d12
+B:TOUCH:UN_POWER
+F:FORCE_SLEEP | FORCE_MAXHP | AURA_FIRE | CAN_FLY |
+F:ONLY_ITEM | DROP_2D2 | DROP_GOOD | NONLIVING |
+F:OPEN_DOOR | BASH_DOOR | POWERFUL | MOVE_BODY | SMART |
+F:EVIL | DEMON | IM_FIRE | NO_CONF | NO_SLEEP | KILL_WALL |
+F:RES_NETH | RES_PLAS | REGENERATE | BASEANGBAND | HAS_LITE
+S:1_IN_3 |
+S:BLIND | CONF | BRAIN_SMASH |
+S:BR_FIRE | BA_NETH | BA_FIRE | BR_PLAS | BO_PLAS |
+S:S_HI_DEMON | S_DEMON |
+D:Originally of the semi-divine Maiar, this evil spirit swore allegiance
+D:to Morgoth at the beginning of time and is now one of his most terrible
+D:demonic servants. With its flaming whip and sword it seeks to destroy you.
+
+N:808:Ungoliant, the Unlight
+G:S:D
+I:130:130d100:8:160:80
+W:75:1:1500:35000
+E:0:1:0:2:1:0
+O:20:0:80:0
+B:CLAW:POISON:8d6
+B:CLAW:POISON:8d6
+B:BITE:PARALYZE:8d10
+B:STING:LOSE_STR:8d4
+F:UNIQUE | FEMALE |
+F:FORCE_SLEEP | FORCE_MAXHP | DROP_CORPSE |
+F:ONLY_ITEM | DROP_4D2 | DROP_GOOD |
+F:SMART | BASH_DOOR | IM_ACID |
+F:ANIMAL | SPIDER | EVIL | IM_POIS | HURT_LITE | NO_CONF | NO_SLEEP
+F:BASEANGBAND
+S:1_IN_3 |
+S:HEAL | BLIND | SLOW | CONF | SCARE | DARKNESS | BA_DARK |
+S:BR_POIS | BR_DARK | 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
+D:in all living light into her bloated body, and breathes out the blackest of
+D:darkness. She is always ravenously hungry and would even eat herself to
+D:avoid starvation.
+
+# New monster added by furiosity for the Theme module
+N:809:Vampire orc
+G:V:D
+I:110:25d12:20:45:10
+W:27:1:1700:175
+E:1:1:1:2:1:1
+O:20:40:20:10
+B:HIT:HURT:1d6
+B:HIT:HURT:1d6
+B:BITE:EXP_20:2d6
+B:BITE:EXP_20:2d6
+F:FORCE_SLEEP | FORCE_MAXHP | FRIENDS |
+F:COLD_BLOOD | DROP_60 | DROP_1D2 | ORC |
+F:OPEN_DOOR | BASH_DOOR | REGENERATE | CAN_FLY |
+F:EVIL | UNDEAD | IM_COLD | IM_POIS | HURT_LITE | NO_CONF | NO_SLEEP |
+F:BASEANGBAND | NO_CUT
+S:1_IN_9 |
+S:TELE_TO | HOLD | SCARE | CAUSE_2 | MIND_BLAST | FORGET | DARKNESS
+D:It is an orc with an aura of power. You notice a sharp set of front
+D:teeth.
+
+# New monster added by furiosity for the Theme module
+N:810:Vampire yeek
+G:V:w
+I:110:16d12:20:45:10
+W:27:1:1700:175
+E:1:1:1:2:1:1
+O:20:40:20:10
+B:HIT:HURT:1d6
+B:HIT:HURT:1d6
+B:BITE:EXP_20:2d6
+B:BITE:EXP_20:2d6
+F:FORCE_SLEEP | FORCE_MAXHP | STUPID |
+F:COLD_BLOOD | DROP_60 | DROP_1D2 |
+F:OPEN_DOOR | BASH_DOOR | REGENERATE | CAN_FLY |
+F:EVIL | UNDEAD | IM_COLD | IM_POIS | HURT_LITE | NO_CONF | NO_SLEEP |
+F:BASEANGBAND | NO_CUT
+S:1_IN_9 |
+S:TELE_TO | HOLD | SCARE | CAUSE_2 | MIND_BLAST | FORGET | DARKNESS
+D:It is a yeek with an aura of power. You notice a sharp set of front
+D:teeth.
+
+N:811:Aether hound
+G:Z:v
+I:120:60d40:30:100:0
+W:74:3:1000:10000
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:BITE:HURT:3d12
+B:BITE:HURT:3d12
+B:CLAW:HURT:3d12
+B:CLAW:HURT:3d12
+F:ATTR_MULTI | ATTR_ANY |
+F:FORCE_SLEEP | CAN_FLY |
+F:FRIENDS | RES_NETH | RES_PLAS | RES_NEXU | RES_DISE |
+F:BASH_DOOR | AURA_FIRE | AURA_ELEC | AURA_COLD |
+F:DROP_CORPSE | DROP_SKELETON |
+F:ANIMAL | IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS |
+F:NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT
+S:1_IN_5 |
+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.
+
+N:812:Greater Balrog
+G:U:v
+I:130:60d100:30:120:75
+W:77:3:0:22000
+E:1:1:1:2:1:1
+O:0:100:0:0
+B:CLAW:FIRE:8d10
+B:CLAW:FIRE:8d10
+B:BITE:POISON:7d10
+B:BITE:LOSE_CON:7d10
+F:FORCE_SLEEP | FORCE_MAXHP | REGENERATE | NONLIVING | SMART |
+F:ONLY_ITEM | DROP_GOOD | DROP_4D2 | DROP_2D2 | BASEANGBAND |
+F:OPEN_DOOR | BASH_DOOR | MOVE_BODY | POWERFUL | CAN_FLY |
+F:EVIL | DEMON | IM_FIRE | IM_POIS | NO_CONF | NO_SLEEP
+S:1_IN_5 |
+S:S_HI_DEMON | S_HI_DRAGON | BR_FIRE | BR_POIS | BR_CHAO | BA_CHAO |
+S:SCARE | BA_FIRE | CAUSE_4 | ARROW_4 | MISSILE
+D:Appearing as a giant, clawed and winged humanoid with a scaly red body
+D:and massive fangs dripping a foul green liquid, the Greater Balrog is a
+D:dreadful enemy from the lowest depths of Morgoth's realm. They are often
+D:the commanders of vast demon and dragon armies.
+
+# New monster added by furiosity for the Theme module
+N:813:Vampire ogre
+G:V:o
+I:110:35d12:20:45:10
+W:27:1:1700:175
+E:1:1:1:2:1:1
+O:20:40:20:10
+B:HIT:HURT:1d6
+B:HIT:HURT:1d6
+B:BITE:EXP_20:2d6
+B:BITE:EXP_20:2d6
+F:FORCE_SLEEP | FORCE_MAXHP | FRIENDS | STUPID |
+F:COLD_BLOOD | DROP_60 | DROP_1D2 | GIANT |
+F:OPEN_DOOR | BASH_DOOR | REGENERATE | CAN_FLY |
+F:EVIL | UNDEAD | IM_COLD | IM_POIS | HURT_LITE | NO_CONF | NO_SLEEP |
+F:BASEANGBAND | NO_CUT
+S:1_IN_9 |
+S:TELE_TO | HOLD | SCARE | CAUSE_2 | MIND_BLAST | FORGET | DARKNESS
+D:It is an ogre with an aura of power. You notice a sharp set of front
+D:teeth.
+
+# New monster added by furiosity for the Theme module
+N:814:Vampire troll
+G:V:u
+I:110:35d12:20:45:10
+W:27:1:1700:175
+E:1:1:1:2:1:1
+O:20:40:20:10
+B:HIT:HURT:1d6
+B:HIT:HURT:1d6
+B:BITE:EXP_20:2d6
+B:BITE:EXP_20:2d6
+F:FORCE_SLEEP | FORCE_MAXHP | TROLL | STUPID |
+F:COLD_BLOOD | DROP_60 | DROP_1D2 |
+F:OPEN_DOOR | BASH_DOOR | REGENERATE | CAN_FLY |
+F:EVIL | UNDEAD | IM_COLD | IM_POIS | HURT_LITE | NO_CONF | NO_SLEEP |
+F:BASEANGBAND | NO_CUT
+S:1_IN_9 |
+S:TELE_TO | HOLD | SCARE | CAUSE_2 | MIND_BLAST | FORGET | DARKNESS
+D:It is a troll with an aura of power. You notice a sharp set of front
+D:teeth.
+
+# New monster added by furiosity for the Theme module
+N:815:Vampire dwarf
+G:V:R
+I:110:30d12:20:45:10
+W:27:1:1700:175
+E:1:1:1:2:1:1
+O:20:40:20:10
+B:HIT:HURT:1d6
+B:HIT:HURT:1d6
+B:BITE:EXP_20:2d6
+B:BITE:EXP_20:2d6
+F:FORCE_SLEEP | FORCE_MAXHP |
+F:COLD_BLOOD | DROP_60 | DROP_1D2 |
+F:OPEN_DOOR | BASH_DOOR | REGENERATE | CAN_FLY |
+F:EVIL | UNDEAD | IM_COLD | IM_POIS | HURT_LITE | NO_CONF | NO_SLEEP |
+F:BASEANGBAND | NO_CUT
+S:1_IN_9 |
+S:TELE_TO | HOLD | SCARE | CAUSE_2 | MIND_BLAST | FORGET | DARKNESS
+D:It is a dwarf with an aura of power. You notice a sharp set of front
+D:teeth.
+
+# New monster added by furiosity for the Theme module
+N:816:Vampire elf
+G:V:G
+I:110:30d12:20:45:10
+W:27:1:1700:175
+E:1:1:1:2:1:1
+O:20:40:20:10
+B:HIT:HURT:1d6
+B:HIT:HURT:1d6
+B:BITE:EXP_20:2d6
+B:BITE:EXP_20:2d6
+F:FORCE_SLEEP | FORCE_MAXHP | SMART |
+F:COLD_BLOOD | DROP_60 | DROP_1D2 |
+F:OPEN_DOOR | BASH_DOOR | REGENERATE | CAN_FLY |
+F:EVIL | UNDEAD | IM_COLD | IM_POIS | HURT_LITE | NO_CONF | NO_SLEEP |
+F:BASEANGBAND | NO_CUT
+S:1_IN_9 |
+S:TELE_TO | HOLD | SCARE | CAUSE_2 | MIND_BLAST | FORGET | DARKNESS
+D:It is an elf with an aura of power. You notice a sharp set of front
+D:teeth.
+
+# New monster added by furiosity for the Theme module
+N:817:Vampire gnome
+G:V:B
+I:110:15d12:20:45:10
+W:27:1:1700:175
+E:1:1:1:2:1:1
+O:20:40:20:10
+B:HIT:HURT:1d6
+B:HIT:HURT:1d6
+B:BITE:EXP_20:2d6
+B:BITE:EXP_20:2d6
+F:FORCE_SLEEP | FORCE_MAXHP | STUPID |
+F:COLD_BLOOD | DROP_60 | DROP_1D2 |
+F:OPEN_DOOR | BASH_DOOR | REGENERATE | CAN_FLY |
+F:EVIL | UNDEAD | IM_COLD | IM_POIS | HURT_LITE | NO_CONF | NO_SLEEP |
+F:BASEANGBAND | NO_CUT
+S:1_IN_9 |
+S:TELE_TO | HOLD | SCARE | CAUSE_2 | MIND_BLAST | FORGET | DARKNESS
+D:It is a gnome with an aura of power. You notice a sharp set of front
+D:teeth.
+
+N:818:The Mouth of Sauron
+G:p:v
+I:130:90d100:60:100:10
+W:78:3:1900:38000
+E:1:1:1:2:1:1
+O:0:0:100:0
+B:HIT:UN_BONUS:6d8
+B:HIT:UN_BONUS:6d8
+B:TOUCH:UN_POWER
+B:TOUCH:UN_POWER
+F:UNIQUE | MALE |
+F:FORCE_SLEEP | FORCE_MAXHP | SMART |
+F:ONLY_ITEM | DROP_1D2 | DROP_4D2 | DROP_GOOD |
+F:INVISIBLE | OPEN_DOOR | BASH_DOOR |
+F:EVIL | IM_FIRE | IM_COLD |
+F:IM_ELEC | BASEANGBAND | HAS_LITE
+S:1_IN_2 |
+S:TELE_TO | HOLD | CAUSE_3 | TRAPS | ANIM_DEAD |
+S:BO_PLAS | BA_DARK | BA_MANA | BA_FIRE | BA_WATE | BA_NETH
+S:S_HI_DEMON | S_HI_UNDEAD
+D:The Mouth of Sauron is a mighty spellcaster. So old that even he cannot
+D:remember his own name, his power and evil are undeniable. He believes
+D:unshakably that he is unbeatable and laughs as he weaves his awesome
+D:spells.
+
+N:819:The Necromancer of Dol Guldur
+G:p:v
+I:130:82d100:60:100:10
+W:75:3:1900:40000
+E:1:1:1:2:1:1
+O:0:0:100:0
+B:HIT:UN_BONUS:6d8
+B:HIT:UN_POWER:6d8
+B:HIT:BLIND:6d8
+B:HIT:CONFUSE:6d8
+F:UNIQUE | MALE | CAN_SPEAK | POWERFUL | RES_TELE |
+F:FORCE_SLEEP | FORCE_MAXHP | SMART | DROP_CORPSE | DROP_SKELETON |
+F:ONLY_ITEM | DROP_1D2 | DROP_GREAT | DROP_GOOD | SPECIAL_GENE |
+F:INVISIBLE | OPEN_DOOR | BASH_DOOR |
+F:EVIL | IM_FIRE | IM_COLD |
+F:IM_ELEC | NO_CONF | NO_SLEEP | BASEANGBAND
+S:1_IN_2 |
+S:CAUSE_3 | TELE_TO | BA_FIRE | DRAIN_MANA | HOLD |
+S:TRAPS | BA_WATE | BO_PLAS | BA_NETH |
+S:BA_MANA | BA_DARK | S_HI_UNDEAD | BA_CHAO | HAND_DOOM | ANIM_DEAD
+D:The dark master of the terrible fortress of southern Mirkwood. It is
+D:rumoured that this is in fact none other than Sauron in disguise:
+D:although if this is so, he has yet to reveal his full power - and perhaps
+D:will not do so while his deception lasts.
+
+N:820:Lisa, rider of gold Romth
+G:B:y
+I:130:65d100:100:100:15
+W:78:6:420000:35500
+E:1:1:1:2:1:1
+O:50:50:0:0
+B:HIT:HURT:10d15
+B:HIT:HURT:10d15
+B:HIT:HURT:10d15
+B:HIT:HURT:10d15
+F:UNIQUE | FEMALE | THUNDERLORD | RES_TELE | CAN_FLY | GOOD |
+F:OPEN_DOOR | BASH_DOOR | DROP_CORPSE | DROP_SKELETON | CAN_SPEAK |
+F:FORCE_SLEEP | FORCE_MAXHP | PET | AQUATIC |
+F:DROP_4D2 | DROP_1D2 | DROP_GOOD | DROP_60 | DROP_90 | ONLY_ITEM |
+F:IM_COLD | IM_POIS | IM_ACID | IM_ELEC | REGENERATE |
+F:MORTAL | HAS_LITE
+S:1_IN_4 |
+S:TPORT | TELE_TO | BR_FIRE | S_THUNDERLORD |
+S:TELE_AWAY | HEAL | BA_NETH | BO_NETH | BA_FIRE | BO_FIRE
+D:A leader among the Thunderlords of good, she came to help you.
+
+N:821:Master quylthulg
+G:Q:B
+I:120:30d100:20:1:0
+W:76:2:7000:15000
+E:0:0:0:0:0:0
+O:0:0:0:0
+F:FORCE_SLEEP | FORCE_MAXHP | NEVER_MOVE | NEVER_BLOW |
+F:INVISIBLE | EMPTY_MIND | ANIMAL | RES_TELE |
+F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND
+S:1_IN_2 |
+S:S_MONSTERS | S_HI_UNDEAD | S_HI_DRAGON | S_HI_DEMON | S_ANIMALS | BLINK | TELE_TO
+D:A giant seething mass of flesh, overwhelming you with monster after monster.
+
+N:822:Qlzqqlzuup, the Lord of Flesh
+G:Q:o
+I:130:50d100:30:1:0
+W:79:3:10000:20000
+E:0:0:0:0:0:0
+O:20:20:20:20
+F:UNIQUE | RES_TELE |
+F:FORCE_SLEEP | FORCE_MAXHP | NEVER_MOVE | NEVER_BLOW |
+F:ONLY_ITEM | DROP_4D2 |
+F:INVISIBLE | EMPTY_MIND | ANIMAL |
+F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND
+S:1_IN_1 |
+S:S_MONSTERS | S_HOUND | S_HYDRA | S_SPIDER | S_ANT | S_ANIMALS |
+S:S_HI_UNDEAD | S_HI_DRAGON | S_HI_DEMON | S_WRAITH | S_UNIQUE | S_KIN
+D:A gigantic seething mass of flesh, Qlzqqlzuup changes colours in front
+D:of your eyes. Pulsating first one colour then the next, it knows only it
+D:must bring help to protect itself.
+
+# New monster added by furiosity for the Theme module
+N:823:Vampire adventurer
+G:V:U
+I:110:25d12:20:45:10
+W:27:1:1700:175
+E:1:1:1:2:1:1
+O:20:40:20:10
+B:HIT:HURT:1d6
+B:HIT:HURT:1d6
+B:BITE:EXP_20:2d6
+B:BITE:EXP_20:2d6
+F:FORCE_SLEEP | FORCE_MAXHP |
+F:COLD_BLOOD | DROP_60 | DROP_1D2 | PET |
+F:OPEN_DOOR | BASH_DOOR | REGENERATE | CAN_FLY |
+F:GOOD | UNDEAD | IM_COLD | IM_POIS | HURT_LITE | NO_CONF | NO_SLEEP |
+F:BASEANGBAND | NO_CUT
+S:1_IN_9 |
+S:TELE_TO | HOLD | SCARE | CAUSE_2 | MIND_BLAST | FORGET | DARKNESS
+D:It is an adventurer with an aura of power. You notice a sharp set
+D:of front teeth.
+
+N:824:Flare, rider of bronze Moonth
+G:B:U
+I:130:70d100:100:100:15
+W:79:5:400000:38500
+E:1:1:1:2:1:1
+O:50:50:0:0
+B:HIT:HURT:15d15
+B:HIT:HURT:15d15
+B:HIT:HURT:15d15
+B:HIT:HURT:15d15
+F:UNIQUE | MALE | THUNDERLORD | RES_TELE | CAN_FLY | CAN_SPEAK |
+F:OPEN_DOOR | BASH_DOOR | DROP_CORPSE | DROP_SKELETON |
+F:FORCE_SLEEP | FORCE_MAXHP | PET | GOOD | AQUATIC |
+F:DROP_4D2 | DROP_1D2 | DROP_GOOD | DROP_60 | DROP_90 | ONLY_ITEM |
+F:IM_COLD | IM_POIS | IM_ACID | IM_ELEC | IM_FIRE | REGENERATE |
+F:MORTAL | HAS_LITE
+S:1_IN_4 |
+S:SCARE | TPORT | TELE_TO | S_THUNDERLORD |
+S:TELE_LEVEL | HEAL | BR_FIRE | BR_TIME | ROCKET
+D:A leader from afar, he has come with his eagle to help you in
+D:your battle. Having already saved his home, he now wants to save Arda.
+
+N:825:Maeglin, the Traitor of Gondolin
+G:h:D
+I:130:60d100:220:120:20
+W:81:2:1400:35000
+E:1:1:1:2:1:1
+O:30:70:0:0
+B:HIT:HURT:8d8
+B:HIT:HURT:8d8
+B:HIT:HURT:8d8
+B:HIT:HURT:8d8
+F:UNIQUE | MALE |
+F:FORCE_MAXHP | CAN_SPEAK | SMART | EVIL | AI_SPECIAL |
+F:ONLY_ITEM | DROP_3D2 | DROP_4D2 | DROP_GOOD | DROP_GREAT |
+F:OPEN_DOOR | BASH_DOOR | KILL_WALL | MOVE_BODY | TAKE_ITEM |
+F:IM_FIRE | IM_COLD | IM_POIS | SPECIAL_GENE |
+F:REGENERATE | REFLECTING | DROP_SKELETON | DROP_CORPSE | BASEANGBAND
+F:HAS_LITE
+S:1_IN_6 |
+S:S_MONSTERS | S_WRAITH | S_HI_UNDEAD |
+S:S_HI_DRAGON | S_HI_DEMON | S_UNIQUE | S_ANIMALS
+D:The son of Eol the Dark Elf, Maeglin is every bit as evil as his father
+D:and more. His greed for gold led him to betray the Hidden Kingdom of
+D:Gondolin to Morgoth's forces. He is a mighty warrior himself, and some
+D:of Morgoth's greatest servants answer to his call.
+
+# New monster added by furiosity for the Theme module
+N:826:Snow-frog
+G:R:w
+I:110:5d8:12:16:50
+W:7:1:200:16
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:BITE:COLD:2d4
+F:RAND_50 | WILD_TOO | WILD_SHORE | WILD_SWAMP |
+F:BASH_DOOR | DROP_CORPSE | IM_COLD | WILD_WASTE |
+F:ANIMAL | MORTAL | BASEANGBAND
+D:It is a strange frog adapted to cold environments.
+
+# New monster added by furiosity for the Theme module
+N:827:Swamp lizard
+G:R:o
+I:110:3d4:20:4:15
+W:5:2:100:8
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:BITE:HURT:1d2
+B:SPIT:POISON:2d4
+F:ANIMAL | CAN_SWIM | WILD_TOO | WILD_WOOD | WILD_SWAMP |
+F:DROP_CORPSE | HAS_EGG | IMPRESED | IM_POIS |
+F:MORTAL | BASEANGBAND
+D:It is a small lizard that usually lives in the
+D:marshlands. It looks poisonous.
+
+# New monster added by furiosity for the Theme module
+N:828:Giant silver frog
+G:R:W
+I:110:3d4:20:4:15
+W:5:2:100:8
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:BITE:HURT:1d2
+B:SPIT:EAT_LITE:2d4
+F:ANIMAL | CAN_SWIM | WILD_TOO | WILD_WOOD | WILD_SWAMP |
+F:DROP_CORPSE | IM_POIS | HURT_LITE |
+F:MORTAL | BASEANGBAND
+D:A frog that seems to emit a strange dark light.
+
+N:829:Greater Hellhound
+G:C:r
+I:120:48d30:25:80:30
+W:78:2:600:600
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:BITE:FIRE:5d12
+B:BITE:FIRE:5d12
+B:BITE:FIRE:5d12
+F:FORCE_SLEEP | FORCE_MAXHP | DROP_CORPSE
+F:RAND_25 | FRIENDS | AURA_FIRE | SUSCEP_COLD |
+F:BASH_DOOR | MOVE_BODY |
+F:ANIMAL | EVIL | IM_FIRE | BASEANGBAND | HAS_LITE |
+S:1_IN_5 | BR_FIRE
+D:It is a giant dog that glows with heat. Flames pour from its nostrils.
+
+N:830:Cantoras, the Skeletal Lord
+G:s:v
+I:140:75d100:20:120:80
+W:84:2:0:45000
+E:1:1:1:2:1:1
+O:50:0:50:0
+B:GAZE:EXP_80:5d5
+B:GAZE:EXP_80:5d5
+B:TOUCH:POISON:5d5
+B:TOUCH:POISON:5d5
+F:UNIQUE | MALE | CAN_SPEAK | RES_TELE |
+F:FORCE_SLEEP | FORCE_MAXHP |
+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 | BASEANGBAND | NO_CUT
+S:1_IN_2 |
+S:TELE_TO | SLOW | SCARE | CAUSE_4 | BRAIN_SMASH |
+S:BO_ICEE | BO_MANA | BA_WATE | BA_NETH |
+S:S_HI_UNDEAD | ANIM_DEAD
+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
+D:underworld.
+
+# New monster added by furiosity for the Theme module
+N:831:Blue lizard
+G:R:B
+I:110:3d4:20:4:15
+W:5:2:100:8
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:BITE:HURT:1d2
+B:SPIT:ELEC:2d4
+F:ANIMAL | CAN_SWIM | WILD_TOO | WILD_WOOD | WILD_SWAMP |
+F:DROP_CORPSE | HAS_EGG | IMPRESED | IM_ELEC |
+F:MORTAL | BASEANGBAND
+D:It is a small lizard with powerful jaws which cause
+D:sparks to fly as they snap shut.
+
+# New monster added by furiosity for the Theme module
+N:832:Death dragonfly
+G:F:D
+I:120:3d8:12:20:50
+W:20:2:150:70
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:BITE:EXP_40:1d6
+F:FORCE_SLEEP | RAND_50 | RAND_25 |
+F:WEIRD_MIND | BASH_DOOR | CAN_FLY | WILD_TOO | WILD_SWAMP |
+F:ANIMAL | RES_NETH |
+F:MORTAL | BASEANGBAND
+S:1_IN_10 |
+S:BR_NETH
+D:The size of a large bird, this fly carries with it the
+D:stench of decay.
+
+# New monster added by furiosity for the Theme module
+N:833:Giant swamp dragonfly
+G:F:o
+I:120:3d8:12:20:50
+W:20:2:150:70
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:BITE:TERRIFY:1d6
+F:FORCE_SLEEP | RAND_50 | RAND_25 |
+F:WEIRD_MIND | BASH_DOOR | CAN_FLY | WILD_TOO | WILD_SWAMP |
+F:ANIMAL |
+F:MORTAL | BASEANGBAND
+S:1_IN_10 |
+S:BR_NUKE
+D:The size of a large bird, this fly comes from a dark swamp.
+
+# New monster added by furiosity for the Theme module
+N:834:Giant red dragonfly
+G:F:r
+I:120:3d8:12:20:50
+W:20:2:150:70
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:BITE:ACID:1d6
+F:FORCE_SLEEP | RAND_50 | RAND_25 | AURA_FIRE |
+F:WEIRD_MIND | BASH_DOOR | CAN_FLY | WILD_TOO | WILD_SWAMP |
+F:ANIMAL | IM_FIRE |
+F:MORTAL | BASEANGBAND
+S:1_IN_10 |
+S:BR_FIRE
+D:The size of a large bird, this fly is surrounded by flames.
+
+# New monster added by furiosity for the Theme module
+N:835:Giant forest dragonfly
+G:F:g
+I:120:3d8:12:20:50
+W:20:2:150:70
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:BITE:PARALYZE:1d6
+F:FORCE_SLEEP | RAND_50 | RAND_25 |
+F:WEIRD_MIND | BASH_DOOR | CAN_FLY | WILD_TOO | WILD_SWAMP |
+F:ANIMAL | IM_ACID | IM_POIS |
+F:MORTAL | BASEANGBAND
+S:1_IN_10 |
+S:BR_DARK
+D:The size of a large bird, this fly prefers to dwell in
+D:the forest, and is rather stealthy.
+
+# New monster added by furiosity for the Theme module
+N:836:Giant blue dragonfly
+G:F:b
+I:120:3d8:12:20:50
+W:20:2:150:70
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:BITE:ELEC:1d6
+F:FORCE_SLEEP | RAND_50 | RAND_25 |
+F:WEIRD_MIND | BASH_DOOR | CAN_FLY | WILD_TOO | WILD_SWAMP |
+F:ANIMAL | IM_ELEC |
+F:MORTAL | BASEANGBAND
+S:1_IN_10 |
+S:BR_ELEC
+D:The size of a large bird, this fly crackles with sparks.
+
+# New monster added by furiosity for the Theme module
+N:837:Giant brown dragonfly
+G:F:u
+I:120:3d8:12:20:50
+W:20:2:150:70
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:BITE:HURT:1d6
+F:FORCE_SLEEP | RAND_50 | RAND_25 |
+F:WEIRD_MIND | BASH_DOOR | CAN_FLY | WILD_TOO | WILD_SWAMP |
+F:ANIMAL | NO_CUT |
+F:MORTAL | BASEANGBAND
+S:1_IN_10 |
+S:BR_SHAR
+D:The size of a large bird, this fly dives from the earth
+D:into the air, and back.
+
+N:838:The Tarrasque
+G:R:v
+I:130:130d100:50:185:20
+W:84:2:50000:35000
+E:1:1:1:2:1:1
+O:20:50:25:5
+B:HIT:HURT:10d10
+B:HIT:HURT:10d10
+B:TOUCH:UN_POWER:10d10
+B:TOUCH:UN_POWER:10d10
+F:UNIQUE | ATTR_MULTI |
+F:FORCE_SLEEP | FORCE_MAXHP | DROP_CORPSE |
+F:ONLY_ITEM | DROP_2D2 | DROP_4D2 | DROP_GOOD |
+F:OPEN_DOOR | BASH_DOOR | POWERFUL | MOVE_BODY |
+F:EVIL | IM_FIRE | IM_COLD | NO_SLEEP | BASEANGBAND
+S:1_IN_2 |
+S:BR_FIRE | BR_COLD | BR_DISE
+D:The Tarrasque is a massive reptile of legend, rumoured to be unkillable
+D:and immune to magic. Fear its anger, for its devastation is unmatched.
+
+N:839:Lungorthin, the Balrog of White Fire
+G:U:w
+I:130:80d100:20:125:80
+W:88:2:14000:37000
+E:1:1:1:2:1:1
+O:0:100:0:0
+B:HIT:FIRE:8d12
+B:HIT:FIRE:8d12
+B:CRUSH:HURT:8d12
+B:TOUCH:UN_POWER
+F:UNIQUE | MALE |
+F:FORCE_SLEEP | FORCE_MAXHP |
+F:ESCORT | ESCORTS | CAN_FLY |
+F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 | DROP_GOOD |
+F:OPEN_DOOR | BASH_DOOR | POWERFUL | MOVE_BODY |
+F:EVIL | DEMON | IM_FIRE |
+F:NO_CONF | NO_SLEEP | BASEANGBAND | HAS_LITE
+S:1_IN_4 |
+S:BLIND | CONF | SCARE |
+S:BR_FIRE | BR_PLAS |
+S:S_HI_DEMON | S_UNDEAD
+D:A massive form cloaked in flame. Lungorthin stares balefully at you with
+D:eyes that smoulder red. The dungeon floor where he stands is scorched by
+D:the heat of his body.
+
+N:840:Draugluin, Sire of All Werewolves
+G:C:v
+I:130:80d100:80:90:90
+W:83:2:1000:40000
+E:0:1:0:2:1:0
+O:0:0:100:0
+B:CLAW:HURT:6d8
+B:CLAW:HURT:6d8
+B:BITE:POISON:6d6
+B:BITE:POISON:6d6
+F:UNIQUE | MALE | CAN_SPEAK |
+F:FORCE_SLEEP | FORCE_MAXHP |
+F:ESCORT | ESCORTS | DROP_CORPSE |
+F:RAND_25 |
+F:ONLY_ITEM | DROP_1D2 | DROP_GOOD |
+F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | MOVE_BODY |
+F:ANIMAL | EVIL | IM_POIS | BASEANGBAND
+S:1_IN_3 |
+S:SCARE | S_MONSTERS | S_HOUND
+D:Draugluin provides Sauron with a fearsome personal guard. He is an
+D:enormous wolf inhabited by a human spirit. He is chief of all his kind.
+
+# New monster added by furiosity for the Theme module
+N:841:Giant silver dragonfly
+G:F:W
+I:100:3d8:12:20:50
+W:20:2:150:70
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:BITE:EAT_LITE:1d6
+F:FORCE_SLEEP | RAND_50 | RAND_25 |
+F:WEIRD_MIND | BASH_DOOR | CAN_FLY | WILD_TOO | WILD_SWAMP |
+F:ANIMAL | NO_CUT |
+F:MORTAL | BASEANGBAND
+S:1_IN_10 |
+S:BR_INER
+D:The size of a large bird, this fly moves slowly.
+
+# New monster added by furiosity for the Theme module
+N:842:Giant violet dragonfly
+G:F:v
+I:120:3d8:12:20:50
+W:20:2:150:70
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:BITE:CONFUSE:1d6
+F:FORCE_SLEEP | RAND_50 | RAND_25 |
+F:WEIRD_MIND | BASH_DOOR | CAN_FLY | WILD_TOO | WILD_SWAMP |
+F:ANIMAL | NO_CUT |
+F:MORTAL | BASEANGBAND
+S:1_IN_10 |
+S:BR_CHAO
+D:The size of a large bird, this fly is surrounded by an
+D:aura of raw chaos.
+
+# New monster added by furiosity for the Theme module
+N:843:Giant pink dragonfly
+G:F:u
+I:120:3d8:12:20:50
+W:20:2:150:70
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:BITE:LOSE_STR:1d6
+F:FORCE_SLEEP | RAND_50 | RAND_25 |
+F:WEIRD_MIND | BASH_DOOR | CAN_FLY | WILD_TOO | WILD_SWAMP |
+F:ANIMAL | NO_CUT |
+F:MORTAL | BASEANGBAND
+S:1_IN_10 |
+S:BR_PLAS
+D:The size of a large bird, this fly seems to scorch the
+D:very air around it.
+
+N:844:Vecna, the Emperor Lich
+G:L:v
+I:130:80d100:100:100:0
+W:92:3:0:45000
+E:1:1:1:2:1:1
+O:0:50:50:0
+B:HIT:EXP_80:7d12
+B:HIT:LOSE_DEX:7d12
+B:HIT:UN_POWER:7d12
+B:HIT:UN_POWER:7d12
+F:UNIQUE | MALE | CAN_SPEAK | RES_TELE
+F:FORCE_SLEEP | FORCE_MAXHP |
+F:ESCORT |
+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_SLEEP | BASEANGBAND
+F:NO_CUT
+S:1_IN_3 |
+S:TPORT | BLIND | SCARE | CAUSE_4 | BRAIN_SMASH |
+S:BA_MANA | BO_MANA | BA_FIRE | BA_NETH |
+S:S_MONSTERS | S_HI_DEMON | S_HI_UNDEAD | S_KIN | HAND_DOOM | ANIM_DEAD
+D:The greatest of all undead sorcerers, even the gods once feared him. This
+D:ancient shadow of death wilts every living thing it passes.
+
+# New monster added by furiosity for the Theme module
+N:845:Aquatic dragonfly
+G:F:B
+I:120:3d8:12:20:50
+W:20:2:150:70
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:BITE:HURT:1d6
+F:FORCE_SLEEP | RAND_50 | RAND_25 |
+F:WEIRD_MIND | BASH_DOOR | CAN_FLY | WILD_TOO | WILD_SWAMP |
+F:ANIMAL | NO_CUT | AQUATIC | RES_WATE |
+F:MORTAL | BASEANGBAND
+S:1_IN_10 |
+S:BA_WATE
+D:The size of a large bird, this fly prefers watery regions.
+
+# New monster added by furiosity for the Theme module
+N:846:Giant red mouse
+G:r:r
+I:110:1d3:8:4:20
+W:4:1:200:3
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:BITE:FIRE:1d2
+F:RAND_25 | SUSCEP_COLD | ANIMAL | IM_FIRE |
+F:DROP_CORPSE | MORTAL | BASEANGBAND | CAN_SWIM |
+S:MULTIPLY
+D:It is about three feet long with large teeth and red fur.
+D:It is a corrupted creature of Melkor.
+
+N:847:Great Wyrm of Power
+G:D:v
+I:130:111d111:40:160:70
+W:85:4:220000:47500
+E:0:1:0:6:1:0
+O:50:50:0:0
+B:CLAW:HURT:8d12
+B:CLAW:HURT:8d12
+B:BITE:HURT:10d14
+B:BITE:HURT:10d14
+F:FORCE_SLEEP | FORCE_MAXHP | MOVE_BODY | AURA_FIRE | REFLECTING | AURA_ELEC |
+F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 | DROP_GOOD | AURA_COLD |
+F:OPEN_DOOR | BASH_DOOR | POWERFUL | MOVE_BODY | RES_NETH | RES_DISE |
+F:DRAGON | GOOD | RES_TELE | DROP_CORPSE | AQUATIC |
+F:IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | NO_CONF | NO_SLEEP |
+F:RES_NEXU | RES_PLAS | CAN_FLY | BASEANGBAND | HAS_LITE | NO_CUT
+F:ATTR_MULTI
+S:1_IN_4 |
+S:S_HI_DRAGON | S_DRAGON | S_KIN |
+S:BR_NUKE | BR_ACID | BR_ELEC | BR_FIRE |
+S:BR_COLD | BR_POIS | BR_NETH | BR_LITE | BR_DARK |
+S:BR_CONF | BR_SOUN | BR_CHAO | BR_DISE | BR_NEXU |
+S:BR_TIME | BR_INER | BR_GRAV | BR_SHAR | BR_PLAS |
+S:BR_WALL | BR_MANA | BR_DISI
+D:The mightiest of all dragonkind, a great worm of power is seldom
+D:encountered in our world. It can crush stars with its might.
+
+# New monster added by furiosity for the Theme module
+N:848:Giant blue mouse
+G:r:b
+I:110:1d3:8:4:20
+W:4:1:200:3
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:BITE:ELEC:1d2
+F:RAND_25 | ANIMAL | IM_ELEC |
+F:DROP_CORPSE | MORTAL | BASEANGBAND | CAN_SWIM |
+S:MULTIPLY
+D:It is about three feet long with large teeth and blue fur.
+D:Its teeth produce sparks on impact.
+
+# New monster added by furiosity for the Theme module
+N:849:Giant yellow mouse
+G:r:y
+I:110:1d3:8:4:20
+W:4:1:200:3
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:BITE:ACID:1d2
+F:RAND_25 | ANIMAL | IM_ACID |
+F:DROP_CORPSE | MORTAL | BASEANGBAND | CAN_SWIM |
+S:MULTIPLY
+D:It is about three feet long with large teeth and yellow fur.
+D:Its teeth produce a corrosive substance.
+
+N:850:Carcharoth, the Jaws of Thirst
+G:C:D
+I:130:90d100:80:110:10
+W:94:1:3400:40000
+E:0:1:0:2:1:0
+O:30:10:60:0
+B:CLAW:POISON:9d12
+B:CLAW:POISON:9d12
+B:BITE:FIRE:9d12
+B:BITE:FIRE:9d12
+F:UNIQUE | MALE | CAN_SPEAK | DROP_CORPSE
+F:FORCE_SLEEP | FORCE_MAXHP |
+F:ONLY_ITEM | DROP_4D2 | DROP_GOOD | AURA_FIRE |
+F:SMART | OPEN_DOOR | BASH_DOOR | MOVE_BODY |
+F:ANIMAL | EVIL | IM_FIRE | IM_POIS | BASEANGBAND
+S:1_IN_3 |
+S:BR_DARK | BR_POIS | BR_FIRE | BR_NETH | S_HOUND
+D:The first guard of Angband, Carcharoth, also known as 'The Red Maw', is
+D:the largest wolf to ever walk the earth. He is highly intelligent and a
+D:deadly opponent in combat.
+
+# New monster added by furiosity for the Theme module
+N:851:Giant pink rat
+G:r:R
+I:110:2d3:8:12:20
+W:9:1:250:2
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:BITE:LOSE_STR:1d4
+F:RAND_25 | ANIMAL | DROP_SKELETON |
+F:DROP_CORPSE | MORTAL | BASEANGBAND | CAN_SWIM |
+S:MULTIPLY
+D:It is a rodent of unusual size with no fur covering it.
+
+# New monster added by furiosity for the Theme module
+N:852:Giant tree rat
+G:r:G
+I:110:2d3:8:12:20
+W:9:1:250:3
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:BITE:POISON:1d4
+B:BITE:HURT:2d4
+F:RAND_25 | ANIMAL | DROP_SKELETON | IM_POIS | CAN_FLY |
+F:DROP_CORPSE | MORTAL | BASEANGBAND | CAN_SWIM |
+S:MULTIPLY
+D:A large rat that lives in the trees.
+
+N:853:Huan, Wolfhound of the Valar
+G:C:W
+I:130:90d100:50:160:10
+W:93:2:3400:40000
+E:0:1:0:2:1:0
+O:30:10:60:0
+B:CLAW:COLD:9d12
+B:CLAW:COLD:9d12
+B:BITE:COLD:9d12
+B:BITE:COLD:9d12
+F:UNIQUE | MALE | CAN_SPEAK | DROP_CORPSE |
+F:FORCE_SLEEP | FORCE_MAXHP | NEUTRAL | NO_TARGET |
+F:ONLY_ITEM | DROP_4D2 | DROP_GOOD | AURA_COLD |
+F:SMART | OPEN_DOOR | BASH_DOOR | KILL_BODY |
+F:ANIMAL | GOOD | WILD_ONLY | WILD_GRASS | WILD_GRASS |
+F:WILD_WASTE | WILD_WOOD | WILD_SHORE |
+F:IM_COLD | IM_ACID | IM_ELEC | BASEANGBAND
+S:1_IN_5 |
+S:BR_COLD | BR_SHAR | BR_SOUN | BR_LITE |
+D:The wolfhound of the Valar, Huan has served many masters in his time, from
+D:Celegorm son of Feanor to Beren son of Barahir: but now he runs wild and
+D:acknowledges no master save himself, as he hunts alone for his nemesis -
+D:Carcharoth, the terrible wolf of Angband.
+
+# New monster added by furiosity for the Theme module
+N:854:Polar bear
+G:q:w
+I:110:10d10:10:35:10
+W:9:1:2000:27
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:CLAW:HURT:1d4
+B:CLAW:HURT:1d4
+B:BITE:HURT:1d6
+F:WEIRD_MIND | BASH_DOOR | DROP_SKELETON | DROP_CORPSE
+F:ANIMAL | MORTAL | BASEANGBAND | IM_COLD | WILD_TOO |
+D:A huge white bear, accustomed to extremely cold temperatures.
+
+# New monster added by furiosity for the Theme module
+N:855:Blue bear
+G:q:b
+I:110:10d10:10:35:10
+W:9:1:2000:30
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:CLAW:HURT:2d4
+B:CLAW:HURT:2d4
+B:BITE:HURT:2d6
+F:WEIRD_MIND | BASH_DOOR | FRIENDS | DROP_SKELETON | DROP_CORPSE
+F:ANIMAL | HURT_LITE | IM_COLD |
+F:MORTAL | BASEANGBAND
+D:A huge blue-black bear with thick fur. It can withstand
+D:extremely cold temperatures and usually hunts at night,
+D:and always in packs.
+
+N:856:Gothmog, the High Captain of Balrogs
+G:U:v
+I:130:120d100:100:140:0
+W:95:1:17000:43000
+E:1:1:1:2:1:1
+O:0:100:0:0
+B:HIT:FIRE:9d12
+B:HIT:FIRE:9d12
+B:CRUSH:HURT:8d12
+B:TOUCH:UN_POWER
+F:UNIQUE | MALE | CAN_SPEAK | CAN_FLY |
+F:FORCE_SLEEP | FORCE_MAXHP | ATTR_MULTI |
+F:ESCORT | ESCORTS | KILL_WALL | AURA_FIRE | NONLIVING |
+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 | BASEANGBAND | HAS_LITE
+S:1_IN_3 |
+S:BLIND | CONF | SCARE |
+S:BR_FIRE | S_KIN |
+S:S_HI_DEMON | S_HI_UNDEAD
+D:Gothmog is the offspring of Morgoth and an ogress. He is renowned
+D:for slaying three High Kings of the Noldor Elves, and he has never been
+D:defeated in combat. With his whip of flame and awesome fiery breath he
+D:saved his master from Ungoliant's rage.
+
+# New monster added by furiosity for the Theme module
+N:857:Old bear
+G:q:W
+I:110:20d10:10:35:255
+W:15:1:2000:25
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:CLAW:HURT:4d4
+B:CLAW:HURT:4d4
+B:BITE:HURT:4d6
+F:WEIRD_MIND | BASH_DOOR | DROP_SKELETON | DROP_CORPSE
+F:ANIMAL | NEUTRAL | NO_TARGET | WILD_ONLY | WILD_WOOD |
+F:WILD_GRASS | WILD_SHORE | MORTAL | BASEANGBAND
+D:An experienced bear whose fur is silvery white. It just
+D:wants to eat its dinner in peace.
+
+N:858:Sarko, rider of gold Foronth
+G:B:y
+I:145:99d111:100:165:0
+W:97:6:420000:65000
+E:1:1:1:2:1:1
+O:50:50:0:0
+B:HIT:HURT:12d12
+B:HIT:HURT:12d12
+B:HIT:FIRE:12d12
+B:HIT:FIRE:12d12
+F:UNIQUE | FEMALE | DROP_CORPSE |
+F:ATTR_MULTI | THUNDERLORD | RES_TELE | PET | CAN_SPEAK |
+F:FORCE_SLEEP | FORCE_MAXHP | CAN_FLY | GOOD | AQUATIC |
+F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 | DROP_GOOD | DROP_GREAT |
+F:DROP_CHOSEN | REFLECTING | AURA_FIRE | AURA_ELEC |
+F:SMART | OPEN_DOOR | BASH_DOOR | MOVE_BODY | REGENERATE |
+F:IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | POWERFUL |
+F:MORTAL | HAS_LITE
+S:1_IN_4 |
+S:TPORT | TELE_TO | BR_FIRE | BR_TIME | S_THUNDERLORD | TELE_AWAY |
+D:Foronth is the first Eagle queen, and Sarko the first to discover
+D:the Firebirds, the ancestors of the Thunderlord eagles. She will try to
+D:help you.
+
+# New monster added by furiosity for the Theme module
+N:859:Teddy bear
+G:q:v
+I:110:10d10:10:35:10
+W:9:1:2000:25
+E:0:1:0:2:1:0
+O:0:0:0:0
+F:WEIRD_MIND | BASH_DOOR | NONLIVING | JOKEANGBAND | NEVER_BLOW |
+F:NO_CUT | NO_FEAR | NO_CONF | RES_TELE | NO_STUN | PET |
+S:1_IN_2
+S:CONF | BLINK |
+D:A cute cuddly creature made of a strange soft material. It has
+D:been animated by a jokester wizard, and searches for a child to
+D:play with.
+
+N:860:Sauron, the Sorcerer
+G:p:v
+I:130:100d225:100:160:0
+W:99:1:2300:50000
+E:1:1:1:2:1:1
+O:0:0:100:0
+B:HIT:UN_BONUS:10d12
+B:HIT:UN_BONUS:10d12
+B:HIT:UN_POWER:8d12
+B:HIT:UN_POWER:8d12
+F:UNIQUE | MALE | CAN_SPEAK | REFLECTING |
+F:FORCE_SLEEP | FORCE_MAXHP | FORCE_DEPTH |
+F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 | DROP_GOOD | DROP_GREAT |
+F:SMART | OPEN_DOOR | BASH_DOOR | MOVE_BODY | REGENERATE | NO_SLEEP | NO_FEAR | NO_CONF |
+F:EVIL | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS |
+F:RES_TELE | BASEANGBAND | HAS_LITE
+S:1_IN_2 |
+S:TPORT | TELE_LEVEL | BLIND | CONF | SCARE | CAUSE_4 |
+S:BRAIN_SMASH | FORGET | BO_ICEE | BO_MANA | BO_PLAS |
+S:BA_MANA | BA_FIRE | BA_WATE | BA_NETH | BA_DARK | BA_CHAO |
+S:S_MONSTERS | S_HI_DEMON | S_HI_UNDEAD | S_HI_DRAGON | S_WRAITH | S_UNIQUE |
+S:HAND_DOOM | ANIM_DEAD
+D:Mighty in spells and enchantments, he created the One Ring.
+D:His eyes glow with power and with his gaze he seeks to destroy
+D:your soul. He has many servants, and rarely fights without them.
+
+N:861:DarkGod, the Mighty Coder of Hell
+G:P:B
+I:155:180d100:111:175:0
+W:127:1:1600:66666
+E:2:0:2:6:1:1
+O:20:20:20:20
+B:GAZE:EAT_GOLD:20d10
+B:HIT:SHATTER:20d10
+B:BITE:LOSE_ALL:10d12
+B:TOUCH:UN_POWER
+F:UNIQUE | CAN_SPEAK | ATTR_MULTI | ATTR_ANY | MALE |
+F:FORCE_MAXHP | WEIRD_MIND | DROP_CORPSE | DROP_SKELETON |
+F:REFLECTING | AURA_FIRE | AURA_ELEC | AURA_COLD |
+F:ONLY_ITEM | DROP_1D2 | DROP_2D2 | DROP_3D2 | DROP_4D2 |
+F:DROP_GOOD | DROP_GREAT | RES_NETH | INVISIBLE |
+F:SMART | KILL_WALL | KILL_BODY | POWERFUL | RES_TELE |
+F:REGENERATE | CAN_FLY | CAN_SWIM | DG_CURSE | WYRM_PROTECT |
+F:EVIL | IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS |
+F:NO_CONF |NO_FEAR | NO_STUN | RES_TELE
+F:MORTAL | JOKEANGBAND | HAS_LITE
+S:1_IN_2 |
+S:S_THUNDERLORD | BR_CHAO | BA_CHAO | ROCKET | BRAIN_SMASH | S_HI_DEMON |
+S:BR_NETH | HASTE | BR_MANA | S_HI_UNDEAD | S_HI_DRAGON | TRAPS | FORGET |
+S:BR_NUKE | BR_POIS | BR_DISI | HAND_DOOM | HEAL | TPORT | TELE_TO |
+S:S_BUG | S_RNG |
+D:He is the master of coding; none can match his skill. He created the
+D:Variant Maintainer, the RNGs, and the software bugs. Bull Gates is
+D:nothing next to him. Do not think that since he loves the novels of
+D:Tolkien he is to be ignored! He wishes to translate your soul into
+D:assembler, the one hitch being that he must kill you first. If you
+D:encounter him, pray your deity holds you in good stead.
+
+N:862:Morgoth, Lord of Darkness
+G:P:D
+I:140:200d150:100:150:0
+W:100:1:200000:60000
+E:1:1:1:2:1:1
+O:0:100:0:0
+B:HIT:SHATTER:24d10
+B:HIT:SHATTER:24d10
+B:HIT:LOSE_ALL:10d12
+B:TOUCH:UN_POWER
+F:UNIQUE | CAN_SPEAK | MALE |
+F:FORCE_SLEEP | FORCE_MAXHP | FORCE_DEPTH |
+F:ONLY_ITEM | DROP_1D2 | DROP_2D2 | DROP_3D2 | DROP_4D2 |
+F:DROP_GOOD | DROP_GREAT | DROP_CHOSEN | RES_NETH |
+F:SMART | KILL_WALL | MOVE_BODY | AURA_COLD |
+F:REGENERATE | POWERFUL |
+F:EVIL | IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS |
+F:NO_CONF | NO_STUN | NO_SLEEP | NO_FEAR | RES_TELE | BASEANGBAND | HAS_LITE
+S:1_IN_3 |
+S:BRAIN_SMASH |
+S:BA_MANA | BO_MANA | BA_NETH | BA_CHAO | BA_DARK | ANIM_DEAD |
+S:S_MONSTERS | S_UNIQUE | S_HI_DEMON | S_HI_UNDEAD | S_HI_DRAGON |
+S:ROCKET | BR_NETH | BR_DISI | HAND_DOOM | S_WRAITH
+D:He was the most powerful of the Valar, the equal of Manwe.
+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
+D:his pain, but seeks forever to dominate all that is light and good in the
+D:world. He is the origin of man's fear of darkness and created many foul
+D:creatures with his evil powers. Orcs, Dragons, and Trolls are his most
+D:foul corruptions, causing much pain and suffering in the world to please
+D:him. His disgusting visage, twisted with evil, is crowned with iron.
+D:Grond, the mighty Hammer of the Underworld, cries defiance as he strides
+D:towards you to crush you to a pulp!
+
+N:863:Human Warrior
+G:p:u
+I:110:9d8:10:10:0
+W:0:20:1700:0
+E:1:1:1:2:1:1
+O:0:0:0:0
+B:HIT:HURT:5d8
+F:MALE |
+F:PET | FRIENDS | WILD_ONLY |
+F:ONLY_GOLD | DROP_1D2 |
+F:OPEN_DOOR | BASH_DOOR
+F:DROP_CORPSE |
+F:MORTAL | BASEANGBAND | HAS_LITE
+D:They are used as the main assault force of the human kings.
+
+N:864:Elven archer
+G:h:W
+I:110:9d7:10:10:0
+W:0:20:1400:0
+E:1:1:1:2:1:1
+O:0:0:0:0
+B:HIT:HURT:2d8
+F:MALE |
+F:PET | FRIENDS | WILD_ONLY |
+F:ONLY_GOLD | DROP_1D2 |
+F:OPEN_DOOR | BASH_DOOR
+F:DROP_CORPSE |
+F:MORTAL | BASEANGBAND | HAS_LITE
+S:1_IN_1 |
+S:ARROW_2 | ARROW_1 | ARROW_2 | ARROW_1 |
+D:They are used as the main assault force of the elven kings.
+
+N:865:Dwarven warrior
+G:k:U
+I:110:8d8:10:10:0
+W:0:20:1500:0
+E:1:1:1:2:1:1
+O:0:0:0:0
+B:HIT:HURT:6d8
+F:MALE |
+F:PET | FRIENDS | WILD_ONLY |
+F:ONLY_GOLD | DROP_1D2 |
+F:OPEN_DOOR | BASH_DOOR
+F:DROP_CORPSE |
+F:MORTAL | BASEANGBAND | HAS_LITE
+D:They are used as the main assault force of the dwarven kings.
+
+N:866:Elite uruk
+G:o:w
+I:110:10d10:20:50:0
+W:20:1:2000:70
+E:1:1:1:2:1:1
+O:10:90:0:0
+B:HIT:HURT:8d5
+B:HIT:HURT:8d5
+F:MALE |
+F:FORCE_MAXHP | FRIENDS | DROP_60 |
+F:OPEN_DOOR | BASH_DOOR | DROP_SKELETON | DROP_CORPSE |
+F:EVIL | ORC | IM_POIS |
+F:MORTAL | BASEANGBAND | HAS_LITE
+S:1_IN_8 |
+S:ARROW_2
+D:It is a cunning orc of power, taller than a man, and stronger. It fears
+D:little.
+
+# New monster added by furiosity for the Theme module
+N:867:Fire bear
+G:q:R
+I:110:10d10:10:35:10
+W:13:2:2000:30
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:CLAW:HURT:1d4
+B:CLAW:FIRE:1d4
+B:BITE:HURT:3d6
+F:WEIRD_MIND | BASH_DOOR | FRIENDS | DROP_SKELETON | DROP_CORPSE
+F:ANIMAL | IM_FIRE | SUSCEP_COLD |
+F:MORTAL | BASEANGBAND
+D:A fierce bear trained to withstand the hottest environments.
+
+N:868:The Variant Maintainer
+G:p:B
+I:160:10d10:30:50:0
+W:10:1:1700:3000
+E:1:1:1:2:1:1
+O:20:20:20:20
+B:INSULT:*
+B:HIT:INSANITY:1d8
+B:HIT:LOSE_WIS:1d8
+F:ONLY_ITEM | DROP_2D2 | UNIQUE | CAN_FLY |
+F:DROP_GOOD | WEIRD_MIND | CAN_SPEAK |
+F:RAND_50 | RAND_25 | INVISIBLE | EVIL |
+F:MORTAL | JOKEANGBAND | HAS_LITE
+S:1_IN_2
+S:S_BUG | S_RNG | BR_CONF
+D:A deranged programmer, scattering bizarre ideas and bad code everywhere.
+
+N:869:Random Number Generator
+G:I:b
+I:130:1d6:10:50:0
+W:10:1:0:10
+E:0:0:0:0:0:0
+O:20:20:20:20
+B:INSULT:*
+B:MOAN:*
+B:HIT:CONFUSE:1d6
+F:DROP_1D2 | EVIL |
+F:EMPTY_MIND | RAND_50 | RAND_25 | JOKEANGBAND
+S:MULTIPLY
+D:A feared creation of the Variant Maintainer, it tries to generate Morgoth
+D:in the town and the One Ring in the magic shop.
+
+N:870:Rocket mine
+G:.:R
+I:110:20d8:20:3:10
+W:50:10:0:100
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:SPORE:POISON:10d5
+F:NEVER_MOVE | IM_POIS | NONLIVING | IM_ACID | STUPID |
+F:FORCE_MAXHP | UNDEAD | EVIL | JOKEANGBAND | NO_CUT
+S:1_IN_4
+S:ROCKET | ARROW_4
+D:It was left here to be used against intruders.
+
+N:871:Bouncing mine
+G:.:B
+I:120:20d15:50:5:10
+W:70:10:0:200
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:SPORE:POISON:10d5
+F:NEVER_MOVE | IM_POIS | NONLIVING | IM_ACID | STUPID |
+F:FORCE_MAXHP | UNDEAD | EVIL | JOKEANGBAND | NO_CUT
+S:1_IN_3
+S:ROCKET | ARROW_4 | BLINK | BR_POIS | BR_CHAO | BR_NEXU
+D:It was left here to be used against intruders.
+
+N:872:Durin's Bane
+G:U:R
+I:130:30d100:20:100:80
+W:50:3:13000:30000
+E:1:1:1:2:1:1
+O:0:50:50:0
+B:HIT:FIRE:6d12
+B:HIT:FIRE:6d12
+B:CRUSH:HURT:5d12
+B:TOUCH:UN_POWER
+F:UNIQUE | MALE | SPECIAL_GENE | DROP_RANDART
+F:FORCE_SLEEP | FORCE_MAXHP | KILL_WALL |
+F:ESCORT | ESCORTS | DROP_CORPSE | NONLIVING |
+F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 | DROP_GOOD | DROP_CHOSEN |
+F:OPEN_DOOR | BASH_DOOR | POWERFUL | MOVE_BODY |
+F:EVIL | DEMON | IM_FIRE |
+F:NO_CONF | BASEANGBAND | HAS_LITE
+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, this is indeed a
+D:terrible opponent. Wielding a great whip of fire and a blazing sword, his
+D:fury blisters your skin and melts your flesh.
+
+# New monster added by furiosity for the Theme module
+N:873:Aquatic bear
+G:q:B
+I:110:10d10:10:35:10
+W:15:1:2000:40
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:CLAW:HURT:1d4
+B:CLAW:CONFUSE:1d4
+B:BITE:PARALYZE:1d6
+F:WEIRD_MIND | BASH_DOOR | FRIENDS | DROP_SKELETON | DROP_CORPSE
+F:ANIMAL | RES_WATE | CAN_SWIM | AQUATIC |
+F:MORTAL | BASEANGBAND
+D:A strange bear the prefers to live in the water.
+
+N:874:Rot jelly
+G:j:u
+I:120:20d8:2:30:99
+W:5:1:2000:15
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:TOUCH:EAT_FOOD:2d3
+B:TOUCH:LOSE_CHR:2d3
+F:NEVER_MOVE |
+F:STUPID | EMPTY_MIND | CAN_SWIM |
+F:HURT_LITE | IM_POIS |
+F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT
+D:It is a large pile of rotting flesh, whose touch spoils your food. The terrible
+D:smell it exudes is also very hard to get rid of...
+
+N:875:Death
+G:G:D
+I:130:50d100:200:120:5
+W:80:6:3000:25000
+E:1:1:1:2:1:1
+O:10:80:20:0
+B:HIT:HURT:20d5
+B:HIT:HURT:20d5
+B:TOUCH:EXP_80:20d5
+B:TOUCH:EXP_80:20d5
+F:UNIQUE |
+F:FORCE_MAXHP | DROP_CORPSE |
+F:DROP_GOOD | DROP_GREAT | DROP_60 | DROP_1D2 |
+F:OPEN_DOOR | BASH_DOOR | PASS_WALL | NO_SLEEP | NO_STUN | NO_CONF |
+F:EVIL | UNDEAD | JOKEANGBAND | NO_CUT
+D:The leader of the horsemen of the apocalypse, before you lies Death.
+D:A bony skeleton in a huge dark robe wielding a great scythe, Death rides
+D:a horse of purest black and comes to bring your death.
+
+N:876:Famine
+G:G:U
+I:130:50d100:200:120:5
+W:77:6:3000:25000
+E:1:1:1:2:1:1
+O:10:80:20:0
+B:TOUCH:EAT_FOOD:20d4
+B:GAZE:UN_BONUS:20d4
+B:WAIL:LOSE_INT:10d5
+B:WAIL:LOSE_DEX:10d5
+F:UNIQUE | MALE |
+F:FORCE_MAXHP | DROP_CORPSE |
+F:DROP_GOOD | DROP_GREAT | DROP_60 | DROP_1D2 |
+F:OPEN_DOOR | BASH_DOOR | PASS_WALL | NO_STUN | NO_SLEEP | NO_CONF |
+F:EVIL | UNDEAD | JOKEANGBAND | NO_CUT
+D:One of the horsemen of the apocalypse, before you lies Famine. A
+D:figure so gaunt that the shape of the bones beneath are revealed,
+D:Famine rides a pale grey mare that appears near death.
+
+N:877:Pestilence
+G:G:G
+I:130:50d100:200:120:5
+W:74:6:3000:25000
+E:1:1:1:2:1:1
+O:10:80:20:0
+B:TOUCH:POISON:20d4
+B:TOUCH:POISON:20d4
+B:TOUCH:DISEASE:16d5
+B:TOUCH:DISEASE:16d5
+F:UNIQUE | MALE |
+F:FORCE_MAXHP | DROP_CORPSE |
+F:DROP_GOOD | DROP_GREAT | DROP_60 | DROP_1D2 |
+F:OPEN_DOOR | BASH_DOOR | PASS_WALL | NO_SLEEP | NO_STUN | NO_CONF |
+F:EVIL | UNDEAD | JOKEANGBAND | NO_CUT
+S:1_IN_2 |
+S:S_ANT | S_SPIDER
+D:One of the horsemen of the apocalypse, before you lies Pestilence.
+D:At first, it looks like a human, but then you notice ants, worms, and
+D:worse peeking out of the flesh. Pestilence rides a purple horse with
+D:skin that bulges and occasionally gives hints of the vermin within.
+
+N:878:War
+G:G:r
+I:130:50d100:200:120:5
+W:71:6:3000:25000
+E:1:1:1:2:1:1
+O:10:80:20:0
+B:TOUCH:PARALYZE:20d4
+B:WAIL:CONFUSE:20d4
+B:GAZE:BLIND:20d4
+B:WAIL:TERRIFY:20d4
+F:UNIQUE | MALE |
+F:FORCE_MAXHP | DROP_CORPSE |
+F:DROP_GOOD | DROP_GREAT | DROP_60 | DROP_1D2 |
+F:OPEN_DOOR | BASH_DOOR | PASS_WALL | NO_SLEEP | NO_STUN | NO_CONF | NO_FEAR |
+F:EVIL | UNDEAD | JOKEANGBAND | NO_CUT
+S:1_IN_2 |
+S:S_MONSTER
+D:One of the horsemen of the apocalypse, before you lies War. A healthy and
+D:hearty warrior, War grins a little too wide at you as he prepares for
+D:combat. War rides a large well-groomed yellow horse that leaves behind
+D:puddles of blood where its hooves touch the ground.
+
+##### Some aquatic monsters. #####
+
+N:879:Pike
+G:~:s
+I:125:2d7:80:35:0
+W:2:1:100:7
+E:0:0:0:0:1:0
+O:0:0:0:0
+B:BITE:HURT:2d3
+F:ANIMAL | AQUATIC | STUPID | DROP_CORPSE | COLD_BLOOD |
+F:MORTAL | BASEANGBAND
+D:It's a common fresh-water predatory fish.
+
+N:880:Electric eel
+G:J:B
+I:110:15d15:15:40:70
+W:20:2:500:145
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:TOUCH:ELEC:2d7
+B:TOUCH:ELEC:2d7
+B:TOUCH:ELEC:2d7
+F:AQUATIC | ANIMAL | RAND_25 | IM_ELEC | RES_WATE |
+F:WILD_TOO | WILD_OCEAN | COLD_BLOOD |
+F:MORTAL | BASEANGBAND
+D:This serpentine creature can create a deadly voltage.
+
+N:881:Giant crayfish
+G:~:R
+I:90:4d10:6:100:20
+W:4:1:1200:10
+E:0:0:0:0:1:0
+O:0:0:0:0
+B:CLAW:HURT:3d4
+B:CLAW:HURT:3d4
+F:ANIMAL | AQUATIC | STUPID | WEIRD_MIND | DROP_CORPSE | COLD_BLOOD |
+F:MORTAL | BASEANGBAND
+D:A man-sized, heavily armoured fresh-water relative of the lobster.
+
+N:882:Mermaid
+G:h:B
+I:110:5d8:50:30:0
+W:4:1:1600:20
+E:1:1:1:2:1:0
+O:20:50:10:5
+B:TOUCH:LOSE_WIS
+B:TOUCH:INSANITY:2d3
+B:TOUCH:CONFUSE
+F:FEMALE | RAND_25 | DROP_60 | SMART | AQUATIC | NO_CONF | DROP_CORPSE |
+F:MORTAL | BASEANGBAND
+D:A green-skinned humanoid with a fishtail. Beware - there are rumours
+D:of adventures losing their minds under the fearsome charms of mermaids.
+
+N:883:Box jellyfish
+G:~:B
+I:110:10d10:20:30:75
+W:10:2:3000:25
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:TOUCH:PARALYZE:1d6
+B:TOUCH:PARALYZE:1d6
+F:ANIMAL | AQUATIC | IM_POIS | WILD_TOO | COLD_BLOOD |
+F:MORTAL | BASEANGBAND
+D:A strange water creature whose touch can be deadly.
+
+N:884:Giant piranha
+G:~:R
+I:120:6d8:30:20:10
+W:10:2:300:40
+E:0:0:0:0:1:0
+O:0:0:0:0
+B:BITE:HURT:5d1
+B:BITE:HURT:5d1
+F:NO_SLEEP | WILD_TOO | COLD_BLOOD |
+F:FRIENDS | AQUATIC | ANIMAL |
+F:MORTAL | BASEANGBAND
+D:A very large and bloodthirsty fish.
+
+N:885:Piranha
+G:~:R
+I:120:2d6:20:8:5
+W:3:1:200:8
+E:0:0:0:0:1:0
+O:0:0:0:0
+B:BITE:HURT:1d6
+F:FRIENDS | AQUATIC | ANIMAL | WILD_TOO | COLD_BLOOD |
+F:MORTAL | BASEANGBAND
+D:Bloodthirsty fish who can smell your blood from a great distance.
+
+# New monster added by furiosity for the Theme module
+N:886:Swamp naga
+G:n:o
+I:110:11d8:20:40:120
+W:10:3:1800:60
+E:0:0:0:0:1:0
+O:50:0:50:0
+B:CRUSH:HURT:2d10
+B:BITE:POISON:2d4
+F:FEMALE | CAN_SWIM | WILD_TOO | WILD_SHORE |
+F:RAND_25 | DROP_90 | AQUATIC | IM_POIS |
+F:TAKE_ITEM | BASH_DOOR | DROP_CORPSE | IM_ACID |
+F:EVIL | MORTAL | BASEANGBAND
+D:A large orange snake with a woman's torso. She prefers to live
+D:in the swamp and can withstand marshland elements.
+
+# New monster added by furiosity for the Theme module
+N:887:Ocean naga
+G:n:b
+I:110:11d80:20:40:120
+W:30:10:1800:60
+E:0:0:0:0:1:0
+O:50:0:50:0
+B:CRUSH:HURT:4d10
+B:BITE:ACID:3d6
+F:FEMALE | CAN_SWIM | WILD_TOO | WILD_SHORE |
+F:DROP_90 | AQUATIC | WILD_OCEAN | IM_ACID |
+F:TAKE_ITEM | BASH_DOOR | DROP_CORPSE | RES_WATE |
+F:EVIL | MORTAL | BASEANGBAND
+S:1_IN_8
+S:BA_WATE | BO_ICEE |
+D:A large dark blue snake with a woman's torso. She prefers to live
+D:in deep water.
+
+# New monster added by furiosity for the Theme module
+N:888:Snail
+G:w:U
+I:30:12d9:1:5:255
+W:1:2:1:0
+E:0:0:0:0:1:0
+O:0:0:0:0
+B:BITE:HURT:1d1
+F:ANIMAL | EMPTY_MIND | CAN_SWIM | WILD_ONLY | WILD_GRASS |
+F:DROP_CORPSE | MORTAL | BASEANGBAND | NEUTRAL | NO_TARGET |
+D:A harmless shell-bearing gastropod mollusc
+D:crawling slowly on the dungeon floor.
+D:It is a favourite prey of birds.
+
+N:889:Whale
+G:~:D
+I:110:22d22:15:50:70
+W:20:4:9000:175
+E:0:0:0:0:1:0
+O:0:0:0:0
+B:CRUSH:HURT:1d20
+B:CRUSH:HURT:1d20
+F:RAND_25 | FORCE_MAXHP | RES_WATE |
+F:ANIMAL | AQUATIC | WILD_TOO |
+F:MORTAL | BASEANGBAND
+D:Although it looks like a fish and lives in water, it is in fact
+D:a mammal. And it is huge.
+
+N:890:Sand mite
+G:~:B
+I:110:3d10:5:25:80
+W:10:2:500:25
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:BITE:POISON:3d6
+B:BITE:POISON:3d6
+F:AQUATIC | ANIMAL | IM_POIS | FRIENDS |
+F:CHAR_CLEAR | ATTR_CLEAR | DROP_CORPSE | COLD_BLOOD |
+F:MORTAL | BASEANGBAND
+S:MULTIPLY
+D:A relative of crabs and shrimp, this is a tiny creature that inhabits sandy
+D:bottoms. It has a pair of dangerous-looking claws.
+
+N:891:Octopus
+G:~:g
+I:105:60d6:60:60:60
+W:15:2:1200:60
+E:3:0:3:6:1:0
+O:0:0:0:0
+B:SPIT:BLIND:1d3
+B:CRUSH:HURT:6d3
+B:CRUSH:HURT:6d3
+B:CRUSH:HURT:6d3
+F:RAND_25 | IM_COLD | RES_WATE | AQUATIC | ANIMAL | WILD_TOO | COLD_BLOOD |
+F:MORTAL | BASEANGBAND
+D:It doesn't move very fast, but when it does - watch out.
+
+N:892:Giant octopus
+G:~:g
+I:115:100d6:10:35:5
+W:30:1:1800:180
+E:3:0:3:6:1:0
+O:0:0:0:0
+B:SPIT:BLIND:1d4
+B:CRUSH:HURT:8d4
+B:CRUSH:HURT:8d4
+B:CRUSH:PARALYZE:8d4
+F:AQUATIC | SMART | IM_POIS | ANIMAL | NO_CONF | NO_SLEEP |
+F:NO_FEAR | SMART | WEIRD_MIND | DROP_CORPSE | COLD_BLOOD |
+F:MORTAL | BASEANGBAND
+S:1_IN_15 |
+S:DARKNESS | SLOW | CONF | SCARE
+D:A cunning and dangerous undersea opponent.
+
+N:893:Eye of the deep
+G:e:b
+I:120:16d100:10:20:40
+W:40:3:1600:6000
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:GAZE:EXP_20:2d6
+B:GAZE:UN_POWER:2d6
+B:GAZE:INSANITY:2d6
+B:BITE:HURT:6d6
+F:EVIL | IM_POIS | NO_CONF | NO_SLEEP | AQUATIC |
+F:FORCE_SLEEP | FORCE_MAXHP | CAN_FLY | RES_TELE |
+F:SMART | DROP_CORPSE | BASEANGBAND
+S:1_IN_2 |
+S:BLIND | SLOW | CONF | SCARE | DRAIN_MANA | MIND_BLAST |
+S:FORGET | DARKNESS | BO_WATE | BO_ICEE | BO_MANA | BO_COLD
+D:A beholder that inhabits the depths of the sea, sleeping and pondering
+D:alien thoughts for centuries. Occasionally, it will float to the
+D:surface to wreck the lives of surface dwellers.
+
+N:894:Murk dweller
+G:S:g
+I:110:200d5:70:30:0
+W:27:3:3000:800
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:BITE:POISON:5d10
+B:CLAW:PARALYZE
+B:STING:INSANITY:5d10
+B:STING:UN_BONUS
+F:AQUATIC | ANIMAL | WEIRD_MIND | FORCE_MAXHP | HURT_LITE |
+F:EVIL | SMART | NO_CONF | NO_SLEEP | DROP_CORPSE |
+F:MORTAL | BASEANGBAND
+S:1_IN_5 |
+S:BA_POIS | BR_DARK | BLIND | BR_POIS | SLOW | CONF | MIND_BLAST |
+S:BRAIN_SMASH | DARKNESS
+D:A gigantic aquatic monster, somewhat resembling a cross between a
+D:lobster and a spider. It is coated in poisonous slime and noxious
+D:parasites. This foul creature hides in the silt of the deep ocean floor,
+D:waiting to trap unsuspecting prey.
+
+N:895:Drowned soul
+G:G:B
+I:110:9d8:5:33:50
+W:11:1:0:30
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:TOUCH:BLIND:3d3
+B:TOUCH:POISON:2d4
+B:WAIL:TERRIFY
+F:COLD_BLOOD | EMPTY_MIND | EVIL | AQUATIC | UNDEAD | IM_COLD | INVISIBLE |
+F:IM_POIS | NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT
+S:1_IN_8
+S:BLIND | HOLD | CONF
+D:A ghastly victim of drowning, forever doomed to wander the ocean waters
+D:looking for revenge.
+
+N:896:Tiger shark
+G:~:o
+I:120:10d5:100:32:0
+W:12:1:3000:40
+E:0:0:0:0:1:0
+O:0:0:0:0
+B:BITE:HURT:4d4
+F:RAND_25 | AQUATIC | ANIMAL | STUPID | DROP_CORPSE |
+F:MORTAL | BASEANGBAND
+D:A small species of shark, although the teeth are still as deadly.
+
+N:897:Hammerhead shark
+G:~:W
+I:115:16d10:20:59:20
+W:16:3:1500:40
+E:0:0:0:0:1:0
+O:0:0:0:0
+B:BITE:HURT:3d4
+B:BUTT:HURT:3d4
+B:BITE:HURT:3d4
+F:ANIMAL | AQUATIC | WILD_TOO | COLD_BLOOD |
+F:MORTAL | BASEANGBAND
+D:A hungry shark with a strange head.
+
+N:898:Great white shark
+G:~:w
+I:120:100d6:20:70:20
+W:24:2:5000:250
+E:0:0:0:0:1:0
+O:0:0:0:0
+B:BITE:HURT:4d6
+B:BITE:HURT:4d6
+B:BITE:HURT:4d6
+F:FORCE_SLEEP | AQUATIC | COLD_BLOOD |
+F:ANIMAL MORTAL | BASEANGBAND
+D:A very large carnivorous fish.
+
+N:899:Aquatic golem
+G:g:b
+I:100:25d10:35:75:10
+W:19:1:0:100
+E:1:1:1:2:1:1
+O:0:0:0:0
+B:HIT:HURT:3d10
+B:HIT:HURT:3d10
+F:COLD_BLOOD | EMPTY_MIND | AQUATIC |
+F:IM_FIRE | IM_COLD | IM_ELEC | IM_POIS |
+F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT
+D:An ingenious gnomish invention -- a golem designed for underwater
+D:usage.
+
+# New monster added by furiosity for the Theme module
+N:900:Brown naga
+G:n:u
+I:110:14d8:20:40:120
+W:30:2:1800:80
+E:0:0:0:0:1:0
+O:50:0:50:0
+B:CRUSH:HURT:2d10
+B:BITE:LOSE_CHR:3d6
+F:FEMALE | CAN_SWIM | WILD_TOO | WILD_SHORE |
+F:RAND_25 | DROP_60 | NO_CUT | WILD_GRASS |
+F:TAKE_ITEM | BASH_DOOR | DROP_CORPSE |
+F:EVIL | MORTAL | BASEANGBAND
+S:1_IN_7
+S:BR_SHAR
+D:A large brown snake with a woman's torso. It burrows deep into
+D:the ground.
+
+N:901:White shark
+G:~:W
+I:120:30d10:20:50:10
+W:18:1:3000:100
+E:0:0:0:0:1:0
+O:0:0:0:0
+B:BITE:HURT:3d5
+B:BITE:HURT:3d5
+B:BITE:HURT:3d5
+F:ANIMAL | AQUATIC | WILD_TOO | COLD_BLOOD |
+F:MORTAL | BASEANGBAND
+D:A fast-moving hunter of the depths. When this creature moves,
+D:everybody in the water is in danger.
+
+N:902:Scrag
+G:T:B
+I:110:40d10:20:50:50
+W:35:1:5000:440
+E:1:1:1:2:1:1
+O:0:100:0:0
+B:HIT:HURT:1d10
+B:HIT:HURT:1d10
+B:HIT:HURT:3d2
+B:HIT:HURT:3d2
+F:MALE |
+F:FORCE_MAXHP | AQUATIC | REGENERATE |
+F:FRIENDS | DROP_60 | WILD_TOO | WILD_OCEAN |
+F:OPEN_DOOR | BASH_DOOR | RES_WATE |
+F:EVIL | TROLL | IM_COLD | IM_POIS | HURT_LITE | BASEANGBAND
+D:It is said that Morgoth created trolls in mockery of the Ents.
+D:A troll of the sea, he reeks of brine.
+
+N:903:Jaws
+G:~:w
+I:130:100d20:200:80:70
+W:40:2:7000:2000
+E:0:0:0:0:1:0
+O:0:0:0:0
+B:BITE:HURT:11d2
+B:BITE:HURT:22d1
+B:BITE:HURT:11d2
+B:BITE:HURT:22d1
+F:FORCE_MAXHP | UNIQUE | MOVE_BODY |
+F:WILD_OCEAN | WILD_TOO | COLD_BLOOD |
+F:BASH_DOOR | IM_COLD | IM_ELEC | IM_POIS | ANIMAL | AQUATIC |
+F:NO_CONF | NO_SLEEP |
+F:MORTAL | JOKEANGBAND
+D:The biggest white shark who has ever lived, it is hunting for you now.
+
+# New monster added by furiosity for the Theme module
+N:904:Silver naga
+G:n:W
+I:110:18d11:20:65:120
+W:15:2:1900:80
+E:0:0:0:0:1:0
+O:0:0:80:20
+B:CRUSH:HURT:2d8
+B:BITE:POISON:1d8
+B:BITE:COLD:1d8
+F:FEMALE |
+F:RAND_25 | DROP_60 | DROP_1D2 | DROP_CORPSE
+F:OPEN_DOOR | BASH_DOOR | CAN_SWIM | IM_POIS |
+F:EVIL | MORTAL | BASEANGBAND | IM_COLD |
+S:1_IN_7
+S:BO_ICEE | BO_COLD |
+D:A giant snake-like figure with a woman's torso, partially covered
+D:in silvery scales.
+
+N:905:Aquatic elven warrior
+G:h:b
+I:110:20d8:40:35:5
+W:10:1:1500:35
+E:1:1:1:2:1:0
+O:20:60:10:10
+B:HIT:HURT:4d4
+B:HIT:HURT:4d4
+F:MALE | AQUATIC | FRIENDS | SMART | DROP_60 | DROP_CORPSE | BASEANGBAND |
+F:HAS_LITE | PET | GOOD
+D:An aquatic elf trained in all forms of combat.
+
+N:906:Aquatic elven mage
+G:h:o
+I:110:12d8:30:30:6
+W:10:1:1400:35
+E:1:1:1:2:1:0
+O:10:10:70:10
+B:TOUCH:UN_BONUS
+F:MALE | AQUATIC | SMART | DROP_2D2 | DROP_CORPSE | BASEANGBAND |
+F:HAS_LITE | PET | GOOD
+S:1_IN_12 |
+S:BO_MANA | BO_COLD | S_MONSTERS
+D:A wizened aquatic elf skilled in the magical arts. You can see an
+D:iridescent film coating the water around him.
+
+N:907:Stargazer
+G:~:y
+I:100:15d9:10:25:30
+W:21:1:800:60
+E:0:0:0:0:1:0
+O:0:0:0:0
+B:GAZE:PARALYZE
+F:AQUATIC | ANIMAL | SMART | RAND_25 | DROP_CORPSE |
+F:MORTAL | BASEANGBAND
+S:1_IN_10 |
+S:S_MONSTER
+D:A giant fish shaped like a flounder. There are two enormous eyes
+D:occupying half of the creature's body.
+
+N:908:Elder stargazer
+G:~:U
+I:100:20d10:15:25:30
+W:29:1:1000:75
+E:0:0:0:0:1:0
+O:0:0:0:0
+B:GAZE:PARALYZE
+B:GAZE:CONFUSE
+F:AQUATIC | ANIMAL | SMART | DROP_CORPSE |
+F:MORTAL | BASEANGBAND
+S:1_IN_10 |
+S:S_MONSTERS
+D:A stargazer a bit larger than average, covered with barnacles.
+
+N:909:Flounder
+G:~:s
+I:100:10d5:5:25:30
+W:13:1:700:55
+E:0:0:0:0:1:0
+O:0:0:0:0
+B:BITE:HURT:2d6
+F:AQUATIC | ANIMAL | RAND_25 | INVISIBLE | ATTR_CLEAR | DROP_CORPSE |
+F:MORTAL | BASEANGBAND
+D:A flattened fish which is able to change body colouring for
+D:camouflage.
+
+N:910:Giant turtle
+G:R:G
+I:110:5d8:10:14:30
+W:7:1:3000:30
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:BITE:HURT:2d2
+B:BITE:HURT:2d2
+F:ANIMAL | AQUATIC | DROP_CORPSE |
+F:MORTAL | BASEANGBAND
+D:A giant turtle with flippers, adapted for life in the ocean.
+
+N:911:Hatchling dragon turtle
+G:d:W
+I:110:10d10:20:60:50
+W:9:1:20000:35
+E:0:1:0:6:1:0
+O:0:0:0:0
+B:CLAW:HURT:1d3
+B:CLAW:HURT:1d3
+B:BITE:HURT:1d5
+F:FORCE_MAXHP | FORCE_SLEEP | DROP_CORPSE |
+F:ONLY_GOLD | DROP_60 | DROP_1D2 |
+F:EVIL | DRAGON | AQUATIC | BASEANGBAND | ATTR_MULTI
+S:1_IN_12 |
+S:BR_SOUN
+D:A newly-hatched dragon turtle. It still hasn't grown a proper shell.
+
+N:912:Young dragon turtle
+G:d:W
+I:110:30d10:20:70:70
+W:31:1:80000:700
+E:0:1:0:6:1:0
+O:50:50:0:0
+B:CLAW:HURT:2d6
+B:CLAW:HURT:2d6
+B:BITE:HURT:2d8
+F:FORCE_SLEEP | FORCE_MAXHP | DROP_CORPSE |
+F:DROP_3D2 |
+F:EVIL | DRAGON | AQUATIC | BASEANGBAND | ATTR_MULTI
+S:1_IN_11 |
+S:SCARE |
+S:BR_SOUN
+D:A dragon-like creature inhabiting lightless reaches of ocean caves. It has
+D:a long neck with a tiny head, and four massive flippers. It has a soft and
+D:flexible shell.
+
+N:913:Mature dragon turtle
+G:d:W
+I:110:50d10:20:80:70
+W:38:1:170000:1500
+E:0:1:0:6:1:0
+O:50:50:0:0
+B:CLAW:HURT:2d10
+B:CLAW:HURT:2d10
+B:BITE:HURT:4d10
+F:FORCE_SLEEP | FORCE_MAXHP | DROP_CORPSE |
+F:DROP_4D2 |
+F:EVIL | DRAGON | NO_CONF | NO_SLEEP | AQUATIC | BASEANGBAND | HAS_LITE
+F:ATTR_MULTI
+S:1_IN_9 |
+S:SCARE |
+S:BR_SOUN
+D:A large dragon turtle, covered with a tough white shell.
+
+N:914:Ancient dragon turtle
+G:D:W
+I:120:70d10:20:90:80
+W:41:1:220000:2500
+E:0:1:0:6:1:0
+O:50:50:0:0
+B:CLAW:HURT:4d8
+B:CLAW:HURT:4d8
+B:BITE:HURT:7d8
+F:FORCE_SLEEP | FORCE_MAXHP | DROP_CORPSE |
+F:DROP_1D2 | DROP_4D2 |
+F:SMART | AQUATIC | POWERFUL | MOVE_BODY |
+F:EVIL | DRAGON | NO_CONF | NO_SLEEP | BASEANGBAND | HAS_LITE | ATTR_MULTI
+S:1_IN_9 |
+S:BLIND | CONF | SCARE |
+S:BR_SOUN
+D:A huge dragon turtle. You can see many barnacles covering its body.
+
+N:915:Fastitocalon
+G:D:g
+I:120:40d100:25:150:30
+W:52:3:250000:16000
+E:0:1:0:6:1:0
+O:0:0:0:0
+B:BITE:HURT:5d8
+B:BITE:HURT:5d8
+B:CRUSH:POISON:3d10
+B:CRUSH:POISON:3d10
+F:FORCE_SLEEP | FORCE_MAXHP | RES_TELE | AQUATIC | WILD_TOO | WILD_OCEAN |
+F:IM_FIRE | IM_ACID | IM_COLD | IM_POIS |
+F:DRAGON | NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | ATTR_MULTI
+S:1_IN_6 |
+S:BR_FIRE | BR_ACID | BR_SOUN | BA_WATE
+D:A huge aquatic dragon-turtle, its shell is as large as a small island.
+
+N:916:Undead stargazer
+G:~:u
+I:100:18d9:10:25:30
+W:25:1:0:100
+E:0:0:0:0:1:0
+O:0:0:0:0
+B:GAZE:PARALYZE
+B:GAZE:EXP_20
+F:AQUATIC | ANIMAL | SMART | INVISIBLE | UNDEAD | BASEANGBAND | NO_CUT
+S:1_IN_10 |
+S:S_UNDEAD | S_MONSTER
+D:A stargazer brought back from the dead under control of some evil
+D:sorceror.
+
+N:917:Killer whale
+G:~:w
+I:120:20d50:12:55:30
+W:25:1:9500:85
+E:0:0:0:0:1:0
+O:0:0:0:0
+B:BITE:HURT:7d4
+B:BITE:HURT:7d4
+F:AQUATIC | WILD_TOO | WILD_OCEAN |
+F:ANIMAL | MORTAL | BASEANGBAND
+D:An almost beautiful, deadly beast.
+
+N:918:Merrow
+G:O:B
+I:110:30d9:20:33:30
+W:28:2:2300:80
+E:1:1:1:2:1:1
+O:20:70:0:10
+B:HIT:HURT:3d8
+B:HIT:HURT:3d8
+F:FRIENDS | DROP_60 | DROP_CORPSE | AQUATIC | WILD_TOO | WILD_OCEAN |
+F:OPEN_DOOR | BASH_DOOR | RES_WATE | IM_COLD | IM_POIS |
+F:EVIL | GIANT |
+F:MORTAL | BASEANGBAND | HAS_LITE
+D:A great ogre of the sea, it is violent and stupid.
+
+N:919:Water naga
+G:n:B
+I:110:30d10:10:55:10
+W:24:1:1600:60
+E:0:0:0:0:1:0
+O:40:0:50:10
+B:CRUSH:HURT:2d8
+B:CRUSH:HURT:2d8
+B:BITE:POISON:1d8
+B:BITE:POISON:1d8
+F:FEMALE |
+F:AQUATIC | DROP_CORPSE |
+F:ONLY_ITEM | DROP_90 | DROP_2D2 |
+F:EVIL | NO_CONF | NO_SLEEP | SMART |
+F:MORTAL | BASEANGBAND
+S:1_IN_7 |
+S:DARKNESS | CAUSE_3 | BO_ICEE
+D:A naga adapted to underwater life. She has a fish-like tail and a pair
+D:of gills.
+
+# New monster added by furiosity for the Theme module
+N:920:Night naga
+G:n:v
+I:110:30d15:20:75:120
+W:25:2:0:60
+E:0:0:0:0:1:0
+O:20:0:80:0
+B:CRUSH:TERRIFY:2d8
+B:CRUSH:HURT:2d8
+B:BITE:BLIND:1d8
+B:BITE:HURT:1d8
+F:FEMALE | CAN_SWIM |
+F:FORCE_SLEEP | CAN_FLY | HURT_LITE |
+F:ONLY_ITEM | DROP_90 | DROP_2D2 | DROP_CORPSE |
+F:INVISIBLE | OPEN_DOOR | BASH_DOOR |
+F:EVIL | NO_CONF | NO_SLEEP | BASEANGBAND |
+S:1_IN_4 |
+S:BLIND | DARKNESS
+D:A dark snake-like form with the torso of a beautiful woman, it
+D:prefers to roam in the night.
+
+# New monster added by furiosity for the Theme module
+N:921:Tree naga
+G:n:G
+I:110:30d15:20:75:120
+W:28:2:0:60
+E:0:0:0:0:1:0
+O:20:0:80:0
+B:CRUSH:HURT:2d8
+B:CRUSH:HURT:2d8
+B:BITE:HURT:1d8
+B:BITE:HURT:1d8
+F:FEMALE |
+F:FORCE_SLEEP | CAN_FLY | CAN_SWIM |
+F:ONLY_ITEM | DROP_90 | DROP_2D2 | DROP_CORPSE |
+F:INVISIBLE | OPEN_DOOR | BASH_DOOR | IM_POIS |
+F:EVIL | NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT
+S:1_IN_4 |
+S:HEAL | BR_POIS | BA_POIS | DARKNESS
+D:A green snake-like form with the torso of a beautiful woman, it
+D:dwells in the trees.
+
+N:922:Moby Dick, the White Whale
+G:~:w
+I:120:100d25:200:80:70
+W:50:2:10000:2500
+E:0:0:0:0:1:0
+O:0:0:0:0
+B:CRUSH:HURT:10d10
+B:CRUSH:HURT:10d10
+B:CRUSH:HURT:10d10
+B:CRUSH:HURT:10d10
+F:FORCE_MAXHP | UNIQUE | MOVE_BODY |
+F:WILD_OCEAN | WILD_TOO | COLD_BLOOD |
+F:BASH_DOOR | IM_COLD | IM_ELEC | IM_POIS | ANIMAL | AQUATIC |
+F:MORTAL | JOKEANGBAND
+S:1_IN_6 | BA_WATE
+D:The mightiest whale of the seas, he has sunk many ships in his time. With
+D:a mere flick of his tail he can create a mighty whirlpool, to the ruin
+D:of all who would travel the ocean.
+
+N:923:Aquatic hound
+G:Z:B
+I:110:15d5:60:60:0
+W:20:1:600:200
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:BITE:CONFUSE:2d8
+B:BITE:HURT:2d8
+B:CLAW:POISON:2d8
+F:FRIENDS | DROP_CORPSE |
+F:ANIMAL | AQUATIC |
+F:MORTAL | BASEANGBAND
+S:1_IN_10 |
+S:BO_ICEE | BO_WATE
+D:A hound with a finned tail and large, muscular flippers for hind legs.
+D:It has a rubbery skin instead of fur.
+
+N:924:Gaurrog
+G:U:B
+I:110:35d20:30:50:10
+W:40:1:0:1000
+E:0:0:0:0:1:0
+O:20:60:20:0
+B:HIT:HURT:3d4
+B:GAZE:POISON:8d12
+B:CLAW:INSANITY:8d12
+F:FORCE_SLEEP | FORCE_MAXHP |
+F:FRIENDS | SMART |
+F:ONLY_ITEM | DROP_60 |
+F:AQUATIC | POWERFUL |
+F:EVIL | DEMON | IM_ACID | NO_CONF | NO_SLEEP | BASEANGBAND | HAS_LITE
+S:1_IN_8 |
+S:BO_ICEE | BA_WATE
+D:A hideous scaled demon, it is a sleek form with many fins but no visible
+D:arms or legs. It has a toothed gaping maw, reminiscent of a caricature
+D:of a shark's jaws.
+
+# New monster added by furiosity for the Theme module
+N:925:Adventurer naga
+G:n:U
+I:110:30d15:20:75:120
+W:28:2:0:60
+E:0:0:0:0:1:0
+O:20:0:80:0
+B:CRUSH:HURT:2d8
+B:CRUSH:HURT:2d8
+B:BITE:HURT:1d8
+B:BITE:HURT:1d8
+F:FEMALE |
+F:FORCE_SLEEP | CAN_FLY |
+F:ONLY_ITEM | DROP_90 | DROP_2D2 | DROP_CORPSE |
+F:INVISIBLE | OPEN_DOOR | BASH_DOOR | NO_STUN | PET |
+F:EVIL | NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT
+S:1_IN_4 |
+S:HEAL | BLIND | CONF | DARKNESS
+D:A large brown snake with a woman's torso. She is a fellow
+D:adventurer.
+
+# New monster added by furiosity for the Theme module
+N:926:White mold
+G:m:w
+I:110:17d8:2:16:70
+W:19:1:40:64
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:SPORE:COLD:4d4
+F:NEVER_MOVE | SUSCEP_FIRE |
+F:STUPID | EMPTY_MIND |
+F:IM_COLD | IM_POIS | CAN_SWIM |
+F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT
+D:It is a strange white growth on the dungeon floor; it seems to sparkle
+D:with ice.
+
+# New monster added by furiosity for the Theme module
+N:927:Silver mold
+G:m:W
+I:110:17d8:2:16:70
+W:19:1:40:64
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:SPORE:EAT_LITE:4d4
+F:NEVER_MOVE |
+F:STUPID | EMPTY_MIND |
+F:IM_POIS | CAN_SWIM |
+F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT
+D:It is a strange silvery growth on the dungeon floor; it seems to glow with
+D:a dark light.
+
+N:928:Mathilde
+G:h:y
+I:110:220d100:40:10:3
+W:0:4:1100:0
+E:0:1:1:2:1:1
+O:20:20:20:20
+F:UNIQUE | FEMALE | CAN_SPEAK | DROP_CORPSE | DROP_SKELETON |
+F:FORCE_MAXHP | WILD_TOWN | WILD_ONLY | RAND_25
+F:ONLY_ITEM | DROP_90 | DROP_GOOD |
+F:OPEN_DOOR | DG_CURSE |
+F:MORTAL | JOKEANGBAND | HAS_LITE
+D:She loves joking, and she's constantly giggling. A very happy girl.
+D:Beware, it is rumoured that DarkGod has put a mighty curse on her.
+
+N:929:Child spirit
+G:G:W
+I:120:5d5:8:15:10
+W:5:3:0:0
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:TOUCH:TERRIFY
+B:TOUCH:HURT:3d4
+F:INVISIBLE | COLD_BLOOD | PASS_WALL | UNDEAD | GOOD |
+F:IM_COLD | IM_POIS | NO_CONF | NO_SLEEP | SMART | PET | UNDEAD |
+F:BASEANGBAND | NO_CUT
+D:A helpful spirit from beyond the grave.
+
+N:930:Young spirit
+G:G:W
+I:120:8d8:8:15:10
+W:10:3:0:0
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:TOUCH:TERRIFY
+B:TOUCH:HURT:9d4
+F:INVISIBLE | COLD_BLOOD | PASS_WALL | UNDEAD | GOOD |
+F:IM_COLD | IM_POIS | NO_CONF | NO_SLEEP | SMART | PET | UNDEAD |
+F:BASEANGBAND | NO_CUT
+D:A helpful spirit from beyond the grave.
+
+N:931:Mature spirit
+G:G:W
+I:120:16d16:8:15:10
+W:40:3:0:0
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:TOUCH:TERRIFY
+B:TOUCH:HURT:18d4
+F:INVISIBLE | COLD_BLOOD | PASS_WALL | UNDEAD | GOOD |
+F:IM_COLD | IM_POIS | NO_CONF | NO_SLEEP | SMART | PET | UNDEAD |
+F:BASEANGBAND | NO_CUT
+D:A helpful spirit from beyond the grave.
+
+N:932:Experienced spirit
+G:G:W
+I:120:18d18:8:15:10
+W:60:3:0:0
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:TOUCH:TERRIFY
+B:TOUCH:HURT:20d4
+F:INVISIBLE | COLD_BLOOD | PASS_WALL | UNDEAD | GOOD |
+F:IM_COLD | IM_POIS | NO_CONF | NO_SLEEP | SMART | PET | UNDEAD |
+F:BASEANGBAND | NO_CUT
+D:A helpful spirit from beyond the grave.
+
+N:933:Wise spirit
+G:G:W
+I:120:25d25:8:15:10
+W:90:3:0:0
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:TOUCH:TERRIFY
+B:TOUCH:HURT:30d4
+F:INVISIBLE | COLD_BLOOD | PASS_WALL | UNDEAD | GOOD |
+F:IM_COLD | IM_POIS | NO_CONF | NO_SLEEP | SMART | PET | UNDEAD |
+F:BASEANGBAND | NO_CUT
+D:A helpful spirit from beyond the grave.
+
+N:934:Fangorn the Treebeard, Lord of the Ents
+G:#:G
+I:120:50d100:30:120:15
+W:52:3:6000:15500
+E:1:1:1:2:1:1
+O:0:50:50:0
+B:CRUSH:HURT:13d13
+B:CRUSH:HURT:13d13
+B:CRUSH:HURT:13d13
+B:CRUSH:HURT:13d13
+F:FORCE_SLEEP | FORCE_MAXHP | UNIQUE | CAN_SPEAK | SUSCEP_FIRE |
+F:ONLY_ITEM | DROP_4D2 | DROP_GOOD | MOVE_BODY | DROP_CORPSE |
+F:SMART | TAKE_ITEM | BASH_DOOR | KILL_WALL | NO_SLEEP |
+F:GOOD | PET | BASEANGBAND | NO_CUT
+D:The first being to awoke on Arda, apart from the Valar themselves. He is the
+D:first, oldest, greatest and most respected of all the Ents: and though he is
+D:slow to anger, he is a terrible foe when roused.
+
+N:935:Gandalf the Grey
+G:p:s
+I:120:49d101:101:100:0
+W:60:7:1600:35000
+E:1:1:1:2:1:1
+O:0:0:100:0
+B:HIT:UN_BONUS:6d8
+B:HIT:UN_BONUS:6d8
+B:HIT:TERRIFY:5d5
+B:HIT:TERRIFY:5d5
+F:UNIQUE | MALE | CAN_SPEAK | PET | DROP_CORPSE |
+F:FORCE_SLEEP | FORCE_MAXHP | REFLECTING | RES_TELE |
+F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 | DROP_GOOD |
+F:SMART | OPEN_DOOR | BASH_DOOR |
+F:GOOD | IM_FIRE | IM_COLD |
+F:IM_ELEC | IM_POIS | BASEANGBAND | HAS_LITE
+S:1_IN_2 |
+S:HEAL | HASTE | TPORT | TELE_AWAY | BLIND | CONF | SCARE |
+S:CAUSE_4 | BRAIN_SMASH | FORGET | TRAPS |
+S:BA_FIRE | BO_FIRE | BO_PLAS | BO_MANA | CAUSE_4 |
+S:S_MONSTERS | S_DRAGON | S_KIN
+D:The wizard who opposed Sauron and, in the end, was the only
+D:one of the Istari to succeed in his task. Gandalf is very
+D:wise and specialises in fire magic.
+
+N:936:Nar, the Dwarf
+G:k:y
+I:110:45d10:25:70:25
+W:17:2:1400:250
+E:1:1:1:2:1:1
+O:0:0:0:0
+B:HIT:HURT:3d5
+B:HIT:HURT:3d5
+B:HIT:HURT:3d5
+B:HIT:HURT:3d5
+F:UNIQUE | MALE |
+F:FORCE_MAXHP | FORCE_SLEEP |
+F:OPEN_DOOR | BASH_DOOR |
+F:IM_FIRE | IM_COLD | IM_POIS |
+F:DROP_CORPSE | DROP_SKELETON | BASEANGBAND | HAS_LITE
+S:1_IN_6 |
+S:HEAL | BLIND | CONF | CAUSE_2 | MIND_BLAST
+D:The friend and companion of the dwarven king Thror, he went mad with
+D:grief after Thror's death at the hands of Azog the Orc. With torn beard
+D:and ragged clothes, he seems to have fixed on you as a convenient target
+D:to vent his anger.
+
+N:937:Apprentice mindcrafter
+G:p:y
+I:110:6d8:20:10:5
+W:8:1:900:18
+E:1:1:1:2:1:1
+O:0:50:0:30
+B:HIT:HURT:1d6
+F:DROP_60 | WILD_TOO | FRIENDS |
+F:OPEN_DOOR | DROP_SKELETON | DROP_CORPSE |
+F:MORTAL | BASEANGBAND | HAS_LITE | NO_CONF | NO_SLEEP
+S:1_IN_12 | BLIND | SLOW | CONF | SCARE
+D:A novice in the arts of mind over matter.
+
+N:938:Great Swamp Worm
+G:D:g
+I:120:40d100:30:150:80
+W:63:2:190000:20000
+E:0:1:0:6:1:0
+O:50:50:0:0
+B:CLAW:HURT:4d12
+B:CLAW:HURT:4d12
+B:BITE:POISON:6d14
+B:BITE:POISON:6d14
+F:FORCE_SLEEP | FORCE_MAXHP | CAN_FLY |
+F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 | DROP_GOOD |
+F:BASH_DOOR | POWERFUL | MOVE_BODY | DROP_CORPSE |
+F:EVIL | DRAGON | IM_POIS | NO_CONF | NO_SLEEP | BASEANGBAND | HAS_LITE
+F:ATTR_MULTI
+S:1_IN_4 |
+S:BLIND | CONF | SCARE |
+S:BR_POIS
+D:A truly enormous dragon with great powers. The foul gases issuing
+D:from the beast nearly make you vomit; and while you may try to hold
+D:your breath as you fight it, it sees no reason to do likewise.
+
+N:939:Great Bile Worm
+G:D:s
+I:120:50d100:30:150:80
+W:67:2:190000:23000
+E:0:1:0:6:1:0
+O:50:50:0:0
+B:CLAW:HURT:4d12
+B:CLAW:HURT:4d12
+B:BITE:ACID:6d14
+B:BITE:ACID:6d14
+F:FORCE_SLEEP | FORCE_MAXHP | CAN_FLY |
+F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 | DROP_GOOD |
+F:BASH_DOOR | POWERFUL | MOVE_BODY | DROP_CORPSE |
+F:EVIL | DRAGON | IM_ACID | NO_CONF | NO_SLEEP | BASEANGBAND | HAS_LITE
+F:ATTR_MULTI
+S:1_IN_4 |
+S:BLIND | CONF | SCARE |
+S:BR_ACID
+D:A huge and very powerful dragon. Great steaming pools of acid drip from
+D:its form onto the ground. You shudder when you see the acid eating away
+D:the very stones of the dungeon - what could it do to you?
+
+N:940:Blue Firebird
+G:B:b
+I:120:4d5:8:15:10
+W:5:3:100:0
+E:0:1:0:6:1:0
+O:0:0:0:0
+B:CLAW:HURT:3d4
+B:CLAW:FIRE:5d4
+F:IM_COLD | IM_FIRE | IM_POIS | NO_CONF | NO_SLEEP | IMPRESED |
+F:CAN_FLY | SMART | PET | DROP_CORPSE | HAS_EGG | GOOD | AQUATIC |
+F:MORTAL | HAS_LITE
+S:1_IN_10
+S:TELE_TO |
+D:The ancestors of the Eagles of the Thunderlords, these are
+D:friendly funny flying creatures with power.
+
+N:941:Green Firebird
+G:B:g
+I:120:4d5:10:15:10
+W:7:3:110:0
+E:0:1:0:6:1:0
+O:0:0:0:0
+B:CLAW:HURT:4d4
+B:CLAW:FIRE:5d4
+F:IM_COLD | IM_FIRE | IM_POIS | NO_CONF | NO_SLEEP | IMPRESED |
+F:CAN_FLY | SMART | PET | DROP_CORPSE | HAS_EGG | GOOD | AQUATIC |
+F:MORTAL | HAS_LITE
+S:1_IN_10
+S:TELE_TO |
+D:The ancestors of the Eagles of the Thunderlords, these are
+D:friendly funny flying creatures with power.
+
+N:942:Brown Firebird
+G:B:u
+I:120:5d5:10:15:10
+W:10:3:120:0
+E:0:1:0:6:1:0
+O:0:0:0:0
+B:CLAW:HURT:5d4
+B:CLAW:FIRE:7d4
+F:IM_COLD | IM_FIRE | IM_POIS | NO_CONF | NO_SLEEP | IMPRESED |
+F:CAN_FLY | SMART | PET | DROP_CORPSE | HAS_EGG | GOOD | AQUATIC |
+F:MORTAL | HAS_LITE
+S:1_IN_10
+S:TELE_TO |
+D:The ancestors of the Eagles of the Thunderlords, these are
+D:friendly funny flying creatures with power.
+
+N:943:Bronze Firebird
+G:B:U
+I:120:6d5:15:15:10
+W:13:3:130:0
+E:0:1:0:6:1:0
+O:0:0:0:0
+B:CLAW:HURT:6d4
+B:CLAW:FIRE:7d4
+F:IM_COLD | IM_FIRE | IM_POIS | NO_CONF | NO_SLEEP | IMPRESED |
+F:CAN_FLY | SMART | PET | DROP_CORPSE | HAS_EGG | GOOD | AQUATIC |
+F:MORTAL | HAS_LITE
+S:1_IN_10
+S:TELE_TO |
+D:The ancestors of the Eagles of the Thunderlords, these are
+D:friendly funny flying creatures with power.
+
+N:944:Gold Firebird
+G:B:y
+I:120:6d5:20:15:10
+W:15:3:140:0
+E:0:1:0:6:1:0
+O:0:0:0:0
+B:CLAW:HURT:6d4
+B:CLAW:FIRE:8d4
+F:IM_COLD | IM_FIRE | IM_POIS | NO_CONF | NO_SLEEP | IMPRESED |
+F:CAN_FLY | SMART | PET | DROP_CORPSE | HAS_EGG | GOOD | AQUATIC |
+F:MORTAL | HAS_LITE
+S:1_IN_10
+S:TELE_TO |
+D:The ancestors of the Eagles of the Thunderlords, these are
+D:friendly funny flying creatures with power.
+
+N:945:High-elven ranger
+G:h:w
+I:120:50d30:20:70:0
+W:40:3:1400:500
+E:1:1:1:2:1:1
+O:0:0:0:0
+B:HIT:HURT:10d8
+B:HIT:HURT:10d8
+F:MALE | FRIENDS | OPEN_DOOR | BASH_DOOR |
+F:GOOD | DROP_SKELETON | DROP_CORPSE | SMART | PET |
+F:IM_ACID | IM_COLD | RES_WATE | RES_NETH |
+F:MORTAL | BASEANGBAND | HAS_LITE
+S:1_IN_2 |
+S:ARROW_4
+D:An elf cloaked in green wielding a longbow.
+
+N:946:Uvatha the Horseman
+G:N:D
+I:120:24d100:90:60:10
+W:40:13:0:10000
+E:0:0:0:0:0:0
+O:30:30:30:10
+B:HIT:HURT:6d6
+B:HIT:HURT:6d6
+B:HIT:EXP_80:4d6
+B:HIT:EXP_80:4d6
+F:UNIQUE | MALE |
+F:FORCE_MAXHP |
+F:ONLY_ITEM | DROP_2D2 | DROP_GOOD | NAZGUL | SUSCEP_FIRE |
+F:COLD_BLOOD | OPEN_DOOR | BASH_DOOR | MOVE_BODY | DROP_CHOSEN |
+F:EVIL | UNDEAD | IM_COLD | IM_POIS | HURT_LITE | NO_CONF | NO_SLEEP |
+F:BASEANGBAND | SPECIAL_GENE | NO_CUT
+D:A tall black Ringwraith, he is a master of horsemanship. He longs
+D:to taste your blood.
+
+N:947:Adunaphel the Quiet
+G:N:D
+I:120:27d100:90:60:10
+W:43:13:0:13000
+E:1:1:1:2:1:1
+O:30:30:30:10
+B:HIT:HURT:6d6
+B:HIT:HURT:6d6
+B:TOUCH:EXP_80:5d6
+B:TOUCH:EXP_80:5d6
+F:UNIQUE | FEMALE |
+F:FORCE_SLEEP | FORCE_MAXHP | NAZGUL | DROP_CHOSEN |
+F:ONLY_ITEM | DROP_4D2 | DROP_GOOD | SUSCEP_FIRE |
+F:INVISIBLE | COLD_BLOOD | PASS_WALL | MOVE_BODY |
+F:EVIL | UNDEAD | IM_COLD | IM_POIS | HURT_LITE | NO_CONF | NO_SLEEP |
+F:BASEANGBAND | NO_CUT
+S:1_IN_3 |
+S:BLIND | HOLD | SCARE | CAUSE_3 | FORGET |
+S:BO_ACID | 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 of Power.
+
+N:948:Akhorahil the Blind
+G:N:D
+I:120:30d100:90:70:10
+W:45:13:0:15000
+E:1:1:1:2:1:1
+O:30:30:30:10
+B:HIT:HURT:7d6
+B:HIT:HURT:7d6
+B:GAZE:EXP_80:6d6
+B:WAIL:TERRIFY:6d6
+F:UNIQUE | MALE |
+F:FORCE_SLEEP | FORCE_MAXHP | NAZGUL | DROP_CHOSEN |
+F:ONLY_ITEM | DROP_4D2 | DROP_GOOD | SUSCEP_FIRE |
+F:COLD_BLOOD | OPEN_DOOR | BASH_DOOR | MOVE_BODY |
+F:EVIL | UNDEAD | IM_COLD | IM_POIS |
+F:HURT_LITE | NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT
+S:1_IN_3 |
+S:BLIND | HOLD | SCARE | CAUSE_3 | DARKNESS |
+S:BO_COLD | BO_NETH |
+S:S_MONSTERS
+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
+D:any ordinary man ever could.
+
+N:949:Ren the Unclean
+G:N:D
+I:120:35d100:90:70:10
+W:48:13:0:18000
+E:1:1:1:2:1:1
+O:30:30:30:10
+B:HIT:HURT:7d7
+B:HIT:HURT:7d7
+B:TOUCH:EXP_80:6d7
+B:WAIL:TERRIFY:6d7
+F:UNIQUE | MALE |
+F:FORCE_SLEEP | FORCE_MAXHP | NAZGUL | DROP_CHOSEN |
+F:ONLY_ITEM | DROP_4D2 | DROP_GOOD | SUSCEP_FIRE |
+F:INVISIBLE | COLD_BLOOD | OPEN_DOOR | BASH_DOOR | MOVE_BODY |
+F:EVIL | UNDEAD | IM_COLD | IM_POIS |
+F:HURT_LITE | NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT
+S:1_IN_3 |
+S:BLIND | HOLD | SCARE | CAUSE_3 | BO_FIRE | BO_NETH |
+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.
+
+N:950:Ji Indur Dawndeath
+G:N:D
+I:120:40d100:90:70:10
+W:52:13:0:22000
+E:0:0:0:0:0:0
+O:30:30:30:10
+B:HIT:HURT:8d7
+B:HIT:HURT:8d7
+B:TOUCH:EXP_40:6d7
+B:TOUCH:EXP_40:6d7
+F:UNIQUE | MALE |
+F:FORCE_SLEEP | FORCE_MAXHP |
+F:ONLY_ITEM | DROP_4D2 | DROP_GOOD | NAZGUL | DROP_CHOSEN |
+F:INVISIBLE | COLD_BLOOD | OPEN_DOOR | BASH_DOOR | MOVE_BODY |
+F:EVIL | UNDEAD | IM_COLD | IM_POIS | SUSCEP_FIRE |
+F:HURT_LITE | NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT
+S:1_IN_3 |
+S:BLIND | HOLD | SCARE | CAUSE_3 |
+S:BA_NETH | BA_COLD | BA_ELEC | BA_ACID |
+S:S_UNDEAD
+D:This Ringwraith was a weak-minded sorcerer-king who fell easily under
+D:Sauron's power.
+
+N:951:Dwar, Dog Lord of Waw
+G:N:D
+I:120:45d100:90:90:10
+W:56:13:0:25000
+E:0:1:0:2:1:0
+O:30:30:30:10
+B:HIT:HURT:8d8
+B:HIT:HURT:8d8
+B:BITE:EXP_40:6d7
+B:WAIL:TERRIFY:6d7
+F:UNIQUE | MALE |
+F:FORCE_SLEEP | FORCE_MAXHP | NAZGUL | DROP_CHOSEN |
+F:ONLY_ITEM | DROP_4D2 | DROP_GOOD | SUSCEP_FIRE |
+F:SMART | COLD_BLOOD | OPEN_DOOR | BASH_DOOR | MOVE_BODY |
+F:EVIL | UNDEAD | IM_COLD | IM_POIS |
+F:HURT_LITE | NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT
+S:1_IN_3 |
+S:BLIND | HOLD | SCARE | CAUSE_3 | BA_NETH |
+S:S_MONSTERS | S_UNDEAD | S_HOUND
+D:Dwar had a special affinity for dogs in life, and can still command them
+D:at will. He howls manically as he reaches out to destroy you.
+
+N:952:Hoarmurath of Dir
+G:N:D
+I:130:60d100:90:100:10
+W:64:13:0:30000
+E:0:0:0:0:0:0
+O:30:30:30:10
+B:HIT:HURT:9d9
+B:HIT:HURT:9d9
+B:TOUCH:EXP_80:6d7
+B:WAIL:TERRIFY:6d7
+F:UNIQUE | MALE |
+F:FORCE_SLEEP | FORCE_MAXHP | SMART | SUSCEP_FIRE |
+F:ONLY_ITEM | DROP_2D2 | DROP_4D2 | DROP_GOOD |
+F:COLD_BLOOD | OPEN_DOOR | BASH_DOOR | MOVE_BODY |
+F:EVIL | UNDEAD | IM_COLD | IM_POIS | NAZGUL | DROP_CHOSEN |
+F:HURT_LITE | NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT
+S:1_IN_3 |
+S:BLIND | HOLD | SCARE | CAUSE_3 | CAUSE_4 | MIND_BLAST |
+S:BO_COLD | BA_COLD | BA_NETH |
+S:S_UNDEAD
+D:A Ringwraith powerful in fell sorcery, he yearns for the life he has
+D:exchanged for an unlife of everlasting torment.
+
+N:953:Khamul, the Black Easterling
+G:N:D
+I:130:70d100:90:100:10
+W:72:13:2600:40000
+E:1:1:1:2:1:1
+O:0:100:0:0
+B:HIT:HURT:9d10
+B:HIT:HURT:9d10
+B:TOUCH:EXP_80:7d7
+B:TOUCH:EXP_80:7d7
+F:UNIQUE | MALE | CAN_SPEAK |
+F:FORCE_SLEEP | FORCE_MAXHP |
+F:ONLY_ITEM | DROP_3D2 | DROP_4D2 | DROP_GOOD | NAZGUL | DROP_CHOSEN |
+F:SMART | COLD_BLOOD | OPEN_DOOR | BASH_DOOR | MOVE_BODY |
+F:EVIL | UNDEAD | IM_ACID | IM_COLD | IM_POIS | SUSCEP_FIRE |
+F:HURT_LITE | NO_CONF | NO_SLEEP | RES_TELE | BASEANGBAND | NO_CUT
+S:1_IN_2 |
+S:TELE_LEVEL | BLIND | HOLD | SCARE | CAUSE_3 | CAUSE_4 | BO_MANA |
+S:BA_COLD | BA_NETH | ANIM_DEAD |
+S:S_HI_UNDEAD | S_KIN
+D:He was the warrior-king of the East, now a ringwraith. Khamul is a powerful opponent, his skill in
+D:combat awesome and his form twisted by evil cunning.
+
+N:954:The Witch-King of Angmar
+G:N:D
+I:130:90d100:90:120:10
+W:80:14:1800:60000
+E:1:1:1:2:1:1
+O:30:30:30:10
+B:HIT:HURT:10d10
+B:HIT:HURT:10d10
+B:HIT:EXP_80:7d7
+B:HIT:EXP_80:7d7
+F:UNIQUE | MALE | CAN_SPEAK | RES_TELE
+F:FORCE_SLEEP | FORCE_MAXHP | SMART | SUSCEP_FIRE |
+F:ONLY_ITEM | DROP_3D2 | DROP_4D2 | DROP_GOOD |
+F:COLD_BLOOD | OPEN_DOOR | BASH_DOOR | MOVE_BODY | NAZGUL |
+F:EVIL | UNDEAD | DROP_CHOSEN |
+F:IM_COLD | IM_POIS | HURT_LITE | NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT
+S:1_IN_2 |
+S:TELE_AWAY | BLIND | HOLD | SCARE | CAUSE_3 | BRAIN_SMASH |
+S:BO_MANA | BA_NETH | S_WRAITH |
+S:S_KIN | S_HI_UNDEAD | S_HI_DRAGON | S_MONSTERS | ANIM_DEAD
+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
+D:speed, and commands legions of evil to do his bidding. It is said that he
+D:is fated never to die by the hand of mortal man.
+
+N:955:Green Thunderlord
+G:B:g
+I:120:50d50:20:100:50
+W:30:4:30000:10000
+E:1:1:1:2:1:1
+O:50:50:0:0
+B:HIT:HURT:8d6
+B:HIT:HURT:8d6
+F:FEMALE |
+F:THUNDERLORD | DROP_SKELETON | DROP_CORPSE |
+F:ONLY_ITEM | DROP_1D2 | DROP_GOOD | AQUATIC |
+F:IM_FIRE | REGENERATE | OPEN_DOOR | BASH_DOOR |
+F:RES_TELE | NO_CONF | NO_SLEEP | CAN_FLY | HAS_LITE
+S:1_IN_4 |
+S:BR_FIRE |
+S:BLINK | TELE_AWAY
+D:A Thunderlord. Among the weaker breeds, but still dangerous.
+
+N:956:Blue Thunderlord
+G:B:b
+I:120:60d60:20:100:50
+W:40:4:30000:20000
+E:1:1:1:2:1:1
+O:50:50:0:0
+B:HIT:HURT:8d7
+B:HIT:HURT:8d7
+F:MALE | SMART |
+F:THUNDERLORD | DROP_SKELETON | DROP_CORPSE |
+F:ONLY_ITEM | DROP_2D2 | DROP_GOOD | AQUATIC |
+F:IM_FIRE | REGENERATE | OPEN_DOOR | BASH_DOOR |
+F:RES_TELE | NO_CONF | NO_SLEEP | CAN_FLY | HAS_LITE
+S:1_IN_4 |
+S:BR_FIRE |
+S:TPORT | BLINK
+D:A Thunderlord. Among the weaker breeds, but still dangerous.
+
+N:957:Brown Thunderlord
+G:B:u
+I:130:70d70:30:100:50
+W:50:4:30000:20000
+E:1:1:1:2:1:1
+O:50:50:0:0
+B:HIT:HURT:8d9
+B:HIT:HURT:8d9
+F:MALE | SMART |
+F:THUNDERLORD | DROP_SKELETON | DROP_CORPSE |
+F:ONLY_ITEM | DROP_2D2 | DROP_GOOD | AQUATIC |
+F:IM_FIRE | REGENERATE | OPEN_DOOR | BASH_DOOR |
+F:RES_TELE | NO_CONF | NO_SLEEP | CAN_FLY | HAS_LITE
+S:1_IN_4 |
+S:BR_FIRE |
+S:TPORT | BLINK
+D:A Thunderlord. Beware its flame.
+
+N:958:Bronze Thunderlord
+G:B:U
+I:130:80d80:30:100:50
+W:60:5:30000:20000
+E:1:1:1:2:1:1
+O:50:50:0:0
+B:HIT:HURT:10d9
+B:HIT:HURT:10d9
+F:MALE | SMART |
+F:THUNDERLORD | DROP_SKELETON | DROP_CORPSE |
+F:ONLY_ITEM | DROP_2D2 | DROP_GOOD | AQUATIC |
+F:IM_FIRE | REGENERATE | OPEN_DOOR | BASH_DOOR |
+F:RES_TELE | NO_CONF | NO_SLEEP | CAN_FLY | HAS_LITE
+S:1_IN_4 |
+S:BR_FIRE | BR_TIME |
+S:TPORT | BLINK
+D:A Thunderlord, mightiest among the males.
+
+N:959:Gold Thunderlord
+G:B:y
+I:130:90d90:30:100:50
+W:70:5:30000:20000
+E:1:1:1:2:1:1
+O:50:50:0:0
+B:HIT:HURT:10d9
+B:HIT:HURT:10d9
+B:HIT:HURT:10d9
+B:HIT:HURT:10d9
+F:FEMALE | SMART |
+F:THUNDERLORD | DROP_SKELETON | DROP_CORPSE |
+F:ONLY_ITEM | DROP_2D2 | DROP_GOOD | AQUATIC |
+F:IM_FIRE | REGENERATE | OPEN_DOOR | BASH_DOOR |
+F:RES_TELE | NO_CONF | NO_SLEEP | CAN_FLY | HAS_LITE
+S:1_IN_4 |
+S:BR_FIRE | BR_TIME |
+S:TPORT | BLINK | TELE_TO | TELE_AWAY |
+S:S_THUNDERLORD
+D:A Thunderlord, among the queens of their kind.
+
+N:960:Blood Sprout
+G:,:r
+I:140:3d5:10:1:0
+W:50:1:50:3
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:TOUCH:HURT:3d15
+B:TOUCH:HURT:3d15
+B:TOUCH:HURT:3d15
+B:TOUCH:HURT:3d15
+F:STUPID | EMPTY_MIND | KILL_TREES |
+F:IM_POIS | IM_ELEC | IM_ACID | IM_COLD |
+F:NO_CONF | NO_SLEEP | NO_FEAR |
+F:MORTAL
+S:MULTIPLY
+D:A kind of giant mycorrhiza, corrupted into a carnivore by Morgoth.
+
+N:961:Gorlim the Unhappy
+G:p:s
+I:120:16d100:20:120:40
+W:41:3:1800:7000
+E:1:1:1:2:1:1
+O:20:80:0:0
+B:HIT:HURT:8d6
+B:HIT:HURT:8d6
+B:HIT:UN_BONUS:6d8
+B:HIT:UN_BONUS:6d8
+F:UNIQUE | MALE |
+F:FORCE_SLEEP | FORCE_MAXHP | DROP_CORPSE | DROP_SKELETON |
+F:ONLY_ITEM | DROP_2D2 | DROP_GOOD |
+F:SMART | OPEN_DOOR | BASH_DOOR |
+F:IM_ACID | IM_COLD | IM_ELEC | IM_POIS | NO_CONF | NO_SLEEP | BASEANGBAND
+F:HAS_LITE
+S:1_IN_2 |
+S:CAUSE_3 | BO_WATE | BO_MANA
+D:This sad creature - once a mighty warrior - betrayed his former friends to
+D:Morgoth's army in return for, he thought, safety for himself and his wife.
+D:And so he fell under Morgoth's power and became little more than a mindless
+D:servant of evil, even though the other side of his "bargain" was not kept.
+
+# New monster added by furiosity for the Theme module
+N:962:Pink mold
+G:m:R
+I:110:17d8:2:16:70
+W:19:1:40:64
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:SPORE:LOSE_STR:4d4
+F:NEVER_MOVE |
+F:STUPID | EMPTY_MIND |
+F:IM_POIS | CAN_SWIM |
+F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT
+D:It is a strange red growth on the dungeon floor; it seems to glow with
+D:an eerie pink aura.
+
+N:963:Aranea
+G:S:r
+I:120:20d10:20:45:50
+W:30:2:1000:250
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:CLAW:POISON:2d8
+B:CLAW:POISON:2d8
+B:BITE:POISON:2d6
+B:BITE:POISON:2d6
+F:DROP_SKELETON | FORCE_MAXHP | FRIENDS |
+F:OPEN_DOOR | BASH_DOOR | HURT_LITE |
+F:ANIMAL | SPIDER | EVIL | IM_POIS | BASEANGBAND
+S:1_IN_4
+S:BO_FIRE | SLOW | HOLD | CAUSE_3 | MISSILE
+D:A red arachnid with legs weaving spells in the air.
+
+N:964:Elder aranea
+G:S:v
+I:120:30d20:20:65:50
+W:40:3:1800:2500
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:CLAW:POISON:5d8
+B:CLAW:POISON:5d8
+B:BITE:HALLU:5d6
+B:BITE:HALLU:5d6
+F:DROP_SKELETON | FORCE_MAXHP |
+F:OPEN_DOOR | BASH_DOOR | HURT_LITE | SMART |
+F:ANIMAL | SPIDER | EVIL | IM_FIRE | IM_POIS | BASEANGBAND
+S:1_IN_6
+S:SLOW | HOLD | DRAIN_MANA | MIND_BLAST | HEAL |
+S:BA_FIRE | BO_FIRE | CAUSE_3 | S_SPIDER
+D:A vast, bloated arachnid, master of its brood: among the more terrible of
+D:Ungoliant's descendants, this is a monster such as those who haunted the dread
+D:valley of Nan Dungortheb long ago.
+
+N:965:Giant brown tick
+G:S:u
+I:110:16d8:12:50:20
+W:25:2:400:27
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:BITE:POISON:2d6
+B:STING:BLIND:1d1
+F:WEIRD_MIND | BASH_DOOR | CAN_FLY |
+F:ANIMAL | IM_POIS | MORTAL | BASEANGBAND
+D:It is moving slowly towards you.
+
+N:966:Wavelord
+G:p:B
+I:120:16d100:30:120:40
+W:61:3:1800:7000
+E:1:1:1:2:1:1
+O:20:50:10:5
+B:HIT:HURT:8d9
+B:HIT:COLD:8d9
+B:HIT:HURT:8d9
+B:HIT:COLD:8d9
+F:SMART | PET | DROP_CORPSE | FRIENDS | WILD_SHORE | WILD_OCEAN | WILD_TOO |
+F:IM_POIS | AQUATIC | CAN_SWIM | DROP_USEFUL |
+F:NO_CONF | NO_SLEEP | NO_FEAR | DROP_GOOD | DROP_3D2 |
+F:MORTAL | REGENERATE | TAKE_ITEM | GOOD | SUSCEP_FIRE |
+F:RES_WATE | RES_NEXU | HAS_LITE
+S:1_IN_4
+S:BO_WATE | BA_WATE | BO_ICEE
+D:The Dolphiners came with the Thunderlords from their far home.
+D:These friendly beings ride their sharks into combat to assist you.
+
+N:967:Novice possessor (soul)
+G:G:D
+I:110:1d1:30:1:10
+W:10:3:10:0
+E:0:0:0:0:0:0
+O:0:0:0:0
+F:SMART | POSSESSOR |
+F:BASEANGBAND | NO_CUT
+D:It does not look that powerful.
+
+N:968:Bat of Gorgoroth
+G:b:g
+I:120:20d10:20:30:30
+W:28:3:150:100
+E:0:1:1:0:1:0
+O:0:0:0:0
+B:BITE:POISON:1d10
+B:CLAW:HURT:1d4
+F:DROP_60 | RAND_25 | MOVE_BODY | CAN_FLY | DROP_CORPSE |
+F:BASH_DOOR | MOVE_BODY | FRIENDS | WEIRD_MIND |
+F:ANIMAL | IM_POIS | AI_ANNOY | MORTAL | BASEANGBAND
+S:1_IN_8 |
+S:SCARE | BR_POIS | BR_DARK
+D:Fed with horrid meats and grown to enormous size, this slavering creature
+D:seeks livelier prey.
+
+N:969:The Princess
+G:p:y
+I:110:1d1:40:250:3
+W:0:4:730:0
+E:0:1:1:2:1:1
+O:0:0:1:0
+F:FEMALE | CAN_SPEAK
+F:FORCE_MAXHP | SPECIAL_GENE | NO_TARGET
+F:NEVER_MOVE | NEVER_BLOW | GOOD | NO_DEATH | RES_TELE
+F:MORTAL | BASEANGBAND | UNIQUE | PET |
+D:The princess of an unknown kingdom, you need to save her.
+
+N:970:Merton Proudfoot, the lost hobbit
+G:h:v
+I:110:1d1:40:250:3
+W:0:0:730:0
+E:0:1:1:2:1:1
+O:0:0:0:1
+F:MALE | CAN_SPEAK
+F:FORCE_MAXHP | NEVER_GENE | WILD_ONLY | WILD_TOWN |
+F:NEVER_MOVE | NEVER_BLOW | GOOD | NO_TARGET
+F:MORTAL | BASEANGBAND | UNIQUE | PET | NO_DEATH
+D:The poor hobbit got lost in the dreadful maze.
+
+N:971:The Wight-King of the Barrow-downs
+G:W:v
+I:120:38d22:30:45:0
+W:46:3:0:22000
+E:0:0:0:0:0:0
+O:15:55:15:0
+B:HIT:HURT:2d10
+B:WAIL:PARALYZE:2d6
+B:TOUCH:EXP_80:4d8
+B:TOUCH:EXP_80:4d8
+F:SPECIAL_GENE | FORCE_MAXHP | SMART | CAN_SPEAK |
+F:DROP_4D2 | DROP_2D2 | COLD_BLOOD | UNIQUE |
+F:CAN_SWIM | CAN_FLY | EVIL | UNDEAD | IM_COLD | IM_POIS | HURT_LITE |
+F:NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT
+S:1_IN_4 |
+S:HOLD | SCARE | CAUSE_3 | BA_NETH
+D:He has lived in the Barrow-Downs for centuries after his first death at the
+D:hands of the Witch-King of Angmar. A once loyal captain under the
+D:Witch-King's command, he now awaits a time when his undead forces shall
+D:rise again to avenge their deaths.
+
+N:972:Adventurer
+G:@:U
+I:115:3d20:50:50:10
+W:0:3:100:0
+O:50:50:0:0
+B:HIT:HURT:2d6
+B:PUNCH:HURT:1d7
+B:KICK:HURT:1d8
+F:SPECIAL_GENE | SMART | OPEN_DOOR
+F:FORCE_MAXHP | CAN_SWIM | BASEANGBAND |
+F:NO_SLEEP | NO_CONF
+D:A great warrior who misplaces his sword once in a while.
+
+N:973:Experienced possessor (soul)
+G:G:D
+I:120:5d5:30:50:10
+W:30:3:10:0
+O:0:0:0:0
+F:SMART | POSSESSOR |
+F:BASEANGBAND | NO_CUT
+S:1_IN_9
+S:S_KIN
+D:It does not look that powerful.
+
+N:974:Old possessor (soul)
+G:G:D
+I:130:10d10:30:100:10
+W:95:3:10:0
+O:0:0:0:0
+F:SMART | POSSESSOR |
+F:BASEANGBAND | NO_CUT
+S:1_IN_4
+S:S_KIN
+D:It does not look that powerful.
+
+# New monster added by furiosity for the Theme module
+N:975:Tree mold
+G:m:G
+I:110:17d8:2:16:70
+W:19:1:40:64
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:SPORE:POISON:4d4
+F:NEVER_MOVE |
+F:STUPID | EMPTY_MIND |
+F:IM_POIS | CAN_SWIM |
+F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT
+D:It is a strange green growth that likes to live in
+D:the trees.
+
+N:976:Bronze dragon worm
+G:w:U
+I:100:10d15:10:40:80
+W:20:3:4500:12
+E:0:0:0:0:1:0
+O:0:0:0:0
+B:CLAW:HURT:3d3
+B:CLAW:HURT:3d3
+B:BITE:HURT:3d5
+F:RAND_50 | RAND_25 |
+F:DROP_60 | ONLY_GOLD | DROP_CORPSE |
+F:OPEN_DOOR | BASH_DOOR |
+F:EVIL | DRAGON | NO_CONF |
+F:MORTAL | BASEANGBAND | ATTR_MULTI
+S:MULTIPLY |
+S:1_IN_6 | BR_CONF
+D:You thought dragons used eggs, but this worm has the scales, and the bad
+D:breath, and the fiery eyes, of a real dragon. Its scales glitter in
+D:a multitude of perplexing and distracting ways.
+
+N:977:Gold dragon worm
+G:w:y
+I:100:10d15:10:40:80
+W:20:3:4500:12
+E:0:0:0:0:1:0
+O:0:0:0:0
+B:CLAW:HURT:3d3
+B:CLAW:HURT:3d3
+B:BITE:HURT:3d5
+F:RAND_50 | RAND_25 |
+F:DROP_60 | ONLY_GOLD | DROP_CORPSE |
+F:OPEN_DOOR | BASH_DOOR |
+F:EVIL | DRAGON | NO_STUN |
+F:MORTAL | BASEANGBAND | ATTR_MULTI
+S:MULTIPLY |
+S:1_IN_6 | BR_SOUN
+D:You thought dragons used eggs, but this worm has the scales, and the bad
+D:breath, and the fiery eyes, of a real dragon. You can feel the air itself
+D:vibrating as you near it.
+
+N:978:Defenceless Mold
+G:m:v
+I:100:1d1:1:1:0
+W:1:1:20:3
+E:0:0:0:0:0:0
+O:0:0:0:0
+F:NEVER_MOVE | UNIQUE |
+F:STUPID | EMPTY_MIND |
+F:IM_POIS | FORCE_DEPTH |
+F:NO_CONF | NO_SLEEP | NO_FEAR |
+F:MORTAL | WYRM_PROTECT | ONLY_DEPTH | JOKEANGBAND | NO_CUT
+D:A small strange growth. It seems to be defenceless.
+
+# New monster added by furiosity for the Theme module
+N:979:Blue mold
+G:m:B
+I:110:17d8:2:16:70
+W:19:1:40:64
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:SPORE:HALLU:4d4
+F:NEVER_MOVE |
+F:STUPID | EMPTY_MIND |
+F:IM_POIS | CAN_SWIM |
+F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT
+D:It is a strange blue growth on the dungeon floor; it seems to glow with
+D:a puzzling aura.
+
+N:980:Ar-Pharazon the Golden
+G:p:y
+I:130:50d100:30:45:255
+W:55:1:0:2500
+E:1:1:1:2:1:1
+O:20:70:10:0
+B:HIT:HURT:8d12
+B:HIT:HURT:8d12
+B:HIT:HURT:8d12
+B:HIT:HURT:8d12
+F:FORCE_SLEEP | FORCE_MAXHP | UNIQUE | CAN_SPEAK | SPECIAL_GENE | AQUATIC |
+F:ONLY_ITEM | DROP_1D2 | DROP_2D2 | DROP_GOOD | DROP_SKELETON | DROP_CORPSE |
+F:SMART | TAKE_ITEM | OPEN_DOOR | BASH_DOOR | MOVE_BODY | BASEANGBAND |
+F:HAS_LITE | CAN_SWIM | MALE |
+S:1_IN_6 |
+S:HEAL | HASTE | TELE_AWAY | S_MONSTERS | S_KIN
+D:Last and proudest king of ancient Numenor. Corrupted by power and
+D:avarice, he fell victim to Sauron's wiles, tried to fight the immortals
+D:themselves, and condemned Numenor to oblivion.
+
+N:981:Doppleganger
+G:@:w
+I:110:1d1:1:1:1
+W:1:1:0:0
+E:0:0:0:0:0:0
+O:0:0:0:0
+F:AI_ANNOY | NEVER_BLOW | DOPPLEGANGER | JOKEANGBAND | HAS_LITE |
+D:It looks like you.
+
+N:982:Marylene, Heartbreakeress of the Netherworld
+G:P:W
+I:155:200d120:155:175:0
+W:127:1:1600:66666
+E:1:1:1:2:1:1
+O:30:30:30:10
+B:GAZE:PARALYZE:20d15
+B:HIT:EXP_80:20d17
+B:BITE:LOSE_ALL:10d12
+B:TOUCH:INSANITY:12d9
+F:UNIQUE | CAN_SPEAK | ATTR_MULTI | ATTR_ANY | FEMALE |
+F:FORCE_MAXHP | WEIRD_MIND | DROP_CORPSE | DROP_SKELETON |
+F:REFLECTING | AURA_FIRE | AURA_ELEC | AURA_COLD |
+F:ONLY_ITEM | DROP_1D2 | DROP_2D2 | DROP_3D2 | DROP_4D2 |
+F:DROP_GOOD | DROP_GREAT | RES_NETH | INVISIBLE |
+F:SMART | KILL_WALL | KILL_BODY | POWERFUL | RES_TELE |
+F:REGENERATE | CAN_FLY | CAN_SWIM | WYRM_PROTECT |
+F:EVIL | IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS |
+F:NO_CONF | NO_SLEEP | NO_FEAR | NO_STUN | RES_TELE | DEMON |
+F:MORTAL | DG_CURSE | JOKEANGBAND | HAS_LITE
+S:1_IN_1 |
+S:BR_CHAO | BA_CHAO | BRAIN_SMASH | SHRIEK | BR_CONF | BR_SOUN |
+S:BR_NETH | HASTE | TRAPS | FORGET | BR_DISE | BR_TIME | MIND_BLAST |
+S:HEAL | TPORT | TELE_TO | CAUSE_1 | CAUSE_2 | CAUSE_3 | CAUSE_4 | BLIND |
+S:CONF | SLOW | HOLD | S_UNIQUE
+D:A woman of mind-shattering beauty, none can match her beauty. She is perfect,
+D:and totaly evil. She loves nothing but herself and her evilness is as
+D:great as her beauty. No one can stand against her, even DarkGod.
+D:As you see her approaching, you feel your heart breaking.
+D:She is the perfection, don't even try against her; you will surely lose
+D:your mind...
+
+# New monster added by furiosity for the Theme module
+N:983:Adventurer mold
+G:m:U
+I:110:17d8:2:16:70
+W:19:1:40:64
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:SPORE:HURT:4d4
+B:SPORE:HURT:4d4
+F:NEVER_MOVE |
+F:STUPID | EMPTY_MIND | PET |
+F:IM_FIRE | IM_POIS | CAN_SWIM |
+F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT
+D:It is a fellow adventurer, mold though it is.
+
+# New monster added by furiosity for the Theme module
+# Based on novice paladin
+N:984:Gnome paladin
+G:l:w
+I:110:7d8:20:20:20
+W:15:2:900:40
+E:1:1:1:2:1:1
+O:0:70:25:0
+B:HIT:HURT:1d7
+B:HIT:HURT:1d7
+F:MALE | GOOD | WILD_TOO | DROP_SKELETON | DROP_CORPSE |
+F:FORCE_SLEEP |
+F:DROP_60 |
+F:OPEN_DOOR | BASH_DOOR | FRIENDS |
+F:MORTAL | BASEANGBAND | HAS_LITE
+S:1_IN_9 |
+S:SCARE | CAUSE_2 | DARKNESS |
+D:A paladin of short stature. He considers you a spy for Morgoth.
+
+N:985:Bandobras Took
+G:h:U
+I:120:6d10:16:8:10
+W:5:3:1000:90
+E:1:1:1:2:1:1
+O:25:55:0:20
+B:HIT:HURT:1d8
+B:HIT:HURT:1d8
+F:UNIQUE | MALE | CAN_SPEAK | DROP_CORPSE | DROP_SKELETON |
+F:FORCE_MAXHP |
+F:ONLY_ITEM | DROP_2D2 | DROP_GOOD |
+F:OPEN_DOOR | BASH_DOOR |
+F:MORTAL | BASEANGBAND | HAS_LITE
+D:He is a sturdy hobbit who is renowned for his unusual strength and
+D:vigour. He can prove a troublesome opponent.
+
+N:986:3-headed hydra
+G:M:o
+I:120:100d5:20:65:20
+W:20:2:4500:350
+E:0:1:0:2:2:0
+O:0:0:0:0
+B:BITE:HURT:2d6
+B:BITE:HURT:2d6
+B:BITE:HURT:2d6
+F:FORCE_SLEEP | WILD_TOO | WILD_SHORE | WILD_SWAMP | CAN_SWIM |
+F:DROP_CORPSE | DROP_SKELETON | ONLY_GOLD | DROP_2D2 |
+F:OPEN_DOOR | BASH_DOOR | MOVE_BODY |
+F:ANIMAL | MORTAL | BASEANGBAND
+S:1_IN_9 |
+S:SCARE
+D:A strange reptilian creature with three heads, guarding its hoard.
+
+N:987:Uldor the Accursed
+G:p:U
+I:110:10d100:20:70:40
+W:28:4:2000:600
+E:1:1:1:2:1:1
+O:10:90:0:0
+B:HIT:HURT:4d6
+B:HIT:HURT:4d6
+B:HIT:HURT:4d6
+B:HIT:HURT:4d6
+F:UNIQUE | MALE | CAN_SPEAK | DROP_CORPSE | DROP_SKELETON |
+F:FORCE_MAXHP |
+F:ONLY_ITEM | DROP_1D2 | DROP_GOOD |
+F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR |
+F:EVIL | MORTAL | BASEANGBAND | HAS_LITE
+S:1_IN_10 | S_KIN
+D:An evil and cunning man from the East. Having once sworn allegiance to the
+D:sons of Feanor, it was Uldor's treachery that turned the tide of the Battle
+D:of Unnumbered Tears in Morgoth's favour.
+
+N:988:Mystic
+G:p:o
+I:120:35d10:30:50:5
+W:33:3:1400:500
+E:1:1:1:2:1:1
+O:30:0:60:10
+B:KICK:HURT:10d2
+B:KICK:HURT:10d2
+B:KICK:HURT:10d2
+B:KICK:HURT:10d2
+F:MALE |
+F:FORCE_SLEEP | FORCE_MAXHP | DROP_CORPSE | DROP_SKELETON |
+F:ONLY_ITEM | DROP_1D2 |
+F:INVISIBLE | OPEN_DOOR | BASH_DOOR |
+F:IM_ACID | IM_POIS | NO_CONF | NO_SLEEP |
+F:MORTAL | BASEANGBAND | HAS_LITE
+S:1_IN_6 |
+S:HEAL |
+S:S_SPIDER | S_ANIMAL
+D:An adept at unarmed combat, the mystic strikes with stunning power. He
+D:can summon help from nature and is able to focus his power to ease any
+D:pain.
+
+N:989:Elder vampire
+G:V:r
+I:120:34d100:20:90:10
+W:54:3:1700:4500
+E:1:1:1:2:1:1
+O:0:70:30:0
+B:HIT:HURT:4d6
+B:HIT:HURT:4d6
+B:BITE:EXP_80:5d6
+B:BITE:EXP_80:5d6
+F:FORCE_SLEEP | FORCE_MAXHP | CAN_FLY |
+F:DROP_60 | DROP_4D2 | DROP_GOOD |
+F:COLD_BLOOD | OPEN_DOOR | BASH_DOOR | REGENERATE | RES_TELE |
+F:EVIL | UNDEAD | IM_COLD | IM_POIS | HURT_LITE |
+F:NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT
+S:1_IN_7 |
+S:BLIND | HOLD | SCARE | CAUSE_3 | CAUSE_4 | DRAIN_MANA |
+S:BRAIN_SMASH | DARKNESS | BO_NETH | S_UNDEAD
+D:A terrible robed undead figure, this creature has existed in its
+D:unlife for many centuries by stealing the life of others. It can
+D:summon the very shades of its victims from beyond the grave to
+D:come enslaved to its aid.
+
+N:990:Ulfang the Black
+G:p:U
+I:120:25d100:20:90:40
+W:44:5:2100:1200
+E:1:1:1:2:1:1
+O:10:90:0:0
+B:HIT:HURT:5d8
+B:HIT:HURT:5d8
+B:HIT:HURT:5d8
+B:HIT:HURT:5d8
+F:UNIQUE | MALE | CAN_SPEAK | DROP_CORPSE | DROP_SKELETON |
+F:FORCE_MAXHP | IM_FIRE | IM_COLD | IM_ELEC | SPECIAL_GENE |
+F:ONLY_ITEM | DROP_2D2 | DROP_GOOD | DROP_RANDART
+F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR |
+F:EVIL | MORTAL | BASEANGBAND | HAS_LITE
+S:1_IN_10 | S_KIN | S_MONSTERS
+D:A short and swarthy Easterling dressed in black. He and his three sons
+D:once openly swore allegiance to the High Elves, but were secretly in the
+D:pay of Morgoth.
+
+N:991:Demonologist
+G:p:R
+I:120:28d10:20:50:10
+W:36:2:1100:700
+E:1:1:1:2:1:1
+O:0:0:100:0
+B:HIT:HURT:2d6
+B:HIT:HURT:2d6
+B:HIT:HURT:2d6
+F:MALE |
+F:FORCE_SLEEP | FORCE_MAXHP | DROP_CORPSE | DROP_SKELETON
+F:RES_NETH | RES_NEXU |
+F:ONLY_ITEM | DROP_1D2 |
+F:SMART | OPEN_DOOR | BASH_DOOR |
+F:EVIL | MORTAL | BASEANGBAND | HAS_LITE
+S:1_IN_2 |
+S:TPORT | HOLD |
+S:S_DEMON | BO_FIRE
+D:A figure twisted by evil standing in robes of deepest crimson.
+
+N:992:Ungorrog
+G:U:g
+I:110:52d10:20:40:80
+W:51:3:2100:2500
+E:1:1:1:2:1:1
+O:0:50:50:0
+B:HIT:HURT:3d4
+B:STING:POISON:3d4
+B:SPIT:FIRE:3d4
+B:SPIT:ELEC:3d4
+F:FORCE_SLEEP | FORCE_MAXHP | ESCORTS |
+F:ONLY_ITEM | DROP_GREAT | AURA_FIRE | AURA_ELEC |
+F:OPEN_DOOR | BASH_DOOR | POWERFUL |
+F:EVIL | DEMON | IM_FIRE | NO_CONF | NO_SLEEP | NONLIVING
+F:BASEANGBAND
+S:1_IN_9 |
+S:BLIND | CONF | SCARE | HOLD
+S:S_DEMON | BO_COLD | BO_ACID
+D:The most powerful of the spider demons, Morgoth's corrupted
+D:spiders. It looks like a huge bloated spider, with claws
+D:that sparkle with all the elements.
+
+N:993:Faunungol
+G:U:B
+I:110:70d10:20:40:80
+W:43:2:2300:3000
+E:1:1:1:2:1:1
+O:0:50:50:0
+B:HIT:HURT:3d4
+B:STING:POISON:3d4
+B:SPIT:ELEC:3d4
+B:CRUSH:HURT:6d8
+F:FORCE_SLEEP | FORCE_MAXHP |
+F:ONLY_ITEM | DROP_90 | AURA_ELEC |
+F:OPEN_DOOR | BASH_DOOR | POWERFUL | IM_ELEC |
+F:EVIL | DEMON | IM_FIRE | NO_CONF | NO_SLEEP | NONLIVING |
+F:BASEANGBAND
+S:1_IN_9 |
+S:BLIND | CONF |
+D:One of the spider demons, spawn of Ungoliant. It looks like
+D:a giant bloated spider surrounded by blazing sparks.
+
+N:994:Naurungol
+G:U:r
+I:110:90d10:20:50:80
+W:45:2:6000:5000
+E:1:1:1:2:1:1
+O:0:50:50:0
+B:HIT:HURT:3d4
+B:STING:POISON:3d4
+B:SPIT:FIRE:3d4
+B:HIT:LOSE_STR:3d4
+F:FORCE_SLEEP | FORCE_MAXHP | AURA_FIRE |
+F:ONLY_ITEM | DROP_1D2 |
+F:OPEN_DOOR | BASH_DOOR | POWERFUL |
+F:EVIL | DEMON |
+F:IM_FIRE | NO_CONF | NO_SLEEP |
+F:BASEANGBAND
+S:1_IN_9 |
+S:BLIND | CONF |
+D:One of the spider demons, spawn of Ungoliant. It looks like
+D:a giant bloated spider glowing with malevolent flames.
+
+N:995:Sererrog
+G:U:y
+I:120:20d70:20:75:80
+W:47:2:3000:7000
+E:3:0:3:4:1:0
+O:0:50:50:0
+B:HIT:HURT:3d6
+B:HIT:HURT:3d6
+B:HIT:HURT:3d6
+B:HIT:HURT:3d6
+F:FEMALE |
+F:FORCE_SLEEP | FORCE_MAXHP |
+F:ONLY_ITEM | DROP_1D2 | DROP_CORPSE |
+F:OPEN_DOOR | BASH_DOOR | POWERFUL |
+F:EVIL | DEMON | IM_FIRE | NO_CONF | NO_SLEEP | NONLIVING |
+F:BASEANGBAND
+S:1_IN_9 |
+S:BLIND | CAUSE_2 | SCARE |
+S:S_DEMON
+D:A corrupted Maia of female form, whose skin drips with blood.
+D:It has several arms, and fights with three grim daggers.
+
+N:996:Red Balrog
+G:U:R
+I:120:20d100:20:50:80
+W:61:4:9000:10000
+E:1:1:1:2:1:1
+O:0:50:50:0
+B:HIT:FIRE:4d12
+B:HIT:FIRE:4d12
+B:CRUSH:HURT:3d12
+B:TOUCH:UN_POWER
+F:FORCE_SLEEP | FORCE_MAXHP | AURA_FIRE | KILL_WALL |
+F:ONLY_ITEM | DROP_1D2 | DROP_2D2 | DROP_GOOD |
+F:OPEN_DOOR | BASH_DOOR | POWERFUL | MOVE_BODY |
+F:EVIL | DEMON | IM_FIRE | NO_CONF | NO_SLEEP | NONLIVING |
+F:BASEANGBAND | HAS_LITE
+S:1_IN_4 |
+S:BLIND | CONF | SCARE | HASTE |
+S:BR_FIRE |
+S:S_DEMON
+D:The greatest of the demons, potent in both magical might
+D:and sheer battle power. This corrupted Maia's form is
+D:surrounded by roaring flames.
+
+N:997:Master mystic
+G:p:o
+I:130:11d100:30:60:5
+W:50:3:1600:6000
+E:1:1:1:2:1:1
+O:40:0:40:20
+B:KICK:HURT:10d2
+B:KICK:HURT:10d2
+B:HIT:POISON:20d1
+B:HIT:PARALYZE:15d1
+F:MALE |
+F:FORCE_SLEEP | FORCE_MAXHP | DROP_CORPSE | DROP_SKELETON |
+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
+F:MORTAL | BASEANGBAND | HAS_LITE
+S:1_IN_3 |
+S:HEAL |
+S:S_SPIDER | S_ANIMALS
+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
+D:wild if need be.
+
+N:998:Grand master mystic
+G:p:o
+I:130:22d100:30:80:5
+W:57:3:1800:15000
+E:1:1:1:2:1:1
+O:40:0:40:20
+B:KICK:HURT:20d2
+B:KICK:HURT:10d2
+B:HIT:POISON:20d1
+B:HIT:PARALYZE:15d1
+F:MALE |
+F:FORCE_SLEEP | FORCE_MAXHP | DROP_CORPSE | DROP_SKELETON |
+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 |
+F:MORTAL | BASEANGBAND | HAS_LITE
+S:1_IN_2 |
+S:HEAL | MIND_BLAST |
+S:S_SPIDER | S_HOUND | S_ANIMALS
+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
+D:with disdainful ease.
+
+N:999:Morgulrog
+G:U:o
+I:110:24d100:20:50:80
+W:42:2:0:1000
+E:1:1:1:2:1:1
+O:0:50:50:0
+B:HIT:HURT:3d4
+B:HIT:UN_BONUS:3d4
+B:HIT:UN_POWER:1d5
+F:FORCE_SLEEP | FORCE_MAXHP |
+F:ONLY_ITEM | DROP_60 |
+F:OPEN_DOOR | BASH_DOOR | POWERFUL |
+F:EVIL | DEMON | NO_CONF | NO_SLEEP |
+F:IM_FIRE | IM_POIS | IM_ELEC | IM_COLD |
+F:BASEANGBAND
+S:1_IN_9 |
+S:BLIND | CONF | SCARE | HASTE | HEAL | S_KIN
+S:TRAPS | SLOW | HOLD | SHRIEK | BLINK
+D:A twisted elemental spirit, this creature serves the Dark with
+D:perversions of the magics of nature.
+
+N:1000:Novice mindcrafter
+G:p:y
+I:110:6d8:20:10:5
+W:4:1:900:18
+E:1:1:1:2:1:1
+O:0:50:0:30
+B:HIT:HURT:1d6
+F:DROP_60 | WILD_TOO |
+F:OPEN_DOOR | DROP_SKELETON | DROP_CORPSE |
+F:MORTAL | BASEANGBAND | HAS_LITE | NO_CONF | NO_SLEEP
+S:1_IN_9 | BLIND | SLOW | CONF | SCARE
+D:A novice in the arts of mind over matter.
+
+# New monster added by furiosity for the Theme module
+# Based on dark elven lord
+N:1001:Gnome lord
+G:l:s
+I:110:8d10:20:20:20
+W:20:2:900:40
+E:1:1:1:2:1:1
+O:0:70:25:0
+B:HIT:HURT:3d8
+B:HIT:HURT:3d5
+F:MALE | EVIL | WILD_TOO | DROP_SKELETON | DROP_CORPSE |
+F:FORCE_SLEEP |
+F:DROP_60 |
+F:OPEN_DOOR | BASH_DOOR |
+F:MORTAL | BASEANGBAND | HAS_LITE
+S:1_IN_5 |
+S:HASTE | BLIND | CONF | DARKNESS | MISSILE
+D:A lord among gnomes.
+
+N:1002:Great Worm of Perplexity
+G:D:U
+I:120:40d100:30:150:80
+W:63:2:190000:20000
+E:0:1:0:6:1:0
+O:50:50:0:0
+B:CLAW:HURT:4d12
+B:CLAW:HURT:4d12
+B:BITE:CONFUSE:6d14
+B:BITE:CONFUSE:6d14
+F:FORCE_SLEEP | FORCE_MAXHP | CAN_FLY |
+F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 | DROP_GOOD |
+F:SMART | BASH_DOOR | POWERFUL | MOVE_BODY | DROP_CORPSE |
+F:EVIL | DRAGON | NO_CONF | NO_SLEEP | BASEANGBAND | HAS_LITE | ATTR_MULTI
+S:1_IN_4 |
+S:BLIND | CONF | SCARE |
+S:BR_CONF
+D:A dragon of great size and power. Its polished bronze scales reflect the
+D:light in strange and confusing patterns, and you find it hard to keep your
+D:mind on the job of fighting for your life.
+
+# New monster added by furiosity for the Theme module
+# Based on mystic
+N:1003:Gnome mystic
+G:l:o
+I:120:25d10:30:40:5
+W:33:3:1000:400
+E:1:1:1:2:1:1
+O:30:0:60:10
+B:KICK:HURT:8d2
+B:KICK:HURT:8d2
+B:KICK:HURT:8d2
+B:KICK:HURT:8d2
+F:MALE |
+F:FORCE_SLEEP | FORCE_MAXHP | DROP_CORPSE | DROP_SKELETON |
+F:ONLY_ITEM | DROP_1D2 |
+F:INVISIBLE | OPEN_DOOR | BASH_DOOR |
+F:IM_ACID | IM_POIS | NO_CONF | NO_SLEEP |
+F:MORTAL | BASEANGBAND | HAS_LITE
+S:1_IN_6 |
+S:HEAL |
+S:S_ANIMAL
+D:A mystic of short stature. He is quite skilled at unarmed
+D:combat and even has some control over the forces of nature.
+
+N:1004:Great Worm of Thunder
+G:D:y
+I:120:50d100:30:150:80
+W:67:2:190000:23000
+E:0:1:0:6:1:0
+O:50:50:0:0
+B:CLAW:HURT:4d12
+B:CLAW:HURT:4d12
+B:BITE:HURT:6d14
+B:BITE:HURT:6d14
+F:FORCE_SLEEP | FORCE_MAXHP | CAN_FLY |
+F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 | DROP_GOOD |
+F:BASH_DOOR | POWERFUL | MOVE_BODY | DROP_CORPSE |
+F:EVIL | DRAGON | NO_CONF | NO_SLEEP | NO_STUN | BASEANGBAND | HAS_LITE
+F:ATTR_MULTI
+S:1_IN_4 |
+S:BLIND | CONF | SCARE |
+S:BR_SOUN
+D:A dragon of gigantic proportions, with destructive abilities to match. The
+D:sheer loudness of its roar leaves you stunned and unable to think clearly
+D:enough to defend yourself adequately.
+
+N:1005:Silver mouse
+G:r:B
+I:110:1d3:8:4:20
+W:4:1:200:1
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:BITE:EAT_LITE:1d2
+F:RAND_25 | CAN_SWIM | ANIMAL |
+F:DROP_CORPSE | MORTAL | BASEANGBAND
+S:MULTIPLY
+D:It is about three feet long with large teeth. As the light of your lamp falls
+D:on it, it seems to grow stronger.
+
+N:1006:The Rat King
+G:r:v
+I:120:20d12:30:30:0
+W:18:1:950:32
+E:1:1:1:2:1:1
+O:0:0:0:0
+B:CLAW:HURT:3d2
+B:CLAW:HURT:3d2
+B:BITE:DISEASE:4d2
+B:BITE:DISEASE:4d2
+F:UNIQUE | ESCORT | ESCORTS | FORCE_MAXHP |
+F:BASH_DOOR | ANIMAL | NO_CONF | NO_SLEEP
+F:MORTAL | BASEANGBAND
+D:A massive rat. He's the leader of the pack.
+
+# New monster added by furiosity for the Theme module
+# Based on Priest
+N:1007:Gnome priest
+G:l:r
+I:110:10d8:20:22:40
+W:15:1:1000:25
+E:1:1:1:2:1:1
+O:0:20:80:0
+B:HIT:HURT:2d3
+B:HIT:HURT:2d3
+F:MALE | GOOD |
+F:FORCE_SLEEP |
+F:DROP_1D2 |
+F:SMART | OPEN_DOOR | BASH_DOOR | DROP_SKELETON | DROP_CORPSE |
+F:MORTAL | BASEANGBAND | HAS_LITE
+S:1_IN_3 |
+S:HEAL | SCARE | CAUSE_2 |
+S:S_MONSTER
+D:A priest of short stature. He looks comically solemn.
+
+N:1008:Black midge
+G:I:D
+I:120:1d2:6:7:10
+W:14:1:100:3
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:BITE:HURT:1d2
+F:RAND_50 | RAND_25 | CAN_FLY | WEIRD_MIND |
+F:ANIMAL | MORTAL | BASEANGBAND
+S:MULTIPLY
+D:It is an evil relative of the moth, native to marshlands.
+
+N:1009:Fire Phantom
+G:G:r
+I:120:10d100:20:90:40
+W:34:5:0:1200
+E:0:0:0:0:0:0
+O:0:0:100:0
+B:HIT:HURT:5d5
+F:UNIQUE | MALE | CAN_SPEAK
+F:FORCE_MAXHP | UNDEAD | NO_CONF | NO_SLEEP | REGENERATE | NO_STUN |
+F:ONLY_ITEM | DROP_2D2 | DROP_GOOD |
+F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | PASS_WALL |
+F:MORTAL | JOKEANGBAND | HAS_LITE | NO_CUT
+S:1_IN_6
+S:BR_FIRE | HOLD | CONF | SCARE | MIND_BLAST
+D:He's back from the grave for vengeance on those who
+D:burnt him. He has no mercy for those in his way.
+
+N:1010:The Insane Player
+G:p:v
+I:120:18d100:25:100:10
+W:36:2:1500:1200
+E:1:1:1:2:1:1
+O:20:20:20:20
+B:HIT:HURT:3d8
+F:UNIQUE | MALE | CAN_SPEAK | ATTR_MULTI |
+F:FORCE_MAXHP |
+F:ONLY_ITEM | DROP_2D2 | DROP_GOOD | DROP_SKELETON | DROP_CORPSE
+F:OPEN_DOOR | BASH_DOOR | RAND_25 |
+F:IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS |
+F:NO_CONF | NO_SLEEP | NO_FEAR
+F:JOKEANGBAND | HAS_LITE
+S:1_IN_4 |
+S:TELE_TO | SHRIEK | SCARE
+D:Once a powerful adventurer, this poor fighter has seen a few too many
+D:software bugs in his time. Any shred of lucidity is long gone, but
+D:he still remains dangerous. He wanders aimlessly through the dungeon
+D:randomly striking at foes both real and imagined, all the while screaming
+D:out at the world that caused his condition.
+
+# New monster added by furiosity for the Theme module
+# Based on Master thief
+N:1011:Gnome rogue
+G:l:b
+I:130:15d10:20:30:40
+W:28:2:1000:350
+E:1:1:1:2:1:1
+O:90:10:0:0
+B:HIT:HURT:1d7
+B:HIT:HURT:2d3
+B:HIT:EAT_GOLD:5d5
+B:HIT:EAT_ITEM:5d6
+F:MALE |
+F:DROP_90 | DROP_2D2 | DROP_SKELETON | DROP_CORPSE |
+F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR |
+F:EVIL | MORTAL | BASEANGBAND | HAS_LITE
+S:1_IN_6
+S:TRAPS | ARROW_2 | BLINK
+D:A little gnome, fast and stealthy. He is eyeing your backpack.
+
+N:1012:Vermicious Knid
+G:j:s
+I:110:90d10:20:55:100
+W:44:2:1400:2100
+E:0:0:0:0:0:0
+O:40:30:20:10
+B:TOUCH:TERRIFY:4d6
+B:CRAWL:HURT:4d6
+B:ENGULF:HURT:4d6
+F:FRIENDS | EVIL | IM_COLD | SMART |
+F:COLD_BLOOD | NO_FEAR | WEIRD_MIND |
+F:OPEN_DOOR | ONLY_ITEM | DROP_2D2 | HURT_ROCK |
+F:NONLIVING |
+F:JOKEANGBAND | NO_CUT
+D:An amorphous shape that looks like wet grey clay with two pale eyes.
+D:It is totally silent as it oozes towards you.
+
+N:1013:Bone golem
+G:g:w
+I:120:35d100:20:170:50
+W:61:3:5000:23000
+E:1:1:1:2:1:1
+O:0:0:0:0
+B:HIT:UN_BONUS:8d8
+B:HIT:UN_BONUS:8d8
+B:HIT:LOSE_STR:6d6
+B:HIT:LOSE_STR:6d6
+F:FORCE_SLEEP | FORCE_MAXHP | EMPTY_MIND |
+F:COLD_BLOOD | OPEN_DOOR | BASH_DOOR |
+F:EVIL | UNDEAD | IM_COLD | IM_POIS | IM_FIRE | IM_ELEC | RES_TELE |
+F:NO_CONF | NO_SLEEP | NO_FEAR | NONLIVING | BASEANGBAND | NO_CUT
+S:1_IN_3 |
+S:TELE_TO | CAUSE_4 | DRAIN_MANA |
+S:BRAIN_SMASH | BA_NETH | S_HI_UNDEAD
+D:A skeletal form, black as night, constructed from the bones of its
+D:previous victims.
+
+# New monster added by furiosity for the Theme module
+# Based on hardened warrior
+N:1014:Gnome warrior
+G:l:u
+I:110:15d11:20:40:40
+W:22:1:1000:60
+E:1:1:1:2:1:1
+O:0:100:0:0
+B:HIT:HURT:4d3
+B:HIT:HURT:4d3
+F:MALE |
+F:DROP_1D2 |
+F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | DROP_SKELETON | DROP_CORPSE |
+F:EVIL | MORTAL | BASEANGBAND | HAS_LITE | KILL_BODY |
+D:A warrior of short stature but great ferocity.
+
+N:1015:Bronze golem
+G:g:o
+E:2:1:2:4:1:1
+O:0:0:0:0
+I:120:40d100:25:170:50
+W:65:3:5500:26000
+B:HIT:HURT:10d10
+B:HIT:HURT:10d10
+B:HIT:HURT:10d10
+B:HIT:HURT:10d10
+F:FORCE_MAXHP | FORCE_SLEEP | EMPTY_MIND | COLD_BLOOD |
+F:OPEN_DOOR | BASH_DOOR | IM_FIRE | IM_ELEC | IM_POIS | RES_TELE |
+F:NO_CONF | NO_SLEEP | NO_STUN | NO_FEAR | NONLIVING | BASEANGBAND | NO_CUT
+S:1_IN_3 |
+S:BO_PLAS | BA_FIRE | BR_FIRE | BA_ELEC | S_HI_DEMON | TELE_TO
+D:A gigantic four-armed animated bronze statue, glowing with great heat.
+
+# New monster added by furiosity for the Theme module
+# Multiplying gnome mage. Heh.
+N:1016:Wizard leprawn
+G:l:W
+I:90:7d8:20:20:20
+W:14:2:900:50
+E:1:1:1:2:1:1
+O:20:0:80:0
+B:HIT:HURT:1d5
+F:MALE |
+F:FORCE_SLEEP | DROP_60 |
+F:OPEN_DOOR | BASH_DOOR | DROP_SKELETON |
+F:EVIL | MORTAL | BASEANGBAND | HAS_LITE
+S:1_IN_4 |
+S:DARKNESS | BO_COLD |
+S:S_MONSTER
+S:MULTIPLY
+D:A short little gnome, waving his hands in the air.
+
+# New monster added by furiosity for the Theme module
+N:1017:Kender
+G:l:y
+I:115:8d9:20:20:20
+W:15:3:900:40
+E:1:1:1:2:1:1
+O:25:25:25:25
+B:TOUCH:EAT_ITEM:5d5
+B:TOUCH:EAT_ITEM:5d5
+B:TOUCH:EAT_ITEM:5d5
+B:TOUCH:EAT_ITEM:5d5
+F:JOKEANGBAND | WILD_TOO | WILD_GRASS | WILD_WOOD |
+F:MORTAL | GOOD | HAS_LITE | FORCE_SLEEP |
+F:DROP_60 | DROP_GREAT | OPEN_DOOR | RES_TELE |
+D:A funny, smiling humanoid of short stature, with a pony-
+D:tail and an enormous pouch. He is very polite, but also
+D:very curious. So curious, in fact, that the contents of
+D:your backpack are making their way into his pouch!
+
+# New monster added by furiosity for the Theme module
+# Based on Human warrior
+N:1018:Adventurer gnome
+G:l:U
+I:110:9d8:10:10:3
+W:15:3:1000:0
+B:HIT:HURT:5d8
+B:HIT:HURT:5d8
+F:BASEANGBAND | WILD_TOO | WILD_GRASS | WILD_WOOD |
+F:MORTAL | GOOD | HAS_LITE | FORCE_SLEEP | NO_FEAR |
+F:PET | FRIENDS | DROP_60 | OPEN_DOOR | BASH_DOOR |
+D:A fellow adventurer of rather short stature.
+
+# New monster added by furiosity for the Theme module
+N:1019:Tree cat
+G:f:g
+I:120:12d10:40:40:0
+W:12:2:1500:40
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:BITE:HURT:1d8
+B:CLAW:HURT:1d8
+B:CLAW:HURT:1d8
+B:BITE:HURT:1d6
+F:BASH_DOOR | WILD_TOO | WILD_GRASS | WILD_WOOD | WILD_MOUNTAIN |
+F:ANIMAL | DROP_SKELETON | DROP_CORPSE | MORTAL | BASEANGBAND |
+F:IM_POIS | CAN_FLY |
+D:A large cat that prefers to dwell in the trees and is very
+D:adept at navigating through the thickest forests while it
+D:stalks its prey.
+
+# New monster added by furiosity for the Theme module
+N:1020:Night cat
+G:f:b
+I:120:12d10:40:40:0
+W:15:2:1500:40
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:CLAW:HURT:1d8
+B:CLAW:HURT:1d8
+B:BITE:HURT:1d6
+F:BASH_DOOR | WILD_TOO | WILD_GRASS | WILD_WOOD | WILD_MOUNTAIN |
+F:ANIMAL | DROP_SKELETON | DROP_CORPSE | MORTAL | BASEANGBAND |
+F:EMPTY_MIND | KILL_BODY | HURT_LITE |
+D:A huge dark shape pouncing on you from the darkness, this cat
+D:mostly hunts at night and is extremely good at evading detection.
+
+# New monster added by furiosity for the Theme module
+N:1021:Leopard
+G:f:u
+I:130:12d10:40:40:0
+W:18:2:1500:40
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:CLAW:HURT:1d8
+B:CLAW:HURT:1d8
+B:BITE:HURT:1d6
+F:BASH_DOOR | WILD_TOO | WILD_GRASS | WILD_WOOD | WILD_MOUNTAIN |
+F:ANIMAL | DROP_SKELETON | DROP_CORPSE |
+F:MORTAL | BASEANGBAND
+D:A large cat with sleek brown spotted fur. It is fast and lithe,
+D:and none escape its notice.
+
+# New monster added by furiosity for the Theme module
+N:1022:Cheshire cat
+G:f:G
+I:120:12d10:40:40:0
+W:20:2:1500:40
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:CLAW:HURT:1d8
+B:CLAW:HURT:1d8
+B:BITE:HURT:1d6
+F:BASH_DOOR | WILD_TOO | WILD_GRASS | WILD_WOOD | WILD_MOUNTAIN |
+F:ANIMAL | DROP_SKELETON | DROP_CORPSE | SMART | PET |
+F:MORTAL | JOKEANGBAND | IM_POIS | WEIRD_MIND | INVISIBLE |
+D:A large cat with a huge smile. In fact, sometimes the smile
+D:is all you see of it.
+
+N:1023:Blue dragon worm
+G:w:B
+I:100:10d15:10:40:80
+W:20:3:4500:12
+E:0:0:0:0:1:0
+O:0:0:0:0
+B:CLAW:HURT:3d3
+B:CLAW:HURT:3d3
+B:BITE:HURT:3d5
+F:RAND_50 | RAND_25 |
+F:DROP_60 | ONLY_GOLD | DROP_CORPSE |
+F:OPEN_DOOR | BASH_DOOR |
+F:EVIL | DRAGON | IM_ELEC |
+F:MORTAL | BASEANGBAND | ATTR_MULTI
+S:MULTIPLY |
+S:1_IN_6 | BR_ELEC
+D:You thought dragons used eggs, but this worm has the scales, and the bad
+D:breath, and the fiery eyes, of a real dragon. Sparks fly from its jaws.
+
+N:1024:White dragon worm
+G:w:W
+I:100:10d15:10:40:80
+W:20:3:4500:12
+E:0:0:0:0:1:0
+O:0:0:0:0
+B:CLAW:HURT:3d3
+B:CLAW:HURT:3d3
+B:BITE:HURT:3d5
+F:RAND_50 | RAND_25 |
+F:DROP_60 | ONLY_GOLD | DROP_CORPSE |
+F:OPEN_DOOR | BASH_DOOR |
+F:EVIL | DRAGON | IM_COLD |
+F:MORTAL | BASEANGBAND | ATTR_MULTI
+S:MULTIPLY |
+S:1_IN_6 | BR_COLD
+D:You thought dragons used eggs, but this worm has the scales, and the bad
+D:breath, and the fiery eyes, of a real dragon. Its breath condenses in the air.
+
+N:1025:Green dragon worm
+G:w:G
+I:100:10d15:10:40:80
+W:20:3:4500:12
+E:0:0:0:0:1:0
+O:0:0:0:0
+B:CLAW:HURT:3d3
+B:CLAW:HURT:3d3
+B:BITE:HURT:3d5
+F:RAND_50 | RAND_25 |
+F:DROP_60 | ONLY_GOLD | DROP_CORPSE |
+F:OPEN_DOOR | BASH_DOOR |
+F:EVIL | DRAGON | IM_POIS |
+F:MORTAL | BASEANGBAND | ATTR_MULTI
+S:MULTIPLY |
+S:1_IN_6 | BR_POIS
+D:You thought dragons used eggs, but this worm has the scales, and the bad
+D:breath, and the fiery eyes, of a real dragon. You can smell foul gases
+D:on its breath.
+
+N:1026:Black dragon worm
+G:w:s
+I:100:10d15:10:40:80
+W:20:3:4500:12
+E:0:0:0:0:1:0
+O:0:0:0:0
+B:CLAW:HURT:3d3
+B:CLAW:HURT:3d3
+B:BITE:HURT:3d5
+F:RAND_50 | RAND_25 |
+F:DROP_60 | ONLY_GOLD | DROP_CORPSE |
+F:OPEN_DOOR | BASH_DOOR |
+F:EVIL | DRAGON | IM_ACID |
+F:MORTAL | BASEANGBAND | ATTR_MULTI
+S:MULTIPLY |
+S:1_IN_6 | BR_ACID
+D:You thought dragons used eggs, but this worm has the scales, and the bad
+D:breath, and the fiery eyes, of a real dragon. Acidic drool drips from its jaws.
+
+N:1027:Red dragon worm
+G:w:R
+I:100:10d15:10:40:80
+W:20:3:4500:12
+E:0:0:0:0:1:0
+O:0:0:0:0
+B:CLAW:HURT:3d3
+B:CLAW:HURT:3d3
+B:BITE:HURT:3d5
+F:RAND_50 | RAND_25 |
+F:DROP_60 | ONLY_GOLD | DROP_CORPSE |
+F:OPEN_DOOR | BASH_DOOR |
+F:EVIL | DRAGON | IM_FIRE |
+F:MORTAL | BASEANGBAND | ATTR_MULTI
+S:MULTIPLY |
+S:1_IN_6 | BR_FIRE
+D:You thought dragons used eggs, but this worm has the scales, and the bad
+D:breath, and the fiery eyes, of a real dragon. Smoke comes from its mouth.
+
+N:1028:Multi-hued dragon worm
+G:w:v
+I:100:10d20:10:40:80
+W:23:3:4500:12
+E:0:0:0:0:1:0
+O:0:0:0:0
+B:CLAW:HURT:3d3
+B:CLAW:HURT:3d3
+B:BITE:HURT:3d5
+F:RAND_50 | RAND_25 | ATTR_MULTI |
+F:DROP_60 | ONLY_GOLD | DROP_CORPSE |
+F:OPEN_DOOR | BASH_DOOR |
+F:EVIL | DRAGON | IM_ELEC | IM_FIRE | IM_ACID | IM_COLD | IM_POIS |
+F:MORTAL | BASEANGBAND
+S:MULTIPLY |
+S:1_IN_6 | BR_ELEC | BR_COLD | BR_FIRE | BR_ACID | BR_POIS
+D:You thought dragons used eggs, but this worm has the scales, and the bad
+D:breath, and the fiery eyes, of a real dragon. Its scales shimmer different
+D:colours as you watch.
+
+N:1029:The Minotaur of the Labyrinth
+G:H:v
+I:130:150d10:13:25:10
+W:40:2:17500:3100
+E:1:1:1:2:1:1
+O:0:0:0:0
+B:BUTT:HURT:4d6
+B:BUTT:HURT:4d6
+B:BUTT:HURT:3d6
+B:BUTT:HURT:3d6
+F:BASH_DOOR | DROP_SKELETON | DROP_CORPSE |
+F:EVIL | UNIQUE | SPECIAL_GENE |
+F:MORTAL | BASEANGBAND
+D:It is a cross between a human and a bull. The last of its kind,
+D:it guards its treasure jealously.
+
+N:1030:The Sandworm Queen
+G:w:v
+I:120:30d20:10:40:80
+W:30:3:4500:12
+E:0:0:0:0:1:0
+O:30:60:0:10
+B:CLAW:ACID:5d4
+B:CLAW:POISON:5d4
+B:BITE:FIRE:5d4
+B:BITE:ELEC:5d4
+F:FORCE_MAXHP | DROP_60 | ONLY_ITEM | DROP_GREAT | DROP_GOOD | DROP_CORPSE |
+F:OPEN_DOOR | BASH_DOOR | FEMALE | POWERFUL | SPECIAL_GENE | REFLECTING |
+F:EVIL | ANIMAL | IM_ELEC | IM_FIRE | IM_ACID | IM_POIS | ESCORT |
+F:MORTAL | BASEANGBAND | EMPTY_MIND | UNIQUE | NO_CONF
+S:1_IN_2 | BR_POIS | S_KIN
+D:Queen and Mother of the sandworms, fear her and her prolific children.
+
+N:1031:Sandworm
+G:w:y
+I:115:10d15:10:40:80
+W:27:6:4500:12
+E:0:0:0:0:1:0
+O:0:0:0:0
+B:CLAW:POISON:4d4
+B:CLAW:POISON:4d4
+B:CLAW:POISON:4d4
+B:BITE:HURT:5d5
+F:RAND_25 |
+F:FORCE_MAXHP | DROP_CORPSE | POWERFUL |
+F:EVIL | IM_ELEC | IM_FIRE | IM_POIS | EMPTY_MIND |
+F:MORTAL | BASEANGBAND
+S:MULTIPLY
+D:Offbreed of the Sandworm Queen, it is harmless alone.
+
+N:1032:Tik'srvzllat
+G:G:v
+I:142:180d100:200:170:0
+W:127:2:1000:350000
+E:1:1:1:2:1:1
+O:50:0:50:0
+B:GAZE:UN_BONUS:10d10
+B:GAZE:TIME:10d10
+B:GAZE:INSANITY:10d10
+B:GAZE:INSANITY:10d5
+F:UNIQUE | SPECIAL_GENE |
+F:FORCE_MAXHP | POWERFUL |
+F:ONLY_ITEM | DROP_3D2 | DROP_4D2 | DROP_GOOD | DROP_GREAT |
+F:INVISIBLE | COLD_BLOOD | PASS_WALL | WEIRD_MIND |
+F:EVIL | UNDEAD | IM_COLD | IM_FIRE | IM_ACID | IM_ELEC | AURA_COLD |
+F:IM_POIS | RES_NETH | BASEANGBAND | NO_CUT
+S:1_IN_2 |
+S:S_UNDEAD | S_DEMON | S_DRAGON |
+S:S_UNIQUE | S_WRAITH | S_HI_DEMON |
+S:S_HI_UNDEAD | S_HI_DRAGON | S_KIN |
+S:BR_DISE | BA_NETH
+D:A disembodied and barely sentient mind, Tik'srvzllat floated
+D:through the void for eons before being awakened by sorcery, pulled
+D:into the nether realm, and shaped into the being you see before you.
+D:A flickering purple outline of a sphere, with eerie yellow-purple
+D:mist circling rapidly around it, Tik'srvzllat threatens your sanity
+D:with its appearance alone.
+
+N:1033:The Glass Golem
+G:g:W
+I:130:100d15:200:170:0
+W:52:4:0:2000
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:HIT:INSANITY:5d6
+B:HIT:INSANITY:6d6
+B:HIT:INSANITY:7d6
+B:HIT:INSANITY:6d6
+F:COLD_BLOOD | EMPTY_MIND | KILL_WALL | FORCE_MAXHP | POWERFUL | SPECIAL_GENE |
+F:BASH_DOOR | IM_COLD | IM_ACID | IM_FIRE | IM_ELEC | IM_POIS | NONLIVING |
+F:ESCORTS | ESCORT | UNIQUE | NO_SLEEP | NO_CONF | NO_FEAR | NO_STUN
+F:CHAR_MULTI | CAN_FLY | BASEANGBAND | NO_CUT
+S:1_IN_4
+S:BR_CONF | BR_LITE | BR_DARK | BR_WALL
+S:S_KIN | TELE_LEVEL | SHRIEK
+D:One of the last creations of the Petty-Dwarves of Ludarin, its existence
+D:explains their destruction. A creation of finest glass, the body of this
+D:creature bends and amplifies light in a way that makes you unsure of its
+D:position. You feel somewhat dizzy as the radiant light reflects off the
+D:walls, the ceiling and your gear.
+
+N:1034:Elenwe the Lost
+G:U:W
+I:120:25d100:20:100:100
+W:50:3:12000:25000
+E:1:1:1:2:1:1
+O:0:50:50:0
+B:HIT:COLD:4d12
+B:HIT:COLD:4d12
+B:CRUSH:HURT:3d12
+B:TOUCH:UN_POWER
+F:UNIQUE | FORCE_SLEEP | FORCE_MAXHP | AURA_COLD | CAN_FLY |
+F:ONLY_ITEM | DROP_2D2 | DROP_GOOD | NONLIVING | DROP_RANDART
+F:OPEN_DOOR | BASH_DOOR | POWERFUL | MOVE_BODY | SMART |
+F:EVIL | DEMON | IM_COLD | NO_CONF | KILL_WALL | BASEANGBAND |
+F:HAS_LITE | FEMALE | SPECIAL_GENE
+S:1_IN_4 |
+S:BLIND | CONF | BRAIN_SMASH |
+S:BR_COLD | BO_COLD | BA_NETH | S_UNDEAD | S_DEMON
+D:She was once the wife of Turgon and mother of Idril Celebrindal. She was
+D:lost when the Noldor crossed the Grinding Ice after Feanor and his sons
+D:betrayed Fingolfin's host by burning the white ships of Alqualonde.
+D:Melkor corrupted her spirit and granted her balrog form, and she has
+D:guarded this pass ever since.
+
+N:1035:Golgarach, the Living Rock
+G:#:W
+I:120:50d30:20:100:40
+W:45:2:0:1500
+E:0:0:0:0:0:0
+O:60:0:40:0
+B:HIT:HURT:4d6
+B:HIT:HURT:4d6
+B:HIT:HURT:4d6
+F:FORCE_SLEEP | COLD_BLOOD | EMPTY_MIND | PASS_WALL | KILL_BODY | ESCORT |
+F:BASH_DOOR | IM_COLD | IM_ACID | IM_ELEC | IM_POIS | NONLIVING | UNIQUE
+F:HURT_ROCK | NO_CONF | NO_SLEEP | NO_CUT | CHAR_MULTI | BASEANGBAND | SPECIAL_GENE
+F:NO_CUT | DROP_RANDART
+S:1_IN_10 | S_KIN | BO_ACID | BA_FIRE
+D:Deep in the heart of the earth, even the rock itself is sentient
+D:and has learned to despise intruders.
+
+# New monster added by furiosity for the Theme module
+N:1036:Sanctimonious-looking preacher
+G:t:w
+I:110:3d3:10:1:255
+W:0:1:1500:0
+E:1:1:1:2:1:1
+O:0:0:0:0
+B:INSULT:*
+F:MALE | RAND_50 | CAN_SPEAK | NEUTRAL | NO_TARGET |
+F:ONLY_GOLD | DROP_60 | DROP_SKELETON | DROP_CORPSE |
+F:OPEN_DOOR | BASH_DOOR | WILD_TOWN | WILD_ONLY |
+F:MORTAL | BASEANGBAND | HAS_LITE | AI_ANNOY |
+D:He thinks you are not pious enough. He will try to
+D:get you to change your ways.
+
+# New monster added by furiosity for the Theme module
+N:1037:Weary-looking traveller
+G:t:v
+I:110:3d3:10:1:255
+W:0:1:1500:0
+E:1:1:1:2:1:1
+O:0:0:0:0
+B:HIT:HURT:1d3
+F:MALE | NEUTRAL | NO_TARGET |
+F:ONLY_ITEM | DROP_90 | DROP_SKELETON | DROP_CORPSE |
+F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | WILD_TOWN | WILD_ONLY |
+F:MORTAL | BASEANGBAND | HAS_LITE
+D:He's wearing fancy clothes of foreign make. He looks tired.
+
+N:1038:Water hound
+G:Z:r
+I:110:12d6:30:30:0
+W:43:1:600:150
+B:BITE:HURT:1d6
+B:CLAW:HURT:1d4
+B:CLAW:HURT:1d4
+E:0:1:0:2:1:0
+O:0:0:0:0
+F:FORCE_SLEEP | BASH_DOOR | DROP_CORPSE | FRIENDS
+F:ANIMAL | IM_COLD | MORTAL | BASEANGBAND | RES_WATE | NO_CUT
+S:1_IN_5 | BA_WATE
+D:The sound of a hundred waterfalls rushes through your ears as
+D:a huge wave of water, vaguely hound-shaped, rushes towards you.
+
+N:1039:Improv, the mighty MoLD
+G:m:v
+I:150:170d100:40:140:0
+W:127:2:3000:50000
+E:3:0:3:6:1:0
+O:20:20:20:20
+B:SPORE:UN_BONUS:10d10
+B:SPORE:EXP_80:10d10
+B:SPORE:TIME:10d10
+B:SPORE:TIME:10d10
+F:UNIQUE | NEVER_MOVE | CAN_SWIM | CAN_SPEAK |
+F:FORCE_MAXHP | WEIRD_MIND | DROP_CORPSE |
+F:REFLECTING | AURA_ELEC | ONLY_ITEM | DROP_4D2 |
+F:DROP_GOOD | DROP_GREAT | FORCE_SLEEP | RES_NETH |
+F:SMART | POWERFUL | RES_TELE | REGENERATE | CAN_FLY |
+F:DG_CURSE | WYRM_PROTECT | EVIL |
+F:IM_ACID | IM_FIRE | IM_ELEC | IM_POIS |
+F:NO_CONF | NO_SLEEP | NO_FEAR | NO_STUN |
+F:JOKEANGBAND | HAS_LITE | RES_WATE | NO_CUT
+S:1_IN_2 |
+S:S_HI_DRAGON | S_KIN | BR_DISI | HEAL | TPORT |
+S:TELE_LEVEL | TELE_TO
+D:An assistant to DarkGod, Improv has chosen the form of a dense
+D:purple smog for his incarnation into Middle-earth. It travels the
+D:dungeons, killing software bugs and creating random artifacts for
+D:guests to find.
+
+N:1040:Emperor mimic
+G:m:y
+I:120:50d50:30:60:100
+W:40:3:100:200
+E:0:0:0:0:0:0
+O:25:25:25:25
+B:HIT:POISON:5d5
+B:HIT:POISON:5d5
+B:HIT:POISON:5d5
+B:HIT:POISON:5d5
+F:MIMIC | UNIQUE
+F:FORCE_SLEEP |
+F:EMPTY_MIND | COLD_BLOOD |
+F:IM_ACID | IM_FIRE | IM_ELEC | IM_COLD | IM_POIS |
+F:NO_CONF | NO_SLEEP | NO_FEAR | BASEANGBAND | NO_CUT
+S:1_IN_1 |
+S:BLIND | CONF | SCARE | CAUSE_4 | CAUSE_3 | FORGET |
+S:BA_ACID | BA_FIRE | BA_COLD | BA_ELEC |
+S:S_MONSTER | S_KIN | SHRIEK | BRAIN_SMASH | TRAPS
+D:A strange creature that disguises itself as an object to lure
+D:unsuspecting adventurers within reach of its venomous claws.
+
+N:1041:Melinda Proudfoot
+G:h:v
+I:110:1d1:40:250:3
+W:0:0:730:0
+E:0:1:1:2:1:1
+O:0:0:0:1
+F:FEMALE | CAN_SPEAK | WILD_ONLY | WILD_TOWN |
+F:FORCE_MAXHP | NEVER_GENE
+F:NEVER_MOVE | NEVER_BLOW | GOOD | NO_TARGET
+F:MORTAL | BASEANGBAND | UNIQUE | NEUTRAL | NO_TARGET | NO_DEATH
+D:She seems to seek someone, you may help.
+
+N:1042:Thrain, the King Under the Mountain
+G:k:B
+I:110:1d1:40:250:3
+W:60:1:730:0
+E:0:1:1:2:1:1
+O:0:0:0:1
+F:MALE | CAN_SPEAK
+F:FORCE_MAXHP | SPECIAL_GENE
+F:NEVER_MOVE | NEVER_BLOW | GOOD | NO_TARGET
+F:MORTAL | BASEANGBAND | UNIQUE | NEUTRAL | NO_TARGET | NO_DEATH
+D:He must have suffered horrible tortures.
+
+N:1043:Fire golem
+G:g:r
+I:115:3d20:50:50:10
+W:0:3:100:0
+E:1:1:1:2:1:1
+O:0:0:0:0
+B:HIT:HURT:2d6
+B:HIT:HURT:2d6
+B:HIT:FIRE:3d6
+B:HIT:FIRE:3d6
+F:BASH_DOOR | AURA_FIRE | HAS_LITE
+F:IM_FIRE | SPECIAL_GENE
+F:NO_CONF | NO_SLEEP | NO_FEAR | NONLIVING | NO_STUN
+F:MORTAL | BASEANGBAND | NO_CUT | AI_PLAYER
+S:1_IN_10 |
+S:BR_FIRE
+D:A sentient mass of pure fire.
+
+N:1044:Melkor, Lord of Darkness
+G:G:v
+I:150:300d300:100:150:0
+W:150:1:200000:60000
+E:1:1:1:2:1:1
+O:25:25:25:25
+B:HIT:ABOMINATION:3d10
+B:HIT:TIME:24d10
+B:HIT:INSANITY:24d10
+B:HIT:LOSE_ALL:24d10
+F:UNIQUE | CAN_SPEAK | MALE |
+F:FORCE_MAXHP | SPIRIT
+F:ONLY_ITEM | DROP_1D2 | DROP_2D2 | DROP_3D2 | DROP_4D2 |
+F:DROP_GOOD | DROP_GREAT | DROP_CHOSEN | RES_NETH |
+F:SMART | KILL_WALL | MOVE_BODY | AURA_FIRE |
+F:REGENERATE | POWERFUL | SPECIAL_GENE | CAN_FLY | KILL_TREES
+F:EVIL | IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS |
+F:NO_CONF | NO_STUN | NO_SLEEP | NO_FEAR | RES_TELE | BASEANGBAND |
+S:1_IN_4 |
+S:BRAIN_SMASH |
+S:BA_MANA | BO_MANA | BA_NETH | BA_CHAO | BA_DARK | ANIM_DEAD | S_KIN |
+S:S_MONSTERS | S_UNIQUE | S_HI_DEMON | S_HI_UNDEAD | S_HI_DRAGON |
+S:BR_NETH | BR_DISI | HAND_DOOM | S_WRAITH | HEAL | BRAIN_SMASH |
+S:DRAIN_MANA | TELE_TO | DARKNESS | SHRIEK
+D:He was the most powerful of the Valar, the equal of Manwe.
+D:You banned him here, in the Void, and now you must destroy him
+D:forever. However here in the Void, his spirit gained much power
+D:for he is closer to the Flame Imperishable. He is coming to you in pure
+D:madness, which makes him even more dangerous. You are on the verge
+D:of dying!
+
+## Here are the Spirits, inhabitants of the Void, all called "Spirit" making it hard to know what we are up against ##
+## Note: I am nasty heheh :)
+
+# Spirit of nether
+N:1045:Spirit
+G:G:v
+I:120:40d80:30:50:20
+W:128:2:0:5000
+E:0:1:1:2:0:0
+O:25:0:75:0
+B:TOUCH:EXP_80:10d10
+B:TOUCH:EXP_80:10d10
+F:SPIRIT | BASEANGBAND | NEVER_MOVE | EMPTY_MIND | NO_CUT |
+F:COLD_BLOOD | INVISIBLE
+S:1_IN_1 |
+S:BA_NETH
+D:This strange, almost intangible spirit keeps assaulting you!
+
+# Spirit of annoyance (hahaha AI_ANNOY and MULTIPLY)
+N:1046:Spirit
+G:G:B
+I:130:40d20:30:70:70
+W:144:4:0:500
+E:0:0:0:0:0:0
+O:5:5:5:0
+B:TOUCH:POISON:10d10
+B:CRAWL:POISON:10d10
+B:CRAWL:EAT_ITEM:10d9
+B:BITE:UN_BONUS:9d9
+F:SPIRIT | BASEANGBAND | WEIRD_MIND | FRIENDS |
+F:AI_ANNOY | PASS_WALL
+S:MULTIPLY
+D:These things multiply at an apparently unstoppable rate!
+
+# Spirit of movement
+N:1047:Spirit
+G:G:B
+I:130:10d80:50:65:10
+W:132:1:10:5500
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:TOUCH:LOSE_DEX:2d3
+B:TOUCH:PARALYZE:1d12
+B:TOUCH:PARALYZE:1d12
+F:SPIRIT | BASEANGBAND | NO_SLEEP | PASS_WALL | WEIRD_MIND
+S:1_IN_2 |
+S:SLOW | BLINK | HOLD | HASTE
+D:Coming towards you quickly, it seems intent on moving faster than you.
+
+# Spirit of confusion
+N:1048:Spirit
+G:G:v
+I:120:40d80:80:85:0
+W:135:2:0:5500
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:ENGULF:HALLU:16d8
+B:ENGULF:HALLU:16d8
+B:ENGULF:CONFUSE:16d8
+B:ENGULF:CONFUSE:16d8
+F:SPIRIT | BASEANGBAND | RES_NEXU | AURA_ELEC | IM_FIRE | IM_ELEC |
+F:EMPTY_MIND | BASH_DOOR | POWERFUL | CAN_FLY | ATTR_MULTI |
+F:NO_CONF | NO_SLEEP | NO_FEAR | NO_CUT
+S:1_IN_3 |
+S:BR_CHAO | BR_NEXU | BR_NUKE | BR_CONF
+D:A swirling mass, constantly changing its appearance.
+
+# Spirit of brawn
+N:1049:Spirit
+G:G:U
+I:130:140d100:50:180:30
+W:145:3:10000:8000
+E:1:1:1:2:1:1
+O:0:100:0:0
+B:HIT:SHATTER:18d18
+B:HIT:CONFUSE:18d18
+B:HIT:SHATTER:18d18
+B:HIT:CONFUSE:18d18
+F:SPIRIT | BASEANGBAND | DROP_4D2 | KILL_BODY | KILL_WALL |
+F:OPEN_DOOR | BASH_DOOR | DROP_CORPSE | KILL_TREES |
+F:EVIL | GIANT | HURT_ROCK | BASEANGBAND | HAS_LITE |
+F:IM_FIRE | IM_COLD | IM_ACID | IM_ELEC | IM_POIS
+D:Strong and swarthy, this spirit could bend metal with his bare hands.
+
+# Spirit of Wyrms
+N:1050:Spirit
+G:G:v
+I:130:151d151:50:190:50
+W:147:8:10000:87500
+E:0:1:0:6:1:0
+O:50:50:0:0
+B:CLAW:HURT:10d15
+B:CLAW:HURT:10d15
+B:BITE:HURT:14d18
+B:BITE:HURT:14d18
+F:SPIRIT | FORCE_MAXHP | MOVE_BODY | AURA_FIRE | REFLECTING | AURA_ELEC |
+F:ONLY_ITEM | DROP_2D2 | DROP_3D2 | DROP_4D2 | DROP_GOOD | AURA_COLD |
+F:OPEN_DOOR | BASH_DOOR | POWERFUL | RES_NETH | RES_DISE |
+F:DRAGON | GOOD | RES_TELE | DROP_CORPSE | KILL_TREES |
+F:IM_ACID | IM_FIRE | IM_COLD | IM_ELEC | IM_POIS | NO_CONF | NO_SLEEP |
+F:RES_NEXU | RES_PLAS | CAN_FLY | BASEANGBAND | HAS_LITE | NO_CUT
+S:1_IN_3 |
+S:S_HI_DRAGON | S_DRAGON | S_KIN |
+S:BR_NUKE | BR_ACID | BR_ELEC | BR_FIRE |
+S:BR_COLD | BR_POIS | BR_NETH | BR_LITE | BR_DARK |
+S:BR_CONF | BR_SOUN | BR_CHAO | BR_DISE | BR_NEXU |
+S:BR_TIME | BR_INER | BR_GRAV | BR_SHAR | BR_PLAS |
+S:BR_WALL | BR_MANA | BR_DISI
+D:This spirit bears a remarkable similarity to some of the most powerful
+D:types of dragonkind found in Middle-earth. It appears to be even more
+D:fearsome, though!
+
+# Spirit of snakes
+N:1051:Spirit
+G:G:g
+I:130:150d100:40:80:20
+W:133:3:90:750
+E:1:1:1:2:1:1
+O:25:20:25:20
+B:BITE:POISON:15d15
+B:BITE:POISON:15d15
+B:BITE:LOSE_ALL:10d12
+F:SPIRIT | CAN_SWIM | IM_POIS | IM_ACID |
+F:DROP_60 | DROP_2D2 | FRIENDS | DROP_CORPSE |
+F:OPEN_DOOR | BASH_DOOR | EVIL | BASEANGBAND
+S:1_IN_4 |
+S:BA_POIS | S_MONSTER | SCARE | HOLD
+D:It slides towards you, a horrible scaly, slidy thing.
+
+# Spirit of seeing
+N:1052:Spirit
+G:G:v
+I:130:95d110:60:130:10
+W:141:3:60:50000
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:GAZE:UN_BONUS:12d12
+B:GAZE:UN_POWER:12d10
+B:GAZE:INSANITY:12d14
+B:GAZE:LOSE_ALL:6d6
+F:SPIRIT | BASH_DOOR | EVIL | IM_POIS |
+F:CAN_FLY | BASEANGBAND
+S:1_IN_2 |
+S:BLIND | CONF | FORGET | SCARE | DRAIN_MANA | BRAIN_SMASH |
+S:BA_DARK | BO_MANA | BA_NETH | BA_ACID | BA_FIRE | BA_COLD
+D:You will find it difficult to avoid being seen by this spirit! And
+D:once it has you in its sight, beware!
+
+# Spirit of unseeing
+N:1053:Spirit
+G:.:W
+I:120:55d50:20:130:80
+W:142:6:60:4000
+E:0:0:0:0:0:0
+O:10:0:90:0
+B:TOUCH:UN_BONUS:12d12
+B:TOUCH:UN_POWER:12d10
+B:TOUCH:INSANITY:12d14
+B:TOUCH:LOSE_ALL:6d6
+F:SPIRIT | CAN_FLY | REFLECTING |
+F:SMART | BASH_DOOR | COLD_BLOOD | INVISIBLE | EMPTY_MIND |
+F:EVIL | BASEANGBAND | CHAR_MULTI | CHAR_CLEAR | ATTR_CLEAR
+S:1_IN_3 |
+S:DRAIN_MANA | BLINK | BLIND | SCARE | CONF |
+S:HEAL | TELE_AWAY | DARKNESS | TRAPS | FORGET | SHRIEK
+D:Hopefully you will kill this spirit before you realise it exists.
+
+# Spirit of ickyness
+N:1054:Spirit
+G:G:g
+I:130:80d80:30:60:10
+W:138:4:300:40000
+E:0:0:0:0:0:0
+O:40:30:10:10
+B:CRAWL:POISON:12d14
+B:CRAWL:EAT_FOOD:12d14
+B:TOUCH:ACID:13d15
+B:HIT:HURT:13d15
+F:SPIRIT | BASEANGBAND |
+F:EMPTY_MIND | OPEN_DOOR | BASH_DOOR |
+F:EVIL | IM_ACID | IM_ELEC | IM_FIRE | IM_COLD | IM_POIS |
+F:EMPTY_MIND
+S:1_IN_4 |
+S:DRAIN_MANA | BLIND | CONF | SCARE | S_KIN
+D:A horrible slimy spirit, that seems to ooze evilness. I wouldn't get
+D:too close to it if I were you.
+
+# Spirit of friendship
+N:1055:Spirit
+G:G:W
+I:130:35d100:40:150:100
+W:136:3:200:10000
+E:0:1:0:2:1:0
+O:50:50:0:0
+B:BITE:HURT:12d12
+B:BITE:HURT:12d12
+B:BITE:HURT:12d8
+B:BITE:HURT:12d8
+F:SPIRIT | BASEANGBAND |
+F:ESCORT | ESCORTS |
+F:OPEN_DOOR | BASH_DOOR
+S:1_IN_2 |
+S:S_KIN
+D:This spirit appears to have lots of friends!
+
+# Spirit of abomination
+N:1056:Spirit
+G:G:d
+I:130:40d80:30:125:125
+W:134:2:200:5000
+E:0:0:0:0:0:0
+O:50:0:50:0
+B:WAIL:TERRIFY:8d9
+B:HIT:HURT:10d10
+B:HIT:ABOMINATION:6d10
+B:HIT:ABOMINATION:6d10
+F:SPIRIT | BASEANGBAND |
+F:EVIL | UNDEAD | IM_POIS | IM_COLD | NO_CONF | NO_SLEEP |
+F:COLD_BLOOD | HURT_LITE | NO_CUT
+S:1_IN_3 |
+S:SCARE | HOLD | DARKNESS | SCARE
+D:It seems to have been woken from the dead, this spirit. It lumbers
+D:towards you, seeking to turn you into a form as hideous as its own!
+
+### Here come the spirits of <player stat> ###
+#
+# Spirit of strength
+N:1057:Spirit
+G:G:u
+I:120:140d100:50:180:170
+W:129:2:10000:8000
+E:1:1:1:2:1:1
+O:0:100:0:0
+B:HIT:LOSE_STR:4d8
+B:HIT:LOSE_STR:4d8
+B:HIT:LOSE_STR:4d8
+F:SPIRIT | BASEANGBAND | DROP_2D2 | KILL_BODY | KILL_WALL |
+F:BASH_DOOR | EVIL | GIANT | HURT_ROCK |
+F:IM_FIRE | IM_COLD | IM_ACID | IM_ELEC | IM_POIS
+D:It is coming for you, this massive imposing tower of strength.
+D:It appears almost unstoppable!
+
+# Spirit of intelligence
+N:1058:Spirit
+G:G:r
+I:140:80d100:50:100:10
+W:131:2:10000:8000
+E:1:1:1:2:1:1
+O:0:0:100:0
+B:HIT:LOSE_INT:4d8
+B:HIT:LOSE_INT:4d8
+B:HIT:LOSE_INT:4d8
+F:EVIL | SPIRIT | BASEANGBAND | DROP_2D2 |
+F:OPEN_DOOR | SMART |
+F:IM_FIRE | IM_COLD | IM_ACID | IM_ELEC | IM_POIS
+S:1_IN_2 |
+S:HASTE | TPORT | TELE_TO | BLIND | CONF |
+S:BO_MANA | BO_FIRE | BO_COLD | BO_ELEC |
+D:This spirit looks very clever, cunning almost.
+
+# Spirit of wisdom
+N:1059:Spirit
+G:G:G
+I:130:120d100:50:200:130
+W:137:2:10000:8000
+E:1:1:1:2:1:1
+O:0:50:50:0
+B:HIT:LOSE_WIS:4d8
+B:HIT:LOSE_WIS:4d8
+B:HIT:LOSE_WIS:4d8
+F:EVIL | SPIRIT | BASEANGBAND | DROP_2D2 |
+F:OPEN_DOOR |
+F:IM_FIRE | IM_COLD | IM_ACID | IM_ELEC | IM_POIS
+S:1_IN_2 |
+S:HEAL | MIND_BLAST | CAUSE_4 | SCARE |
+S:DRAIN_MANA | BRAIN_SMASH | FORGET |
+D:This spirit has something of a priestly look about it.
+
+# Spirit of dexterity
+N:1060:Spirit
+G:G:W
+I:160:120d100:50:160:50
+W:139:2:10000:8000
+E:1:1:1:2:1:1
+O:0:50:25:25
+B:HIT:LOSE_DEX:4d8
+B:HIT:LOSE_DEX:4d8
+B:HIT:LOSE_DEX:4d8
+F:EVIL | SPIRIT | BASEANGBAND | DROP_2D2 |
+F:OPEN_DOOR | SMART |
+F:IM_FIRE | IM_COLD | IM_ACID | IM_ELEC | IM_POIS
+S:1_IN_1 |
+S:ARROW_4
+D:This spirit moves almost too quickly for you to see him.
+
+# Spirit of constitution
+N:1061:Spirit
+G:G:s
+I:120:140d100:50:180:50
+W:143:2:10000:8000
+E:1:1:1:2:1:1
+O:0:50:0:50
+B:HIT:LOSE_CON:4d8
+B:HIT:LOSE_CON:4d8
+B:HIT:LOSE_CON:4d8
+F:EVIL | SPIRIT | BASEANGBAND | DROP_2D2 | BASH_DOOR |
+F:IM_FIRE | IM_COLD | IM_ACID | IM_ELEC | IM_POIS
+D:This spirit moves slower than most, but thunders on and on
+D:towards you.
+
+# Spirit of charisma
+N:1062:Spirit
+G:G:b
+I:140:80d100:50:120:90
+W:146:2:10000:8000
+E:1:1:1:2:1:1
+O:70:10:10:10
+B:HIT:LOSE_CHR:4d8
+B:HIT:LOSE_CHR:4d8
+B:HIT:LOSE_CHR:4d8
+F:SPIRIT | BASEANGBAND | DROP_2D2 |
+F:OPEN_DOOR | EVIL | TAKE_ITEM |
+F:IM_FIRE | IM_COLD | IM_ACID | IM_ELEC | IM_POIS
+S:1_IN_2 |
+S:TRAPS | ARROW_3 | BLINK | TELE_TO | CONF
+D:There is something attractive about this spirit, and it seems
+D:to have a full purse.
+
+### Here come some elemental spirits ###
+#
+# Spirit of flickering fire
+N:1063:Spirit
+G:G:r
+I:120:60d100:50:65:80
+W:130:1:5:6000
+E:1:1:1:2:1:1
+O:25:60:0:15
+B:HIT:FIRE:10d8
+B:HIT:FIRE:10d8
+B:HIT:FIRE:10d8
+F:SPIRIT | BASEANGBAND | AI_ANNOY | IM_FIRE | AURA_FIRE | HAS_LITE
+S:1_IN_2 |
+S:BO_FIRE | BA_FIRE
+D:Flickering towards you, and then away, this spirit will burn you badly!
+
+# Spirit of icy cold
+N:1064:Spirit
+G:G:w
+I:120:60d100:50:65:80
+W:148:1:5:6000
+E:1:1:1:2:1:1
+O:25:60:0:15
+B:HIT:COLD:10d8
+B:HIT:COLD:10d8
+B:HIT:COLD:10d8
+F:SPIRIT | BASEANGBAND | IM_COLD | AURA_COLD |
+F:COLD_BLOOD | BASH_DOOR
+S:1_IN_2 |
+S:BO_COLD | BA_COLD
+D:The temperature around you drops as soon as you set eyes on this spirit.
+
+# Spirit of corrosion (acid)
+N:1065:Spirit
+G:G:s
+I:120:60d100:50:65:80
+W:146:1:5:6000
+E:1:1:1:2:1:1
+O:25:60:0:15
+B:HIT:ACID:10d8
+B:HIT:ACID:10d8
+B:HIT:ACID:10d8
+F:SPIRIT | BASEANGBAND | IM_ACID | BASH_DOOR | KILL_TREES
+S:1_IN_2 |
+S:BO_ACID | BA_ACID
+D:The very fabric of the void heals itself where this spirit walks.
+
+# Spirit of shocking (electricity)
+N:1066:Spirit
+G:G:b
+I:120:60d100:50:65:80
+W:149:1:5:6000
+E:1:1:1:2:1:1
+O:25:60:0:15
+B:HIT:ELEC:10d8
+B:HIT:ELEC:10d8
+B:HIT:ELEC:10d8
+F:SPIRIT | BASEANGBAND | IM_ELEC | AURA_ELEC | BASH_DOOR
+S:1_IN_2 |
+S:BO_ELEC | BA_ELEC
+D:The air crackles as this spirit approaches, and you smell singed flesh.
+
+# Spirit of Valaraukar (Balrogs)
+N:1067:Spirit
+G:G:v
+I:130:130d100:100:140:10
+W:149:1:170:43000
+E:1:1:1:2:1:1
+O:0:100:0:0
+B:HIT:FIRE:11d12
+B:HIT:FIRE:11d12
+B:CRUSH:HURT:10d12
+B:TOUCH:UN_POWER
+F:SPIRIT | CAN_FLY | KILL_WALL | AURA_FIRE | NONLIVING |
+F:ONLY_ITEM | DROP_2D2 | EVIL | DEMON |
+F:OPEN_DOOR | BASH_DOOR | POWERFUL | MOVE_BODY |
+F:IM_FIRE | IM_ELEC | BASEANGBAND | HAS_LITE
+S:1_IN_3 |
+S:BLIND | CONF | SCARE | BR_FIRE
+D:Carrying a whip of fire, this spirit looks not dissimilar to a certain
+D:Balrog.
+
+# Spirit of shadows
+N:1068:Spirit
+G:G:d
+I:130:30d100:70:150:4
+W:140:4:2300:10000
+E:1:1:1:2:1:1
+O:20:80:0:0
+B:HIT:HURT:10d10
+B:HIT:HURT:10d10
+B:TOUCH:EXP_80:20d8
+B:TOUCH:EXP_40:20d8
+F:SPIRIT | BASEANGBAND | REFLECTING | REGENERATE |
+F:IM_ACID | IM_ELEC | IM_COLD | IM_FIRE | IM_POIS | RES_TELE |
+F:TAKE_ITEM | OPEN_DOOR | BASH_DOOR | SMART | POWERFUL
+S:1_IN_3 |
+S:BLIND | HEAL | BA_DARK | HASTE | CONF
+D:Deriving his strength from the shadows, this spirit
+D:steals only for the challenge.
+
+# Spirit of vampire or something
+N:1069:Spirit
+G:G:W
+I:130:50d50:30:90:10
+W:143:2:1700:18000
+E:1:1:1:2:1:1
+O:0:70:30:0
+B:HIT:HURT:10d9
+B:HIT:HURT:9d9
+B:BITE:EXP_80:9d9
+B:BITE:EXP_80:9d9
+F:SPIRIT | FORCE_SLEEP | CAN_FLY |
+F:DROP_60 | DROP_4D2 |
+F:COLD_BLOOD | OPEN_DOOR | BASH_DOOR | REGENERATE | RES_TELE |
+F:EVIL | UNDEAD | IM_COLD | IM_POIS | HURT_LITE |
+F:NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT | SPIRIT
+S:1_IN_3 |
+S:BLIND | HOLD | SCARE | CAUSE_3 | CAUSE_4 | DRAIN_MANA |
+S:BRAIN_SMASH | DARKNESS | BO_NETH
+D:Your blood curdles and your bones chill as this spirit approaches.
+
+# Spirit of unresistability (hehehehe)
+N:1070:Spirit
+G:G:v
+I:140:40d100:40:70:20
+W:149:4:1200:20000
+E:1:1:1:2:1:1:
+O:0:0:0:100
+B:HIT:SHATTER:18d10
+B:HIT:SHATTER:18d10
+B:HIT:LOSE_ALL:8d8
+B:TOUCH:UN_POWER
+F:BASEANGBAND | SPIRIT | SMART |
+F:OPEN_DOOR | BASH_DOOR | POWERFUL |
+F:RES_NEXU | RES_NETH |
+F:NO_CONF | NO_SLEEP | NO_FEAR |
+F:IM_POIS | IM_ELEC | IM_ACID | IM_COLD |
+S:1_IN_2 |
+S:BA_MANA | BR_PLAS | BR_TIME | ROCKET | HAND_DOOM | FORGET | BA_WATE
+D:This spirit appears to be afraid of very little, and confident in its
+D:ability to destroy you.
+
+# Spirit of time
+N:1071:Spirit
+G:G:G
+I:130:80d100:40:110:0
+W:150:3:800:50000
+E:0:1:0:2:1:0
+O:0:0:0:0
+B:TOUCH:TIME:6d12
+B:TOUCH:TIME:6d12
+B:TOUCH:TIME:6d12
+B:TOUCH:TIME:6d12
+F:OPEN_DOOR | BASH_DOOR | DROP_SKELETON | DROP_CORPSE |
+F:ANIMAL | NO_CONF | NO_SLEEP |
+F:SPIRIT | BASEANGBAND
+S:1_IN_2 |
+S:BR_TIME | SLOW | HASTE | HOLD
+D:All at once you see that which is to come and that which has gone before.
+
+# Spirit of Gold
+N:1072:Spirit
+G:G:y
+I:130:50d80:20:110:100
+W:130:4:80:8000
+E:0:1:0:2:1:0
+O:100:0:0:0
+B:TOUCH:EAT_GOLD:7d15
+B:TOUCH:EAT_GOLD:7d15
+B:HIT:POISON:6d12
+B:HIT:POISON:6d12
+F:ONLY_GOLD | SPIRIT | BASEANGBAND |
+F:DROP_4D2 | DROP_4D2 | DROP_4D2 | REFLECTING | COLD_BLOOD | REGENERATE |
+F:BASH_DOOR | MOVE_BODY | IM_ELEC | IM_COLD | IM_POIS |
+F:RES_TELE | NO_FEAR | NO_STUN | NO_CONF | NO_SLEEP
+S:1_IN_4 |
+S:ARROW_4 | HEAL | FORGET
+D:It is the very essence of financial greed...
+
+# Spirit of doom
+N:1073:Spirit
+G:G:D
+I:136:60d70:40:70:30
+W:134:2:60:8000
+E:1:1:1:2:1:1
+O:0:10:90:0
+B:HIT:HURT:14d14
+B:HIT:HURT:14d14
+B:HIT:HURT:14d14
+F:SMART | OPEN_DOOR | BASH_DOOR |
+F:EVIL | NO_CONF | NO_SLEEP |
+F:SPIRIT | BASEANGBAND | HAS_LITE
+S:1_IN_2 |
+S:HAND_DOOM | CAUSE_4 | DARKNESS
+D:The very presence of this creature fills the air with an aura of doom.
+D:You feel waves of depression descending on you as it approaches.
+
+# Spirit of etherealism (?)
+N:1074:Spirit
+G:G:o
+I:120:40d100:30:120:40
+W:141:3:1700:10000
+E:0:1:0:6:1:0
+B:CLAW:HURT:14d10
+B:CLAW:HURT:14d10
+B:BITE:HURT:17d10
+F:INVISIBLE | CAN_FLY | SPIRIT | WEIRD_MIND |
+F:PASS_WALL | POWERFUL | MOVE_BODY |
+F:EVIL | NO_CONF | NO_SLEEP | BASEANGBAND | SPIRIT
+S:1_IN_2 |
+S:BLIND | CONF |
+S:BR_LITE | BR_DARK | BR_CONF
+D:This sprit seems to flicker in and out of this plane, and is a master
+D:of light and dark.
+
+# Spirit of orc (boring huh)
+N:1075:Spirit
+G:G:v
+I:120:90d10:30:160:100
+W:142:3:2700:11111
+E:1:1:1:2:1:1
+O:10:90:0:0
+B:HIT:HURT:10d10
+B:HIT:HURT:10d10
+B:HIT:HURT:10d10
+F:OPEN_DOOR | BASH_DOOR |
+F:EVIL | ORC | IM_POIS | ONLY_ITEM |
+F:MORTAL | BASEANGBAND | HAS_LITE | SPIRIT
+D:Stupid but strong, this spirit has an orcish aura about him.
+
+### Here endeth the Spirits ###
+
+N:1076:Neil, the Sorceror
+G:h:v
+# *Not* enough hitpoints
+I:110:50d100:20:30:30
+# Bottom of Erebor
+W:72:100:330:50000
+E:1:1:1:2:1:1
+O:0:5:90:5
+# Sorceror, not warrior
+B:HIT:HURT:1d1
+B:HIT:HURT:1d1
+F:OPEN_DOOR | SMART | MALE | DROP_SKELETON | DROP_CORPSE
+F:MORTAL | HAS_LITE | JOKEANGBAND | UNIQUE
+# Trone, of course
+F:CAN_FLY | REFLECTING | IM_FIRE
+# Thorin
+F:IM_ACID | FORCE_MAXHP
+# No cold or random gen... waiting on elven rings only at bottom of Erebor
+F:SPECIAL_GENE
+# Dig
+F:KILL_WALL
+# Obvious resistances
+F:NO_CONF | NO_SLEEP | NO_STUN | NO_FEAR
+# Well, he's been there a while
+F:ONLY_ITEM | DROP_4D2 | DROP_GOOD | DROP_GREAT
+# Essence of speed, Manathrust, Noxious Cloud, and Fireflash
+S:1_IN_1 |
+S:HASTE | BO_MANA | BA_POIS | BA_FIRE
+D:He looks like he is looking for something, and the flecks of dragon
+D:blood on his face tell you he means business!
+
+### Theme monsters, cont. ###
+
+N:1077:Swamp wight
+G:W:o
+I:110:25d10:20:40:10
+W:45:3:0:400
+E:0:0:0:0:0:0
+O:0:50:50:0
+B:HIT:HURT:1d8
+B:HIT:POISON:1d8
+B:TOUCH:EXP_40
+F:FORCE_SLEEP | FRIENDS | DROP_60 |
+F:COLD_BLOOD | OPEN_DOOR | BASH_DOOR | CAN_FLY |
+F:EVIL | UNDEAD | IM_COLD | IM_POIS | HURT_LITE |
+F:NO_CONF | NO_SLEEP | BASEANGBAND | NO_CUT
+S:1_IN_8 |
+S:HOLD | SCARE | CAUSE_3 | DARKNESS
+D:An evil spirit from the marshlands, related to the mewlips.
+
+N:1078:Knight of the Swan
+# Basically a high-elven ranger with more melee and no distance attacks.
+G:p:w
+I:120:50d30:20:70:0
+W:40:3:1400:500
+E:1:1:1:2:1:1
+O:0:0:0:0
+B:HIT:HURT:10d8
+B:HIT:HURT:10d8
+B:HIT:HURT:10d8
+B:HIT:HURT:10d8
+F:MALE | FRIENDS | OPEN_DOOR | BASH_DOOR |
+F:GOOD | DROP_SKELETON | DROP_CORPSE | SMART | PET |
+F:IM_ACID | IM_COLD | RES_WATE | RES_NETH |
+F:MORTAL | BASEANGBAND | HAS_LITE
+D:A stately man dressed in armour emblazoned with a picture of a beautiful
+D:white swan, from Dol Amroth of old.
+
+# Infernal Device -- created for the Orthanc special level in Isengard by Burb Lulls
+# Heavily tweaked by furiosity for the Theme module
+N:1079:Infernal Device
+G:*:R
+I:110:75d20:20:80:50
+W:38:3:7000:1500
+E:0:0:0:0:0:0
+O:0:0:0:0
+B:EXPLODE:HURT:20d20
+B:EXPLODE:HURT:20d20
+B:EXPLODE:HURT:20d20
+B:EXPLODE:HURT:20d20
+F:FORCE_MAXHP | NEVER_MOVE | IM_FIRE | IM_POIS | BASEANGBAND
+F:NO_FEAR | NO_STUN | NO_CUT | NO_SLEEP | NO_CONF | RES_TELE
+F:RES_NETH | AURA_FIRE | STUPID | EMPTY_MIND | NONLIVING
+F:SPECIAL_GENE | FORCE_DEPTH | SUSCEP_COLD
+D:An ensorcelled machine of Saruman's creation, this gnarled
+D:totem of blackened steel defends Orthanc from intruders. \ No newline at end of file
diff --git a/lib/mods/theme/edit/ra_info.txt b/lib/mods/theme/edit/ra_info.txt
new file mode 100644
index 00000000..705db243
--- /dev/null
+++ b/lib/mods/theme/edit/ra_info.txt
@@ -0,0 +1,1985 @@
+# File: ra_info.txt
+
+
+# This file is used to initialize the "lib/raw/ra_info.raw" file, which is
+# used to initialize the "randart parts" information for the Angband game.
+
+# 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/ra_info.raw" file.
+
+# N:index
+# X:power value:max number of time it can appear on one object
+# T:tval:min sval:max sval (up to 20 T: lines)
+# W:mininum player level to create it:rarity1:rarity2
+# C:max to dam:max to hit:max to AC:max to pval
+# F:flags
+
+# Version stamp (required)
+
+V:2.0.0
+
+# General info, number of powers
+G:100:1d5:1
+G:14:0d0:1
+G:10:0d0:1
+G:3:0d0:1
+
+### Mage Staff randarts ###
+
+N:1
+X:10:1
+T:6:0:255
+W:5:1:4
+C:-5:-5:0:5
+F:MANA
+
+N:2
+X:14:1
+T:6:0:255
+W:10:1:8
+C:-10:-10:0:5
+F:SPELL
+
+N:3
+X:5:1
+T:6:0:255
+W:1:1:4
+C:-3:-3:0:5
+F:INT
+
+### Weapons ###
+
+# + To damage
+N:4
+X:5:2
+T:15:0:255
+T:16:0:255
+T:17:0:255
+T:18:0:255
+T:19:0:255
+T:22:0:255
+T:24:0:255
+T:115:55:55
+W:1:1:2
+C:10:0:0:0
+
+# + To Damage for swords
+N:5
+X:5:2
+T:23:0:255
+T:115:55:55
+W:1:1:2
+C:9:0:0:0
+
+# + To damage for hafted weapons
+N:6
+X:5:2
+T:21:0:255
+W:1:1:2
+C:11:0:0:0
+
+# + To hit
+N:7
+X:5:2
+T:15:0:255
+T:16:0:255
+T:17:0:255
+T:18:0:255
+T:19:0:255
+T:22:0:255
+T:24:0:255
+T:115:55:55
+W:1:1:2
+C:0:10:0:0
+
+# + To Hit for swords
+N:8
+X:5:2
+T:23:0:255
+T:115:55:55
+W:1:1:2
+C:0:11:0:0
+
+# + To Hit for hafted weapons
+N:9
+X:5:2
+T:21:0:255
+W:1:1:2
+C:0:9:0:0
+
+N:10
+X:15:1
+T:24:0:255
+T:115:55:55
+W:15:1:25
+C:4:0:0:0
+F:VORPAL
+
+N:11
+X:15:1
+T:23:2:2
+T:23:9:9
+T:23:11:33
+T:115:55:55
+W:15:1:25
+C:2:2:0:0
+F:VORPAL
+
+N:12
+X:15:1
+T:22:30:30
+W:10:1:16
+C:6:-2:0:0
+F:VORPAL
+
+N:13
+X:15:1
+T:22:17:17
+T:22:3:3
+T:22:0:15
+W:15:1:25
+C:4:0:0:0
+F:VORPAL
+
+N:14
+X:10:1
+T:15:0:255
+T:16:0:255
+T:17:0:255
+T:18:0:255
+T:22:0:255
+T:24:0:255
+T:115:55:55
+W:4:1:10
+C:5:2:0:0
+F:BRAND_POIS
+
+N:15
+X:10:1
+T:23:0:255
+T:115:55:55
+W:4:1:10
+C:4:3:0:0
+F:BRAND_POIS
+
+N:16
+X:10:1
+T:21:0:255
+W:4:1:10
+C:5:2:0:0
+F:BRAND_POIS
+
+N:17
+X:11:1
+T:15:0:255
+T:16:0:255
+T:17:0:255
+T:18:0:255
+T:22:0:255
+T:24:0:255
+W:5:1:11
+C:3:1:0:0
+F:BRAND_FIRE
+A:BRAND_COLD
+
+N:18
+X:11:1
+T:23:0:255
+T:115:55:55
+W:5:1:11
+C:2:2:0:0
+F:BRAND_FIRE
+A:BRAND_COLD
+
+N:19
+X:11:1
+T:21:0:255
+W:5:1:11
+C:4:0:0:0
+F:BRAND_FIRE
+A:BRAND_COLD
+
+N:20
+X:12:1
+T:15:0:255
+T:16:0:255
+T:17:0:255
+T:18:0:255
+T:22:0:255
+T:24:0:255
+W:5:1:11
+C:5:1:0:0
+F:BRAND_COLD
+A:BRAND_FIRE
+
+N:21
+X:12:1
+T:23:0:255
+T:115:55:55
+W:5:1:11
+C:4:2:0:0
+F:BRAND_COLD
+A:BRAND_FIRE
+
+N:22
+X:12:1
+T:21:0:255
+W:5:1:11
+C:6:0:0:0
+F:BRAND_COLD
+A:BRAND_FIRE
+
+N:23
+X:13:1
+T:15:0:255
+T:16:0:255
+T:17:0:255
+T:18:0:255
+T:22:0:255
+T:24:0:255
+W:5:1:13
+C:4:0:0:0
+F:BRAND_ELEC
+
+N:24
+X:13:1
+T:23:0:255
+T:115:55:55
+W:5:1:13
+C:3:1:0:0
+F:BRAND_ELEC
+
+N:25
+X:13:1
+T:21:0:255
+W:5:1:13
+C:5:-1:0:0
+F:BRAND_ELEC
+
+N:26
+X:15:1
+T:15:0:255
+T:16:0:255
+T:17:0:255
+T:18:0:255
+T:22:0:255
+T:24:0:255
+W:7:1:15
+C:3:0:0:0
+F:BRAND_ACID
+
+N:27
+X:15:1
+T:23:0:255
+T:115:55:55
+W:7:1:15
+C:2:1:0:0
+F:BRAND_ACID
+
+N:28
+X:15:1
+T:21:0:255
+W:7:1:15
+C:4:0:0:0
+F:BRAND_ACID
+
+N:29
+X:5:1
+T:21:0:255
+W:15:1:35
+C:15:2:0:0
+F:IMPACT
+
+N:30
+X:5:1
+T:18:0:255
+T:19:0:255
+T:22:0:255
+T:24:0:255
+W:2:1:9
+C:2:2:0:6
+F:STR
+
+N:31
+X:5:1
+T:23:0:255
+T:115:55:55
+W:2:1:9
+C:0:4:0:6
+F:STR
+
+N:32
+X:5:1
+T:21:0:255
+W:1:1:7
+C:4:0:0:6
+F:STR
+
+N:33
+X:3:1
+T:18:0:255
+T:19:0:255
+T:20:0:255
+T:22:0:255
+T:24:0:255
+W:1:1:6
+C:0:0:0:6
+F:CHR
+
+N:34
+X:3:1
+T:23:0:255
+T:115:55:55
+W:2:1:6
+C:-1:1:0:6
+F:CHR
+
+N:35
+X:2:1
+T:21:0:255
+W:2:1:6
+C:1:-1:0:5
+F:CHR
+
+N:36
+X:4:1
+T:18:0:255
+T:19:0:255
+T:20:0:255
+T:22:0:255
+T:24:0:255
+W:2:1:8
+C:0:0:0:4
+F:INT
+
+N:37
+X:4:1
+T:21:0:255
+W:2:1:8
+C:1:-1:0:4
+F:INT
+
+N:38
+X:4:1
+T:23:0:255
+T:115:55:55
+W:2:1:8
+C:-1:1:0:4
+F:INT
+
+N:39
+X:6:1
+T:18:0:255
+T:19:0:255
+T:20:0:255
+T:22:0:255
+T:24:0:255
+W:3:1:10
+C:0:0:0:6
+F:CON
+
+N:40
+X:6:1
+T:23:0:255
+T:115:55:55
+W:3:1:10
+C:-1:1:0:6
+F:CON
+
+N:41
+X:6:1
+T:21:0:255
+C:1:-1:0:6
+F:CON
+
+N:42
+X:4:1
+T:18:0:255
+T:19:0:255
+T:20:0:255
+T:22:0:255
+T:24:0:255
+W:2:1:8
+C:0:0:0:5
+F:WIS
+
+N:43
+X:4:1
+T:21:0:255
+W:2:1:9
+C:1:-1:0:6
+F:WIS
+
+N:44
+X:4:1
+T:23:0:255
+T:115:55:55
+W:2:1:9
+C:-1:1:0:5
+F:WIS
+
+N:45
+X:4:1
+T:18:0:255
+T:19:0:255
+T:20:0:255
+T:22:0:255
+T:24:0:255
+W:2:1:7
+C:0:0:0:5
+F:DEX
+
+N:46
+X:4:1
+T:23:0:255
+T:115:55:55
+W:2:1:7
+C:-1:1:0:6
+F:DEX
+
+N:47
+X:4:1
+T:21:0:255
+W:2:1:7
+C:1:-1:0:5
+F:DEX
+
+N:48
+X:4:1
+T:21:0:255
+W:9:1:14
+C:3:0:0:6
+F:TUNNEL
+
+N:49
+X:40:1
+T:22:0:255
+T:24:0:255
+W:30:1:100
+C:0:-4:0:3
+F:BLOWS
+
+N:50
+X:40:1
+T:23:0:255
+T:115:55:55
+W:30:1:100
+C:-1:-3:0:3
+F:BLOWS
+
+N:51
+X:40:1
+T:21:0:255
+W:30:1:100
+C:1:-5:0:3
+F:BLOWS
+
+N:52
+X:50:1
+T:18:0:255
+T:19:0:255
+T:22:0:255
+T:24:0:255
+W:40:1:90
+C:-2:-2:0:5
+F:SPEED
+
+N:53
+X:50:1
+T:21:0:255
+W:40:1:90
+C:-1:-3:0:5
+F:SPEED
+
+N:54
+X:50:1
+T:23:0:255
+T:115:55:55
+W:40:1:90
+C:-3:-1:0:5
+F:SPEED
+
+N:55
+X:12:1
+T:18:0:255
+T:22:0:255
+T:21:0:255
+T:23:0:255
+T:24:0:255
+T:115:55:55
+W:11:1:20
+C:10:10:0:0
+F:CHAOTIC
+
+N:56
+X:8:1
+T:18:0:255
+T:21:0:255
+T:22:0:255
+T:23:0:255
+T:24:0:255
+T:115:55:55
+W:11:1:20
+C:-10:-10:0:0
+F:CHAOTIC
+
+N:57
+X:12:1
+T:18:0:255
+T:22:0:255
+T:24:0:255
+W:15:1:20
+C:4:0:0:4
+F:VAMPIRIC
+
+N:58
+X:12:1
+T:21:0:255
+W:15:1:20
+C:5:-1:0:0
+F:VAMPIRIC
+
+N:59
+X:12:1
+T:23:0:19
+T:115:55:55
+W:15:1:20
+C:3:1:0:4
+F:VAMPIRIC
+
+N:60
+X:11:1
+T:15:0:255
+T:16:0:255
+T:17:0:255
+T:18:0:255
+T:22:0:255
+T:24:0:255
+W:10:1:10
+C:0:0:0:0
+F:SLAY_ANIMAL
+
+N:61
+X:11:1
+T:21:0:255
+W:10:1:10
+C:1:-1:0:0
+F:SLAY_ANIMAL
+
+N:62
+X:11:1
+T:23:0:255
+T:115:55:55
+W:10:1:10
+C:-1:1:0:0
+F:SLAY_ANIMAL
+
+N:63
+X:19:1
+T:15:0:255
+T:16:0:255
+T:17:0:255
+T:18:0:255
+T:22:0:255
+T:24:0:255
+W:15:1:17
+C:0:0:0:0
+F:SLAY_EVIL
+
+N:64
+X:19:1
+T:21:0:255
+W:15:1:15
+C:1:-1:0:0
+F:SLAY_EVIL
+
+N:65
+X:19:1
+T:23:0:255
+T:115:55:55
+W:15:1:17
+C:-1:1:0:0
+F:SLAY_EVIL
+
+N:66
+X:15:1
+T:15:0:255
+T:16:0:255
+T:17:0:255
+T:18:0:255
+T:22:0:255
+T:24:0:255
+W:13:1:15
+C:0:0:0:0
+F:SLAY_UNDEAD
+A:KILL_UNDEAD
+
+N:67
+X:15:1
+T:21:0:255
+W:13:1:15
+C:1:-1:0:0
+F:SLAY_UNDEAD
+A:KILL_UNDEAD
+
+N:68
+X:15:1
+T:23:0:255
+T:115:55:55
+W:13:1:15
+C:-1:1:0:0
+F:SLAY_UNDEAD
+A:KILL_UNDEAD
+
+N:69
+X:5:1
+T:15:0:255
+T:16:0:255
+T:17:0:255
+T:18:0:255
+T:22:0:255
+T:24:0:255
+W:11:1:25
+C:0:0:0:0
+F:SLAY_DEMON
+A:KILL_DEMON
+
+N:70
+X:5:1
+T:21:0:255
+W:11:1:25
+C:1:-1:0:0
+F:SLAY_DEMON
+A:KILL_DEMON
+
+N:71
+X:5:1
+T:23:0:255
+T:115:55:55
+W:11:1:25
+C:-1:1:0:0
+F:SLAY_DEMON
+A:KILL_DEMON
+
+N:72
+X:10:1
+T:15:0:255
+T:16:0:255
+T:17:0:255
+T:18:0:255
+T:22:0:255
+T:24:0:255
+W:3:1:10
+C:0:0:0:0
+F:SLAY_ORC
+
+N:73
+X:10:1
+T:21:0:255
+W:3:1:10
+C:1:-1:0:0
+F:SLAY_ORC
+
+N:74
+X:10:1
+T:23:0:255
+T:115:55:55
+W:3:1:10
+C:-1:1:0:0
+F:SLAY_ORC
+
+N:75
+X:11:1
+T:15:0:255
+T:16:0:255
+T:17:0:255
+T:18:0:255
+T:22:0:255
+T:24:0:255
+W:15:2:17
+C:0:0:0:0
+F:SLAY_TROLL
+
+N:76
+X:11:1
+T:21:0:255
+W:15:2:17
+C:1:-1:0:0
+F:SLAY_TROLL
+
+N:77
+X:11:1
+T:23:0:255
+T:115:55:55
+W:15:2:17
+C:-1:1:0:0
+F:SLAY_TROLL
+
+N:78
+X:10:1
+T:15:0:255
+T:16:0:255
+T:17:0:255
+T:18:0:255
+T:22:0:255
+T:24:0:255
+W:20:1:20
+C:0:0:0:0
+F:SLAY_GIANT
+
+N:79
+X:10:1
+T:21:0:255
+W:20:1:20
+C:-1:1:0:0
+F:SLAY_GIANT
+
+N:80
+X:10:1
+T:23:0:255
+T:115:55:55
+W:20:1:20
+C:0:0:0:0
+F:SLAY_GIANT
+
+N:81
+X:20:1
+T:15:0:255
+T:16:0:255
+T:17:0:255
+T:18:0:255
+T:22:0:255
+T:24:0:255
+W:17:1:20
+C:0:0:0:0
+F:SLAY_DRAGON
+A:KILL_DRAGON
+
+N:82
+X:20:1
+T:21:0:255
+W:17:1:20
+C:1:-1:0:0
+F:SLAY_DRAGON
+A:KILL_DRAGON
+
+N:83
+X:20:1
+T:23:0:255
+T:115:55:55
+C:-1:1:0:0
+W:17:1:20
+F:SLAY_DRAGON
+A:KILL_DRAGON
+
+N:84
+X:31:1
+T:15:0:255
+T:16:0:255
+T:17:0:255
+T:18:0:255
+T:22:0:255
+T:24:0:255
+W:17:1:35
+C:0:0:0:0
+F:KILL_DRAGON
+A:SLAY_DRAGON
+
+N:85
+X:31:1
+T:21:0:255
+W:17:1:35
+C:1:-1:0:0
+F:KILL_DRAGON
+A:SLAY_DRAGON
+
+N:86
+X:31:1
+T:23:0:255
+T:115:55:55
+W:17:1:35
+C:-1:1:0:0
+F:KILL_DRAGON
+A:SLAY_DRAGON
+
+N:87
+X:15:1
+T:18:0:255
+T:22:0:255
+T:24:0:255
+W:5:1:10
+C:-2:-2:0:0
+F:BLESSED
+A:CURSED
+
+N:88
+X:15:1
+T:21:0:255
+W:5:1:7
+C:-1:-3:0:0
+F:BLESSED
+A:CURSED
+
+N:89
+X:15:1
+T:23:0:255
+T:115:55:55
+W:5:1:10
+C:-3:-1:0:0
+F:BLESSED
+A:CURSED
+
+N:90
+X:-5:1
+T:15:0:255
+T:16:0:255
+T:18:0:255
+T:19:0:255
+T:21:0:255
+T:22:0:255
+T:23:0:255
+T:24:0:255
+T:115:55:55
+W:1:1:20
+C:0:0:0:0
+F:CURSED
+A:BLESSED
+
+N:93
+X:-10:1
+T:18:0:255
+T:19:0:255
+T:20:0:255
+T:21:0:255
+T:22:0:255
+T:23:0:255
+T:24:0:255
+T:115:55:55
+W:1:1:20
+C:0:0:0:0
+F:AGGRAVATE
+A:STEALTH
+
+N:94
+X:13:1
+T:18:0:255
+T:19:0:255
+T:20:0:255
+T:21:0:255
+T:22:0:255
+T:23:0:255
+T:24:0:255
+T:115:55:55
+W:1:1:15
+C:0:0:0:0
+F:LITE1
+A:RES_LITE
+
+N:95
+X:40:1
+T:19:0:255
+W:20:1:38
+C:0:0:0:3
+F:XTRA_MIGHT
+
+N:96
+X:40:1
+T:19:0:255
+W:20:1:38
+C:0:0:0:0
+F:XTRA_SHOTS
+
+N:97
+X:25:1
+T:23:0:255
+T:24:0:255
+T:22:17:17
+T:22:3:3
+T:22:0:15
+T:115:55:55
+W:14:1:23
+C:3:0:0:0
+F:WOUNDING
+
+N:98
+X:60:1
+T:15:0:255
+T:16:0:255
+T:17:0:255
+T:18:0:255
+T:21:0:255
+T:22:0:255
+T:23:0:255
+T:24:0:255
+T:115:55:55
+W:27:1:50
+C:0:0:0:0
+F:KILL_UNDEAD
+A:SLAY_UNDEAD
+
+N:99
+X:45:1
+T:15:0:255
+T:16:0:255
+T:17:0:255
+T:18:0:255
+T:21:0:255
+T:22:0:255
+T:23:0:255
+T:24:0:255
+T:115:55:55
+W:25:1:34
+C:0:0:0:0
+F:KILL_DEMON
+A:SLAY_DEMON
+
+N:100
+X:20:1
+T:18:0:255
+T:21:0:255
+T:22:0:255
+T:23:0:255
+T:24:0:255
+T:115:55:55
+W:15:1:25
+C:2:0:0:0
+Z:BERSERK
+
+N:101
+X:15:1
+T:20:0:255
+T:21:0:255
+W:20:1:35
+C:0:0:0:0
+Z:EARTHQUAKE
+
+N:102
+X:5:1
+T:20:0:255
+W:2:1:9
+C:0:0:0:6
+F:STR
+
+
+### Armor ###
+
+N:295
+X:60:1
+T:36:0:255
+T:37:0:255
+W:20:1:90
+C:-70:-70:0:2
+F:LIFE
+
+N:296
+X:7:1
+T:30:0:255
+T:31:0:255
+T:32:0:255
+T:33:0:255
+T:34:0:255
+T:115:56:57
+T:35:0:255
+T:36:0:255
+T:37:0:255
+T:38:0:255
+W:1:1:14
+C:0:0:0:0
+F:SUST_STR
+
+N:297
+X:6:1
+T:30:0:255
+T:31:0:255
+T:32:0:255
+T:33:0:255
+T:34:0:255
+T:115:56:57
+T:35:0:255
+T:36:0:255
+T:37:0:255
+T:38:0:255
+T:6:0:255
+W:1:1:12
+C:0:0:0:0
+F:SUST_INT
+
+N:298
+X:6:1
+T:30:0:255
+T:31:0:255
+T:32:0:255
+T:33:0:255
+T:34:0:255
+T:115:56:57
+T:35:0:255
+T:36:0:255
+T:37:0:255
+T:38:0:255
+T:6:0:255
+W:1:1:12
+C:0:0:0:0
+F:SUST_WIS
+
+N:299
+X:5:1
+T:30:0:255
+T:31:0:255
+T:32:0:255
+T:33:0:255
+T:34:0:255
+T:115:56:57
+T:35:0:255
+T:36:0:255
+T:37:0:255
+T:38:0:255
+W:1:1:11
+C:0:0:1:0
+F:SUST_DEX
+
+N:300
+X:9:1
+T:30:0:255
+T:31:0:255
+T:32:0:255
+T:33:0:255
+T:34:0:255
+T:115:56:57
+T:35:0:255
+T:36:0:255
+T:37:0:255
+T:38:0:255
+W:1:1:16
+C:0:0:0:0
+F:SUST_CON
+
+N:301
+X:4:1
+T:30:0:255
+T:31:0:255
+T:32:0:255
+T:33:0:255
+T:34:0:255
+T:115:56:57
+T:35:0:255
+T:36:0:255
+T:37:0:255
+T:38:0:255
+W:1:1:9
+C:0:0:0:0
+F:SUST_CHR
+
+N:302
+X:50:1
+T:36:0:255
+T:37:0:255
+T:38:0:255
+W:30:1:70
+C:0:0:0:0
+F:IM_ACID
+
+N:303
+X:50:1
+T:34:0:255
+T:115:56:56
+W:30:1:90
+C:0:0:0:0
+F:IM_ACID
+
+N:304
+X:50:1
+T:35:0:255
+W:30:1:80
+C:0:0:0:0
+F:IM_ACID
+
+N:305
+X:45:1
+T:36:0:255
+T:37:0:255
+T:38:0:255
+W:30:1:78
+F:IM_ELEC
+
+N:306
+X:45:1
+T:34:0:255
+T:115:56:56
+W:30:1:98
+C:0:0:0:0
+F:IM_ELEC
+
+N:307
+X:45:1
+T:35:0:255
+W:30:1:88
+C:0:0:0:0
+F:IM_ELEC
+
+N:308
+X:55:1
+T:36:0:255
+T:37:0:255
+T:38:0:255
+W:30:1:86
+C:0:0:0:0
+F:IM_FIRE
+
+N:309
+X:55:1
+T:34:0:255
+T:115:56:56
+T:35:0:255
+W:30:1:95
+C:0:0:0:0
+F:IM_FIRE
+
+N:310
+X:47:1
+T:36:0:255
+T:37:0:255
+T:38:0:255
+W:30:1:90
+C:0:0:0:0
+F:IM_COLD
+
+N:311
+X:47:1
+T:34:0:255
+T:115:56:56
+T:35:0:255
+W:30:1:90
+C:0:0:0:0
+F:IM_COLD
+
+N:312
+X:47:1
+T:35:3:3
+W:30:1:100
+C:0:0:0:0
+F:IM_COLD
+
+N:313
+X:35:1
+T:34:0:255
+T:38:0:255
+T:115:56:56
+W:20:1:45
+C:0:0:0:0
+F:REFLECT
+
+N:314
+X:35:1
+T:34:10:10
+T:115:56:56
+W:10:1:15
+C:0:0:0:0
+F:REFLECT
+
+N:315
+X:17:1
+T:30:0:255
+T:31:0:255
+T:32:0:255
+T:33:0:255
+T:34:0:255
+T:115:56:57
+T:35:0:255
+T:36:0:255
+T:37:0:255
+T:38:0:255
+T:40:0:255
+T:45:0:255
+T:6:0:255
+W:5:1:7
+C:0:0:0:0
+F:FREE_ACT
+
+N:316
+X:23:1
+T:30:0:255
+T:31:0:255
+T:32:0:255
+T:33:0:255
+T:34:0:255
+T:115:56:57
+T:35:0:255
+T:36:0:255
+T:37:0:255
+T:38:0:255
+W:8:1:14
+C:0:0:0:0
+F:HOLD_LIFE
+
+N:317
+X:15:1
+T:30:0:255
+T:31:0:255
+T:32:0:255
+T:33:0:255
+T:34:0:255
+T:115:56:57
+T:35:0:255
+T:36:0:255
+T:37:0:255
+T:38:0:255
+T:40:0:255
+T:45:0:255
+W:1:1:10
+C:0:0:0:0
+F:RES_ACID
+
+N:318
+X:15:1
+T:30:0:255
+T:31:0:255
+T:32:0:255
+T:33:0:255
+T:34:0:255
+T:115:56:57
+T:35:0:255
+T:36:0:255
+T:37:0:255
+T:38:0:255
+T:40:0:255
+T:45:0:255
+W:1:1:10
+C:0:0:0:0
+F:RES_FIRE
+
+N:319
+X:13:1
+T:30:0:255
+T:31:0:255
+T:32:0:255
+T:33:0:255
+T:34:0:255
+T:115:56:57
+T:35:0:255
+T:36:0:255
+T:37:0:255
+T:38:0:255
+T:40:0:255
+T:45:0:255
+W:1:1:9
+C:0:0:0:0
+F:RES_ELEC
+
+N:320
+X:12:1
+T:30:0:255
+T:31:0:255
+T:32:0:255
+T:33:0:255
+T:34:0:255
+T:115:56:57
+T:35:0:255
+T:36:0:255
+T:37:0:255
+T:38:0:255
+T:40:0:255
+T:45:0:255
+W:1:1:8
+C:0:0:0:0
+F:RES_COLD
+
+N:321
+X:20:1
+T:30:0:255
+T:31:0:255
+T:32:0:255
+T:33:0:255
+T:34:0:255
+T:115:56:57
+T:35:0:255
+T:36:0:255
+T:37:0:255
+T:38:0:255
+T:40:0:255
+T:45:0:255
+W:5:1:18
+C:0:0:0:0
+F:RES_POIS
+
+N:322
+X:15:1
+T:30:0:255
+T:31:0:255
+T:32:0:255
+T:33:0:255
+T:34:0:255
+T:115:56:57
+T:35:0:255
+T:36:0:255
+T:37:0:255
+T:38:0:255
+T:40:0:255
+T:45:0:255
+W:6:1:15
+C:0:0:0:0
+F:RES_FEAR
+
+N:323
+X:10:1
+T:30:0:255
+T:31:0:255
+T:33:0:255
+T:34:0:255
+T:115:56:56
+T:35:0:255
+T:36:0:255
+T:37:0:255
+T:38:0:255
+T:40:0:255
+T:45:0:255
+W:5:1:10
+C:0:0:0:0
+F:RES_LITE
+
+N:324
+X:10:1
+T:32:0:255
+T:115:57:57
+W:1:1:7
+C:0:0:0:0
+F:RES_LITE
+
+N:325
+X:15:1
+T:32:0:255
+T:115:57:57
+W:5:1:15
+C:0:0:0:0
+F:LITE1
+A:RES_LITE
+
+N:326
+X:17:1
+T:32:0:255
+T:115:57:57
+W:10:1:20
+C:0:0:0:0
+F:LITE2
+A:RES_LITE
+
+N:327
+X:20:1
+T:32:0:255
+T:115:57:57
+W:15:1:25
+C:0:0:0:0
+F:LITE3
+A:RES_LITE
+
+N:328
+X:15:1
+T:30:0:255
+T:31:0:255
+T:32:0:255
+T:33:0:255
+T:34:0:255
+T:115:56:57
+T:35:0:255
+T:36:0:255
+T:37:0:255
+T:38:0:255
+T:40:0:255
+T:45:0:255
+W:10:1:15
+C:0:0:0:0
+F:RES_DARK
+
+N:329
+X:20:1
+T:115:57:57
+T:32:0:255
+T:40:0:255
+T:45:0:255
+T:6:0:255
+W:13:1:27
+C:0:0:0:0
+F:RES_BLIND
+
+N:330
+X:17:1
+T:30:0:255
+T:31:0:255
+T:32:0:255
+T:33:0:255
+T:34:0:255
+T:115:56:57
+T:35:0:255
+T:36:0:255
+T:37:0:255
+T:38:0:255
+T:40:0:255
+T:45:0:255
+W:13:1:18
+C:0:0:0:0
+F:RES_SOUND
+
+N:331
+X:15:1
+T:30:0:255
+T:31:0:255
+T:32:0:255
+T:33:0:255
+T:115:56:57
+T:34:0:255
+T:35:0:255
+T:36:0:255
+T:37:0:255
+T:38:0:255
+T:40:0:255
+T:45:0:255
+W:17:1:15
+C:0:0:0:0
+F:RES_NEXUS
+
+N:332
+X:19:1
+T:30:0:255
+T:31:0:255
+T:32:0:255
+T:33:0:255
+T:34:0:255
+T:115:56:57
+T:35:0:255
+T:36:0:255
+T:37:0:255
+T:38:0:255
+T:40:0:255
+T:45:0:255
+W:16:1:19
+C:0:0:0:0
+F:RES_SHARDS
+
+N:333
+X:30:1
+T:30:0:255
+T:31:0:255
+T:32:0:255
+T:33:0:255
+T:34:0:255
+T:115:56:57
+T:35:0:255
+T:36:0:255
+T:37:0:255
+T:38:0:255
+T:40:0:255
+T:45:0:255
+W:30:1:50
+C:0:0:0:0
+F:RES_NETHER
+
+N:334
+X:25:1
+T:30:0:255
+T:31:0:255
+T:32:0:255
+T:33:0:255
+T:34:0:255
+T:115:56:57
+T:35:0:255
+T:36:0:255
+T:37:0:255
+T:38:0:255
+T:40:0:255
+T:45:0:255
+W:25:1:30
+F:RES_CHAOS
+
+N:335
+X:20:1
+T:30:0:255
+T:31:0:255
+T:32:0:255
+T:33:0:255
+T:34:0:255
+T:115:56:57
+T:35:0:255
+T:36:0:255
+T:37:0:255
+T:38:0:255
+T:40:0:255
+T:45:0:255
+T:6:0:255
+W:25:1:35
+C:0:0:0:0
+F:RES_CONF
+
+N:336
+X:25:1
+T:30:0:255
+T:31:0:255
+T:32:0:255
+T:33:0:255
+T:34:0:255
+T:115:56:57
+T:35:0:255
+T:36:0:255
+T:37:0:255
+T:38:0:255
+T:40:0:255
+T:45:0:255
+C:0:0:0:0
+W:23:1:32
+F:RES_DISEN
+
+N:337
+X:20:1
+T:35:0:255
+W:10:1:17
+C:0:0:0:0
+F:SH_FIRE | RES_FIRE
+
+N:338
+X:22:1
+T:35:0:255
+W:10:1:20
+C:0:0:0:0
+F:SH_ELEC | RES_ELEC
+
+N:339
+X:18:1
+T:115:57:57
+T:32:0:255
+T:33:0:255
+T:40:0:255
+T:45:0:255
+T:6:0:255
+W:5:1:15
+C:0:0:0:0
+F:SEE_INVIS
+
+N:340
+X:14:1
+T:30:0:255
+T:40:0:255
+T:45:0:255
+W:5:1:13
+C:0:0:0:0
+F:FEATHER
+A:FLY
+
+N:341
+X:80:1
+T:35:0:255
+T:30:0:255
+T:6:0:255
+W:40:1:90
+C:0:0:0:0
+F:FLY
+A:FEATHER
+
+N:342
+X:30:1
+T:115:57:57
+T:32:0:255
+T:33:0:255
+W:20:1:30
+C:0:0:0:0
+Z:MIND BLAST
+
+N:343
+X:30:1
+T:115:57:57
+T:32:0:255
+T:33:0:255
+W:20:1:30
+C:0:0:0:0
+Z:TELEKINESIS
+
+N:344
+X:35:1
+T:31:0:255
+W:25:1:40
+C:0:0:0:0
+Z:MIDAS TOUCH
+
+N:345
+X:15:1
+T:31:0:255
+C:0:0:0:0
+Z:COLD TOUCH
+
+N:346
+X:30:1
+T:35:0:255
+W:20:1:27
+C:0:0:0:0
+Z:BLINK
+A:RES_NEXUS
+
+### + To AC ###
+N:347
+X:15:4
+T:30:0:255
+T:31:0:255
+T:32:0:255
+T:33:0:255
+T:34:0:255
+T:115:56:57
+T:35:0:255
+T:36:0:255
+T:37:0:255
+T:38:0:255
+T:6:0:255
+W:1:1:5
+C:0:0:5:0
+
+### + To Dam (Only Gloves) ###
+N:348
+X:40:1
+T:31:0:255
+W:1:1:45
+C:10:0:0:0
+
+### + To Hit (Only Gloves) ###
+N:349
+X:35:1
+T:31:0:255
+W:1:1:40
+C:0:10:0:0
+
+# N:index
+# X:power value:max number of time it can appear on one object
+# T:tval:min sval:max sval (up to 20 T: lines)
+# W:mininum player level to create it:rarity1:rarity2
+# C:max to dam:max to hit:max to AC:max to pval
+# F:flags
+
+# Helm of water breathing
+N:350
+X:50:1
+T:32:5:10
+W:20:1:25
+C:0:0:0:0
+F:WATER_BREATH
+
+
+### Amulets And Rings ###
+N:442
+X:15:1
+T:40:0:255
+T:45:0:255
+W:5:1:17
+C:0:0:0:5
+F:STR
+
+N:443
+X:11:1
+T:40:0:255
+T:45:0:255
+W:3:1:12
+C:0:0:0:5
+F:DEX
+
+N:444
+X:13:1
+T:40:0:255
+T:45:0:255
+W:5:1:15
+C:0:0:0:5
+F:WIS
+
+N:445
+X:13:1
+T:40:0:255
+T:45:0:255
+W:1:1:15
+C:0:0:0:5
+F:INT
+
+N:446
+X:7:1
+T:40:0:255
+T:45:0:255
+W:1:1:15
+C:0:0:0:5
+F:CHR
+
+N:447
+X:18:1
+T:40:0:255
+T:45:0:255
+W:7:1:20
+C:0:0:0:5
+F:CON
+
+N:448
+X:15:1
+T:40:0:255
+T:45:0:255
+W:5:1:15
+C:0:0:0:0
+F:SUST_STR
+
+N:449
+X:20:1
+T:40:0:255
+T:45:0:255
+W:7:1:20
+C:0:0:0:0
+F:SUST_CON
+
+N:450
+X:7:1
+T:40:0:255
+T:45:0:255
+W:1:1:15
+F:SUST_CHR
+
+N:451
+X:11:1
+T:40:0:255
+T:45:0:255
+W:1:1:11
+F:SUST_DEX
+
+N:452
+X:13:1
+T:40:0:255
+T:45:0:255
+W:5:1:13
+F:SUST_INT
+
+N:453
+X:13:1
+T:40:0:255
+T:45:0:255
+W:5:1:13
+F:SUST_WIS
+
+N:454
+X:40:1
+T:45:0:255
+C:0:0:0:5
+W:25:1:55
+F:INVIS
+
+N:455
+X:70:1
+T:45:0:255
+C:0:0:0:5
+W:40:1:90
+F:SPEED
+
+N:456
+X:17:1
+T:40:0:255
+T:45:0:255
+W:5:1:16
+C:0:0:0:0
+F:SLOW_DIGEST
+A:REGEN
+
+N:457
+X:20:1
+T:40:0:255
+T:45:0:255
+W:7:1:19
+C:0:0:0:0
+F:REGEN
+A:SLOW_DIGEST
+
+N:458
+X:15:1
+T:40:0:255
+T:45:0:255
+T:35:0:255
+W:10:1:16
+C:0:0:0:4
+F:STEALTH
+A:AGGRAVATE
+
+N:459
+X:7:1
+T:40:0:255
+T:45:0:255
+W:1:1:12
+C:0:0:0:6
+F:SEARCH
+
+N:460
+X:10:1
+T:40:0:255
+T:45:0:255
+W:1:1:12
+C:0:0:0:4
+F:INFRA
+
+N:461
+X:80:1
+T:45:0:255
+W:40:1:95
+C:0:0:0:3
+F:BLOWS
+
+N:462
+X:70:1
+T:45:0:255
+W:38:1:75
+C:0:0:0:0
+F:FLY
+A:FEATHER
+
+N:463
+X:80:1
+T:45:0:255
+W:43:1:85
+C:0:0:0:5
+F:CRIT
+
+
+### Lights ###
+
+N:501
+X:15:1
+T:39:0:255
+T:6:0:255
+W:5:1:15
+F:LITE1
+
+N:502
+X:20:1
+T:39:0:255
+W:10:1:25
+C:0:0:0:0
+F:LITE2
+
+N:503
+X:30:1
+T:39:0:255
+W:20:1:35
+C:0:0:0:0
+F:LITE3
+
+N:504
+X:15:1
+T:39:0:255
+W:10:1:15
+C:0:0:0:0
+F:RES_LITE
+
+N:505
+X:18:1
+T:39:0:255
+W:11:1:17
+C:0:0:0:0
+F:RES_DARK
+
+N:506
+X:20:1
+T:39:0:255
+W:15:1:22
+C:0:0:0:0
+F:SEE_INVIS
+
+N:507
+X:12:1
+T:39:0:255
+W:1:1:10
+C:0:0:0:4
+F:SEARCH
+
+N:508
+X:12:1
+T:39:0:255
+W:1:1:15
+C:0:0:0:4
+F:INFRA
+
+N:509
+X:21:1
+T:39:0:255
+W:5:1:20
+C:0:0:0:0
+Z:illuminate
+
+N:510
+X:35:1
+T:39:0:255
+W:20:1:27
+C:0:0:0:0
+Z:magic map
+
+N:511
+X:30:1
+T:39:0:255
+W:20:1:24
+C:0:0:0:0
+Z:detect curses
+
+N:512
+X:25:1
+T:39:0:255
+W:20:1:17
+C:0:0:0:0
+Z:dazzle
+
+N:513
+X:40:1
+T:39:0:255
+W:20:1:50
+C:0:0:0:0
+Z:detect doors and traps
+
+# Magestaves can get % to life - Theme
+N:514
+X:10:1
+T:6:0:255
+W:10:1:45
+C:-40:-40:0:3
+F:LIFE
+
+# Magestaves, armour, lights and jewelry can get ability to store a spell - Theme
+N:515
+X:10:1
+T:6:0:255
+T:30:0:255
+T:31:0:255
+T:32:0:255
+T:33:0:255
+T:34:0:255
+T:35:0:255
+T:36:0:255
+T:37:0:255
+T:38:0:255
+T:39:0:255
+T:40:0:255
+T:45:0:255
+W:5:1:15
+C:0:0:0:0
+F:SPELL_CONTAIN | WIELD_CAST
+
+# High-level soft and hard armour and DSM can get nether immunity - Theme, adapted from FuryMod
+N:516
+X:50:1
+T:36:11:255
+T:37:15:255
+T:38:0:255
+W:30:1:90
+C:0:0:0:0
+F:IM_NETHER
+
+# Light weapons (no broken ones) can gain sentience - Theme, adapted from FuryMod
+N:517
+X:20:1
+T:21:1:3
+T:22:2:4
+T:23:4:10
+T:24:1:1
+T:24:7:7
+W:10:1:60
+C:0:0:0:0
+F:LEVELS
+
+# N:index
+# X:power value:max number of time it can appear on one object
+# T:tval:min sval:max sval (up to 20 T: lines)
+# W:mininum player level to create it:rarity1:rarity2
+# C:max to dam:max to hit:max to AC:max to pval
+# F:flags \ No newline at end of file
diff --git a/lib/mods/theme/edit/re_info.txt b/lib/mods/theme/edit/re_info.txt
new file mode 100644
index 00000000..c0e36a92
--- /dev/null
+++ b/lib/mods/theme/edit/re_info.txt
@@ -0,0 +1,183 @@
+# File: re_info.txt
+
+# This file is used to initialize the "lib/raw/re_info.raw" file, which is
+# used to initialize the "monster ego race" information for the Angband game.
+
+# Do not modify this file unless you know exactly what you are doing,
+# unless you wish to risk possible system crashes and broken savefiles.
+
+# Version stamp (required)
+
+# Most values can be used with the +, -, % and = operators, = will set the
+# monster value, + and - will modify it based on the normal monster
+# % will apply that percentage to the monster value
+# defaults : NO DEFAULT, MUST precise one
+
+# N:x:ego name
+# G:x:y (x=monster letter, y=colour, use * to use the same as the standard monster)
+# I:speed:(dice)d(side):aaf:ac:sleep
+# W:lev:rarity:weight:xp:place('B'efore or 'A'fter)
+# E:weapon:torso:arms:finger:head:legs
+# B:method:effect:(dice)d(side) (up to x4 lines)
+# F:flags that the standard monster MUST have - at least ONE of the R_CHAR_x
+# flags (if present, to determine which monster letters can have this ego
+# type), plus ALL of the rest
+# H:flags that the standard monster MUST NOT have
+# M:monster flags to add for the ego-type
+# O:monster flags to remove, use MF_ALL for all
+# S:monster spells to add for the ego-type
+# T:monster spells to remove, use MF_ALL for all
+
+V:2.0.0
+
+# A few undeads, to be created by the ANIM_DEAD spell
+
+N:1:Skeleton
+G:s:*
+I:%100:+1d+1:+0:+5:-5
+W:+5:13:%30:%95:B
+F:DROP_SKELETON
+H:UNDEAD | NONLIVING | R_CHAR_Z | R_CHAR_A | R_CHAR_E | R_CHAR_g
+M:DROP_SKELETON | UNDEAD | IM_COLD | IM_POIS | NO_FEAR | NO_CONF |
+M:NO_SLEEP | EMPTY_MIND | COLD_BLOOD | STUPID | EVIL
+O:GOOD | DROP_CORPSE | FRIEND | FRIENDS | ESCORT | ESCORTS | SMART |
+O:DROP_GREAT | DROP_GOOD | RAND_25 | RAND_50 | MORTAL
+T:MF_ALL
+
+N:2:Zombie
+G:z:*
+I:%95:%110d%100:%90:+10:-5
+W:+10:14:%70:%100:B
+F:DROP_CORPSE
+H:UNDEAD | NONLIVING | R_CHAR_Z | R_CHAR_A | R_CHAR_E | R_CHAR_g
+M:DROP_CORPSE | UNDEAD | IM_COLD | IM_POIS | NO_FEAR | NO_CONF
+M:NO_SLEEP | EVIL | EMPTY_MIND | COLD_BLOOD | STUPID | EVIL
+O:GOOD | DROP_SKELETON | FRIEND | FRIENDS | ESCORT | ESCORTS | SMART
+O:DROP_GREAT | DROP_GOOD | RAND_25 | RAND_50 | MORTAL
+T:MF_ALL
+
+N:3:Lich
+G:L:*
+I:%100:+0d+1:+10:+20:-10
+W:+30:22:+0:%200:B
+B:TOUCH:LOSE_DEX:+0d+0
+B:TOUCH:LOSE_DEX:+0d+0
+B:TOUCH:UN_POWER:+0d+0
+B:TOUCH:EXP_40:+0d+0
+F:DROP_SKELETON | SMART | R_CHAR_h | R_CHAR_p | R_CHAR_P | R_CHAR_O
+H:UNDEAD | NONLIVING | R_CHAR_Z | R_CHAR_A | R_CHAR_E | R_CHAR_g
+M:UNDEAD | IM_COLD | IM_POIS | NO_FEAR | NO_CONF
+M:NO_SLEEP | SMART | EVIL | COLD_BLOOD
+O:DROP_SKELETON | GOOD | DROP_CORPSE | FRIEND | FRIENDS | ESCORT | ESCORTS |
+O:DROP_GREAT | RAND_25 | RAND_50 | MORTAL
+S:1_IN_4 |
+S:BLINK | TELE_TO | TELE_AWAY | BRAIN_SMASH | DRAIN_MANA | CAUSE_3 |
+S:BLIND | HOLD | SLOW | SCARE
+
+N:4:Spectral
+G:G:*
+I:+10:%80d%100:+10:+20:-5
+W:+20:20:%10:%110:B
+B:*:EXP_20:+0d+0
+B:*:EXP_20:+0d+0
+F:DROP_CORPSE
+H:UNDEAD | NONLIVING | R_CHAR_Z | R_CHAR_A | R_CHAR_E | R_CHAR_g
+M:UNDEAD | IM_COLD | IM_POIS | NO_FEAR | NO_CONF
+M:NO_SLEEP | PASS_WALL | EVIL | COLD_BLOOD
+O:GOOD | DROP_CORPSE | FRIEND | FRIENDS | ESCORT | ESCORTS |
+O:DROP_GREAT | EMPTY_MIND | RAND_50 | MORTAL
+S:1_IN_5 | BLIND | HOLD | SCARE
+T:MF_ALL
+
+N:5:Captain
+G:*:v
+I:+5:%150d%100:+5:%120:-2
+W:+5:4:%120:%150:A
+B:*:*:+0d+1
+B:*:*:+0d+1
+B:*:*:+0d+1
+B:*:*:+0d+1
+F:R_CHAR_o | R_CHAR_y | R_CHAR_k | BASEANGBAND
+M:FORCE_MAXHP | FRIENDS | SMART | DROP_1D2
+
+N:6:Chieftain
+G:*:*
+I:+10:%200d%100:+10:%120:-3
+W:+5:4:%120:%200:A
+B:*:*:+1d+2
+B:*:*:+1d+2
+B:*:*:+1d+2
+B:*:*:+1d+2
+F:R_CHAR_T | R_CHAR_P | R_CHAR_O | BASEANGBAND
+M:FORCE_MAXHP | FRIENDS | SMART | DROP_1D2
+
+N:7:Shaman
+G:*:r
+I:+0:%90d%100:+10:%90:+0
+W:+2:1:%90:%120:A
+F:R_CHAR_o | R_CHAR_k | R_CHAR_n | BASEANGBAND
+M:SMART | FORCE_MAXHP | DROP_1D2
+O:FRIENDS
+S:1_IN_6 | MISSILE | CAUSE_1 | CONF | BLINK
+
+N:8:Priest
+G:*:G
+I:+0:%90d%100:+10:%90:+0
+W:+3:2:%90:%120:A
+F:R_CHAR_T | R_CHAR_P | R_CHAR_O | BASEANGBAND
+M:FRIENDS | SMART | FORCE_MAXHP | DROP_1D2
+S:1_IN_6 | CAUSE_2 | MISSILE | DARKNESS | CONF | SCARE | BLINK
+
+N:9:Mage
+G:*:r
+I:+0:%150d%100:+10:%120:+0
+W:+5:4:%120:%150:A
+B:*:*:+0d+0
+B:*:*:+0d+0
+B:HIT:HURT:=2d=8
+B:HIT:HURT:=2d=8
+F:R_CHAR_O | BASEANGBAND
+M:SMART | FORCE_MAXHP | DROP_1D2
+O:FRIENDS
+S:1_IN_6 | BA_COLD | BO_FIRE | TRAPS | HEAL | HOLD | S_MONSTER | TPORT
+
+N:10:Archer
+G:*:W
+I:+0:+0d+0:+0:+0:+0
+W:+1:1:%100:%110:A
+F:R_CHAR_y | R_CHAR_k | R_CHAR_O | R_CHAR_o | BASEANGBAND
+S:1_IN_4 | ARROW_2
+
+N:11:Rogue
+G:*:b
+I:+2:+0d+0:+0:+10:-30
+W:+1:2:%90:%100:A
+B:*:EAT_GOLD:+0d+0
+F:R_CHAR_y | R_CHAR_k | R_CHAR_o
+
+# For townpeople
+N:12:Elven
+G:*:*
+I:+2:+0d+0:+0:+0:+0
+W:+0:15:+0:+0:B
+F:WILD_TOWN
+H:ANIMAL
+
+# For townpeople
+N:13:Dwarven
+G:*:*
+I:+2:+0d+0:+0:+0:+0
+W:+0:15:+0:+0:B
+F:WILD_TOWN
+H:ANIMAL
+
+# N:x:ego name
+# G:x:y x is the char, y the attribute, * means the normal one
+# I:speed:(dice)d(side):aaf:ac:sleep
+# W:lev:rarity:weight:xp:place('B'efore or 'A'fter)
+# F:flags that the normal monster *must* have
+# H:flags that the normal monster *must not* have
+# M:monster flags that the ego-monster adds
+# O:monster flags to remove (use MF_ALL for all)
+# S:monster spells that the ego-monster adds
+# T:monster spells to remove (use MF_ALL for all)
diff --git a/lib/mods/theme/edit/readme.txt b/lib/mods/theme/edit/readme.txt
new file mode 100644
index 00000000..4c0ecbe7
--- /dev/null
+++ b/lib/mods/theme/edit/readme.txt
@@ -0,0 +1,96 @@
+# File: a_info.txt
+# This file is used to initialize the "artifact" information for the Angband game.
+# This is were you find Cubragol, The Phial , Ringil etc.
+
+# File: ba_info.txt
+# This file is used used to initialize the "store/building actions type" information for the Angband game.
+# This is where you find the ID numbers for 'Presage fate', 'Play craps' , 'Sell an item' etc.
+
+# File: d_info.txt
+# This file is used to used to set the dungeons for the Angband game.
+# This is where you find 'Barrow Downs', 'The Maze' , 'Mordor' etc.
+
+# File: e_info.txt
+# This file is used to initialize the "ego-item" information for the Angband game.
+# This is where you find 'Helms of the Noldor' , 'Filthy rags of leprousness' , 'Boots of Jumping' etc.
+
+# File: f_info.txt
+# This file is used to used to initialize the "terrain feature" information for the Angband game.
+# This is where you find the ID numbers for 'Underground tunnel' , 'grass with flowers' , 'open floor' etc.
+
+# File: k_info.txt
+# This file is used to initialize the "object kind" information for the Angband game.
+# This is where you find 'Katanas' , 'Mushrooms of Sickness' , 'Jewel Encrusted Crowns' etc.
+
+# File: misc.txt
+# This file contains a lot of 'maximums ' for the Angband game.
+# This is where you find 'Maximum number of skills in s_info.txt' ,
+#'Maximum number of items in k_info.txt' , 'Maximum number of artifacts in a_info.txt' etc.
+
+# File: ow_info.txt
+# This file is used to initialize the "owner info type" information for the Angband game.
+# This is where you find 'Bilbo the Friendly(Hobbit)' , 'Raistlin the Chicken(Human)' ,
+# Inglorian the Mage(Human) etc.
+
+# File: p_info.txt
+# This file is used to initialize the "player race/race mod/class" information for the Angband game.
+# You will find here races like 'Humans' , subraces like 'Vampire', classes like 'Monk'
+
+# File: r_info.txt
+# This file is used to initialize the "monster race" information for the Angband game.
+# You will find here monsters like 'Marylene, Heartbreakeress of the Netherworld',
+# 'The Minotaur of the Labyrinth' , 'Morgoth, Lord of Darkness' etc.
+
+# File: ra_info.txt
+# This file is used to initialize the "randart parts" information for the Angband game.
+# Here you will find info for random artefacts made of 'Mage Staves' , 'Lights' , 'Gloves' etc.
+
+# File: re_info.txt
+# This file is used to initialize the "monster ego race" information for the Angband game.
+# Here you will find ego monster types like 'Spectral','Skeleton','Archer' etc.
+
+# File: s_info.txt
+# This file is used to initialize the "skills" information for the ToME game.
+# Here you will find player & monster skills, 8you can use their IDs in other files(?),
+# You will find skills like 'Bearform-combat' , 'Necromancy' , 'Spell-power' etc.
+
+# File: set_info.txt
+# This file is used to initialize the "lib/raw/set_info.raw" file, which is
+# used to initialize the "item set" information for the Angband game.
+# You find linked Items like 'The bow of Bard' & 'The arrow of Bard'
+# It is like totally unclear to me what this does, especially because
+# the big spider doesnt drop Sting, hint hint !
+
+# File: special.txt
+# Contains terrain parsings for the special levels now being kept in seperate map files
+# You will find there entries as in f_info.txt
+
+# File: st_info.txt
+# This file is used to initialize the "store info type" information for the Angband game.
+# You will find there stores like 'Armoury' , 'Temple' , 'The Mathom-house' etc.
+
+# File: t_info.txt
+# Includes the town definitions of the game Angband
+# You will find here the towns like 'Gondor' , 'Bree' , 'Lothlorien' etc.
+
+# File: t_pref.txt
+# Defines the preferences for the town features
+# You will find there entries as in f_info.txt
+
+# File: tr_info.txt
+# This file comes from Angband64 written by Jurriaan Kalkman
+# and describes the traps items can have
+# You will find traps like 'Summon Fast Quylthulgs Trap' , 'Wisdom Trap' etc.
+
+# File: v_info.txt
+# This file is used to initialize the "vault template" information for the Angband game.
+# You will find vaults like 'The I in the Storm' , 'Greater vault (mortuary temple of sety)' ,
+# 'Lesser vault (amenhotep I)' etc.
+
+# File: W_info.txt
+# This is the wilderness
+# Change the dimensions at your perils, most likely the game will crash !!!
+
+# File: wf_info.txt
+# This file is used to initialize the "wilderness feats" information for the Angband game.
+# You will stuff like 'Ekkaia, the Encircling Sea' , 'mountain' , 'Minas Anor' etc.
diff --git a/lib/mods/theme/edit/s_bilbo.map b/lib/mods/theme/edit/s_bilbo.map
new file mode 100644
index 00000000..12c857e2
--- /dev/null
+++ b/lib/mods/theme/edit/s_bilbo.map
@@ -0,0 +1,58 @@
+# Bilbo's Trail level with Thror's map and a few surprises. Copied from Cyclone vault and tweaked to suit the dungeon.
+# You NEED a digger to pass this level, though flight/climbing will do in a pinch.
+# There is no excuse for being on BDw10 without a digger. :-P
+# Map by furiosity <furiosity@gmail.com>
+
+%:special.txt
+
+# Grass
+F:,:89:0
+
+F:+:33:0
+
+# Grass with Thror's Map
+F:1:89:0:0:0:0:209
+
+# Random monster and random object on grass
+F:2:89:0:*13:*15
+
+# Random trap on grass
+F:3:89:0:0:0:0:0:*
+
+### Previous adventurers
+F:a:89:0:0:391
+F:b:89:0:0:392
+F:c:89:0:0:393
+F:d:89:0:0:394
+F:e:89:0:0:395
+F:f:89:0:0:396
+F:g:89:0:0:397
+F:h:89:0:0:398
+
+### Dungeon Design
+
+D:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+D:XMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMX
+D:XMMMM,g*,,,,,,MMM2,,,,,,,,MMM,,3TMMM,,M,3,M,3,M,,,M+,,,,,,,,,,,,,MM,,,,,,,,,,,,,,,,,,,,T,MX
+D:XMM,,,MMM,,,MMM,,,MMM,,,MMM,,,MMM,,M,,M,M,M,M,M,M,,MMMMMMMMMMMMM,,MM,,MMMMMMMMMMMMMMMMMMTMX
+D:XM,,MMM,,,MMM,,3MMM,,,MMM,,,MMM,,,,M,,M,M,M,M,M,M,,,MM,,,*,,,,,MM,3MM,,,,,a,,,,,,,c,,,*M,MX
+D:XMMMM,,,MMM,,,MMM,,,MMM,,,MMM,,,,,,M,,M,M,M,M,M,M,,,,M,a,b,c,,,,M,,,M,,,,,,,,,,3,3,,,,,M,MX
+D:XMM,,,MMM,3,MMM,,,MMM,,,MMM,,,,,,,,M,,M,M,M,M,M,M,,,,M,,33,,,,,MM,,MMMM,,,,,,,,,2,,,,,,M,MX
+D:XM,,MMM,3,MMM,,,MMM,,,MMM,,,,,,,,,,M,,,,M,3,M,3,M,,,MM,,,2,,,MMM,MMM,,MMM,,,,,,3,3,,,,,M,MX
+D:XM,MM,,,MMM,,,MMM,,,MMM,,,,,,,,,MM+MMMMMMMMMMMMMM,,MM,,,,33,MMM,MMMMMM,,MMM,,,,,,,,,,,,M,MX
+D:XM,,3,MMM,,,,,,,,,MMM,,,,,,,,,,MM,,M,,,,,3,,,,TM,,MM,,,,,,MMM,,MMM,,MTM,,,MM,,,,b,,,,,*M,MX
+D:XMMMM,MMMMMMMMMMMMM,,,,,,,3,,,,M,h,M,MMMMMMMMMM,,MM,,,,,MMM,,MMM,,h,,MMM,,,MMMMMMMMMMMMM,MX
+D:XM>1M,,,,,,3,,,,,,MMM,*g,323,,,M,23T,,,,,3h,,MMMMM,,,,MMT,,MMT,,,,*3,,MMM,,+,,,,,,,,,,,+,MX
+D:XMM,MMMMMMMMMMMM,MM,,,,,,,3,,,,M,*,M,MMMMMMMMMM,,MM,,,,,MMM,,MMM,,2,,MMM,,,MMMMMMMMMMMMM,MX
+D:XM,,,,MMM,,,,,,,,,MMM,,,,,,,,,,MM,,M,,,,,3,,,,TM,,MM,,,,,,MMM,,MMM,,MTM,,,MM,,,,e,,,,,*M,MX
+D:XM,MMM,,MMM,,,MMM,,,MMM,,,,,,,,,MM+MMMMMMMMMMMMMM,,MM,,,,33,MMM,MMMMMM,,MMM,,,,3,3,,,,,M,MX
+D:XM,,MMM,,,MMM,,,MMM,,,MMM,,,,,,,,,,M,,,,M,3,M,3,M,,,MM,,,2,,,MMM,MMM,,MMM,,,,,,,2,,,,,,M,MX
+D:XMM,3,MMM,,,MMM,,,MMM,,,MMM,,,,,,,,M,,M,M,M,M,M,M,,,,M,,33,,,,,MM,,MMMM,,,,,,,,3,3,,,,,M,MX
+D:XMMMM,,,MMM,,,MMM,,,MMM,,,MMM,,,,,,M,,M,M,M,M,M,M,,,,M,d,e,f,,,,M,,,+,,,,,,,,,,,,,,,,,,M,MX
+D:XMg3MMM,3,MMM,,,MMM,,,MMM,,,MMM,,,,M,,M,M,M,M,M,M,,,MM,,,*,,,,,MM3,MM,,,,d,,,,,,,f,,,,*M,MX
+D:XMM*,,MMM,,,MMM,,,MMM,,,MMM,,,MMM,,M,,M,M,M,M,M,M,,MMMMMMMMMMMMM,,MM,,MMMMMMMMMMMMMMMMMM,MX
+D:XMMMM2,,,,3,,,MMM,,,,,,,,,MMM,,3MMMM,,M,3,M,3,M,,,M+,,,,,,,,,,,,,MM,,,,,,,,,,,,,,,,,,,,M,MX
+D:XMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMX
+D:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+
+P:22:90 \ No newline at end of file
diff --git a/lib/mods/theme/edit/s_bridge.map b/lib/mods/theme/edit/s_bridge.map
new file mode 100644
index 00000000..dd1367ef
--- /dev/null
+++ b/lib/mods/theme/edit/s_bridge.map
@@ -0,0 +1,104 @@
+# Special level "Bridge Of Khazad-Dum" in Moria (lvl50)
+# Made by Burb Lulls, reworked later for Theme by furiosity <furiosity@gmail.com>
+
+%:special.txt
+
+# chasm
+F:-:87:0
+
+# rubble
+F:;:49:0
+
+# Random monster (up to 5 levels ood) on normal floor
+F:a:1:0:*55
+
+# Random monster (up to 11 levels ood) on normal floor
+F:b:1:0:*61
+
+# Random monster (up to 9 levels ood)
+F:c:1:0:*59
+
+# Random monster (up to 40 levels ood)
+# Random object (up to 20 levels ood
+# These are behind granite walls, only go after them if you really want to!
+F:d:1:0:*90:*70
+
+# Random monster (up to 3 levels ood)
+F:e:1:0:*53
+
+# Random monster (up to 7 levels ood)
+F:f:1:0:*57
+
+### Guardian -- Durin's Bane on normal floor
+F:@:1:0:872
+
+### Escorts (since these can't appear due to the SPECIAL_GENE flag on Durin's bane)
+
+# Mornungol on normal floor
+F:g:1:0:720
+
+# Ungorrog on normal floor
+F:h:1:0:992
+
+# Sererrog on normal floor
+F:i:1:0:995
+
+# Naurungol on normal floor
+F:j:1:0:994
+
+# Faunungol on normal floor
+F:k:1:0:993
+
+# Morgulrog on normal floor
+F:m:1:0:999
+
+# Helcungol on normal floor
+F:n:1:0:648
+
+### Dungeon Design
+D:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+D:X----------------------------------------------------------------------------LLLLLLLLLLLLLL-----------------------------------X
+D:X----------------------------------------------------------------------------LXXXXXXXXXXXXLLLLLLLLLLLLLLLLLLLLLLLLL-----------X
+D:X----------------------------------------------------------------------------LX;........;XXXXXXXXXXXXXXXXXXXXXXXXXL-----------X
+D:X----------------------------------------------------------------------------LX...c...f..........e.....f......c..XL-----------X
+D:X----------------------------------------------------------------------------LX;.........XXXXXXXXXXXXXXXXDDXXXXDDXL-----------X
+D:X----LLLLLLLLLLLLLL--------------------------LLLLL---------------------------LXXXXXXXXX..XLLLLLLLLLLLLLLX..D.cX..XL-----------X
+D:X--LLLXXXXXXXXXXXXLLL----------------------LLXXXXXLL-----------LLLLLLLL------LLLLLLLLLX..XXLLLLLLLLLLLLLXXXXXXXDDXL-----------X
+D:X-LLXXX..........XXXLLL------------------LLXXX..aXXXLLL-----LLLXXXXXXXLL-------------LXX..XXLLLLLLLLLLLLX..D..D..XL-----------X
+D:XLXXX..............XXXLL----------------LXXX;......XXXLL--LLXXXX;.f..XXLLLLLLLLLLLLLLLLXX..XXXXXXXXXXXXLXDDXXXXDDXL-----------X
+D:XLX;.................XXL--LLLLLLLLLLLLLLLX...XXXXa..;XXLLLXXX......X..XXXXXXXXXXXXXXXXXXXX.;XX;......;XLX..Xb.D..XL-----------X
+D:XLXXX................;XL--LXXXXXXXXXXXXXXDDXXXLLXXX.;.XXXXX....XXXXXX.D............;XXXXX...XX...XX...XLXDDXXXXXXXL-----------X
+D:XLLLXXX............X..XL--LX;...........a..a;XLLLLXXX..f;...;XXXLLLLXXX...f.....e...XXXXX..XXX...XX...XLX..D.bD..XL-----------X
+D:X--LLLXXXXX..XXXXXXX..XLLLLX.................XLLLLLLXX..D..XXXLLLLLLLLX......a......D............XX...XLXDDXXXXDDXL-----------X
+D:X----LLLLLXDDXLLLLLX..XXXXXXa................XLLLLLLLXXXX...XLLLLLLLLLX...c.....f...XXXXXXXXXX..bXXc..XLX..Db.X..XL-----------X
+D:X--------LX..XLLLLLX.......D........f........XLLLLLLLLLLXX.cXLLLLLLLLLX;...........;XLLLLLLLLX.XXXXXX.XLXXXXXXXDDXLLLLL-------X
+D:X--LLLLLLLX.eXLLLLLXXXXXXXXX;...............;XLLLLLLLLLLXXXDXLLLLLLLLLXXDXXXXXXXXXXXXLLLLLLLLX..XXXXf.XLX...a....XXXXXLL------X
+D:X--LXXXXXXX..XXXXXXXXXXLLLLXXXXXXXXXDDXXXXXXXXLLLLLLLLLXX..bXLLLLLLLLLX..XLLLLLLLLLLLLLLLLLLLX..eXX...XLX..b..b..D...XXLL-----X
+D:X--LX..e..............XLLLLLLLLXXXXX..XXXXXXLLLLLLLLLLXX...XXLLLLLLLLLX##XLLLLLLLLLLLLLLLLLLLX;......;XLX....e...XX..fXXL-----X
+D:X--LXDDXXXXXXXXXXXXX..XLLLLLLXXX;..f......;XLLLLLLLLLXXc.XXXLLLLLLLXXXX..XXXXLLLLLLLLLLLLLLLLXXXX..XXXXLXXXXXXXXXXXX...XL-----X
+D:X--LX..XLLLLLLLLLLLX.eXLLLLLXX.D.......c...XLLLLLLLXXX..XXLLLLLLLXXX........XXXLXXXXXXXXXXXXXXXXXDDXXXXXXXXXXXLLLLLXX.eXL-----X
+D:X--LX..XLLXXXXXLLLLXDDXLLLLXX.eX;...b.....;XLLLLLLLX..fXXLLLLLLLLX...d.....d..XLX.e..b...e...c...f...c...b...XLLLLXX..XXLL----X
+D:X--LX..XLLXXccXLLLLX..XLLLXX..XXXXXXXXXXXXXXLXXXXXXXDDXXXXXXLLLLLXX.....d....XXLXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXLXXXX..XXXXL----X
+D:X--LX..XLLXX..XLLLLX..XLLXX..XXLLLLLLLLLLLLLLX;....f..f...;XLLLLLLXX;......;XXLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLX;a..f..;XL----X
+D:X--LX..XLLXXDDXXXXXX..XLXX..XXLLLLLLLLLLLLLLLX.............XLLLLLLXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXLLLLXXXX..XXXXL----X
+D:X--LX.aXLLXX..........XLX..XXLLLLLLLLLLLLLLLLX..c...cc..c..XLLLLXXX-------------------------------------XXXLLLLLLX...cXLLL----X
+D:X--LX..XLLXXXXXXXXXXXXXXX..XLLLLLLLLLLLLLLLLLX;...........;XLLLXX-----------------------------------------XXLLLLLXX.;XXL------X
+D:X--LX..XLLLLLLLLLLLLLLLLXDDXLLLLLLLLLLLLLLLLLXXXXXXXXXXXXXXXLLLX-------------------------------------------XLLLLLLX;.XLL------X
+D:X--LX..XXXXXXXXXXXXXXXXXX.eXLLLLLLLLLLLLLLLLLLLLLLLXXXL.l.XXLLLX-------------------------------------------XLLLLLLX.;XL-------X
+D:X--LX;...a.........a.......XLLLLLLLLLLLLLLLLLLLLLXXX.l.X.l.XXLLX----LLLLLLL---------------------..;....XXXXXXXXLLLX;.XL-------X
+D:X--LXXXXXXXXXXXXXDDXXXXXXXXXXLLLLLLLLLLLLLLLLLLLLX.l.XXXXXl.XXLX-LLLLX-X-;-;-X-X-X-;-X-X-X-;-X-X-X-X-X....XXaaXXLLXc;XL-------X
+D:X--LLLLLLLLLLLLLX.fXLLLLLLLLLXXXXXXXLLLLLLLLLLLLLXX.lXXXLXL.lXXXlllLLkX-X-X-X-X-;-X-X-X-;-X-X-;-X-X-X-.....XX..XXLX;.XLLLLLLL-X
+D:X------LLLLLLLLLX..XLLLLLLLLLX..d..XLLLLLLLLLLLLLLXX..lXXXXL.lXXlljjhkmmnn....................c...a........XXX..XXX..XXXXXXXLLX
+D:X------LXXXXXXXXX..XXXXXXXXXXX#####XXLLLLLLLLLLLLLLXXX.lXLXX..l#ljgiikmmmnnn....................f...e......#...........f..cXXLX
+D:X------LX;................;XX;.....;XLLLLLLLLLLXXXXX..lXXLLXL..#lj@ihkkkmnnn..................c...a........#.b..X.XXXXXXXX.fXLX
+D:X------LX....e.........a...XX..c....XLLLLLLLLLLXLl..lXXXLXLXL..#ljgiikmmmnnn....................f...e......#....X.XXXXXXXX.fXLX
+D:X------LX.......f...c......XX...e.f.XLLLLLLLLLLXL..LXXLLXXLXXL.#lljjhkmmnn....................c...a........#...........f..cXXLX
+D:X------LX....c....b....c...DD;.....;XLLLLLLLLLXXXDXXXLLLLLLLXXXXlllLLkX-X-X-X-X-X-;-X-X-X-;-X-X-X-;-X-.....XXX..XXXXXXXXXXXXLLX
+D:X------LX;................;XXXXXXXXXXLLLLLLLLLXLlelLXLLLLLLLLLLX-LLLLX-;-X-X-;-X-X-X-;-X-X-X-;-;-X-X-X....-XX..XXLLLLLLLLLLLL-X
+D:X------LXXXXXXXXXXXXXXXXXXXXLLLLLLLLLLLLLLLLLLXLl>lLXLL------LLX----LLLLLLL---------------------.......----XeeXXLL------------X
+D:X------LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLXLlllLXL--------LX-------------------------------------------XXXXLL-------------X
+D:X-----------------------------LLL-----------LLXXLLLXXL--------LXX-----------------------------------------XXLLLL--------------X
+D:X-------------------------------LL-----------LLXXXXXLL--------LLXXX-------------------------------------XXXLL-----------------X
+D:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+### Starting Location
+P:10:10 \ No newline at end of file
diff --git a/lib/mods/theme/edit/s_crypt.map b/lib/mods/theme/edit/s_crypt.map
new file mode 100644
index 00000000..3d6ce71c
--- /dev/null
+++ b/lib/mods/theme/edit/s_crypt.map
@@ -0,0 +1,109 @@
+# Special level "The Forgotten Crypt" in The Pits of Angband
+#
+# Created for PernAngband 5.0.1 on 18/8/01
+# Written by Mynstral (mynstral@thehelm.com)
+
+%:special.txt
+
+### Guaranteed Monsters
+# Vampire on normal floor
+F:a:1:0:432
+
+# Ghoul on normal floor
+F:b:1:0:418
+
+# Rotting Quylthulg on normal floor
+F:c:1:0:633
+
+# Master Vampire on normal floor
+F:d:1:0:520
+
+# Vampire Lord on normal floor
+F:e:1:0:623
+
+# Greater Rotting Quylthulg on normal floor
+F:f:1:0:802
+
+# Ghast on normal floor
+F:g:1:0:327
+
+# Undead Beholder on normal floor
+F:h:1:0:664
+
+# Thuringwethil, the Vampire Messenger on normal floor
+F:i:1:0:755
+
+# Black Reaver on normal floor
+F:j:1:0:798
+
+### Random Monsters and/or Items
+# Random monster (upto 5 levels ood) on normal floor
+F:&:1:0:*75
+
+# Random monster (upto 11 levels ood) on normal floor
+F:@:1:0:*81
+
+# Random monster (upto 9 levels ood) and
+# Random object (upto 7 levels ood) on normal floor
+F:8:1:0:*79:*77
+
+# Random monster (upto 40 levels ood) and
+# Random object (upto 20 levels ood
+F:9:1:0:*110:*90
+
+# Random monster (upto 3 levels ood)
+F:-:1:0:*73
+
+# Random object (upto 7 levels ood)
+F:=:1:0:0:*77
+
+### Guaranteed Items
+# The Shadow Cloak of Luthien on normal floor
+F:1:1:0:0:0:0:49
+
+D:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+D:XA.%@=-=-X8XX6...XX.XXLLL..c..LLLXX.XX...7XX8X=-=-...5X
+D:X.%%@=-=-X99X.....X..XLL..X%X..LLX..XhVV..X99X=-=-..GGX
+D:X%%@@...XXX9XX....XX.XX...X.X...XX.XXVVVVXX9XXX=-=.XGGX
+D:X@@@....X8X-=XgggggX..X..dX4Xd..X..XWWWWWX-=X8X-=-.XGGX
+D:X......XX%XX=XXgddgXX.XX8GXXXG8XX.XXWWWWXX-XX%XX...XGGX
+D:XIXIXXIX*X=X-=XgddggX..X8G^.^G8X..XWWWWWX-=X.X.X&&&XGGX
+D:XXXIXIXX*X-XX=XXggggXX.XXG^.^GXX.XXWWWWXX-XX.X.XX&&XGGX
+D:XXXXXIX**X=-X=-XIIXXXX..XG^.^GX..XVWWWVX=-XX.XddX@@XGGX
+D:X^^^^XX**X=-XX=XXIXIIXX.XX^.^XX.XXVVVVXX-XX%.XedXX@XGGX
+D:X^^f^Xe**X%%.X=-XXIXXIXbbX^.^XbbX.VV.XX=-XbX.XXXIX@IIGX
+D:X^^^XXe..X...XX=-XXXIXXXbXX.XXbXX...XX=-XXbX.XaaaXXXIGX
+D:X^^XXbbb.XGGG.XX=-XXIIXXbbXDXbbX...XX=-XXbbX.XaaaaXXIGX
+D:X^XXcbab.XVdG.cXX=-XXXIXXabXbaXX.XXX=-XXbbbX.XaaaaaXXfX
+D:X%XbbbbbbXVWG.%.XX.DbXDXXXbXbXXXDXbD.XX....G.XGGGGGGX%X
+D:XX.bababa%eWG.%.BXXXbcbbbbX.XbbbbcbXXXC...fX.%.......XX
+D:X%XbbbbbbXVWG.%.XX.DbXDXXXbXbXXXDXbD.XX....G.XGGGGGGX%X
+D:X8XXcbab.XVdG.cXX=-XXX.XXabXbaXXLXXX=-XXbbbX.XaaaaaXX.X
+D:X88XXbbb.XGGG.XX=-XX...XbbXDXbbXLLLXX=-XXbbX.XaaaaXXX.X
+D:XXXIXXe..X...XX=-XX.GGXXbXX.XXbXXILIXX=-XXbX.XaaaXXXX.X
+D:X9889Xe**X%%.X=-XXG.GdXbbX^.^XbbXILLIXX=-XbX.XXXIXhGG.X
+D:XXIXXXX**X=-XX=XXdG.GXX.XX^.^XX.XXILIIXX-XX%.XedXXXXX.X
+D:X99999X**X=-X=-XGGG..X..XI^a^IX..XILLIIX=-XX.XddX..eeeX
+D:XXXXIXXX*X=XX-XX....XX.XXI^a^IXX.XXILLIXX=XX.X.XX.GGGGX
+D:X^^^^^cX*X-X=-X.....X..X.I^a^I.X..XIILLIX=-X.X.Xdddd..X
+D:XllllX^XX%XX=XXG.GGXX.XX.IXXXI.XX.XXIILIXX-XX%XXXXXXX.X
+D:X^^^cl^=X8X-=XeG.GeX..X...X4X...X..XILLLIX-=X8X.aaaaaaX
+D:XLLX^l^-XXX9XXGG.GXX.XX...X.X...XX.XXLLLLXX9XXX.GGGGGGX
+D:X..L^l^=-X99X.....X..XWW..X%X..WWX..XLLLL.X99XXbbbbb..X
+D:X7.L^l^=-X8XX5...XX.XXWWW..c..WWWXX.XXLL.AXX8XXbbbbb.6X
+D:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+D:XXXXXXXIIIIXIIIIXXIIIXIIIIXXIIIXXXXggggXc..cXaaaaXbb.CX
+D:XIIIIIXIXXIIIXXIIXIXIXIXXIXXIXIXXXXgddg%....%aaaa%bb..X
+D:XIXXXIXIXXXXXXXXIIIXIXIIXIXXIXIXXXXggggXc..cXaaaaXbbbbX
+D:XIXXXIIIXIIIIIIXXXXXIXXIXIXIIXIXXXXXXXXXXIIXXXXXXXXXXXX
+D:X..XXXXXXIXXXXIXIIIXIXIIXIXIXXIXXXXVVVjXddddXe..eX....X
+D:XB.IIIIIXIIIXIIXIXIXIIIXXIXIXIIXIIIVVVEX....%.ee.%.hh.X
+D:X..XXXXIXXXIXIXXIXIXXXXXIIXIXIXXIXXVVVjXddddXe..eX....X
+D:XIXXXIXIIIXIXIIIIXIIIIXIIXXIXIXXIXXXXXXXXXXXXXXXXXXDDXX
+D:XIXXXIXXXIIIXXXXXXXXXIXIXXIIXIIIIXXGGGGXgggdddeIVX....X
+D:XIIXXIXXXXXXXIIIIXXIXXXIIIIXXXXXXXXE.heDgggaaaiG1X....X
+D:XXIIIIIIIIIIIIXXIIIIXIIIXXXXXXXXXXXGGGGXgggdddeIVX..j>X
+D:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+
+### Starting location
+P:17:29
diff --git a/lib/mods/theme/edit/s_death.map b/lib/mods/theme/edit/s_death.map
new file mode 100644
index 00000000..398b5fd1
--- /dev/null
+++ b/lib/mods/theme/edit/s_death.map
@@ -0,0 +1,104 @@
+# Special level "Deathwatch" in the Orc Caves
+#
+# Created for PernAngband 5.0.1 on 18/8/01
+# Altered by Mynstral (mynstral@thehelm.com)
+
+%:special.txt
+
+### Guaranteed monsters
+# Snaga on normal floor
+F:a:1:0:118
+
+# Cave orc on normal floor
+F:b:1:0:126
+
+# Hill orc on normal floor
+F:c:1:0:149
+
+# Black orc on normal floor
+F:d:1:0:244
+
+# Half-orc on normal floor
+F:e:1:0:264
+
+# Uruk on normal floor
+F:f:1:0:313
+
+# orc captain on normal floor
+F:g:1:0:285
+
+# Lagduf on normal floor
+F:h:1:0:140
+
+# Grishnakh on normal floor
+F:i:1:0:186
+
+# Golfimbul on normal floor
+F:j:1:0:215
+
+### Guaranteed items
+# Thalkettoth on normal floor
+F:1:1:0:0:0:0:28
+
+# Maedhros on normal floor
+F:2:1:0:0:0:0:64
+
+# Cammithrim on normal floor
+F:3:1:0:0:0:0:53
+
+### Dungeon Design
+D:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+D:X XXXXXXXXXXXX X
+D:X X..........X XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX X
+D:X X....>.....X X.XdX.X.X.XcX.X.X...XcX.X.XcX.X.XgXd+2X X
+D:X X..........X XDXDXDXDXDXDXDXDX...XDXDXDXDXDXDXDXDXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX X
+D:X XXXXXDXXXXXX X...............D...D...............X X...f............a...XXXXX.......b..f....a....+1X X
+D:X X.X XDXDXDXDXDXDXDXDX..cXDXDXDXDXDXDXDXDX X........b...........XXXXX...a..........b.....XXX X
+D:X X.X X.XcX.XcXdX.X.X.X...XcX.XdXcX.X.X.XgX XXXXXXXXXXDDXXXXXXXXXXXXXXXXXXXXXXXXDDXXXXXXXXX X
+D:X X.X XXXXXXXXXXXXXXXXX.c.XXXXXXXXXXXXXXXXX XXXXXXXXXXDDXXXXXXXXXXXXXXXXXXXXXXXXDDXXXXXXXXX X
+D:X X.X XXX X...X X...........f...a....XXXXX....b.a...........b.X X
+D:X XX.XX X.XXXXXXXXXXXXDDDXXXXX X..f...b.............XXXXX..a....f.....b..a...X X
+D:X XX...XX XXXDXXXXXXXXX.......c.XX XXXXXXXXXXDDXXXXXXXXXXXXXXXXXXXXXXXXDDXXXXXXXXX X
+D:X XX.....XX XdD........D...c......dX X........a...............a....................X X
+D:X XX.......XX XXXDXXXXXXXX......c....X Xf....b..........f............a.........f.....X X
+D:X X.........X XeX XX.........XX X.............a.......b...........a...........X X
+D:X XXXXX.XXXXX X.X XXXXDDDXXXX X....a...............................a........X X
+D:X X.X X.X X...X XXXXXXXXXXXXXXXXXXXXX...XXXXXXXXXXXXXXXXXXXXXXX X
+D:X X.X X.X X...X X...X X
+D:X X.X X.X XX...XX X.b.X X
+D:X X.X X.X XX.....XX X...X X
+D:X XXDXX XXXX X.X XX.......XX X..bX X
+D:X X...XXXX..X XdX XX...ccc...XX X...X X
+D:X X...+..D..X X.X XX....ccc...dXX X...X X
+D:X X...XXXX..X X.X XX.d..ccicc....XX XXXXXXXXXXXXXDDDXXXXXXXXXXXX X
+D:X XX.XX XXXX X.X XX......ccc..g...XX XX......a...............f...XX X
+D:X X.X X.X XX...g...ccc.......XX XXX..f.........................XX XXXXX X
+D:X X.X X.X X......g.........g..X XX..................b....a.......XX Xa.aX X
+D:X X.X XgX XXXX..XXXXXXX..XXXXXX XX.....a.........a..............a..XX X.a.X X
+D:X X.X X.X X..X X..X XXXXXXXX..........f........................XX XDXXX X
+D:X X.X X.X Xd.XXXXXXX..XXXXXXX X.....D...b.................b...f...........XXXXXXXXXXX.X X
+D:X X.X X.X X...c.......D.....X X.....D...........a..h.............a........D......a....X X
+D:X X.X X.X X.......c.g.D.....X X...XXXX.....b.............................XXXXXXXXXXXX.X X
+D:X XXXX.XXXX X.X XXXXXXXXXXXXXXXX..XXXXXXX X...X XX..............a......a...........XX X.X X
+D:X X.......X X.X X........XXXXXXX...X XX.........f.............f.......XX X.X X
+D:X XXX...XXX X.X X..d...............X XX.....b...........b.........f.XX XaX X
+D:X X.......X X.X X........XXXXXXX...X XX..........b................XX X.X X
+D:X XXXX.XXXX X.X XXXXXXXXXX XXXXX XXXXXXXXXXXXDDDDDXXXXXXXXXXXX X.X X
+D:X X.X XDXXXXXXXXXXXXXXX X.....X X.X X
+D:X X.X X..d...e......d.XXXXXXXXXXX XXXXXXXXXXXX X.b...X X.X X
+D:X X.X X....e..g.......D.........X X.d..gg..eeX XXX.....XX X.X X
+D:X X.X XXXXX X..g..d.....e...XXXXXXXXDDXXXXXXXX....gg..eeXXXXX XX...XXX..XXX XXXXXXDXX X
+D:X X.X XeeeX XDXXXXXXXXXXXXXXX Xg.d.......D.e..e..gg..eej+3+% XX....XXX....XXXXXX XXX...D..aX X
+D:X X.X Xeg.X XX.XX X....e....eD.e.....gg..eedXXX% X.............X...X XaD...X...X X
+D:X XXXX.XXX XX+XXXX...X X.d........XXXX....gg..eeXX % XXXXX XXXXXXXXXXXX..D...X XXX..aX...X X
+D:X X......X XX.......X XXXX...e...d..XXXX...dgg..eeX % X...X XX.....D..XXXXXX XXXXXXXDXX X
+D:X X......X X.g.....XXXXXX X..D....g..e..Dd.XXXXXXXXXXXX % XXXDXX X......X..X....X X...X X
+D:X X......X X...d...DeeeeX X..XXXXXXXXXXXX..X + X...X XXXXXXXX..X....X X...X X
+D:X X......X X.....e.XXXXXX XXXX XXXX % X...XXXXXX X....D..D....X XXXXXXXXDXDXXXX X
+D:X XXXDDXXXXXXXXXXXXXX+XXXXXX % X....X...X X..XXX..XXXXXXXXX X.....a..X....X X
+D:X X........%........X %+%%....D...XXXXXX.D..D.....+.X X........X....X X
+D:X XXXXXXXXXXXXXXXXXXX XXXXXX..........X..X.....XXX XXXXXXXXXXXXXXX X
+D:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+
+### Starting Location
+P:51:125
diff --git a/lib/mods/theme/edit/s_doom.map b/lib/mods/theme/edit/s_doom.map
new file mode 100644
index 00000000..5be3b67d
--- /dev/null
+++ b/lib/mods/theme/edit/s_doom.map
@@ -0,0 +1,226 @@
+# Mount Doom
+
+### Terrain Features
+# Permanent Wall
+F:X:177:0
+
+# Lava Wall
+F:#:177:0
+F: :177:0
+
+# Great Fire
+F:$:178:0
+
+# Fire
+F:%:205:0
+
+# Hidden Door
+F:+:48:0:0:0:0:0:0:0:177
+
+# Normal Door
+F:D:32:0
+
+# Shallow Lava
+F:.:86:0
+
+# Deep Lava
+F:L:85:0
+
+# Treasure (random) on shallow lava
+F:*:86:0:0:*
+
+# Trap (random) on deep lava
+F:^:85:0:0:0:0:0:*
+
+# Trap (random) on shallow lava
+F:t:86:0:0:0:0:0:*
+
+# up staircase
+F:<:6:0
+
+### Guaranteed Monsters
+# Greater Balrog on deep lava
+F:A:85:0:807
+
+# Greater Balrog on shallow lava
+F:a:86:0:807
+
+# Lesser Balrog on deep lava
+F:B:85:0:996
+
+# Lesser Balrog on shallow lava
+F:b:86:0:996
+
+# Pit Fiend on deep lava
+F:C:85:0:812
+
+# Pit Fiend on shallow lava
+F:c:86:0:812
+
+# Great Wyrm of Power on deep lava
+F:E:85:0:847
+
+# Great Wyrm of Power on shallow lava
+F:e:86:0:847
+
+# Bone Golem on deep lava
+F:F:85:0:1013
+
+# Bone Golem on shallow lava
+F:f:86:0:1013
+
+# Dracolisk on deep lava
+F:G:85:0:703
+
+# Dracolisk on shallow lava
+F:g:86:0:703
+
+# Nycadaemon on deep lava
+F:H:85:0:719
+
+# Nycadaemon on shallow lava
+F:h:86:0:719
+
+# Barbazu on deep lava
+F:I:85:0:720
+
+# Barbazu on shallow lava
+F:i:86:0:720
+
+# Plasma Hounds on deep lava
+F:J:85:0:726
+
+# Plasma Hounds on shallow lava
+F:j:86:0:726
+
+# Hell knight on deep lava
+F:K:85:0:731
+
+# Hell knight on shallow lava
+F:k:86:0:731
+
+# Nightcrawler on deep lava
+F:M:85:0:744
+
+# Nightcrawler on shallow lava
+F:m:86:0:744
+
+# Aether Hound on deep lava
+F:N:85:0:811
+
+# Aether Hound on shallow lava
+F:n:86:0:811
+
+# Eye druj on deep lava
+F:O:85:0:749
+
+# Eye druj on shallow lava
+F:o:86:0:749
+
+# Skull druj on deep lava
+F:P:85:0:750
+
+# Skull druj on shallow lava
+F:p:86:0:750
+
+# Great Hell Wyrm on deep lava
+F:Q:85:0:756
+
+# Great Hell Wyrm on shallow lava
+F:q:86:0:756
+
+# Nightwalker on deep lava
+F:R:85:0:768
+
+# Nightwalker on shallow lava
+F:r:86:0:768
+
+# Osyluth on deep lava
+F:S:85:0:773
+
+# Osyluth on shallow lava
+F:s:86:0:773
+
+# Great Wyrm of Many Colours on deep lava
+F:U:85:0:790
+
+# Great Wyrm of Many Colours on shallow lava
+F:u:86:0:790
+
+# Horned Reaper on deep lava
+F:V:85:0:811
+
+# Horned Reaper on shallow lava
+F:v:86:0:811
+
+# Bronze Golem on deep lava
+F:W:85:0:1015
+
+# Bronze Golem on shallow lava
+F:w:86:0:1015
+
+### Random Monsters and/or Items
+# Random monster on deep lava
+F:!:85:0:*99
+
+# Random monster on shallow lava
+F:1:86:0:*99
+
+# Random monster (upto 10 levels ood) on deep lava
+F:@:85:0:*109
+
+# Random monster (upto 10 levels ood) on shallow lava
+F:2:86:0:*109
+
+# Random monster and
+# Random object on deep lava
+F:&:85:0:*99:*99
+
+# Random monster and
+# Random object on shallow lava
+F:7:86:0:*99:*99
+
+# Random monster (upto 10 levels ood) and
+# Random object (upto 5 levels ood) on deep lava
+F:(:85:0:*109:*104
+
+# Random monster (upto 10 levels ood) and
+# Random object (upto 5 levels ood) on shallow lava
+F:9:86:0:*109:*104
+
+
+D:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+D:X #%%NNLL...JJJ....LL# ############## X
+D:X ##### #NNNN...Ljjjjj..LLL# #############################################..1!!!!...L### X
+D:X##.LL## #nNNN...LLJJj.LLLLL# #L....&!&!&....L%%%%%%%L..mRR%R%%M%MML%LL...DL...!1&..@L%%# X
+D:X#LL<..# #nn.LL.LLLL...%%%LL# #..##########################################LLL....LLL%%%# X
+D:X##%LL## #....LLL%%LLL..^LLL# #.L# #LL2.t..q.LLL## X
+D:X ###+# #D##############+#######.L# ##%%.LLLL&L...# X
+D:X #!# #.# #.......L%%# ##%%LL..2...t.## X
+D:X #^# #.############ ##########+# XXXXXXXXXX ##.9.t.LLLLL## X
+D:X #.# #LL%%%%LL...p# #11111# X########X ###############.2..LQ#+# X
+D:X ##.# ############D## #11211# X#9....9#X #o.....t...# ###^L..#(# X
+D:X #L## ##%%V## #12221# XXXXXX#..$$..#XXXXXX#LLLLKkk...# ###D#### X
+D:X ##!# ##.VH^%## #12221# X######t....m######X#LLLLkkk.LL# #.# X
+D:X #.# ##.iH%%hv## #11211### X#sSSSrrt%.mVVVLLe#X#.LL.kkk...# ##.# X
+D:X ###D######### #tiI%HHhvL# #11111+9# X#rRssRr.%.mVvvm..#X#%...LLL...# ##Lo###### X
+D:X #.^t^LLL...L## #.LIH%Hc..# ######### X#.MmmM..%..MMLLL.#X#%%......L&# ##.L##EBBB# X
+D:X #.jJ%%%L....L# ##..ICCL.## X#.L..L..%ttL.....#X########D### #.####LAAB## X
+D:X #JJJJL%LLL&..# ##..L.L## X#9LLL...%..LL(LLq#X #..L..# #.LL..LB%%L# X
+D:X #J%J..LLL%%LL## ##.t.## X######......######X #L.#### ###..LL%%%L## X
+D:X #jJJ^..bL%LL..## ##D################# XXXXXX#.LUUL.#XXXXXX #.L# #.PL%%%@(L# X
+D:X ##....BABLL..L.## #.uLL^L..L%^^..L%%# X#.L%%LL#X #L.#### ###.L%LL..##X
+D:X ##....B%%L.....## #################L# X#LLL..t#X #..twW# #L..LL...+pX
+D:X ###....LLL...LLL####################.# X#%L..7.#X #####L# ###LL...1###oX
+D:X #9+L%%L...LLL....D.+..%%oF.%%^..%%LL.# X#LLLLt.#X #p# #%%%!@..## #tX
+D:X ##################L###.L###..###.L#### X#7tt.LL#X #.# ######### #EX
+D:X ##################.# ############## X#.LLLL.#X ######D###################LX
+D:X ##11!!!&LL.+(#L# X#LL%%LL#X #G..LLL.LL...D..LL....^LLL%X
+D:X ##1!!!%%%%Lp###L# X#L%%%%Q#X #..LF....K...##############X
+D:X ##!!%%%%%LLL..#.# XXXXDDXXXX########.LLLL..KKK..#### X
+D:X ##.LLLLLLL...+.# #%%%%%%%%%%%%%+LL7..LL.k..L+o7# X
+D:X ############### ############################### X
+D:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+
+### Starting location
+P:6:6
diff --git a/lib/mods/theme/edit/s_factory.map b/lib/mods/theme/edit/s_factory.map
new file mode 100644
index 00000000..0cc3de1b
--- /dev/null
+++ b/lib/mods/theme/edit/s_factory.map
@@ -0,0 +1,238 @@
+# Map "s_factory.map"
+#
+# Special Level "Foul Factory" in the Illusory Castle
+#
+# Created for ToME 3.x on 11/11/2003
+# Written by Lord Dimwit (lorddimwit@hotmail.com)
+#
+# Middle-game dungeon
+# Comments: This level isn't designed to kill the player, really, just
+# induce such severe aggravation that their head explodes. There are
+# two parts of it, the "abusive trickery" part that leads the player
+# through a horrendous maze of strategically placed glass walls, permanent
+# walls, and ethereal walls (like permanent walls only invisible, very awful),
+# followed by a "Factory" stage that follows more traditional patterns of
+# throwing monsters systematically at the player.
+
+# Backported to ToME 2.x by Massimiliano Marangio on 02/07/2004
+
+# Replaced the letter : by R for Rubble
+# Changed the starting position to 21:51
+# Corrected the exits of the jumpgates
+
+### F:<letter>:<terrain>:<cave_info>:<monster>:<object>:<ego>:<artifact>:<trap>:<special>:<mimic>
+
+### Terrain Features
+
+
+# Permanent wall
+F:X:61:4
+
+# Fake wall
+F:I:189:0
+
+# Ethereal wall
+F:#:245:0
+
+# Copper Pillar
+F:;:244:0
+
+# Mountains
+F:M:97:0
+
+# granite
+F:G:57:4
+
+# Floor
+F:.:1:0
+
+# Deep Water
+F:~:187:4
+
+# Ash
+F:,:93:4
+
+# Fire
+F:%:205:0
+
+# Deep lava
+F:L:85:0
+
+# Shallow lava
+F:l:86:0
+
+# Glass Wall
+F:_:188:0
+
+# Rubble
+F:R:49:0
+
+# Trees
+F:T:96:0
+
+# Tainted water
+F:t:174:0
+
+# Chasm
+F:C:87:0
+
+# up staircase
+F:<:6:0
+
+# down staircase
+F:>:7:0
+
+# between gate 1
+F:1:160:6:0:0:0:0:0:845
+
+# between gate 2
+F:2:160:6:0:0:0:0:0:846
+
+# between gate 3
+F:3:160:6:0:0:0:0:0:4370
+
+# between gate 4
+F:4:160:6:0:0:0:0:0:3339
+
+# between gate 5
+F:5:160:6:0:0:0:0:0:4119
+
+# between gate 6
+F:6:160:6:0:0:0:0:0:6659
+
+# between gate 7
+F:7:160:6:0:0:0:0:0:9257
+
+# between gate 8
+F:8:160:6:0:0:0:0:0:8018
+
+# between gate 9
+F:9:160:6:0:0:0:0:0:9298
+
+# between gate A
+F:A:160:6:0:0:0:0:0:805
+
+# between gate B
+F:B:160:6:0:0:0:0:0:831
+
+# between gate D
+F:D:160:6:0:0:0:0:0:809
+
+# between gate E
+F:E:160:6:0:0:0:0:0:2826
+
+# between gate F
+F:F:160:6:0:0:0:0:0:2831
+
+# between gate H
+F:H:160:6:0:0:0:0:0:4631
+
+# between gate J
+F:J:160:6:0:0:0:0:0:7198
+
+# between gate K
+F:K:160:6:0:0:0:0:0:7990
+
+# between gate N
+F:N:160:6:0:0:0:0:0:9253
+
+# Treasure on floor
+F:$:1:0:0:*65
+
+# Trap (random) on floor
+F:^:1:0:0:0:0:0:*
+
+
+### Monsters
+
+# Eog Golem on floor
+F:g:1:0:530
+
+# Clay Golem on floor
+F:a:1:0:261
+
+# Aquatic Golem in water (OK, just for show)
+F:?:187:0:899
+
+# Stone Golem on floor
+F:b:1:0:323
+
+# Iron Golem on floor
+F:c:1:0:367
+
+# Colbran on floor
+F:d:1:0:435
+
+# Mithril golem on floor
+F:e:1:0:464
+
+# Colossus on floor
+F:f:1:0:558
+
+# Drolem on floor
+F:h:1:0:691
+
+# Demonic Q on shallow lava
+F:Q:86:0:727
+
+# Livingstone on floor
+F:i:1:0:336
+
+# Random monster (upto 8 levels ood) on normal floor
+F:&:1:0:*58
+
+
+### Items
+
+# Broken Stick
+F:s:1:0:0:727
+
+
+### Guaranteed Items
+
+# The Boots of the Machine
+F:*:205:0:0:0:0:218
+
+
+### Level layout
+
+D:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+D:X..e.e...I.......Xe..c.a..ca.c.....1X..3..XQQX,llllllllllllll2XX#Gi.X.X..XLABLX..X
+D:X.XXX...XXX.....XXXe.c..XXX__XX__XXXX.;.;.XllX,ll,ll,XXXXXXXXXXi.X#.XiXXXXL%%LXXXX
+D:X&XXXe.XX~XXeeeXX~XXe..XX~~~~~~ttttXX.....X,,,,Ll,ll,X..XII.X.X.i.XXG_XXXXL%%LXXXX
+D:X..&..XX~~~XXeXX~?~XX.&X~~~~t~ttttttX.;.;.X,lllll,ll,XX_..XX.XX#X..X#XXf.X_GG_X.fX
+D:XGXGXGX?~~~~_c_~~~~~X.&XX~~~~t~ttttXX.....X,L,,,,,lL,.X.#XXi..G.XXiX..XX.........X
+D:X.....XX~~?XXcXX~~~XXa..XXX__XX__XXXX.;.;.X,L,.XXX%L%XXXXcXX.XXX.X.X.X.XX.X.ff.X.X
+D:XXgXgXgXX~XXcccXX?XXXXX.a^^a.^^a...bXXXGXXX%L%XX.XX%XXa.aXIX.Xi#.XiXI.X.X........X
+D:XgXgXgXgXXX^^^^^XXX,ccXXXXXXXXXXXb.XX#...#XX%XX.XI_XX....X.X.#XXXIX.#GX.X.X....X.X
+D:X.......4X.^^5^^.X.c.c..c..c.c..c.XX.#...#.XXXIXX.X.a.c..XXi..I.X._.X.XXX...&&...X
+D:X..&&...XXXXXXXXXXc,c,c.XX_XX..ccXX..#...#..XX#iiX.X.a..a.XX.#XX._X.XX.XX.X....X.X
+D:X......XXEX,,,c,c,cc,ccXXMRMXXc.XX...#...#...XXX#iXXXXXc..IXGX.XXiX.....X........X
+D:XXXXXXXX..X,,,,,,,,,,,XXM..RMXXXX$$XXX...XXX$$XX..XX_GXXXXXX.Ii.X_X.X#XXX.X....X.X
+D:XT.T._.g.gXX,C,,,.,C,c_M.R.R.MXX$$$XXX...XXX$$$XX..XIXIXII.i.XX_.X.XX.XXXXGGGGGGXX
+D:X.T.T_.....XXlXXXXXlXFXXM..RMXX$$XXXXX...XXXXX$$XX.#.XX.X_X_XXI#.XXIIX.Xeee...eeeX
+D:X..T._.g..g.XlX_D_XlXXXXXM.MXX$$$#....%%%....#$$$X.X..XX_G.#.X.XXIXX..cXXXX...XXXX
+D:XMMMMX...&..XlX_._XlX6..XXXXXX$$$#....%*%....#$$$X._X#iX.XX..G_Xi.XXd..XLl#_._#lLX
+D:Xs.s._..&.&.XlX_._XlX..gg....X$$$#....%%%....#$$$X.IIX.X..XIXX.X.G#X..dXLl#_._#lLX
+D:X.s.s_g....XXlXXGXXlXX.g..d&.XX$$XXXXX...XXXXX$$XXXX._XG#X.XX.X_X.XX.c.XXXX...XXXX
+D:XXXXXXXXXXIXLLLXGXLLLXgg.g.d..XX$$$XXX...XXX$$$XX<...XiXX.X.Xi.X.X.Xd..X.........X
+D:Xgg.gXg.gXIXL%LXGXL%LXGXXX__XXXXX$$XXX...XXX$$XXXXXXIXXiX#XX#XX#X_XX...XXXXXXXIXXX
+D:X^^X^X^X^X^XX_XXGXX_XXGXXg..g.%.XX...X...X...XX.GI.X._iXXG...I..I.GX..dIX#I#I#I#IX
+D:X^^X^X^X^X^Xhl,&c.a&g.l.XX.g.g%RRXX..X###X..XX..#_X..XXX_iXXIXiXi_.Xc..X.IX.XXXIXX
+D:X^^X^X^X^X^X&,,,l&,lac.&.__.g.%.R.XX...>...XX#X.X..XX#.._X.X.X.#.XGX.X.XX_XX.X#i.X
+D:XH.Xg.gXg.gXla,ca&,f.fl.leXX..%R.RRXX.....XX.G.XX#XXI.XX.#.XGXXXiX.#X.XX.i._X.XGX#
+D:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXGXXXXXXXG.X..X#XXX.XX.XXI._XIX.XIXXI#.XXX.X
+D:X,.,G,&&,ee,ff,hgg,&&,,,.,,I7XXXc..aX.;.;.X&..XXXG#XX.G.XXX..XG######.G.#..##..iXX
+D:X^X,G.&&.ee,ff..gg,&&,.,,,,XXX..MRM.X.....X.....XXX.IIX.XGI.XX..IXXXXXXXXXXX._.X._
+D:X^X,XXXXXXXXXXX.XXXXXX,,.XXX..$.....X.;.;.Xh..&...GXXXGXi#IXX.IXX..#.....#.XX##XXX
+D:X^X,llL,LlLL,LXXXlll,XXXXX..aMR..$.cX.....X.....XXXX8XXXXXXXX#IX###..##.#..#XI.XKX
+D:X^XlLCCCCCCCCLllll%%l.R.R.R.R..M.R..X.;.;.X&..XXX.#X#.i.#.XXX#X...###.#.##.#.X#IXX
+D:X^X,lL,llL,Ll,XXX,lllXXXXXc.M..R.c..X.....XXXXX#.#.XIX#Xi.X...X###.#####.#...X#XXX
+D:X^X,XXXXXXXXXXX.XXXXXX,.,XXX...$.M..X.;.;.Xh.##i#.#XX_IX.#X.##I....#.#.###.##X#I.X
+D:X^X.G,&&,,gg.&.,ee,ff,,.,.,XXXa..R..X.....X..#.###.XIXX.X.X.##XX####..#..###II.X.X
+D:X,,,G,&&,,gg.&h.ee,ff,..,.,I^XXXM..9X.;J;.Xh.##.###..iiX#.X....II.....#....IX..XNX
+D:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+
+
+### Starting location
+P:21:51
diff --git a/lib/mods/theme/edit/s_gates.map b/lib/mods/theme/edit/s_gates.map
new file mode 100644
index 00000000..3ac7ccbf
--- /dev/null
+++ b/lib/mods/theme/edit/s_gates.map
@@ -0,0 +1,117 @@
+# Special Level "The Dimensional Gates" in the Pits of Angband
+#
+# Created for PernAngband 5.0.1 on 18/8/01
+# Written by Mynstral (mynstral@thehelm.com)
+
+%:special.txt
+
+### Gauranteed monsters
+
+# Quylthulg on normal floor
+F:a:1:0:342
+
+# Demonic Quylthulg on normal floor
+F:b:1:0:727
+
+# Draconic Quylthulg on normal floor
+F:c:1:0:759
+
+# Rotting Quylthulg on normal floor
+F:d:1:0:633
+
+# Greater Draconic Quylthulg on normal floor
+F:e:1:0:801
+
+# Greater Rotting Quylthulg on normal floor
+F:f:1:0:802
+
+# Great Hell Wyrm on normal floor
+F:g:1:0:756
+
+# Master Quythulg on normal floor
+F:h:1:0:821
+
+### Random monsters and/or items
+
+# Random monster (upto 5 levels ood) on normal floor
+F:&:1:0:*90
+
+# Random monster (upto 11 levels ood) on normal floor
+F:@:1:0:*96
+
+# Random monster (upto 9 levels ood) and
+# Random object (upto 7 levels ood) on normal floor
+F:8:1:0:*94:*92
+
+# Random monster (upto 40 levels ood) and
+# Random object (upto 20 levels ood
+F:9:1:0:*125:*105
+
+### Guaranteed items
+
+# The Ring of Power 'Narya' on normal floor
+F:1:1:0:0:0:0:10
+
+
+### Level design
+D:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+D:X*****...@%...aX.X9@********%%%%%%X9.VV....Xd.............A^^.......dX
+D:X*****...@%...aX.X@@********%%%%%%X.VVVV.X.XX.............B^^........X
+D:X*****...@%...aX.X99*XXX****%%88%%XVVWWVVX..XX.............^^.......9X
+D:X*****...@%...aX.X@@XXdXX***%%88%%XVVWWVVX...XX............^^.......CX
+D:X*****...@%...aX.X@XX...XX**%%%%%%X.VVVV.X.X..XX..........5^^........X
+D:X........@%...aX.XXX.....XX*%%%%%%X9.VV..X.XX..XX.........F^^.......dX
+D:X%X......@%...aX.X........XIXXXXXXXXXXX..X..XX..XXXXIXXXXXXXXXXXXXXXXX
+D:X.XXX....@%...aX.X..........XXX..>X...X..X...XX..XXXaXaXaXaXaXaXaXaXaX
+D:X...XXX..@%...aI.X..........XXX7..X...D..X.X..XX..XX.................X
+D:X.....XXX@%...aX.X..........XXXXXXXXXXX..X.XX..XX..XX................X
+D:X.......XXX...aX.X..........XXXXXXXaG....X..XX..XX..XX...............X
+D:X..X......XXX.XX%XX^^^^^X...XXXXXXXaG....X...XX..XX..XX..............X
+D:X^^XX.......XXX***X^^^^^X...XIIII7XXXXXXXXXX..XX..XX..XXXXXXXXXXXX+X8X
+D:X^^XX.........X.6.X^^^^^X...XIXXXXX&&&&&&&&XX..XX..XX...........cX.XXX
+D:X..XXX........X***X^^^^^X...XIXXXXX.........XX..XX..XXXXXXXXXXXXXX..XX
+D:X^^X8X........XXXXX^^^^^X...XIIIIIXVVV.......XX..XX.............bXX..X
+D:X..X8XX................XX...XXXXXIXVVVV.......XX..XXXXXXXXXXXXXXXXXX+X
+D:X^^X88X................XX...XIIIIIXVVVVVV..@...XX.^^^^^^^^^^^^^a.....X
+D:X^^X99XX...............XX...XIXXXXX4..VVVV......XXXXXXXXXXXXXXXXXXXXXX
+D:X..X999X...............XX...XIXXXXXXXXX.VVVV....***********.........bX
+D:X^^XIIIXX..............XX...XIX...5..fX...VVVVV.@....................X
+D:X..X....X........d.....XX...XIXf......X...VVVVVVV...............@....X
+D:X^^X....XX............XXX...XIXXXXXXXXX.......VVVVVVV................X
+D:X^^X&&&&&X............XXX...XIIIIIXe...........VVVVVVVVVVVV..........X
+D:X..X%%%.%XX..........XXX....XXXXXIX.............@VVVVVVVVVVVV@.......X
+D:X^^X88%.%8X.........XXX.....XXXXXIX...................VVVVVVVVVV.....X
+D:X..X%%%.%%XX........XX......XXXXXIX@.....................VVVVVVVVVVVVX
+D:X^^X......cX......XXXX......XXXXXIX........@..........@....VVVVVVVVVVX
+D:X^^^......cXX888XXXXX......dIIIIIIX.........................b.VVV...6X
+D:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+D:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+D:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+D:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+D:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXgLLLLLgXXXXXXXXXXXXXXXXXXXXXXXXXXX
+D:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXLLLLXXLLLLLLXXXXXXXXXXXXXXXXXXXXXXXX
+D:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXgLLLLLXXXXXgLLLLLLLXXgXXXXXXXXXXXXXXXXXX
+D:XXXXXXXXXXXXXXXXXXXXXXXXXXXXLLLLgXXXXXXXXXXXXXXLLLLLLLXXXXXXXXXXXXXXXX
+D:XXXXXXXXXXXXXXXXXXXXXXXXXXXXLLXXXXXXXXXXXXXXXXXXgXXXLLLgXXXXXXXXXXXXXX
+D:XXXXXXXXXXXXXXXXXXXXXXXXXXXXLgXXXXXXXXXXXXXXXXXXXXXXXXLLLLXXXXXXXXXXXX
+D:XXXXXXXXXXXXXXXXXXXfXXXXXXXXLXXXXXXXXXXXXXXXXXXXXXXXXXgLLLLXXXXXXXXXXX
+D:XXXXXXXXXXXXXXXXXXX.XXXXXXXghgXXXXbXXXXXXXXaXXXXXXXXXXXXXXLLLLgXXXXXXX
+D:XXXXXXXXXXXXXXXXXXX.XXXXXXXg1gXXXX.XXXXXXXX.XXXXXXXXXXXXXXXXgLLXXXXXXX
+D:XXXXXXXXXXXXXXXXXXX^XXXXXXXXXXXXXX^XXXXXXXX^XXXXXXXXXXXXXXXXXXLXXXXXXX
+D:XXXXXXXXXXXXXXX4..^^^..^^^.......^^^......^^^.........EXXXXXXXLXXXXXXX
+D:XXXXXXXXXXXXXXXXXXXXXXXX^XXXXXXXXX^XXXXXXXX^XXXXXXXXXXXXXXXXXLLXXXXXXX
+D:XXXXXXXXXXXXXXXXXXXXXXXX.XXXXXXXXX.XXXXXXXX.XXXXXXXXXXXXXXXXLLLXXXXXXX
+D:XXXXXXXXXXXXXXXXXXXXXXXX.XXXXXXXXXcXXXXXXXXaXXXXXXXXXXXXXXXLLXXXXXXXXX
+D:XXXXXXXXXXXXXXXXXXXXXXXXeXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXgLLLXXXXXXXXXX
+D:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXLLLXXXXXXXXXXX
+D:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXLLXgXXXXXXXXXXX
+D:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXLLXXXXXXXXXXXXXX
+D:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXLLXXXXXXXXXXXXXXX
+D:X...dXXXXXXXXXXe..0XXXXXXXXXXXXXXXD..EXXXXXXXXXXXXXXLLXXXXXXXXXXXcc..X
+D:X...dXXXXXXXXXX....XXXXXXXXXXXXXXX....XXXXXXXXXXXXXX.XXXXXXXXXXXX....X
+D:XA...XXXXXXXXXXF..eXXXXXXXXXXXXXXXC...XXXXXXXXXXXXXX0XXXXXXXXXXXX...BX
+D:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+
+
+# Starting location
+P:11:37
diff --git a/lib/mods/theme/edit/s_info.txt b/lib/mods/theme/edit/s_info.txt
new file mode 100644
index 00000000..40c0d41e
--- /dev/null
+++ b/lib/mods/theme/edit/s_info.txt
@@ -0,0 +1,542 @@
+# File: s_info.txt
+
+
+# This file is used to initialize the "lib/data/s_info.raw" file, which is
+# used to initialize the "skills" information for the PernAngband game.
+
+# 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/data/s_info.raw" file.
+
+# The skill indexes are defined in "defines.h", and must not be changed.
+
+# N:idx:name
+# D:desc
+# A:action mkey:action desc
+# I:rate
+
+# E:exclusive skill:exclusive skill
+# O:skill:opposing skill%percent
+# A:skill:friendly skill%percent
+
+# T:father:child
+
+# Version stamp (required)
+
+V:2.0.0
+
+################################## MAGIC ##################################
+
+N:56:Magic-Device
+D:Eases the use of magical devices, such as wands, staves and rods
+D:It also helps pseudo-id of magic objects
+I:1000
+F:RANDOM_GAIN
+
+N:54:Spell-learning
+D:You should not see that ! that is a BUG!
+#A:18:Learn a spell from a realm
+I:1000
+F:HIDDEN
+
+N:41:Sorcery
+D:Ability to use all the magic schools as if their skill was sorcery
+D:But the price to channel that much magic is your health
+A:17:Cast a spell
+I:1000
+
+N:1:Conveyance
+D:Ability to learn and use spells from the Conveyance school
+D:Spells use the intelligence stat
+A:17:Cast a spell
+I:1000
+F:RANDOM_GAIN
+
+N:2:Mana
+D:Ability to learn and use spells from the Mana school
+D:Spells use the intelligence stat
+A:17:Cast a spell
+I:1000
+
+N:3:Fire
+D:Ability to learn and use spells from the Fire school
+D:Spells use the intelligence stat
+A:17:Cast a spell
+I:1000
+
+N:4:Air
+D:Ability to learn and use spells from the Air school
+D:Spells use the intelligence stat
+A:17:Cast a spell
+I:1000
+
+N:5:Water
+D:Ability to learn and use spells from the Water school
+D:Spells use the intelligence stat
+A:17:Cast a spell
+I:1000
+
+N:6:Nature
+D:Ability to learn and use spells from the Nature school
+D:Spells use the intelligence stat
+A:17:Cast a spell
+I:1000
+F:RANDOM_GAIN
+
+N:7:Earth
+D:Ability to learn and use spells from the Earth school
+D:Spells use the intelligence stat
+A:17:Cast a spell
+I:1000
+
+N:10:Divination
+D:Ability to learn and use spells from the Divination school
+D:Spells use the intelligence stat
+A:17:Cast a spell
+I:1000
+F:RANDOM_GAIN
+
+N:11:Temporal
+D:Ability to learn and use spells from the Temporal school
+D:Spells use the intelligence stat
+A:17:Cast a spell
+I:1000
+
+N:14:Meta
+D:Ability to learn and use spells from the Meta school
+D:Spells use the intelligence stat
+A:17:Cast a spell
+I:1000
+
+N:51:Mind
+D:Ability to learn and use spells from the Mind school
+D:Spells use the intelligence stat
+A:17:Cast a spell
+I:1000
+
+N:55:Udun
+D:Ability to learn and use spells from the Udun school
+D:Spells use the intelligence stat
+A:17:Cast a spell
+I:1000
+F:HIDDEN
+
+N:13:Demonology
+D:Ability to use incantations from the Demonblades
+D:Spells use the intelligence stat
+A:17:Cast a spell
+I:1000
+
+N:31:Necromancy
+D:Ability to harness the powers of the dead
+D:Spells use the intelligence stat
+A:7:Use Necromancy
+I:1000
+F:RANDOM_GAIN
+G:60
+
+N:34:Runecraft
+D:Ability to combine magic runes to create your own spells
+D:Runespells use the dexterity stat
+A:9:Use Runespells
+I:1000
+
+N:43:Thaumaturgy
+D:Ability to gain and cast innate spells
+D:Spells use the intelligence stat
+A:8:Cast a thaumaturgy spell
+I:1000
+F:RANDOM_GAIN
+
+N:15:Magic
+D:General ability to do magic, also affects mana reserves and
+D:magic device ability. Helps pseudo-id of magic objects
+A:19:Copy a spell
+I:1000
+F:RANDOM_GAIN
+
+N:45:Spell-power
+D:Ability to increase the power of spells
+I:1000
+
+N:59:Geomancy
+D:Ability to understand the raw elemental forces of nature and use
+D:them to your advantage. Most spells need Fire/Water/Earth/Air skills
+A:101:Use Geomancy
+I:1000
+
+# All magic skills affect magic skill
+f:Magic-Device:Magic%7
+f:Spell-power:Magic%20
+f:Sorcery:Magic%20
+f:Mana:Magic%10
+f:Fire:Magic%10
+f:Air:Magic%10
+f:Water:Magic%10
+f:Earth:Magic%10
+f:Geomancy:Fire%45
+f:Geomancy:Earth%45
+f:Geomancy:Air%45
+f:Geomancy:Water%45
+f:Conveyance:Magic%10
+f:Divination:Magic%10
+f:Nature:Magic%10
+f:Temporal:Magic%10
+f:Meta:Magic%10
+f:Mind:Magic%10
+f:Udun:Magic%10
+f:Demonology:Magic%10
+f:Necromancy:Magic%4
+f:Runecraft:Magic%12
+f:Thaumaturgy:Magic%6
+
+
+
+################################## COMBAT ##################################
+
+N:16:Combat
+D:General ability to fight and to pseudo-id armour and weapons
+D:It also allows the use of heavier armour without penalties
+I:1000
+F:RANDOM_GAIN
+
+N:17:Weaponmastery
+D:General ability to use melee weapons
+I:1000
+F:RANDOM_GAIN
+
+N:18:Sword-mastery
+D:Ability to use swords
+I:1000
+
+N:19:Axe-mastery
+D:Ability to use axes
+I:1000
+
+N:20:Polearm-mastery
+D:Ability to use polearms
+I:1000
+
+N:21:Hafted-mastery
+D:Ability to use hafted weapons
+I:1000
+
+N:22:Backstab
+D:Ability to backstab fleeing and sleeping monsters to increase damage
+I:1000
+
+N:23:Archery
+D:General ability to use ranged weapons
+I:1000
+F:RANDOM_GAIN
+
+N:24:Sling-mastery
+D:Ability to use slings
+A:23:Fire piercing shots
+I:1000
+
+N:25:Bow-mastery
+D:Ability to use bows
+A:23:Fire piercing shots
+I:1000
+
+N:26:Crossbow-mastery
+D:Ability to use crossbows
+A:23:Fire piercing shots
+I:1000
+
+N:27:Boomerang-mastery
+D:Ability to use boomerangs
+I:1000
+
+N:58:Boulder-throwing
+D:Ability to make and throw boulders
+A:21:Tear down a wall to create boulders
+I:1000
+F:RANDOM_GAIN
+
+N:42:Barehand-combat
+D:Ability to fight barehanded
+I:1000
+F:RANDOM_GAIN
+G:70
+
+N:47:Bearform-combat
+D:Ability to fight in bear form
+I:1000
+F:HIDDEN | AUTO_HIDE
+
+N:52:Critical-hits
+D:Ability to deal critical hits with swords < 5lb
+I:1000
+
+N:57:Stunning-blows
+D:Ability to stun opponents when doing critical hits with hafted weapons > 5 lb
+I:1000
+
+# List of combat friendly skills
+
+# Melee: Specific masteries improve generic mastery
+f:Critical-hits:Sword-mastery%5
+f:Sword-mastery:Weaponmastery%25
+f:Axe-mastery:Weaponmastery%25
+f:Polearm-mastery:Weaponmastery%25
+f:Stunning-blows:Hafted-mastery%5
+f:Hafted-mastery:Weaponmastery%25
+
+# Ranged: Specific masteries improve generic mastery
+f:Sling-mastery:Archery%25
+f:Bow-mastery:Archery%25
+f:Crossbow-mastery:Archery%25
+f:Boomerang-mastery:Archery%25
+
+# All combat skills improve Combat
+f:Weaponmastery:Combat%50
+f:Sword-mastery:Combat%7
+f:Axe-mastery:Combat%7
+f:Polearm-mastery:Combat%7
+f:Hafted-mastery:Combat%7
+f:Archery:Combat%50
+f:Sling-mastery:Combat%7
+f:Bow-mastery:Combat%7
+f:Crossbow-mastery:Combat%7
+f:Boomerang-mastery:Combat%7
+f:Barehand-combat:Combat%50
+f:Boulder-throwing:Combat%40
+
+# No more, let's see how it turns out
+# Sorcery and Weaponmastery aren't exactly friendly to each other
+#O:Sorcery:Weaponmastery%100
+#O:Sorcery:Archery%100
+#O:Sorcery:Barehand-combat%100
+#O:Weaponmastery:Sorcery%100
+#O:Archery:Sorcery%100
+#O:Barehand-combat:Sorcery%100
+
+
+
+############################### SPIRITUALITY SKILLS ###########################
+
+N:28:Spirituality
+D:General ability to use spiritual skills and also influence your Saving Throw
+I:1000
+F:RANDOM_GAIN
+
+N:53:Prayer
+D:Ability to learn and use spells from the gods' schools
+D:Spells use the wisdom stat and cost piety instead of mana
+A:17:Cast a spell
+I:1000
+
+N:12:Druidistic
+D:Ability to learn and use prayers from the Druidistic realm
+D:Nature powers use the wisdom stat
+A:1:Cast a druidistic spell
+I:1000
+
+N:29:Mindcraft
+D:Ability to focus the powers of the mind
+D:Mindpowers use the wisdom stat
+A:2:Use Mindcraft
+I:1000
+F:RANDOM_GAIN
+G:50
+
+N:9:Music
+D:Ability to learn and sing songs
+D:Songs use the charisma stat
+A:17:Cast a spell
+I:1000
+
+f:Prayer:Spirituality%10
+f:Druidistic:Spirituality%10
+f:Mindcraft:Spirituality%10
+f:Music:Spirituality%10
+
+f:Prayer:Magic%10
+f:Druidistic:Magic%10
+f:Mindcraft:Magic%10
+f:Music:Magic%10
+
+
+################################## MISC SKILLS ###############################
+
+N:30:Misc
+D:Not a real skill, it is only used to regroup some skills
+I:0
+
+N:33:Antimagic
+D:Ability to generate an antimagic field
+A:3:Use antimagic
+I:1000
+F:RANDOM_GAIN
+G:80
+
+# Antimagic exclude all magic
+E:Magic-Device:Antimagic
+E:Mana:Antimagic
+E:Geomancy:Antimagic
+E:Fire:Antimagic
+E:Air:Antimagic
+E:Water:Antimagic
+E:Earth:Antimagic
+E:Conveyance:Antimagic
+E:Divination:Antimagic
+E:Temporal:Antimagic
+E:Meta:Antimagic
+E:Mind:Antimagic
+E:Nature:Antimagic
+E:Udun:Antimagic
+E:Sorcery:Antimagic
+E:Demonology:Antimagic
+E:Runecraft:Antimagic
+E:Necromancy:Antimagic
+E:Mindcraft:Antimagic
+E:Music:Antimagic
+E:Prayer:Antimagic
+E:Druidistic:Antimagic
+E:Thaumaturgy:Antimagic
+
+################################## SNEAKINESS SKILLS ###############################
+
+N:35:Sneakiness
+D:General ability at the sneakiness skills.
+D:It also affects the searching abilities
+I:0
+F:RANDOM_GAIN
+
+N:36:Stealth
+D:Ability to move unnoticed, silently
+I:0
+F:RANDOM_GAIN
+
+N:37:Disarming
+D:Ability to disarm the various traps
+I:0
+F:RANDOM_GAIN
+
+N:40:Stealing
+D:Ability to steal objects
+A:15:Steal object
+I:0
+
+N:46:Dodging
+D:Ability to dodge blows and bolts
+A:16:Check dodge chance
+I:0
+
+f:Stealth:Sneakiness%15
+f:Disarming:Sneakiness%10
+f:Backstab:Sneakiness%5
+f:Stealing:Sneakiness%15
+f:Dodging:Sneakiness%10
+
+
+################################## MONSTER SKILLS ################################
+
+N:48:Monster-lore
+D:General ability at the monster related skills, ability to gain experience
+D:from friendly kills. It also affects the number of companions you can have
+I:0
+A:22:Turn pet into companion
+F:RANDOM_GAIN
+
+N:44:Summoning
+D:Ability to create totems from monsters and use them to summon monsters
+A:13:Manipulate totems
+I:1000
+F:RANDOM_GAIN
+G:60
+
+N:49:Corpse-preservation
+D:Ability not to destroy the monsters' corpses when killing them
+I:0
+
+N:50:Possession
+D:Ability to incarnate into monsters
+A:11:Use the possession skill
+I:0
+
+N:8:Symbiosis
+D:Ability to enter in symbiosis with monsters unable to move by themselves
+D:Spells use the intelligence stat
+A:20:Use symbiotic powers
+I:1000
+F:RANDOM_GAIN
+G:70
+
+N:32:Mimicry
+D:Ability to use cloaks of mimicry to change form
+A:6:Use Mimicry
+I:1000
+F:RANDOM_GAIN
+G:80
+
+f:Possession:Monster-lore%10
+f:Corpse-preservation:Monster-lore%10
+f:Summoning:Monster-lore%10
+f:Symbiosis:Monster-lore%10
+f:Mimicry:Monster-lore%10
+
+################################## SKILL TREE ################################
+
+T:Main:Combat
+T:Combat:Weaponmastery
+T:Weaponmastery:Sword-mastery
+T:Sword-mastery:Critical-hits
+T:Weaponmastery:Axe-mastery
+T:Weaponmastery:Hafted-mastery
+T:Hafted-mastery:Stunning-blows
+T:Weaponmastery:Polearm-mastery
+T:Combat:Archery
+T:Archery:Sling-mastery
+T:Archery:Bow-mastery
+T:Archery:Crossbow-mastery
+T:Archery:Boomerang-mastery
+T:Combat:Barehand-combat
+T:Combat:Bearform-combat
+T:Combat:Boulder-throwing
+T:Combat:Antimagic
+
+T:Main:Sneakiness
+T:Sneakiness:Stealth
+T:Sneakiness:Disarming
+T:Sneakiness:Backstab
+T:Sneakiness:Stealing
+T:Sneakiness:Dodging
+
+T:Main:Magic
+T:Magic:Magic-Device
+T:Magic:Spell-power
+T:Magic:Sorcery
+T:Magic:Mana
+T:Magic:Geomancy
+T:Magic:Meta
+T:Magic:Conveyance
+T:Magic:Divination
+T:Magic:Temporal
+T:Magic:Mind
+T:Magic:Nature
+T:Magic:Udun
+T:Magic:Demonology
+T:Magic:Necromancy
+T:Magic:Runecraft
+T:Magic:Thaumaturgy
+
+T:Geomancy:Fire
+T:Geomancy:Water
+T:Geomancy:Air
+T:Geomancy:Earth
+
+T:Main:Spirituality
+T:Spirituality:Prayer
+T:Spirituality:Mindcraft
+T:Spirituality:Music
+
+T:Main:Monster-lore
+T:Monster-lore:Summoning
+T:Monster-lore:Corpse-preservation
+T:Monster-lore:Possession
+T:Monster-lore:Symbiosis
+T:Monster-lore:Mimicry
diff --git a/lib/mods/theme/edit/s_name.map b/lib/mods/theme/edit/s_name.map
new file mode 100644
index 00000000..795d8786
--- /dev/null
+++ b/lib/mods/theme/edit/s_name.map
@@ -0,0 +1,110 @@
+# Special level "The Nameless Level" in the Pits of Angband
+#
+# Created for PernAngband 5.0.1 on 18/8/01
+# Written by Mynstral (mynstral@thehelm.com)
+
+%:special.txt
+
+# Great Storm Wyrm on normal floor
+F:a:1:0:728
+
+# Mature Red Dragon on normal floor
+F:b:1:0:589
+
+# Mature White Dragon on normal floor
+F:c:1:0:549
+
+# Ancient Blue Dragon on normal floor
+F:d:1:0:601
+
+# Ancient Black Dragon on normal floor
+F:e:1:0:624
+
+# Ancient Multi-hued Dragon on normal floor
+F:f:1:0:675
+
+# Great Hell Wyrm on normal floor
+F:g:1:0:756
+
+# Great Wyrm of Many Colours on normal floor
+F:h:1:0:790
+
+# Great Ice Wyrm on normal floor
+F:i:1:0:741
+
+# Sky Drake on normal floor
+F:j:1:0:793
+
+### Random Monsters and/or Items
+# Random monster (upto 5 levels ood) on normal floor
+F:&:1:0:*100
+
+# Random monster (upto 11 levels ood) on normal floor
+F:@:1:0:*106
+
+# Random monster (upto 9 levels ood) and
+# Random object (upto 7 levels ood) on normal floor
+F:8:1:0:*104:*102
+
+# Random monster (upto 40 levels ood) and
+# Random object (upto 20 levels ood
+F:9:1:0:*135:*115
+
+# Random monster (upto 3 levels ood)
+F:-:1:0:*98
+
+# Random object (upto 7 levels ood)
+F:=:1:0:0:*102
+
+### Guaranteed Items
+# The Multi-Hued Dragon Scale Mail 'Razorback' on normal floor
+F:1:1:0:0:0:0:16
+
+### Level Design
+D:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+D:X.....LLLLLLLLL.....XXX.G=-&&=-G^.........>X
+D:X.LLL...........LLLXX...G=-&.=-G^........1.X
+D:X.L9L.LLLLLLLLLLLLX%...EGE.=&.FG^..........X
+D:X.L99.L&..........X%....G..&-..G^....j.....X
+D:X.LLLLL&LLLLLLLLL.LXX...G=-=&-=G^..........X
+D:X....&&&L.......L.L*XXX.G-=&&-=G^^^^^^^^^^^X
+D:XLLLLLLLL.LLLLL..&L**XXXXXXXGGGG%XXXXXXXXXXX
+D:XXXXXXLL..L***LLLLLLLX^^^^8Xi....%@@^^.^^@@X
+D:X5..8X.&.XXXXXX......D^^^^8XIIIIIXbb^^.^^ccX
+D:X...8X...XA...X.LLLLLX^^^^8X.....X..^^.^^..X
+D:X...8X.XXXC...X.LL...XXXIXXX^^^^^X..^^.^^..X
+D:XGXXXX.LfX7...X&LL.L.Xa^^^aXf...fX..^^.^^..X
+D:X.X5XL.L*XB...X&&..L.X^b^b^X^^^^^X..^^.^^..X
+D:X.X^XL.L*XXXXXXLLLLL.X^^7^^X.....X..^^.^^..X
+D:X.X^XL.L***fXL.....&&X^b^b^XIIIIIX..^^.^^..X
+D:X.X^XL.LLLLLXL.LLLLLLXa^^^aXi....X..^^.^^..X
+D:X.X^XL.........XXXXXXXXX%XXXXXXXXX..^^.^^..X
+D:X.X^XXXXXXXXXXLX^...^Xe-^=dX^^..&X..^^.^^..X
+D:X.X^^^^^^^^^^XLX.^^^.X-^^^=X^^..&X..^^.^^..X
+D:X.XXXXXXXXXX^X8Xf^B^.%^^6^^%^^C.&X..^^.^^..X
+D:X.LLLLLLLLL+^XXX.^^^.X-^^^=X^^..&X..^^.^^..X
+D:X.XXXXXXXXXXXXXX^...^Xd-^=eX^^..&X..^^.^^..X
+D:X.Xbbbbb......XXXXXXXXXX%XXXXXXXXX..^^.^^..X
+D:X.XbbbbXXXX^^^^XX....X^^^^^X...h.X..^^.^^..X
+D:X.XbbbXX^^XXX^^^XX...X^ccc^X....0X..^^.^^..X
+D:X.XbbXX.^X%bXX^^^XX..X^.A.^X.....X..^^0^^..X
+D:X.IbXX..XXbbbXX^^^XX.X^ccc^XIXXXXXXXXXXXXXXX
+D:X.XXX..XX.....X%^^^XXX^^^^^XlllllllllllllllX
+D:X.X99.XXW......XX^^^XXXXXXXXlllllllllllllllX
+D:X.X99XXWWW...a..XX^^.XXllllllLLLLLlXXXX%XXXX
+D:X.XXXX..WWW.....cXX^.XXXXXlllllllllXVVVVVVVX
+D:X.X8.....WWW....ccX^.X^^^XLLLlLLLLLXVVVVVVVX
+D:X.X%XXXXXXXWW...cXXX.X+X^XlllllllllXV%%%%%VX
+D:X.X.......XWWW..X%^X.XLX^XlLLLLLLLLXV%8^8%VX
+D:X.XXXXXX%.X.WWWXX^^X.XLX^XlllllllllXV%^a^%VX
+D:X.X.IIIIX.X..WXX..XXcXLX^XLLLlLLLLlXV%^^^%VX
+D:X.X%XXXIX.X..XX..XXccXLX^XlglllLgllXV%^^^%VX
+D:X.Xa.6XIX.X.XX..XXcccXLX^XlllllXXXXXV%^a^%VX
+D:X+XXX.XIX.X.X99XXccccXLX^XXXXXXX888XV%8^8%VX
+D:X%%%Xa%.X.%8X99XcccccXLX^^^^^^4X...XV%%%%%VX
+D:X%.%XXXXXXXXXXXXIXXXXXLXXXXXXXXX...XVVVVVVVX
+D:X.%%+..........................G..4X...F...X
+D:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+
+### Starting Location
+P:43:4
diff --git a/lib/mods/theme/edit/s_orc.map b/lib/mods/theme/edit/s_orc.map
new file mode 100644
index 00000000..62852d47
--- /dev/null
+++ b/lib/mods/theme/edit/s_orc.map
@@ -0,0 +1,109 @@
+# Special level "The Orc Barracks" in the Pits of Angband
+#
+# Created for PernAngband 5.0.1 on 18/8/01
+
+%:special.txt
+
+#Y:40:118:126:149:264:238:285:313:330:404:15:0:0:35:22
+# Shrieker
+F:a:1:0:40
+
+# snaga
+F:b:1:0:118
+
+# cave orc
+F:c:1:0:126
+
+# hill orc
+F:d:1:0:149
+
+# half orc
+F:e:1:0:264
+
+# ogre
+F:f:1:0:238
+
+# ogrillion
+F:g:1:0:285
+
+# bolg
+F:h:1:0:330
+
+# uruk
+F:i:1:0:313
+
+# black orc
+F:j:1:0:244
+
+### Random Monsters and/or Items
+# Random monster (upto 5 levels ood) on normal floor
+F:&:1:0:*35
+
+# Random monster (upto 11 levels ood) on normal floor
+F:@:1:0:*46
+
+# Random monster (upto 9 levels ood) and
+# Random object (upto 7 levels ood) on normal floor
+F:8:1:0:*44:*42
+
+# Random monster (upto 40 levels ood) and
+# Random object (upto 20 levels ood
+F:9:1:0:*75:*55
+
+# Random monster (upto 3 levels ood)
+F:-:1:0:*38
+
+# Random object (upto 7 levels ood)
+F:=:1:0:0:*42
+
+### Guaranteed Items
+
+# The Key of Orthanc
+F:1:1:0:0:0:0:15
+
+### Level Design
+D:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+D:Xa.......................ccccccccc.......................aX
+D:X.lllllllllllllllllllllllllllllllllllllllllllllllllllllll.X
+D:X.l......................ccccccccc.....g.g..............l.X
+D:X.l.XXXXXXXXXXXXXXXXXXXXXXXXX.XXXXXXXXXXDXXXXXXXXXXXXXX.l.X
+D:X.l.Xa.......efX1Xfe.......aX.X.aaa.D.gX.XacbdddccjjjaX.l.X
+D:X.l.D........efG.Gfe........D.D.bbb.XXXX.XcfbcbcbbjjeeX.l.X
+D:X.l.X........efX.Xfe........X.X.bbb.D.gX.XfbbgdcbdbjjjX.l.X
+D:X.l.XXXXXX...efG.Gfe...XXXXXX.X.bbb.XXXX.XebdcfbdccejjX.l.X
+D:X.l.X.c..XXX.efX.Xfe.XXXcc.aX.D.ccc.D.gX.XcfcbgeebdebfX.l.X
+D:X.l.D..d..aXXXfX.XfXXXe.....D.X.ccc.XXXX.XedbcdbcdcggeX.l.X
+D:X.l.X........XXX.XXX..bbb.ddX.X.ddd.D.gX.XdgfcfegbeebcX.l.X
+D:X.l.X..f.c.bf.G...G.c..cc...X.D.ddd.XXXX.XcbeefccbfbdbX.l.X
+D:X.l.X.d..bb.d.Gi.iG...cbb.bdX.X.eee.D.gX.XbgcfbgcfdebcX.l.X
+D:X.l.X.cc...c..G.7.G.cc..d.e.X.X.eee.XXXX.XcbdfeccdbcdbX.l.X
+D:X.l.X..b.f.bbXGGGGGX.bbb.bb.X.D.f.f.D.gX.XfdebbdgeefgdX.l.X
+D:X.l.D.c..dbbXXa...aXXX..d...D.X.f.f.XXXX.DdefddbcbdbddX.l.X
+D:X.l.X...c.XXX..g.g...XXX...bX.X.....D..XGXXeegcefdcefcX.l.X
+D:X.l.Xbb..aXg.gggjgggg.gX.bbaXDXaaa..XXjIa8XacbddbegbdaX.l.X
+D:X.l.XXXXXXXXDXXXXXXXXDXXXXXXXaXXXXXXXXXXXXXXXXXXXXXXXXX.l.X
+D:X.l........................Da.aD........................l.X
+D:X.l.XXXXXXXXXXXXXXXXXXXXXXXXXaXXXXXXXXXXXXXXXXXXXXXXXXX.l.X
+D:X.l.....eeeeee.........fffXXXDXXXfff.........eeeeee.....l.X
+D:X.l.....eeeeee.........fffX.....Xfff.........eeeeee.....l.X
+D:X.llllllllllllllllllllllllX.....Xllllllllllllllllllllllll.X
+D:Xa.....................XXXXGGGGGXXXX.....................aX
+D:XXXXXXXXXXIXXXXXXXXXXXXXgafff>fffagXXXXXXXXXXXXXIXXXXXXXXXX
+D:XjjjX.#########.XfffXXgggfffffffffgggXXfffX.#########.XjjjX
+D:XfffX...........XeeeXggggjjj...jjjggggXgggX...........XfffX
+D:XfffXGGGDX.XXXXXX...Xgggg....h....ggggX...XXXXXX.XDGGGXfffX
+D:Xgg......X.X........Xgggg.........ggggX........X.X......eeX
+D:Xgg....ggX.X.XXXXXX.XXgggggggggggggggXX.XXXXXX.X.Xee....eeX
+D:Xgg....ggX.X.X......XXXXgggggggggggXXXX......X.X.Xee....eeX
+D:Xgg....ggX.X.X.XXXXXX..XXXXfffffXXXX..XXXXXX.X.X.Xee....eeX
+D:Xgg....ggX.X.X.........#.4XXXDXXX4.#.........X.X.Xee....eeX
+D:Xgg....ggX.X.XXXXXXXXXIXXXXa...aXXXXIXXXXXXXXX.X.Xee....eeX
+D:Xgg....ggX.X.Xigfedcba.XiX..X#X..XiX.abcdefgiX.X.Xee....eeX
+D:Xgg....ggX.X.XGGGGGGGGGX....X.X....IGGGGGGGGGX.X.Xee....eeX
+D:XggggggggX.X.X@@@@@@@@@IXXXaX7XaXXXX@@@@@@@@@X.X.XeeeeeeeeX
+D:XggggggggI.X+XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX+X.IeeeeeeeeX
+D:XaaaaagggX.......................................XeeeaaaaaX
+D:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+
+### Starting Location
+P:22:31
diff --git a/lib/mods/theme/edit/s_orthanc.map b/lib/mods/theme/edit/s_orthanc.map
new file mode 100644
index 00000000..fd14d3d4
--- /dev/null
+++ b/lib/mods/theme/edit/s_orthanc.map
@@ -0,0 +1,99 @@
+# Special level "Orthanc" in Isengard
+# Created by Burb Lulls; reworked for Theme by furiosity <furiosity@gmail.com>
+
+%:special.txt
+
+### Terrain
+
+# Fire
+F:$:205:0
+
+# Copper Pillar
+F:!:244:0
+
+# Dead Tree
+F:;:92:0
+
+# Tainted Water
+F:~:174:0
+
+# Orthanc's Door
+F:[:248:0
+
+# Ash
+F:,:93:0
+
+### Random Monsters (all lvl80)
+
+# Random monster on ash
+F:a:93:0:*40
+
+# Random monster on normal floor
+F:b:1:0:*40
+
+### Guaranteed Monsters
+
+# Ent on ash
+F:&:93:0:708
+
+# Infernal Device on normal floor
+F:2:1:0:1079
+
+# Guardian - Saruman on normal floor
+F:@:1:0:771
+
+### Guaranteed Item
+
+# The Palantir Of Orthanc on normal floor
+F:1:1:0:0:0:0:202
+
+### Dungeon Design
+D:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+D:X;;;;;;;;;;;;;;;;;;;;;;;,,,,,,,,,,a,4,a,,,,,,,,,,,,,,,;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;a;&,a,,,,,~~~~~~~~~~~~~~~~~~~~~,,,,,,,,,,X
+D:X;;;;;;;;;;;;;;;;;,,,,,,,,,,,,,,,,,a,a,,,,,,,,,,,,,,,,,,,,,,,,;;;;;;;;;;;;;;;;;;;;;,,,a,a,,,,~~~~~~~~~~~~~~~~~~~~~~,,,,,,,,,,,X
+D:X;;;;;;;;;;;;;;;,,,,,,,,XXXXXXXXXXXXXXXXXXXXXXXXXX,,,,,,,,,,,,,,,,,;;;;;;;;;;;;;,,,,,,,,,,,,~~~~~~~~~~~~~~~~~~~~~~,,,,,,,,,,,,X
+D:X;;;;;;;;;;;;;,,,,,,XXXXX2^b^.^.^b^.^.^b^.^.^b^.2XXXXX,,,,,,,,,,,,,,,,,,;;;,,,,,,,,,,,,,,,~~~~~~~~~~~~~~~~~~~~~~~,,,,,,,,,,,,,X
+D:X;;;;;;;;;;,,,,,,XXXX2.^.^.^.XX^.^.^.^.^.^.XX^.^.^.^2XXXX,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~~~~~~~~~~~~~~~~~~~~~~~~,,,,,,,,,,,,,,X
+D:X;;;;;;;a,a,,,,XXX2.^.^.^b^.^XX.^.^.^b^.^.^XX.^.^b^.^.^2XXX,,,,,,,,,,,,,a,a,,,,,,,,,,,~~~~~~~~~~~~~~~~~~~~~~~~~,,,,,,,,,,,,,,,X
+D:X;;;;;;a,7,a,XXX2^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.2XXX~~~~~,,,,,a,&,a,,,,,,,,,~~~~~~~~~~~~~~~~~~~~~~~,,,,,,,,,,,,,,,,,,X
+D:X;;;;;;,a,aXXX2.^.^XXXXXXXXXXXXXXXXXXDDDXXXXXXXXXXXXXXXGGGGGXXX~~~~,,,,,a,a,,,,,,,,,~~~~~~~~~~~~~~~~~~~~~~~,,,,,,,,,,,,,,,,,,,X
+D:X;;;;;;,,XXX2^.^.XXX.^.^.^.^.^.XX^.^.^2^.^.^XX.^b^.^.^XXX.^.^.XXX~~~,,,,,,,,,,,,,,,~~~~~~~~~~~~~~~~~~~~,,,,,,,,,,,,,,,,,,,,,,,X
+D:X;;;;;,,XX2.^.^bXX^.^b^.^.^.^.^XX.^!^.!^.!^.XX^.^.^.^b^.XX.^b^.^XX~~~~,,,,,,,,,,,,,~~~~~~~~~~~~~~~~~,,,,,,,,,,,,,,;;;;;,,,,,,,X
+D:X;;;;;,XX2.^.^.XX^.^.^.GGGG^.^.XX^.^.^.^.^.^XX.^.^GGGG.^.XX.^.^.^XX~~~~~~~~,,,,,,,~~~~~~~~~~~~~~~,,,,,,,,,,,,,,,;;;;;,,,,,,,,,X
+D:X;;;;,,XX.^b^.XX^.^.^.^G$$G.^.^XX.^.^b^.^b^.XX^.^.G$$G^.^.XX.^b^.XX~~~~~~~~~~~~~~~~~~~~~~~~~~,,,,,,,,,,,,,,,,,,;;;;,,,,,,,,,,,X
+D:X;;;,,XX2^.^.XX^.^.^.^.G$$G^b^.XX^.^.^.^.^.^XX.^b^G$$G.^b^.XX.^.^.XX~~~~~~~~~~~~~~~~~~~~~~,,,,,,,,,,,,,,,,,,,;;;;;,,,,,,,,,,,,X
+D:X;;;,,XX^.^.^XX.^.^b^.^GGGG.^.^XX^b!^.!b^!^.XX^.^.GGGG^.^.^XX^.^b^XX.~~~~~~~~~~~~~~~~~~~~,,,,,,,,,,a,a,,,,,,;;;;;;,,,,,,,,,,,,X
+D:X;;,,XX2.^b^XX.^.^.^.^.^.^.^.^.XX^.^.^.^.^.^DD.^.^.^.^.^.^.^XX^.^.^XX,,~~~~~~~~~~~~~~~~~~,,,,,a,a,a,&,a,,,,;;;;;;;;,,,,,,,,,,,X
+D:X;;,,XX^.!.^XX^.^.^.^.^.^.^XXXXXXXXXXXXXXXXXXXXX^.^b^.^.^b^.XX.^!^.XX,,,~~~~~~~~~~~~~~~~~~~,,a,a,&,a,a,,,,,;;;;;;;;;,,,,,,,,,,X
+D:X;,,,XX.^.^.XX.^b^.^.^b^.^XG.^.^.^.^.^.^.^.^.^.XX^.^.^.^.^.^XX^.^b^XX,,,,~~~~~~~~~~~~~~~~~~~a,a,&,&,a,,,,,,;;;;;;;;;;,,,,,,,,,X
+D:X;,,,XX^b!.^XX^.^.^.^.^.^XG.^.lllllll2lllllll.^.XX^.^GGGGG^.GG.^!^.[[,,a,,~~~~~~~~~~~~~~~~~~,a,a,a,a,,,,,,;;;;;;;;;;;;,,,,,,,,X
+D:X;;,,XX.^.^.XX.^.!.^!^.^XG.^.l!^.^.^l^l^.^.^!l.^.XX^.G$$$G.^GG^.^b^[[,,,,,,~~~~~~~~~~~~~~~~~~,a,a,a,,,,,,;;;;;;;;;;;;;;,,,,,,,X
+D:X;;,,XX^.!b^XX^.^.^b^.!.XX^.ll^.^.^.^.^.^.^.^ll.^XX.^G$$$G^.XX.^!^.[[,,,a,,~~~~~~~~~~~~~~~~~~,,,,,,,,,,,;;;;;;;;;;;;;;,,,,,,,,X
+D:X;;,,XX.^.^.XX.^.^2^!^.2GG.^l$$ll.GGG^GGG.ll$$l^.XX^.G$$$G.^XX^.^b^[[,,,,,,~~~~~~~~~~~~~~~~~~~,,,,,,,,,,;;;;;;;;;;;;;,,,,,,,,,X
+D:X;;,,XX^.4.^XX^.^.^.^.^.DD^.ll^.^GG^$@$^GG^.^ll.^XX.^G$$$G^.XX.^.^.[[,,,a,,~~~~~~~~~~~~~~~~~~~,,,,,,,,,;;;;;;;;;;;;;,,,,,,,,,,X
+D:X;;,,XX.^5^.XX.^b^2^.^b^DD.^ll.^.GG^$1$^GG.^.ll^.XX^.G$$$G.^XX^.^b^[[,,,,,~~~~~~~~~~~~~~~~~~~,,,,,,,,,;;;;;;;;;;;;;;,,,,,,,,,,X
+D:X;;,,XX^.^.^XX^.^.^.!.^2GG^.l$$ll2GGG>GGG2ll$$l.^XX.^G$$$G^.XX.^.^.[[,,,a,~~~~~~~~~~~~~~~~~~,,,,,,,,,,,;;;;;;;;;;;;,,,,,,,,,,,X
+D:X;;,,XX.^!^.XX.^.^2^.^!^XX.^ll.^.^.^GGG^.^.^.ll^.XX^.G$$$G.^XX^.!b^[[,,,,~~~~~~~~~~~~~~~~~~,,,,,,,,,,,,;;;;;;;;;;;,,,,,,,,,,,,X
+D:X;,,,XX^b^.^XX^.^.^b^.^.XG^.^l!.^.^.lll.^.^.!l^.^XX.^G$$$G^.GG.^.^.[[,a,~~~~~~~~~~~~~~~~~~~~~,,,,,,,,,,;;;;;;;;;;;;,,,,,,,,,,,X
+D:X;;,,XX.^!^.XX.^.!.^!^.^.XG^.^lllllll$lllllll^.^XX.^.GGGGG.^GG^.!b^[[,~~~~~~~~~~~~~~~~~~~~~~~~,,,,,,,,,;;;;;;;;;;;;;,,,,,,,,,,X
+D:X;;,,XX^.^b^XX^.^.^.^.^.^.XG^.^.^.^.^.^.^.^.^.^XX.^b^.^.^b^.XX.^.^.XX~~~~~~~~~~~~~~~~~~~~~~~~~~,,,,,,,,,;;;;;;;;;;;;,,,,,,,,,,X
+D:X;;,,XX.^!^.XX.^b^.^.^b^.^.XXXXXXXXXXXXXXXXXXXXX.^.^.^.^.^.^XX^.!b^XX~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~,,,,,,,;;;;;;;;;;;,,,,,,,,;X
+D:X;,,,XX2.^.^XX^.^.^.^.^.^.^.^.^XX.^.^.^.^.^.XX6.^.^.^.^.^.^.XX.^.^.XX~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~,,,,,;;;;;;;;;;,,,,,,,,,;X
+D:X;;,,,XX^b^.^XX^.^.^.^.GGGG^.^.XX^.!.^!^.!.^XX7^b^GGGG.^b^.XX.^b^.XX~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~,,,,;;;;;;;;;;;,,,,,,,;;X
+D:X;;;,,XX2^.^.XX.^.^b^.^G$$G.^.^XX.^A2.^.26^.XXA.^.G$$G^.^.^XX^.^.^XX~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~,,,;;;;;;;;;;;,,,,,,;;X
+D:X;;;,,,XX.^.^.XX.^.^.^.G$$G^.^FXX^2^.^C^.^2^XXB^.^G$$G.^.^XX^b^.^XX~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~,,,;;;;;;;;;;;,,,,;;;X
+D:X;;;;,,XX2.^b^.XX.^.^.^GGGG.^.^XX.^52.^.2B^.XXC.^.GGGG^b^XX^.^.^.XX~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~,,,,,;;;;;;;;;;;;;;;X
+D:X;;;;,,,XX2.^.^.XX.^.^b^.^.^b^.XX^.!.^!^.!.^XXE^.^.^.^.^XX^b^.^.XX~~~~~~~~~~~~~~~,,,,,,,~~~~~~~~~~~~~~~~~~,,,,a,a;;;;;;;;;;;;;X
+D:X;;;;,,,,XXX2^.^.XXX^.^.^.^.^.^XX.^.^.^.^.^.XXF.^b^.^.XXX^.^.^XXX~~~~~~~~~,,,,,a,a,,,,,,,~~~~~~~~~~~~~~~~~~,,a,&,a;;;;;;;;;;;;X
+D:X;;;;;,,,,,XXX2^b^.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.^b^.XXX~~~~~~~~~a,a,,,a,&,a,,,,,~~~~~~~~~~~~~~~~~~~~,,a,a,,,,,;;;;;;;;X
+D:X;;;;;;,,,,,,XXX2^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.2XXX~~~~~~~~,,a,&,a,,;a;a,,,,~~~~~~~~~~~~~~~~~~~~~~~~,,,,,,,,,;;;;;;;X
+D:X;;;;;;;;,,,a,aXXX2.^b^.^b^.^XX.^.^b^.^b^.^XX.^b^.^b^.^2XXX~~~~~~~~,,,,,a,a,;;;;;;,,,~~~~~~~~~~~~~~~~~~~~~~~~~~~~~,,,,,,,,,,;;X
+D:X;;;;;;;;;;a,&,a,XXXX2.^.^.^.XX^.^.^.^.^.^.XX^.^.^.^2XXXX~~~~~~~~~~~~,,,,,,;;;;;;,,,~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~,,,,,,a,a,X
+D:X;;;;;;;;;;;a,a,,,,,XXXXX2^.^b^.^b^.^b^.^b^.^.^.2XXXXX~~~~~~~~~~~~~~~~~,,,;;;;;,,,,~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~,,,a,&,aX
+D:X;;;;;;;;;;;;;;,,,,,,,,,XXXXXXXXXXXXXXXXXXXXXXXXXX,,~~~~~~~~~~~~~~~~,,,,;;;;;;;;,,,~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~,,a,a,X
+D:X;;;;;;;;;;;;;;;;;,,,,,,,,,,,,,,,,,a,a,,,,,,,,,,~~~~~~~~~~~~~~~,,,,;;;;;;;;;;;;;,,,~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~,,,X
+D:X;;;;;;;;;;;;;;;;;;;;;,,,,,,,,,,,,a,E,a,,,,,~~~~~~~~~~~~~~~~~,,;;;;;;;;;;;;;;;;;,,~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~,X
+D:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+
+### Starting Location
+P:31:125 \ No newline at end of file
diff --git a/lib/mods/theme/edit/s_ship.map b/lib/mods/theme/edit/s_ship.map
new file mode 100644
index 00000000..dbbbe50d
--- /dev/null
+++ b/lib/mods/theme/edit/s_ship.map
@@ -0,0 +1,239 @@
+# s_ship.map
+#
+# Special Level "Arvedui's Galleon" in the Helcaraxe#
+#
+# Created for ToME 3.x on 9/11/03
+#
+# Written by Lord Dimwit (lorddimwit@hotmail.com)
+# Middle-game dungeon
+# Comments: This large level is a variation on the classic 'ghost ship' theme;
+# the ship was caught in the Helcaraxe and everyone on board died. The polar waters
+# surrounding the ship contain some unpleasant surprises for inquisitive and unwary
+# adventurers--the hardest monsters on the map are actually there.
+
+# Ported to ToME 2.x on 6/6/04 by masmarangio
+#
+# Changed the starting position to 28:122
+# Replaced the undefined letter 'c' with '.'
+# The exits of the between gates pointed to incorrect positions.
+# I'm not sure esp. about the correct exit of gate #3.
+
+
+#%:special.txt
+
+
+### Terrain Features
+
+# up staircase
+F:<:6:0
+
+# down staircase
+F:>:7:0
+
+# Permanent wall
+F:X:61:4
+
+# Glacial Wall
+F:#:246:4
+
+# Ice Wall
+F:M:95:4
+
+# Deep Water
+F: :187:4
+
+# Fog
+F:*:210:4
+
+# Shallow water
+F:~:84:4
+
+# Ice
+F:.:90:4
+
+# Hidden Door
+F:+:48:0
+
+# Normal Door
+F:=:32:0
+
+# Ash
+F:,:93:4
+
+# Fake wall
+F:I:189:4
+
+
+### Monsters
+
+# Leviathan in deep water
+F:L:187:0:782
+
+# Greater Kraken in deep water
+F:K:187:0:775
+
+# Lesser Kraken in deep water
+F:k:187:0:740
+
+# Giant Squid in deep water
+F:s:187:0:482
+
+# Killer Whale in deep water
+F:w:187:0:917
+
+# Drowned Soul in shallow water
+F:G:84:0:895
+
+# Ancient White Dragon on ice
+F:D:90:0:617
+
+# Mature White Dragon on ice
+F:d:90:0:549
+
+# Ice Troll on ice
+F:T:90:0:454
+
+# Headless Ghost on ice
+F:H:90:0:533
+
+# Shadow on ice
+F:g:90:0:665
+
+# Young White Dragon on ice
+F:b:90:0:460
+
+# Zombified Human on ice
+F:z:90:0:229
+
+# Greater mummy on ice
+F:m:90:0:522
+
+# Cold Hound on ice
+F:Z:90:0:308
+
+# Giant White Dragon Fly on ice
+F:F:90:0:250
+
+# Ice Elemental on ice
+F:E:90:0:570
+
+# Yeti on ice
+F:Y:90:0:154
+
+# Ice skeleton on ice
+F:i:90:0:379
+
+# Skeleton human on ice
+F:h:90:0:228
+
+# Ghost on ice (apologies to Eldridge Cleever)
+F:W:90:0:477
+
+# Hand druj on ice
+F:S:90:0:748
+
+# Eye druj on ice
+F:J:90:0:749
+
+# Dread on ice
+F:o:90:0:534
+
+# Dreadmaster on ice
+F:O:90:0:690
+
+# Night mare on ice
+F:q:90:0:622
+
+# Random monster (upto 5 levels ood) on ice
+F:&:90:0:*40
+
+# Random monster (upto 9 levels ood) and
+# Random object (upto 7 levels ood) on ice
+F:8:90:0:*44:*42
+
+# Treasure (random) on ice
+F:$:90:0:0:*47
+
+# Treasure (good) on ice
+F:%:90:0:0:*60
+
+# Trap (random) on ice
+F:^:90:0:0:0:0:0:*
+
+# Trap (random) on shallow water
+F:t:84:0:0:0:0:0:*
+
+# Trap (random) on fog
+F:@:210:0:0:0:0:0:*
+
+# Human skeleton on ice
+F:x:90:0:0:395
+
+
+### Between Gates
+
+# between gate 3: was 711
+F:3:160:6:0:0:0:0:0:1136
+
+# between gate A: was 6247
+F:A:160:6:0:0:0:0:0:6761
+
+# between gate 4: was 3339
+F:4:160:6:0:0:0:0:0:3853
+
+# between gate B: was 3085
+F:B:160:6:0:0:0:0:0:3599
+
+
+### Guaranteed Items
+
+# The Mage Staff of Forochel
+F:!:90:0:0:0:0:213
+
+
+### Level Design
+
+D:XXXXXXXXXXXXXXXX XXXXXXXXXXXX XXXXXXX XXXXXXXXXXXXXXX XXXX
+D:X###############..~ .#. k w ~.#XX######### .~~ s G..#####.. w .###.######X##~~ .GX.###
+D:X####%####...~ ~.~ s .#.X#~~.##### .~ s w G..#.##.#.XGG~XXk~.####A####.~X ~~.X...
+D:X##%#$#######...~ w wXXXXXX#XXXX###XXX #~XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX..XX....~.XX X#xX.#..#.#G. w ~X G~~
+D:X##$#########.... s XXXTT^...~.~#####w~###~~~~8....**.tE.&E ^^.M^.xx.....x..ZZ..^XTTTT M...GG.~.. w G.###~XX~~#XX . s X
+D:X#########...~ w XXXTTTT.^..x~.H#### ###~~D....8**.~M~.E..M^.MM^..xh.h...ZZZZ^~M.,.,.,.~~ .G...~~ ~###. w . w M.d.
+D:X#####.x.x~~~ XXXTTTXXXMxx.H.####### ~##~~~8...#.**.~tE&EE^^~%M^.h.x.E.xh.ZZ..^X.,.^....~ ...G.~ s ~# XX ~~ w X
+D:X######...~~ MM~ w XXX^^XXX.MMMxx...G#####w ~#~.~..&...**E.MEt.^^.MM^~..i.....ZZZZ^~M.,.,,.gM.~.,~.,G.G~~ G~. G~.MM XX..~
+D:X##.....~~ XXX^E=^XX$b.MMMMxH..HG#.## w ~#~##~8....*E~.&EM^^.M^h..i..x.x..ZZ..^XTTTTX.,.,~........~.G~~..w . G~...G~X
+D:X...~~~ K XXX^^EXXXX$$$..MMXXXXXXX#### #####XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX..,.X..M~.........~G..G ~~.G...G~
+D: ~~~ w XXX^^EXXXdX%d$$b$$XXd~~~~##### s ###.,.W.**,.x.,.,.,.,.,.***,,....,x....,,.SX.,.,.,..,o.,.,.~~.G..~.G..G..~X k
+D: w MMM. w XXX^E^XXX.,*XDDd$$$XXd$..~~~~#### ###.,.,.,.**..,.,i.,.,W,.,**..z.,.,.q...g.,......~.,.,.,.,.~.~..F.~M~......~
+D: MM. XXX4EEXXXi^**.XX%%$dXX$d$.H#####~G~~####.~.,~..,.h*,,~,.,.,.,~,.,.,.H.,.~.,..~,.,,,.~,.,.~.,.,.X.~,g.~~..~.~..,..,X
+D: s XXXBXXXXX^.**.W.,XDD%XXb$$b####..G~~~G###~.,,.,.,.,...,,.x,.~.,.,~..,.~.,.,~,.,.,,.,.,~,.,.,.~,.,..,X.,.***.~***,W.,X
+D: XXX.o..X.g***i.*.,.XX%XX######^^^^t ##ttt^^^^^t^^^^^^t^^^^^t^^^^^^^t^^^^^^t^^^^t^^tt^^^tt^^^^t^tXo..x************X
+D: k XXX^E..o.XX8.****,.g..XXX..#........~~~~~ttt###~~.,.G~.......XXXXX..~,..,,..,,.~.,..,.,..,,..,.,x..,.ooX******W***g.*.g*X
+D: XXX%S^^E..ooX,*****,..,.X.....h........XXX~~~tt#tt w ~~G~...XXXXXXX.,**.,..D.**.G.,~,..XXX...~~~.....o8X***.~.,.****$$..X
+D: XX%%%^mm.E..oXH**.^.*i.....#.....i..*..XXXXX~~ G~~.XXXXXXXXX~.*..,.,*..~,..,.,XXXXX...~..,.XXXXXo.W.$$.g.x....o.X
+D: XXX%S^^E..ooX8.*~~...,~~##...,..,.***,.XXX~G~ k ~~~~XXXXXXX.,.*. g...*..x..W.~.XXX.***.,,o..oO8X.o.,.o.xx$$$XXXXX
+D: XXX^E..o.XXH.###....###~~~.,h..,.*.,..~~.~~ s ~~.XXXXX.~..**...i~**.....~.,,.,,.***~,,,.oXXXXXXXXXXXXXXXX.!.X
+D: s XXX.o..X&..w~##..##~~~X~^^^^^^^^^^t^ttt^tt w tt^tttt^^tt^^^^^ttt^^^^ttt@@^^^^ttt^^^^^ttt@^^ttXXXW ^^.M*.t^oo.^^...X s
+D: ~~~ XXX>XXH~G..#####~G~~Gt..,.,..,.,xx..x ~~~ i~~xx.~...x....~.~..~..,~..***..~..~...,~.~*.~.XXXE.^^H..SM.~^.oo....JX
+D: ~~....~~ XXX$8w~.^####G~G ~i.XX.,,.,...........G~~~s~~ iiF~...........~.......x.,.**~....,~....~.*XXX.EE.W.^^.M*.~^^^o^O^..X
+D: ~.#..#..~~ XXX8##t..##~#.G.t..XX..,H...,.W...,...,~~...,...*,,.x...,.i.....g.....**.........XXXXXXX...EE.^^H..SM.~.^oo...^JX
+D: ~.##.##..~ XXX###GG~~~*h~.^..XX.....,....,.W...,.G....W.***...,...,...,....,...,**..q....SX3tttW#...EE.W.^^.M*.t.oo.^.^.XX
+D: ~~.###..~~ X##.##~~G^~~~~i*^XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX~~
+D: ~~...###.~ k ~###X.G~~@Gh~x*~^..^i.zX8~i.~..h....zzzXiX..^$.T.t$......F.t..XX..^TTT*..M..Y....^.Y.^*.^..~....X.x..x~.<XX~.
+D: ~.....####.....#####XXXx@@~i~.z..z.it,#**t..h..Gzh.zzX@.@Xd*t.~...*~.t......^X..T.^T*@*TXMM...^....^**@.^.x*...+..~....XX..~
+D: ~~.#$%#########....XXX~h~i.HH...h,i^X*.H..h.^G..WX@.E.^X**8..Y.~*8...Y...^+XXXXXXXXXXXMF...~....^.*..x.***..X..x..~XX...~~w
+D: ~~.#$$######.~ ~w XXX$~.x..~G^..,i.,.~.h.^~~..zzX@.@Xd*......F**..~....^XbM..^~ZZZZXMM..*.....~^......*.XXXXXXXIXX.~~#~w
+D: L ~~xx########.~~ XXX$$.G#GX#.i,,^ih.^W.zG^zzzXiX.$.t88.~..^**F..T...tXX~~.^^ZZZZM~..**@~~.Y~..^#^..xXI&X8&..XX ~~~## w
+D: ~.########..~~ XXXXX~#X~X#XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ~###~w
+D: ~~.#########..~ w K w ~##### w ~.M.~ ~..####.~ s~~~~.~~ s K ~##..~
+D: ~..#########.~ ~##### ~...~ k ~..###.~ ~~####~~~ w w ~###..~
+D: XXXXXXXXXXXX XXXXXX XXXXXX XXXXXXXXX XXXXXX
+
+
+### Starting Location
+P:28:122
+
+
+
+
+
diff --git a/lib/mods/theme/edit/s_smaug.map b/lib/mods/theme/edit/s_smaug.map
new file mode 100644
index 00000000..f1829e6f
--- /dev/null
+++ b/lib/mods/theme/edit/s_smaug.map
@@ -0,0 +1,78 @@
+# Special level "Lower Halls" in Erebor
+# Created for Theme on 29/09/2004 by furiosity (furiosity@gmail.com)
+
+### Level features ###
+
+# Floor with dirt
+F:,:88:3
+
+# Mountain
+F:M:97:3
+F:X:97:3
+
+# Shallow Water
+F:V:84:3
+
+# down staircase
+F:>:7:3
+
+### Guaranteed monsters (on dirt)###
+
+# Creeping adamantite coins
+F:a:88:5:423
+
+# Creeping mithril coins
+F:b:88:5:239
+
+# Creeping gold coins
+F:c:88:5:195
+
+# Creeping silver coins
+F:d:88:5:117
+
+# Smaug on normal floor
+F:e:88:5:697
+
+### Guaranteed items ###
+# Cup of Thror on dirt
+F:1:88:0:0:0:0:211
+
+# The Arkenstone of Thrain on dirt
+F:2:88:0:0:0:0:3
+
+### Dungeon Design
+D:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+D:X,,,,,,MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMX
+D:X,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,X
+D:X,M,M,M,M,M,M,MMM,M,M,M,M,M,M,M,M,M,M,M,M,M,MM,,,,,,,,,X
+D:XMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM,,,,,,,,,,X
+D:XMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM,,,,,,,,MMMMMX
+D:XMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMdddddddddMMMMMMMX
+D:XMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMddddccccddddMMMMMMMMX
+D:XMMMMMMMMMMMMMMMMMMMMMMMMMMMMMddddcccccccddddMMMMMMMMMMX
+D:XMMMMMMMMMMMMMMMMMMMMMMMMMddddaabbbbbaaaccddddMMMMMMMMMX
+D:XMMMMMMMMMMMMMMMMMMMMMMMddddaaabbbbbbbaaaccddddMMMMMMMMX
+D:XMMMMMMMMMMMMMMMMMMMMMddddcaaabbbaaabbbaaaccddddMMMMMMMX
+D:XMMMMMMMMMMMMMMMMMM1ddddccaaabbbaaaaabbbaaacddddMMMMMMMX
+D:XMMMMMMMMMMMMMMVVVMMMddddccaaabbaaeaabbaaacddddMMMMMMMMX
+D:XMMMMMMMMMMMMVVVMMMMddddccaaabbbaaaaabbbaaaccddddMMMMMMX
+D:XMMMMMMMMMMMMMVVVMMddddccccaaabbbaaabbbaaaccddddMMMMMMMX
+D:XMMMMMMMMMMMMMMVVVMMddddccccaaabbbbbbbaaaccccddddMMMMMMX
+D:XMMMMMMMMMMMMVVVMMMMMMddddcccaaabbbbbaaaccccccddddMMMMMX
+D:XMMMMMMMMMMVVVMMMMMMMMMddddcccccccccccccccccccccddddMMMX
+D:XMMMMMMMMMVVVMMMMMMMMMMMddddccccddddMMdMdMMdMM2Mddd,,,,X
+D:XMMMMMMMMMMVVVMMMMMMMMMMMMMddddddddMMMMMMMMMMMMMM,,,,,,X
+D:XMMMMMMMMMVVVMMMMMMMMMMMMMMddddddMMMMMMMMMMMMMMMMMMM,,,X
+D:XMMMMMMMVVVMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM,,X
+D:XMMMMMMMMMVVVMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM,,,X
+D:XMMMMMMMMMMMVVVVMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM,,X
+D:XMMMMMMMMMMMMMVVVMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM,,,X
+D:XMMMMMMMMMMMMMMMVVVMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM,,X
+D:XMMMMMMMMMMMMMMMMVVVVMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM,,X
+D:XMMMMMMMMMMMMMMMMMMVVVVMMMMMMMMMMMMMMMMMMMMMMMMMMMMM,,,X
+D:XMMMMMMMMMMMMMMMMMMMMVVVVMMMMMMMMMMMMMMMMMMMMMMMMMMMM,,X
+D:XMMMMMMMMMMMMMMMMMMMMMMMVVVMMMMMMMMMMMMMMMMMMMMMMMMMM,>X
+D:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+
+### Starting Location
+P:3:3 \ No newline at end of file
diff --git a/lib/mods/theme/edit/s_thorin.map b/lib/mods/theme/edit/s_thorin.map
new file mode 100644
index 00000000..52a795e7
--- /dev/null
+++ b/lib/mods/theme/edit/s_thorin.map
@@ -0,0 +1,47 @@
+# Thorin's Trail level with Thorin's key and a bunch of dwarves.
+# Based on Lesser Vault (Cross), tweaked to suit parent dungeon.
+# Map by furiosity <furiosity@gmail.com>
+# Arena-style level (no random treasure except monster drops)
+
+%:special.txt
+
+# Grass with Thorin's key
+F:1:89:0:0:0:0:210
+
+# Grass
+F:,:89:0
+
+# Small tree
+F:t:202:0
+
+### Guaranteed monsters
+
+# Dark dwarven warrior on grass
+F:a:89:0:179
+
+# Dark dwarven smith on grass
+F:b:89:0:180
+
+# Dark dwarven lord on grass
+F:c:89:0:181
+
+# Dark dwarven priest on grass
+F:d:89:0:182
+
+### Dungeon Design
+
+D:XXXXXXXXXXXXXXXXXXXXXX
+D:XXXXXXXXXXXXXXXXXXXXXX
+D:XXTTc,d,,,,,,,,b,cTTXX
+D:XXTt,d,VXXDXXV,,b,tTXX
+D:XX,,d,VWXa,aXWV,,b,,XX
+D:XX,XXXXXXdcdXXXXXXX,XX
+D:XX,,,,,,Xc1cX,,,,,,,XX
+D:XXXXXXX,XdcdX,XXXXXXXX
+D:XX,,,c,,XbbbXWV,,a,,XX
+D:XXTt,,cVXXXXXV,,a,tTXX
+D:XX>T,,VWX,,,,,,a,cTTXX
+D:XXXXXXXXXX,XXXXXXXXXXX
+D:XXXXXXXXXXXXXXXXXXXXXX
+
+P:13:13 \ No newline at end of file
diff --git a/lib/mods/theme/edit/set_info.txt b/lib/mods/theme/edit/set_info.txt
new file mode 100644
index 00000000..4b745e4b
--- /dev/null
+++ b/lib/mods/theme/edit/set_info.txt
@@ -0,0 +1,254 @@
+# File: set_info.txt
+
+
+# This file is used to initialize the "lib/raw/set_info.raw" file, which is
+# used to initialize the "item set" information for the Angband game.
+
+# Do not modify this file unless you know exactly what you are doing,
+# unless you wish to risk possible system crashes and broken savefiles.
+
+# Version stamp (required)
+
+# N:idx:name
+# D:description
+# P:artifact index:number of item needed:pval
+# F:flags
+
+V:2.0.0
+
+# The Elven Gifts, took from Oangband
+
+N:0:Elven Gifts
+D:It is one of two Elven items once entrusted to Hobbits.
+# Phial of Galadriel
+P:1:2:1
+F:WIS | CHR | RES_DARK
+# Sting
+P:88:2:2
+F:STEALTH | REGEN
+
+
+# The Dragon Slayer
+
+N:1:Dragon Slayer
+D:It is one of two items rumoured to be the bane of dragons.
+# Bow of bard
+P:125:2:3
+F:DEX | CON | RES_FIRE
+# Arrow of Bard
+P:63:2:5
+F:SPEED
+
+
+# The Trinity -- Possessor set
+
+N:2:The Trinity
+D:It is one of the 3 legendary daggers.
+# Dagger of Samwise
+P:66:3:1
+F:STR | KILL_DRAGON | REGEN | SH_FIRE
+# Dagger of Peregrin
+P:67:3:1
+F:KILL_DEMON | IM_COLD | CON
+# Dagger of Meriadoc
+P:68:3:1
+F:KILL_UNDEAD | SH_ELEC | FLY | DEX
+
+
+# Gothmog's Armoury -- Demonologists' set
+
+N:3:Gothmog's Armoury
+D:It is one of three items that once belonged to Gothmog,
+D:the High Captain of the Balrogs.
+# The demonblade of Gothmog
+P:181:3:7
+F:STR | CON | SPEED | VAMPIRIC
+# The demonshield of Gothmog
+P:182:3:0
+F:IM_FIRE | IM_COLD | SH_ELEC
+# The demonhorn of Gothmog
+P:183:3:0
+F:ESP_EVIL | ESP_GOOD | AUTO_ID
+
+### New sets added in Theme ###
+
+# Thorin Oakenshield's gear - bards might find this useful :)
+
+N:4:Thorin's Gear
+D:It is one of three items that once belonged to
+D:Thorin Oakenshield, King under the Mountain.
+# The small metal shield of Thorin
+P:30:3:2
+F:CHR | ESP_TROLL
+# The golden harp of Thorin
+P:135:3:4
+F:INT | SUST_INT
+# The mithril helm of Thorin
+P:136:3:4
+F:WIS | SUST_WIS
+
+# Peregrin Took's gear - adapted from T-Plus by Ingeborg S. Norden
+
+N:5:Peregrin's Gear
+D:It is one of two items that once belonged to the hobbit
+D:hero, Peregrin Took.
+# Chain Mail of Peregrin Took
+P:165:2:0
+F:RES_CONF | RES_NEXUS | SUST_STR
+# Elven Cloak of Peregrin Took
+P:184:2:2
+F:DEX | SUST_DEX | CHR | SUST_CHR | SLOW_DIGEST |
+
+# Ghan-buri-Ghan's Garb - suggested by ShinesmanOffWhite in the forums
+
+N:6:Ghan-buri-Ghan's Garb
+D:It is one of two items that once belonged to
+D:the leader of the Druedain.
+# The Filthy Rag of Ghan-Buri-Ghan
+P:189:2:0
+F:IM_COLD | IM_ACID
+# The Cloak of Ghan-buri-Ghan
+P:190:2:0
+F:ESP_ALL
+
+# Requisites of the King of Gondor - suggested by ShinesmanOffWhite in the forums
+
+N:7:The Glory of the King
+D:It is one of three items belonging to the Kings of
+D:Gondor.
+# The Long Sword 'Anduril'
+P:83:3:0
+F:BRAND_ELEC | KILL_DEMON | KILL_DRAGON | SLAY_UNDEAD | IM_FIRE |
+# The Black Banner of Gondor
+P:191:3:0
+F:LITE3
+# The Golden Crown of Gondor
+P:42:3:0
+F:ESP_ALL
+
+# Saruman's stuff - suggested by ShinesmanOffWhite in the forums
+
+N:8:Saruman's Travel Gear
+D:It is one of three items belonging to the Istari wizard Saruman.
+# The Mage Staff of Saruman
+P:192:3:0
+F:REFLECT | FREE_ACT
+# The Robe of Curunir
+P:193:3:0
+F:RES_FIRE | RES_ACID | RES_POIS | RES_DARK | RES_BLIND | RES_SOUND |
+# The Palantir of Orthanc
+P:202:3:0
+F:AUTO_ID
+
+# Heirlooms of the House of Elendil - set suggested by Massimiliano Marangio in the forums
+
+N:9:Elendil's Heirlooms
+D:It is one of three items belonging to the House of Elendil.
+# The Ring of Barahir
+P:8:3:0
+F:RES_LITE | RES_BLIND |
+# The Star of Elendil
+P:2:3:1
+F:STR | INT | WIS | DEX | CON | CHR | LUCK |
+# The Rod of Annuminas
+P:199:3:0
+F:RES_FEAR | ESP_EVIL
+
+# Flame of Wrath - from Oangband
+
+N:10:Flame of Wrath
+D:It is one of two items infused with holy fire.
+# The Amulet of Annatar
+P:4:2:1
+F:WIS | IM_FIRE | RES_FEAR
+# The Morning Star 'Naurgil'
+P:115:2:4
+F:STR | SLAY_EVIL | SLAY_UNDEAD
+
+# Light/Dark Set - from Oangband
+
+N:11:Shadow Ward
+D:It is one of two items rumoured to defy the Shadow.
+# The Soft Leather Armour 'Hithlomir'
+P:168:2:2
+F:SEARCH | RES_BLIND
+# The Set of Leather Gloves 'Cammithrim'
+P:53:2:2
+F:DEX | SUST_DEX
+
+# Eorl/Rohan Set - from Oangband
+
+N:12:Eorl's Arms
+D:It is one of two items that once belonged to Eorl the Young,
+D:valiant hero of the Mark.
+# Lance of Eorlingas
+P:100:2:1
+F:FREE_ACT
+# The Metal Brigandine Armour of the Rohirrim
+P:21:2:0
+F:CON | REGEN
+
+# Gil-Galad's Set - from Oangband
+
+N:13:Gil-Galad's Battle Gear
+D:It is one of three pieces of the battle gear of Gil-Galad,
+D:mighty Elven king of old.
+# The Shield of Deflection of Gil-Galad
+P:169:3:0
+F:RES_FIRE | RES_POIS | SUST_CON
+# The Spear 'Aiglos'
+P:97:3:0
+F:SLAY_DEMON | RES_NETHER
+# The Mithril Helm of Gil-Galad
+P:26:3:0
+#Why *shouldn't* warrior-types get a chance for AUTO_ID without penalties to luck before they kill Morgy?
+F:AUTO_ID
+
+# Dwarven Heritage
+# http://wiki.t-o-m-e.net/IdeaArchive_2fNew_20Item_20Set_3a_20Heritage_20of_20Khazad
+
+N:14:Dwarven Heritage
+D:It is one of three Dwarven items of legend.
+# The Arkenstone of Thrain
+P:3:3:0
+F:SUST_STR | FREE_ACT | SUST_CON
+# Mattock of Nain
+P:174:3:6
+F:CON
+# Lochaber Axe of the Dwarves
+P:105:3:0
+F:IM_ACID | RES_SHARDS | SUST_DEX | SUST_WIS | REFLECT
+
+# Woodland Realm (bow of Legolas, staff of Thranduil, cap of Thranduil)
+
+N:15:Woodland Realm
+D:It is one of three items belonging to the Wood-elves of Mirkwood.
+# The Hard Leather Cap of Thranduil
+P:36:3:1
+F:SUST_INT | SUST_WIS | SPEED
+# The Long Bow of Legolas
+P:224:3:2
+F:SUST_DEX | SPEED
+# The Quarterstaff of Thranduil
+P:74:3:0
+# What can I say. I love archers. :P
+F:AUTO_ID
+
+# Gimli's Gear (Gimli's shield, boots and axe)
+
+N:16:Gimli's Gear
+D:It is one of three items belonging to Gimli the dwarf.
+# The Small Metal Shield of Gimli
+P:132:3:0
+F:SUST_STR | SUST_CON | SUST_INT
+# The Bearded Axe of Gimli
+P:133:3:0
+F:SLAY_EVIL | SLAY_GIANT | BRAND_FIRE
+# The Pair of Metal Shod Boots of Gimli
+P:180:3:5
+F:LUCK
+
+# N:idx:name
+# D:description
+# P:artifact index:number of item needed:pval
+# F:flags
diff --git a/lib/mods/theme/edit/special.txt b/lib/mods/theme/edit/special.txt
new file mode 100644
index 00000000..8d1c94b9
--- /dev/null
+++ b/lib/mods/theme/edit/special.txt
@@ -0,0 +1,67 @@
+# Contains terrain parsings for the special levels now being kept in seperate map files
+#
+# Created for PernAngband 5.0.1 on 18/8/01
+# Written by Mynstral (mynstral@thehelm.com)
+
+# Permanent Wall
+F:X:63:0
+F: :63:0
+
+# Granite Wall
+F:#:57:0
+F:%:57:0
+
+# Hidden Door
+F:+:48:0
+
+# Normal Door
+F:D:32:0
+
+# Floor
+F:.:1:0
+
+# Tree
+F:T:96:0
+
+# Mountain
+F:M:97:0
+
+# Shallow Water
+F:w:84:0
+F:V:84:0
+
+# Deep Water
+F:W:187:0
+
+# Shallow Lava
+F:l:86:0
+
+# Deep Lava
+F:L:85:0
+
+# Glass Wall
+F:G:188:0
+
+# Illusion Wall
+F:I:189:0
+
+# Treasure (random) on normal floor
+F:*:1:0:0:*
+
+# Trap (random) on normal floor
+F:^:1:0:0:0:0:0:*
+
+# down staircase
+F:>:7:0
+
+# between gates
+F:4:160:0:0:0:0:0:0:-1
+F:5:160:0:0:0:0:0:0:-1
+F:6:160:0:0:0:0:0:0:-1
+F:7:160:0:0:0:0:0:0:-1
+F:A:160:0:0:0:0:0:0:-1
+F:B:160:0:0:0:0:0:0:-1
+F:C:160:0:0:0:0:0:0:-1
+F:E:160:0:0:0:0:0:0:-1
+F:F:160:0:0:0:0:0:0:-1
+F:0:160:0:0:0:0:0:0:-1
diff --git a/lib/mods/theme/edit/spiders.map b/lib/mods/theme/edit/spiders.map
new file mode 100644
index 00000000..146c152c
--- /dev/null
+++ b/lib/mods/theme/edit/spiders.map
@@ -0,0 +1,66 @@
+# Lit permanent wall
+F:X:61:6
+
+# up staircase
+F:<:6:8
+
+# Grass
+F:-:89:3
+
+# Trees
+F:t:96:3
+
+# Grass with Giant spider
+F:a:89:3:175
+
+# Grass with Giant tarantula
+F:b:89:3:275
+
+# Grass with Mirkwood Spider
+F:c:89:3:277
+
+# Grass with Aranea
+F:d:89:3:963:0:0:0:0:0:0:2
+
+# Grass with Elder aranea
+F:e:89:3:964:0:0:0:0:0:0:2
+
+# Dungeon layout
+D:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+D:X<---tttttttttttttttttttttttttttttttttttttttttttttttttttttttX
+D:X---ttttttttttttttttttttttttttta--ctttttttttttttttttttttttttX
+D:Xtt---------------ttttttttttttt--tttttttttttttttttttttttttttX
+D:Xttttttttt--------------cttttttt--ttttttttttttttttttttttttttX
+D:Xtttttttttttttt--tttttt---------c--tttttttttttttttttttttttttX
+D:Xttttttttttttta-bttt---cttttttttttttttttttttttttttttttttttttX
+D:Xttttttttttttttttttttt---tttt-ttd--c-ttt---c---tttttttttttttX
+D:Xtttttttttttttttttttc---btttttttt-----ttc-----ttttttttttttttX
+D:Xtttttttttttttttttt----tttttttttc-c---------d---c-ctttttttttX
+D:Xtttttttttttttttttb-tttt---c---t----tttttt----------ctttttttX
+D:Xtttttttttttttttttt----ttttt-----c---tttttt-c--cttttttttttttX
+D:Xttttttttttttttttc--at----c---ttttttttttttttttttttttttttttttX
+D:Xttttttttttttta----ttttt-b--tttttttttd--etttttttttttttttttttX
+D:Xtttttttttttt---c--ttttt------tttt-c-tttttttte----dtttttttttX
+D:Xttttttttttttttttttt----c--d----tttt---ttttttt--d----ettttttX
+D:Xttttttttttttttttttttt-c-d---tttttttc--cttttttt-----ttttttttX
+D:Xttttttttttta-c--ttt-------tttt-------ttttt----d--ttttttttttX
+D:Xtttttttttttt----ttttt--ttt--c--c--t-----c--ttttttttttttttttX
+D:Xttttttttttt--c---ttt--c--c---ttttt--c----t----tttttttttttttX
+D:Xtttttttttt-c----c---t-----tttttttt-----ttt-------dtttttttttX
+D:Xttttttttttt---c---tttt--c--ttttttttt-ttttttttt-d---ttttttttX
+D:Xtttttttttttta-----tttttt---d---dttd----cttttt-----tttttttttX
+D:Xtttttttttttttttttttt---c-----ttttt---c----ettd--tttttttttttX
+D:Xtttttttttttttttt----d----tttttttttttttttttttttt---tttttttttX
+D:Xttttttt-------c---tttt-d----c--ettttttttttttd-----dttttttttX
+D:Xtttttc--c-c------tttttt-------------ettttttt----tttttttttttX
+D:Xttttttt------ttttttt--c---d---ttttttttttttt--d--tttttttttttX
+D:Xttttt----cc-tttttttttttte----d-ttttttttttttttt----tttttttttX
+D:Xttttt--c------ttttttttttttttttttttttttttte--tt------ettttttX
+D:Xttt--c----ctttttttttttttttttttttttttte------------tttttttttX
+D:Xtttttttttttttttttttttttttttttttttttttttttt--e--ttttttttttttX
+D:XtttttttttttttttttttttttttttttttttttttttttttttttttttttttttttX
+D:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+
+# Starting position
+P:3:3
+
diff --git a/lib/mods/theme/edit/st_info.txt b/lib/mods/theme/edit/st_info.txt
new file mode 100644
index 00000000..29ca49fc
--- /dev/null
+++ b/lib/mods/theme/edit/st_info.txt
@@ -0,0 +1,1157 @@
+# File: st_info.txt
+
+# Fixed Potions of Cure Light/Serious Wounds in the Temple, Potions of
+# Restore Str/Con in the Alchemist
+# Magic Shop - Amulet of Slow Digestion, Wand of Light, Staffs of Enlightenment,
+# Door/Stair Location, Detect Invis/Evil, and Remove Curse
+
+# This file is used to initialize the "lib/raw/st_info.raw" file, which is
+# used to initialize the "store info type" information for the Angband game.
+
+# Do not modify this file unless you know exactly what you are doing,
+# unless you wish to risk possible system crashes and broken savefiles.
+
+# Some store indexes are defined in "defines.h", and must not be
+# changed.
+
+# N:<index>:<name>
+# I:<proba>:<item name>
+# T:<proba>:<tval>:<sval>
+# G:char:attr
+# W:max number of items in the store
+
+# proba is the chance(out of 100) of the item being generated
+
+# Version stamp (required)
+
+V:2.0.0
+
+N:0:General Store
+I:100:& Wooden Torch~
+I:95:& Brass Lantern~
+I:95:& Flask~ of oil
+I:100:& Ration~ of Cram
+I:100:& Round Seed-Cake~
+I:90:& Strip~ of Venison
+I:70:& Pint~ of Old Winyards
+I:80:& Pint~ of Fine Ale
+I:60:& Shovel~
+I:50:& Pick~
+I:100:& Iron Spike~
+I:70:& Iron Shot~
+I:70:& Bolt~
+I:70:& Arrow~
+I:98:& Cloak~
+I:46:& Fur Cloak~
+A:0:0:1:2:3:4
+O:1:2:3:4
+G:1:U
+W:24
+
+N:1:Armoury
+I:70:& Pair~ of Soft Leather Boots
+I:60:& Pair~ of Hard Leather Boots
+I:80:& Hard Leather Cap~
+I:70:& Metal Cap~
+I:65:& Iron Helm~
+I:100:& Robe~
+I:90:& Soft Leather Armour~
+I:90:& Soft Studded Leather~
+I:90:& Hard Leather Armour~
+I:85:& Hard Studded Leather~
+I:90:& Leather Scale Mail~
+I:80:& Metal Scale Mail~
+I:75:& Chain Mail~
+I:80:& Augmented Chain Mail~
+I:75:& Metal Brigandine Armour~
+I:68:& Bar Chain Mail~
+I:100:& Set~ of Leather Gloves
+I:80:& Set~ of Gauntlets
+I:100:& Small Leather Shield~
+I:90:& Large Leather Shield~
+I:80:& Small Metal Shield~
+A:0:0:1:2:3:4
+O:5:6:7:8
+G:2:s
+W:24
+
+N:2:Weaponsmith
+I:100:& Dagger~
+I:100:& Main Gauche~
+I:100:& Rapier~
+I:100:& Small Sword~
+I:100:& Short Sword~
+I:100:& Sabre~
+I:100:& Cutlass~
+I:100:& Tulwar~
+I:100:& Broad Sword~
+I:100:& Long Sword~
+I:100:& Scimitar~
+I:100:& Katana~
+I:100:& Bastard Sword~
+I:100:& Spear~
+I:100:& Awl-Pike~
+I:100:& Trident~
+I:100:& Pike~
+I:100:& Beaked Axe~
+I:100:& Broad Axe~
+I:100:& Lance~
+I:100:& Battle Axe~
+I:100:& Hatchet~
+I:100:& Sling~
+I:100:& Short Bow~
+I:100:& Long Bow~
+I:100:& Light Crossbow~
+I:100:& Iron Shot~
+I:100:& Arrow~
+I:100:& Bolt~
+I:100:& Whip~
+I:100:& Small Wooden Boomerang~
+A:23:0:1:2:3:4
+O:9:10:11:12
+G:3:w
+W:24
+
+N:3:Temple
+I:100:& Quarterstaff~
+I:100:& Mace~
+I:100:& War Hammer~
+I:100:& Lucerne Hammer~
+I:100:& Morning Star~
+I:100:& Flail~
+I:100:& Lead-Filled Mace~
+I:100:Remove Curse
+I:100:Blessing
+I:100:Holy Chant
+I:100:Heroism
+I:100:Word of Recall
+I:100:Word of Recall
+I:100:Word of Recall
+#I:100:Cure Light Wounds
+T:100:71:34
+#I:100:Cure Serious Wounds
+#I:100:Cure Serious Wounds
+T:100:71:35
+T:100:71:35
+I:100:Cure Critical Wounds
+I:100:Cure Critical Wounds
+I:100:Restore Life Levels
+I:100:Restore Life Levels
+I:100:Restore Life Levels
+I:100:& Whip~
+I:100:& Mace~
+I:100:& Ball-and-Chain~
+I:100:& War Hammer~
+I:100:Word of Recall
+I:100:Word of Recall
+I:100:Word of Recall
+I:100:Cure Critical Wounds
+I:100:Cure Critical Wounds
+I:100:Restore Life Levels
+I:100:Restore Life Levels
+I:100:Restore Life Levels
+I:100:Remove Curse
+I:100:Remove Curse
+I:100:*Remove Curse*
+I:100:*Remove Curse*
+A:0:0:1:2:3:4
+O:13:14:15:16
+G:4:g
+W:24
+
+N:4:Alchemy shop
+I:100:Enchant Weapon To-Hit
+I:100:Enchant Weapon To-Dam
+I:100:Enchant Armour
+I:100:Identify
+I:100:Identify
+I:100:Identify
+I:100:Identify
+I:100:Light
+I:100:Phase Door
+I:100:Phase Door
+T:100:70:9
+I:100:Monster Confusion
+I:100:Magic Mapping
+I:100:Treasure Detection
+I:100:Object Detection
+I:100:Trap Detection
+I:100:Detect Invisible
+I:100:Recharging
+I:100:Satisfy Hunger
+I:100:Word of Recall
+I:100:Word of Recall
+I:100:Word of Recall
+I:100:Word of Recall
+T:100:70:9
+T:100:70:9
+#I:100:Restore Strength
+T:100:71:42
+I:100:Restore Intelligence
+I:100:Restore Wisdom
+I:100:Restore Dexterity
+#I:100:Restore Constitution
+T:100:71:46
+I:100:Restore Charisma
+I:100:Identify
+I:100:*Identify*
+I:100:*Identify*
+I:100:*Identify*
+I:100:*Identify*
+I:100:*Identify*
+I:100:*Identify*
+I:100:Light
+#I:100:Restore Strength
+T:100:71:42
+I:100:Restore Intelligence
+I:100:Restore Wisdom
+I:100:Restore Dexterity
+#I:100:Restore Constitution
+T:100:71:46
+I:100:Restore Charisma
+I:100:Enchant Armour
+I:100:Enchant Armour
+I:100:Recharging
+I:100:Satisfy Hunger
+I:100:Satisfy Hunger
+I:100:Satisfy Hunger
+A:0:0:1:2:3:4
+O:17:18:19:20
+G:5:b
+W:24
+
+N:5:Magic shop
+I:100:Protection
+I:100:Levitation
+I:100:Protection
+I:100:Charisma
+I:100:Slow Digestion
+T:100:40:7
+I:100:Searching
+I:100:Cure Light Wounds
+# Rods
+I:100:Probing
+I:25:& Wooden Rod~ of#
+# Book
+T:100:111:50
+# Wands
+T:100:65:3
+T:100:65:8
+T:100:65:11
+T:100:65:16
+T:100:65:22
+# Staves
+T:100:55:3
+T:100:55:5
+T:100:55:8
+T:100:55:9
+T:100:55:14
+T:60:55:15
+T:60:55:16
+T:60:55:17
+T:70:55:22
+A:0:0:1:2:3:4
+O:21:22:23:24
+G:6:r
+W:24
+
+N:6:Black Market
+A:30:0:1:2:3:4
+O:25:26:27:28
+G:7:D
+F:ALL_ITEM | MEDIUM_LEVEL
+W:24
+
+N:7:Home
+A:0:0:54:55:3:62
+O:0:0:0:0
+G:8:y
+W:24
+
+N:8:Book Store
+# & Book~ of Beginner Cantrips
+T:100:111:50
+T:100:111:50
+T:100:111:255
+T:100:111:255
+T:100:111:255
+T:100:111:255
+T:100:111:255
+T:100:111:255
+A:0:0:1:2:3:4
+O:29:30:31:32
+G:9:o
+W:24
+
+N:9:Pet Shop
+I:100:Egg
+T:100:70:6
+I:100:& Round Seed-Cake~
+A:0:0:1:2:3:4
+O:33:34:35:36
+G:+:b
+F:MEDIUM_LEVEL
+W:12
+
+#Bree Mayor
+N:10:Mayor's Office
+A:0:0:16:0:35:0
+O:37:37:37:37
+G:+:o
+W:0
+
+#Minas Anor Inn
+N:11:The Crowing Rooster
+I:100:& Ration~ of Cram
+I:100:& Round Seed-Cake~
+I:100:& Strip~ of Venison
+I:100:& Pint~ of Old Winyards
+I:100:& Pint~ of Fine Ale
+A:2:4:5:6:7:0
+O:71:71:71:71
+G:+:w
+W:8
+
+N:12:The Soothsayer
+I:20:Divination
+I:20:Divination
+I:20:Divination
+I:20:Divination
+I:20:Divination
+I:20:Divination
+A:0:0:2:0:8:0
+O:78:79:80:81
+G:+:B
+F:RANDOM
+W:2
+
+N:13:Library
+I:100:Identify
+I:100:Identify
+I:100:Identify
+I:100:Identify
+I:100:Identify
+# starting parchment
+T:40:8:20
+# Khuzdul
+T:35:8:105
+# Nandorin
+T:30:8:106
+# Numenorean (I)
+T:30:8:101
+# Numenorean (II)
+T:20:8:102
+# Orcish
+T:15:8:107
+# Advanced Numenorean
+T:10:8:103
+# Advanced Sindarin
+T:5:8:104
+A:2:3:14:15:16:27
+O:86:87:88:89
+G:+:U
+W:2
+
+#Minas Anor
+N:14:Castle
+A:0:0:16:35:39:0
+O:38:38:38:38
+G:+:o
+W:0
+
+N:15:Casino
+A:13:0:9:10:0:12
+O:90:91:92:93
+G:+:s
+W:0
+
+N:16:Beastmaster Shanty
+# Monstrous Compendium 1
+T:100:8:9
+# Monstrous Compendium 2
+T:100:8:10
+# Monstrous Compendium 3
+T:95:8:11
+# Monstrous Compendium 4
+T:90:8:12
+# Monstrous Compendium 5
+T:85:8:13
+# Monstrous Compendium 6
+T:80:8:14
+# Monstrous Compendium 7
+T:75:8:15
+# Monstrous Compendium 8
+T:70:8:16
+# Monstrous Compendium 9
+T:65:8:17
+# Monstrous Compendium 10
+T:60:8:18
+# Monstrous Compendium 11
+T:55:8:19
+A:18:2:21:22:3:0
+O:94:95:96:97
+G:+:g
+W:24
+
+N:17:Fighters Hall
+A:0:0:24:25:0:0
+O:98:99:100:101
+G:+:s
+W:0
+
+N:18:Tower of Magery
+A:0:0:26:27:0:0
+O:102:103:104:105
+G:+:b
+W:0
+
+N:19:Inner Temple
+# Cure Light Insanity
+T:20:72:14
+# Cure Serious Insanity
+T:15:72:15
+# Cure Critical Insanity
+T:10:72:16
+# Cure Insanity
+T:5:72:17
+A:2:3:28:29:0:0
+O:106:107:108:109
+G:+:G
+W:8
+
+N:20:Paladins Guild
+A:0:0:28:25:0:0
+O:110:111:112:113
+G:+:g
+W:0
+
+N:21:Rangers Guild
+A:0:0:31:32:0:0
+O:114:115:116:117
+G:+:u
+W:0
+
+N:22:Thunderlords' Nest
+A:0:0:33:2:34:0
+O:82:83:84:85
+G:+:U
+W:0
+
+N:23:The Mirror
+A:0:0:44:15:16:43
+O:51:51:51:51
+G:+:U
+W:0
+
+N:24:Seat of Ruling
+A:0:0:17:35:0:0
+O:52:52:52:52
+G:+:U
+W:0
+
+N:25:Wizards Spire
+A:60:0:26:27:0:0
+O:54:54:54:54
+G:+:U
+W:0
+
+N:26:Priests Circle
+# Cure Light Insanity
+T:20:72:14
+# Cure Serious Insanity
+T:15:72:15
+# Cure Critical Insanity
+T:10:72:16
+# Cure Insanity
+T:5:72:17
+A:2:3:28:29:0:0
+O:55:55:55:55
+G:+:o
+W:8
+
+N:27:Tower of the King
+A:0:0:17:35:0:0
+O:57:57:57:57
+G:+:U
+W:0
+
+N:28:Library
+I:100:Identify
+# starting parchment
+T:40:8:20
+# Khuzdul
+T:35:8:105
+# Nandorin
+T:30:8:106
+# Numenorean (I)
+T:30:8:101
+# Numenorean (II)
+T:20:8:102
+# Orcish
+T:15:8:107
+# Advanced Numenorean
+T:10:8:103
+# Advanced Sindarin
+T:5:8:104
+A:0:0:14:15:16:2
+O:58:58:58:58
+G:+:U
+W:12
+
+N:29:The White Tree
+I:100:& Ration~ of Cram
+I:100:& Round Seed-Cake~
+I:100:& Strip~ of Venison
+I:100:& Pint~ of Old Winyards
+I:100:& Pint~ of Fine Ale
+A:2:4:5:6:7:0
+O:59:59:59:59
+G:+:w
+W:8
+
+N:30:Craftsmaster
+A:0:0:24:25:0:0
+O:60:60:60:60
+G:+:s
+W:0
+
+N:31:Earth-Dome (Nature)
+# Cure Light Insanity
+T:20:72:14
+# Cure Serious Insanity
+T:15:72:15
+# Cure Critical Insanity
+T:10:72:16
+# Cure Insanity
+T:5:72:17
+A:2:3:39:0:0:0
+O:61:61:61:61
+G:+:U
+W:8
+
+N:32:Minstrels Haven
+A:0:0:40:41:0:0
+O:62:62:62:62
+G:+:U
+W:0
+
+N:33:Star-Dome
+A:0:0:46:47:0:0
+O:63:63:63:63
+G:+:U
+W:0
+
+N:34:Valarin Temple
+# Cure Light Insanity
+T:20:72:14
+# Cure Serious Insanity
+T:15:72:15
+# Cure Critical Insanity
+T:10:72:16
+# Cure Insanity
+T:5:72:17
+A:2:3:28:48:0:0
+O:64:64:64:64
+G:+:U
+W:8
+
+N:35:Sea-Dome
+# Cure Light Insanity
+T:20:72:14
+# Cure Serious Insanity
+T:15:72:15
+# Cure Critical Insanity
+T:10:72:16
+# Cure Insanity
+T:5:72:17
+A:2:3:49:35:0:0
+O:65:65:65:65
+G:+:U
+W:8
+
+N:36:The Golden Flower
+A:0:0:50:51:0:0
+O:66:66:66:66
+G:+:U
+W:0
+
+N:37:The Fountain
+# Cure Light Insanity
+T:20:72:14
+# Cure Serious Insanity
+T:15:72:15
+# Cure Critical Insanity
+T:10:72:16
+# Cure Insanity
+T:5:72:17
+A:2:3:52:53:0:0
+O:67:67:67:67
+G:+:U
+W:8
+
+# Here begins the random shops, for the random towns
+N:38:Axe Smith
+T:100:24:256
+A:0:0:1:2:3:4
+O:118:119:120:121
+G:3:w
+F:RANDOM | MEDIUM_LEVEL
+W:12
+
+N:39:Hafted Smith
+T:100:21:256
+A:0:0:1:2:3:4
+O:122:123:124:125
+G:3:w
+F:RANDOM | MEDIUM_LEVEL
+W:12
+
+N:40:Polearm Smith
+T:100:22:256
+A:0:0:1:2:3:4
+O:126:127:128:129
+G:3:w
+F:RANDOM | MEDIUM_LEVEL
+W:12
+
+N:41:Sword Smith
+T:100:23:256
+A:0:0:1:2:3:4
+O:130:131:132:133
+G:3:w
+F:RANDOM | MEDIUM_LEVEL
+W:12
+
+N:42:Rare Jewelry Shop
+T:100:40:256
+T:100:45:256
+A:0:0:1:2:3:4
+O:134:135:136:137
+G:6:v
+F:RANDOM | DEPEND_LEVEL | DEEP_LEVEL | FORCE_LEVEL
+F:VERY_RARE
+W:10
+
+N:43:Jewelry Shop
+T:100:40:256
+T:100:45:256
+A:0:0:1:2:3:4
+O:138:139:140:141
+G:6:y
+F:RANDOM | DEPEND_LEVEL | MEDIUM_LEVEL | FORCE_LEVEL
+F:RARE
+W:20
+
+N:44:Footwear Shop
+T:100:30:256
+A:0:0:1:2:3:4
+O:142:143:144:145
+G:2:r
+F:RANDOM | MEDIUM_LEVEL
+F:COMMON
+W:12
+
+N:45:Rare Footwear Shop
+T:100:30:256
+A:0:0:1:2:3:4
+O:146:147:148:149
+G:2:r
+F:RANDOM | DEEP_LEVEL | MEDIUM_LEVEL
+F:VERY_RARE
+W:8
+
+N:46:Library
+T:100:110:256
+T:100:111:256
+T:100:112:256
+T:100:113:256
+T:100:114:256
+T:100:115:256
+T:100:116:256
+T:100:117:256
+T:100:118:256
+T:100:119:256
+T:100:120:256
+T:100:121:256
+T:100:122:256
+T:100:123:256
+T:100:124:256
+T:100:125:256
+A:27:0:1:2:3:4
+O:150:151:152:153
+G:9:y
+F:RANDOM | DEPEND_LEVEL | MEDIUM_LEVEL
+W:24
+
+N:47:Forbidden Library
+T:100:110:256
+T:100:111:256
+T:100:112:256
+T:100:113:256
+T:100:114:256
+T:100:115:256
+T:100:116:256
+T:100:117:256
+T:100:118:256
+T:100:119:256
+T:100:120:256
+T:100:121:256
+T:100:122:256
+T:100:123:256
+T:100:124:256
+T:100:125:256
+A:27:0:1:2:3:4
+O:150:151:152:153
+G:9:v
+F:RANDOM | DEPEND_LEVEL | DEEP_LEVEL
+F:RARE
+W:12
+
+N:48:Expensive Black Market
+A:0:0:1:2:3:4
+O:154:155:156:157
+G:7:v
+F:RANDOM | ALL_ITEM | DEEP_LEVEL | DEPEND_LEVEL | MEDIUM_LEVEL
+W:12
+
+N:49:Common Shop
+I:95:& Brass Lantern~
+I:100:& Flask~ of oil
+I:100:& Ration~ of Cram
+I:60:& Shovel~
+I:50:& Pick~
+I:100:& Iron Spike~
+I:70:& Iron Shot~
+I:70:& Bolt~
+I:70:& Arrow~
+I:98:& Cloak~
+I:46:& Fur Cloak~
+I:100:Word of Recall
+I:100:Cure Critical Wounds
+A:0:0:1:2:3:4
+O:158:159:160:161
+G:1:U
+W:12
+F:RANDOM
+
+N:50:Dragon Hunter
+T:100:38:256
+A:0:0:1:2:3:4
+O:162:163:164:165
+G:2:v
+F:RANDOM | DEEP_LEVEL | DEPEND_LEVEL
+F:VERY_RARE
+W:12
+
+N:51:Speed Ring Market
+T:100:45:31
+A:0:0:1:2:3:4
+O:166:167:168:169
+G:6:G
+F:RANDOM | SHALLOW_LEVEL | DEPEND_LEVEL
+F:VERY_RARE
+W:6
+
+N:52:Scribe
+T:100:70:256
+A:0:0:1:2:3:4
+O:170:171:172:173
+G:5:B
+F:RANDOM | MEDIUM_LEVEL | DEPEND_LEVEL
+W:12
+
+N:53:Potion Store
+T:100:71:256
+T:100:72:256
+A:0:0:1:2:3:4
+O:174:175:176:177
+G:5:B
+F:RANDOM | MEDIUM_LEVEL | DEPEND_LEVEL
+W:12
+
+N:54:Recaller
+I:100:Word of Recall
+A:33:0:1:2:3:0
+O:82:83:84:85
+G:+:b
+F:RANDOM | COMMON
+W:2
+
+N:55:Master Archer
+T:100:19:2
+T:100:19:12
+T:20:19:13
+T:100:19:23
+T:20:19:24
+T:50:16:256
+T:50:17:256
+T:50:18:256
+A:0:0:1:2:3:4
+O:178:179:180:181
+G:3:g
+F:RANDOM | MEDIUM_LEVEL | DEPEND_LEVEL
+F:RARE
+W:24
+
+N:56:Merchants Guild
+A:0:0:56:57:58:0
+O:211:211:211:211
+G:+:g
+W:0
+
+N:57:The Museum
+A:0:0:59:0:3:0
+O:0:0:0:0
+G:+:g
+F:MUSEUM
+W:255
+
+N:58:The Prancing Pony
+I:100:& Ration~ of Cram
+I:100:& Round Seed-Cake~
+I:100:& Strip~ of Venison
+I:100:& Pint~ of Old Winyards
+I:100:& Pint~ of Fine Ale
+A:2:4:5:6:7:0
+O:68:68:68:68
+G:+:w
+W:8
+
+##### Mining equipment for Khazad-Dum #####
+
+N:59:Mining Supply store
+T:100:20:256
+I:100:& Wooden Torch~
+I:95:& Brass Lantern~
+I:95:& Flask~ of oil
+I:75:& Dwarven Lantern~
+I:60:& Feanorian Lamp~
+T:60:65:6
+T:70:71:22
+A:0:0:1:2:3:4
+O:182:183:184:185
+F:MEDIUM_LEVEL
+G:+:s
+W:24
+
+## Library quest in Minas Anor
+
+N:60:Library
+I:100:Identify
+I:100:Identify
+I:100:Identify
+I:100:Identify
+I:100:Identify
+I:100:Identify
+# starting parchment
+T:40:8:20
+# Khuzdul
+T:35:8:105
+# Nandorin
+T:30:8:106
+# Numenorean (I)
+T:30:8:101
+# Numenorean (II)
+T:20:8:102
+# Orcish
+T:15:8:107
+# Advanced Numenorean
+T:10:8:103
+# Advanced Sindarin
+T:5:8:104
+A:61:0:14:15:16:2
+O:210:210:210:210
+G:+:U
+W:12
+
+### New shops in Theme ###
+
+# Hunting Store
+N:61:Hunting Supply Store
+I:100:& Morphic Oil~ of #
+T:50:35:255
+T:100:46:255
+T:100:19:2
+T:100:19:12
+T:20:19:13
+T:100:19:23
+T:20:19:24
+T:50:16:255
+T:50:17:255
+T:50:18:255
+A:0:0:1:2:3:4
+O:186:187:188:189
+G:*:w
+W:24
+
+# Rune Shop
+N:62:Runic Magic Shop
+T:100:104:256
+T:100:104:256
+T:100:104:256
+T:50:105:256
+T:50:105:256
+T:50:105:256
+A:0:0:1:2:3:4
+O:190:191:192:193
+G:6:w
+W:24
+
+# based on Mining Supply store in Khazad-Dum
+N:63:Construction Supply Store
+T:100:20:256
+I:100:& Wooden Torch~
+I:95:& Brass Lantern~
+I:95:& Flask~ of oil
+I:75:& Dwarven Lantern~
+I:60:& Feanorian Lamp~
+T:60:65:6
+T:70:71:22
+A:0:0:1:2:3:4
+O:182:183:184:185
+G:1:w
+W:24
+
+# Music store
+N:64:Music Store
+I:20:& Horn~
+I:20:& Drum~
+I:20:& Harp~
+A:0:0:1:2:3:4
+O:194:195:196:197
+G:+:o
+W:12
+
+# Rod shop
+N:65:Magic Rod Market
+T:100:67:50
+T:75:67:75
+T:75:67:75
+T:50:67:100
+T:50:67:100
+T:50:67:100
+T:50:67:100
+T:50:67:125
+T:25:67:160
+T:5:67:200
+A:0:0:1:2:3:4
+O:198:199:200:201
+F:RANDOM | MEDIUM_LEVEL | DEPEND_LEVEL
+G:6:b
+W:12
+
+# Map store
+# No stealing; will buy nothing - this is a map maker, they don't need to buy maps.
+N:66:Map store
+I:100:Map of Bree
+I:100:Map of Hobbiton
+I:50:Map of Lothlorien
+I:50:Map of Edoras
+I:50:Map of Esgaroth
+I:40:Map of Dale
+I:30:Map of Pelargir
+I:30:Map of Osgiliath
+I:30:Map of Minas Anor
+I:15:Map of Forodwaith
+I:5:Map of Middle-earth
+A:0:0:1:2:3:0
+O:202:203:204:205
+G:9:w
+W:12
+
+# Farm
+# Farms buy nothing - anything they might want, they can produce themselves.
+N:67:Farm
+I:100:& Pinch~ of Longbottom Leaf
+I:100:& Jar~ of Honey
+I:100:& Jug~ of Milk
+I:100:Apple Juice
+I:100:Water
+I:100:Salt Water
+I:20:Cure Poison
+I:20:Cure Blindness
+I:20:Cure Fear
+I:20:Cure Confusion
+A:0:0:1:2:3:4
+O:206:207:208:209
+G:1:G
+W:12
+
+### Themed Inns ###
+
+#Pelargir
+N:68:The Grey Swan
+I:100:& Ration~ of Cram
+I:100:& Round Seed-Cake~
+I:100:& Strip~ of Venison
+I:100:& Pint~ of Old Winyards
+I:100:& Pint~ of Fine Ale
+A:2:4:5:6:7:0
+O:69:69:69:69
+G:+:w
+W:8
+
+#Caras Galadhon
+N:69:The Garden
+I:100:& Ration~ of Cram
+I:100:& Round Seed-Cake~
+I:100:& Strip~ of Venison
+I:100:& Pint~ of Old Winyards
+I:100:& Pint~ of Fine Ale
+A:2:4:5:6:7:0
+O:70:70:70:70
+G:+:w
+W:8
+
+#Khazad Dum
+N:70:The Mithril Lode
+I:100:& Ration~ of Cram
+I:100:& Round Seed-Cake~
+I:100:& Strip~ of Venison
+I:100:& Pint~ of Old Winyards
+I:100:& Pint~ of Fine Ale
+A:2:4:5:6:7:0
+O:72:72:72:72
+G:+:w
+W:8
+
+#Dale
+N:71:The Builder Barracks
+I:100:& Ration~ of Cram
+I:100:& Round Seed-Cake~
+I:100:& Strip~ of Venison
+I:100:& Pint~ of Old Winyards
+I:100:& Pint~ of Fine Ale
+A:2:4:5:6:7:0
+O:73:73:73:73
+G:+:w
+W:8
+
+#Edoras
+N:72:The Horse and Ox
+I:100:& Ration~ of Cram
+I:100:& Round Seed-Cake~
+I:100:& Strip~ of Venison
+I:100:& Pint~ of Old Winyards
+I:100:& Pint~ of Fine Ale
+A:2:4:5:6:7:0
+O:74:74:74:74
+G:+:w
+W:8
+
+#Esgaroth
+N:73:The Dancing Dragon
+I:100:& Ration~ of Cram
+I:100:& Round Seed-Cake~
+I:100:& Strip~ of Venison
+I:100:& Pint~ of Old Winyards
+I:100:& Pint~ of Fine Ale
+A:2:4:5:6:7:0
+O:75:75:75:75
+G:+:w
+W:8
+
+#Hobbiton
+N:74:The Green Dragon
+I:100:& Ration~ of Cram
+I:100:& Round Seed-Cake~
+I:100:& Strip~ of Venison
+I:100:& Pint~ of Old Winyards
+I:100:& Pint~ of Fine Ale
+A:2:4:5:6:7:0
+O:76:76:76:76
+G:+:w
+W:8
+
+#Osgiliath
+N:75:The Twinkling Star
+I:100:& Ration~ of Cram
+I:100:& Round Seed-Cake~
+I:100:& Strip~ of Venison
+I:100:& Pint~ of Old Winyards
+I:100:& Pint~ of Fine Ale
+A:2:4:5:6:7:0
+O:77:77:77:77
+G:+:w
+W:8
+
+### Abodes ###
+
+N:76:The House of Beorn
+A:17:63:65:0:0:0
+O:40:40:40:40
+G:+:U
+W:0
+
+N:77:Bard's Hut
+A:17:66:0:0:0:0
+O:41:41:41:41
+G:+:U
+W:0
+
+N:78:The Ranger Conclave
+A:17:63:65:0:0:0
+O:42:42:42:42
+G:+:U
+W:0
+
+N:79:Imladris
+A:17:63:65:0:0:0
+O:43:43:43:43
+G:+:U
+W:0
+
+N:80:The Hornburg
+A:17:63:65:0:0:0
+O:44:44:44:44
+G:+:U
+W:0
+
+N:81:Thranduil's Hall
+A:17:63:65:0:0:0
+O:45:45:45:45
+G:+:U
+W:0
+
+N:82:Meduseld
+A:17:0:0:0:0:0
+O:46:46:46:46
+G:+:U
+W:0
+
+N:83:The Master's House
+A:17:0:0:0:0:0
+O:47:47:47:47
+G:+:U
+W:0
+
+N:84:Bag End
+A:17:0:0:0:0:0
+O:48:48:48:48
+G:+:U
+W:0
+
+N:85:The Castle of Stars
+A:17:0:0:0:0:0
+O:49:49:49:49
+G:+:U
+W:0
+
+N:86:The Prince's Tower
+A:17:0:0:0:0:0
+O:50:50:50:50
+G:+:U
+W:0
+
+N:87:The Seat of Durin
+A:17:0:0:0:0:0
+O:39:39:39:39
+G:+:U
+W:0
+
+### The forge in Imladris
+N:88:Forge
+A:23:24:25:32:64:0
+O:43:43:43:43
+G:+:y
+W:0 \ No newline at end of file
diff --git a/lib/mods/theme/edit/t_basic.txt b/lib/mods/theme/edit/t_basic.txt
new file mode 100644
index 00000000..8153f6fe
--- /dev/null
+++ b/lib/mods/theme/edit/t_basic.txt
@@ -0,0 +1,66 @@
+D:######################################################################################################################################################################################################
+D:# #
+D:# #
+D:# #
+D:# #
+D:# #
+D:# #
+D:# #
+D:# #
+D:# #
+D:# #
+D:# #
+D:# #
+D:# #
+D:# #
+D:# #
+D:# #
+D:# #
+D:# #
+D:# #
+D:# #
+D:# #
+D:# #
+D:# #
+D:# #
+D:# #
+D:# #
+D:# #
+D:# #
+D:# #
+D:# #
+D:# #
+D:# #
+D:# #
+D:# #
+D:# #
+D:# #
+D:# #
+D:# #
+D:# #
+D:# #
+D:# #
+D:# #
+D:# #
+D:# #
+D:# #
+D:# #
+D:# #
+D:# #
+D:# #
+D:# #
+D:# #
+D:# #
+D:# #
+D:# #
+D:# #
+D:# #
+D:# #
+D:# #
+D:# #
+D:# #
+D:# #
+D:# #
+D:# #
+D:# #
+D:###################################################################################################################################################################################################### \ No newline at end of file
diff --git a/lib/mods/theme/edit/t_beorn.txt b/lib/mods/theme/edit/t_beorn.txt
new file mode 100644
index 00000000..e60c5d29
--- /dev/null
+++ b/lib/mods/theme/edit/t_beorn.txt
@@ -0,0 +1,108 @@
+# File: t_beorn.txt
+
+# Beorn's Halls map by furiosity <furiosity@zionmainframe.net>
+# NB! The additional terrain features and stores (if any) assume usage of the following files from the 'theme' module:
+# f_info.txt, t_pref.txt, st_info.txt, and ba_info.txt
+# Please download the module and refer to the files for the terrain feature definitions http://modules.t-o-m-e.net/
+# Don't forget to modify the maximum number of terrain features, etc. in misc.txt as well.
+
+### Additional terrain features ###
+
+# Beehive
+F:b:229:3
+
+# Dirt road
+F:,:230:3
+
+# Bush
+F:h:202:3
+
+# Closed gate
+F:g:231:3
+
+# Open gate
+F:+:232:3
+
+# Wooden boards (4 kinds)
+F:=:233:3
+F:[:234:3
+F:_:235:3
+F:]:236:3
+
+### Buildings ###
+
+#The House of Beorn
+F:a:74:3:0:0:0:0:0:76
+
+#The Farm
+F:f:74:3:0:0:0:0:0:67
+
+#The Beastmaster
+F:r:74:3:0:0:0:0:0:16
+
+D:######################################################################################################################################################################################################
+D:# ------TT-TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT--T-TTT------------------ #
+D:#---- ------ ------ ---------------TTTT-TThh-hh-----------------@WW@---------------TTTTT----TTT------------- #
+D:# -------------------- ---TTT---TTTT-TT---------------hhhhhhhWWhhhhhhhhh-----------TTTTT-----TTTT-------- #
+D:# -------- ---- ---------- ---TTTTT---TT-TT--------------hhhhh--@WW@--hhhhhhhhhhhhhhhh------TTT--TTTTTT------ -- #
+D:# --TTT------TT--------------hhh----@WW@---RRRRRRR----hhhhhhhhh----TTT-TTTT---T---- #
+D:#-------- ----------TTT--------------hhh----@WW@---RRRRRRRRR---------hhhhhh---TT-----TTTTT-------- #
+D:#---- -----------------T----TTT--------------hhh-----@WW@---RRNNNNNNNRR-----------hhhh---TTT-----T-------- #
+D:#---- -------- ---TTTTT-TTT--------------hhh------@WW@--ANNNNFFFNNNNA------------hhh----TT------------ #
+D:# ------ -------- -------- -----TTTTT-TT--------------hhh------@WW@--AANNFFFFFFFNNAA------------hhh----TT---TTT---- #
+D:#-- -------- ------ ---T--TTT-TT--------------hhh-------@WW@-AAANFFFEEEFFFNAAA------------hhh----TT-TTTTT---- #
+D:# ------ ---- ---- ---------TTTTT---TT--------------hhh-------@WW@--AAANFFEEEEEFFNAAA-------------hhh----TT-TTT------- #
+D:# ------------ ------ ----------TTT--TTT----------------hhh-----@WW@---AAANFFFEEEFFFNAAA------------hhh--T---TT----TTTT--- #
+D:#------ ---------------------------------TTT---------------hhh-------@WW@---AANNFFFFFFFNNAA------------hhh---TT--TT---TTTTTT-- #
+D:#---- -------- -------- -----------T---TT-----------------hhh-------@WW@---ANNNNFFFNNNNA--------------hhh--TT---TT---TTTT---- #
+D:#-- -------- ------ ---TTTTT-TT----------------hhh--------@WW@----RRNNNNNNNRR----------------hhh--T----hT---------- #
+D:# ------------ --------TTT-TTT ----------------hhh-----N--@WW@----RRRRRRRRR----------------hhh---T-----TTT-TTTT-- #
+D:#---- ---- -------------T--T@b@---------------hhh-----NRN--@WW@----RRRRRRR------------------hhh--TT----TTT-T------ #
+D:# ---------- ------ ----TTTT---TTT@b@---------------hhh---NRRRN--@WW@-----------------------------hhh-T-----TT--TT---- #
+D:# ------ ---- ---TTTTTT--TT--@b@-------------hhh-----NRN--@WW@-----------------------------hhh--TTT----TT---TTT-- #
+D:#---- ------ ---------- ------------TTTT---TTT-@b@--------------hhh-----N----@WW@-------NNN-------EEREE-------hhh--------TT--TTTTT-- #
+D:#-- ---- -------- ---------TTT--@b@------------hhh----------@WW@------NFFFFFN----EERRREE----hhh---TTT----TT---TTT---- #
+D:# ---- ---- -- ------TTTTTT----@b@-------------hhh--------@WW@-----NFFFFFN-------EEREE---hhhh---TTT-----TT------- #
+D:# -------- -- -- ---------TTT---TTT--@b@------------hhh--------@WW@----NFFFFFN---------------hhhh----TTT------TT--TTT-- #
+D:#-- -------- -------- ----TTTT-TTT--@b@-------------hhh------@WW@-------NNN---------UUUYUUUUhh---------------TT-TTTTT-- #
+D:#-- ---- ---- -------------------T-----TTT--@b@------------hhh------@WW@--------------------XXXXXXXXh----------------TT--TTT-- #
+D:# ------ ------ -------TTTTT----TT--@b@-------------hhh------@WW@---UUUYU-----------________h---------TT-----TT-------- #
+D:#-- ---------- ---- ---TTTTT--T-TT--@b@------------hhh------@WW@----XXXXXNNNNNNNNNNN________h----------TT----TTT--TTT---- #
+D:#---- ----T----T-TT--@b@-------------hhh------@WW@---_____,,,,,,,,,,,f]]]]]]]T-T---------TTT--TTT-TTTTT---- #
+D:# ---------- ----TTTT-TTT--@b@------------hhh------@WW@----]]]]]NNNNNNNNNNN----------------TTT------TT----TTT--- #
+D:# ---- ------ -----TTTTTT-TT--@b@-------------hhh-----@WW@-----F,F---------[================[-T---------TT--T---- #
+D:# ------ ---------- ------TTTT---T--@b@------------hhh----TT-@WW@----F,F---------[================[-T----TTT--TT-TTT--- #
+D:# ----------------------------------------TT--@b@-----------hhh-------@WW@-----F,F---------[================[AT----T-T--TT-TTT--- #
+D:#,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,g,,,,,,,,,,,,,,,,,,,,,,,,,,WW,,,,,,,,,,,,,,,,,,,,,,,,,,,aUUUUUUUU[,,,A--T----TT--T------ #
+D:#,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,+,,,,,,,,,,,,,,,,,,,,,,,,,WW,,,,,,,,,,,,,,,,,,,,,,,,,,,,aUUUUUUUU[AT,,A-TTTT-TT---TTT----- #
+D:#-- --------------------------------------------TT--@b@------------hhh----@WW@-----------,-,,,---[================[-T-,A----T-TT--TTTTT-- #
+D:# -------- ------TT-TTT--@b@-------------hhh--@WW@----------E,E--,,,,-[================[-T-,A-TTTT-TT---TTT---- #
+D:#-- -------- -------- ---TTTT-TT--@b@--------TTT---hhh@WW@----------E,E------,,[================[-T-,A---TT-TT--------- #
+D:#------ ---------- ----------TT--TT--@b@------TTT-----hh@WW@----------E,E--------hA,-----------------A,,A-TT--TTT--TTT-- #
+D:#-- ------ -------- ----TTT-----TT--@b@-------TTT---hhhWW@----------E,E---------hhA,,,A-----------A,,,A-------TT--TTT-- #
+D:# ---- ------ ---------TTTTT---TTT--@b@--------TTT-hhhhWW@---------E,E-----------hh-A,,,,,AAAA,,,,,AA---------TT TTTTT-- #
+D:# ---- ---- -------TT-TT---TTT--@b@-------------hhWW@---------E,E------------hhhh--A,,,,,,,,,A--TTT------TT---TTT-- #
+D:# -------- ------------ ------------T--TTT---@b@-------------hWWh----------R,R------------hhhh--AAAAAAAAA----TTTTT---TT---TTT-- #
+D:# -- -- ------ ----TTTTT-TT---@b@------------@WWhhh---UUUYUUU,,R-------------hhhh--------TT-----TTT---TT-------- #
+D:# ------ -------TTT---TT--@b@-----------@WW@-hhh--XXXXXXX,-,R-------------hhhhh-----TTTTT-----TTT-TT------- #
+D:# ------------ ---------------- ----------TTT--@b@------------@WWhhh---_______,-,,R---------------hhhh-----------------TT--T----- #
+D:# ------------ -------------TTTT---TTT--@b@-----------@WW@-hhh--_______,-,UUYU----------------hhhThTh----------TTT-TTT---- #
+D:# ------ ------TTTTTT---TT--@b@------------@WWhhhh--]]]]0]],-,XXXX--------------------hhhhhh--T-----TT--T----- #
+D:# ------ ---- ---TTTT---TTTT-@b@------------@WW@hhhh-----,,,,-,____---------------FFF------hhh------TT--------- #
+D:#------ ---------- ------ -----------TT--TTT-@b@-------------@WW@hhhh---------,]rr]--------------FVVVVF-----hhh-----T---------- #
+D:# ------ ------ ------ ------TTTT--TT@b@-------------@WW@--hhh---------,,,-----------------FVVVVF----hhhh---TT---TTT--- #
+D:#---- -------------- ------------ ---------TT--TTTb@-------------@WW@----hhh-----------------------------FVVVVF--hhhh----TT--TTTTT-- #
+D:#-- ---------- ---- ----------------TTT-------------@WW@------hhh-------------------N---------FFFF--hhhh----TT----T-T-- #
+D:# ---- -------- -------- ---------TTT-TTTT-----------@WWW@--------hhh----------------ENANE------------hhhh-----TT------- #
+D:# ---------- ---------- -------- ------TTTTT--TT------------@WWW@--------hhh--------------EEAAAEE----------hhhh----TTT------------ #
+D:# ------ ------ ---- ---- ----TTTTT---TT---------@WWW@-----------hhh--------------ENANE----------hhhh----TT------------ #
+D:# -------- ------ ---------TTT-TT---------@WWW@----------hhhh---------------N-----------hhh-----TT------------- #
+D:# ------ ------ ------TTTTT-TT-------@WWW@TTT---------hhhhh-----------------------hh---T-TTTT--TTTTT------ #
+D:# -- ---- -------- -------TTT---TT------@WW@TTT------------hhhhhhh------------hhhhhhhhh------TTT----TTTTT----T-- #
+D:# -------- ------------ ------ -----T---TT----@WW@----------TTT------hhhhhhhhhhhhhhhhhhhhhhh-------TT -TTT--TTT---- #
+D:# ------ -------- ---------- ------ TTTTTT--TT--@WW@-------------------------hhhhhhhhhh--------------hT--TTTTT---- #
+D:#------------ -------------- ------------ TTTTT--TTTTTWW@-------------------------------------------------TT----TTT------------- #
+D:# ---------- ------ ------ ---------- TTT-TTTThTTT------------------------------------------------hTT---------------- #
+D:#------ ------ -------- -------- ---------TTTTThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhTh--TTTTT--------- #
+D:#------ -------- -------------- ---TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT-------------- #
+D:###################################################################################################################################################################################################### \ No newline at end of file
diff --git a/lib/mods/theme/edit/t_bree.txt b/lib/mods/theme/edit/t_bree.txt
new file mode 100644
index 00000000..e5fe559a
--- /dev/null
+++ b/lib/mods/theme/edit/t_bree.txt
@@ -0,0 +1,137 @@
+# File: t_bree.txt
+
+# Bree
+
+############### Additional default terrain settings ###############
+
+# Default for Quest 1 = entrance is quest entrance
+F:z:8:3:0:0:0:0:0:4
+
+# Default for Quest 18 = entrance is tree
+F:y:96:3
+
+# Default for Quest 18 = entrance is tree
+F:x:96:3
+
+############### Quest 4 - Thieves Hideout finished = house ###############
+?:[EQU $QUEST4 2]
+F:z:74:3:0:0:0:0:0:7
+?:[EQU $QUEST4 5]
+F:z:74:3:0:0:0:0:0:7
+?:1
+
+############### Quest 8 - Troll Glade ###############
+?:[AND [EQU $QUEST8 1] [EQU $DAYTIME 0] ]
+F:y:8:3:0:0:0:0:0:8
+?:1
+
+############### Quest 9 - Wights Grave ###############
+?:[EQU $QUEST9 1]
+F:x:8:3:0:0:0:0:0:9
+?:1
+
+###### Additionnal buildings #######
+
+# Castle: Plot Bree
+F:B:75:3:0:0:0:0:0:1
+
+# Mayor's house
+F:b:74:3:0:0:0:0:0:10
+
+# The Prancing Pony
+F:a:74:3:0:0:0:0:0:58
+
+# Soothsayer
+F:c:74:3:0:0:0:0:0:12
+
+# Music Store
+F:d:74:3:0:0:0:0:0:64
+
+# The Museum
+F:e:74:3:0:0:0:0:0:57
+
+# Map store
+F:f:74:3:0:0:0:0:0:66
+
+# The Library
+F:g:74:3:0:0:0:0:0:13
+
+############### Town Layout ###############
+
+D:######################################################################################################################################################################################################
+D:# VV -- #
+D:# V -- #
+D:# VV -- #
+D:# VVV -- #
+D:# VV -- #
+D:#OOOO V -- #
+D:# OOOO V -- #
+D:#--- OOOOO VVV --- VV #
+D:#------ OOOOOO V -- VVVV #
+D:#---------- OO V -- VVWWVVV #
+D:#-------------- OO VVV -- VVVWWWWWVVV #
+D:#--------------- OOO VVV -- VVWWWWWWWWWVV #
+D:#----------------- OO VVVVVVV VVWWWWWWWWWWWV #
+D:#------------------- OOOOO --VVVV VVVVV VVWWWWWWWWWWWVV #
+D:###------------------ OO ,,,,,,,,,,,,,,,,,, -- VVVVV VV VVVVVVVWWWWWWWVVV #
+D:#CC####------------------ OOO ,,,,,CCCCCCCCCCCCCCCCCC,,,,,,,,, -- VVVVVV VVVVWWVVV #
+D:#TTCCCC###---------------,, OO ,,,CCCCCCTTTTTTTTTTTTTTTTCCCCCCCCCC,,,, -- VVVV #
+D:#--TTTTCCC###---------,,,-- OO ,,CCCCTTTTTT--------------TTTTTTTTTTCCCCC,,,,, ^-- #
+D:#------TTTCCC##-----,,------ O ,,CCCTTTT..................----------TTTTTCCCCCC,, ^^^ -- #
+D:#---------TTTCC##,,,-------- OO ,CCCTTT....--ssssssss-..---..........-----TTTTTTCCC,,, ^^ -- #
+D:#------------TC,,###- --- OO ,CCTTT...-----SSSSSSSS--.----------,,.....------TTTCCCC,, ^^ -- #
+D:#-------------,TTCCC### -- OOO ,,CCTT...-,,,,--ssssssss-..-sssssssssss,---......---TTTTCCT,, ^^ -- #
+D:#--------- ,,,--TTTCCC -- OO ,,CCCTT..-------,,##9#####-.--sssssssssss-,-------...----TTCCTT, ^^^ -- #
+D:#-------- ,, ,,----TTTCC O ,CCC T..--sssSsss,,,,------.--StSStSSSStS--,------.-....--TTCCTT,^^^ -- #
+D:#------ ,, , OO ,CCTTT...---ssstSSS---,,,----.--sssssssssss---,---...----..--TTCCT^^^^ ^^ -- #
+D:#------- x, ,, OO ,CCTT...-----sssssss--,,-,,---.--sssssssssss---,-...-------..--TTC^^^ ^ ---- #
+D:#------- {, OO ,CTT..---,,,,###6###,,,---,,--.--###########----..----------..--T^^^^ ^ --- -- #
+D:#--------- OOO ,CT..,,,,----,,,,,,,,------,,-.--###b###e###-....,---sssss---.--T^^ ^ -- -- #
+D:#---------- OO ,CCT.,sssssss----,-----------,,.-----.-----....-,--,,-StSSS---.-T^^^ ^ -- ----- #
+D:#------------- OO ,CCTT.-StStSSS---,-----ssssss--..-----.--....--,,,,,,-,sssss---.-T^^^ ^ -- -- ,,, #
+D:#----------- OOOOO ,CTT-.-sssssss---,-----SSSSSS--.------.-..--,,,-ssss--,##f##---.-T^^ ^ -- ----- ,, #
+D:#-------- OO ,CCT-..-##5####----,----ssssss-..........--XXXX,-ssss--,------...-^^^ ^ ^^ ^ --- ---- ,,, #
+D:#- ---- OOOOOOOO ,C OOOO--OOOOO----,----#c##4#-.---.,----,-UUUU,-SSSS--,-----..---^^ ^ ^ --- -----, OOOOOOOOOOOOOO#
+D:#- ---- OOOOOOO ,CT-OssOOOO---OOOOOOOOO--OOOO--.-T-.-sss--,XXXX,-ssss---,---..--T^^ -- -- OOO #
+D:#- ----- OOOOOOOOSt.--------XXXXX-OOOO--OOOO---.-StS--,#0##,-ssss---,---.---^^ ^ ^ -- --- OOOO #
+D:#- --- ----- ,,CT--.ss.-sssss--XXXXX,---------OOOO.-sss---,,,,,-####--,---..-T^^ ^ ^ -- --- OO #
+D:# ---- ---- ,,CT--.B#.-SStSS--##g##,------------OO-#z#-ssssss-,,,---,----.--T^^ ^ -,- OOOOO #
+D:# ------- ---- ,,CTT-....-sssss--,,,,,,-------------OO-,--SSSSSt-sss,-,---...-T^^ ^ ^ -, OOOO #
+D:# ------- ------ ,,CCTT---..#2###-,sssss,-SSSSSSSS-----OO,--ssssss-tSS-,.....---^^ ^^ ^^^ -, OOOOOOOO #
+D:# ----- ----- ,,CCT----..,,,,,-StSSS,-ssssssss------OOO-#1##a#-sss...-----T^^ ^^ -,- OOOOO #
+D:# ---- -------- ,,CCTT----..----,sssss,-###d####--------OO,.,,.,-#7#----TTTT^^ ^ ^^ -, OOOOO #
+D:# --------------- ,,,CCTTTT--..---,##3##-,--,,,---------...OOOOOOOOOOOTTTTTCC^^^ ^^ ^^ ,- OOO #
+D:# -------- ,,,CCCC --..........,-,,---,--.......-------TTTTTOCCCCC,,^^^^^^^^^^^ -.- OOOOO #
+D:# ---------- ,, ,,CCCTT----------.....-......-------TTTTTTTCCCCO,,,,, ^^^^^^^ -.- O #
+D:# ------- ,, ,,CCTTTTTTTTTT-----...------TTTTTTTCCCCCC,,,,OOO -.- OOOO #
+D:# ---- ,,, ,CCCCCCCCCCTTTTT-----TTTTTTCCCCCC,,,,,, OOO OOOOOOOOO #
+D:# ^^ ---- ,, ,,,,,,,,,,CCCCCTTTTTTCCCCC,,,,,, OO OOO-- #
+D:# ^^^^^ ,,, ,,,,,CCCCCC,,,,, OOOO OOO-- #
+D:# ^^^^^^^^^ ,, ,,,,,, OOOOOOO OOO--- #
+D:# ^^^^^^^^^ ,, OOOOOOO---- #
+D:# ^^^^^^^^^^^^^^^ ,,, ..------ #
+D:# ^^^^^^^^^^^^^^ ,,, ...... ....----- #
+D:# ^^^^^^^^^^^^^^^ ,,, ........... ............ ............-------,,,, #
+D:#^^^^^^^^^^^^^^^^^ ,, ... .........-------------- ,,,,,,, ,,,,,,,,, #
+D:# ^^^^^^^^^^^^^ ,, . ,,,,,, ,,,,,,,,, #
+D:# ^^^^^^^^^^^^^^ ,, ... ,,,,, ------ --- #
+D:# ^^^^^^^^^^^^^^^ ,, . ,,,,,,,,------- ----- #
+D:# ^^^^^^^^^^^^^^ , .. ---------------- #
+D:# ^^^^^^^^^^^^^^^^ ,, .. ---------y-------- #
+D:# ^^^^^^^^^^^^^^^ , .. ----------------- #
+D:# ^^^^^^^^^^^^^^^^ ,,. --- ---- ---- #
+D:# ^^^^^^^^^^^^^ ,. - -- -- #
+D:# ^^^^^^^^^^^^^^ . #
+D:# ^^^^^^^^^^^^^^ . #
+D:######################################################################################################################################################################################################
+
+
+############### Starting positions ###############
+
+# Standard starting position for normal races
+?:[AND [EQU $LEAVING_QUEST 0] [NOT [EQU $RACE Vampire] ] ]
+P:33:131
+
+# Standard starting position for vampires (at the dungeon entrance)
+?:[AND [EQU $LEAVING_QUEST 0] [EQU $RACE Vampire] ]
+P:31:150
diff --git a/lib/mods/theme/edit/t_cerin.txt b/lib/mods/theme/edit/t_cerin.txt
new file mode 100644
index 00000000..0a87d3bb
--- /dev/null
+++ b/lib/mods/theme/edit/t_cerin.txt
@@ -0,0 +1,98 @@
+# File: t_cerin.txt
+
+# Cerin Amroth map by furiosity <furiosity@zionmainframe.net>
+# NB! The additional terrain features and stores (if any) assume usage of the following files from the 'theme' module:
+# f_info.txt, t_pref.txt, st_info.txt, and ba_info.txt
+# Please download the module and refer to the files for the terrain feature definitions http://modules.t-o-m-e.net/
+# Don't forget to modify the maximum number of terrain features, etc. in misc.txt as well.
+
+### Additional terrain features ###
+
+# Mallorn
+F:m:243:3
+
+# Flet
+F:f:220:3
+
+# White tree
+F:w:237:3
+
+# Low hill
+F:h:213:3
+
+# Altars
+F:i:161:3
+F:j:162:3
+F:k:163:3
+F:l:165:3
+F:n:166:3
+F:o:167:3
+F:p:168:3
+F:q:169:3
+
+D:######################################################################################################################################################################################################
+D:#----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------#
+D:#----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------#
+D:#----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------#
+D:#----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------#
+D:#----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------#
+D:#----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------#
+D:#----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------#
+D:#----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------#
+D:#----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------#
+D:#----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------#
+D:#----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------#
+D:#----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------#
+D:#----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------#
+D:#----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------#
+D:#----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------#
+D:#----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------#
+D:#----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------#
+D:#----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------#
+D:#----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------#
+D:#----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------#
+D:#----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------#
+D:#----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------#
+D:#----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------#
+D:#-----------------------------------------------------------------------------------------NNNNNNNNN--------------------------------------------------------------------------------------------------#
+D:#----------------------------------------------------------------------------------------NNwwwwwwwNN-------------------------------------------------------------------------------------------------#
+D:#---------------------------------------------------------------------------------------NNwwhhhhhwwNN------------------------------------------------------------------------------------------------#
+D:#--------------------------------------------------------------------------------------NNwwhmmmmmhwwNN-----------------------------------------------------------------------------------------------#
+D:#-------------------------------------------------------------------------------------NNwwhmmhhhmmhwwNN----------------------------------------------------------------------------------------------#
+D:#------------------------------------------------------------------------------------NNwwhmmh---hmmhwwNN---------------------------------------------------------------------------------------------#
+D:#-----------------------------------------------------------------------------------NNwwhmmh--o--hmmhwwNN--------------------------------------------------------------------------------------------#
+D:#----------------------------------------------------------------------------------ENwwhmmh-i-N-j-hmmhwwNE-------------------------------------------------------------------------------------------#
+D:#----------------------------------------------------------------------------------ENwwhmmhp-NEN-qhmmhwwNE-------------------------------------------------------------------------------------------#
+D:#----------------------------------------------------------------------------------ENwwhmmh-l-N-k-hmmhwwNE-------------------------------------------------------------------------------------------#
+D:#-----------------------------------------------------------------------------------NNwwhmmh--n--hmmhwwNN--------------------------------------------------------------------------------------------#
+D:#------------------------------------------------------------------------------------NNwwhmmh---hmmhwwNN---------------------------------------------------------------------------------------------#
+D:#-------------------------------------------------------------------------------------NNwwhmmm@mmmhwwNN----------------------------------------------------------------------------------------------#
+D:#--------------------------------------------------------------------------------------NNwwhmm@mmhwwNN-----------------------------------------------------------------------------------------------#
+D:#---------------------------------------------------------------------------------------NNwwhm@mhwwNN------------------------------------------------------------------------------------------------#
+D:#----------------------------------------------------------------------------------------NNwww@wwwNN-------------------------------------------------------------------------------------------------#
+D:#---------------------------------------------------------------------------------------------@------------------------------------------------------------------------------------------------------#
+D:#---------------------------------------------------------------------------------------------@------------------------------------------------------------------------------------------------------#
+D:#---------------------------------------------------------------------------------------------@------------------------------------------------------------------------------------------------------#
+D:#---------------------------------------------------------------------------------------------@------------------------------------------------------------------------------------------------------#
+D:#---------------------------------------------------------------------------------------------@------------------------------------------------------------------------------------------------------#
+D:#---------------------------------------------------------------------------------------------@------------------------------------------------------------------------------------------------------#
+D:#---------------------------------------------------------------------------------------------@------------------------------------------------------------------------------------------------------#
+D:#---------------------------------------------------------------------------------------------@------------------------------------------------------------------------------------------------------#
+D:#---------------------------------------------------------------------------------------------@------------------------------------------------------------------------------------------------------#
+D:#---------------------------------------------------------------------------------------------@------------------------------------------------------------------------------------------------------#
+D:#---------------------------------------------------------------------------------------------@------------------------------------------------------------------------------------------------------#
+D:#---------------------------------------------------------------------------------------------@------------------------------------------------------------------------------------------------------#
+D:#---------------------------------------------------------------------------------------------@------------------------------------------------------------------------------------------------------#
+D:#---------------------------------------------------------------------------------------------@------------------------------------------------------------------------------------------------------#
+D:#---------------------------------------------------------------------------------------------@------------------------------------------------------------------------------------------------------#
+D:#---------------------------------------------------------------------------------------------@------------------------------------------------------------------------------------------------------#
+D:#---------------------------------------------------------------------------------------------@------------------------------------------------------------------------------------------------------#
+D:#---------------------------------------------------------------------------------------------@------------------------------------------------------------------------------------------------------#
+D:#---------------------------------------------------------------------------------------------@------------------------------------------------------------------------------------------------------#
+D:#---------------------------------------------------------------------------------------------@------------------------------------------------------------------------------------------------------#
+D:#---------------------------------------------------------------------------------------------@------------------------------------------------------------------------------------------------------#
+D:#---------------------------------------------------------------------------------------------@------------------------------------------------------------------------------------------------------#
+D:#---------------------------------------------------------------------------------------------@------------------------------------------------------------------------------------------------------#
+D:#---------------------------------------------------------------------------------------------@------------------------------------------------------------------------------------------------------#
+D:#---------------------------------------------------------------------------------------------@@@@@@-------------------------------------------------------------------------------------------------#
+D:###################################################################################################################################################################################################### \ No newline at end of file
diff --git a/lib/mods/theme/edit/t_d_beorn.txt b/lib/mods/theme/edit/t_d_beorn.txt
new file mode 100644
index 00000000..75235407
--- /dev/null
+++ b/lib/mods/theme/edit/t_d_beorn.txt
@@ -0,0 +1,75 @@
+# File: t_d_beorn.txt
+
+# Beorn's Halls map and destruction by furiosity <furiosity@zionmainframe.net>
+
+# NB! This file assumes usage of the following files from the 'theme' module:
+# f_info.txt and t_pref.txt
+# Please download the module and refer to the files for the terrain feature definitions http://modules.t-o-m-e.net/
+# Don't forget to modify the maximum number of terrain features, etc. in misc.txt as well.
+
+D:######################################################################################################################################################################################################
+D:# HHHHHHDDHDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDHHDHDDDHHHHHHHHHHHHHHHHHH #
+D:#HHHH HHHHHH HHHHHH HHHHHHHHHHHHHHHDDDDHDDDDHDDHHHHHHHHHHHHHHHHH@%%@HHHHHHHHHHHHHHHDDDDDHHHHDDDHHHHHHHHHHHHH #
+D:# HHHHHHHHHHHHHHHHHHHH HHHDDDHHHDDDDHDDHHHHHHHHHHHHHHHDDDDDDD%%DDDDDDDDDHHHHHHHHHHHDDDDDHHHHHDDDDHHHHHHHH #
+D:# HHHHHHHH HHHH HHHHHHHHHH HHHDDDDDHHHDDHDDHHHHHHHHHHHHHHDDDDDHH@%%@HHDDDDDDDDDDDDDDDDHHHHHHDDDHHDDDDDDHHHHHH HH #
+D:# HHDDDHHHHHHDDHHHHHHHHHHHHHHDDDHHHH@%%@HHH@@@@@@@HHHHDDDDDDDDDHHHHDDDHDDDDHHHDHHHH #
+D:#HHHHHHHH HHHHHHHHHHDDDHHHHHHHHHHHHHHDDDHHHH@%%@HHH@@@@@@@@@HHHHHHHHHDDDDDDHHHDDHHHHHDDDDDHHHHHHHH #
+D:#HHHH HHHHHHHHHHHHHHHHHDHHHHDDDHHHHHHHHHHHHHHDDDHHHHH@%%@HHH@@@@@@@@@@@HHHHHHHHHHHDDDDHHHDDDHHHHHDHHHHHHHH #
+D:#HHHH HHHHHHHH HHHDDDDDHDDDHHHHHHHHHHHHHHDDDHHHHHH@%%@HH@@@@@@@@@@@@@HHHHHHHHHHHHDDDHHHHDDHHHHHHHHHHHH #
+D:# HHHHHH HHHHHHHH HHHHHHHH HHHHHDDDDDHDDHHHHHHHHHHHHHHDDDHHHHHH@%%@HH@@@@@@@@@@@@@@@HHHHHHHHHHHHDDDHHHHDDHHHDDDHHHH #
+D:#HH HHHHHHHH HHHHHH HHHDHHDDDHDDHHHHHHHHHHHHHHDDDHHHHHHH@%%@H@@@@@@@@@@@@@@@@@HHHHHHHHHHHHDDDHHHHDDHDDDDDHHHH #
+D:# HHHHHH HHHH HHHH HHHHHHHHHDDDDDHHHDDHHHHHHHHHHHHHHDDDHHHHHHH@%%@HH@@@@@@@@@@@@@@@@@HHHHHHHHHHHHHDDDHHHHDDHDDDHHHHHHH #
+D:# HHHHHHHHHHHH HHHHHH HHHHHHHHHHDDDHHDDDHHHHHHHHHHHHHHHHDDDHHHHH@%%@HHH@@@@@@@@@@@@@@@@@HHHHHHHHHHHHDDDHHDHHHDDHHHHDDDDHHH #
+D:#HHHHHH HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHDDDHHHHHHHHHHHHHHHDDDHHHHHHH@%%@HHH@@@@@@@@@@@@@@@HHHHHHHHHHHHDDDHHHDDHHDDHHHDDDDDDHH #
+D:#HHHH HHHHHHHH HHHHHHHH HHHHHHHHHHHDHHHDDHHHHHHHHHHHHHHHHHDDDHHHHHHH@%%@HHH@@@@@@@@@@@@@HHHHHHHHHHHHHHDDDHHDDHHHDDHHHDDDDHHHH #
+D:#HH HHHHHHHH HHHHHH HHHDDDDDHDDHHHHHHHHHHHHHHHHDDDHHHHHHHH@%%@HHHH@@@@@@@@@@@HHHHHHHHHHHHHHHHDDDHHDHHHHDDHHHHHHHHHH #
+D:# HHHHHHHHHHHH HHHHHHHHDDDHDDD HHHHHHHHHHHHHHHHDDDHHHHH@HH@%%@HHHH@@@@@@@@@HHHHHHHHHHHHHHHHDDDHHHDHHHHHDDDHDDDDHH #
+D:#HHHH HHHH HHHHHHHHHHHHHDHHD@H@HHHHHHHHHHHHHHHDDDHHHHH@@@HH@%%@HHHH@@@@@@@HHHHHHHHHHHHHHHHHHDDDHHDDHHHHDDDHDHHHHHH #
+D:# HHHHHHHHHH HHHHHH HHHHDDDDHHHDDD@H@HHHHHHHHHHHHHHHDDDHHH@@@@@HH@%%@HHHHHHHHHHHHHHHHHHHHHHHHHHHHHDDDHDHHHHHDDHHDDHHHH #
+D:# HHHHHH HHHH HHHDDDDDDHHDDHH@H@HHHHHHHHHHHHHDDDHHHHH@@@HH@%%@HHHHHHHHHHHHHHHHHHHHHHHHHHHHHDDDHHDDDHHHHDDHHHDDDHH #
+D:#HHHH HHHHHH HHHHHHHHHH HHHHHHHHHHHHDDDDHHHDDDH@H@HHHHHHHHHHHHHHDDDHHHHH@HHHH@%%@HHHHHHH@@@HHHHHHH@@@@@HHHHHHHDDDHHHHHHHHDDHHDDDDDHH #
+D:#HH HHHH HHHHHHHH HHHHHHHHHDDDHH@H@HHHHHHHHHHHHDDDHHHHHHHHHH@%%@HHHHHH@@@@@@@HHHH@@@@@@@HHHHDDDHHHDDDHHHHDDHHHDDDHHHH #
+D:# HHHH HHHH HH HHHHHHDDDDDDHHHH@H@HHHHHHHHHHHHHDDDHHHHHHHH@%%@HHHHH@@@@@@@HHHHHHH@@@@@HHHDDDDHHHDDDHHHHHDDHHHHHHH #
+D:# HHHHHHHH HH HH HHHHHHHHHDDDHHHDDDHH@H@HHHHHHHHHHHHDDDHHHHHHHH@%%@HHHH@@@@@@@HHHHHHHHHHHHHHHDDDDHHHHDDDHHHHHHDDHHDDDHH #
+D:#HH HHHHHHHH HHHHHHHH HHHHDDDDHDDDHH@H@HHHHHHHHHHHHHDDDHHHHHH@%%@HHHHHHH@@@HHHHHHHHHHHHHHHHHDDHHHHHHHHHHHHHHHDDHDDDDDHH #
+D:#HH HHHH HHHH HHHHHHHHHHHHHHHHHHHDHHHHHDDDHH@H@HHHHHHHHHHHHDDDHHHHHH@%%@HHHHHHHHHHHHHHHHHHHHXXXXXXXXDHHHHHHHHHHHHHHHHDDHHDDDHH #
+D:# HHHHHH HHHHHH HHHHHHHDDDDDHHHHDDHH@H@HHHHHHHHHHHHHDDDHHHHHH@%%@HHHHHHHHHHHHHHHHHHH========DHHHHHHHHHDDHHHHHDDHHHHHHHH #
+D:#HH HHHHHHHHHH HHHH HHHDDDDDHHDHDDHH@H@HHHHHHHHHHHHDDDHHHHHH@%%@HHHHXXXXX@@@@@@@@@@@========DHHHHHHHHHHDDHHHHDDDHHDDDHHHH #
+D:#HHHH HHHHDHHHHDHDDHH@H@HHHHHHHHHHHHHDDDHHHHHH@%%@HHH=====,,,,,,,,,,,,=======DHDHHHHHHHHHDDDHHDDDHDDDDDHHHH #
+D:# HHHHHHHHHH HHHHDDDDHDDDHH@H@HHHHHHHHHHHHDDDHHHHHH@%%@HHHH==,==@@@@@@@@@@@HHHHHHHHHHHHHHHHDDDHHHHHHDDHHHHDDDHHH #
+D:# HHHH HHHHHH HHHHHDDDDDDHDDHH@H@HHHHHHHHHHHHHDDDHHHHH@%%@HHHHH@,@HHHHHHHHH==================HDHHHHHHHHHDDHHDHHHH #
+D:# HHHHHH HHHHHHHHHH HHHHHHDDDDHHHDHH@H@HHHHHHHHHHHHDDDHHHHDDH@%%@HHHH@,@HHHHHHHHH==================HDHHHHDDDHHDDHDDDHHH #
+D:# HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHDDHH@H@HHHHHHHHHHHDDDHHHHHHH@%%@HHHHH@,@HHHHHHHHH==================@DHHHHDHDHHDDHDDDHHH #
+D:#,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,gg,,,,,,,,,,,,,,,,,,,,,,,,,,%%,,,,,,,,,,,,,,,,,,,,,,,,,,,=HHHHHHHH=,,,@HHDHHHHDDHHDHHHHHH #
+D:#,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,++,,,,,,,,,,,,,,,,,,,,,,,,,%%,,,,,,,,,,,,,,,,,,,,,,,,,,,,=HHHHHHHH=@D,,@HDDDDHDDHHHDDDHHHHH #
+D:#HH HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHDDHH@H@HHHHHHHHHHHHDDDHHHH@%%@HHHHHHHHHHH,H,,,HHH==================HDH,@HHHHDHDDHHDDDDDHH #
+D:# HHHHHHHH HHHHHHDDHDDDHH@H@HHHHHHHHHHHHHDDDHH@%%@HHHHHHHHHH@,@HH,,,,H==================HDH,@HDDDDHDDHHHDDDHHHH #
+D:#HH HHHHHHHH HHHHHHHH HHHDDDDHDDHH@H@HHHHHHHHDDDHHHDDD@%%@HHHHHHHHHH@,@HHHHHH,,==================HDH,@HHHDDHDDHHHHHHHHH #
+D:#HHHHHH HHHHHHHHHH HHHHHHHHHHDDHHDDHH@H@HHHHHHDDDHHHHHDD@%%@HHHHHHHHHH@,@HHHHHHHHD@,HHHHHHHHHHHHHHHHH@,,@HDDHHDDDHHDDDHH #
+D:#HH HHHHHH HHHHHHHH HHHHDDDHHHHHDDHH@H@HHHHHHHDDDHHHDDD%%@HHHHHHHHHH@,@HHHHHHHHHDD@,,,@HHHHHHHHHHH@,,,@HHHHHHHDDHHDDDHH #
+D:# HHHH HHHHHH HHHHHHHHHDDDDDHHHDDDHH@H@HHHHHHHHDDDHDDDD%%@HHHHHHHHH@,@HHHHHHHHHHHDDH@,,,,,@@@@,,,,,@@HHHHHHHHHDD DDDDDHH #
+D:# HHHH HHHH HHHHHHHDDHDDHHHDDDHH@H@HHHHHHHHHHHHHDD%%@HHHHHHHHH@,@HHHHHHHHHHHHDDDDHH@,,,,,,,,,@HHDDDHHHHHHDDHHHDDDHH #
+D:# HHHHHHHH HHHHHHHHHHHH HHHHHHHHHHHHDHHDDDHHH@H@HHHHHHHHHHHHHD%%DHHHHHHHHHH@,@HHHHHHHHHHHHDDDDHH@@@@@@@@@HHHHDDDDDHHHDDHHHDDDHH #
+D:# HH HH HHHHHH HHHHDDDDDHDDHHH@H@HHHHHHHHHHHH@%%DDDHHHHHHHHHH,,@HHHHHHHHHHHHHDDDDHHHHHHHHDDHHHHHDDDHHHDDHHHHHHHH #
+D:# HHHHHH HHHHHHHDDDHHHDDHH@H@HHHHHHHHHHH@%%@HDDDHHXXXXXXX,H,@HHHHHHHHHHHHHDDDDDHHHHHDDDDDHHHHHDDDHDDHHHHHHH #
+D:# HHHHHHHHHHHH HHHHHHHHHHHHHHHH HHHHHHHHHHDDDHH@H@HHHHHHHHHHHH@%%DDDHHH=======,H,,@HHHHHHHHHHHHHHHDDDDHHHHHHHHHHHHHHHHHDDHHDHHHHH #
+D:# HHHHHHHHHHHH HHHHHHHHHHHHHDDDDHHHDDDHH@H@HHHHHHHHHHH@%%@HDDDHH=======,H,HHHHHHHHHHHHHHHHHHHHDDDDDDDHHHHHHHHHHDDDHDDDHHHH #
+D:# HHHHHH HHHHHHDDDDDDHHHDDHH@H@HHHHHHHHHHHH@%%DDDDHH====,==,H,XXXXHHHHHHHHHHHHHHHHHHHHDDDDDDHHDHHHHHDDHHDHHHHH #
+D:# HHHHHH HHHH HHHDDDDHHHDDDDH@H@HHHHHHHHHHHH@%%@DDDDHHHHH,,,,H,====HHHHHHHHHHHHHHH@@@HHHHHHDDDHHHHHHDDHHHHHHHHH #
+D:#HHHHHH HHHHHHHHHH HHHHHH HHHHHHHHHHHDDHHDDDH@H@HHHHHHHHHHHHH@%%@DDDDHHHHHHHHH,=,==HHHHHHHHHHHHHH@VVVV@HHHHHDDDHHHHHDHHHHHHHHHH #
+D:# HHHHHH HHHHHH HHHHHH HHHHHHDDDDHHDD@H@HHHHHHHHHHHHH@%%@HHDDDHHHHHHHHH,,,HHHHHHHHHHHHHHHHH@VVVV@HHHHDDDDHHHDDHHHDDDHHH #
+D:#HHHH HHHHHHHHHHHHHH HHHHHHHHHHHH HHHHHHHHHDDHHDDDH@HHHHHHHHHHHHH@%%@HHHHDDDHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@VVVV@HHDDDDHHHHDDHHDDDDDHH #
+D:#HH HHHHHHHHHH HHHH HHHHHHHHHHHHHHHHDDDHHHHHHHHHHHHH@%%@HHHHHHDDDHHHHHHHHHHHHHHHHHHH@HHHHHHHHH@@@@HHDDDDHHHHDDHHHHDHDHH #
+D:# HHHH HHHHHHHH HHHHHHHH HHHHHHHHHDDDHDDDDHHHHHHHHHHH@%%%@HHHHHHHHDDDHHHHHHHHHHHHHHHH@@@@@HHHHHHHHHHHHDDDDHHHHHDDHHHHHHH #
+D:# HHHHHHHHHH HHHHHHHHHH HHHHHHHH HHHHHHDDDDDHHDDHHHHHHHHHHHH@%%%@HHHHHHHHDDDHHHHHHHHHHHHHH@@@@@@@HHHHHHHHHHDDDDHHHHDDDHHHHHHHHHHHH #
+D:# HHHHHH HHHHHH HHHH HHHH HHHHDDDDDHHHDDHHHHHHHHH@%%%@HHHHHHHHHHHDDDHHHHHHHHHHHHHH@@@@@HHHHHHHHHHDDDDHHHHDDHHHHHHHHHHHH #
+D:# HHHHHHHH HHHHHH HHHHHHHHHDDDHDDHHHHHHHHH@%%%@HHHHHHHHHHDDDDHHHHHHHHHHHHHHH@HHHHHHHHHHHDDDHHHHHDDHHHHHHHHHHHHH #
+D:# HHHHHH HHHHHH HHHHHHDDDDDHDDHHHHHHH@%%%@DDDHHHHHHHHHDDDDDHHHHHHHHHHHHHHHHHHHHHHHDDHHHDHDDDDHHDDDDDHHHHHH #
+D:# HH HHHH HHHHHHHH HHHHHHHDDDHHHDDHHHHHH@%%@DDDHHHHHHHHHHHHDDDDDDDHHHHHHHHHHHHDDDDDDDDDHHHHHHDDDHHHHDDDDDHHHHDHH #
+D:# HHHHHHHH HHHHHHHHHHHH HHHHHH HHHHHDHHHDDHHHH@%%@HHHHHHHHHHDDDHHHHHHDDDDDDDDDDDDDDDDDDDDDDDHHHHHHHDD HDDDHHDDDHHHH #
+D:# HHHHHH HHHHHHHH HHHHHHHHHH HHHHHH DDDDDDHHDDHH@%%@HHHHHHHHHHHHHHHHHHHHHHHHHDDDDDDDDDDHHHHHHHHHHHHHHDDHHDDDDDHHHH #
+D:#HHHHHHHHHHHH HHHHHHHHHHHHHH HHHHHHHHHHHH DDDDDHHDDDDD%%@HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHDDHHHHDDDHHHHHHHHHHHHH #
+D:# HHHHHHHHHH HHHHHH HHHHHH HHHHHHHHHH DDDHDDDDDDDDHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHDDDHHHHHHHHHHHHHHHH #
+D:#HHHHHH HHHHHH HHHHHHHH HHHHHHHH HHHHHHHHHDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDHHDDDDDHHHHHHHHH #
+D:#HHHHHH HHHHHHHH HHHHHHHHHHHHHH HHHDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDHHHHHHHHHHHHHH #
+D:###################################################################################################################################################################################################### \ No newline at end of file
diff --git a/lib/mods/theme/edit/t_d_bree.txt b/lib/mods/theme/edit/t_d_bree.txt
new file mode 100644
index 00000000..92fde41f
--- /dev/null
+++ b/lib/mods/theme/edit/t_d_bree.txt
@@ -0,0 +1,91 @@
+# File: t_d_bree.txt
+#
+# Destroyed Bree
+
+# original town by someone else
+# screwing up by fearoffours (fearoffours@moppy.co.uk)
+#
+# Created for ToME
+
+# Permanent rubble
+F:R:206:3
+
+############### Town Layout ###############
+
+D:###########################################################################################################=##########################################################################################
+D:#DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD=DDDDDDDDDDDDDDD VVDDDDDDDDDDDDDD--DDDDDDDD==DDDDDDDDDD DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD#
+D:# DDD DDDDDDDDDDDDDDDDD DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD DDDDDDDD DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD VDDDDDDDDDDDDDD--DDDDDDDDDDDDDDDDD D DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD #
+D:#DDDDDDDDDDDDDDDDD D D DDDDDDDDDDDDDDDDDDDDDDDDDD DD D D D DDDDDDDD DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDVVDDDDDDD --DDDDDDD====DDDDD DDDDDDDDDDDDDD DDD DD DDDDDDDDDDDDDDDD #
+D:#DDDDDDD D DDDDDDDDDDDDDDDDD DDDDDDDD DD D HHDD D D DDDD D D D D D D DDHHDDDD=DDDDDDDDDDDDDDDDDDDDDDDVV===DDDDD --DDDDDHHHDDDDDD =DDDD=DDDD===DDDDDDDDDDDDDDDDDDDD DDDDDDDDDDD#
+D:# DDDD DDD DD DDDDDDDDDDDDDDDDD D DD DDDDDDDDD D D DDDDDDDDDDDDDDDDDDDDDDDDDHHHDDDDDDDDDDDD VVDDDDDDD --DDDDDDDDDDDDDDDDDDDDDDHHH DDDDDDDDDDDDDDHHHDDDDDDD=DDDDDDD #
+D:#OOOODDDDDDD D D DDDDDDDD D DDDDDDDDD D DD D DDDDDDDDDDDDD D DDDDDDDDDDDDDDDHHDDDDDDD DDDDDDDDDDDDDDD VDDDDDDD --DDDDDDDDD DDDDDDDDDDDDDDDDDDDDDDDDDD===HDDDDDDDDDDDD #
+D:# OOOODDDDDDD DDDDDDDDDDDDDDDDDDDDDDD HH DDDDDDDDD HDD DDDDDDDDDDDDD D DDDDDHHHHHHDDDDDDDDDDDDHHHDDDDDDDDDDDDDDD VDDDDDDD --DDDDDDDDDDDD DDDDDHHDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD== #
+D:#--- OOOOODDDDDDDDDDDDDDDDD DDDDDDDD D DD D HHHDDHHDDDDDDDDD D DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD==DDDD VVV ---DDDDDDDDDDDD DDDDDDDDD VVDDDDDHDDDDDDDDDDDDDDDDD #
+D:#------ OOOOOO DD D D DDDDDDDDDD DDD DDDDDDDDDDDHHHH = D DDDDDDDDDDDDDDDDDDDDHHHDDDDDDDDDDDDDDDDDDDDDDDD V --DDDDDDDDDDDDD DDDDHD VVVVDDDDDDDDD== DDDDDDDDDDD #
+D:#---------- OO DDD HDHHHDDD DDDDDDDDDDDDDDDDD D D DDDDHHHDDDDDDDDDDDDD D HDDDDDDD =DDDDDDDDDDDDDD===DDDDDDDDDDDDD V -- DDDDDDDDDDD DD VVWWVVVDDDDDHHH DDDDDDDDDDDDDD #
+D:#-------------- OO DDDDDDDDDDDDDDDDD H D D D DDDDDHHHDDDDDDDDDDDDDD DDD D DDDDDDDDDDDDDDDDDDDDDDH==HDDHHDDDDDDDDDDVVV --DDDDDDDDHHHHDDDDDD DDD VVVWWWWWVVVDDDDDDDDDDDDDDDDDDDDDDD#
+D:#------D-------- OOODDDDDDD D DDDDHHHDDD HHD DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD DDDDDDDDDDDDDDDDDDDD =DDDDDDDDDDDDDDDD VVV --DDDDDDDDDDDDDDDD VVWWWWWWWWWVVDDDDDDDDDDDDDDDD #
+D:#----------------- OO H DDDDDDDDDDDDDDDDD HHH D DDDD DD DDDDDDDDDDDDDDDDDDDDD DDDDDD DDDDDDDDDDDDDDDDHDDDDDDDDDDDDDDDDDD VVVVVVVDDDDDDDDDDDDDDDD VVWWWWWWWWWWWVDDDDDD DDDDDDDD #
+D:#------------------- OOOOO DD DDDDDDDDDD DDDDDDDD D DDDDDDDDDDD DDD DDD DD DDD DDDDD DDDDDDDDDDDDDDDDD=DDDDDDDDDDDDDDDD--VVVV VVVVVDDDDDDD VVWWWWWWWWWWWVVDDDDDDDDD DDDDD #
+D:###------------------ OOH D HH DDD DDDDDDDDD DDDDDDDDDDDDDDDDD DDDD DDD ,,,,,,,,,,,,,,,HH,DDDDDDDDDDDDDDDDDDDDD==DDDDDDDDD -- VVVVV VV VVVVVVVWWWWWWWVVVDDDDDDD DDDDDDDD #
+D:#CC####------------------ OOODDDDDDD DDD DDDDDDDDD DD D DDDD DD DDDD,,,,CCCCCCCCCCCCCCCCCC,,,,,,,H,DDDDDDDDDDDDDDDDDDDDDDD --DDDDDDD VVVVVV VVVVWWVVVDDDDDDDDDDDDDDDDDDDDDDD #
+D:#TTCCCC###----D----------,, OO DDDDDDDDDDDDDDD=DDDDDDDDDDDDDDDDDDDDDDD DD ,,,CCCCCCTTTDDTTTDD TTDDTCCCCCCCCCC,,,,DDDDDDD=DDDDD==DDDDDDDD --DDDDDDDDDDDDDDDDDDDDDDDVVVVDDDDDD===HHHDDDD=DDDDDD #
+D:#--TTTTCCC###---------,,,-- OO = DDD D DDDDDDDD DD D DDD DDDD,CCCCTTTTTD---$----------TT T TDDDTCCCCC,,,,,DDDDDDDDDDDDDD H ^--DDDDDDDDDDD DDDDDDDDDDDDDDDDDDDDDDDDDDDDDD #
+D:#------TTTCCC##-----,,------ ODDDDDDDDDDDDDDDD DDDDDDDDD DDDDDDDD DD ,,CCCTTDDD....$$$........D.----H-----TDDTTCCCCCC,,DDDDDDDDDDDDDD^^^ --DDDDDDDDDDDDD==DD DDDDDDDDDD DDDDDDDDDDDDDDDDDD #
+D:#---------TTTCC##,,,-------- OO D DDHHHHDDDDDD DDDDDDDDDD D DD ,CCC TD....--ssss-sss-D.--H.......H..--$--TTDDDTCCC,,,DDDDDDD ^^ --DDDHHHD DDDDDDDD DDDDDDDDDDDDDDD DDDDD =DDDDDDD #
+D:#------------TC,,###- --- OODDDDDDD DDDD H =DDDDDDD DD D,CCTTT.DDH=---S.S=$S$S#-.------DD-$,,.....------TDDDCCC,,DDDDDDD^^ --DDDDDDDDDDDDDDD DDDDDDDDDDDDDDDDDDD=DDDDDDDD #
+D:#-------------,TTCCC### -- OOO DDD DDD DDDD D D DD DD ,,CCTD...=,,,,H-ssss.ss-...-ss=s--sssss,---...H..---TDDDCCT,H ^^DDDDDDD--DDDDDDDDDDDD DDDDD DDDDDDDDDDDD==DDDDDDDDDDD #
+D:#--------- ,,,--TTTCCC -- OODDDDDDDDDDDHDDDDDDDDDDDDDDDDDD D ,,CCCTT..-------,,#.,##,-#-.--sss.s$$$ssss,--$HH--..$----TDCCTT, ^^^DDDDDDD --DDDDDDDDDDDD===DDDDDD DDDDDDDDDDDDDDDDDDDDDDDD #
+D:#-------- ,, ,,----TTTCCDDDDDDD O =DDDDDDDDD DDDDDHHDDDDD DDDDCCC D=.H-sssSss$S,,,------.--S.SSSS=SS$$--,----DD.-....--=DCCTT,^^^DDDDDDD --DDDD=HHHDDDD DDDDDD DDDDDDDDDD=DDDDDDDDDDDDDDD#
+D:#------ ,, ,DDDDDDDDDDDDDDDD OO DDDDDDDDDD DHDDDDDDDD DDD,CCTDT.=.---ss$sSSS---,,,--H-.--ss,s$s=sss=s--,-$-.==-$--..--TDCCT^^^^ ^^DDDDDDD --=DDDDDDDDDDDDDD DD DD =DDDDDDDDDDDDDDDD #
+D:#------- ,, ,,DDDDDDDDHHHDDDDD OODDDDDDDDDDDDDHDDDDDDDDDDD D ,CCTT...-----s,,-sss#-,,-,DD-$.--.ssssHsss,s#--,-...-------..-==TC^^^ ^DDDDDDD ----DDDDDDDDDDDDDDDDDDDD DDDDDD DDDDDDDD #
+D:#------- {,DDDDDDDDDDDDDDDD = OODDDDDDD DDDDDDDDDD DDD,CTT..-DD,H,,####$###$,-$-,,--.--#####=.#$#H----..-DD---H---$.--D^^^^ ^DDDDDDD--- --DDDDDDDDDDDDDDDDDD DDDDDD DDDD #
+D:#-=-------DDDDDDD DDDDDHDDDDDDDDDDDOOO D DDDDDDDD DDD D ,CT..,,,,----,,,,,#,,------,H-$--#.-#.##.##$-...$,---.sss----.--T^^ ^DDDDDDD -- --DDDDDDD HDDDDDDDDDDDDDDDDDDDDDDD===DDDDDD#
+D:#----------DDDDDDDDDDDDDDDDDDDDDDD OO DDDDDDDD DDD,CCT.,ss$sss#----,$---DD---#-,==-----.----#....-,--,,sStSSS--$.-D^^^ ^DDDDDDD -- -----DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD#
+D:#-------------DDDDDDD HDDDDDDD = OODDDDDDDDDDDDDDDD D ,CCTT.-StS,$S----,-----$s$sH,--..-=H-----....--,,,$,,-.s.sss#--.-D^^^ ^ --DDDDDDD --DDDDDDD ,,DDDDDDDDDD DDDD #
+D:#----------=DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDOOOOO DD D ,CTT-.--s=s,ss#-$,-----S$SSSS--.------$-..==,,,-sssss-,##==#---.-T^^ ^DDDDDDD --DDDD==D -----DDDDDDD ,,DDDDDDDDDDDDDDDDDDDDDDD #
+D:#--------DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD OO D DD D DD,CCT-..-#####,#---HH---$sss$s,-...$...H.$--$XXX,-$ss---,------..=-^^^ ^ ^^ ^ ---DDDDDDD D---D ,,, HDDDDDDDDDDDDDDDD #
+D:#- ----DDDDDDD =DHHDDDDDDDDDDDDD =DDDDDDD OOOOOOOO$ DD $D ,C OOOO--OOOOO----,----######-.---.,----,-UUUUs-SSS$--,--H--..---^^ ^ ^ H ---DDDDDHHDDDDDDDDD -----,DDDDDDD OOOOOOOOOOOOOO#
+D:#- ----DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDOOOOOOO==,CT-OssOOOO---OOOOOOOOO--OOOO--.-D-.-s$s--,XXXX,-=sss-$-,---$$-=D^^DDDDDDDDDDDDDD--DDDDDDDHHHDDDDDD --DDDDDDD OOHDDDDDDD #
+D:#- -----DDDDDDDDDDDDHHDD =DDDDD DDDDDDDDDDDDDDDD OOOOOOOOSt.---------XXX$-OOOO--OOOO---.SStS--,####,--s$s-=-,DD-.--=^^ ^ ^ --DDDDDDDDDDHHHDDDDDDDDDD--- OOOO HDDDDDDD #
+D:#- --- -----DDDDDDHHHDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD ,,CT--.ss.-$sHs$---$XXs,---------OOOO.-s$s---,,,,,-###.--,---..-T^^ ^ ^DDDDDDD --DDDDDDDHDDDDDDDDDDDDDDDD --- OOHDDDDDDDDDDDDDDDD #
+D:# ---D ----DDDDDDDDDDDDDDDDDDDDDDD = =DDDDDDD ,,CT--.s#.-SSt,S-HH##H#,---H-$------OO-#$#-ss,,ss-,,,---,---D.--DH^ ^DDDDDDD -,-DDDDDDDDDDDDDDDDDDDDDDD OOOOODDDDHHHDDDDDDDDD #
+D:# ------- ---- HDDDDDDDDDDDDDDDDDDD DDDDDDDDDDD ,,CTT-..$$-=sss$--,,,,,,---------DDH-OO-,--SSS$St-ss-,-$$--...-T^^ ^ ^DDDDDDD -,DDDDDDD =DDDDDDDDDDDDDDOOOODDDDDDDDDDDDHD DDDDDDD#
+D:# ------- ------DDDDDDDDD DD DDDDDDDDDDD DDDDDDDDDD ,,CCTD---.$#,#$,-,sss,,S-S,SSSSS--$---OO,--s-ss----S--,.....---^^ ^^ ^^^ -,DDDDDDDDDDDDDDDD OOOOOOOODDDDDDDDDDDDD DDDDDDDDD #
+D:# -----DDDDDDD -----DDDDDDDDDDDDDDDD =DDDDDDDDDDDDDDDD ,,CCT----..,,,,,-St$SS,-s,s,s$ss--==--OOO-#,##-$-ss....-==--T^^DDDDDDD ^^ -,-DDDDDDDDDDDDDD OOOOODDDDDDDDDDDDDDDDDDD DDDDDDDDDDD #
+D:# ---- --------DDDDDDDDDDDDDDDDDDDDDDHHDDDDDDDD H ,,CCTD--DD $--$$sss$,-##,##,#=--------OO,.,,.,-##.----DDDT^^ ^ ^^DDDDDDD-,DDDDDDD OOOOODDDDDDD DDDDD HDDDDDDDDD===DDDD#
+D:# ---------------DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD D ,,,CCTTTT--..---,##,###,--,,,--HH-----...OOOOOOOOOOOTTDDDCC^^^ ^^ ^^DDDDDDD ,-DDDDDDD OOODDDDDDDDDDDDDDDDDDDDDDDHHDDDDDDDDDDDDDD #
+D:#DDDDDDD --------DDDDDDDD DDDDDDDDDDDDDDHHDDDDDDDDDDDDDDDDDDH,,CCCC --.DD.....HH,-,==--,--==..H..--H----TDDTTOCCCCC,,^^^^^^^^^=^DDDDDDD -.- OOOOODDDDDD DDDDDDDDDDDDDDDDHHHDDDDDDDDDDDD #
+D:# ----------DDDDDDDDDDDDDD = HDDDDDHHHDDDDDDDDDDDDDDD ,, ,,CCCTT-------D--.....$....H.-------TTTDDTTCCCCO,,,,, ^^^^^^^DDDDDDD -.- ODDDDDDDDDDDDDDDDDDHHDD DDDDDDDDDDDDDDDDDDDD #
+D:#DDDDDDD -----D-DDDDDDDDDDDDDDDDDDDDDDDDDDDHHDDDDDDDDDDDDDDDDD ,, ,,CCTTT TTDTTDD-D--...------DTTTDDDCCCCCC,,,,OOOHDDDDDDDDDDDDDDDD -.- OOOODDDDDDDDDDDDD DDHHHDDDDDDDDD DDDDDD D #
+D:#DDDDDDD ----DDDDDDDDDDDDDDDDHHDDDDDDDDDDDDDHHH =DDDDDDD ,,, ,CCCCCCCCCCTTDDT--==-TTTTDTCCCCCC,,,,,, OOODDDDDDDDDDDDDDDD OOOOOOOOODDDDDDDD DDDDDDDDDDDDDDDDHHDDDDDDDDDDDDDDDDDDDD #
+D:# ^^ ----DDDDDDDDDDDDDDDDDDDDDDDDDDDHDDDDDDDDDDDDDDDDDDD ,, ,H,,,,,,,,CCCCCTTTDDTCCCCC,,,,,,DDDDDDDDDDDDDDOODDDDDDD DDDDDDDDDOOO--DDDDDDDDDDDDDDDDDDDDDDDDDDDDHDDDDDD DDDDD DHHDDDDDDDD #
+D:# ^^^^^DDDDDDDDDDDDDDDD DDDDDDDDDDDD DDDDDDDDDDDDDDDDD ,,,DDDDDDDDDDDDDD,,,,,CCCCCC,,,,, HDDDDDDD D OOOODDDDDDD OOO--DDDDDDDHHHDDDDDDDDDD DDDHHDDDD DDDDDDDDDDDD #
+D:# ^^^^^^^^^DDDDDDDDDDHHHHDDDDDDDDDDDHD DDDHHHDDDDDDDDDDDDDD ,,DDDDDDDDDDDDDDDD ,,,,,,DDDDDDDDDDDDDDDDDDDDDDD OOOOOOO OOO---DDDDDDDDDDDDDDDD HDDDDDDDDDDDDDD DDDDDDDDDDDDD #
+D:# ^^^^^^^^^DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD ,,DDDDDDD DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDOOOOOOO----DDDDD=== DDDDDDDDDDDDDDD DDDDDDDDDDDDDDDDDDDDDDDDDD #
+D:# ^^^^^^^^^^^^^^^DDDDDDDDD DDDDDDDDDDDDDDDDDDDD HH =DDDDDDD ,,,DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD =DDDDDDDDDDDDDDDDDDDDDDD ..------DDDDDDDDDDDDDDDDDDDDDDDDDDDD DDD DDDDDDDDDHHHDDDDDDDD #
+D:# ^^^^^^^^^^^^^^DDDDDDDDDDDDDDDD DDDDDDDDDDD DDDDDDDDDDD ,,,=DDDDDDDDDDDDDDDD HH......DDDDDDDDDDDDDDDDDDDDDDD ....-----DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDHH==DDDDDD #
+D:# ^^^^^^^^^^^^^^^DDDDDDDDDDDDDDDDDDD DDDDDDDDDDDD DDDDDDDDDDDD,,,DDDDDDD ........... ............DDDDDDD....=.......-------,,,,DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD DDDDDHHDDD #
+D:#^^^^^^^^^^^^^^^^^DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD ,,DDDDDDD .HHDDDDDDDDDDDDDDDDDDDDDDD .........--------HH----DDDDDDD,,,,,,, ,,,,,,,,,DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD==DDD #
+D:# ^^^^^^^^^^^^^DDDDDDDDDDDDDDDDDDDDD DDDDDDDD DDDDDDDDDDDDDDD ,, H .DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDHH==DDDDDDDDDDD ,,,,,,DDDDDDD,,,,,,,,,DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD #
+D:# ^^^^^^^^^^^^^^DDDDDDDDDDDDD DDDDD DD DDDDDDDDDDDDDDDDDDDDD ,, HH... HDDDDDDDDDDDDDD=DHHHDDDDDDDDD DDDDDDDDD DDD DDDDDDDDDDDDDDDDDDDDDDDDDDD,,,,,DDDDDDD ------ ---DDDDDDD #
+D:# ^^^^^^H^^^^^^^^DDDDDDD DDDDDDDDDDDDDDDDDDDD DDDDDDDDDDDDDDDDD,, .DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDHHDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD ,,,,,,,,------- -----DDDDDDD#
+D:# ^^^^^^^^^^^^^^DDDDDDDDDDDDDDDDDDDDDDDDDHHHDDDDDDDDDDDDDDDDDDDDD , ..HDDDDDDDDDDDDDD==DDDDDDDDDDDDDDDDDDDDDDDDDDHHDHDDDDDHDDDDD DDDD DDDDDDDDDDDDDDDDDDDDDDDD H---------------- #
+D:# ^^^^^^^^^^^^^^^^DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD DDDDDDDDDDDDDD ,, ..DDDDDDDDDDDDDDDDDDHHDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD DDDHHDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD---------D--------DDDDDDD#
+D:# ^^^^^^^^^^^^^^^DDDDDDDDDDDDDDDDDDDDDDD DDDDHHHD DDDDDDDDDDDDD , ..DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD DDDDDDDHDDDDDDDDDDDD====DDDDDDDDDDDDDDDDDDDDDDDDD -----------------DDDDDDD #
+D:# ^^^^^^^^^^^^^^^^DDDDDDDDDDDDDDDDDDHHHD DDDDDDDDDDDDDDDDDDDDDDDD ,,.DDDDDDDDDDDDDDDDDDD ===DDDDDD DDDDHHDDDDDDDDDDHH==DDDDDDDDDDDDHHHDDDDDDDDDDDDD DDDDDDDDDDDDD --- ---- ----DDDDDDD#
+D:# ^^^^^^^^^^^^^DDDDDDDDDDDDDDDDDDDDDDDD DDDDDDDDDDDDDDDDDDDDDDDDDD ,.DDDDDDDDDDDD==DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD DDD===DDDDDDDDDDDDDDDDDDDD - -- --DDD==DD #
+D:# ^^^^^^^^^^^^^^DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD DDDDDD .DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDHHDD==DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDHHHDDDDDDDDDDDDDDDDDDDDDDDDDDHHHDDD #
+D:# ^^^^^^^^^^^^^^ HDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD .DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDHHHHHDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD #
+D:######################################################################################################################################################################################################
+
+
+############### Starting positions ###############
+
+# Standard starting position for normal races
+?:[AND [EQU $LEAVING_QUEST 0] [NOT [EQU $RACE Vampire] ] ]
+P:33:131
+
+# Standard starting position for vampires (at the dungeon entrance)
+?:[AND [EQU $LEAVING_QUEST 0] [EQU $RACE Vampire] ]
+P:31:150
diff --git a/lib/mods/theme/edit/t_d_cerin.txt b/lib/mods/theme/edit/t_d_cerin.txt
new file mode 100644
index 00000000..02d9ca05
--- /dev/null
+++ b/lib/mods/theme/edit/t_d_cerin.txt
@@ -0,0 +1,75 @@
+# File: t_d_cerin.txt
+
+# Cerin Amroth map and destruction by furiosity <furiosity@zionmainframe.net>
+
+# NB! This file assumes usage of the following files from the 'theme' module:
+# f_info.txt and t_pref.txt
+# Please download the module and refer to the files for the terrain feature definitions http://modules.t-o-m-e.net/
+# Don't forget to modify the maximum number of terrain features, etc. in misc.txt as well.
+
+D:######################################################################################################################################################################################################
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHNNNNNNNNNHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHNNDDDDDDDNNHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHNNDD^^^^^DDNNHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHNNDD^DDDDD^DDNNHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHNNDD^DD^^^DD^DDNNHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHNNDD^DD^HHH^DD^DDNNHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHNNDD^DD^HHHHH^DD^DDNNHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHENDD^DD^HCH=HCH^DD^DDNEHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHENDD^DD^HH===HH^DD^DDNEHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHENDD^DD^HCH=HCH^DD^DDNEHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHNNDD^DD^HHHHH^DD^DDNNHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHNNDD^DD^HHH^DD^DDNNHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHNNDD^DDD@DDD^DDNNHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHNNDD^DD@DD^DDNNHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHNNDD^D@D^DDNNHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHNNDDD@DDDNNHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@@@@@@HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:###################################################################################################################################################################################################### \ No newline at end of file
diff --git a/lib/mods/theme/edit/t_d_dale.txt b/lib/mods/theme/edit/t_d_dale.txt
new file mode 100644
index 00000000..1162c294
--- /dev/null
+++ b/lib/mods/theme/edit/t_d_dale.txt
@@ -0,0 +1,75 @@
+# File: t_d_dale.txt
+
+# Dale map and destruction by furiosity <furiosity@zionmainframe.net>
+
+# NB! This file assumes usage of the following files from the 'theme' module:
+# f_info.txt and t_pref.txt
+# Please download the module and refer to the files for the terrain feature definitions http://modules.t-o-m-e.net/
+# Don't forget to modify the maximum number of terrain features, etc. in misc.txt as well.
+
+D:######################################################################################################################################################################################################
+D:# #
+D:# #
+D:# #
+D:# #
+D:# #
+D:# #
+D:# #
+D:# #
+D:# #
+D:# #
+D:# #
+D:# #
+D:# #
+D:# #
+D:# #
+D:# @@@@@@@@@@@@@@@@ #
+D:# @@%%%%%%%%%%%%%%%%@@ #
+D:# @@@%%%%%%%%%%%%%%%%%%%%@ #
+D:# @%%%%%%%%%%%%%%%%%%%%%%%%@ #
+D:# @%%%%%%%%%%%%%%%%%%%%%%%@$$$$$$$$$$$$$$$ #
+D:# @@@@%%%%%%%%%%%%%%%%%@@@HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH #
+D:# @%%%%%%%%%%%@@@@@@HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH #
+D:# @%@@@@@@@@@@@@HHStSSSSSHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHDDDHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH @@@@@@ #
+D:# @%#HHHHHHHHHHHHHsssssssHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHDDDDDHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH @@%%%%%%@ #
+D:# @%#HHHHHHHHHHHHH#######HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHDDDHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH @@%%%%%%%%%%@@@ #
+D:# @%#HHHHHHHHHHHHH###@###HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH @%%%%%%%%%%%%%%%@@ #
+D:# @%#HHHHHHHHHHH$HHHH@HHHH$HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@%%%%%%%%%%%%%%%%@ #
+D:# ##HHHHHHHHHHHHHHHH@HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH$HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH==================@ #
+D:#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@,,,,,,,,,,,,,,,,,,@@@@@@@@@@@@@@@@@@@@@#
+D:# #HHHHHHHHHHHHHHHHH@HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@HHHHSSSDSHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@==================@ #
+D:# #HHHHHHHHHHHHHHHHHH@HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@HEHsssssHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@%%%%%%%%%%%%%%%%@@@ #
+D:# #HHHHHHHHHHHHHHHHHHH@HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@HH#H###HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@@@%%%%%%%%%%%%%%@ #
+D:# #HHHHHHHHHHHHHHHHHHHH@HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@H##@##HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@@@%%%%%%%%%@@ #
+D:# #HHHHHHHHHHHHHHHHHHHHH@HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@@@@HHH$HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@@@@@@@@@@ #
+D:# #HHHHHHHHHHHHHHHHHHHHHH@HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@HHHH@HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH #
+D:# #HHHHHHHHHHHHHHHHHHHHHHH@HHHHHHHHHHHHHHHHHSSSHHHHHHHHHHHHHHH@HHHHHH@HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH #
+D:# #HHHHHHHHHHHHHHHHHHHHHHHH@HHHHHHHHHHHHHHsssssHHHHHHHHHHHHHH@HHHHHHHH@HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH #
+D:# #HHHHHHHHHHHHHHHHHHHHHHHHH@HHHHHHHHH$########HHHHHHHHHHHHH@HHHHHHHHHH@HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH #
+D:# $HHHHHHHHHHHHHHHHHHHHHHHHHH@HHHHHHHH$########HHHHHHHHHHHH@HHHHHHHHHHHH@HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH #
+D:# $HHHHHHHHHHHHHHHHHHHHHHHHHHH@HHHHHH@HHHHHHHHHHHHHHH,@@@@@HHHHHHHHHHHHHH@HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH #
+D:# #HHHHHHHHHHHHHHHHHHHHHHHHHHHH@@@@@@@HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH #
+D:# #HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH$HHHHHHHHHHHHHHHHHHHHHHHHHHH@HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH #
+D:# #HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH #
+D:# #HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@$HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH #
+D:#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#
+D:# #HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH$H@HHHHHHHHHHHHHHUUUUUUYUUUUHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:# #HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@HHHHHHHHHHHHHXXXXXXXXXXXHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:# #HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@HHHHHHHHHHHH===========HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:# #HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@$HHHHHHHHHH=====@=====HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:# #HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH$@@@@@@@@@@@@@@@@@HHHHHH$HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:# HH#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@@@@@HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:# HHHH#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@%%%%%@HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:# HHHHHD#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@%%%%%%%@HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:# HHHHHHHDD#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@%%%%%%%%%@HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:# HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@%%%%%%%%%%%@HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:# HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@%%%%%%%%%@HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:# HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@%%%%%%%@HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:# HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@%%%%%@HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:# HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@@@@@HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:# HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:# HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:# HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:# HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:# HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:###################################################################################################################################################################################################### \ No newline at end of file
diff --git a/lib/mods/theme/edit/t_d_edoras.txt b/lib/mods/theme/edit/t_d_edoras.txt
new file mode 100644
index 00000000..17d7abbd
--- /dev/null
+++ b/lib/mods/theme/edit/t_d_edoras.txt
@@ -0,0 +1,75 @@
+# File: t_d_edoras.txt
+
+# Edoras map and destruction by furiosity <furiosity@zionmainframe.net>
+
+# NB! This file assumes usage of the following files from the 'theme' module:
+# f_info.txt and t_pref.txt
+# Please download the module and refer to the files for the terrain feature definitions http://modules.t-o-m-e.net/
+# Don't forget to modify the maximum number of terrain features, etc. in misc.txt as well.
+
+D:######################################################################################################################################################################################################
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#####,,,,,,,#####HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH###########,,,,,,,,,,,,,,,#########HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH######,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#######HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#####,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#####HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH###########,,,,,,,#####$$################################HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#####HHHHHHH,,,HHHH,,HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH###HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH###HHHHHHHHHH,,,HHHHHH,,HHHHHHHHHHHHHHHHHHHH,,,,,,,,,,,,,,,,,,H###HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH####HHHHHHHHHH,,,HHHHHHHHH,,HHHHHHHHHHHHHHHHHHH,################,HHH###HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH###HHHHHHHHHHH,,,HHHHHHHHHH,,,,,,,,,,,,,,,,HHHHHH,################,HHHHH###HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH###HHHHHHHHHHH,,,,,HHHHHHHHHH,#########,HHHH,,HHHHH,################,HHHHHHH###HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH###HHHHHHHHHHH,,,HH,,HHHHHHHHHH,#########,HHHHH,,HHHH,################,HHHHHHHHH###HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH###HHHHHHHHHHH,,,HHHH,,HHHHHHHHHH,#########,HHHHHH,,,,,,,,,,,,,,,,,,,,,,,HHHHHHHHHHH###HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH###HHHHHHHHHHH,,,HHHHH,,HHHHHHHHHH,#########,HHHHHHHHHHHHHHHHHHHHHHHHH,,HH,,HH######HH###HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH###HHHHHHHHHHH,,,HHHHHH,,HHHHHHHHHH,,,,,,,,,,,HHHHHHHHHHHHHHHHHHHHHHHHHH,,HH,,H######HHHH###HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH###HHHHHHHHHHH,,,HH,,,,,,,,,,,,,,,,,HHHHHHHHHHHHHHHHHHHHHHHHHHHHH######,,,,,HH,,######HHHHHH##HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH###HHHHHHHHHHH,,,HHH,$#######$,HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH######HHHH,,HH,,HHHHHHHHHHHH##HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH###HHHHHHHHHHH,,,HHHH,#$#####$$,HHHHHHHHHHH####################HHHH######HHHHH,,HH,,HHHH######HH##HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH###HHHHHHHHHHH,,,HHHHH,####$####,HHHHHHHHH####HHH,,,,,,,,,,,,,####HHHHHHHHHHHHHH,,HH,,,,,######HHH##HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH###HHHHHHHHHHH,,,HHHHHH,########$,HHHHHHH####HHHH,,HHHHHHHHHHH,,,,###HHHHHH######,,,HH,,HH######HHHH##HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH###HHHHHHHHHHH,,,HHHHHHH,,,,,,,,,,,HHHHH####HHHHHH,,HHHHHHHHHHHHH,,,,###HHHH######HH,,HH,,HHHHHHHHHHH##HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH###HHHHHHHHHHH,,,HHHHHHHH,HHHHHHHHHHHHHH###HHHHHHHH,,HHHHHHHHHHHHHHH,,,,###HH######HHH,,HH,,,,######HHH##HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH###HHHHHHHHHHH,,,HHHHHHHHHH,HHHHHHHHHHH###HHHHHHHHHH,,HHHHHHHHHHHHHHHHH,,,,##HHHHHHHHHHH,,HH,,H######HHHH##HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH##HHHHHHHHHHH,,,H,,,,,,,,,,,,,HHHHHHHH##HHHHHHHHHHHH,,HHHHHHHHHHHHHHHHHHH,,,##HHHH######,,,HH,,######HHHH##HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH##HHHHHHHHHHH,,,HH,$$#########,HHHHHH###HHHHHHHHHHHHH,,HHHHHHHHHHHHHHHHHHHHH,,##HHH######HH,,,,,,,HHHHHHHHH##HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH##HHHHHHHHHH,,,,,,,$$#########,HHHHH##HHHHHHHHHHHHHHH,,HHHHHHHHHHHHHHHHHHHHHH,,##HH######HHH######HHHHHHHHH##HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH##HHHHHHHHHH,,,,,,,##$########,HHHH###HHHHHHHHHHHHHHH,,#########HHHHHHHHHHHHHH,,##HHHHHHHHHH######HHHHHHHHH##HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH##HHHHHHHHHH,,,HHH,###########,HHH###HHHHHHHHHHHHHHHH,,HHHHH######HHHHHHHHHHHHH,,##HHHHHHHHH######HHHHHHHHHH##HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH##HHHHHHHHH,,,,HHH,,,,,,,,,,,,,HHH##HHHHHHHHHHHHHHHHH,,HHHHHHHHH####HHHHHHHHHHHH,,##HHHHHHHHHHHHHHHHHHHHHHHH##HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH###########CCCC########$############HHHHHHHHHHHHHHHHH,,HHHHHHHHHHH###HHHHHHHHHHH,,###############$############HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH###########CCCC########$############HHHHHHHHHHHHHH$$$,,###HHHHHHHHH###HHHHHHHHHH,,##############$#############HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH###########CCCC#########$###########HHHHHHHHHHHHHH#$###$##HHHHHHHHHH##HHHHHHHHHHH,,#############$#############HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH###########CCCC##########$###$######HHHHHHHHHHHHHH#####$$#HHHHHHHHHH##HHHHHHHHHHH,,##############$############HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH###########CCCC###########$##$######HHHHHHHHHHHHHH########HHHHHHHHHH##HHHHHHHHHHHH,,#############$############HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH###########CCCC####$#######$########HHHHHHHHHHHHHH###$####HHHHHHHHHH##HHHHHHHHHHHH,,##############$#####$#####HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH###########CCCC#############$########HHHHHHHHHHHHH########HHHHHHHHHH##H#######HHHH,,##############$###########HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH###########CCCC##############$#######HHHHHHHHHHHHHHHHHHHHHHHHHHHHHH##HH#######,,,,,,#############$$$#$########HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH##HHHHHHHH,,,,,,,,,HHHHHHHHHHHHHHHH###HHHHHHHHHHHHHHHHHHHHHHHHHHH###HH#######,,,,,,##HHHHHHHHHHHHHHHHHHHHHH##HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH##HHHHHHHHHHHHH##,,HHHHHH#######HHHH###HHHHHHHHHHHHHHHHHHHHHHHHH###HHH#######HHH,,,##HHHHHHHHHHHHHHHHHHHHHH##HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH##HHHHHHHHHHHHH##,,,,,,,,#######HHHHH###HHHHHHHHHHHHHHHHHHHHHHH###HHHHHHHHHHHHHHH,,##HHHHHHHHHHHHHHHHHHHHHH##HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH##HHHHHHHHHHHHHH##,,,,,,,#######HHHHHH###HHHHHHHHHHHHHHHHHHHH####HHHHHHHHHHHHHHHH,,##HHHHHHHHHHHHHHHHHHHHHH##HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH##HHHHHHHHHHHHH##,HHHHHH#######HHHHHHHH###HHHHHHHHHHHHHHHH####HHH$######HHHHHHH,,,##HHHHHHHHHHHHHHHHHHHHH##HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH##HHHHHHHHHHHHH##,,HHHHHHHHHHHHHHHHHHHHHH###################HHHHH$######HHHHHH,,,##HHHHHHHHHHHHHHHHHHHHHH##HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH##HHHHHHHHHHHHH##,,HHHHHHHHHHHHHHHHHHHHHHHHH###########HHHHHHHHH$######HHHHH,,,##HHHHHHHHHHHHHHHHHHHHHH##HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH##HHHHHHHHHHHHHH##,,HHHHHHHHHHHH####$$$HHHHHHHHHHHHHHHHH#######HHHH,,,,HHHH,,,##HHHHHHHHHHHHHHHHHHHHHH##HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH##HHHHHHHHHHHHHH##,,,HHHHHHHHHH#######HHHHHHHHHHHHHHHHH#######HHHHHHH,,H,,,,##HHHHHHHHHHHHHHHHHHHHHH##HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH##HHHHHHHHHHHHHH##,,,,HHHHHHHH#######HHHHHHHHHHHHHHHHH#######HHHHHHHH,,,,,##HHHHHHHHHHHHHHHHHHHHHH##HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH###HHHHHHHHHHHHHH##,,,,HHHHHHHHHH,HHHHHHHHH#######HHHHHHH,,,,,HHHHHHH,,,,##HHHHHHHHHHHHHHHHHHHHHH##HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH###HHHHHHHHHHHHHH###,,,,HHHHHHHH,HHHHHHHHH###$#$$HHHHHHHHHHH,,HHHHH,,,,##HHHHHHHHHHHHHHHHHHHHHH##HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH###HHHHHHHHHHHHHHH###,,,,HHHHHH,HHHHHHHHH#######HHHHHHHHHHHH,,HH,,,,###HHHHHHHHHHHHHHHHHHHHHH##HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH###HHHHHHHHHHHHHHHH####,,,,HHH,HHHHHHHHHHHH,HHHHHHHHHHHHHHHH,,,,,###HHHHHHHHHHHHHHHHHHHHHHH##HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH###HHHHHHHHHHHHHHHHHH###,,,,,,,HHHHHHHHHHH,HHHHHHHHHHHH,,,,,,####HHHHHHHHHHHHHHHHHHHHHHHH##HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH###HHHHHHHHHHHHHHHHHHH######,,,,,,,,,,,,,,,,,,,,,,,,,,,,#####HHHHHHHHHHHHHHHHHHHHHHHHHH##HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH##HHH==============HHHHHH######,,,,,,,,,,,,,,,,,,,######HHHHHH=================HHHH###HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH###HHH=================HHHH###########,,,,,#########HHHHHH===================HHHH###HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH###HHH==================HHHHHHHHHHHH,,,,,HHHHHHHHHHH======================HHH###HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH###HHH================================================================HHH###HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH###HHHH===========================================================HHH###HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH####HHH=====================================================HHHHH###HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH###HHHH==============================================HHHHHHH###HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH####HHHHH=======================================HHHHHH#####HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#####HHHHHHH==========================HHHHHHHHHH#####HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH######HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#########HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH###########HHHHHHHHHHHHHHHH############HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH########################HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:###################################################################################################################################################################################################### \ No newline at end of file
diff --git a/lib/mods/theme/edit/t_d_esga.txt b/lib/mods/theme/edit/t_d_esga.txt
new file mode 100644
index 00000000..319eff22
--- /dev/null
+++ b/lib/mods/theme/edit/t_d_esga.txt
@@ -0,0 +1,75 @@
+# File: t_d_esga.txt
+
+# Esgorath map and destruction by furiosity <furiosity@zionmainframe.net>
+
+# NB! This file assumes usage of the following files from the 'theme' module:
+# f_info.txt and t_pref.txt
+# Please download the module and refer to the files for the terrain feature definitions http://modules.t-o-m-e.net/
+# Don't forget to modify the maximum number of terrain features, etc. in misc.txt as well.
+
+D:######################################################################################################################################################################################################
+D:#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#
+D:#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#
+D:#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%=%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#
+D:#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%=%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#
+D:#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%=%%%%==%%%%=%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#
+D:#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%=%%%%===,,=%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#
+D:#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%=%%%%===,,,,,,=%%%%=%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#
+D:#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%=%%%%===,,,,SSS,,,=%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#
+D:#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%=%%%%===,,,,,,ssss,,,,=%%%%=%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#
+D:#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%=%%%%===,,,,,,,,$#@##,,,,,=%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#
+D:#%%%%%%%%%%%%%%%%%%%%%%%%%%%=%%%%===@,,,,,,,,,,,,@,,,,,,,,=%%%%=%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#
+D:#%%%%%%%%%%%%%%%%%%%%%%%%=%%%%===,,,,@,,,##@#$,,,@,,,,,,,,,=%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#
+D:#%%%%%%%%%%%%%%%%%%%%%=%%%%===,,,,,,,,@@@@@@,,,,,@,,,,,,,,,,=%%%%=%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#
+D:#%%%%%%%%%%%%%%%%%%=%%%%===,,,,,,,,,,S,S,,,@,,,,,@,,##@##,,,,=%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#
+D:#%%%%%%%%%%%%%%%=%%%%===,,,,,,,t,,,sssss,,,@,,,,,@@@@@@@@,,,,,=%%%%=%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#
+D:#%%%%%%%%%%%%=%%%%===,,,,SSS,S,,,,,##5##,,,@,,,,,,,,,,,,@,,,,,,=%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#
+D:#%%%%%%%%%=%%%%===,,,,,,,sssss,,,,,,,@,,,,,@,,,,,,,,,,,,@,,,,,,,=%%%%=%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#
+D:#%%%%%%=%%%%===,,,,,,,,,,##@##,,,,,,,@,,,,@,,,,,,,,,,,,,@,,SStSS,=%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#
+D:#%%%%%%%%%%%=,,,,,,,,,,,,,,@,,,,,,,,,@,,,@,,SSSStSSS,SS,@,,sssss,,=%%%%=%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#
+D:#%%%%%%%=%%%%=,,,,$#@$$,,,,@,,,,,,,,,@,,@,,,$ssssss,sss,@,,$#,##,,,=%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#
+D:#%%%%%%%%%%%%%=,,,,,@@@@@@@@@@@@@@@@@@,@,,,,$$###@$$###,@,,,,@,,,,,,=%%%%=%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#
+D:#%%%%%%%%%=%%%%=,,,,,,,,,,,@,,,,,,,,,,@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@=%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#
+D:#%%%%%%%%%%%%%%%=,,,,,,,,,,@,,,,,,,,,,,,,,,,,,,,,,,,,,,,,@,,,,,,,,,,,,=%%%%=%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#
+D:#%%%%%%%%%%%=%%%%=,,,,,,,,,@,,,,StS,,,,,,,=========,,,,,,,@,,,,,,,,,,,,=%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#
+D:#%%%%%%%%%%%%%%%%%=,#$@$$,,@,,,ssss,,,,,==%%%%%%%%==,,,,,,,@,,,,,,,,,,,,=%%%%=%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#
+D:#%%%%%%%%%%%%%=%%%%=,,@@@@@@,,$#,##,,,,=%%%%%%%%%%%%=,,,,,,,@,#$@$#,,,,,,=%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#
+D:#%%%%%%%%%%%%%%%%%%%=,,,,,,,@,,,@,,,,,=%%%%%%%%%%%%%%=,,,,,,,@,,@,,,,,,,,,=%%%%=%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#
+D:#%%%%%%%%%%%%%%%=%%%%=,,,,,,,@@@@,,,,=%%%%%%%%%%%%%%%%=,,,,,,,@,@,,SS,,,,,,=%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#
+D:#%%%%%%%%%%%%%%%%%%%%%=,,,,,,,@,,,,,,=%%%%%%%%%%%%%%%%%=,,,,,,,@,,,sss,,,,,,=%%%%=%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#
+D:#%%%%%%%%%%%%%%%%%=%%%%=,,,,,,,@,,,,,=%%%%%%%%%%%%%%%%%%=,,,,,,,@,,$#@##,,,,,=%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#
+D:#%%%%%%%%%%%%%%%%%%%%%%%=,,,,,,,@,,,,,=%%%%%%%%%%%%%%%%%=,,,,,,,,@,,,@,,,,,,,,=%%%%=%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#
+D:#%%%%%%%%%%%%%%%%%%%=%%%%=,,,,,,,@,,,,,=%%%%%%%%%%%%%%%=@,,,,,,,,,@,,@,,,,,,,,,=%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#
+D:#%%%%%%%%%%%%%%%%%%%%%%%%%========@,,,,,=%%%%%%%%%%%%%=,,@,,,,,,,,,@,@,,,,,,,,,,=%%%%=%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#
+D:#%%%%%%%%%%%%%%%%%%%%%=%%%%=@@@@@@@@,,,,,=%%%%%%%%%%=,,,,,@,,,,,,,,,@,,,$#@##,,,,=%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#
+D:#%%%%%%%%%%%%%%%%%%%%%%%%%%%========@,,,,,=%%%%%%%==,,,,,,,@,,,,,,,,,@,,,,@,,,,,,,=%%%%=%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#
+D:#%%%%%%%%%%%%%%%%%%%%%%%=%%%%=,,,,,,,@,,,,,====CCC==,,,,,,S,,StSSSS,,,@,,,@,,,,,,,,=%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#
+D:#H%%%%%%%%%%%%%%%%%%%%%%%%%%%%=,,,,,,,@,,,,,,,==CCC==,,,,,s,sssssss,,,,@,@,,,,,,===%%%%=%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#
+D:#HH%%%%%%%%%%%%%%%%%%%%%%%=%%%%=,,,,,,,@,,,,,,,==CCC==,,,,#$,#@$$##,,@@@@,,,,===%%%%=%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#
+D:#HH%%%%%%%%%%%%%%%%%%%%%%%%%%%%%=,,,,,,,@,,,,,,,==CCC==,,,,,$$,@@@@@@@,,,,===%%%%=%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#
+D:#HHH%%%%%%%%%%%%%%%%%%%%%%%%=%%%%=,,,,,,,@,,,,,,,==CCC==,,,,,,,,@,,,,,,===%%%%=%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#
+D:#HHH%%%%%%%%%%%%%%%%%%%%%%%%%%%%%=,,,,,,,,@@@,,,,,==CCC==,,,,,,,,@,,===%%%%=%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#
+D:#HHHH%%%%%%%%%%%%%%%%%%%%%%%%%%%==,@@@@@@@,,,@,,,,,==CCC==,,,,,,,===%%%%=%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#
+D:#HHHHH%%%%%%%%%%%%%%%%%%%%%%%%==@@@@,,,,@,tSSS@,,,,,==CCC==,,,===%%%%=%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#
+D:#HHHHH%%%%%%%%%%%%%%%%%%%%%%==@@@@=====,@sssss@,,,,,,==CCC====%%%%=%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#
+D:#HHHHHH%%%%%%%%%%%%%%%%%%%==@@@@==%%%==,@#####@,,,,,,,==CCC%%%%=%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#
+D:#HHHHHHH%%%%%%%%%%%%%%%==@@@@==%%%=%%%==@##,##@,,,,,,===%%%%=%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#
+D:#HHHHHHH%%%%%%%%%%%%==@@@@==%%%%%%%%%%%==@@@@@@,,,===%%%%=%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#
+D:#HHHHHHH%%%%%%%%%%==@@@@==%%%%%%%%%%=%%%==,,,,,===%%%%=%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#
+D:#HHHHHHHH%%%%%%==@@@@==%%%%%%%%%%%%%%%%%%==,===%%%%=%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#
+D:#HHHHHHHH%%%==@@@@==%%%%%%%%%%%%%%%%%%=%%%==%%%%=%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#
+D:#HHHHHHHH==@@@@@==%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#
+D:#HHHHHHHHHH@@==%%%%%%%%%%%%%%%%%%%%%%%%%%%%=%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#
+D:#HHHHHHHHHH==%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#
+D:#HHHHSSSSHH%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#
+D:#HHHHssssHHH%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#
+D:#HHH$#@##HHHH%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#
+D:#HHHHHHHHHHHHH%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#
+D:#HHHHHHHHHHHHHH%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#
+D:#HHHHHHHHHHHHHHH%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#
+D:#HHHHHHHHHHHHHHHH%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#
+D:#HHHHHHHHHHHHHHHHHH%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#
+D:#HHHHHHHHHHHHHHHHHHH%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:###################################################################################################################################################################################################### \ No newline at end of file
diff --git a/lib/mods/theme/edit/t_d_gond.txt b/lib/mods/theme/edit/t_d_gond.txt
new file mode 100644
index 00000000..18bb7c10
--- /dev/null
+++ b/lib/mods/theme/edit/t_d_gond.txt
@@ -0,0 +1,100 @@
+# File: t_d_gond.txt
+
+# Destroyed Gondolin: Your failure has left the city in ruins.
+# Created by Mynstral (mynstral@thehelm.com)
+
+# Decoration = Straight Road (B)
+F:":66:3
+
+# Decoration = Straight Road (W)
+F:$:70:3
+
+
+# Town Layout
+
+D:######################################^^^^^^^^^^^^$ ####
+D:######################################^^^^^^^^^^^^$ ####
+D:######################################^^^^^^^^^^^^$ ####
+D:######################################^^^^^^^^^^^^$ ####
+D:######################################^^^^^^^^^^^^$ ####
+D:####################################^^^^^^^^^^^$ ####
+D:##################################^^^^^^^ $ $ $ ###
+D:#################################^^^^^^^^$ C C $ CC$ CC CC C CC$C C$ $ ###
+D:################################^^^$^^^^^^^ C $C$C$#$######$#$#####$#####CC$ CC$ $ $ ###
+D:###############################^^^^^^^^^^^^ C$$$ C# ###### DD D ####$D$D D D ###$###CC C $ ^^^^^ ###
+D:##############################^^^^^^$^^^$ C $####$##$D DDD $.$## $.DD DDD#$$#####C $ $^^^^^^^ $ ###
+D:#############################^^^^^^^^^^ # $##########D $######### .D##########$ $ ^^^^^^^^^^^^ ###
+D:############################^^$$^^ $ ############ ..$###########$ ..D############C $ ^^^^^^^^^^^^^^$ ###
+D:############################ C #############D$ .###%%#####%%### .D#############C$ ^^^^^^^^^^^^^ ###
+D:########################### $$ $ #############DD .#%%%%#$###%%$%# $.$$############# $ ^^^^^^^^^^^ ###
+D:########################### $ . $ $$ C#$###########D$ .%%###$###%% .D$############C $ $ ^^^^^^^ $ $ ###
+D:########################## $ ##### $$ $ #### $ $ C######%%%%### ..%## $##$ ..D####%%%%#####C$ ####### # $ ^^^^ ###
+D:########################## $ #$##### $ ##$## ####### C#$####D DD%%#D$ # .$# D$$%D DD######C $## ##$#$$ ###
+D:####$#################$#%# ### ###$ ### $ ####### ###### DD%#$ D#%DD D####$ ##$#### ###
+D:####%$#%###$#$#####$#$%%%# $####$### #$##$ ####### $######D $ $$..$######$ ###
+D:#####%$##%#%##$##%$%%%#%## #####$### # ### #########$ ######D $ .. DD DD ..$$D######C$ $ ###
+D:#####$%$%$%%%##$%$%%%#$$## $######$# $ ##$ $##$#### $$ $ $C#######$% ..DD D####### DD ..%%#$##### C # $ ###
+D:######%##%%#%%#%%%%%#$#### . $ $ $# $# #######$## D ##### $###### DD ########## $ ## ## ### $ $$ ###
+D:######%%%#%%%$%$%$%%$%#### .. $ C$####### .. D###### $# # ##### .. ########$ #$#######$###$#### ###
+D:#######$%%%%$%%%$%%$#%%### $ #####D DD .. D###$.$#$# #$## .###D ..DDD$#####C$ $ #### # #######$ ###
+D:########$%%$%%$%%%$#%###### # ###### $ $## #####$ C# D ..D## ..## $$ ..# $ .. D DD# $ $$#$#######$## ###
+D:#########$#%%%%$%%########## #$#$####$ ############ $#D $ .$#$ ## $ ..$ $.. ..## D $# # ..D#C $ $ ###$### $## ###
+D:##########$#################### # ####### ############ $ #D $ $####$ D## $# $ ..# @ @ ## .#$##$ $ $D# ## #$#$#$## @ @ ###
+D:#### $#################### ####$# ##$ #####$####### $C#D # #$ $. D## @@@ @ .##D ..$## $ .D #$C #### $ @@@@@@ ###
+D:#### ####$$$C##%#LL#""## #######$ ## $##$#$ ## C### $ ###$ . D ### $ @%@@..###D D .#### ###$ @ @ @@@@%%%%@@@ ###
+D:#### $####$##$C# $#LL#""# # . $ $ ###D $##$ D###.### .#####%@ @###.## $###$ $### $ @@ @@%%%%%%%@ ###
+D:##### ################### . $ C### ## #$ D## ..##.$##%$%%#..## ..# D ## $ D###C @@@@%%%%%%%%%@ ###
+D:# $#### D# .#..#%%#$%#..# .#D $## .. @%%%%%%%%%%%%@@ ###
+D:#.. ..#%#%#%# $ @%%%%%%%%%%%%@ @ ###
+D:# .##$# D# .#.$#%%#%$#..# .#D ####$ .. @@%%%%%%%%%%%@@ @ $ ###
+D:############ ########## # . . . $###D ..#$###$ ## ..##..##%%%##..## ..## #$ # $ $##C @%%%%%%%%%%@@@@ ^^###
+D:#### #### K# C# #LL# "# $ . $ . . ### ##$# DD###.### .##### $###.###D $### . D#$# @@@%%%%%%%@@@@@@ $ ^^###
+D:#### ### K CC %%# L# "## ##### # $ ## #### # # #### C$##D .. DD### ..###DD .###$ DD####$C @@%%%%%@@ @ @ ^^^^###
+D:#### ####KK#CC#%%#L # "### ## ###### ###$ ###$# $# ##### $#DD D## $ .##D ..$# # D #####C$ @@%%%%@ $ $^^^^^^###
+D:######## ###################### ######### $####$#$### # ## $# C$D ..D## $#$ .$$ ## .#$##$ .D##### $ DD @@@@@@@ ^^^^^^^###
+D:####### #####$$$$#$#### #### ### ###$# $ ## ########$# # # # %% %% .DD## $ $.##$$ ## $$## D #$# $###### DD DD DD DD DD ^^^^^^^^^###
+D:########$$$$$#$$$$$##### ## $##$###### ##$# ### $### $## $ C$$..%%# $ #$% D####.#########$#$####D ..######C D DD DDD D D DD DDD ^^^^^^^^^###
+D:######$$$#$$$$#$#$##$#$### $ C D..%#$ .###% . DD#################D D .D$#####$ DD DDD########DDD DDDD ^^^^^^^###
+D:#######$#$##$$$#$#$$$$#### C#D .%###.$# $ D D### #########DD D #$###$ DDD###DD D D### D DD $ ^^^^^^###
+D:######$$$$$$#$#$#$$$$$$$# $ $ $$ $C##D.%##$ # $% ..D D ####### D D ### DDD##DD D ##DDDDDD ^^^^###
+D:#####$$$$#$$$#$$$$$$$$$### ###### # $$### $###$$ $C#D.%%#####%% $ $$ DD#C DD#DD D DD## D DD $ ^^^^###
+D:#####$$$#$$$#####$$$$$$### ## ####$ $ #$## ##### ##$ $ ..%%###%%$ ..D D$ $DDD$ $ $ .DD $ $ D D$ $. D$ $ D ##D DDD ^^^^###
+D:####$$$###$########$#$$$$# ###$#####$ ## ####### # C %%%$% .DD$######$#$D$D $DDD#$###$#$#DDD $$ $ $ D#DD D DD##D ^^^^^^###
+D:###$$#################$### # ## ## # ###########$# C$DD .DD###%%%%%%####$ . $#$##%%%%%%### D .DD#C $ DDD##DDD D D##DD D ^^^^^^^###
+D:#######################$## $#### #$ ############# $# .D##%%% .%$%###DDD###%%% .%%%#$D$ .D#$ DDDD D D D###DD D $ ^^^^^^^###
+D:########################### $ # $ $ C$# .D#%% ..%%#######%% $.%%#D D#$ DD D DD# ## ## DDD DD ^^^^^###
+D:########################### $ $# C#D $ ..####### $ ..DD#$ DD D DDD DDD DD D ^^^^###
+D:############################ ##$ #$ $#D ..D#%% $ $..%%#######%$ $ ..%%#D .. D$# $ DDDD DD D D $ $ ^^^^^^###
+D:############################ ######### C ##DD .D##%%% .%%%#########%%% $.%%%##D . $## DDD D DD D ^^^^^^^^^###
+D:############################# #####$# $#D DD DD ##%%%%%%## #### #####%%%%%%###D DD D##$C ^^^^^^^^^^^^###
+D:############################## $ ###$ #### DD DDD ##### # ######$ # ########DDDD $D$D ###$C $ ^^^^^^^^^^^^^^###
+D:############################### ### $$ C$ $#$#$##DDD $D$ DD##############D D$$D D D## #$#CC$$ $^^^^^^^^^^^^^^^^^###
+D:################################ $ # CC $ ##$# #$#####$###$#$#$#####$###$###$C$C C$ $ ^^^^^^^^^^^^^^^^^###
+D:################################# $ $ $ # $ C$C$ CCC$CC C$$C$CCC C $ #C C C$ $C C $ ^^^^^^^^^^^^^^^^^^####
+D:################################## #### $ $ $ # $ ^^^^^^^^^^^^^^^^^^^^^####
+D:#################################### $ ##### $ ^^^^^^^^^^^^^^^^^^^######
+D:###################################### #### ######## $ ^^^^^^^^^^^^^^^^^^########
+D:######################################################################################################################################################################################################
+D:######################################################################################################################################################################################################
+D:######################################################################################################################################################################################################
+D:######################################################################################################################################################################################################
+
+# Default starting position
+?:[EQU $LEAVING_QUEST 0]
+P:33:50
+
+# Starting position when coming from quest 19
+?:[EQU $LEAVING_QUEST 19]
+P:51:190
+
+# Starting position when coming from quest 20
+?:[EQU $LEAVING_QUEST 20]
+P:33:13
+
+# Starting position when coming from quest 21
+?:[EQU $LEAVING_QUEST 21]
+P:27:168
+
+# Starting position when coming from quest 22
+?:[EQU $LEAVING_QUEST 22]
+P:6:42
diff --git a/lib/mods/theme/edit/t_d_helm.txt b/lib/mods/theme/edit/t_d_helm.txt
new file mode 100644
index 00000000..ef922a16
--- /dev/null
+++ b/lib/mods/theme/edit/t_d_helm.txt
@@ -0,0 +1,75 @@
+# File: t_d_helm.txt
+
+# Helm's Deep map and destruction by furiosity <furiosity@zionmainframe.net>
+
+# NB! This file assumes usage of the following files from the 'theme' module:
+# f_info.txt and t_pref.txt
+# Please download the module and refer to the files for the terrain feature definitions http://modules.t-o-m-e.net/
+# Don't forget to modify the maximum number of terrain features, etc. in misc.txt as well.
+
+D:######################################################################################################################################################################################################
+D:#DD,,,,DDDDDDDDDDDDDDDDDDDDDDDD^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#DDD,,,,DDDDDDDDDDDDDDDDDDDDDDDHHHHHHHHHH^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#DDD,,,,DDDDDDDDDDDDDDDDDDDDDDHHHHHHHHHHHHHH^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#@DDDD,,,,DDDDDDDDDDDDDDDDDDDDHHHHHHHHHHHHHHHHHHH^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#%@DDD,,,,DDDDDDDDDDDDDDDDDDDHHHHHHHHHHHHHHHHHHHHHHH^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#%%@DDDD,,,,DDDDDDDDDDDDDDDDHHHHHHHHHHHHHHHHHHHHHHHHHHH^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#%%%@DDD,,,,DDDDDDDDDDDDDDHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#%%%%@DDDD,,,,DDDDDDDDDDDDHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#%%%%%@DDD,,,,DDDDDDDDDDHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#@%%%%%@DDDD,,,,DDDDDDDDHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#D@%%%%%@DDD,,,,DDDDDDDDHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#DD@%%%%%@DDDD,,,,DDDDDDHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH^^^^^^^HHH^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#DDD@%%%%%@DDD,,,,DDDDHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH^^^^^^^^HHHHHHH^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#DDDD@%%%%%@@DDD,,,,DHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH^^^^^^^^HHHHHHHHHHHHH^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#DDDDD@@%%%%%@HHH,,,,HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH^^^^^^^HHHHHHHHHHHHHHHHH^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#DDDDDDD@%%%%%@@HHHH,,,,,HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH^^^^^^^HHHHHHHHHHHHHHHHHHHHHH^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#DDDDDDDD@@%%%%%@@HHHHH,,,,,HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH^^^^^^^^HHHHHHHHHHHHHHHHHHHHHHH^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#DDDDDDDDDD@@%%%%%@@@HHHHH,,,,,,HHHHHHHHHHHHHHHHHHHHHHHHHHH^^^^^^^HHHHHHHHHHHHHHHHHHHHHHHHH^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#DDDDDDDDDDDD@@@%%%%%@@@@HHHHH,,,,,HHHHHHHHHHHHHHHHHHHHHHH^^^^^^HHHHHHHHHHHHHHHHHHHHHHHHHHH^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#DDDDDDDDDDDDDDD@@%%%%%%@@@@@HHHH,,,,,HHHHHHHHHHHHHHHHHHH^^^^^^^HHHHHHHHHHHHHHHHHHHHHHHHHHHH^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#DDDDDDDDDDDDDDHHH@@@%%%%%%%%@@@@HHH,,,,,HHHHHHHHHHHHHHH^^^^^^^HHHHHHHHHHHHHHHHHHHHHHHHHHHHHH^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#DDDDDDDDDDDDDHHHHHHHH@%%%%%%%%%%@@@HHH,,,,,HHHHHHHHHHH^^^^^^^HHHHHHHHHHHHHHHHHHHHHHHHHHHHHH^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#DDDDDDDDDDDDDHHHHHHHHH@@@@@%%%%%%%%@@@HHH,,,,HHHHHHHH^^^^^^^HHHHHHHHHHHHHHHHHHHHHHHHHHHHHH^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#DDDDDDDDDDDDHHHHHHHHHHHHHHH@@@@@%%%%%%@HHHHH,,,,HHHH^^^^^^HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#DDDDDDDDDDDDHHHHHHHHHHHHHHHHHHHH@@@%%%%%@HHHHHH,,,H^^^^^^HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#DDDDDDDDDDDHHHHHHHHHHHHHHHHHHHHHHHHH@%%%%%@@@HHHH,,,,^^^HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#DDDDDDDDDHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@%%%%%%@@@@HH,,,HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#DDDDDDDDDHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@%%%%%%%%@@@@,,,HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#DDDDDDHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@@@@@%%%%%%%@H,,,HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#DDDDDDHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@@@%%%%%@HH,,,HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH$$##^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#DDDDDDHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH^^@%%%%%@H,,,HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH$$@@##^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#DDDDDHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH^^^^HH@%%%%@H,,,HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@@@@##^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#DDDDHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH^^^^^^HH@%%%@HH,,HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@@@@#$HHHHHHHHHHH^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#DDDDHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH^^^^^^HHH@%%%@HH,,HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH##@@$$HHHHHHHHHHHHHH^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#DDDHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH^^^^^^HHH@%%%%@H,,,HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH##@@@@HHHHHHHHHHHHHH^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#DDHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH^^^^^HHHH@%%%%@H,,HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH##@@@@HHHHHHHHHHHHHHHH^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#DDHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH^^^^^^HHHHHH@%%%@H,,HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH##@@#$HHHHHHHHHHHHHHHHH^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#DDHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH^^^^^^HHHHH@%%%%@H,,HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH##@@##HHHHHHHHHHHHHHHHHH^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH^^^^^^^HHHHH@%%%%@H,,HHHHHHHHHHHHHHHHHHHHHHHHHHHHHH##@@##HHHHHHHHHHHHHHHHHHHH^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH^^^^^^HHHHH@%%%%%@H,,HHHHHHHHHHHHHHHHHHHHHHHHHHHHH##@@##HHHHHHHHHHHHHHHHHHHHHH^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^HHHHHHHHHHHHHHHHHHHHHHHHHHHHHH^^^^^^HHHHHH@%%%%@HH,,HHHHHHHHHHHHHHHHHHHHH@@@@HHH##@@##HHHHHHHHHHHHHHHHHHHHHHHH^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^HHHHHHHHHHHHHHHHHHHHHHHHHHHHH^^^^^^HHHHHH@%%%@HHH,,HHHHHHHHHHHHHHHHHHHH@%%%%@^##@@##@@HHHHHHHHHHHHHHHHHHHHHHH^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^HHHHHHHHHHHHHHHHHHHHHHHHHHH^^^^^^^HHHHH@%%%%@HHH,,HHHHHHHHHHHHHHHHHH@%%%%%%%##@@##%%%@HHHHHHHHHHHHHHHHHHHHHH^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^HHHHHHHHHHHHHHHHHHHHHHHHH^^^^^^^HHHHHH@%%%@HHHHH,,HHHHHHHHHHHHHHH@%%%%@@@@##@@##%%%%@@@@@HHHHHHHHHHHHHHHHHH^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^HHHHHHHHHHHHHHHHHHHHHHHHHH^^^^^^HHHHHH@%%%%@HHHHHH,,HHHHHHHHHHHHH@%%%%@^^^##@@##^@%%%%%%%%@@@HHHHHHHHHHHHHHH^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^HHHHHHHHH^HHHHHHHHHHHHHHH^^^^^^HHHHHHH@%%%%@HHHHHHH,,,HHHHHHHHHHH@%%%@^^^##@@##^^^@@@@%%%%%%%@@HHHHHHHHHHHH^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^HHHHHHHHHH^^^^^^^HHHHHHHHHHHH^^^^^^^HHHHHH@%%%@HHHHHHHHH,,,,HHHHHHHH@%%%@^^^##@@####^^^^^^@@@%%%%%%@@HHHHHHHHH^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^HHHHHHHHHHH^^^^^^^^^^HHHHHHH^^^^^HHHHHHHH@%%%@HHHHHHHHHHH,,,,HHHHH@%%%@^^^##@@@@@@####^^^^^^^@%%%%%%@HHHHHHH^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^HHHHHHHHHHH^^^^^^^^^^^^^^^^HHH^^^^^^^HHHHHH@%%%%@HHHHHHHHHHHHH,,,,,$$$@%%%@^##@@@@@@@@@@####^^^^^@@@%%%%@HHHHH^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#HHHHHHHHHHHHH^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^HHHHHHH@%%%@HHHHHHHHHHHHHHH,,,@@%%%%$#$#@@@@@@@@@@@@@@####^^^^^^@%%%@HHH^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#HHHHHHHHHHHH^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^HHHHHHH@%%%%@HHHHHHHHHHHHHH$$$@%%%%@@@@@@@@@@@@@@@@@@@@@@####^^^@%%%%@H^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^HHHHHHH@%%%%@HHHHHHHHHHHHHHH$%%%%#####@@@@@@@@@@@@@@@@@@@@@###$^@%%@HH^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^HHHHH@%%%%%@HHHHHHHHHHHH@%%%%@^^##@@@@@@@@$###@@@@@@@@@@@@#$^@%%@H^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^HHHH@%%%%%%%@@@@@@@@@@%%%%%^^@@@@@@@@@@$#####@@@@@@@@@@##^^@%%@^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^HH@%%%%%%%%%%%%%%%%%%@^^@@@@@@@@@@@$$$###@@@@@@@@@##^^@%%%@@^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^HH@@@@@%%%%%%%%%%@^^^@@@@@@@@@@@@$$####@@@@@@@@##^^^^@%%%%@^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^H@@@@@@@@@@^^^$$@@@@@@@@@@@@####@@@@@@@@##^^^^^^@%%%%%@^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^HHHHHH^^^^$###@@@@@@@@@@@@@@@@@@@@@##^^^^^^^@%%%%%@@^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#$##@@@@@@@@@@@@@@@@@##^^^^^^^^^@@@%%%%@^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^####@@@@@@@@@@@@@##^^^^^^^^^^^^@%%%@^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^####@@@@@@@@@##^^^^^^^^^^^^^^@@%%%@^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^####@@@@@##^^^^^^^^^^^^^^^^^@%%%@^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^####@@##^^^^^^^^^^^^^^^^^^^@%%%@^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^####^^^^^^^^^^^^^^^^^^^@%%%@^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:###################################################################################################################################################################################################### \ No newline at end of file
diff --git a/lib/mods/theme/edit/t_d_henn.txt b/lib/mods/theme/edit/t_d_henn.txt
new file mode 100644
index 00000000..4fa033c4
--- /dev/null
+++ b/lib/mods/theme/edit/t_d_henn.txt
@@ -0,0 +1,75 @@
+# File: t_d_henn.txt
+
+# Henneth Annun map and destruction by furiosity <furiosity@zionmainframe.net>
+
+# NB! This file assumes usage of the following files from the 'theme' module:
+# f_info.txt and t_pref.txt
+# Please download the module and refer to the files for the terrain feature definitions http://modules.t-o-m-e.net/
+# Don't forget to modify the maximum number of terrain features, etc. in misc.txt as well.
+
+D:######################################################################################################################################################################################################
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^%%%%%%%%%%^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^%%DD%%%%%^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^%%%%%D%%%^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^%%%%%D%%%^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^%%%%%%%%^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^%%%%%%%%^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^%%%%%%%%^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^%%%%%%%%=^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^%%%%%%%%^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^%%%%%%%%==^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^=%%%%%%%%,==^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^==@@@%%%%%%%%=^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^@#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^=@@@%%%%%%%%@^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^@^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^=@@@@@%%%%%%%%@@=^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^@^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^=@@@@@@%%%%%%%%@=^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^@^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^=^=@@@@@%%%%%%%%@@=^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^@^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^=^=@@@@@%%%%%%%%@@@@=^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^@^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^=@@@@@@@@@%%%%%%%%@@@=^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^@^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^==@@@@@@@@@%%%%%%%%@@@@@=^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^@^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^===@@@@@@@@@@%%%%%%%%@@@@@@@=^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^@^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^=@@@@@@@@@@@@%%%%%%%%@@@@@@@@@@==^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^@^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^==@@@@@@@@@@@@@@%%%%%%%%@@@@@@@@@@@==^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^@^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^=@@@@@@@@@@@@@@@@%%%%%%%%@@@@@@@@@@@@@==^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^@^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^=@@@@@@@@@@@@@@@%%%%%%%%@@@@@@@@@@@@@@@@@==^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^@^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^=@@@@@@@@@@@@@@@@@%%%%%%%%@@@@@@@@@@@@@@@@==^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^@^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^=@@@@@@@@@@@@@@@@%%%%%%%%@@@@@@@@@@@@@@@@@@=^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^@^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^=@@@@@@@@@@@@@@@@@%%%%%%%%@@@@@@@@@@@@@@@@@@=^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^@^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^=@@@@@@@@@@@@@@@@@%%%%%%%%@@@@@@@@@@@@@@@@@@@@=^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^@^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^=@@@@@@@@@@@@@@@@@@%%%%%%%%@@@@@@@@@@@@@@@@@@@@=^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^@^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^=@@@@@@@@@@@@@@@@@@%%%%%%%%@@@@@@@@@@@@@@@@@@@@@@=^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^@^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^=@@@@@@@@@@@@@@@@@@%%%%%%%%@@@@@@@@@@@@@@@@@@@@@@@=^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^@^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^==@@@@@@@@@@@@@@@@@%%%%%%%%@@@@@@@@@@@@@@@@@@@@@@@@@@=^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^@^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^==@@@@@@@@@@@@@@@@@@@@%%%%%%%%@@@@@@@@@@@@@@@@@@@@@@@@@=^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^@^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^=@@@@@@@@@@@@@@@@@@@@@@@%%%%%%%%@@@@@@@@@@@@@@@@@@@@@@@@@=^^^^^^^^^^^^^^^^^^^^^^^^^^^^^@^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^==@@@@@@@@@@@@@@@@@@@@@@@%%%%%%%%@@@@@@@@@@@@@@@@@@@@@@@@@@=^^^^^^^^^^^^^^^^^^^^^^^^^^^^@^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^==@@@@@@@@@@@@@@@@@@@@@@@%%%%%%%%@@@@@@@@@@@@@@@@@@@@@@@@@@@@=^^^^^^^^^^^^^^^^^^^^^^^^^^^@^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^==@@@@@@@@@@@@@@@@@@@@@@@@@@%%%%%%%%@@@@@@@@@@@@@@@@@@@@@@@@@@@=^^^^^^^^^^^^^^^^^^^^^^^^^^@^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^=@@@@@@@@@@@@@@@@@@@@@@@@@@@%%%%%%%%@@@@@@@@@@@@@@@@@@@@@@@@@@@=^^^^^^^^^^^^^^^^^^^^^^^^^^@^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^==@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%%%%%%%%@@@@@@@@@@@@@@@@@@@@@@@@@@=^^^^^^^^^^^^^^^^^^^^^^^^^@^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^==@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%%%%%%%%@@@@@@@@@@@@@@@@@@@@@@@@@@=^^^^^^^^^^^^^^^^^^^^^^^^@^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^=@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%%%%%%%%@@@@@@@@@@@@@@@@@@@@@@@@@@=^^^^^^^^^^^^^^^^^^^^^^^^@^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^=@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%%%%%%%%@@@@@@@@@@@@@@@@@@@@@@@@@@@=^^^^^^^^^^^^^^^^^^^^^^^@^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^=@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%%%%%%%%@@@@@@@@@@@@@@@@@@@@@@@@@=^^^^^^^^^^^^^^^^^^^^^^^^@^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^==@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%%%%%%%%@@@@@@@@@@@@@@@@@@@@@@@@@@=^^^^^^^^^^^^^^^^^^^^^^^@^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^===@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%%%%%%%%@@@@@@@@@@@@@@@@@@@@@@@@@=^^^^^^^^^^^^^^^^^^^^^^@^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^==@@@@@@@@@@@@@@@@@@@@@@@@@@%%%%%%%%@@@@@@@@@@@@@@@@@@@@@@@@@@=^^^^^^^^^^^^^^^^^^^^^^@^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^==@@@@@@@@@@@@@@@@@@@@@@@@@%%%%%%%%@@@@@@@@@@@@@@@@@@@@@@@==^^^^^^^^^^^^^^^^^^^^^^@^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^==^==@@@@@@@@@@@@@@@@@@%%%%%%%%@@@@@@@@@@@@@@@@@@@@@@@@=^^^^^^^^^^^^^^^^^^^^^^^@^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^=^^=@@@@@@@@@@@@@@@%%%%%%%%@@@@@@@@@@@@@@@@@@@@@@@@@=^^^^^^^^^^^^^^^^^^^^^^^@^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^===@@@@@@@@@@@%%%%%%%%@@@@@@@@@@@@@@@@@@@@@@@@@==^^^^^^^^^^^^^^^^^^^^^^^@^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^==@@@@@@@@%%%%%%%%@@@@@@@@@@@@@@@@@@@@@@@@@=^^^^^^^^^^^^^^^^^^^^^^^^@@^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^=@@@@@@%%%%%%%%@@@@@@@@@@@@@@@@@@@@@@@===^^^^^^^^^^^^^^^^^^^^^^^^@@^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^=@@@@%%%%%%%%@@@@@@@@@@@@@@@@@@@@@@@@^^^^^^^^^^^^^^^^^^^^^^^^^@@^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^@^@^@^@^@^@^@^@^@^@^@^@^@^^^^=@@@@@%%%%%%%%@@@^^^^^^^^^^^^^^^^^^@@@@@@@@@@@^^^^^^^^^^@@^^@^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^@@@@^@^@^@^@^@^@^@^@^@^@^@^@^@@@^^^@@@%%%%%%%%@@@@^^^^@@@@@@@@@@@@@@@@@@^^^^^^^@@@@@@@@@@@@@@^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^@^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^lllll@@%%%%%%%%@llllllDDDDDDDDDDDDDDDDDDDDDDDDDD^^^^^^^^^^^^^^^DD^D^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^@^^^^CC^^^^^^^^^^^^^^^^^^^^^^^^^^lllllllllll%llllll^^^^^^^^^^^^^^^^^^^^^^^^^D%%%%%%%DD^D^D^D^^^^^DDD^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^@^^^^CCCCCCCCCCCCCCCCCCCCCCCCCfffffffflllllll%llllllffffff^^^^^^^^CCCCCCCCC^^^^%%%%%DD^^^^^^^^^^^^DD^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^@^^^^^CCCCCCCCCCCCCCCCCCCCCCCCCffffffffffllllll%lllffffffffffCCCC^^CCCCCCCCCCCCC^^^^^DDDDDDDDDDDDDDD^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^@^^^^^^CCCCCCCCCCCCCCCCCCCCCCffffffffffffffffffffffffffffffffffCCCCCCCCCCCCCCCCCCCC^C^^^^^^^^^^DDDDDD^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^@^^^^^^^CCCCCCCCCCCCCCCCCCCCCffffffffffffffffffffffffffffffffffffCCC^CCCCCCCCCCCCCCC^^CCCCC^C^^^D^^^^^DD^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^@^^^^^^^^CCCCCCCCCCCCCCCCCCCCCCffffffffffffffffffffffffffffffffffCCCC^CCCCCCCCCCCCCCCCC^^^^CCCCC^^^CCC^^^D^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^@^^^^^^^^^CCCCCCCCCCCCCCCCCCCCCCCffffffffffffffffffffffffffffffffCCCCC^CCCCCCCCCCCCCCC^CCCCCCCCC^^CCCCCC^D^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^@^^^^^^^^^^CCCCCCCCCCCCCCCCCCCCCCCCCffffffffffffffffffffffffffffCCCCCCC^CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC^D^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:###################################################################################################################################################################################################### \ No newline at end of file
diff --git a/lib/mods/theme/edit/t_d_hobb.txt b/lib/mods/theme/edit/t_d_hobb.txt
new file mode 100644
index 00000000..9bc22a10
--- /dev/null
+++ b/lib/mods/theme/edit/t_d_hobb.txt
@@ -0,0 +1,75 @@
+# File: t_d_hobb.txt
+
+# Hobbiton map and destruction by furiosity <furiosity@zionmainframe.net>
+
+# NB! This file assumes usage of the following files from the 'theme' module:
+# f_info.txt and t_pref.txt
+# Please download the module and refer to the files for the terrain feature definitions http://modules.t-o-m-e.net/
+# Don't forget to modify the maximum number of terrain features, etc. in misc.txt as well.
+
+D:######################################################################################################################################################################################################
+D:#DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD==========================,=======ccccc==,,=========================================================================================#
+D:#D==============================================================DDHHHHHHHHHHHHHHHHHHHHHHHH,,HHHHHHH==D==D,,HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#D==============================================================DDHHHHHHHHHHHHHHHHHHHHHHH,,HHHHHHHH====D,,HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#D==============================================================DDHHHHHHHHHHHHHHHHHHHHHH,,HHHHHHHHHHHHH,,HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#D==============================================================DDHHHHHHHHHHHHHHHHHHHHH,,HHHHHHHHHHHHHHH,,HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#D==============================================================DDHHHHHHHHHHHHHHHHHHHH,,HHHHHHHHHHHHHHH,,HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#D==============================================================DDHHHHHHHHHHHHHHHHHHH,,HHHHHHHHHHHHHHHHH,,DHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#D==============================================================DDHHHHHHHHHHHHHHHHHH,,HHHHHHHHHHHHHHHHH,,DHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#D==============================================================DDHHHHHHHHHHHHHHHHH,,C$###########$HHH,,HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#D==============================================================DDHHHHHHHHHHH,,,,,,,,,,,,,,,,,,,,,#HHH,,DHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#D==============================================================DDHHHHHHHHHH,,HHH#,,,,,,,,,,,,,,,,#HHH,,DHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#D==============================================================DDHHHHHHHHHH,,HHH#,,,==========,,,#HHH,,HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+=:#=================================================================HHHHHHHHHH,,HHH#,,,==========,,,#HHH,,HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+=:#=================================================================HHHHHHHHHH,,HHH#,,,,=========,,,,,,,,HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+=:#=================================================================HHHHHHHHHH,,HHH#,,,==========,,,#HH,,=HHHHDDHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+=:#=================================================================HHHHHHHHHHH,,HH#,,,==========,,,#HH,,HHDDHDDDHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+=:#=================================================================HHHHHHHHHHH,,HH#,,,,,,,,,,,,,,,,#HH,,HDDHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+=:#=================================================================HHHHHHHHHHHH,,H,,,,,,,,,,,,,,,,,#HH,,=DDHHHHHHDHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+=:#=================================================================HHHHHHHHHHHHH,,,#################HH,,=DDHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+=:#=================================================================HHHHHHHHHHHHHH,,HHHHHHHHHHHHHHHHHH,,,,,,,,,,,,HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+=:#=================================================================HHHHHHHHHHHHHHH,,HHHHHHHHHHHHHHHHH,,=HH#####HH,,HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+=:#=================================================================HHHHHHHHHHHHHHHHH,,HHHHHHHHHHHHHHH,,=HH#######,,$#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+=:#=================================================================HHHHHHHHHHHHHHHHHH,,HHHHHHHHHHHDHH,,=HH######$$$##HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+=:#=================================================================HHHHHHHHHHHHHHHDDDD,,HHHHHHHHDDDH,,=HHH###########HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+=:#=================================================================HHHHHHHHHHHHHHHHDDHH,,HHHHHHHHHHH,,=HHH#####HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+=:#=================================================================HHHHHHHHHHHHHHHHHHDDH,,HHHHHDDDHH,,=HHH#####HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+=:#=================================================================HHHHHHHHHHHHHHHHHHDDHH,,HHHHHDHHH,,=HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+=:#=================================================================HHHHHHHHHHHHHHHHHHHDDDH,,HHDDHHH,,=HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+=:#=================================================================HHHHHHHHHHHHHHHHHHHDDDDH,,DDDHH,,=HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+=:#=================================================================HHHHHHHHHHHHHHHHHHHHHDDDH,,HH=,,=HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+=:#=================================================================HHHHHHHHHHHHHHHHHHHHHHDDDH,,,,,=HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+=:#=================================================================HHHHHHHHHHHHHHHHHHHHHHHDDHH,,,=HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+=:#=================================================================HHHHHHHHHHHHHHHHHHHHHHDDDH,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+=:#=================================================================HHHHHHHHHHHHHHHHHHHHHHDDH=,,=HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+=:#=================================================================HHHHHHHHHHHHHHHHHHHHHHDDH,,=HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+=:#=================================================================HHHHHHHHHHHHHHHHHHHHHHDDH,,=HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+=:#=================================================================HHHHHHHHHHHHHHHHHHHHHDDDH,,=HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+=:#=================================================================HHHHHHHHHHHHHHHHHHHHHHDHH,,=H$$############HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+=:#=================================================================HHHHHHHHHHHHHHHHHDDDHDDDH,,HH$#############HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+=:#=================================================================HHHHHHHHHHHHHHHHHHDHDDDDH,,,,,#############HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+=:#==========================================================================================,,HH$C############@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#
+=:#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%a,,a%$#############%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#
+=:#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%a,,a%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#
+=:#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%a,,a%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#
+=:#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@=,,@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#
+=:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH=,,HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+=:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH====HHH,,HHHHHHHH===HHHHH===HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+=:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHDHHHHHHDDHHHHHHDDHHHHH====HHHHHH======HH,,HHHHHHH=====HHH=====HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+=:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHDHHHDHHHHHHHDHHDHHH======HHHH========H,,HHHHHH=======HH==H==HHHDHHHDHHHHDHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+=:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHDDHHHHHDDHHHHHHDDHHH===HH===HHH===HH===H,,HHHHHH===H===HHHHHHHHDDDDHDDDDHDHHDHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+=:#,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+=:#,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+=:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH===HH===HHHHHH==H,,H==HHHHH=HH=HHHH=HH=HDDDDHDDHHHHHHDHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+=:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH======HHHHHHHH==,,H===HHHHH==HHHHH====HHDHHHHDDHHHDDHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+=:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH====HHHHHHHHHH=,,H===HHHHHHHHHHHHH==HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+=:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH,,H==HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+=:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH=====HHHHH,,HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+=:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH=======HHHH,,HHH==HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+=:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH====H====HHH,,HH====HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+=:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH,,H======HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+=:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH===HH,,H==HH==HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+=:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH=====H,,HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+=:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH==H==H,,HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+=:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH,,HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+=:###################################################################################################################################################################################################### \ No newline at end of file
diff --git a/lib/mods/theme/edit/t_d_imlad.txt b/lib/mods/theme/edit/t_d_imlad.txt
new file mode 100644
index 00000000..c1c10fd7
--- /dev/null
+++ b/lib/mods/theme/edit/t_d_imlad.txt
@@ -0,0 +1,75 @@
+# File: t_d_imlad.txt
+
+# Imladris map and destruction by furiosity <furiosity@zionmainframe.net>
+
+# NB! This file assumes usage of the following files from the 'theme' module:
+# f_info.txt and t_pref.txt
+# Please download the module and refer to the files for the terrain feature definitions http://modules.t-o-m-e.net/
+# Don't forget to modify the maximum number of terrain features, etc. in misc.txt as well.
+
+D:######################################################################################################################################################################################################
+D:# @^^^@ @@%%%%%%%%%%^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^%%%^#
+D:# @^^^@ @@%%%%%%%%%%^^^^^^^^^^^^^^^^^^^^^^^^HHH#####HHHHHHHHHHHHHHHHHHHHHHDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^%%%%^#
+D:# @^^^@ @@%%%%%%%%%%^^^^^^^^^^^^^^^^^^^^HHHHHH#####HHHHHHHHHHHHHHHHHHHHHHDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD^^^^^^^^^^^^^^^^^^^^^^^^^^^^^%%%%^^#
+D:# @^^^@ @@%%%%%%%%%%^^^^^^^^^^^^^^^^HHHH###HH#####HHHHHHHHHHHHHHHHHHHHHHHDDDDDDDD DDDDDDD^^^^^^^^^^^^^^^^^^^^^^^^^^^^%%%%^^^#
+D:# @^^^@ @@%%%%%%%%%%^^^^^^^^^^^^^^HH######HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHDDDDDDDDDDDD DDDDDD^^^^^^^^^^^^^^^^^^^^^^^^^^%%%%^^^^#
+D:# @^^^@ @@%%%%%%%%%%^^^^^^^^HHHHH#######HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHDDDDDDDDDDD DDDDDDD^^^^^^^^^^^^^^^^^^^^^^^^^%%%%^^^^^#
+D:# @^^^@ @@%%%%%%%%%%^^^^^^^^^HHH####HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHDDDDDDDD DDDDDDDDDDDD^^^^^^^^^^^^^^^^^^^^^%%%^^^^^^^#
+D:# @^^^@ @@%%%%%%%%%%^^^^^^%%^HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHDDDDDDDDDDDDDDD DDDDDDDDDDDD^^^^^^^^^^^^^^^^^^%%%^^^^^^^^^#
+D:# @^^^@ @@%%%%%%%%%%^^^^^^^%^HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHDDDDDDDDDDDDDDDDDDDDDDDD DDDD^^^^^^^^^^^^^^^^^^^^^^%%%%^^^^^^^^^^#
+D:# @^^^@ @@%%%%%%%%%^^^^^^%@^^HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHDDDDDDDDDDDDDDDDDDDDDDDDDD DDDDD^^^^^^^^^^^^^^^^^^^^%%%%^^^^^^^^^^^^#
+D:# @^^^@ @@%%%%%%%%%^^^^^^%@^^HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHDDDDDDDDDDDDDDDDDDDDDDDDDD DDDDDDD^^^^^^^^^^^^^^^^%%%%^^^^^^^^^^^^^^#
+D:# @^^^@ @@%%%%%%%%%%%%C%%@@^^HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHDDDDDDDDDDDDDDDDDDDDD^^^^^^^^^^,^^@%%%%^^^^^^^^^^^^^^^^#
+D:# @^^^@ @@%%%%%%%%%%CC%@@@@^^HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHDDDDDDDDDDDDDDDDDDDDD^^^^^,,,,^^@%%%%^^^^^^^^^^^^^^^^^#
+D:# @^^^@ @@%%%%%%%%CC%%@@@@@^^HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHDDDDDDDDDDDDDDDDDDDDD^^,,^^^@@%%%%^^^^^^^^^^^^^^^^^^#
+D:# @^^^@ @@%%%%%%CC%%%%%@@@@^^^HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHDDDDDDDDDDDDDDDDDDD,,^^^^@%%%%%^^^^^^^^^^^^^^^^^^^#
+D:# @^^^@ @@%%%%CC%%%%%%%@@@@@^^^^HHHHHHHHHHHHHHHHHHHHHHHHHHCCCCCCCCCCCCCCCCCCCCCCCHHHHDDDDDDDDDDDDDD,,,^^^@@%%%%@^^^^^^^^^^^^^^^^^^^^^#
+D:# @^^^@ @@%%CC%%%%%%%%%%@@@@@@^^HHHHHHHHHHHHHHHHHHHHHHHHHCCCCCCCCCCCCCCCCCCCCCCCHHHHHHHHHHHHDDDHH,,^^^@@%%%%%@^^^^^^^^^^^^^^^^^^^^^^#
+D:# DDDDDD @^^^@ @^^CC%%%%%%%%%%%%%@@@@@^^HHHHHHHHHHHHHHHHHHHHHHHHCCCCCCCCCCCCCCCCCCCCCCCHHHHHHHHHHHHH,,,,^^^@@%%%%%^^^^D^^^^^^^^^^^^^^^^^^^^#
+D:# DDDDDDD DDD @^^^@ @^^^^^^^%%%%%%%%%%%%%%%%@@@@^^HHHHHHHHHH,,,,,,,,,,,,,CCCCCCCCCCCCCCCCCCCCCCC,HHHHHHHHHH,,^^^^^@@%%%%%^^^DDDDD^^^^^^^^^^^^^^^^^^^#
+D:# DDDD DDD @^^^@^@@^^@^^^^@ @@%%%%%%%%%%%%%%%%%%@@^^^^HHHH,,,,,,,,,,,,,,,,CCCCCCCCCCCCCCCCCCCCCCC,HHHHHHHHH,,^^^@@@%%%%%@^^DDD DDD^^^^^^^^^^^^^^^^^^#
+D:# DDD DDD D DDD @^^^^^^^^^^^@ @@@%%%%%%%%%%%%%%%%%@@@^^,,,,,,HHHHHHHHHHHHH,CCCCCCCCCCCCCCCCCCCCCCC,HHHHHH,,,^^^@@%%%%%%%@^^DDD DDD^^^^^^^^^^^^^^^^^^^#
+D:# DDD D DDD D DD @^^@ @@@@@%%%%%%%%%%%%%%@#,,,,,^^^HHHHHHHHHHHH,CCCCCCCCCCCCCCCCCCCCCCC,HHHHH,,^^^@@%%%%%%%%@^^DDD DDD^^^^^^^^^^^^^^^^^^^^#
+D:# DDD D DDDDDDD DD @@@@@%%%%%%%%%%%#,,,,,#@@^^^^^^^^HHHHHHCCCCCCCCCCCCCCCCCCCCCCC,H,,,,^^^@@%%%%%%%%%@^^DD DDD^^^^^^^^^^^^^^^^^^^^^^#
+D:# DD DDDDDD,,DD,,DD,, @@@@%%%%%%%#,,,,,#%%%@@@@@@@^^HHHHHH,HHHHHHHHHHHHHHHHHHHH,,,,^^^^@@%%%%%%%%%%@^^DD DDD^^^^^^^^^^^^^^^^^^^^^^^#
+D:# DD DDD DD ,,,DD,,DD,,D,, ,,,,,,, @@@@%%%#,,,,,#%%%%%%%%%%@@@^^^^^^,,,,,,,,,,,,,,,,,,,,,,^^^^@@@%%%%%%%%%%@@^^DD DDD^^^^^^^^^^^^^^^^^^^^^^^^#
+D:# DDD D ,,DDD DDD DDDDD,, ,,,,,,,,,,,,,,, @@%#,,,,,#%%%%%%%%%%%%%%@@@@@^^^^^^^^^^^^^^^^^^^^^^^^@@@%%%%%%%%%%%@@@^^DD DDD^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:# DDDD ,,DD DDDD,,,,,, ,,,, ,,,,, ,,,,,,,,,,@#,,,,,#%%%%%%%%%%%%%%%%%%%%@@@@@@@@@@@@@@@@@@@@@@@@%%%%%%%%%%%%@@@@^^DD DD^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:# D DDD D,,DD D DD DD,,,,^^,,,, ,,,, ,,,, ,,,, ,,,, ,,,,,,,,@@#@@@@@%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%@@@@^^^^DD DD^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:# DDD D,,DD DD DD,,,,^^^^^^,,,, ,,,, ,,,,, ,,,, ,,,,@@@ @@@@@%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%@@@^^^^DDD DD^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:# D,,DDD D,,,,^^@@^^^^@ @^@,,,,, ,,,, @@@@@@%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%@@@@DDDDDDDD DD^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:# ,,,,,,DDDD DDDD DDDD,,,,^^@ @^^^@ ,,,,,,,,,, @@@@@@@@%%%%%%%%%%%%%%%%%%%%%@@@@@@ DDDDDDDDD^^@@^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:# ,,,,^^^^^^DDD DDD^^,,,,^^@ @^^^^^@ ,,,,, @@@@@@@@@@@@@@@@@@@@@@@ @^@DDDD^^@ @^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:# ,,,,,^^^^@ @^^^DDDDDDDD^^^^,,,,^^@ @^^^^^^@ ,,, @^^^@ ^^^^^^^^^^^^^^^^^^^^^^#
+D:# ,,,,^^^^@ @^^^^^^^^^^^^^,,,,^^@ @^^^^^^^^^@ @^^^^@^^^^^@^^^^^^^^^@ @^^^@ ^^^^^^^^^^^^^^^^^#
+D:#,,,,,^^^^@ @^^^^^^^^^,,,,^^@ @^^^^^^^^^^^^^^^^@ @^^^@ @^^^@ @^^^^@^^^@ @^^^@ ^^^^^^^^^^^^^#
+D:#^^^^^^@ @^^^^^^^,,,,^^@ @^^^@ @^^^@^^^@@^^^^^^^^^^^^^^^^^^^^@@^^^@^^^@^^^@^^^@^^^@^^^@@^^^@@^^^@@^^^@ ^^^^^^^^^#
+D:# @^^^^^,,,,^^@ @^^^^@ @^^^@ @^^^@ @^^^@^^^@^^^@^^^@^^^@^^^@^^^@^^^@@^^^@@^^^@ ^^^^^^#
+D:# @^^^,,,,^^@ ^^^#
+D:# @^^,,,,^^@ ^^#
+D:# @^^,,,,^^@ #
+D:# @^^,,,,^^@ #
+D:# @^^,,,,^^@ #
+D:# @^^,,,,^^@ #
+D:# @^^,,,,^^@ #
+D:# @^^,,,,^^@ #
+D:# @^^,,,,^^@ #
+D:# @^^,,,,^^@ #
+D:# @^^,,,,^^@ #
+D:# @^^,,,,^^@ #
+D:# @^^,,,,^^@ #
+D:# @^^,,,,^^@ #
+D:# @^^^,,,, #
+D:# @^^,,,, #
+D:# @^^,,,, #
+D:# @^^,,,, #
+D:# @^^,,,, #
+D:# @^^,,,, #
+D:# @^^,,,, #
+D:# @^^,,,, #
+D:# @^^,,,, #
+D:# @^^,,,, #
+D:# @^^,,,, #
+D:# @^^,,,, #
+D:# @^^,,,, #
+D:###################################################################################################################################################################################################### \ No newline at end of file
diff --git a/lib/mods/theme/edit/t_d_khaz.txt b/lib/mods/theme/edit/t_d_khaz.txt
new file mode 100644
index 00000000..50e8b124
--- /dev/null
+++ b/lib/mods/theme/edit/t_d_khaz.txt
@@ -0,0 +1,79 @@
+# Town Name: Destroyed Khazad-Dum
+# by fearoffours (fearoffours@moppy.co.uk)
+#
+# Created for ToME
+
+# Rocky ground
+F:o:207:3
+
+# Town Layout
+D:######################################################################################################################################################################################################
+D:#ooooooooooooo####^^^^^^^^^#######^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#####oooo#######oo######^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^##########oooooooooo CCCCCCC #
+D:#ooo##ooooooooo#####^^^^^##########^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^########ooo########ooo##########^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^################oooooooooooo CCCCCCCC #
+D:##oo###oo####oo##############################^^^^^^^^^^^^^^^^^########################oooo#########oo#### ###########^^^^^^^^^^^^^^^^^^^^^^^^####### #######oooo########## CCCCCCCC #
+D:##############o#########oo###oo###################^^^^^^^############################oooo#########oo###### ################################# #####ooooooooo############# CCCCCCCC ; #
+D:#^^^^########oooooooooooooo##ooooooooo############################# #################oooo########oo########### ########################## ######ooooooooo################ CCCCCCCC ; #
+D:#############ooooooooooooooooooooooooooo###### ########### ###### ############## ####oooo#######o##o############# ################### ###########ooo######################## CCCCCCCC ; #
+D:#^#############ooooo##################oo### # #### # ##### #### ############### ###ooo########ooo## ## ###### # ## ## ## # #######ooooo########################### CCCCCCCC #
+D:#^^################oo#################ooooo#### ## ; ## ;; o ; o ## # ooooooooo############################ CCCCCCCC #
+D:#^^^^################o##########o#####oooooooooooooooooooooo HHHHHHHH # o ; oooooooooooooooooooooooo##ooo############################ CCCCCCC #
+D:#^^^^^^################################# ## ; o ; HH=====HH H o ; o $#o################################### CCCCCCC#
+D:#^^^^^^################################ ### o ### HH====HHHH ## o ###; o ##H ######################################## CCCCCC#
+D:#^^^^^################################# ### o ### ### ## HH=====HHo ### o ### o #HH==H $$###################################### CCCCCC#
+D:#^^^^^^^################################ ###### ;; o ######### HHH=====Ho ###### o ## ### o ## #H=H #$##################################### ; CCCCCC#
+D:#^^^^^^^^################################ # ## #### o ; ## # # HHHHHHHHH ####### # #### # o ## ###==# ###$#$################################## CCCCCC #
+D:#^^^^^^^################################### ## ## o ; ;### # HHHHo # # ##o # ## ; o # ##== ;#$##$$################################# CCCCCCC #
+D:#^^^^^^^^^################################ ## HHHHHHHH ### o ### o # # o ## # #$################################## CCCCCC ; #
+D:#^^^^^^^^^################################# HH======HH o o o #$ ################################## CCCCCC #
+D:#^^^^^^^^^^################################ ; HH=======HHoooooooo o o oooooooooooo HHHH $################################# CCCCCC ; #
+D:#^^^^^^^^^^^^^########################### HHH=====HH o o o o ===== H ################################# CCCCCCC #
+D:#^^^^^^^^^^^^^^^########################## HHHHHHHHHHHHHH== o ### # o o ;### o ### # H= =HH #$############################## CCCCCCC ; #
+D:#^^^^^^^^^^^^############################# H===HH #####; o # ## o o # ### o # # # == ; ###############################; CCCCCCC ; #
+D:#^^^^^^^^^############################### HH===H; ## ## # o #### ## o ; o ####### o ### #H HHH ############################ CCCCCCC #
+D:#^######################################### H=HH; ## ### oooooooo #### # #o o ###### oooooo ###HH== o ; $#############################; CCCCCCC #
+D:#################ooo###################### HH ; ### # o # ## o o ##### o ## H==H# $$#############oo############## CCCCC; #
+D:####oo##ooo#####o#######o###ooo########### ## ; o ## o o ### o ; ###==HH ;; $########oo###oooooo#####oo###### CCCCC ; #
+D:#ooooooooooooooooooooooooooooooo##oooooooo ; o ; o o o ; # ;; ; oooooooooooo##oooooooo##oooooooooo CCCCC ; #
+D:#ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooHHH=ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo CCCCCC #
+D:#oooooooooooooooooo##oooooo##oooooo##ooooo HH ; o o HH ==H ; $oooooooo#oooooooooooooooooooooooo CCCCC #
+D:#^#######################oo####ooooo####### ##### ==H=H # # o o H===### # ######o####oo####oo######oo######; CCCCC #
+D:#^^#######################o########### #### HH===HH# oH o H =H## # ## ## ## $$####o####################oo#### CCCCC #
+D:#^####################################### ## ### ;; ; HH==HH##### oH ===HH ### ### ## #### $####oo######################### CCCCCC #
+D:#^^######################################## ####### ; #H##### oH o # #### # # ### $$$###o############oo########## CCCCCCC #
+D:#^^^###############ooo################### ### # ; ;# ## oH HH o =H ##### ; ### ## ;; $#####oo########ooooo####### CCCCCCCC #
+D:#####oo##oo#####oooooooo##############oo## ### ; #### o HH o = H ### ### $#######oooo##oooooo####### CCCCCCCCC ; #
+D:#ooooooooooo###ooooooooooooooooooooooooooo # o H o= # ooooooooooooooooooooooooooo CCCCCCCC #
+D:#oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo=ooo=ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo CCCCCCCC ; #
+D:#^ooooooooooooooooo###oooooooooo##oooooooo o #o H o o HH # ooooooo####ooooooooooooo CCCCCCCC #
+D:#^^#o###ooo#####ooo#####ooooo########oo# # # ; o ### o H =o ;### o H ### o$#########ooooo###oo# CCCCCCCC ; #
+D:#^^^^^###o################oo############# # # # ; o ###### # H= o ## # o #### ; $###########oo######## CCCCCCCC ; #
+D:#^^^^^^^##################################$ ; #### ooooooo ##### o ; H o ###### ooooo H ####### ######################## CCCCCCCCC #
+D:#^^^^^^^^^^##############################$$ HH; ## ##### o ; ####### o Ho ### # o === # ## # o ; #$######################## CCCCCCCC #
+D:#^^^^^^^^^^^^^^^######################### $ HH == H ; ## ## o #### o H ##### o H== ### # ############################ CCCCCCCC ; #
+D:#^^^^^^^^^^^^^^^^^^^###################$$ HHH===HH ## ; o ### o o # # o ; H ### ; ;; $$########################## CCCCCCCC #
+D:#^^^^^^^^^^^^^^^^^^^#################### $ HHH===HH ; o ;; o ; o o H ; $########################### CCCCCCCC ; #
+D:#^^^^^^^^^^^^^^^^^^######################$ HH==H H ooooooooooo o o oooooooooooo ;; ;$ ############################ CCCCCCCC ; #
+D:#^^^^^^^^^^^^^^^^^^^^^^#################$$$ ; H==H o ; ; o o ; H o $############################ CCCCCCCC #
+D:#^^^^^^^^^^^^^^^^^^^^^^^^##############$ ### o # # o ### o ###; == H o #### $$############################ CCCCCCCCCC #
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^############$$$ ### # o HHH H # ### o ## # o # # # HH== Ho # ## $ ######################## CCCCCCCCCCC #
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^##########$ $ ### # #;; ; o HHHH ## #### o ## #### o ### ### ==Ho ####### $########################### CCCCCCCCCCC #
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^##########$$ ## ### o ;H H #### ## H H o ### # # o # ## ### HH= HH ####### ############################ CCCCCCCCCCC #
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^########### ### o ; ;## ## HHH o # ### o ##### ; ==HH #### ; ############################## CCCCCCCCCCC #
+D:#^^^^^^^^^^^^^^^^^^^^^^^############## $ ### ; o ## HHHH o # # o H ## H o=H ### $############################## CCCCCCCCCCC ; #
+D:#^^^^^^^^^^^^^^^^^^^^^^#################$ o H HoHH H Ho H H HHHHH === $#########oo###oo################# CCCCCCCCCC #
+D:#^^^^^^^^^^^^^^^^^^#############o#######oooooooooooooooooooooo ## HH H o H H H H$ HH===H=H ooooooooooooooooo$oooooooooooooooooo################## CCCCCCCC ; #
+D:#^^^^^^^^^^^^^^^^^############ooooooooooo# ### $$$ $$ # ### $$ $ o $$## HH$ = ==H#== H HH ====$$ $ ## $ oooooo##oooooooooo################### CCCCCCC #
+D:#^^^^^^^^^^^#################ooooooooooo####$######$ ## $$### ######### ###$$####o $$##### #ooo# ### $#=#=#$$$$ H ==##$#$ ##### ####################ooo##################### CCCCCCC #
+D:#^^^^^^^^^^###################oo######oo### ########### ######## ## #### ###########oooo########ooo ##########$#H##H H ######$# ###### ####################oo###################### CCCCCCC #
+D:#^^^^^^^##########oo####oo####ooo######### ############ ######### ###^^^ #########ooooo########oo##################H################### #########^######oooo##ooo################## CCCCCCC #
+D:##^^^^^#########oooooooooooooooo#################^^####### ###########^^^^^###########ooooo######ooo####################################### #####^^^#######ooooooooooooo############# ; CCCCCCC#
+D:#^^^##########ooooooooooo##ooooo######^#########^^^^##################^^^^^^^^^^^######ooo#######oooo#########^^^^^^^^^^^^^^^^^^^########### #####^^^#######oo##oooooooo############# CCCCCC#
+D:##############ooooo##########oo######^^^#####^^^^^^^^###############^^^^^^^^^^^^^^#####oooo#######ooo######^^^^^^^^^^^^^^^^^^^^^^^^^^^^###### ####^^^^^###############ooo############## CCCCC#
+D:########ooo#####oo##################^^^^^^^^^^^^^^^^^#############^^^^^^^^^^^^^^^^^####oo########oooo#####^^^^^^^^^^^^^^^^^^^^^^^^^^^########### #######^^^^^#############ooo#ooo######## CCCCCC#
+D:#o##oooooooooooooooo##############^^^^^^^^^^^^^^^^^^^^^^#########^^^^^^^^^^^^^^^^^^#####oo########oo######^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^####### # ######^^^^^^^^^^^^########oooooooooooooo CCCCC #
+D:#oooooooooooooooooo########^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^########oooo#######ooooo###^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^##############^^^^^^^^^^^^^^^#######ooooooooooo CCCCC #
+D:######################################################################################################################################################################################################
+
+# Default starting position
+# ?:[EQU $LEAVING_QUES 0]
+# P:31:32
diff --git a/lib/mods/theme/edit/t_d_lori.txt b/lib/mods/theme/edit/t_d_lori.txt
new file mode 100644
index 00000000..967441e9
--- /dev/null
+++ b/lib/mods/theme/edit/t_d_lori.txt
@@ -0,0 +1,75 @@
+# File: t_d_lori.txt
+
+# Caras Galadhon map and destruction by furiosity <furiosity@zionmainframe.net>
+
+# NB! This file assumes usage of the following files from the 'theme' module:
+# f_info.txt and t_pref.txt
+# Please download the module and refer to the files for the terrain feature definitions http://modules.t-o-m-e.net/
+# Don't forget to modify the maximum number of terrain features, etc. in misc.txt as well.
+
+D:######################################################################################################################################################################################################
+D:# ,,, #
+D:# ,,,,,,,,,,,,,,,,,,,,,,,,, #
+D:# ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, #
+D:# ,,,,,,,,,,,CCCCCCCCCCCCCCCCCCCCCC,,,,,,,,,,,, #
+D:# ,,,,,,,,,CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC,,,,,,,, #
+D:# ,,,,,,,CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC,,,,,,,y #
+D:# ,,,,,,CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC,,,,,, #
+D:# ,,,,,CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC,,,,,, #
+D:# ,,,,,CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC,,,,, #
+D:# ,,,,CCCCCCCCCCCCCCCCCCCCCCCCDDDDDDDD,DDDDDDDDDDCCCCCCCCCCCCCCCCCCCCCCC,,,,, #
+D:# ,,,,CCCCCCCCCCCCCCCCCCCCCDDDDD D,@,D DDDDDCCCCCCCCCCCCCCCCCCCC,,,, #
+D:# ,,,,,CCCCCCCCCCCCCCCCCCCDDD D,D DDDCCCCCCCCCCCCCCCCCCC,,,, #
+D:# ,,,,CCCCCCCCCCCCCCCCCCDDD D,,,D DDDCCCCCCCCCCCCCCCCCC,,,, #
+D:# ,,,,CCCCCCCCCCCCCCCCCDDD DDDDDDD,,,DDDDDDDDD DDDCCCCCCCCCCCCCCCC,,,, #
+D:# ,,,,CCCCCCCCCCCCCCCCDDD DDD,,,,,,,,,,,,,,,,,,,DDD D,DDCCCCCCCCCCCCCCCCC,,, #
+D:# ,,,,CCCCCCCCCCCCCCCCD= DDD,,,,,,,,,,,,,,,,,,,,,,,,,DD D,=,DDCCCCCCCCCCCCCCCC,,, #
+D:# ,,,CCCCCCCCCCCCCCCCDD,D DD,,,,DDDDDDDDD,,,DDDD,DDDDD,,,,D D,,,D DDCCCCCCCCCCCCCCC,,, #
+D:# ,,,CCCCCCCCCCCCCCCCDD,=,D D,,,DDD D,,,D ,=, DD,,,D D,,DD DDCCCCCCCCCCCCCCC,,, #
+D:# ,,,,CCCCCCCCCCCCCCDD D,,,D D,,D D,,,D , DD,,D,,D DCCCCCCCCCCCCCCC,,, #
+D:# ,,,,CCCCCCCCCCCCCCDD DD,,D D,,D D,,,D D,,,D DCCCCCCCCCCCCCCC,,, #
+D:# ,,,CCCCCCCCCCCCCCDD D,,D,,D D,,,D DD,,,D DCCCCCCCCCCCCCCC,,, #
+D:# ,,,CCCCCCCCCCCCCCCD D,,,D DD,,,,,DD D,,D,,D DCCCCCCCCCCCCCC,,, #
+D:# ,,,CCCCCCCCCCCCCCCD D,,,DDD D,,D,,,D,,D DD,,D D,,D DCCCCCCCCCCCCCC,,, #
+D:# ,,,,CCCCCCCCCCCCCCD D,,=,,,,DD D,,DD,,,DD,,D D,,,D D,,D DCCCCCCCCCCCCCC,,, #
+D:# ,,,CCCCCCCCCCCCCCDD D,,D,DDD,,,D D,,D D,,,D D,,D DD,,DD D,,D DCCCCCCCCCCCCCC,, #
+D:# ,,,CCCCCCCCCCCCCCD D,,D DD,,DD D,,D D,,,D D,,D,,,D ,,,D DCCCCCCCCCCCCCC,, #
+D:# ,,,CCCCCCCCCCCCCDD D,,D D,,,DD,,D D,,,D DD,,D ,=,,,D DCCCCCCCCCCCCCC,,, #
+D:# ,,,CCCCCCCCCCCCCCD D,,D DD,,,,DD DD,DD DD,,,,D , D,,D DCCCCCCCCCCCCC,,, #
+D:# ,,,CCCCCCCCCCCCCCD D,,D D,,,,,DDD-----DD,,,DD,,D D,,D DCCCCCCCCCCCCCC,,, #
+D:# ,,CCCCCCCCCCCCCCDD D,,D D,,DD,,,DD-----DD,DD D,,D D,,D DCCCCCCCCCCCCCC,,, #
+D:# ,,CCCCCCCCCCCCCCDDD D,,D D,,D D,,---@@@---DD D,,D D,,D DCCCCCCCCCCCCCC,,, #
+D:# ,,CCCCCCCCCCCCCCDD,DDDDDD,,DDDDDDDDDDDDD,,DDDDDDD--@@%@@--DDDDDDDD,,DDDDDDDDDDD,,DDDDDDDD,DDCCCCCCCCCCCCCC,,, #
+D:# ,,CCCCCCCCCCCCCCD,=,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,--@%=%@--,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,=,DCCCCCCCCCCCCCC,,, #
+D:# ,,CCCCCCCCCCCCCCDD,DDDDDD,,DDDDDDDDDDDDD,,DDDDDDD---@%@@@-DDD D,,DDDDDDDDDDD,,DDDDDDDD,DDCCCCCCCCCCCCCC,,, #
+D:# ,,CCCCCCCCCCCCCCDDD D,,D D,,D DD,-----%%@,,,DD D,,D D,,D DCCCCCCCCCCCCCC,,, #
+D:# ,,,CCCCCCCCCCCCCCD D,,, D,,D D,DDD--,-@%%@D,,,DD,,D D,,D DCCCCCCCCCCCCCC,, #
+D:# ,,,CCCCCCCCCCCCCCD D,,=, D,,D,,D DD,=,D@%%@DD,,,DD ,,,D DCCCCCCCCCCCCCC,, #
+D:# ,,,CCCCCCCCCCCCCCD D,,D D,,,D DD,DD@%%%@ D,,,,DD ,=,,D DDCCCCCCCCCCCCC,,, #
+D:# ,,,CCCCCCCCCCCCCCCD D,,D DD,,,DD D,,,D @@%%@@DDD,,,DD ,,D DCCCCCCCCCCCCCC,,, #
+D:# ,,,CCCCCCCCCCCCCCD D,,D DD,,,DD,,D D,,,D @%%%@ DD,,,DD D,,D DDCCCCCCCCCCCCC,,, #
+D:# ,,,CCCCCCCCCCCCCCCD D,,D D,,,DD D,,D D,,,D D,@%%@ DD,,,D D,,D DCCCCCCCCCCCCCC,,, #
+D:# ,,,CCCCCCCCCCCCCCDD D,,D DDD,,DD D,,DD,,,D D,,D@%%@ DD,,D,,D DCCCCCCCCCCCCCCC,, #
+D:# ,,,CCCCCCCCCCCCCCCD D,,DD,,,,D D,,D,,,DD,,D @%%%@ DD,,DD DDCCCCCCCCCCCCCC,,, #
+D:# ,,,CCCCCCCCCCCCCCCDD D,,,,,DD D,,,,,,,,D @%%@@ D,,D,,DD DDCCCCCCCCCCCCCCC,, #
+D:# ,,,CCCCCCCCCCCCCCCD D,,,DD DD,,,=,D @%%%@ D,,D DD,,D DDCCCCCCCCCCCCCCC,,, #
+D:# ,,,CCCCCCCCCCCCCCCCD DD,,D,,D D,,,,D D,@%%@ D,,D DD,, DDCCCCCCCCCCCCCCC,,, #
+D:# ,,,CCCCCCCCCCCCCCCCDD D,,,D D,,D , D,,,D D,,D@%%@,,D ,=,DDCCCCCCCCCCCCCCC,,, #
+D:# ,,,CCCCCCCCCCCCCCCCDDD,=,D D,,DD,=,DDDDDDDDD,,,DDDDDDD,,,,@%%%@D ,DCCCCCCCCCCCCCCCC,,, #
+D:# ,,,CCCCCCCCCCCCCCCCCDD,D D,,,,,,,,,,,,,,,,,,,,,,,,,,DDD%@@%%@ DDCCCCCCCCCCCCCCCC,,, #
+D:# ,,,,CCCCCCCCCCCCCCCCCDD DDD,,,,,,,,,,,,,,,,,,,,,,D @%%%@@%%@@ DDCCCCCCCCCCCCCCCCC,,, #
+D:# $$=,,,,CCCCCCCCCCCCCCCCCDDD DDDDDDDDD,DD,,,DDDDDDD @%%=%%@@%%%@ DDCCCCCCCCCCCCCCCCCC,,, #
+D:# $## ,,,CCCCCCCCCCCCCCCCCCDDD ,=,D,,,D @%%%@ @%%@DCCCCCCCCCCCCCCCCCC,,,, #
+D:# ,,,,CCCCCCCCCCCCCCCCCCCDDD , D,,,DDDDD @@ DD@%%@CCCCCCCCCCCCCCCCC,,, #
+D:# ,,,,CCCCCCCCCCCCCCCCCCCCCDDDD D,,,,,,,,D DDDDDC@%%%@CCCCCCCCCCCCCC,,,, #
+D:# ,,,,CCCCCCCCCCCCCCCCCCCCCCCDDDDDDD D,,,,,,,,DDDDDDDCCCCCC@@%%@@CCCCCCCCCC,,,, #
+D:# ,,,,CCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDDDD,,,CCCCCCCCCCCCCCC@%%%@CCCCCCC,,,,, #
+D:# ,,,,CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC,,,CCCCCCCCCCCCCCCCC@%%@CCCCC,,,,, #
+D:# ,,,,,CCCCCCCCCCCCCCCCCCCCCCCCCCCCC,,,CCCCCCCCCCCCCCCCCCC@%%@CC,,,,, #
+D:# ,,,,,,CCCCCCCCCCCCCCCCCCCCCCCCC,,,CCCCCCCCCCCCCCCCCCCC@%%%@,,, #
+D:# ,,,,,,CCCCCCCCCCCCCCCCCCCCC,,,CCCCCCCCCCCCCCCCCCCC,,@@%%@@ #
+D:# ,,,,,,,CCCCCCCCCCCCCCCCC,,,CCCCCCCCCCCCCCCC,,,,,,,,@%%%@ #
+D:# ,,,,,,,,,,CCCCCCCCCCC,,,CCCCCCCCCCC,,,,,,,,, @%%@ #
+D:# ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, @%%%@ #
+D:# ,,,,,,,,,,,,,,,,,,,,,,, @@%%%@ #
+D:######################################################################################################################################################################################################
diff --git a/lib/mods/theme/edit/t_d_mina.txt b/lib/mods/theme/edit/t_d_mina.txt
new file mode 100644
index 00000000..4018efc6
--- /dev/null
+++ b/lib/mods/theme/edit/t_d_mina.txt
@@ -0,0 +1,79 @@
+# File: t_d_mina.txt
+
+# Minas Anor: The Royal City of Gondor (destroyed)
+# original town by Mynstral (mynstral@thehelm.com)
+#
+# screwing up by fearoffours (fearoffours@moppy.co.uk)
+#
+# Created for ToME
+
+# Completed: 23/07/02
+
+############### Town Layout ###############
+
+D:######################################################################################################################################################################################################
+D:#^^########------------------HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH=@@@@@@@HHHHHHHHHHHHHHHHHH=@@@@@@@@@HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH==#
+D:#^^^----#####H=------##==-------HHHHHHHHHH===^HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH=@@%%%%%@@HHHHHHHHHHHHHH===@@%%%%%%%@@@@@@@HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH=,,,HHHHHHHHHHHHHHHHHHHHHHHH=#
+D:#^^^----------#$##---###=###-------HHHHHHHH=^^^^^HHHHHHHHHHHHHHHHHHHHHHHHHHHDDDHHHHHHHHHHHH@%%%%%%%@@@@@HHHHHHHHHH==@@%%@@@@@@%%%%%%@@@@HHHHHHHHHDDDHHHDDDHHHHHHHHHHHHH=,,HHHHHHHHHHHHHHHHHHHHHHHH===#
+D:#^^----ssss-----#$#--------###==-----HHHHHHHH^^^^^^HHHHHHHHHHHHHHHHHHHHHHHDDHHHHHHHHHHHHH==@%%%%%%@@%%%@@@HHHHHHHHHH@%%@@HHHH@@@@@@%%%%@@HHHHHHHHHDDDDDHHHHHHHHHHHHH===,,HHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#^^^---St-$=--------=--#ssss--###-------HHHH==^^^^^^^^HHHHHHHHHH==HHHHHHHHHH===HHHHHHHHH===@@%%%%%%%%@%%%@@@@@@@@=@@@%@@HHHHHHHHHH@@@@%%@@@@HHHHHHHHHHHHHHHHHHHHHHHHHHH,HHHHHHHHHHH==HHHHHHHHHHHHHHHH#
+D:#^^----s=ss----OO---##--#StSS--===##=-----HHHH=^^^^^^^^HHHHHHHHH===HHHHHHHHHHH===HHHHHHHH===@@%@%,@@@@@@%%%%%%%%@@@%%%@HHHHHHHHHHHHHH@@%%%%@@HHHHHHHHHHHHHHHHHHHHHHHHH,,HHHHHHHHHHH==HDDDHHHHHHHHHHHH#
+D:#^^----##-#-----OOO--#---#s--$=----###------HHHH^^^^^^^^HHHHHHHHHH==HHHHHHHHHHHHHHHHHHHHHH===@@@@@HHHH=@@@@@@@@%%%%%@@@HHHHHHHHHHHHHH=@@@@%%@@@HHHHHHHHHHDDHHHHHHHHH,,,HHHHHDDDHHHHH==HHHHHHHHHHHHHH=#
+D:#^=---------------OO---#-####-#------HHHH----===^^^^^^^^^^HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH=@%%%@@HHHHHHHHHHHHHHHHH@@%%%@@HHHHHHHHHHHHHHHHH===,O,HHHHHHHHHDDDDHHHHHHH=HHHHHHHHHHH=#
+D:#^=StSSSS-----ss---OO---##-----OOOOO---###----===^^^^^^^^^^^HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@@@HHHHHHHHHHHHHHHHH===@@%%%@@HHHHHHHHHHHHHHHHH==OOHHHHHHHHHHHHHHHHHHHHHHH=HHHHHHHH==#
+D:#^^ss-H==----Ssss---H=O--#-=--$#O-O-OO---##----===HD^^^^^^^HHHHHHHHHHHHHHHHHH===HHHHHHHHHHHHHHHHHHHHHDDDHHHHHHHHHHHHHHHHHHHHHHHHHHH=@@%%%@HHHHHHHHHHHHHHHHH==OOHHHHHHHHHHHHHHHHHHHHHHHHHHDDHHHHHHH===#
+D:#^=#-$###---sH=$--=--OOO--=#-OOOOOOO-OOO--##----HHHH^^^^^HHHHHHHHHHHHHHHHHHHHH===HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH==@@%%%@@HHHHHHHHHHHHHHHHH=OOHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#^^^-------##sssSss---HHO--#OOO--s--OOOOO--###=--HHHHHHHHHHHHHHHHHHHHHHHHHHHHHH===HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@@@@@@@@@@HHHH=@@%%%@@HHHHHHHHHHHHHHHHH=OOHHHHHHHHHHHHHHHHHHHHHHDDDHHHHHHHHHHH=#
+D:#^^^##$$##---##H=H--s--OOO-OOO--StS#-OOOO----#==--HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH=HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH==@@%%%%%%%%@@@@@@@%@@@@HHHHHHHHHHHHHHHHH=OOHHHHHHHHHHHHHHHHHHHHHHH=HHHHHHHHHHHH==#
+D:#^HH^----###---##--ssS--OOO--##-ssss--OOOOOO--#$---HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH====HHHHHHHHDDDDHHHH=@%%%%%%%%%%%%@@%%@@HHHH==OOOHHHHHHHHHHHHHHOOHHHHHHHHHHHHHHHHHH==HHHHHHHHHHHHH===#
+D:#^^--------#$-----ssSs#--H=#-#--#H=H=#-OOHHHO--##-HHHHHHHHHHHHHH----HHHHHHHHHHHHHHHHHHHHHHHH=========HHHHHHHHHHHHHHHHHHH@%%%%@@@@%%%%%%%@@HHHH==OOOOOHHHHHHHH=OOOOOHHHHHHHHHHHH=HHHHHHHHHHDDDHHHHHHHH#
+D:#^=-----------#--#s-$$=-OO-O--#---------OOOOOO--==-----HHHH===--------HHHHHHHHHHHHHHHHHHHHHHHHH====HHHHHHHHHHHHDHHHHHH=@@%%%@@==@@%%%@@@@HHHH===OO==OOHHHH===OOHHHHHHHHHHHHHHHHHH=HHHHHHHHHHHHHHHHH==#
+D:#^^----HHH----$---###--OOOOOO-#--#sss#$=-OOOOOO,#====---HHHH=---#-------HHHHHHHHHHHHHHHHHHHHHHHH==HHHHHHHHHHHHHHHHHH==@@%%%@@HHHH@@@@@HHHHHHHH=OO-===OOOOOOOOOHHHHHHHHHHHHHHHHHHH=HHHHHHHHHHHHHHHH===#
+D:#^^-------------##-#-#-O#-OOO--#--ssssss----OOO,,,,,#----==-HHssH=--$----HHHHHHHHHHHHHHHHHHHHHHHHHH===HHHHHHDDDHHHHHH=@%%%@@HHHHHHHHHHHHHH===-O$HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH==HHHHHHH=#
+D:#^^-------------$#---O-O-t-OOO-=#-#SS-##--OOOOOO,##,##--------sssssssHHH-#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHDDDHHHHHH@%%@@HHHHHHHHHHHHHH==--OO-HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH===HHHHH=#
+D:#^^^-=H=--HH-----##-OOO-sssOOHH-#--ssssss-OOOOOO--#,#$$##-----SS$---SS-----HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHDDHHHHHHH@@%%@HHHHHHHHHHHHHH==--O$-HHHHHHHHHHH==HHHHHHHHDDHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#^^^--H=----------#OOO$H#-$=OOO-#--ss#sss--OHHOOO==HHH=##==---s===H=ss--O---HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH==@@%%%@HHHHHHHHHHHHHH==-OO--HHHHHHHHHHHHHHHHHHHHHHH==HHHHH===HHHHHHHHHHHHHHHHHHHHH#
+D:#^^--###--HHHH--HH--O-------OOHHH--####HHH-OOOOOO-##,###,,##--sss=H=Hs--HHH-HHHHHHHHHHHHHHHHHHHHHHHHHH===HHHHHHHHHH=@%%%@@HHHHHHHHHHHHHH=--O--HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH==HHHHHHHHHHHHHHHH=#
+D:#^^^-##H=H-------OOO#--SSStS---OHHHHH----HHHOOOO---#HHHHHH=#=-ssss$-#=--O-----HHHHHHHHHHHHHHHHHHHHHHHHH==HHHHHHH===@@%%@@HHHHHHHHHHHHHH=--O$-HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH==#
+D:#^^-####$-------OOO-#--sssss-OOO-##---#s--OOOOO--T-#,--HHHHH--H=H##HH#--O---HH-HHHHHHHHHHHHHHHHHHHH==HHHHHHHHHHHH==@%%%@HHHHHHHHHHHHHH=--OO--HHHHHHHHHH==HHHHHHHHDDHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#^^#######------OO--##-###$-HHHO-##-ssss---OOOO-TT-=HH-HHH,#----HHH,,,,,O------HHHHHHHHHH===HHHHHHHHH====HHHHHHHH=@@%%@@HHHHHHHHHHHHHH--OO--HHHHHHHHHHHHHHHHHHHHHDH==HHHHDDDHHHHHHHHHHHHHHHHHHHHHHHH=#
+D:#^^^###H=H=#----OOO--#---$---OOO--HHS#-$--OOOOHHHT-#---HH,,###----------O---HH--HHHHHHHHH==H=HHHHHHHHHH===HHHHHHHH@%%%@@HHHHHHHHHH===--OO--HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH==HHHHHHHHHHHHHHHHHH==#
+D:#^^#####$--####-O$---##-StSSS-HHO-#-sss-$=OOOOO--T-#=---,,##==-s-ssH==--O--------HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@@%%@@HHHHHHHHHH===--OD$--HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH=#
+D:#^^^#########---OOOHHH#-sss-$=--O---ssss-HHOOOOO---==,HHH#==---SSSH=H==-O--HHH-HH-HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH=@@@%%%@HHHHHHHHHH===--O$O--HHHHHHHHH=HHHHHHHHHHHHHHHHHHHDDDHHHHHHHHHHHH===HHHHHH===#
+D:#^^###HHH###----OOO#--#-###H##OOO-#-##H#---OOOOOO--##==#H#-----s$-ssss--O----------HHHHHHHH===HHHHHHHHHHHHHHHHHHHH@%%%%@@HHHHHHHHHH=---OOO--HHHHHHHHHHHHHHHHHHH=HHHHHHHHHHHHHHHHHHHHHHHH===HHHHHHHHHH#
+D:#^^^##$##-------OOO---#-#--^--OOO-#----#----OO--$$OO=OOOOOOOO--####--$#-O-----------HHHHHHHH==HHHHHHHHHHHHHHHHH==@@%%%@@HHHHHHHH=-H----OO--HHHHHHHHHHHHHHHHHHHHHHHHHHHH===HHHHHHHHHHHHHHH===HHHHHHHH=#
+D:#^^######-##OOO$OOO-^^^^^^^^-^MMM^^^^^^^^#^^^OOOOOO-$OOOO-$OOHOOOOOOOHHOO----HHH----HHHHHHHHHH=HHHHHHHHHHHHHHHH@@@%%%@@HHHHHHHH=H-HOOOOOO--HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHDD=HHHH==H===HHHHHHHH=#
+D:#^^####H==HHO$OOOO######H#####III##-#########^OOHHHOOOOOOO#OOOOOOOOOO#OOOOO-------HHHHHHHHHHHHHHHHHHHHHHHHHHH=@@%%%%@@HHHHHHHH=---OOOOOO--HHHHHHHHHHHHHHHHHHHHHHH====HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH=#
+D:#^=######-##OOOO-##-####HH#HH#III#####-##--##^OOOO$-OOOOOOOOHHHOO-OOOOOOOOOO------H--HHHHHHHHHHHHHHHHHHHHHHHHH@%%%%@@HHHHHHHH----OOO$$O----HHHHHHHHHHHHHHHHHHHHHHH====HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#^=###-H##-OOOOOOOO-^#^^^^^#H^MM#^^^^#^^#^^-#H=OOH=OOOOO$-OOOOHOOOOOOOOOOOOOOO--HH---HHHHHHHHHHHHHHHHHHHHHHHHH@%%%@@HHHH==H--HD-OOO$-----HHHHHHHHHH=HHHHHHHHHHHHHHHH=HHHHHHHHHHHHHHHHHHHHHHHHHHHHHH==#
+D:#^^^#######-----OOO---H-sHH#--OOO##--##-----$--OOOOOOOOOOOOOO-----------OOO-$-O----HHHHHHHHHHHHHHHH===---------##@%%%$##=--------OOOOO-----HHHHHHHHHHHHHHHHH=HHHHHHHHHHHHHHHHHHHHHHHHH=====HHHHHHHHHH#
+D:#^^#########----OHO---#-sSss--OOO---ssss#--OOOOOO--##==###---HH---ss-#-#O-OOOOO-HH--HHHHHHHHHHHHHH===--OOOO-----######$--------OOOOOO-----HHHHHHHHHHHHHDDDDHHHHHHHHHHHHHHHHHHHHHHHHHHHHH===HHHHHHHHH=#
+D:#^^####$-H=H#---OO$--$--sts##-O-$-#-SSHSS-OOOOOO---##=##H==---------t-S-O-OO$OO----HHHHHHHHHHHHHH===--OOOOOOOOOOOOO#OOOO$OOOOOOOOOOO-HHH-HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH=DDHHHH==HHHHHHHHHHH#
+D:#^^###########--OOO--##-sS=$--OOO-$-s-#---H=OOO--T==#=#,,,##=#--H-sssss-O--OOOOO---HHHHHHHHHHHHHH==--$OOOOOOOOOOOOOOOOOOOOOOOOO#HOO-----HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH=HDDDHHHHH=#
+D:#^^#$--$--##----OOO--#--####-OOO--#-sssss-OOHOO-TT-#,,,,-HH==-----sHH=H-$---O$-O---HHHHHHHHHHHHHH=--OOOHH-OOOOOOO$HHO#OOOOOOOOOOO------HHHHHHHHH=HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH====HHHHHHHHH=#
+D:#^^#######------O-$-##-------OO---#-###H#-OOOOO-TT-=#----H==#=----###$--O-HHOOOOHH--HHHHHHHHHH===--OOOO---------#######------------H--HHHHHHHHHHHHHHHHHHH=HHHHHDDHHHHHHDDHHHHHHHHHHHHHDDDHHHHHHHHH===#
+D:#^^-###$-#-HH---OOO-#--S-ss##OOO-#--------OOOOO--T-##-----HHH----H------H----OOOO----HHHHHHHHHH=--OOOH----DD---##@%%%@##-D-----H---HHHHHHHHHHHH===HHHHHHHHHHHHHHHH=HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH==#
+D:#^^^-###---------OO-#-#stss--OOO-#-ssssss--O$-$O---#,--HH,H#----sss-#s--O-----OOOO--H-HHHHHHHH---OOOO---HHHHHHHH=@%%%@@HHHHHHHHHHHHHHHHHHHHHHHHH===HHHHHHHHHHHHHHHHHHHHHHHH=HHHHHHHHHHHHH==HHHHHHHHHH#
+D:#^^--####---------OOO--#s#s-OOO--=$StS##---OH=HOO-#==-,,#=##----S--#HH--O------OO$-----HHHH==--OOOOO----HHHHHHHH=@%%%@@HHHHHHHHHHHHHHHHHHHHHHHHH===HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH=#
+D:#^^---#HH--HH-----#OOO--##--OOO-###ssssss--OOOOOO-#,,,##==#------$sH=H--O--H----OO$#----HHHH--OOOOO----HHHHHHHHHH@%%%%@HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#^^^--#------H==-$--H=HHH--OO----#-###H##-OO$-OO--#=####HHH-HH--ss#-ss-OO----D---OOOO----HH--OOOOO---===HHHHHHHH=@@%%%@@@HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH=@@@@HHHHHHHHHHHHHHHHHHHH===#
+D:#^^^-------------#---OOO---OOO--#=------##OOOOOO##HHHH=-HH--HH--#-##-HHH-$-HH-----$--H----OOOOOO-HH--HHHHHHHHHH===@@%%%%@@@HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH=@@@@@@HHHHHHHHHHDDHHHHHHHH===#
+D:#^^----------H==H-----H=HHOOO-----ss------OO$-O,,##=HHH--------HHH-----HHH--H--HHH-OOOOOOOO$OO-----HHHHHHHHHHHHHH==@@@%%%%@@HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@@@@@@@@@%@@@HHHHHHHHHHHHDDDDHHHH==#
+D:#^^^----HHHH-$-##-#ss--OOO#OO-##=-#Ss----OOOH-O,=#HHH---HHHHH-------HH-O--------=---OOO#OOOOO--HHHH===HHHHHHHHHHHHHH=@@%%%%@@HHHHHHHHHHHHHHHHHHHH@@@@@HHHHHHHHHH@@@@@@@@@@@@@HHHHHHHHHHHHHHHHHHHHHHHH#
+D:#^^^---------##---ss-s--OOOO----=sst#DD-OOOOOO--#=-----=------ssss-s--O$---H--HHHH---OOOOO-H--HH==HHHHHHHHHHHHHHHHH===@@%%%%@@@HHHHHHHHHHHHHH==@@@%%%@@@HHHHHHHH@@@%@@@@@@@@HHHHHHHHHHHHHHHHHHHHHHHH=#
+D:#^^--------##$---sstss#--OOO-##=ssS-#--OOO#OO--##=----HHHH-----#S--$$-OH-----HHHH==----------HHHHHHHHHHHHHHHHHHHHHHHHH=@@@%%%%@@@@@HHHHHHHH=@@@@%%%%%%%@@===@@@@@%@@%@@@%@@HHHHHHHHHHHHHHHHHHHHHHHH==#
+D:#^^-HHHH-###-----#Ss-$--OOOOO###sSs#--OOOOOO--##-----HHHH==---ssssss--O-----HHHHHHHHHHH-HH-HHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@@@%%%%%%@@@@@@@@@@@%%%%%@@@%%%@@@@@%%%%@@@@=@@@@HHHHHHHHHHHHHHHHHHHHHHHH===#
+D:#^^^######----#---#s#--OOO-OOO--Ss#--#OHH#---##-#HHHHHHHHHHH--##--##-OO--DHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH===@@%%%%%%%%%%%%%%%%%@@@@@=@@@%%%%%%%@@@@HHHHHHHHHHHHHHHHHHHHHHHHHHHDDHHHHH=#
+D:#^^^-------ss-#S---#--OOO---HH#--#--OOOO$--#-------HHHHHHHHHH--------O-----HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH=@@@@@@@@@@@@@@@@@@@HHHH===@@@@@@@@@HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#^^-sssss-#sssts-----OOO--#--OOO---OOOOO---#H=-HHHHHHHHHHHHHH=------OO-HHHHHHHHHHHHHHHHHHHHHHHHHHHHHH===HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH===#
+D:#^^-SSStH--#sSH=s#--OOO--#----HOOOOOOHH--#-------HHHH==HHH==HHH=HH--O----HHHHHDDHHHHHHHHHHHHHHHHHHHHH======HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#^^-s=H=----#ss-$--OO----#--H=-OHOOO------------HHHHHHHH=HHH==HH---O---HHHHHHHDDDHHHHH====HHHHHHHHHHHHH===HHHHHHHHHHHHHHHHHHHHHDDHHHHHHHHHHHHHHHH===HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH===HHHHHHHHHH==#
+D:#^^^#####----##---OO--###--XXX-OOO----#-------HHHHHHHHHHHHH=HHHH==---HHHHHHHHHHHHHHHHHHHHHHHHDDHHHHDDD==HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHDDHHHHH=H===HHHHHHHHHHHHHHHH=======HHHHHH===HHHHHHHHHHHHHH#
+D:#^^^------------OOO--###--XXX#----=H==H----HHHHHHHHHDDDDHH=HHH=HHHHHHHHHHHHDDDHHHHHHHHHDDHHHDDHHHHH=DD=HHHHHHDDHHHHHH===HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHDDDDHHHHHHHHHHHHH==H==HHHHHHHH====HHHHHHHHHH===#
+D:#^^--SStSSHHH--OO-HHH#--XXHH#---#H=H-HHH-HHHHHHHDDDDDHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHDDDHHHHHHHHHHHH====HHHHHHHHHHHHHHHHHHH====HHHHHHHHHHHHHHHHHHHH==H==HHHHHH=====HDDHHHHHDDDHHHH=#
+D:#^^^-sss-$----------#--###-----H=#-----HHHHHHHHHDDDDH=HH=HHH=HHH=HHHDDDHHHHHHHHHHDDHHHHHDDDHHHHHHHHHHHHHHHHDDDHHHHHHHHH===HHHHHHHHHHHHHHHHHHHH===HHHHHHHHHDDHDDDHHHHH=====HHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#^^--####-------###--------###-#-#---HHHHHHHHHHHHHHHHHH=HH=HH=HHHHHHDDDDHHHHHHHHH==HHHDDDHHHHHH==H=====HHDDHHHHHHHHHH===HHHHHHHHHHHHHHHHHHHHHHH===HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH==#
+D:#^^^----------##-----##-#-#-H==---HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH====HHHHHHHHHHHHH====HHHHHHHHHHHHHHHHHDDDHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH===#
+D:#^^^------##-#--##-###--#-------HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHDDDHHHHHH=====HHHHHHHHHHHHH===HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH=#
+D:#^^######-#-----------------HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH=#
+D:######################################################################################################################################################################################################
diff --git a/lib/mods/theme/edit/t_d_osgili.txt b/lib/mods/theme/edit/t_d_osgili.txt
new file mode 100644
index 00000000..bb21607b
--- /dev/null
+++ b/lib/mods/theme/edit/t_d_osgili.txt
@@ -0,0 +1,78 @@
+# File: t_d_osgili.txt
+
+# Osgiliath map and destruction by furiosity <furiosity@zionmainframe.net>
+
+# NB! This file assumes usage of the following files from the 'theme' module:
+# f_info.txt and t_pref.txt
+# Please download the module and refer to the files for the terrain feature definitions http://modules.t-o-m-e.net/
+# Don't forget to modify the maximum number of terrain features, etc. in misc.txt as well.
+
+#Anduin river
+F:a:227:3
+
+D:######################################################################################################################################################################################################
+D:# #################@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@########################## #
+D:# ######@@@@@@@@@@@@@@@@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@@@@@@@@@@@@@@@@@@@@@@@@@@#### ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+D:# #####@@@@@@@########@@@@@@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@@#####@@@#####@@@#####@@###### ,,, #
+D:# ####@@@@@@@@@,########@@@@@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@@@@#####,,,#####,,,#####,@@@@@##### ,,, #
+D:# ####@@@@@@@@@@,,########@@@@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@@@#####@@@#####@@@#####@,@@@@@@@##### ,,, #
+D:# ####@@@@########,@,@@@@@@@@@@@@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@@@@@,@@@@@@@,@@@@@@@,@@@@,,,,,@@@@@#### ,,, #
+D:# ####@@@@@,########,@,@@@@@@@@@@@@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@@@@@@,,,,@@@@,,,,@@@@,,,,@@@@@,,,,@@@#### ,,, #
+D:# $###@@@@@@@,@########@@,@@@@@@@@@@@@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@@@@@@#####@@@#####@@@#####@@@@#####@@@#### ,,, #
+D:# $$$@@@@@@@@@@@,,@@@@@@@@@,########@@@@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@@@@@@#####,,,#####,,,#####,,,@#####@@@@#####,,, #
+D:# $,,=@@@@@@########,@@@@@@@@,########@@@@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@@@@#####@@@#####@@@#####@@@@#####@@@@@@@#,,, #
+D:# ##=,,D@@@@@########,@@@@@@@@,########@@@@@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@@@@,@@@@@@@,@@@@@@@,@@@@@@@@,@@@@@@@@=,,=### #
+D:# ###@D,,D@@@@########@,@@@@@@@,@@@@@@@@@@@@@@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@@@,,,@@@@@,,,,@@@@,@@@@@@@,@@@@@@@=,,= ### #
+D:# ##@@@@D,,D@@@@@@@@@@@@@,@@@@D@@,@@@@@@@@@@@@@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@@@#####@@@#####@@@D@@@@#####@@@@=,,= ## #
+D:# ##@@@@@@D,,D@@@@@@@@@@@@@,@@DDD@@,@########@@@@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@@@@#####,,,#####,,DDD,,,#####@@@=,,= ## #
+D:# ##@@@@@#@@D,,D@@@@@########,@@D@@@@,########@@@@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@@#####@@@#####@@@D@@@@#####@@=,,= ## #
+D:# ##@@@@@@#@@@D,,D@@@@########,@@@@@@@,########@@@@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@@@@@@,@@@@@@@,@@@@@@@@@@@@,@@@=,,= DDDDD ## #
+D:# ##@@@@@@###@@@D,,D@@@########@,@@@@@@,@@@@@@@@@@@@@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@@@@@@@,@@@@@@@,@@@@@@,,,,,@@@=,,= DDDDDDD ## #
+D:# ##@@@@@@@###@@@@D,,D@@@@@@@@@@@@,@@@@@,@@@@@@@@@@@@@@@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@@#####@@@#####@@#####@@@@=,,= DDDDD ## #
+D:# ##@@@@@@@#####@@@@D,,D@@@@@@@@@@@@,,,@@@,@########@@@@@@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@@@#####,,,#####@@#####@@@=,,= ## #
+D:# ##@@@@@@@@#####@@@@@D,,D@@@@@@########,@@@,########@@@@@@@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@@@#####@@@#####@@#####@@=,,=,,,,,,,,,,,,,,,,,,,## #
+D:# ##@@@@@@###########@@@D,,D@@@@@########,@@@,########@@@@@@@@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@@@@@,@@@@@@@,@@@@@@,@@@=,,= ,,$$,,,#####,,###,, ## #
+D:# ##@@@@@@###########@@@@D,,D@@@@########@,@,@@@@@@@@@@@@@@@@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@@@@,,@@@@@@@@@,,,,,,@@@=,,= ,,#$$,,#####,,###,, ## #
+D:# ##@@@#################@@D,,D@@@@@@@@@@@@@,,,@@@@@@@@@@@@@@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@@#####@@@@@@@#####@@@@=,,= H ,,###############,, ## #
+D:# ##@@@@#################@@@D,,D@@@@@@@########,@@@@@@@@@@@@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@@@@#####,,,,,,,#####@@@=,,= HH ,,###############,, ## #
+D:# ##@@@@#################@@@@D,,D@@@@@@########,@@@@@@@@@@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@@@#####@@@@@@@#####@@=,,= HHH ,,,#############,,, ## #
+D:# ##@@@@@@@@@@@@@@@@@@@@@@@@@@D,,D@@@@@########@@@@@@@@@@@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@@@@@@@@@@@@@@@@@@@@@@@@=,,= HHHH ,,,#############,,, ## #
+D:# ################@@@@@@@@@@@@@@=,,=@@@@@@@@@@@@@@@@@@@@=##aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@@##=@@@@@@@@@@@@@@@@@=,,= HHHHH ,,,#########$$$$,,, ## #
+D:# ##D DDDDDDDDDDDDDDDD,,DDDDDDDDDDDDDDDDDDDDDD#aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa###DDDDDDDDDDDDDDDDDDD,,= ,,,###########$$,,, #
+D:# ##D,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,$$###########$$,, #
+D:# ##D,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,$############$$,, #
+D:# ##D,,cccccccccccDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD,,DDD#aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#DDDDDDDDDDDDDDDDDDD,,= ,,$##############,, CC #
+D:# ##D,,c %%%%% c@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@=,,=@=##@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@##=@@@@@@@@@@@@@@@@=,,=DDDDDDD ,,,##############,, #
+D:# ##D,,c %%=%=%% c@@@######@@@@@@@@@@@@@@@@@D@@@@@D,,D@@@@@@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@@@@@@@@@@@@@@@@@@@@=,,=D,,,,,D ,,$$#############,, #
+D:# ##D,,c%%%%%%%%%c@@@######@@@@@@@@@@@@@@@@DDD@@@D,,D@@@@@@@@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@@@@@=HHHHHHHHH=@@@@=,,=D,%%%,D ,,$$#############,, ## #
+D:# ##D,,c %%=%=%%,c@@@######@@@@@@@@@@@@@@@@@D@@@D,,D@@@@@@@@@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@@@@HHHHHHHHHHHHH@@@=,,=D,%%%DD ,,$$############$$, ## #
+D:# ##D,,c %%%%% ,c@@@######@@@@@@@@######@@@@@@D,,D@@@@@@@@@@@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@@@@@@=HHHHHHHHH=@@@@=,,=D,,,,,,,,,,############$$$, ## #
+D:# ##D,,ccccccccc,@@@@@@,@@@@@@@@@@@######@@@@@D,,D@@@@@@@@@@@@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@@@@@@@@@@@@@@@@@@@@@@=,,=DDDDDDD ,,,###########$$,,, ## #
+D:# ##D,,,,,,,,,,,,@@@@@@,@@@@@DD@@@@######@@@@D,,D##########@@@@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa=DDDDDDDDDDDDDDDDDDDDDD,, ,,,#############,,, ## #
+D:# ################@@@@@@,@@@DDDD@@@######@@@D,,D@##########@@@@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#############,,, ## #
+D:# ##@@@@@@@@@@@@@@######,@@@DD@@@@@@,@@@@@D,,D@@##########@@@@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa=DDDDDDDDDDDDDDDDDDDDDDD,, ,,#############$$,, ## #
+D:# ##@@@@@@@@@@@@@@######@,@@@@@@@@@,@@@@@D,,D@@@##,####,##@@@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@@@@@@@@@@@@@@@@@@@@@@@@@@=,,=HHHHH ,,###############,, ## #
+D:# ##@@@######@@@@######@@,@@######,@@@@D,,D@@@@@@,@@@@,@@@=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@@@@@@@@=HHHHHHHHHHH=@@@@@@=,,=HHHH ,,###,,#$$##,,#$$,, ## #
+D:# ##@@@######@@@@######@@@,@######,@@@D,,,,,,,,,,,,,,,,,,,aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@@@@@@@@HHHHHHHHHHHHH@@@@@@@=,,=HHH ,,$$#,,$$###,,$$#,, ## #
+D:# ##@@######@@@@@@,@@@@@@@,######,@@D,,D@@@@@@@@@@@@@@@@@=#########aaaaaaaaaaaaaaaaaaaaaaaaaa@@@@@@@@=HHHHHHHHHHH=@@@@@@@@=,,=HH ,,,,,,,,,,,,,,,,,,,## #
+D:# ##@######@@@@@@@,@@@@@@,######,@D,,D@@@@@@@@@@@@@@@@@@@@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@=,,=H , ## #
+D:# ##@@@,@@@@@@@@@@,@@@@@@@,,,,,,,D,,=DDDDDDDDDDDDDDDDDD=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa=DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD,,= , DDDDD ## #
+D:# ##@@@,@@@@@@@@@,@@@@@@@@,@@@@D,,,,,,,,,,,,,,,,,,,,,,aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, DDDDDDD ### #
+D:# ##@@@@,######@,@######,@@@@D,,=DD,DDDDDDDDDDDDDDDDD=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa=DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD,, DDDDD ## #
+D:# ##@@@,######@,@######,@@@D,,D@@D,D@@@@@@@@@@@@@@@@@@@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@=,,= ## #
+D:# ##@@,######@,@######,@@D,,D@@@D,D@@@@@@@@@@@@@@@@@@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@@@@@#####@@@@@@@@@@@@@@@@@@@@#####@@@=,,= ## #
+D:# ##@,######@,@######,@D,,D#####,#####@@@@@@@@@@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@@@#####,,,,,,,,,,,,,,,,,,,,#####@@@@=,,= ### #
+D:# ##@,,,@@@@,@@@,,,,@D,,D@#k@=H,H=@m#@@@@@@@@@@@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@@@@#####@@@@@@@@@@@@@@@@@@@@#####@@@@@=,,= ## #
+D:# ##@@@,,,,,,,,@@@@D,,D@@#@@#H,H#@@#@@@@@@@@@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@@@@,@@@@@@@@@@@@@@@@@@@@@@@@,,,,@@@@@=,,= ## #
+D:# ###@@@@@@@D@@@@D,,D@@@#@@#H,H#@@#@@@@@@@@@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@@@#####@@@@@@@@=@@@@@@@@@@@@@@#####@@@@=,, =##$ #
+D:# ###@@@@DDD@@D,,D@####@##H,H##@####@@@@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@@@#####@@@@@@@@@@@@@@@,,,,,,,,#####@@@@@=,,,,, #
+D:# ###@@@D@@D,,D@@#@@@@# H,H #@@@@#@@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@@@@@@#####@@@@@@@@@@@@@@,@#####@@#####@@@@@##$$ #
+D:# ###@@@D,,D@@@#@@@@# H,H #@@@@#@@@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@@@@@@@@@,@@@@@@@@@@,,,,,,@@#####@@@@@@@@@#### #
+D:# ##$=,,D@@@@####@##H,H##@####@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@@@@@@@#####@@@@@@@,@#####@@#####@@@@@@@#### #
+D:# ,=@@@@@@@@#@@#H4H#@@#@@@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@@@@@@@@#####@@,,,,,@@#####@@@@@@@@@@@@#### #
+D:# $##@@@@@@@#@@#####@@#@@@@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@@@@@@@#####@,#####@@#####@@@@@@@@@#### #
+D:# ###@@@@@#l@@@@@@@H#@@@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@@@@@@@@@@@@,@@,@#####@@@@@@@@@@@@@##### #
+D:# ###@@@###########@@@@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@@@@@@@@@@@@@@@@,@@@#####@@@@@@@@@@#### #
+D:# ###@@@@@@@@@@@@@@@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@@@@@@@@@@@@@@@@@@@@@@@@@@@@###### #
+D:# ###############@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@############################## #
+D:###################################################################################################################################################################################################### \ No newline at end of file
diff --git a/lib/mods/theme/edit/t_d_pelar.txt b/lib/mods/theme/edit/t_d_pelar.txt
new file mode 100644
index 00000000..246f2d34
--- /dev/null
+++ b/lib/mods/theme/edit/t_d_pelar.txt
@@ -0,0 +1,78 @@
+# File: t_d_pelar.txt
+
+# Pelargir map and destruction by furiosity <furiosity@zionmainframe.net>
+
+# NB! This file assumes usage of the following files from the 'theme' module:
+# f_info.txt and t_pref.txt
+# Please download the module and refer to the files for the terrain feature definitions http://modules.t-o-m-e.net/
+# Don't forget to modify the maximum number of terrain features, etc. in misc.txt as well.
+
+#Anduin river
+F:a:227:3
+
+D:######################################################################################################################################################################################################
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@%%%%%@##%%%%%@@HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH# #
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@%%%%%@####%%%%%@HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@%%%%%@######%%%%@@@HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@%%%%%@####@###%%%%%@@HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@%%%%%@####@@####%%%%%@@HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@%%%%%@####@@@@####%%%%%@@@HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@%%%%%@####@@@@@@#####%%%%%@@@HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@%%%%%@####@####@@@@#####%%%%%@@HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@%%%%%@####@####@@@@@@#####%%%%%@@@HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@%%%%%@####@####@@@@@@@@@#####%%%%%@@@HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@%%%%%%%###@@@@@@@DDDD@@@@@@#####%%%%%@@@HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@%%%%%%%%##@@@@DDDD@DDDD@@@@@@@#####%%%%%@@@HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@%%%%%%%%%%@@@DDDD@@@DDDD@@@@@@@@@#####%%%%%@@@HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@%%%%%%%%%%@@DDDD@@@@@@@@@@@@@@@@@@@@#####%%%%%@@@@HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@%%%%%%%%%%@DDDD@@@@###@@@@@@#######@@@@@#####%%%%%@@HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@%%%%%%%%%%@@@@@@@@@####@@@@@#######@@@@@@@#####%%%%%@@@HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@%%%%%%%%%%@@@@@@@@@@####@@@@#######@@@@@@,,,,#####%%%%%@@@HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@%%%%%%%%%%@@@@@@@@@@@####@@@@@@@@@@@@@,,,,@@@@@@##%%%%%%%%@@@HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHaa#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@%%%%%%%%%#@@@@@@@@@@@@####@@@@@@@@@,,,,@@@@@@@@@#%%%%###%%%%%@@@@HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHaaaaa#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@%%%%%%%%##@@#######@@@@#######@@,,,,@@@@@@@@@@@#%%%%#@@#####%%%%%@@HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHaaaaaaa#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@%%%%%@####@@#######@@@@#####,,,,,@@@@DDD@@@@@@#%%%%#@@@@@#####%%%%%@@@HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHaaaaaaaaaaa#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@%%%%%@####@@#######@@@@###,,,.@@@@@@DDDDD@@@@#%%%%#@@@@@@@@@#####%%%%%@@@HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHaaaaaaaaaaaaaa#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@%%%%%@####@@#######@@@@#,,,##,###@@@@DDD@@@@#%%%%#@@@@####@@@@@#####%%%%%@@@HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHaaaaaaaaaaaaaaaaa#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@%%%%%@####@@@@@@@@@@@@@,,,,##,,,####@@@@@@@#%%%%#,@@@@####@@@@@@@@#####%%%%%@@@@HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHaaaaaaaaaaaaaaaaaaa#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@%%%%%@####@@@@@@@@@@,,,,@@@##,,,,,,####@@@#%%%%#@@,@@@####@@@@@@@@@,@#####%%%%%@@HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHaaaaaaaaaaaaaaaaaaaaaaa#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@%%%%%@####@@@@@@@,,,,@@@@@@##,,,,,,,,,####%%%%#@@@@,,,,@@@@@@@@@@@@@,@@@#####%%%%%@@@HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHaaaaaaaaaaaaaaaaaaaaaaaaa#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@%%%%%@####@@@@,,,,@@@DDD@@@##,,,,,,,,,,,,,,,,#@@@@@@@@,,,,@@@@@@@@@@,,,,,,,#####%%%%%@@@HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHaaaaaaaaaaaaaaaaaaaaaaaaaaaa#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@%%%%%@####@,,,,@@@@@DDDDD@,##,,,,,,,,,,,,,,,$###@@@@@@@@@,,,@@@@@@@@,@@@@@@@@@#####%%%%%@@@HHHHHHHHHHHHHHHHHHHHHHHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH,,,,,,,,,,,,,@@@@@@@@@DDD@@@##,,,,,,,,,,,,,,,,,,####@@@@@@,@@,,,@@@@@,@@@@@@@@@@@@#####%%%%%@@@HHHHHHHHHHHHHHHHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@%%%%%@####@@@@@@@@@@@@@@@@@##,,,,,,@####,,,,,,,,,,####@@@,@@@@@,@#######@@@@@@@@@@@@#####%%%%%@@@HHHHHHHHHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@%%%%%@#######################,,,,,########,,,,,,,,,,,####,@@@@@@,#######@@@@@@@@@@@@@@@#####%%%%%@HHHHHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH,%%%%%%%%%%%%%%%%%%%%%%%%%%%,,,,,,##########,,,,,,,,,,,,,CCCC@@#############@@@@@@@#####@@@#####%%%%%@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH,%%%%%%%%%%%%%%%%%%%%%%%%%%%,,,,,,,########,,,,,,,,,,,,,,,,,,,,#############,,,,,,,,,$@@@@@@@@#####%%%@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@%%%%%%%%%%%%%%%%%%%%%%%%%%%,,,,,,,,,####,,,,,,,,,,aaaaaa$###@@#############@@@@@@@#####@@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@%%%%%@#####################CC,,,,,,,,,,,,,,,,,,,,,,aaaaaaaaa@@@@@#######@@@@@@@@@@@@@@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@%%%%%@####@@@@@@@@@@@@,,,,,CC,,,,,,,,,,,,,,,,,,,,####aaaaaaaa@@@@#######@@@@@@@@@@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@%%%%%@####@@#####@@@@,@@@@@CC,,,,,,,,,,,,,,,,,,###@@@@@aaaaaaaa@@@@@@@@@@@@@@@@@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@%%%%%@####@@#####,,@,@@@@@@CC,,,,,,,,,,,,,,,,,###@@@@@####aaaaaaaa@@@@@@@@@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@%%%%%@####@@#####@@,@@####@CC,,,,,,,,,,,,,,,,aaa##@@@@#######@aaaaaaaa@@@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@%%%%%@####@@@@,@@@@,,,####@CC,,,,,,,,,####aaaaaaa##@@@#######@@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@%%%%%@####@@@@,@@@@,@@####@CC,,,,,$$###@@##aaaaaaa##@@@@@@@@@@@@@@@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@%%%%%@####@@##@@@@@@,@@@@@@CC,,####@@@@@@@##aaaaaaa##@@@@@@@@@@@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@%%%%%@####@@#@@@$@@@@,@@@@@CC,###@@@@@@@@@@##aaaaaaa##@@@@@@@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@%%%%%@####@@####$@@@@@,@@@@#,###@@@@@@@@@@@@##aaaaaaa##aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@%%%%%@####@@@@,@@@@@@@@,@@@,,@@@@@#######@@@@##aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@%%%%%@####@@@@,@@@@@,@@,,,,@,@@@@@#######@@@@@#aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@%%%%%@####@@@@@$,@@@@@,##$$$@,@@@@#######@@@@@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@%%%%%@####@@##@@@@@@@,@##$##@@,@@@#######@@@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@%%%%%@####@@#####@@@,@@#####@@@,@@@@@@@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@%%%%%@####@@@@,@@@@,@@@@@@@@@@@@,@@@@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@%%%%%@####@@@@,@@@,@@@@@@@@@@@@@@,@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@%%%%%@####@@#####@,@@####$@@@@@@@@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@%%%%%@####@@@@###@,@@#@@@@@@@@@@@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@%%%%%@####@@###@@@,@@###@@@@@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@%%%%%@####@@@,@@@@,@@@@@@@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@%%%%%@####@@#@@@@@,@@@@@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@%%%%%@####@@@@#@@@,aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@%%%%%@####@@@@@@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@%%%%%@####@@@@@@#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@%%%%%@####@@@#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@%%%%%@##########aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@%%%%%@#######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@%%%%%@####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#
+D:#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH@%%%%%@##aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#
+D:###################################################################################################################################################################################################### \ No newline at end of file
diff --git a/lib/mods/theme/edit/t_d_thrand.txt b/lib/mods/theme/edit/t_d_thrand.txt
new file mode 100644
index 00000000..156dbb43
--- /dev/null
+++ b/lib/mods/theme/edit/t_d_thrand.txt
@@ -0,0 +1,75 @@
+# File: t_d_thrand.txt
+
+# Thranduil's Halls map and destruction by furiosity <furiosity@zionmainframe.net>
+
+# NB! This file assumes usage of the following files from the 'theme' module:
+# f_info.txt and t_pref.txt
+# Please download the module and refer to the files for the terrain feature definitions http://modules.t-o-m-e.net/
+# Don't forget to modify the maximum number of terrain features, etc. in misc.txt as well.
+
+D:######################################################################################################################################################################################################
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#%%%%%%^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#%%%%%%%%%%%%%%%%%%%%%%%%===^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#%%%%%%%%%%%%%%%%%%%%%===^^^^===%%%%^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^%%%%===^^^^===%%%%%%%%%%%%%%^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:# ===^^^===%%%%%%%%%%%%%%%%%%%%%%%^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:# ===^^^^^^^%%%%%%%%%%%%%%%%%%%%%%%%^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:# ^^^^^^^^%%%%%%%%%%%%%%%%%%%%%%%^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:# ^^^^%%%%%%%%%%%%%%%%%%%%%%%%%^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:# ^^^^%%%%%%%%%%%%%%%%%%%%%%%%%%%%^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:# ^^^^^^%%%%%%%%%%%%%%%%%%%%%%%%%%%%%^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:# ^^^^^%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:# ^^^^^%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:# ^^^^^^%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:# ^^^^^^^^^^^%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:# ^^^^^%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:# ^^^^^^^^%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:# ^^^^^^^^^^^^^%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:# ^^^^^%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:# ^^^^^^^^^^^^%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:# ^^^^^^^^^%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:# ^^^^^^%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%^^^^^^^^^^^^^^^^^^^^^^^^CCC^^^^^^#
+D:# ^^^^^%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%^^^^^^^^^^^^^^^^^^^CCC^^^^^#
+D:# ^^^^^^^^^^^^%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%^^^^^^^^^^^^^^^CCC^^^^#
+D:# ^^^^^^%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%^^^^^^^^^^^CCC^^^#
+D:# ^^^^%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%^^^^^^^^^CCC^^#
+D:# ^^^^^^^%%%%%%%%%%%%%%%%%%%%%%%%%%%%%^^^^CCC^#
+D:# ^^^^^^^^%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#
+D:###################################################################################################################################################################################################### \ No newline at end of file
diff --git a/lib/mods/theme/edit/t_dale.txt b/lib/mods/theme/edit/t_dale.txt
new file mode 100644
index 00000000..5c2dcf6c
--- /dev/null
+++ b/lib/mods/theme/edit/t_dale.txt
@@ -0,0 +1,96 @@
+# File: t_dale.txt
+
+# Dale (rebuilding) map by furiosity <furiosity@zionmainframe.net>
+# NB! The additional terrain features and stores (if any) assume usage of the following files from the 'theme' module:
+# f_info.txt, t_pref.txt, st_info.txt, and ba_info.txt
+# Please download the module and refer to the files for the terrain feature definitions http://modules.t-o-m-e.net/
+# Don't forget to modify the maximum number of terrain features, etc. in misc.txt as well.
+
+### Additional terrain features ###
+
+#light post
+F:l:221:3
+
+# Wooden boards (4 kinds)
+F:=:233:3
+F:[:234:3
+F:_:235:3
+F:]:236:3
+
+### Buildings ###
+
+# Bard's Hut
+F:b:74:3:0:0:0:0:0:77
+
+# Construction Supply Store
+F:c:74:3:0:0:0:0:0:63
+
+# Builder Barracks
+F:i:74:3:0:0:0:0:0:71
+
+D:######################################################################################################################################################################################################
+D:# #
+D:# #
+D:# #
+D:# #
+D:# #
+D:# #
+D:# #
+D:# #
+D:# #
+D:# #
+D:# #
+D:# #
+D:# #
+D:# #
+D:# #
+D:# @@@@@@@@@@@@@@@@ #
+D:# @@WWWWWWWWWWWWWWWW@@ #
+D:# @@@WWWWWWWWWWVWWWWWWWWW@ #
+D:# @WWWWWWWWWWWVVVWWWWWWWWWW@ #
+D:# @WWWWWWWWWWWVWWWWWWWWWWW@############### #
+D:# @@@@WWWWWWWWWWWWWWWWW@@@-------------------------------------------------------------------------------------- #
+D:# @WWWWWWWWWWW@@@@@@------------------------------------------------------------------------------------------ #
+D:# @W@@@@@@@@@@@@--StSSSSS--------------------------------------------TTT----------------------------------------- @@@@@@ #
+D:# @W#-------------sssssss-------------------------------------------TTTTT------------------------------------------- @@WWWWWW@ #
+D:# @W#-------------#######--------------------------------------------TTT----------------------------------------- @@WWWWWWWWWW@@@ #
+D:# @W#-------------###c###------------------------------------------------------------------------------------------------- @WWWWWWWWWWWWWWW@@ #
+D:# @W#-----------l----@----l-----------------------------------------------------------------------------------------------------@WWWWWWWWWWWWWWWW@ #
+D:# ##----------------@---------------------------------------l-----------------------------------------------------------------]]]]]]]]]]]]]]]]]]@ #
+D:#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@,,,,,,,,,,,,,,,,,,@@@@@@@@@@@@@@@@@@@@@#
+D:# #-----------------@---------------------------------------@----SSStS------------------------------------------------------@]]]]]]]]]]]]]]]]]]@ #
+D:# #------------------@---------------------------------------@-E-sssss-----------------------------------------------------@WWWWWWWWWWWWWWWW@@@ #
+D:# #-------------------@---------------------------------------@--#####------------------------------------------------------@@@WWWWWWWWWWWWWW@ #
+D:# #--------------------@---------------------------------------@-##b##---------------------------------------------------------@@@WWWWWWWWW@@ #
+D:# #---------------------@---------------------------------------@@@@---l----------------------------------------------------------@@@@@@@@@@ #
+D:# #----------------------@-------------------------------------@----@---------------------------------------------------------------------- #
+D:# #-----------------------@-----------------SSS---------------@------@---------------------------------------------------------------------- #
+D:# #------------------------@--------------sssss--------------@--------@---------------------------------------------------------------------- #
+D:# #-------------------------@---------#########-------------@----------@---------------------------------------------------------------------- #
+D:# #--------------------------@--------#########------------@------------@---------------------------------------------------------------------- #
+D:# #---------------------------@------@---------------,@@@@@--------------@---------------------------------------------------------------------- #
+D:# #----------------------------@@@@@@@------------------------------------@---------------------------------------------------------------------- #
+D:# #--------------------------------------------l---------------------------@---------------------------------------------------------------------- #
+D:# #-------------------------------------------------------------------------@---------------------------------------------------------------------- #
+D:# #--------------------------------------------------------------------------@l--------------------------------------------------------------------- #
+D:#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#
+D:# #--------------------------------------------------------------------------l-@--------------UUUUUUYUUUU-----------------------------------------------------------#
+D:# #-----------------------------------------------------------------------------@-------------XXXXXXXXXXX-----------------------------------------------------------#
+D:# #------------------------------------------------------------------------------@------------___________-----------------------------------------------------------#
+D:# #-------------------------------------------------------------------------------@l----------]]]]]i]]]]]-----------------------------------------------------------#
+D:# #-------------------------------------------------------------------------------l@@@@@@@@@@@@@@@@@------l---------------------------------------------------------#
+D:# --#---------------------------------@@@@@---------------------------------------------------------------------------------------------------------------------------#
+D:# ----#--------------------------------@WWWWW@--------------------------------------------------------------------------------------------------------------------------#
+D:# -----T#-------------------------------@WWWWWWW@-------------------------------------------------------------------------------------------------------------------------#
+D:# -------TT#------------------------------@WWWWWWWWW@------------------------------------------------------------------------------------------------------------------------#
+D:# ----------------------------------------------@WWWWWWWWWWW@-----------------------------------------------------------------------------------------------------------------------#
+D:# --------------------------------------------@WWWWWWWWW@------------------------------------------------------------------------------------------------------------------------#
+D:# ------------------------------------------@WWWWWWW@-------------------------------------------------------------------------------------------------------------------------#
+D:# ----------------------------------------@WWWWW@--------------------------------------------------------------------------------------------------------------------------#
+D:# --------------------------------------@@@@@---------------------------------------------------------------------------------------------------------------------------#
+D:# --------------------------------------------------------------------------------------------------------------------------------------------------------------------#
+D:# ------------------------------------------------------------------------------------------------------------------------------------------------------------------#
+D:# ------------------------------------------------------------------------------------------------------------------------------------------------------------------#
+D:# -------------------------------------------------------------------------------------------------------------------------------------------------------------------#
+D:# -----------------------------------------------------------------------------------------------------------------------------------------------------------------------#
+D:###################################################################################################################################################################################################### \ No newline at end of file
diff --git a/lib/mods/theme/edit/t_edoras.txt b/lib/mods/theme/edit/t_edoras.txt
new file mode 100644
index 00000000..a4257661
--- /dev/null
+++ b/lib/mods/theme/edit/t_edoras.txt
@@ -0,0 +1,117 @@
+# File: t_edoras.txt
+
+# Edoras map by furiosity <furiosity@zionmainframe.net>
+# NB! The additional terrain features and stores (if any) assume usage of the following files from the 'theme' module:
+# f_info.txt, t_pref.txt, st_info.txt, and ba_info.txt
+# Please download the module and refer to the files for the terrain feature definitions http://modules.t-o-m-e.net/
+# Don't forget to modify the maximum number of terrain features, etc. in misc.txt as well.
+
+### Additional terrain feature ###
+
+# Stable
+F:m:240:3
+
+### Buildings ###
+
+#Meduseld
+F:k:74:3:0:0:0:0:0:82
+
+#Inn
+F:i:74:3:0:0:0:0:0:72
+
+#Map store
+F:a:74:3:0:0:0:0:0:66
+
+#Music store
+F:c:74:3:0:0:0:0:0:64
+
+#The Library
+F:g:74:3:0:0:0:0:0:13
+
+#Rune shop
+F:r:74:3:0:0:0:0:0:62
+
+#The Beastmaster
+F:b:74:3:0:0:0:0:0:16
+
+#Fighters Hall
+F:d:74:3:0:0:0:0:0:17
+
+#Tower of Magery
+F:h:74:3:0:0:0:0:0:18
+
+#Inner Temple
+F:j:74:3:0:0:0:0:0:19
+
+#Paladins Guild
+F:l:74:3:0:0:0:0:0:20
+
+#Rangers Guild
+F:n:74:3:0:0:0:0:0:21
+
+D:######################################################################################################################################################################################################
+D:#-----------------------------------------------------------------------------------------#####OOOOOOO#####,,,,,,,,----------------------------------------------------------------------------------#
+D:#-------------------------------------------------------------------------------###########OOOOOOOOOOOOOOO#########,,,,,,,,,,,,,,,,,-----------------------------------------------------------------#
+D:#----------------------------------------------------------------------------######OOOOOOOOOOOOOOOOOOOOOOOOOOOOOO#######------------,,---------------------------------------------------------------#
+D:#-------------------------------------------------------------------------#####OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO######----------,,-------------------------------------------------------------#
+D:#---------------------------------------------------------------------###########OOOOOOO#######################################---------,,-----------------------------------------------------------#
+D:#------------------------------------------------------------------#####-------OOO----OO--------------------------------------###---------,,---------------------------------------------------------#
+D:#----------------------------------------------------------------###----------OOO------OO--------------------OOOOOOOOOOOOOOOOOO-###---------,,-------------------------------------------------------#
+D:#-------------------------------------------------------------####----------OOO---------OO-------------------O################O---###---------,,-----------------------------------------------------#
+D:#-----------------------------------------------------------###-----------OOO----------OOOOOOOOOOOOOOOO------O################O-----###---------,,---------------------------------------------------#
+D:#---------------------------------------------------------###-----------OOOOO----------O####2####O----OO-----O################O-------###---------,,-------------------------------------------------#
+D:#-------------------------------------------------------###-----------OOO--OO----------O#########O-----OO----O###1########i###O---------###---------,,-----------------------------------------------#
+D:#-----------------------------------------------------###-----------OOO----OO----------O#########O------OOOOOOOOOOOOOOOOOOOOOOO-----------###---------,,---------------------------------------------#
+D:#----------------------------------------------------###-----------OOO-----OO----------O####2####O-------------------------OO--OO--######--###---------,---------------------------------------------#
+D:#---------------------------------------------------###-----------OOO------OO----------OOOOOOOOOOO--------------------------OO--OO-######----###-------,---------------------------------------------#
+D:#--------------------------------------------------###-----------OOO--OOOOOOOOOOOOOOOOO-----------------------------#####6OOOOO--OO4#####------##-------,,-------------------------------------------#
+D:#-------------------------------------------------###-----------OOO---O####3####O-----------------------------------######----OO--OO------------##--------,,-----------------------------------------#
+D:#------------------------------------------------###-----------OOO----O#########O-----------####################----######-----OO--OO----######--##---------,,---------------------------------------#
+D:#-----------------------------------------------###-----------OOO-----O#########O---------####---OOOOOOOOOOOOO####--------------OO--OOOOO######---##----------,,-------------------------------------#
+D:#----------------------------------------------###-----------OOO------O####3####O-------####----OO-----------OOOO###------#####9OOO--OO--5#####----##-----------,,-----------------------------------#
+D:#---------------------------------------------###-----------OOO-------OOOOOOOOOOO-----####------OO-------------OOOO###----######--OO--OO-----------##-------------,,---------------------------------#
+D:#--------------------------------------------###-----------OOO--------O--------------###--------OO---------------OOOO###--######---OO--OOOO0#####---##-------------,---------------------------------#
+D:#-------------------------------------------###-----------OOO----------O-----------###----------OO-----------------OOOO##-----------OO--OO-######----##------------,---------------------------------#
+D:#-------------------------------------------##-----------OOO-OOOOOOOOOOOOO--------##------------OO-------------------OOO##----#####aOOO--O-######----##------------,---------------------------------#
+D:#------------------------------------------##-----------OOO--O###########O------###-------------OO---------------------OO##---######--OOOOOOO---------##-----------,---------------------------------#
+D:#------------------------------------------##----------OOOOOOOr#########rO-----##---------------OO----------------------OO##--######---#c##g#---------##-----------,---------------------------------#
+D:#------------------------------------------##----------OOO---O###########O----###---------------OO#########--------------OO##----------######---------##-----------,---------------------------------#
+D:#------------------------------------------##----------OOO---OOOOOOOOOOOOO---###----------------OO-----######-------------OO##---------######----------##----------,,--------------------------------#
+D:#------------------------------------------##---------OOOO-------------------##-----------------OO---------####------------OO##------------------------##-----------,--------------------------------#
+D:#------------------------------------------###########MMMM#####################-----------------OO-----------###-----------OO############################-----------,--------------------------------#
+D:#------------------------------------------###########IIII#####################--------------###kk###---------###----------OO############################-----------,--------------------------------#
+D:#------------------------------------------###########IIII#####################--------------########----------##-----------OO###########################-----------,,-------------------------------#
+D:#------------------------------------------###########IIII#####################--------------########----------##-----------OO###########################------------,-------------------------------#
+D:#------------------------------------------###########IIII#####################--------------########----------##------------OO##########################------------,-------------------------------#
+D:#------------------------------------------###########IIII#####################--------------########----------##------------OO##########################------------,,------------------------------#
+D:#------------------------------------------###########IIII######################-------------########----------##-#######----OO##########################-------------,,-----------------------------#
+D:#------------------------------------------###########MMMM######################------------------------------##--######dOOOOOO##########################--------------,-----------------------------#
+D:#-------------------------------------------##--------OOOOOOOOO----------------###---------------------------###--######dOOOOOO##----------------------##--------------,-----------------------------#
+D:#-------------------------------------------##-------------##OO------#######----###-------------------------###---#######---OOO##----------------------##--------------,-----------------------------#
+D:#-------------------------------------------##-------------##OOOOOOOO#######-----###-----------------------###---------------OO##----------------------##--------------,-----------------------------#
+D:#-------------------------------------------##--------------##OOOOOOO#######------###--------------------####----------------OO##----------------------##--------------,,----------------------------#
+D:#--------------------------------------------##-------------##O------#######--------###----------------####---#######-------OOO##---------------------##-----------------,,--------------------------#
+D:#--------------------------------------------##-------------##OO----------------------###################-----#######------OOO##----------------------##------------------,,-------------------------#
+D:#---------------------------------------------##-------------##OO-------------------------###########---------###n###-----OOO##----------------------##--------------------,-------------------------#
+D:#---------------------------------------------##--------------##OO------------#######-----------------#######----OOOO----OOO##----------------------##---------------------,-------------------------#
+D:#----------------------------------------------##--------------##OOO----------#######-----------------#######-------OO-OOOO##----------------------##----------------------,-------------------------#
+D:#-----------------------------------------------##--------------##OOOO--------###h###-----------------###l###--------OOOOO##----------------------##-----------------------,-------------------------#
+D:#-----------------------------------------------###--------------##OOOO----------O---------#######-------OOOOO-------OOOO##----------------------##------------------------,,------------------------#
+D:#------------------------------------------------###--------------###OOOO--------O---------#######-----------OO-----OOOO##----------------------##--------------------------,------------------------#
+D:#-------------------------------------------------###---------------###OOOO------O---------###j###------------OO--OOOO###----------------------##---------------------------,,-----------------------#
+D:#--------------------------------------------------###----------------####OOOO---O------------O----------------OOOOO###-----------------------##-----------------------------,-----------------------#
+D:#---------------------------------------------------###------------------###OOOOOOO-----------O------------OOOOOO####------------------------##------------------------------,-----------------------#
+D:#----------------------------------------------------###-------------------######OOOOOOOOOOOOOOOOOOOOOOOOOOOO#####--------------------------##-------------------------------,--TTT------------------#
+D:#------------------------------------------------------##---mmmmmmmmmmmmmm------######OOOOOOOOOOOOOOOOOOO######------mmmmmmmmmmmmmmmmm----###--------------------------------,----TTT----------------#
+D:#-------------------------------------------------------###---mmmmmmmmmmmmmmmmm----###########OOOOO#########------mmmmmmmmmmmmmmmmmmm----###---------------------------------,-#####-TT--------------#
+D:#---------------------------------------------------------###---mmmmmmmmmmmmmmmmmm------------OOOOO-----------mmmmmmmmmmmmmmmmmmmmmm---###-----------------------------------,,7####-TT--------------#
+D:#-----------------------------------------------------------###---mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmbmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm---###---------------------------------TTTT--#####-TT--------------#
+D:#-------------------------------------------------------------###----mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm---###------------------------------------TTTT----TTT----------------#
+D:#---------------------------------------------------------------####---mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm-----###----------------------------------------TTT--TTT-----------------#
+D:#------------------------------------------------------------------###----mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm-------###-------------------------------------------------------------------#
+D:#--------------------------------------------------------------------####-----mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm------#####---------------------------------------------------------------------#
+D:#-----------------------------------------------------------------------#####-------mmmmmmmmmmmmmmmmmmmmmmmmmm----------#####------------------------------------------------------------------------#
+D:#--------------------------------------------------------------------------######--------------------------------#########---------------------------------------------------------------------------#
+D:#-----------------------------------------------------------------------------###########----------------############--------------------------------------------------------------------------------#
+D:#-----------------------------------------------------------------------------------########################-----------------------------------------------------------------------------------------#
+D:###################################################################################################################################################################################################### \ No newline at end of file
diff --git a/lib/mods/theme/edit/t_esga.txt b/lib/mods/theme/edit/t_esga.txt
new file mode 100644
index 00000000..6665e914
--- /dev/null
+++ b/lib/mods/theme/edit/t_esga.txt
@@ -0,0 +1,105 @@
+# File: t_esga.txt
+
+# Esgaroth map by furiosity <furiosity@zionmainframe.net>
+# NB! The additional terrain features and stores (if any) assume usage of the following files from the 'theme' module:
+# f_info.txt, t_pref.txt, st_info.txt, and ba_info.txt
+# Please download the module and refer to the files for the terrain feature definitions http://modules.t-o-m-e.net/
+# Don't forget to modify the maximum number of terrain features, etc. in misc.txt as well.
+
+### Additional terrain features ###
+
+#Wooden board - horizontal
+F:a:233
+
+# Wooden board - vertical
+F:b:234
+
+#Light wooden board - horizontal
+F:c:235
+
+#Wooden plank
+F:e:241
+
+### Buildings ###
+
+#The Dancing Dragon
+F:i:74:3:0:0:0:0:0:73
+
+#The Master's House
+F:k:74:3:0:0:0:0:0:83
+
+#The Library
+F:l:74:3:0:0:0:0:0:13
+
+#The Music Store
+F:m:74:3:0:0:0:0:0:64
+
+#The Hunter store
+F:n:74:3:0:0:0:0:0:61
+
+D:######################################################################################################################################################################################################
+D:#WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWbWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWbWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWbWWWWccWWWWbWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWbWWWWccc,,cWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWbWWWWccc,,,,,,cWWWWbWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWbWWWWccc,,StSSS,,,cWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWbWWWWccc,,,,,sssss,,,,cWWWWbWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWbWWWWccc,,UUUUU,##9##,,,,,cWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#WWWWWWWWWWWWWWWWWWWWWWWWWWWbWWWWeeeO,,,,XXXXX,,,O,,,,,,,,cWWWWbWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#WWWWWWWWWWWWWWWWWWWWWWWWbWWWWccc,,,,O,,,##6##,,,O,,UUUUU,,cWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#WWWWWWWWWWWWWWWWWWWWWbWWWWccc,,,,,,,,OOOOOO,,,,,O,,XXXXX,,,cWWWWbWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#WWWWWWWWWWWWWWWWWWbWWWWccc,,,,,,,,SSStS,,,O,,,,,O,,##4##,,,,cWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#WWWWWWWWWWWWWWWbWWWWccc,,,,,,,,,,,sssss,,,O,,,,,OOOOOOOO,,,,,cWWWWbWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#WWWWWWWWWWWWbWWWWccc,,,,SSStS,,,,,##5##,,,O,,,,,,,,,,,,O,,,,,,cWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#WWWWWWWWWbWWWWccc,,,,,,,sssss,,,,,,,O,,,,,O,,,,,,,,,,,,O,,,,,,,cWWWWbWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#WWWWWWbWWWWccc,,,UUUUU,,##2##,,,,,,,O,,,,O,,,,,,,,,,,,,O,,SStSS,cWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#WWWWWWWWWWWc,,,,,XXXXX,,,,O,,,,,,,,,O,,,O,,SSSStSSSSSS,O,,sssss,,cWWWWbWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#WWWWWWWbWWWWc,,,,##3##,,,,O,,,,,,,,,O,,O,,,sssssssssss,O,,##0##,,,cWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#WWWWWWWWWWWWWc,,,,,OOOOOOOOOOOOOOOOOO,O,,,,#####k#####,O,,,,O,,,,,,cWWWWbWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#WWWWWWWWWbWWWWc,,,,,,,,,,,O,,,,,,,,,,OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOeWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#WWWWWWWWWWWWWWWc,,,UUUUU,,O,,,,,,,,,,,,,,,,,,,,,,,,,,,,,O,,,,,,,,,,,,cWWWWbWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#WWWWWWWWWWWbWWWWc,,XXXXX,,O,,SSStS,,,,,,,eeeeeeeee,,,,,,,O,,,UUUUU,,,,cWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#WWWWWWWWWWWWWWWWWc,#####,,O,,sssss,,,,,eeWWWWWWWWee,,,,,,,O,,XXXXX,,,,,cWWWWbWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#WWWWWWWWWWWWWbWWWWc,,OOOOOO,,##m##,,,,eWWWWWWWWWWWWe,,,,,,,O,##n##,,,,,,cWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#WWWWWWWWWWWWWWWWWWWc,,,,,,,O,,,O,,,,,eWWWWWWWWWWWWWWe,,,,,,,O,,O,,,,,,,,,cWWWWbWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#WWWWWWWWWWWWWWWbWWWWc,,,,,,,OOOO,,,,eWWWWWWWWWWWWWWWWe,,,,,,,O,O,,SSSSS,,,cWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#WWWWWWWWWWWWWWWWWWWWWc,,,,,,,O,,,,,,eWWWWWWWWWWWWWWWWWe,,,,,,,O,,,sssss,,,,cWWWWbWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#WWWWWWWWWWWWWWWWWbWWWWc,,,,,,,O,,,,,eWWWWWWWWWWWWWWWWWWe,,,,,,,O,,#####,,,,,cWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#WWWWWWWWWWWWWWWWWWWWWWWc,,,,,,,O,,,,,eWWWWWWWWWWWWWWWWWe,,,,,,,,O,,,O,,,,,,,,cWWWWbWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#WWWWWWWWWWWWWWWWWWWbWWWWc,,,,,,,O,,,,,eWWWWWWWWWWWWWWWeO,,,,,,,,,O,,O,,UUUUU,,cWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#WWWWWWWWWWWWWWWWWWWWWWWWWaaaaaaaaO,,,,,eWWWWWWWWWWWWWe,,O,,,,,,,,,O,O,,XXXXX,,,cWWWWbWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#WWWWWWWWWWWWWWWWWWWWWbWWWWeOOOOOOOO,,,,,eWWWWWWWWWWe,,,,,O,,,,,,,,,O,,,##1##,,,,cWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#WWWWWWWWWWWWWWWWWWWWWWWWWWWaaaaaaaaO,,,,,eWWWWWWWee,,,,,,,O,,,,,,,,,O,,,,O,,,,,,,cWWWWbWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#WWWWWWWWWWWWWWWWWWWWWWWbWWWWc,,,,,,,O,,,,,eeccMMMcc,,,,,,SSSStSSSS,,,O,,,O,,,,,,,,cWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#-WWWWWWWWWWWWWWWWWWWWWWWWWWWWc,,,,,,,O,,,,,,,aaIIIaa,,,,,sssssssss,,,,O,O,,,,,,cccWWWWbWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#--WWWWWWWWWWWWWWWWWWWWWWWbWWWWc,,,,,,,O,,,,,,,aaIIIaa,,,,####i####,,OOOO,,,,cccWWWWbWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#--WWWWWWWWWWWWWWWWWWWWWWWWWWWWWc,,,,,,,O,,,,,,,aaIIIaa,,,,,,,,OOOOOOO,,,,cccWWWWbWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#---WWWWWWWWWWWWWWWWWWWWWWWWbWWWWc,,,,,,,O,,,,,,,aaIIIaa,,,,,,,,O,,,,,,cccWWWWbWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#---WWWWWWWWWWWWWWWWWWWWWWWWWWWWWa,,,,,,,,OOO,,,,,aaIIIaa,,,,,,,,O,,cccWWWWbWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#----WWWWWWWWWWWWWWWWWWWWWWWWWWWaa,OOOOOOO,,,O,,,,,aaIIIaa,,,,,,,eeeWWWWbWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#-----WWWWWWWWWWWWWWWWWWWWWWWWaaOOOO,,,,OStSSSO,,,,,aaIIIaa,,,cccWWWWbWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#-----WWWWWWWWWWWWWWWWWWWWWWaaOOOOaaccc,OsssssO,,,,,,aaIIIccccWWWWbWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#------WWWWWWWWWWWWWWWWWWWaaOOOOaaWWWcc,O#####O,,,,,,,ccMMMWWWWbWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#-------WWWWWWWWWWWWWWWaaOOOOaaWWWbWWWccO##l##O,,,,,,cccWWWWbWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#-------WWWWWWWWWWWWaaOOOOaaWWWWWWWWWWWccOOOOOO,,,cccWWWWbWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#-------WWWWWWWWWWaaOOOOaaWWWWWWWWWWbWWWcc,,,,,cccWWWWbWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#--------WWWWWWaaOOOOaaWWWWWWWWWWWWWWWWWWcc,cccWWWWbWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#--------WWWaaOOOOaaWWWWWWWWWWWWWWWWWWbWWWccWWWWbWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#--------aaOOOOOaaWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#----------OOaaWWWWWWWWWWWWWWWWWWWWWWWWWWWWbWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#----------aaWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#---SSSSS--WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#---sssss---WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#---##7##----WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#-------------WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#--------------WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#---------------WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#----------------WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#------------------WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#-------------------WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW#
+D:#----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------#
+D:#----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------#
+D:###################################################################################################################################################################################################### \ No newline at end of file
diff --git a/lib/mods/theme/edit/t_gondol.txt b/lib/mods/theme/edit/t_gondol.txt
new file mode 100644
index 00000000..6b0a32cd
--- /dev/null
+++ b/lib/mods/theme/edit/t_gondol.txt
@@ -0,0 +1,219 @@
+# File: Gondolin.txt
+
+# Gondolin: The Hidden Kingdom of the Noldor
+# Created by Akhronath (zzhou22876@aol.com)
+
+############### Additional default terrain settings ###############
+
+# Default for Quest 13 = entrance is mountain
+F:z:97:3
+
+# Default for Quest 14 = entrance is floor
+F:y:1:3
+
+# Default for Quest 15 = entrance is floor
+F:x:1:3
+
+# Default for Quest 23 = entrance is quest entrance
+F:w:8:3:0:0:0:0:0:23
+
+# Decoration = Straight Road (B)
+F:":66:3
+
+# Decoration = Straight Road (W)
+F:$:70:3
+
+# Rare jewelry shop -- unusable yet, need finish quest
+F:!:63:3
+
+# Between gate to minas anor -- unusable yet, need finish quest
+F:Z:63:3
+
+#################### Quest 13 - Eol the Dark Elf ####################
+
+# Quest 13 assigned, entrance is quest entrance
+?:[EQU $QUEST13 1]
+F:z:8:3:0:0:0:0:0:13
+
+?:1
+
+#################### Quest 14 - Nirnaeth Arnoediad ####################
+
+# Quest 14 assigned, entrance is quest entrance
+?:[EQU $QUEST14 1]
+F:y:8:3:0:0:0:0:0:14
+
+# Quest 14 finished, reward is a rare jewelry shop
+?:[EQU $QUEST14 5]
+F:!:74:3:0:0:0:0:0:42
+
+?:1
+
+#################### Quest 15 - Invasion of Gondolin ####################
+
+# Quest 15 assigned, entrance is quest entrance
+?:[EQU $QUEST15 1]
+F:x:8:3:0:0:0:0:0:15
+
+?:1
+
+#################### Quest 16 - The last Alliance ####################
+
+# Quest 16 finished, reward is a between gate
+?:[EQU $QUEST16 5]
+F:Z:176:3:0:0:0:0:0:1
+
+?:1
+
+############### Quest 23 - Wolves hut finished = house ###############
+?:[EQU $QUEST23 2]
+F:w:74:3:0:0:0:0:0:7
+?:[EQU $QUEST23 5]
+F:w:74:3:0:0:0:0:0:7
+?:1
+
+#################### Buildings ####################
+
+# h: Orange (Minstrel)
+# i: Red (Sorcery)
+# j: Green (Temple)
+# k: Violet (Chaos)
+# l: Dark Brown (Ranger)
+# m: White (Paladin)
+
+# Tower of the King
+F:a:74:3:0:0:0:0:0:27
+
+# Library
+F:b:74:3:0:0:0:0:0:28
+
+# Castle: Gondolin Plot
+F:B:75:3:0:0:0:0:0:4
+
+# The White Tree:Aerandir:High-Elf
+F:c:74:3:0:0:0:0:0:29
+
+# Craftsmaster
+F:d:74:3:0:0:0:0:0:30
+
+# Earth-Dome
+F:e:74:3:0:0:0:0:0:31
+
+# Prophet
+F:f:74:3:0:0:0:0:0:12
+
+# Minstrels Haven
+F:h:74:3:0:0:0:0:0:32
+
+# Star-Dome:Sulraen:High-Elf
+F:i:74:3:0:0:0:0:0:33
+
+# Valarin Temple
+F:j:74:3:0:0:0:0:0:34
+
+# Sea-Dome
+F:k:74:3:0:0:0:0:0:35
+
+# The Golden Flower
+F:l:74:3:0:0:0:0:0:36
+
+# The Fountain
+F:m:74:3:0:0:0:0:0:37
+
+# Thunderlord's Hide
+F:n:74:3:0:0:0:0:0:22
+
+# Merchant guild
+F:o:74:3:0:0:0:0:0:56
+
+# Force elven monsters
+f:ELVEN
+
+# Town Layout
+
+D:######################################################################################################################################################################################################
+D:#OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO#
+D:###################################################################################################################OOOOO##############################################################################
+D:###################################################################################################################OOOOO##############################################################################
+D:######################################^^^^^^^^^^^^^,,, OOOOO ####
+D:####################################^^^^^^^^^^^^,,,, OOOOO ####
+D:##################################^^^^^^^^,,,,,,,, OOOOOOOOOOOOOOOOOOOOOOOOOOO ####
+D:###########B#####################^^^^^^^^^,,,,,, OOOOOOOOCCCCCCCCCCCCCCCCCCCCCCCCCOOOOOOOO ,,,,,,, ,,,,###
+D:################################^^^^^^^^^^^,,, OOOOOOOCCCCCCCC#######################CCCCCCCCOOOOOO ,,,,,,,,,,, ,,,,,###
+D:###############################^^^^^^^^^^^^,, OOOOCCCCCCC########TTTTTTTT#####TTTTTTTT########CCCCCCOOO ,,,,,^^^^^,,,, ,,,,###
+D:##############################^^^^^^^^^^^,,, OCCCC########TTTTTT........#####......TTTTTT########CCCCOOO ,,,,^^^^^^^,,,,,, ,,,,,###
+D:#############################^^^^^^^n^^,,, OOCC###########T..........#########..........T###########CCOO ,,,,^^^^^^^^^^^^,,,,,,,,,,,###
+D:############################^^^^^^,,,,,, ......................... OOCC############T........#############........T############CCOO ,,,,^^^^^^^^^^^^^^,,,,,,,,,###
+D:############################,,,,,,,,, ......................... OCC#############T.......###WW#####WW###.......T#############CCO ,,,,^^^^^^^^^^^^^,,,,,,,,,###
+D:###########################,,,,,, ... . ... OC#############TT.......#WWWW##h##WWWW#.......TT#############CO ,,,,,^^^^^^^^^^^,,,,,,,,,###
+D:########################### ... . #### ... #### OOC#############T..........VV###.###VV..........T#############COO ,,,,,,^^^^^^^,,, ,,,,,###
+D:########################## ... ##### ####5#### OCC######WWWW###T...........V##...##V...........T####WWWW#####CCO######### ,,,,,,^^^^,,, ,,,,###
+D:########################## ######### ... ##### ####### OC######TTTTWW#TT............#.....#............TT#WWTTTT######CO######### ,,,,,,,,,, ,,,,###
+D:####W###################W# ######### ... ##### ####### OC#####l...TTW#T.................................T#WTT...T#####CO######### ,,,,,,,, ,,,,,,###
+D:####WWWW#############WWWW# ######### ... ##### ####### OC######T...............................................T######CO ,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,###
+D:#####WWWWWWW#####WWWWWWW## ######### ... ##### ######### OOC######TTT.................TTTTTTTTT.................TTT######CO , ,,,,,,,,,, ,,,,,,,,,###
+D:#####WWWWWWWWWWWWWWWWWWW## ####w#### ... ##### ######5###### OCC#######WW..............TTTT#######TTTT..............WW#######CCO , ### ,,,,,,,,,,,,,,,,###
+D:######WWWWWWWWWWWWWWWWW### . ... ##...## OC##########............TTT#############TTT............##########CO , ########## ,,, ,,,,,,,,###
+D:######WWWWWWWWWWWWWWWWW### ........... ... OC########TT...........TT#################TT...........TT########CO , ################### ,,,,,###
+D:######WWWWWWWWWWWWWWWWW### ... ... OC#####TTTT...........TT###..###aaa###..###TT...........TTTT#####CO , ############### ,,,,,,###
+D:########WWWWWWWWWWWWW###### ######### ... ############# ... OC#TTTTT..............T##.....#!...Z#.....##T..............TTTTT#CO , ############## ,,,,###
+D:###########WWWWWWW########## ######### ... ############# ... OC#T...........###...TT##.....#.....#.....##TT...###...........T#CO , ############## ,,,###
+D:############################### ######### ... ############# ... OC#T.........####....T##......#.....#......##T....####.........T#CO , ########### ,,,,###
+D:####--####KK#CC#VV#LL#""## ######### ... ############# ... OCC#TT.......####.....T##...................##T.....####.......TT#CCO , #### , ## ,,,###
+D:####--####KK#CC#VV#LL#""## ######### ... ######9###### ... OC###T......####....TTT###.................###TTT....####......T###CO , , VVVVV ,,,,###
+D:####--####KK#CC#VV#LL#""# ... . ... OC###T......d###...TT###.###....#####....###.###TT...###b......T###CO ,,,,,,,,,,,,,,, VVWWWVV ,,,###
+D:######################### ... . ... OC###T......d###...T##.....##..##WWW##..##.....##T...###b......T###CO , VVVWWWWWV ,,,,###
+D:#..............................................................................................####...T#.......#..#WV#VW#..#.......#T...####...........O , VVVVWWWWWWWV ,,,,,###
+D:#.x.........y.....................................................................................................#W#V#W#..............................,,,, VWWWWWWWWWWV ,,,,###
+D:#..............................................................................................####...T#.......#..#WV#VW#..#.......#T...####...........O , VVWWWWWWWVVV ,,,,,###
+D:######################### . ... . . OC###T......c###...T##.....##..##WWW##..##.....##T...####......T###CO , VWWWWWVVVV ,,,,,^^###
+D:####--####KK#CC#VV#LL#""# . ... . . OC###T......####...TT###.###....#####....###.###TT...####....TTT###CO , VVWWWVV ,,,,,,^^###
+D:####--####KK#CC#VV#LL#""## ####1#### ... ######2###### ##3## OC###T..............TTT###.................###TTT....####...TT#####CO , VVWWV ,,,,,,^^^^###
+D:####--####KK#CC#VV#LL#""### ######### ... ############# ##### OCC#TT................T##...................##T.....####...TT#####CCO , VVVV ,,,,,,^^^^^^###
+D:############################### ########1...... ############# ##### OOC#T.................T##......#.....#......##T....####....T######COO , ------TT------------ ,,,,,^^^^^^^###
+D:###########$$$$$$$########## ######### ... ############# ##### OC#T...VV...VV.......TT##.....##...##.....##TT...###.......f#####CO ,------TT-TTT--TT-TT-TT---- ,,,,^^^^^^^^^###
+D:########$$$$$$$$$$$$$###### ######### ... ############# ##### OC#T..VV#...#VV.......T####.#####m#####.####T..............f#####CO -,--TTTTTTTTTTTTTTT-TT-TTT---,,,,^^^^^^^^^###
+D:######$$$$$$$$$$$$$$$$$### ... OC#T..V###.###V.......TTT#################TTT.............T######CO---,--TT-TTT########TTT-TTTT----,,,,,^^^^^^^###
+D:######$$$$$$$$$$$$$$$$$### ... OC#TT.V##4.j##V.........TTT#############TTT...............TT#####CO---,---TTT###TTTTTT###TT-T-TT----,,,,,^^^^^^###
+D:######$$$$$$$$$$$$$$$$$$## ... OC##T.V#######V...........TTTT#######TTTT..................TT####CO---,--TTT##TTT----TTT##TTTTTT------,,,,,^^^^###
+D:#####$$$$$$$$$$$$$$$$$$$## ######### ... ############# OCC#T.VV#####VV.............................................TTT#CCO---,---TT#TT--------TT##T-T-TT------,,,,^^^^###
+D:#####$$$$$$$#####$$$$$$$## ######### ... ############# OOC#T..VV###VV.....TTTTTTTTTTT.......TTTTTTTTTTT..............T#COO---,,,,,,,,,,,,,,,,,,,e#TT-TTT------,,,,^^^^###
+D:####$$$$#############$$$$# ########o.........7############ OC#T...VVVVV....TTT#########TTT...TTT#########TTT............T#CO---------T#TT--------TT##TTT-------,,,,^^^^^^###
+D:####$###################$# ######### ... ############# OC#TT..........TT###VVVVVV####TT.TT####WWWWWW###TT..........TT#CO-------TTT##TTT----TTT##TTTTT-----,,,,^^^^^^^###
+D:########################## ######### ... ############# OC##T..........T##VVV....VVV###TTT###WWW....WWW##T..........T##CO------TTTTT###TTTTTT###TTTTT-----,,,,,^^^^^^^###
+D:########################### ... OCC#T..........T#VV........VV#######WW........WW#T..........T#CCO-----TTTT-TTT########TTTTTT------,,,,,,,^^^^^###
+D:########################### #...# OOC#TT.......................i#####k.......................TT#COO -T---TTTTT-TTTTTTTTTT-TT------ ,,,,,,,z^^^###
+D:############################ ##...## OC##TT........T#VV........VV#######WW........WW#T........TT##CO ------TTTT-TT--TT---T----- ,,,,,,,^^^^^^###
+D:############################ ####6#### OCC##TT.......T##VVV....VVV#########WWW....WWW##T.......TT##CCO ------TTT-TTTT--T----- ,,,,,,,^^^^^^^^^###
+D:############################# ####### OOCC##TTTT...TTT###VVVVVV#############WWWWWW###TTT...TTTT##CCOO ------T-------- ,,,,,,^^^^^^^^^^^^###
+D:############################## ##### OOCC####TTTTTTTTT###########################TTTTTTTTT####CCOO ,,,,,,^^^^^^^^^^^^^^###
+D:############################### ##### OOCCCC######TTTTTTTTTTT##############TTTTTTTTTT######CCCCOO ,,,,,,^^^^^^^^^^^^^^^^^###
+D:################################ ##### OOOOCCCCCC#####################################CCCCCCOOOO ,,,,,,,,,,^^^^^^^^^^^^^^^^^###
+D:################################# ##### OOOOOOCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCOOOOOO ,,,,,,,,,,^^^^^^^^^^^^^^^^^^####
+D:################################## ####### OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO ,,,,,,,,,,,^^^^^^^^^^^^^^^^^^^^^####
+D:#################################### ######### ,,,,,,,,,,,,,^^^^^^^^^^^^^^^^^^^######
+D:###################################### ############# ,,,,,,,,,,,,,,,^^^^^^^^^^^^^^^^^^########
+D:######################################################################################################################################################################################################
+D:######################################################################################################################################################################################################
+D:######################################################################################################################################################################################################
+D:######################################################################################################################################################################################################
+
+# Default starting position
+?:[EQU $LEAVING_QUEST 0]
+P:33:50
+
+# Starting position when coming from quest 19
+?:[EQU $LEAVING_QUEST 19]
+P:51:190
+
+# Starting position when coming from quest 20
+?:[EQU $LEAVING_QUEST 20]
+P:33:13
+
+# Starting position when coming from quest 21
+?:[EQU $LEAVING_QUEST 21]
+P:27:168
+
+# Starting position when coming from quest 22
+?:[EQU $LEAVING_QUEST 22]
+P:6:42
diff --git a/lib/mods/theme/edit/t_helm.txt b/lib/mods/theme/edit/t_helm.txt
new file mode 100644
index 00000000..0ecaf913
--- /dev/null
+++ b/lib/mods/theme/edit/t_helm.txt
@@ -0,0 +1,73 @@
+# File: t_helm.txt
+
+# Helm's Deep map by furiosity <furiosity@zionmainframe.net>
+
+#The Hornburg
+F:k:74:3:0:0:0:0:0:80
+
+D:######################################################################################################################################################################################################
+D:#TT,,,,TTTTTTTTTTTTTTTTTTTTTTTT^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#TTT,,,,TTTTTTTTTTTTTTTTTTTTTTT----------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#TTT,,,,TTTTTTTTTTTTTTTTTTTTTT--------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#@TTTT,,,,TTTTTTTTTTTTTTTTTTTT-------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#W@TTT,,,,TTTTTTTTTTTTTTTTTTT-----------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#WW@TTTT,,,,TTTTTTTTTTTTTTTT---------------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#WWW@TTT,,,,TTTTTTTTTTTTTT--------------------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#WWWW@TTTT,,,,TTTTTTTTTTTT-------------------------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#WWWWW@TTT,,,,TTTTTTTTTT------------------------------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#@WWWWW@TTTT,,,,TTTTTTTT--------------------------------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#T@WWWWW@TTT,,,,TTTTTTTT-------------------------------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#TT@WWWWW@TTTT,,,,TTTTTT------------------------------------------^^^^^^^---^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#TTT@WWWWW@TTT,,,,TTTT------------------------------------------^^^^^^^^-------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#TTTT@WWWWW@@TTT,,,,T------------------------------------------^^^^^^^^-------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#TTTTT@@WWWWW@---,,,,-----------------------------------------^^^^^^^-----------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#TTTTTTT@WWWWW@@----,,,,,------------------------------------^^^^^^^----------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#TTTTTTTT@@WWWWW@@-----,,,,,--------------------------------^^^^^^^^-----------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#TTTTTTTTTT@@WWWWW@@@-----,,,,,,---------------------------^^^^^^^-------------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#TTTTTTTTTTTT@@@WWWWW@@@@-----,,,,,-----------------------^^^^^^---------------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#TTTTTTTTTTTTTTT@@WWWWWW@@@@@----,,,,,-------------------^^^^^^^----------------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#TTTTTTTTTTTTTT---@@@WWWWWWWW@@@@---,,,,,---------------^^^^^^^------------------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#TTTTTTTTTTTTT--------@WWWWWWWWWW@@@---,,,,,-----------^^^^^^^------------------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#TTTTTTTTTTTTT---------@@@@@WWWWWWWW@@@---,,,,--------^^^^^^^------------------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#TTTTTTTTTTTT---------------@@@@@WWWWWW@-----,,,,----^^^^^^--------------------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#TTTTTTTTTTTT--------------------@@@WWWWW@------,,,-^^^^^^------------------------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#TTTTTTTTTTT-------------------------@WWWWW@@@----,,,,^^^----------------------------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#TTTTTTTTT-----------------------------@WWWWWW@@@@--,,,-------------------------------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#TTTTTTTTT-------------------------------@WWWWWWWW@@@@,,,----------------------------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#TTTTTT-----------------------------------@@@@@WWWWWWW@-,,,---------------------------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#TTTTTT----------------------------------------@@@WWWWW@--,,,---------------------------------------####^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#TTTTTT------------------------------------------^^@WWWWW@-,,,-------------------------------------##OO##^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#TTTTT-----------------------------------------^^^^--@WWWW@-,,,------------------------------------##OO##^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#TTTT-----------------------------------------^^^^^^--@WWW@--,,------------------------------------##OO##-----------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#TTTT----------------------------------------^^^^^^---@WWW@--,,-----------------------------------##OO##--------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#TTT-----------------------------------------^^^^^^---@WWWW@-,,,---------------------------------##OO##--------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#TT------------------------------------------^^^^^----@WWWW@-,,---------------------------------##OO##----------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#TT----------------------------------------^^^^^^------@WWW@-,,--------------------------------##OO##-----------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#TT----------------------------------------^^^^^^-----@WWWW@-,,-------------------------------##OO##------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^---------------------------------^^^^^^^-----@WWWW@-,,------------------------------##OO##--------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^--------------------------------^^^^^^-----@WWWWW@-,,-----------------------------##OO##----------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^------------------------------^^^^^^------@WWWW@--,,---------------------@@@@---##OO##------------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^-----------------------------^^^^^^------@WWW@---,,--------------------@WWWW@^##OO##@@-----------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^---------------------------^^^^^^^-----@WWWW@---,,------------------@WWWWWWW##OO##WWW@----------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^-------------------------^^^^^^^------@WWW@-----,,---------------@WWWW@@@@##OO##WWWW@@@@@------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^--------------------------^^^^^^------@WWWW@------,,-------------@WWWW@^^^##OO##^@WWWWWWWW@@@---------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^---------^---------------^^^^^^-------@WWWW@-------,,,-----------@WWW@^^^##OO##^^^@@@@WWWWWWW@@------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^----------^^^^^^^------------^^^^^^^------@WWW@---------,,,,--------@WWW@^^^##OO####^^^^^^@@@WWWWWW@@---------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^-----------^^^^^^^^^^-------^^^^^--------@WWW@-----------,,,,-----@WWW@^^^##OOOOOO####^^^^^^^@WWWWWW@-------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^-----------^^^^^^^^^^^^^^^^---^^^^^^^------@WWWW@-------------,,,,,###@WWW@^##OOOOOOOOOO####^^^^^@@@WWWW@-----^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#-------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^-------@WWW@---------------,,,OO########OOOOOOOOOOOOOO####^^^^^^@WWW@---^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^-------@WWWW@--------------###OOOOOOOOOOOOOOOOOOOOOOOOOOO####^^^@WWWW@-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^-------@WWWW@---------------##########OOOOOOOOOOOOOOOOOOOOO####^@WW@--^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^-----@WWWWW@------------@WWWW@^^##OOOOOOOO####OOOOOOOOOOOO##^@WW@-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^----@WWWWWWW@@@@@@@@@@WWWWW^^##OOOOOOOO######OOOOOOOOOO##^^@WW@^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^--@WWWWWWWWWWWWWWWWWW@^^##OOOOOOOOOk####kOOOOOOOOO##^^@WWW@@^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^--@@@@@WWWWWWWWWW@^^^##OOOOOOOOOO######OOOOOOOO##^^^^@WWWW@^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^-@@@@@@@@@@^^^##OOOOOOOOOOOO####OOOOOOOO##^^^^^^@WWWWW@^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^------^^^^####OOOOOOOOOOOOOOOOOOOOO##^^^^^^^@WWWWW@@^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^####OOOOOOOOOOOOOOOOO##^^^^^^^^^@@@WWWW@^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^####OOOOOOOOOOOOO##^^^^^^^^^^^^@WWW@^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^####OOOOOOOOO##^^^^^^^^^^^^^^@@WWW@^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^####OOOOO##^^^^^^^^^^^^^^^^^@WWW@^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^####OO##^^^^^^^^^^^^^^^^^^^@WWW@^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^####^^^^^^^^^^^^^^^^^^^@WWW@^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:###################################################################################################################################################################################################### \ No newline at end of file
diff --git a/lib/mods/theme/edit/t_henn.txt b/lib/mods/theme/edit/t_henn.txt
new file mode 100644
index 00000000..49e91867
--- /dev/null
+++ b/lib/mods/theme/edit/t_henn.txt
@@ -0,0 +1,96 @@
+# File: t_henn.txt
+
+# Henneth Annun map by furiosity <furiosity@zionmainframe.net>
+# NB! The additional terrain features and stores (if any) assume usage of the following files from the 'theme' module:
+# f_info.txt, t_pref.txt, st_info.txt, and ba_info.txt
+# Please download the module and refer to the files for the terrain feature definitions http://modules.t-o-m-e.net/
+# Don't forget to modify the maximum number of terrain features, etc. in misc.txt as well.
+
+### Additional terrain features ###
+
+# Low hill
+F:h:213:3
+
+# Swift waterfall
+F:f:238:3
+
+# Slippery ledge
+F:l:239:3
+
+### Buildings ###
+
+# Ranger Conclave
+F:k:74:3:0:0:0:0:0:78
+
+# Fighters Hall
+F:a:74:3:0:0:0:0:0:17
+
+# Rangers Guild
+F:b:74:3:0:0:0:0:0:21
+
+D:######################################################################################################################################################################################################
+D:#hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhWWWWWWWWWWhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh#
+D:#hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhWWTTWWWWWhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh#
+D:#hhhhhhhhhhhhh^^^^^^^^^^^^hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh^^^^^^^^^^^^hhhhhhhhhhhhhhhhhhhhhhhhhhhhhWWWWWTWWWh^hhhhhhhhhhhh^^^^^^^^^^^^hhhhhhhhhhhhhhhhhhhhhhhh^^^^^^^^^^^^hhhhhhhhhhh#
+D:#hhhhhhhhhhhh^^^^^^^^^^^^hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh^^^^^^^^^^^^hhhhhhhhhhhhhhhhhhhhhhhhhhhh^hWWWWWTWWWhhhhhhhhhhhh^^^^^^^^^^^^hhhhhhhhhhhhhhhhhhhhhhhh^^^^^^^^^^^^hhhhhhhhhhhhh#
+D:#hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh^WhWWWTWWhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh#
+D:#hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh^^^^^^W^^hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh#
+D:#hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh^^^^^^^^^hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh#
+D:#hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh^hh^^^@@@@@^^hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh#
+D:#hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh^hh^@@,,,,@^^hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh#
+D:#hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh^^h^^@,,,,,,@@^^^hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh#
+D:#hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh^h^^^@,,,,,,,,,@@^hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh#
+D:#hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh^^^@@,,,,,,,,,,^@^hh^hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh^,#
+D:#hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh^^^^^^^^^^^^^^^^hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh^^@,,,,,,,,,,,,^^^^^^hhhhhhhhhhhhhhhh^^^^^^^^^^^^^^^^hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh^,^#
+D:#hhhhhhhhhhhhhhhh^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh^^@,,,,,,,,,,,,,,,@^^hhhhhhhhhhhhhhhh^^^^^^^^^^^^^^^^hhhhhhhhhhhhhhhh^^^^^^^^^^^^^^^^^,^h#
+D:#hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh^^^^^^^^^^^^^^^^hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh^h^^@,,,,,,,,,,,,,,,@^^hhhhhhhhhhhhhhhh^^^^^^^^^^^^^^^^hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh^,^hh#
+D:#hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh^^@^@,,,,,,,,,,,,,,,@^^hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh^,^hhh#
+D:#hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh^^@^@,,,,,,,,,,,,,,,,,@^^hhhhhhhhhhhhhhhh^^^^^^^^^^^^^^^^hhhhhhhhhhhhhhhhhhhhhhhhhhhh^,^hhhh#
+D:#hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh^^^^^^^^^^^^^^^^hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh^^^@,,,,,,,,,,,,,,,,,,,,@^^hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh^^^^^^^^^^^^^^^^hhhhhhhhhhh^,^hhhhh#
+D:#hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh^^^^^@@,,,,,,,,,,,,,,,,,,,,,,@^^hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh^,^hhhhhh#
+D:#hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh^^^^^^^^^^^^^^^^hhhhhhhhhhhhhhhhhhhhhhhhhhhhhh^h^h^^@@@a,,,,,,,,,,,,,,,,,,,,,,,,@^^^^hhhhhhhhhhhhhhhh^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^hhhhh^,^hhhhhhh#
+D:#hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh^h^^^@,,,,,,,,,,,,,,,,,,,,,,,,,,,,,b@@^^^hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh^,^hhhhhhhh#
+D:#hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh^^^@@,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,@@^^^hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh^,^hhhhhhhhh#
+D:#hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh^^@,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,@@^^^hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh^,^hhhhhhhhhh#
+D:#hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh^^@,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,@@^^hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh^,^hhhhhhhhhhh#
+D:#hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh^^@,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,@@^^hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh^,^hhhhhhhhhhhh#
+D:#hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh^^@,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,@^^hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh^,^hhhhhhhhhhhhh#
+D:#hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh^^@,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,@^^hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh^,^hhhhhhhhhhhhhh#
+D:#hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh^^@,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,@^^hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh^,^hhhhhhhhhhhhhhh#
+D:#hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh^^@,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,@^^hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh^,^hhhhhhhhhhhhhhhh#
+D:#hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh^^@,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,@^^hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh^,^hhhhhhhhhhhhhhhhh#
+D:#hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh^^^@,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,@^^hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh^,^hhhhhhhhhhhhhhhhhh#
+D:#hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh^^@@,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,@^^hhhhhhhhhhhhhhhhhhhhhhhhhhhhh^,^hhhhhhhhhhhhhhhhhhh#
+D:#hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh^^@@,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,@^^hhhhhhhhhhhhhhhhhhhhhhhhhhhh^,^hhhhhhhhhhhhhhhhhhhh#
+D:#hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh^^@,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,@^^hhhhhhhhhhhhhhhhhhhhhhhhhh^,^hhhhhhhhhhhhhhhhhhhhh#
+D:#hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh^^@@,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,@^^hhhhhhhhhhhhhhhhhhhhhhhhh^,^hhhhhhhhhhhhhhhhhhhhhh#
+D:#hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh^^@@,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,@^^hhhhhhhhhhhhhhhhhhhhhhhh^,^hhhhhhhhhhhhhhhhhhhhhhh#
+D:#hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh^^@@,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,@^^hhhhhhhhhh^hhhhhhhhhhhh^,^hhhhhhhhhhhhhhhhhhhhhhhh#
+D:#hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh^^@,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,@^^hhhhhhhhhhhhhhhhhhhhhhh^,^hhhhhhhhhhhhhhhhhhhhhhhhh#
+D:#hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh^^@@,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,@^^hhhhhhhhhhhhhhhhhhhhhh^,^hhhhhhhhhhhhhhhhhhhhhhhhhh#
+D:#hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh^^@@,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,@^^hhhhhhhhhhhhhhhhhhhhh^,^hhhhhhhhhhhhhhhhhhhhhhhhhhhh#
+D:#hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh^^@,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,@^^hhhhhhhhhhhhhhhhhhhh^^,^hhhhhhhhhhhhhhhhhhhhhhhhhhh#
+D:#hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh^^@,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,@^^hhhhhhhhhhhhhhhhhhhh^,^hhhhhhhhhhhhhhhhhhhhhhhhhhhh#
+D:#hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh^^@,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,@^^hhhhhhhhhhhhhhhhhhhhh^,^hhhhhhhhhhhhhhhhhhhhhhhhhhhh#
+D:#hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh^^@@,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,@^^hhhh^hhhhhhhhhhhhhhh^,^hhhhhhhhhhhhhhhhhhhhhhhhhhhhh#
+D:#hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh^^@@@3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,@^^hhhhhhhhhhhhhhhhhhh^,^hhhhhhhhhhhhhhhhhhhhhhhhhhhhhh#
+D:#hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh^^^@@,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,k@^^hhhhhhhhhh^^hhhhhhh^,^hhhhhhhhhhhhhhhhhhhhhhhhhhhhhh#
+D:#hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh^^^@@,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,@@^^hhhhh^hhhhhhhhhh^^h^,^hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh#
+D:#hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh^^^^@@^@@,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,@^^^hhhhhh^hhhhhhhhhhhh^,^hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh#
+D:#hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh^^^@^^@2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,@^^hhhhhhhhhhhhhhhhhhhh^,^hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh#
+D:#hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh^^^^@@@,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,@@^^hhhhhhhhhhhhhhhhhhhh^,^hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh#
+D:#hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh^^^^@@,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,@^^^hhhhhhhhhhhh^h^hhhhh^,,^hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh#
+D:#hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh^^^@,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,@@@^^^hh^hhhhhhhhhh^h^hhh^^,,^hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh#
+D:#hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^@,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,^^^^^^^^^^^^^h^hhhhhhhh^^,,^^hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh#
+D:#hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh^^^^^,^,^,^,^,^,^,^,^,^,^,^,^,^^^^@,,,,,,,,,,,,,,,,^^^^^^^^^^^^^^^^^^,,,,,,,,,,,^^^^^^^^^^,,^^,hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh#
+D:#hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh^^,,,,^,^,^,^,^,^,^,^,^,^,^,^,^,,,^^^,,,,,,,,,,,,,,,^^^^,,,,,,,,,,,,,,,,,,^^^^^^^,,,,,,,,,,,,,,^^hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh#
+D:#hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh^^,^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^,,^,,,,,,,,,,,,,,,,,,,TTTTTTTTTTTTTTTTTTTTTTTTTT^^^^^^^^^^^^^7hTThThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh#
+D:#hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh^^,hh^^CC^^^^^^^^^^^^^^^^^^^^^^^^^^,,,lllllllllllllll^^^^^^^^^^^^^^^^^^^^^^^^^TWWWWWWWTT^T^ThThhhhhTTThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh#
+D:#hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh^^,hhh^CCCCCCCCCCCCCCCCCCCCCCCCCffffffffllllllllllllllffffff^^^^^^^^CCCCCCCCC^^^^WWWWWTThhhhhhhhhhhhTThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh#
+D:#hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh^^,hhhh^CCCCCCCCCCCCCCCCCCCCCCCCCffffffffffllllllllllffffffffffCCCC^^CCCCCCCCCCCCC^^^^^TTTTTTTTTTTTTTThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh#
+D:#hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh^^,hhhhh^CCCCCCCCCCCCCCCCCCCCCCffffffffffffffffffffffffffffffffffCCCCCCCCCCCCCCCCCCCC^C^^^^^^^^^^TTTTTThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh#
+D:#hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh^^,hhhhhh^CCCCCCCCCCCCCCCCCCCCCffffffffffffffffffffffffffffffffffffCCC^CCCCCCCCCCCCCCC^^CCCCC^C^^^T^^^^^TThhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh#
+D:#hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh^^,hhhhhhh^CCCCCCCCCCCCCCCCCCCCCCffffffffffffffffffffffffffffffffffCCCC^CCCCCCCCCCCCCCCCC^^^^CCCCC^^^CCC^^^Thhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh#
+D:#hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh^^,hhhhhhhh^CCCCCCCCCCCCCCCCCCCCCCCffffffffffffffffffffffffffffffffCCCCC^CCCCCCCCCCCCCCC^CCCCCCCCC^^CCCCCC^Thhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh#
+D:#hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh^^,hhhhhhhhh^CCCCCCCCCCCCCCCCCCCCCCCCCffffffffffffffffffffffffffffCCCCCCC^CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC^Thhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh#
+D:###################################################################################################################################################################################################### \ No newline at end of file
diff --git a/lib/mods/theme/edit/t_hobb.txt b/lib/mods/theme/edit/t_hobb.txt
new file mode 100644
index 00000000..6043f188
--- /dev/null
+++ b/lib/mods/theme/edit/t_hobb.txt
@@ -0,0 +1,108 @@
+# File: t_hobb.txt
+
+# Hobbiton map by furiosity <furiosity@zionmainframe.net>
+# NB! The additional terrain features and stores (if any) assume usage of the following files from the 'theme' module:
+# f_info.txt, t_pref.txt, st_info.txt, and ba_info.txt
+# Please download the module and refer to the files for the terrain feature definitions http://modules.t-o-m-e.net/
+# Don't forget to modify the maximum number of terrain features, etc. in misc.txt as well.
+
+### Additional terrain features ###
+
+#Wooden board
+F:a:235:3
+
+#Small tree
+F:b:202:3
+
+#Field
+F:c:181:3
+
+#Stable
+F:d:240:3
+
+#Low hill
+F:h:213:3
+
+#Mallorn
+F:m:243:3
+
+### Buildings ###
+
+# Farm
+F:f:74:3:0:0:0:0:0:67
+
+# Green Dragon
+F:g:74:3:0:0:0:0:0:74
+
+# Bag End
+F:i:74:3:0:0:0:0:0:84
+
+# Beastmaster
+F:j:74:3:0:0:0:0:0:16
+
+D:######################################################################################################################################################################################################
+D:#bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbhhhhhhhhhhhhhhhhhhhhhhhhhhihhhhhhhccccchhOOhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh#
+D:#bccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccbb------------------------OO-------ccmccTOO------------------------------------------------------------------------------------------#
+D:#bccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccbb-----------------------OO--------ccccTOO-------------------------------------------------------------------------------------------#
+D:#bccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccbb----------------------OO-------------OO--------------------------------------------------------------------------------------------#
+D:#bccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccbb---------------------OO---------------OO-------------------------------------------------------------------------------------------#
+D:#bccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccbb--------------------OO---------------OO--------------------------------------------------------------------------------------------#
+D:#bccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccbb-------------------OO-----------------OOb------------------------------------------------------------------------------------------#
+D:#bccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccbb------------------OO-----------------OOb-------------------------------------------------------------------------------------------#
+D:#bccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccbb-----------------OO##############---OO---------------------------------------------------------------------------------------------#
+D:#bccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccbb-----------OOOOOOOOOOOOOOOOOOOOO#---OOb--------------------------------------------------------------------------------------------#
+D:#bccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccbb----------OO---#OOOOOOOOOOOOOOOO#---OOb--------------------------------------------------------------------------------------------#
+D:#bccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccbb----------OO---#OOOddddddddddOOO#---OO---------------------------------------------------------------------------------------------#
+D:#bccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccbb----------OO---#OOOddddddddddOOO#---OO---------------------------------------------------------------------------------------------#
+D:#bccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccbb----------OO---#OOOOddddddddjOOOOOOOO----------------------------------------------------------------------------------------------#
+D:#bccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccbb----------OO---#OOOddddddddddOOO#--OOb----TT---------------------------------------------------------------------------------------#
+D:#bccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccbb-----------OO--#OOOddddddddddOOO#--OO--TT-TTT--------------------------------------------------------------------------------------#
+D:#bccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccbb-----------OO--#OOOOOOOOOOOOOOOO#--OO-TT-------------------------------------------------------------------------------------------#
+D:#bccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccbb------------OO-OOOOOOOOOOOOOOOOO#--OObTT------T------------------------------------------------------------------------------------#
+D:#bccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccbb-------------OOO#################--OObTT-------------------------------------------------------------------------------------------#
+D:#bccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccbb--------------OO------------------OOOOOOOOOOOO-------------------------------------------------------------------------------------#
+D:#bccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccbb---------------OO-----------------OOb--#####--OO-----------------------------------------------------------------------------------#
+D:#bccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccbb-----------------OO---------------OOb--#######ff##---------------------------------------------------------------------------------#
+D:#bccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccbb------------------OO-----------T--OOb--###########---------------------------------------------------------------------------------#
+D:#bccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccbb---------------TTTTOO--------TTT-OOb---###########---------------------------------------------------------------------------------#
+D:#bccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccbb----------------TT--OO-----------OOb---#####---------------------------------------------------------------------------------------#
+D:#bccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccbb------------------TT-OO-----TTT--OOb---#####---------------------------------------------------------------------------------------#
+D:#bccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccbb------------------TT--OO-----T---OOb-----------------------------------------------------------------------------------------------#
+D:#bccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccbb-------------------TTT-OO--TT---OOb------------------------------------------------------------------------------------------------#
+D:#bccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccbb-------------------TTTT-OOTTT--OOb-------------------------------------------------------------------------------------------------#
+D:#bccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccbb---------------------TTT-OO--bOOb--------------------------------------------------------------------------------------------------#
+D:#bccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccbb----------------------TTT-OOOOOb---------------------------------------------------------------------------------------------------#
+D:#bccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccbb-----------------------TT--OOOb----------------------------------------------------------------------------------------------------#
+D:#bccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccbb----------------------TTT-OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO#
+D:#bccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccbb----------------------TT-bOOb------------------------------------------------------------------------------------------------------#
+D:#bccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccbb----------------------TT-OOb-------------------------------------------------------------------------------------------------------#
+D:#bccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccbb----------------------TT-OOb-------------------------------------------------------------------------------------------------------#
+D:#bccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccbb---------------------TTT-OOb-------------------------------------------------------------------------------------------------------#
+D:#bccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccbb----------------------T--OOb-##############----------------------------------------------------------------------------------------#
+D:#bccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccbb-----------------TTT-TTT-OO--##############----------------------------------------------------------------------------------------#
+D:#bccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccbb------------------T-TTTT-OOOO1#############----------------------------------------------------------------------------------------#
+D:#bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbOO--##############@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#
+D:#VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVaOOaV##############VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV#
+D:#VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVaOOaVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV#
+D:#VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVaOOaVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV#
+D:#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@bOO@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#
+D:#-----------------------------------------------------------------------------------------bOO--------------------------------------------------------------------------------------------------------#
+D:#-----------------------------------------------------------------------------------hhhh---OO--------hhh-----hhh-------------------------------------------------------------------------------------#
+D:#--------------------------------------------------TT-----TT------TT-----hhhh------hhhhhh--OO-------hhhhh---hhhhh------------------------------------------------------------------------------------#
+D:#-------------------------------------------------TTTT---TTTT----TTTT---hhhhhh----hhhhhhhh-OO------hhhhhhh--hh5hh--TT---TT---TT----------------------------------------------------------------------#
+D:#--------------------------------------------------TT-----TT------TT---hhh3hhhh---hhhh2hhh-OO------hhh0hhh--------TTTT-TTTT-TTTT---------------------------------------------------------------------#
+D:#OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO#
+D:#OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO#
+D:#------------------------------------------------------------------######-hhhh-hhh------hhhOO-hh-----hhhh----h-hh-TTTT-TTTT-TTTT---------------------------------------------------------------------#
+D:#------------------------------------------------------------------######--hhhhhh--------hhOO-hhh-----hh-----hhhh--TT---TT---TT----------------------------------------------------------------------#
+D:#------------------------------------------------------------------######---hhhh----------hOO-hhh-------------hh-------------------------------------------------------------------------------------#
+D:#------------------------------------------------------------------######------------------OO-hh-------#####-----------------------------------------------------------------------------------------#
+D:#------------------------------------------------------------------######--------hhhhh-----OO----------#####-----------------------------------------------------------------------------------------#
+D:#------------------------------------------------------------------######-------hhhhhhh----OO---hh-----g####-----------------------------------------------------------------------------------------#
+D:#------------------------------------------------------------------------------hhhh4hhhh---OO--hhhh----#####-----------------------------------------------------------------------------------------#
+D:#------------------------------------------------------------------------------------------OO-hhhhhh---#####-----------------------------------------------------------------------------------------#
+D:#-------------------------------------------------------------------------------------hhh--OO-hh6hhh-------------------------------------------------------------------------------------------------#
+D:#------------------------------------------------------------------------------------hhhhh-OO--------------------------------------------------------------------------------------------------------#
+D:#------------------------------------------------------------------------------------hh7hh-OO--------------------------------------------------------------------------------------------------------#
+D:#------------------------------------------------------------------------------------------OO--------------------------------------------------------------------------------------------------------#
+D:###################################################################################################################################################################################################### \ No newline at end of file
diff --git a/lib/mods/theme/edit/t_imlad.txt b/lib/mods/theme/edit/t_imlad.txt
new file mode 100644
index 00000000..af06a709
--- /dev/null
+++ b/lib/mods/theme/edit/t_imlad.txt
@@ -0,0 +1,90 @@
+# File: t_imlad.txt
+
+# Rivendell/Imladris map by furiosity <furiosity@zionmainframe.net>
+# NB! The additional terrain features and stores (if any) assume usage of the following files from the 'theme' module:
+# f_info.txt, t_pref.txt, st_info.txt, and ba_info.txt
+# Please download the module and refer to the files for the terrain feature definitions http://modules.t-o-m-e.net/
+# Don't forget to modify the maximum number of terrain features, etc. in misc.txt as well.
+
+### Additional terrain features ###
+
+# Swift waterfall
+F:f:238:3
+
+### Buildings ###
+
+# Imladris
+F:a:74:3:0:0:0:0:0:79
+
+# Forge
+F:b:74:3:0:0:0:0:0:88
+
+# Stable (Beastmaster)
+F:c:74:3:0:0:0:0:0:16
+
+D:######################################################################################################################################################################################################
+D:# @^^^@ @@WWWWWWWWWW^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^WWW^#
+D:# @^^^@ @@WWWWWWWWWW^^^^^^^^^^^^^^^^^^^^^^^^---#####----------------------TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^WWWW^#
+D:# @^^^@ @@WWWWWWWWWW^^^^^^^^^^^^^^^^^^^^------#####----------------------TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT^^^^^^^^^^^^^^^^^^^^^^^^^^^^^WWWW^^#
+D:# @^^^@ @@WWWWWWWWWW^^^^^^^^^^^^^^^^----###--##b##-----------------------TTTTTTTT TTTTTTT^^^^^^^^^^^^^^^^^^^^^^^^^^^^WWWW^^^#
+D:# @^^^@ @@WWWWWWWWWW^^^^^^^^^^^^^^--######------------------------------TTTTTTTTTTTT TTTTTT^^^^^^^^^^^^^^^^^^^^^^^^^^WWWW^^^^#
+D:# @^^^@ @@WWWWWWWWWW^^^^^^^^-----####c##----------------------------------TTTTTTTTTTT TTTTTTT^^^^^^^^^^^^^^^^^^^^^^^^^WWWW^^^^^#
+D:# @^^^@ @@WWWWWWWWWW^^^^^^^^^---####----------------------------------TTTTTTTT TTTTTTTTTTTT^^^^^^^^^^^^^^^^^^^^^WWW^^^^^^^#
+D:# @^^^@ @@WWWWWWWWWW^^^^^^WW^-----------------------------------------TTTTTTTTTTTTTTT TTTTTTTTTTTT^^^^^^^^^^^^^^^^^^WWW^^^^^^^^^#
+D:# @^^^@ @@WWWWWWWWWW^^^^^^^W^------------------------------------TTTTTTTTTTTTTTTTTTTTTTTT TTTT^^^^^^^^^^^^^^^^^^^^^^WWWW^^^^^^^^^^#
+D:# @^^^@ @@WWWWWWWWW^^^^^^W@^^------------------------------------TTTTTTTTTTTTTTTTTTTTTTTTTT TTTTT^^^^^^^^^^^^^^^^^^^^WWWW^^^^^^^^^^^^#
+D:# @^^^@ @@WWWWWWWWW^^^^^^W@^^-------------------------------------TTTTTTTTTTTTTTTTTTTTTTTTTT TTTTTTT^^^^^^^^^^^^^^^^WWWW^^^^^^^^^^^^^^#
+D:# @^^^@ @@WWWWWWWWWWWWfWW@@^^-----------------------------------------------------TTTTTTTTTTTTTTTTTTTTT^^^^^^^^^^,^^@WWWW^^^^^^^^^^^^^^^^#
+D:# @^^^@ @@WWWWWWWWWWffW@@@@^^-----------------------------------------------------TTTTTTTTTTTTTTTTTTTTT^^^^^,,,,^^@WWWW^^^^^^^^^^^^^^^^^#
+D:# @^^^@ @@WWWWWWWWffWW@@@@@^^------------------------------------------------------TTTTTTTTTTTTTTTTTTTTT^^,,^^^@@WWWW^^^^^^^^^^^^^^^^^^#
+D:# @^^^@ @@WWWWWWffWWWWW@@@@^^^------------------------------------------------------TTTTTTTTTTTTTTTTTTT,,^^^^@WWWWW^^^^^^^^^^^^^^^^^^^#
+D:# @^^^@ @@WWWWffWWWWWWW@@@@@^^^^-----------------------------#################-------TTTTTTTTTTTTTT,,,^^^@@WWWW@^^^^^^^^^^^^^^^^^^^^^#
+D:# @^^^@ @@WWffWWWWWWWWWW@@@@@@^^----------------------------#################---------------TTT--,,^^^@@WWWWW@^^^^^^^^^^^^^^^^^^^^^^#
+D:# TTTTTT @^^^@ @^^ffWWWWWWWWWWWWW@@@@@^^------------------------#######################-------------,,,,^^^@@WWWWW^^^^T^^^^^^^^^^^^^^^^^^^^#
+D:# TTTTTTT TTT @^^^@ @^^^^^^^WWWWWWWWWWWWWWWW@@@@^^----------,,,,,,,,,,,,,a#####################a,----------,,^^^^^@@WWWWW^^^TTTTT^^^^^^^^^^^^^^^^^^^#
+D:# TTTT TTT @^^^@^@@^^@^^^^@ @@WWWWWWWWWWWWWWWWWW@@^^^^----,,,,,,,,,,,,,,,,a#####################a,---------,,^^^@@@WWWWW@^^TTT TTT^^^^^^^^^^^^^^^^^^#
+D:# TTT TTT T TTT @^^^^^^^^^^^@ @@@WWWWWWWWWWWWWWWWW@@@^^,,,,,,-------------,#######################,------,,,^^^@@WWWWWWW@^^TTT TTT^^^^^^^^^^^^^^^^^^^#
+D:# TTT T TTT T TT @^^@ @@@@@WWWWWWWWWWWWWW@#,,,,,^^^------------,---#################---,-----,,^^^@@WWWWWWWW@^^TTT TTT^^^^^^^^^^^^^^^^^^^^#
+D:# TTT T TTTTTTT TT @@@@@WWWWWWWWWWW#,,,,,#@@^^^^^^^^------,--#################---,-,,,,^^^@@WWWWWWWWW@^^TT TTT^^^^^^^^^^^^^^^^^^^^^^#
+D:# TT TTTTTT,,TT,,TT,, @@@@WWWWWWW#,,,,,#WWW@@@@@@@^^------,--------------------,,,,^^^^@@WWWWWWWWWW@^^TT TTT^^^^^^^^^^^^^^^^^^^^^^^#
+D:# TT TTT TT ,,,TT,,TT,,T,, ,,,,,,, @@@@WWW#,,,,,#WWWWWWWWWW@@@^^^^^^,,,,,,,,,,,,,,,,,,,,,,^^^^@@@WWWWWWWWWW@@^^TT TTT^^^^^^^^^^^^^^^^^^^^^^^^#
+D:# TTT T ,,TTT TTT TTTTT,, ,,,,,,,,,,,,,,, @@W#,,,,,#WWWWWWWWWWWWWW@@@@@^^^^^^^^^^^^^^^^^^^^^^^^@@@WWWWWWWWWWW@@@^^TT TTT^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:# TTTT ,,TT TTTT,,,,,, ,,,, ,,,,, ,,,,,,,,,,@#,,,,,#WWWWWWWWWWWWWWWWWWWW@@@@@@@@@@@@@@@@@@@@@@@@WWWWWWWWWWWW@@@@^^TT TT^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:# T TTT T,,TT T TT TT,,,,^^,,,, ,,,, ,,,, ,,,, ,,,, ,,,,,,,,@@#@@@@@WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW@@@@^^^^TT TT^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:# TTT T,,TT TT TT,,,,^^^^^^,,,, ,,,, ,,,,, ,,,, ,,,,@@@ @@@@@WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW@@@^^^^TTT TT^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:# T,,TTT T,,,,^^@@^^^^@ @^@,,,,, ,,,, @@@@@@WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW@@@@TTTTTTTT TT^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:# ,,,,,,TTTT TTTT TTTT,,,,^^@ @^^^@ ,,,,,,,,,, @@@@@@@@WWWWWWWWWWWWWWWWWWWWW@@@@@@ TTTTTTTTT^^@@^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:# ,,,,^^^^^^TTT TTT^^,,,,^^@ @^^^^^@ ,,,,, @@@@@@@@@@@@@@@@@@@@@@@ @^@TTTT^^@ @^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:# ,,,,,^^^^@ @^^^TTTTTTTT^^^^,,,,^^@ @^^^^^^@ ,,, @^^^@ ^^^^^^^^^^^^^^^^^^^^^^#
+D:# ,,,,^^^^@ @^^^^^^^^^^^^^,,,,^^@ @^^^^^^^^^@ @^^^^@^^^^^@^^^^^^^^^@ @^^^@ ^^^^^^^^^^^^^^^^^#
+D:#,,,,,^^^^@ @^^^^^^^^^,,,,^^@ @^^^^^^^^^^^^^^^^@ @^^^@ @^^^@ @^^^^@^^^@ @^^^@ ^^^^^^^^^^^^^#
+D:#^^^^^^@ @^^^^^^^,,,,^^@ @^^^@ @^^^@^^^@@^^^^^^^^^^^^^^^^^^^^@@^^^@^^^@^^^@^^^@^^^@^^^@@^^^@@^^^@@^^^@ ^^^^^^^^^#
+D:# @^^^^^,,,,^^@ @^^^^@ @^^^@ @^^^@ @^^^@^^^@^^^@^^^@^^^@^^^@^^^@^^^@@^^^@@^^^@ ^^^^^^#
+D:# @^^^,,,,^^@ ^^^#
+D:# @^^,,,,^^@ ^^#
+D:# @^^,,,,^^@ #
+D:# @^^,,,,^^@ #
+D:# @^^,,,,^^@ #
+D:# @^^,,,,^^@ #
+D:# @^^,,,,^^@ #
+D:# @^^,,,,^^@ #
+D:# @^^,,,,^^@ #
+D:# @^^,,,,^^@ #
+D:# @^^,,,,^^@ #
+D:# @^^,,,,^^@ #
+D:# @^^,,,,^^@ #
+D:# @^^,,,,^^@ #
+D:# @^^^,,,, #
+D:# @^^,,,, #
+D:# @^^,,,, #
+D:# @^^,,,, #
+D:# @^^,,,, #
+D:# @^^,,,, #
+D:# @^^,,,, #
+D:# @^^,,,, #
+D:# @^^,,,, #
+D:# @^^,,,, #
+D:# @^^,,,, #
+D:# @^^,,,, #
+D:# @^^,,,, #
+D:###################################################################################################################################################################################################### \ No newline at end of file
diff --git a/lib/mods/theme/edit/t_info.txt b/lib/mods/theme/edit/t_info.txt
new file mode 100644
index 00000000..8a525ede
--- /dev/null
+++ b/lib/mods/theme/edit/t_info.txt
@@ -0,0 +1,125 @@
+# File: t_info.txt
+
+# Includes the town definitions
+
+# Preferences for the town features
+%:t_pref.txt
+
+# Town Bree
+?:[AND [EQU $TOWN 1] [EQU $TOWN_DESTROY1 1] ]
+%:t_d_bree.txt
+?:[AND [EQU $TOWN 1] [NOT [EQU $TOWN_DESTROY1 1] ] ]
+%:t_bree.txt
+?:1
+
+# Town Gondolin
+?:[AND [EQU $TOWN 2] [EQU $TOWN_DESTROY2 1] ]
+%:t_d_gond.txt
+?:[AND [EQU $TOWN 2] [NOT [EQU $TOWN_DESTROY2 1] ] ]
+%:t_gondol.txt
+?:1
+
+# Minas Anor
+?:[AND [EQU $TOWN 3] [EQU $TOWN_DESTROY3 1] ]
+%:t_d_mina.txt
+?:[AND [EQU $TOWN 3] [NOT [EQU $TOWN_DESTROY3 1] ] ]
+%:t_minas.txt
+?:1
+
+# Town Caras Galadhon
+?:[AND [EQU $TOWN 4] [EQU $TOWN_DESTROY4 1] ]
+%:t_d_lori.txt
+?:[AND [EQU $TOWN 4] [NOT [EQU $TOWN_DESTROY4 1] ] ]
+%:t_lorien.txt
+?:1
+
+# Khazad-Dum
+?:[AND [EQU $TOWN 5] [EQU $TOWN_DESTROY5 1] ]
+%:t_d_khaz.txt
+?:[AND [EQU $TOWN 5] [NOT [EQU $TOWN_DESTROY5 1] ] ]
+%:t_khazad.txt
+?:1
+
+# Beorn's Halls
+?:[AND [EQU $TOWN 6] [EQU $TOWN_DESTROY6 1] ]
+%:t_d_beorn.txt
+?:[AND [EQU $TOWN 6] [NOT [EQU $TOWN_DESTROY6 1] ] ]
+%:t_beorn.txt
+?:1
+
+# Cerin Amroth
+?:[AND [EQU $TOWN 7] [EQU $TOWN_DESTROY7 1] ]
+%:t_d_cerin.txt
+?:[AND [EQU $TOWN 7] [NOT [EQU $TOWN_DESTROY7 1] ] ]
+%:t_cerin.txt
+?:1
+
+# Dale
+?:[AND [EQU $TOWN 8] [EQU $TOWN_DESTROY8 1] ]
+%:t_d_dale.txt
+?:[AND [EQU $TOWN 8] [NOT [EQU $TOWN_DESTROY8 1] ] ]
+%:t_dale.txt
+?:1
+
+# Edoras
+?:[AND [EQU $TOWN 9] [EQU $TOWN_DESTROY9 1] ]
+%:t_d_edoras.txt
+?:[AND [EQU $TOWN 9] [NOT [EQU $TOWN_DESTROY9 1] ] ]
+%:t_edoras.txt
+?:1
+
+# Esgaroth
+?:[AND [EQU $TOWN 10] [EQU $TOWN_DESTROY10 1] ]
+%:t_d_esga.txt
+?:[AND [EQU $TOWN 10] [NOT [EQU $TOWN_DESTROY10 1] ] ]
+%:t_esga.txt
+?:1
+
+# Helm's Deep
+?:[AND [EQU $TOWN 11] [EQU $TOWN_DESTROY11 1] ]
+%:t_d_helm.txt
+?:[AND [EQU $TOWN 11] [NOT [EQU $TOWN_DESTROY11 1] ] ]
+%:t_helm.txt
+?:1
+
+# Henneth Annun
+?:[AND [EQU $TOWN 12] [EQU $TOWN_DESTROY12 1] ]
+%:t_d_henn.txt
+?:[AND [EQU $TOWN 12] [NOT [EQU $TOWN_DESTROY12 1] ] ]
+%:t_henn.txt
+?:1
+
+# Hobbiton
+?:[AND [EQU $TOWN 13] [EQU $TOWN_DESTROY13 1] ]
+%:t_d_hobb.txt
+?:[AND [EQU $TOWN 13] [NOT [EQU $TOWN_DESTROY13 1] ] ]
+%:t_hobb.txt
+?:1
+
+# Imladris
+?:[AND [EQU $TOWN 14] [EQU $TOWN_DESTROY14 1] ]
+%:t_d_imlad.txt
+?:[AND [EQU $TOWN 14] [NOT [EQU $TOWN_DESTROY14 1] ] ]
+%:t_imlad.txt
+?:1
+
+# Osgiliath
+?:[AND [EQU $TOWN 15] [EQU $TOWN_DESTROY15 1] ]
+%:t_d_osgili.txt
+?:[AND [EQU $TOWN 15] [NOT [EQU $TOWN_DESTROY15 1] ] ]
+%:t_osgili.txt
+?:1
+
+# Pelargir
+?:[AND [EQU $TOWN 16] [EQU $TOWN_DESTROY16 1] ]
+%:t_d_pelar.txt
+?:[AND [EQU $TOWN 16] [NOT [EQU $TOWN_DESTROY16 1] ] ]
+%:t_pelar.txt
+?:1
+
+# Thranduil's Halls
+?:[AND [EQU $TOWN 17] [EQU $TOWN_DESTROY17 1] ]
+%:t_d_thrand.txt
+?:[AND [EQU $TOWN 17] [NOT [EQU $TOWN_DESTROY17 1] ] ]
+%:t_thrand.txt
+?:1 \ No newline at end of file
diff --git a/lib/mods/theme/edit/t_khazad.txt b/lib/mods/theme/edit/t_khazad.txt
new file mode 100644
index 00000000..73e93956
--- /dev/null
+++ b/lib/mods/theme/edit/t_khazad.txt
@@ -0,0 +1,114 @@
+# Town Name: Khazad-Dum
+# by fearoffours (fearoffours@moppy.co.uk)
+#
+# Created for ToME
+
+F:o:207:3
+
+###################### Buildings ########################
+
+# Fighters Hall
+F:f:74:3:0:0:0:0:0:17
+
+# Paladins Guild
+F:g:74:3:0:0:0:0:0:20
+
+# Inner Temple
+F:h:74:3:0:0:0:0:0:19
+
+# Mining Supplies
+F:i:74:3:0:0:0:0:0:59
+
+# Default for Quest 25 = entrance is quest entrance
+F:w:8:3:0:0:0:0:0:25
+
+# Seat of Durin
+F:k:74:3:0:0:0:0:0:87
+
+# Inn
+F:n:74:3:0:0:0:0:0:70
+
+# Eagles
+F:p:74:3:0:0:0:0:0:22
+
+# Force dwarven monsters
+f:DWARVEN
+
+############### Quest 25 - Evil cave finished = house ###############
+?:[EQU $QUEST25 2]
+F:w:74:3:0:0:0:0:0:7
+?:[EQU $QUEST25 5]
+F:w:74:3:0:0:0:0:0:7
+?:1
+
+# Town Layout
+D:######################################################################################################################################################################################################
+D:#ooooooooooooo####^^^^^^^^^#######^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#####oooo#######oo######^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^##########oooooooooo CCCCCCC #
+D:#ooo##ooooooooo#####^^^^^##########^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^########ooo########ooo##########^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^################oooooooooooo CCCCCCCC #
+D:##oo###oo####oo##############################^^^^^^^^^^^^^^^^^########################oooo#########oo#### ###########^^^^^^^^^^^^^^^^^^^^^^^^####### #######oooo########## CCCCCCCC #
+D:##############o#########oo###oo###################^^^^^^^############################oooo#########oo###### ################################# #####ooooooooo############# CCCCCCCC ; #
+D:#^^^^########oooooooooooooo##ooooooooo############################# ##################oooo########oo########### ########################## ######ooooooooo################ CCCCCCCC ; #
+D:#############ooooooooooooooooooooooooooo###### ###########1###### ##############2####oooo#######o##o##3####f##### ##g####4####h###### ###########ooo######################## CCCCCCCC ; #
+D:#^#############ooooo##################oo### # #### # ##### #### ############### ###ooo########ooo## ## ###### # ## ## ## # #######ooooo########################### CCCCCCCC #
+D:#^^################oo#################ooooo#### ## ; ;; o ; o ## # ooooooooo############################ CCCCCCCC #
+D:#^^^^################o##########o#####oooooooooooooooooooooo o o ; oooooooooooooooooooooooo##ooo############################ CCCCCCC #
+D:#^^^^^^################################# ## ; o ; ; o o ; o ##o################################### CCCCCCC#
+D:#^^^^^^################################ ### o ### o ### o ###; o ### ######################################## CCCCCC#
+D:#^^^^^################################# ##### o ##### o ##### o ##### o ##### ######################################## CCCCCC#
+D:#^^^^^^^################################ #######;; o ####### o ####### o ####### o ####### ####################################### ; CCCCCC#
+D:#^^^^^^^^################################ # ####### o ; ####### o ####### o ####### o ####### ######################################## CCCCCC #
+D:#^^^^^^^################################### ##### o ; ;##### o ##### o ##### ; o ##### ;####################################### CCCCCCC #
+D:#^^^^^^^^^################################ ### o ### o ### o ### o ### # #################################### CCCCCC ; #
+D:#^^^^^^^^^################################# o o o o ## ################################## CCCCCC #
+D:#^^^^^^^^^^################################ ; oooooooooooo o o oooooooooooo 5################################ CCCCCC ; #
+D:#^^^^^^^^^^^^^########################### o o o o ################################# CCCCCCC #
+D:#^^^^^^^^^^^^^^^########################## ### o ### o o ;### o ### ################################ CCCCCCC ; #
+D:#^^^^^^^^^^^^############################# ##### ; o ##### o o ##### o ##### ; ###############################; CCCCCCC ; #
+D:#^^^^^^^^^############################### ; ####### o ####### o ; o ####### o ####### ############################ CCCCCCC #
+D:#^######################################### ; ####### oooooooo ####### o o ####### oooooo ####### o ; ##############################; CCCCCCC #
+D:#################ooo###################### ; ##### o ##### o o ##### o ##### ###############oo############## CCCCC; #
+D:####oo##ooo#####o#######o###ooo########### ### ; o ### o o ### o ; ### ; ;; #########oo###oooooo#####oo###### CCCCC ; #
+D:#ooooooooooooooooooooooooooooooo##oooooooo ; o ; o o o ; ;; ; oooooooooooo##oooooooo##oooooooooo CCCCC ; #
+D:#ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo CCCCCC #
+D:#oooooooooooooooooo##oooooo##oooooo##ooooo ; o o ; ooooooooo#oooooooooooooooooooooooo CCCCC #
+D:#p#######################oo####ooooo####### ### ### o o ###; ### ######o####oo####oo######oo######; CCCCC #
+D:#^^#######################o########### ##### ##### o o ##### ##### ######o####################oo#### CCCCC #
+D:#^####################################### #######;; ; ####### o k o ####### ####### ####oo######################### CCCCCC #
+D:#^^######################################## ####### ; ####### o o ####### ####### ######o############oo########## CCCCCCC #
+D:#^^^###############ooo################### ##### ; ;##### o o ##### ; ##### ;; ######oo########ooooo####### CCCCCCCC #
+D:#####oo##oo#####oooooooo##############oo## ### ; ### o o ### ### ########oooo##oooooo####### CCCCCCCCC ; #
+D:#ooooooooooo###ooooooooooooooooooooooooooo o o ooooooooooooooooooooooooooo CCCCCCCC #
+D:#oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo CCCCCCCC ; #
+D:#^ooooooooooooooooo###oooooooooo##oooooooo o o o o ooooooo####ooooooooooooo CCCCCCCC #
+D:#^^#o###ooo#####ooo#####ooooo########oo# ### ; o ### o o ;### o ### oo#########ooooo###oo# CCCCCCCC ; #
+D:#^^^^^###o################oo############# ##### ; o ##### o o ##### o ##### ; ###########oo######## CCCCCCCC ; #
+D:#^^^^^^^################################## ; ####### ooooooo ####### o ; o ####### ooooo ####### ######################## CCCCCCCCC #
+D:#^^^^^^^^^^############################## ; ####### o ; ####### o o ####### o ####### o ; ########################## CCCCCCCC #
+D:#^^^^^^^^^^^^^^^######################### ; ##### o ##### o o ##### o ##### ############################ CCCCCCCC ; #
+D:#^^^^^^^^^^^^^^^^^^^################### ### ; o ### o o ### o ; ### ; ;; ############################ CCCCCCCC #
+D:#^^^^^^^^^^^^^^^^^^^#################### ; o ;; o ; o o ; ############################ CCCCCCCC ; #
+D:#^^^^^^^^^^^^^^^^^^###################### ooooooooooo o o oooooooooooo ;; ; 7########################### CCCCCCCC ; #
+D:#^^^^^^^^^^^^^^^^^^^^^^################# ; o ; ; o o ; o ############################# CCCCCCCC #
+D:#^^^^^^^^^^^^^^^^^^^^^^^^############## ### o ### o ### o ###; o ### ############################# CCCCCCCCCC #
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^############ ##### o ##### o ##### o ##### o ##### ######################## CCCCCCCCCCC #
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^########## #######;; ; o ####### o ####### o ####### o ####### ########################### CCCCCCCCCCC #
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^#########i ####### o ; ####### o ####### o ####### o ####### ############################ CCCCCCCCCCC #
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^########### ##### o ; ;##### o ##### o ##### ; o ##### ; ############################## CCCCCCCCCCC #
+D:#^^^^^^^^^^^^^^^^^^^^^^^############## ### ; o ### o ### o ### o ### ############################## CCCCCCCCCCC ; #
+D:#^^^^^^^^^^^^^^^^^^^^^^################# o o o o #########oo###oo################# CCCCCCCCCC #
+D:#^^^^^^^^^^^^^^^^^^#############o#######oooooooooooooooooooooo ## o o oooooooooooooooooooooooooooooooooooo################## CCCCCCCC ; #
+D:#^^^^^^^^^^^^^^^^^############ooooooooooo# ### ## ######## o o ## o ## ## oooooo##oooooooooo################### CCCCCCC #
+D:#^^^^^^^^^^^#################ooooooooooo#### ###### ### #### ############# ####oooo###### #ooo# ### ###### # ### ## ##### ####################ooo##################### CCCCCCC #
+D:#^^^^^^^^^^###################oo######oo### ########### #######9####################oooo########oooo############w### #####n## ###### ####################oo###################### CCCCCCC #
+D:#^^^^^^^##########oo####oo####ooo######### ############# ##############^^^##########ooooo########oo###################################### #########^######oooo##ooo################## CCCCCCC #
+D:##^^^^^#########oooooooooooooooo#################^^####### ###########^^^^^###########ooooo######ooo####################################### #####^^^#######ooooooooooooo############# ; CCCCCCC#
+D:#^^^##########ooooooooooo##ooooo######^#########^^^^##################^^^^^^^^^^^######ooo#######oooo#########^^^^^^^^^^^^^^^^^^^########### #####^^^#######oo##oooooooo############# CCCCCC#
+D:##############ooooo##########oo######^^^#####^^^^^^^^###############^^^^^^^^^^^^^^#####oooo#######ooo######^^^^^^^^^^^^^^^^^^^^^^^^^^^^###### ####^^^^^###############ooo############## CCCCC#
+D:########ooo#####oo##################^^^^^^^^^^^^^^^^^#############^^^^^^^^^^^^^^^^^####oo########oooo#####^^^^^^^^^^^^^^^^^^^^^^^^^^^########### #######^^^^^#############ooo#ooo######## CCCCCC#
+D:#o##oooooooooooooooo##############^^^^^^^^^^^^^^^^^^^^^^#########^^^^^^^^^^^^^^^^^^#####oo########oo######^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^####### # ######^^^^^^^^^^^^########oooooooooooooo CCCCC #
+D:#oooooooooooooooooo########^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^########oooo#######ooooo###^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^##############^^^^^^^^^^^^^^^#######ooooooooooo CCCCC #
+D:######################################################################################################################################################################################################
+
+# Default starting position
+# ?:[EQU $LEAVING_QUES 0]
+# P:31:32
diff --git a/lib/mods/theme/edit/t_lorien.txt b/lib/mods/theme/edit/t_lorien.txt
new file mode 100644
index 00000000..a4a63172
--- /dev/null
+++ b/lib/mods/theme/edit/t_lorien.txt
@@ -0,0 +1,185 @@
+# File: t_lorien.txt
+
+# Caras Galadhon map by furiosity <furiosity@zionmainframe.net>
+# Original Lothlorien map by Akhronath <zzhou22876@aol.com>
+
+# NB! The additional terrain features and stores (if any) assume usage of the following files from the 'theme' module:
+# f_info.txt, t_pref.txt, st_info.txt, and ba_info.txt
+# Please download the module and refer to the files for the terrain feature definitions http://modules.t-o-m-e.net/
+# Don't forget to modify the maximum number of terrain features, etc. in misc.txt as well.
+
+# Default for Mage/Fireproof Quest = entrance is tree
+F:z:96:3
+
+# Default for Quest 10 = entrance is tree
+F:y:96:3
+
+# Default for Quest 11 = entrance is tree
+F:x:96:3
+
+# Default for entrance to the Void, entrance is dirt
+F:v:88:3
+
+# Default for Quest 22 = entrance is quest entrance
+F:w:8:3:0:0:0:0:0:22
+
+############### Quest 22 - Wolves hut finished = house ###############
+?:[EQU $QUEST22 2]
+F:w:74:3:0:0:0:0:0:7
+?:[EQU $QUEST22 5]
+F:w:74:3:0:0:0:0:0:7
+?:1
+
+############### Entrance to the Void ###############
+?:[EQU $QUEST20 1]
+F:v:7:3:0:0:0:0:0:11
+?:1
+
+############### Quest 10 - Spiders of Mirkwood ###############
+# Quest 10 taken, entrance is quest entrance
+?:[EQU $QUEST10 1]
+F:y:8:3:0:0:0:0:0:10
+?:1
+
+############### Quest - Mage/Fireroof quest ###############
+# Mage/Fireproof Quest taken, entrance is quest entrance
+?:[EQU $QUEST"Old Mages quest" 1]
+F:z:8:3:0:0:0:0:0:"Old Mages quest"
+?:1
+
+### Additional terrain features ###
+
+# Flet
+F:o:220:3
+
+# Fosse (dry moat)
+F:p:242:3
+
+#Mallorn
+F:m:243:3
+
+#Small tree
+F:l:202:3
+
+###################### Buildings ########################
+
+# The Mirror
+F:a:74:3:0:0:0:0:0:23
+
+# Castle: Plot Lorien
+F:B:75:3:0:0:0:0:0:2
+
+# Seat of Ruling
+F:b:74:3:0:0:0:0:0:24
+
+# Inn
+F:c:74:3:0:0:0:0:0:69
+
+# Beastmaster Shanty
+F:d:74:3:0:0:0:0:0:16
+
+# Fighters Hall
+F:f:74:3:0:0:0:0:0:17
+
+# Wizards Spire
+F:g:74:3:0:0:0:0:0:25
+
+# Priests Circle
+F:h:74:3:0:0:0:0:0:26
+
+# Rangers Guild
+F:i:74:3:0:0:0:0:0:21
+
+# Nest
+F:j:74:3:0:0:0:0:0:22
+
+# Hunter store
+F:k:74:3:0:0:0:0:0:61
+
+# Museum
+F:q:74:3:0:0:0:0:0:57
+
+# Music shop
+F:r:74:3:0:0:0:0:0:64
+
+# Force elven monsters
+f:ELVEN
+
+# Town Layout
+
+D:######################################################################################################################################################################################################
+D:# OOO #
+D:# OOOOOOOOOOOOOOOOOOOOOOOOO #
+D:# OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO #
+D:# OOOOOOOOOOOppppppppppppppppppppppOOOOOOOOOOOO #
+D:# OOOOOOOOOpppppppppppppppppppppppppppppppppppOOOOOOOO #
+D:# OOOOOOOppppppppppppppppppppppppppppppppppppppppppppOOOOOOOy #
+D:# OOOOOOpppppppppppppppppppppppppppppppppppppppppppppppppppOOOOOO #
+D:# OOOOOppppppppppppppppppppppppppppppppppppppppppppppppppppppppOOOOOO #
+D:# OOOOOpppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppOOOOO #
+D:# OOOOppppppppppppppppppppppppTTTTTTTToxTTTTTTTTTpppppppppppppppppppppppOOOOO #
+D:# OOOOpppppppppppppppppppppTTTTT lo9ol TTTTTppppppppppppppppppppOOOO #
+D:# OOOOOpppppppppppppppppppTTT lol TTTpppppppppppppppppppOOOO #
+D:# OOOOppppppppppppppppppTTT l,,,l TTTppppppppppppppppppOOOO #
+D:# OOOOpppppppppppppppppTTT lllllll,,,lllllllll TTTppppppppppppppppOOOO #
+D:# OOOOppppppppppppppppTTT lll,,,,,,,,,,,,,,,,,,,lll loTTpppppppppppppppppOOO #
+D:# OOOOppppppppppppppppTz lll,,,,,,,,,,,,,,,,,,,,,,,,,ll lodoTTppppppppppppppppOOO #
+D:# OOOppppppppppppppppTTol ll,,,,lllllllll,,,llllolllll,,,,l l,,ol TTpppppppppppppppOOO #
+D:# OOOppppppppppppppppTTogol l,,,lllo l,,,l o0o ll,,,l l,,ll TTpppppppppppppppOOO #
+D:# OOOOppppppppppppppTT lo,,l l,,l oko l,,,l o ll,,l,,l TpppppppppppppppOOO #
+D:# OOOOppppppppppppppTT ll,,l l,,l o l,,,l l,,,l TpppppppppppppppOOO #
+D:# OOOppppppppppppppTT l,,l,,l l,,,l ll,,,l TpppppppppppppppOOO #
+D:# OOOpppppppppppppppT l,,,l ll,,,,,ll l,,l,,l TppppppppppppppOOO #
+D:# OOOpppppppppppppppT l,o,lll l,,l,,,l,,l ll,,l l,,l TppppppppppppppOOO #
+D:# OOOOppppppppppppppT l,o2o,,,ll l,,ll,,,ll,,l l,,,l l,,l TppppppppppppppOOO #
+D:# OOOppppppppppppppTT l,,lolll,,,l l,,l l,,,l l,,l ll,,ll l,,l TppppppppppppppOO #
+D:# OOOppppppppppppppT l,,l ll,,ll l,,l l,,,l l,,l,,,l o,,l TppppppppppppppOO #
+D:# OOOpppppppppppppTT l,,l l,,,ll,,l l,,,l ll,,l o6o,,l TppppppppppppppOOO #
+D:# OOOppppppppppppppT l,,l ll,,,,ll mm,mm ll,,,,l o l,,l TpppppppppppppOOO #
+D:# OOOppppppppppppppT l,,l o l,,,,,lmm-----mm,,,ll,,l l,,l TppppppppppppppOOO #
+D:# OOppppppppppppppTT l,,l oro l,,ll,,,mm-----mm,ll l,,l l,,l TppppppppppppppOOO #
+D:# OOppppppppppppppTTl l,,l o l,,l l,,---@@@---mm l,,l l,,l TppppppppppppppOOO #
+D:# OOppppppppppppppTlollllll,,lllllllllllll,,lllllmm--@@V@@--mmllllll,,lllllllllll,,llllllllolTppppppppppppppOOO #
+D:# OOppppppppppppppToio,,,,,,,,,,,,,,,,,,,,,,,,,,,,,--@VWV@--,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,ohoTppppppppppppppOOO #
+D:# OOppppppppppppppTlollllll,,lllllllllllll,,lllllmm---@V@@@-mml l,,lllllllllll,,llllllllolTppppppppppppppOOO #
+D:# OOppppppppppppppTTl l,,l l,,l mm,-----VV@,,,ll l,,l l,,l TppppppppppppppOOO #
+D:# OOOppppppppppppppT l,,o l,,l l,mmm--o-@VV@m,,,ll,,lo l,,l TppppppppppppppOO #
+D:# OOOppppppppppppppT l,o4o l,,l,,l mmobom@VV@ll,,,lloqo o,,l TppppppppppppppOO #
+D:# OOOppppppppppppppT l,ol l,,,l mmomm@VVV@ l,,,,lo o5o,l TTpppppppppppppOOO #
+D:# OOOpppppppppppppppT l,,l ll,,,ll l,,,l @@VV@@lll,,,ll o,l TppppppppppppppOOO #
+D:# OOOppppppppppppppT l,,l ll,,,ll,,l l,,,l @VVV@ ll,,,ll l,,l TTpppppppppppppOOO #
+D:# OOOpppppppppppppppT l,,l l,,,ll l,,l l,,,l l,@VV@ ll,,,l l,,l TppppppppppppppOOO #
+D:# OOOppppppppppppppTT l,,l lll,,ll l,,ll,,,l l,,l@VV@ ll,,l,,l TpppppppppppppppOO #
+D:# OOOpppppppppppppppT l,,ll,,,,l l,,l,,,ll,,l @VVV@ ll,,ll TTppppppppppppppOOO #
+D:# OOOpppppppppppppppTT l,,,,,ll l,,,,,o,,l @VV@@ l,,l,,ll TTpppppppppppppppOO #
+D:# OOOpppppppppppppppT l,,,ll ll,,o1ol @VVV@ l,,l ll,,l TTpppppppppppppppOOO #
+D:# OOOppppppppppppppppT ll,,l,,l l,,,ol l,@VV@ l,,l ll,o TTpppppppppppppppOOO #
+D:# OOOppppppppppppppppTT lo,,l l,,l o l,,,l l,,l@VV@,,l owoTTpppppppppppppppOOO #
+D:# OOOppppppppppppppppTTlofol l,,llo3olllllllll,,,lllllll,,,,@VVV@l oTppppppppppppppppOOO #
+D:# OOOpppppppppppppppppTTol l,,,,o,,,,,,,,,,,,,,,,,,,,,lllv@@VV@ TTppppppppppppppppOOO #
+D:# OOOOpppppppppppppppppTT lll,,,,,,,,,,,,,,,,,,,,,,l @VVV@@VV@@ TTpppppppppppppppppOOO #
+D:# ##7OOOOpppppppppppppppppTTT llllllllloll,,,lllllll @VWaWV@@VVV@ TTppppppppppppppppppOOO #
+D:# B## OOOppppppppppppppppppTTT ocol,,,l @VVV@ @VV@TppppppppppppppppppOOOO #
+D:# OOOOpppppppppppppppppppTTT o l,,,lllll @@ TT@VV@pppppppppppppppppOOO #
+D:# OOOOpppppppppppppppppppppTTTT l,,,,,,,,l TTTTTp@VVV@ppppppppppppppOOOO #
+D:# OOOOpppppppppppppppppppppppTTTTTTT l,,,,,,,,TTTTTTTpppppp@@VV@@ppppppppppOOOO #
+D:# OOOOppppppppppppppppppppppppppppTTTTTTTTOOOppppppppppppppp@VVV@pppppppOOOOO #
+D:# OOOOpppppppppppppppppppppppppppppppppOOOppppppppppppppppp@VV@pppppOOOOO #
+D:# OOOOOpppppppppppppppppppppppppppppOOOppppppppppppppppppp@VV@ppOOOOO #
+D:# OOOOOOpppppppppppppppppppppppppOOOpppppppppppppppppppp@VVV@OOO #
+D:# OOOOOOpppppppppppppppppppppOOOppppppppppppppppppppOO@@VV@@ #
+D:# OOOOOOOpppppppppppppppppOOOppppppppppppppppOOOOOOOO@VVV@ #
+D:# OOOOOOOOOOpppppppppppOOOpppppppppppOOOOOOOOO @VV@ #
+D:# OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO @VVV@ #
+D:# OOOOOOOOOOOOOOOOOOOOOOO @@VVV@ #
+D:######################################################################################################################################################################################################
+
+# Default starting position
+?:[EQU $LEAVING_QUES 0]
+P:13:99
+
+# Starting position when coming from quest 12
+?:[EQU $LEAVING_QUES 12]
+P:26:109
+
+
diff --git a/lib/mods/theme/edit/t_minas.txt b/lib/mods/theme/edit/t_minas.txt
new file mode 100644
index 00000000..b96481d8
--- /dev/null
+++ b/lib/mods/theme/edit/t_minas.txt
@@ -0,0 +1,141 @@
+# File: t_minas.txt
+
+# Minas Anor: The Royal City of Gondor
+# Created by Mynstral (mynstral@thehelm.com)
+
+# Completed: 22/06/01
+
+# Between gate to gondolin -- need to finish the quest
+F:Z:63:3
+
+# Default for Quest 24 = entrance is quest entrance
+F:w:8:3:0:0:0:0:0:24
+
+#################### Quest 16 - The last Alliance ####################
+
+# Quest 16 finished, reward is a between gate
+?:[EQU $QUEST16 5]
+F:Z:176:3:0:0:0:0:0:0
+
+?:1
+
+############### Quest 24 - Haunted House finished = house ###############
+?:[EQU $QUEST24 2]
+F:w:74:3:0:0:0:0:0:7
+?:[EQU $QUEST24 5]
+F:w:74:3:0:0:0:0:0:7
+?:1
+
+#################### Buildings ####################
+
+# Library
+F:a:74:3:0:0:0:0:0:60
+
+# Castle
+F:b:74:3:0:0:0:0:0:14
+
+# Casino
+F:d:74:3:0:0:0:0:0:15
+
+# Inn
+F:e:74:3:0:0:0:0:0:11
+
+# Beastmaster Shanty
+F:f:74:3:0:0:0:0:0:16
+
+# Fighters hall
+F:g:74:3:0:0:0:0:0:17
+
+# Tower of Magery
+F:h:74:3:0:0:0:0:0:18
+
+# Inner temple
+F:i:74:3:0:0:0:0:0:19
+
+# Paladin guild
+F:j:74:3:0:0:0:0:0:20
+
+# Ranger guild
+F:k:74:3:0:0:0:0:0:21
+
+# Thunderlord's Hide
+F:l:74:3:0:0:0:0:0:22
+
+# Castle: Plot Minas Anor
+F:B:75:3:0:0:0:0:0:5
+
+# Library Quest
+F:x:63:3
+
+?:[EQU $QUEST"Library quest" 1]
+F:x:8:3:0:0:0:0:0:"Library quest"
+?:1
+
+############### Town Layout ###############
+
+D:######################################################################################################################################################################################################
+D:#^^########------------------ @@@@@@@ @@@@@@@@@ #
+D:#^^^------############---------- ^ @@VVVVV@@ @@VVVVVVV@@@@@@@ ,,, #
+D:#^^^----------###----#######------- ^^^^^ @VVVVVVV@@@@@ @@VV@@@@@@VVVVVV@@@@ ,, #
+D:#^^----ssss-----###--------####------ ^^^^^^ @VVVVVV@@VVV@@@ @VV@@ @@@@@@VVVV@@ ,, #
+D:#^^^---StSS-------###--#ssss--###------- ^^^^^^^^ @@VVVVVVVV@VVV@@@@@@@@ @@@V@@ @@@@VV@@@@ , #
+D:#^^----ssss----OO---##--#StSS---####------ ^^^^^^^^ @@V@V,@@@@@@VVVVVVVV@@@VVV@ @@VVVV@@ ,, #
+D:#^^----x#a#-----OOO--##--#sssss----###------ ^^^^^^^^ @@@@@ @@@@@@@@VVVVV@@@ @@@@VV@@@ ,,, #
+D:#^ ---------------OO--###-##d##------###----- ^^^^^^^^^^ @VVV@@ @@VVV@@ ,O, #
+D:#^ StSSSS-----ss---OO---##-----OOOOO---###---- ^^^^^^^^^^^ @@@ @@VVV@@ OO #
+D:#^^ssssss----Ssss---OOO--##---OOOOOOOO---##---- ^l^^^^^^^ @@VVV@ OO #
+D:#^ ####9#---sstSss---OOO--##-OOOOOOOOOOO--##---- ^^^^^ @@VVV@@ OO #
+D:#^^^-------##sssSss---OOO--#OOO--s--OOOOO--###--- @@@@@@@@@@ @@VVV@@ OO #
+D:#^^^######---##ssh--s--OOO-OOO--StS--OOOOO---##--- @@VVVVVVVV@@@@@@@V@@@@ OO #
+D:#^^^^----###---##--ssS--OOOOO#--ssss--OOOOOO--##--- @VVVVVVVVVVVV@@VV@@ OOO OO #
+D:#^^--------###----ssSs#--OOO-##-#####--OOOOOO--##--- ---- @VVVV@@@@VVVVVVV@@ OOOOO OOOOO #
+D:#^ ----------##--#stsi--OOOO--#---------OOOOOO--#------ -------- @@VVV@@ @@VVV@@@@ OO OO OO #
+D:#^^-----------###-#s#--OOOOOO-##-#sssss--OOOOOO,#####--- ----------- @@VVV@@ @@@@@ OO- OOOOOOOOO #
+D:#^^-------------##-#--OOO-OOO--#--ssssss--OOOOO,,,,,#---- ---ssssssss--- @VVV@@ -OO #
+D:#^^--------------#---OOO-t-OOO-##-#SStSS--OOOOOO,##,#---------ssssssss---- @VV@@ --OO- #
+D:#^^^--#----------##-OOO-sssOOO--#--ssssss-OOOOOO--#,#####-----SStSSSSS----- @@VV@ --OO- #
+D:#^^^--#-----------#OOO-##4##OOO-##-ssssss--OOOOOO-#,,######---ssssssss--O--- @@VVV@ -OO-- #
+D:#^^--###----------OOO-------OOO--#-####2#--OOOOOO-##,#k#,,##--ssssssss--O---- @VVV@@ --O-- #
+D:#^^^-###---------OOO#--SSStS-OOO-#---------OOOOO---#,,,,,,,#--ssssssss--O----- @@VV@@ --OO- #
+D:#^^-#####-------OOO-#--sssss-OOO-#--ssss--OOOOO--T-#,-----,#--#####7##--O------ @VVV@ --OO-- #
+D:#^^#######------OOO-##-###j#-OOO-##-ssss--OOOOO-TT-#------,#-------,,,,,O------ @@VV@@ --OO-- #
+D:#^^^########----OOO--#-------OOO--#-StSS--OOOOO-TT-#-----,,#------------O------- @VVV@@ --OO-- #
+D:#^^############-OOO--##-StSSS-OOO-#-ssss--OOOOO--T-#----,,##---ssssssss-O-------- @@VV@@ --OOO-- #
+D:#^^^#########---OOO---#-sssss-OOO-#-ssss--OOOOOO---#,,,,,##----SSSSStSS-O--------- @@@VVV@ --OOO-- #
+D:#^^#####B###----OOO---#-###6#-OOO-#-##g#---OOOOOO--#######-----ssssssss-O---------- @VVVV@@ ---OOO-- #
+D:#^^^#######-----OOO---#-------OOO-#---------OOOOOOOOOOOOOOOOO--###e####-O----------- @@VVV@@ ------OO-- #
+D:#^^#######bOOOOOOOO-^^^^^^^^^^MMM^^^^^^^^^^^^OOOOOOOOOOOOOOOOOOOOOOOOOOOO----------- @@@VVV@@ ---OOOOOO-- #
+D:#^^#######bOOOOOOO############III############^OOOOOOOOOOOOOOOOOOOOOOOOOOOOO--------- @@VVVV@@ ---OOOOOO-- #
+D:#^ #######bOOOOOOO############III############^OOOOOOOOOOOOOOOOOOOOOOOOOOOOOO--------- @VVVV@@ ----OOOOOO---- #
+D:#^ #######bOOOOOOOO-^^^^^^^^^^MMM^^^^^^^^^^^^OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO------- @VVV@@ ------OOOO------ #
+D:#^^^######Z-----OOO---#-sSss--OOO-#---------OOOOOOOOOOOOOOOOO-----------OOOOOOO------ ---------##@VVV@## --------OOOOO----- #
+D:#^^#########----OOO---#-sSss--OOO-#-sssss--OOOOOO--#######--------sssss-O-OOOOO----- --OOOO-----#######--------OOOOOO----- #
+D:#^^##########---OOO---#-stss--OOO-#-SStSS-OOOOOO---####,,##-------SStSS-O-OOOOO---- --OOOOOOOOOOOOOOOOOOOOOOOOOOOOOO----- #
+D:#^^############-OOO--##-sSss--OOO-#-sssss-OOOOO--T-##k#,,,##------sssss-O--OOOOO--- --OOOOOOOOOOOOOOOOOOOOOOOOOOOOOO----- #
+D:#^^#########----OOO--#--####-OOO--#-sssss-OOOOO-TT-#,,,,-,,#------sssss-O---OOOO--- --OOOOO-OOOOOOOOOOOOOOOOOOOOOOO------- #
+D:#^^#######------OOO-##-------OOO-##-###3#-OOOOO-TT-#,-----,#------###0#-O---OOOOO--- --OOOO---------#######--------------- #
+D:#^^-#####-------OOO-#--Ssss--OOO-#--------OOOOO--T-#,-----,#------------O----OOOO---- --OOOO---------##@VVV@##----------- #
+D:#^^^-###---------OOO#-#stss--OOO-#-ssssss--OOOOO---#,----,,#----ssssss--O-----OOOO---- ---OOOO--- @VVV@@ #
+D:#^^--###----------OOO--#sSs-OOO--#-StSSSS--OOOOOO-##,-,,,,##----SStSSS--O------OOOO---- --OOOOO---- @VVV@@ #
+D:#^^---#-----------#OOO--###-OOO-##-ssssss--OOOOOO-#,,,,####-----ssssss--O-------OOOO---- --OOOOO---- @VVVV@ #
+D:#^^^--#----------##-OOO----OOO--#--###5##-OOOOOO--#,#####-------ssssss-OO--------OOOO--------OOOOO---- @@VVV@@@ @@@@ #
+D:#^^^-------------#---OOO---OOO-##---------OOOOOO,##,#-----------####1#-O----------OOOO----OOOOOO----- @@VVVV@@@ @@@@@@ #
+D:#^^-------------##----OOO-OOO--#--ss------OOOOO,,,,,#------------------O-----------OOOOOOOOOOO----- @@@VVVV@@ @@@@@@@@@V@@@ #
+D:#^^^----------###--ss--OOOOOO-##-ssSs----OOOOOO,#####------------------O-------- ---OOOOOOOOO--- @@VVVV@@ @@@@@ @@@@@@@@@@@@@ #
+D:#^^^---------##---ssSs--OOOO--#--ssts#--OOOOOO--#------ ------ssssss--OO------ ---OOOOO----- @@VVVV@@@ @@@VVV@@@ @@@V@@@@@@@@ #
+D:#^^--------###---sstss#--OOO-##-ssSs#--OOOOOO--##----- ----StSSSS--O------ ----------- @@@VVVV@@@@@ @@@@VVVVVVV@@ @@@@@V@@V@@@V@@ #
+D:#^^------###-----#Sss#--OOOOO#--sSsf--OOOOOO--##----- ---ssssss--O----- ------- @@@VVVVVV@@@@@@@@@@@VVVVV@@@VVV@@@@@VVVV@@@@ @@@@ #
+D:#^^^######---ss---#s#--OOO-OOO--Ss#--OOOOO---##----- --###w##-OO----- @@VVVVVVVVVVVVVVVVV@@@@@ @@@VVVVVVV@@@@ #
+D:#^^^-------ssssS---#--OOO--#OOO--#--OOOOO--###----- --------O----- @@@@@@@@@@@@@@@@@@@ @@@@@@@@@ #
+D:#^^-sssss-#ssstss----OOO--##-OOO---OOOOO--##------ ------OO---- #
+D:#^^-SSStS--#sSsss#--OOO--##---OOOOOOOO---##------ ----O---- #
+D:#^^-sssss---#ss##--OO---##--X--OOOOO---###------ ---O--- #
+D:#^^^#####----##---OO--###--XXX-OOO---###------ --- #
+D:#^^^------------OOO--##---XXX#-----###----- #
+D:#^^--SStSS-----OO---##--XX###---####----- #
+D:#^^^-sssss--------###--###----###------ #
+D:#^^--#####------###--------####------ #
+D:#^^^----------###----#######------ #
+D:#^^^------############---------- #
+D:#^^########----------------- #
+D:######################################################################################################################################################################################################
diff --git a/lib/mods/theme/edit/t_osgili.txt b/lib/mods/theme/edit/t_osgili.txt
new file mode 100644
index 00000000..ea74d660
--- /dev/null
+++ b/lib/mods/theme/edit/t_osgili.txt
@@ -0,0 +1,136 @@
+# File: t_osgili.txt
+
+# Osgiliath map by furiosity <furiosity@zionmainframe.net>
+# NB! The additional terrain features and stores (if any) assume usage of the following files from the 'theme' module:
+# f_info.txt, t_pref.txt, st_info.txt, and ba_info.txt
+# Please download the module and refer to the files for the terrain feature definitions http://modules.t-o-m-e.net/
+# Don't forget to modify the maximum number of terrain features, etc. in misc.txt as well.
+
+### Additional terrain features ###
+
+#Anduin river
+F:a:227:3
+
+#Small tree
+F:b:202:3
+
+#Wooden board
+F:c:235:3
+
+#light post
+F:d:221:3
+
+# Altars
+F:k:161:3
+F:l:162:3
+F:m:163:3
+F:n:165:3
+F:w:166:3
+F:x:167:3
+F:y:168:3
+F:z:169:3
+
+### Buildings ###
+
+# The Twinkling Star inn
+F:e:74:3:0:0:0:0:0:68
+
+# The Castle of Stars
+F:f:74:3:0:0:0:0:0:85
+
+# Map store
+F:g:74:3:0:0:0:0:0:66
+
+# Museum
+F:h:74:3:0:0:0:0:0:57
+
+# Soothsayer
+F:i:74:3:0:0:0:0:0:12
+
+# Library
+F:j:74:3:0:0:0:0:0:13
+
+# Casino
+F:o:74:3:0:0:0:0:0:15
+
+# Fighters Hall
+F:p:74:3:0:0:0:0:0:17
+
+# Tower of Magery
+F:q:74:3:0:0:0:0:0:18
+
+# Inner Temple
+F:r:74:3:0:0:0:0:0:19
+
+# Paladins Guild
+F:u:74:3:0:0:0:0:0:20
+
+# Rangers Guild
+F:v:74:3:0:0:0:0:0:21
+
+D:######################################################################################################################################################################################################
+D:#---------------------------------------------------------#################@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@##########################---------------------------------------------------------#
+D:#OOOOOOOOOOOOOOOOOOOOOOOOOOOO-------------------------######,,,,,,,,,,,,,,,@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@@,,,,,,,,,,,,,,,,,,,,,,,,####-------------------------OOOOOOOOOOOOOOOOOOOOOOOOOOOOOO#
+D:#---------------------------OO--------------------#####,,,,,,,########,,,,@@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@,#####,,,#####,,,#####,,######---------------------OOO----------------------------#
+D:#----------------------------OO-----------------####,,,,,,,,,O7#######,,,,@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@@,,#####OOO#####OOO#####O,,,,,#####-----------------OOO-----------------------------#
+D:#-----------------------------OO--------------####,,,,,,,,,,OO########,,,@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@,,#####,,,#####,,,#####,O,,,,,,,#####-------------OOO------------------------------#
+D:#------------------------------OO----------####,,,,########O,O,,,,,,,,,,,@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@,,,,O,,,,,,,O,,,,,,,O,,,,OOOOO,,,,,####----------OOO-------------------------------#
+D:#-------------------------------OO-------####,,,,,Og#######O,O,,,,,,,,,,,@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@,,,,,OOOO,,,,OOOO,,,,OOOO,,,,,OOOO,,,####------OOO---------------------------------#
+D:#--------------------------------OO---####,,,,,,,O,########,,O,,,,,,,,,,,@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@,,,,,#####,,,#####,,,#####,,,,#####,,,####---OOO----------------------------------#
+D:#---------------------------------OO###,,,,,,,,,,,OO,,,,,,,,,O########,,,@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@@,,,,#####OOO#####OOO#####OOO,#####,,,,#####OOO-----------------------------------#
+D:#---------------------------------#OOd,,,,,,########O,,,,,,,,O3#######,,,@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@@@,#####,,,#####,,,#####,,,,#####,,,,,,,#OOO------------------------------------#
+D:#--------------------------------##dOOb,,,,,#######2O,,,,,,,,O########,,,@@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@,,,O,,,,,,,O,,,,,,,O,,,,,,,,O,,,,,,,,dOOd###----------------------------------#
+D:#-------------------------------###,bOOb,,,,########,O,,,,,,,O,,,,,,,,,,,,,@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@,,OOO,,,,,OOOO,,,,O,,,,,,,O,,,,,,,dOOd--###---------------------------------#
+D:#------------------------------##,,,,bOOb,,,,,,,,,,,,,O,,,,T,,O,,,,,,,,,,,,@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@,,#####,,,#####,,,T,,,,#####,,,,dOOd-----##--------------------------------#
+D:#-----------------------------##,,,,,,bOOb,,,,,,,,,,,,,O,,TTT,,O,########,,,@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@@,,#####OOO#####OOTTTOOO#####,,,dOOd-------##-------------------------------#
+D:#----------------------------##,,,,,#,,bOOb,,,,,########O,,T,,,,Oo#######,,,@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@,#####,,,#####,,,T,,,,#####,,dOOd---------##------------------------------#
+D:#---------------------------##,,,,,,#,,,bOOb,,,,#######5O,,,,,,,O########,,,@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@@,,,,O,,,,,,,O,,,,,,,,,,,,O,,,dOOd---TTTTT---##-----------------------------#
+D:#--------------------------##,,,,,,###,,,bOOb,,,########,O,,,,,,O,,,,,,,,,,,,@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@@@,,,,O,,,,,,,O,,,,,,OOOOO,,,dOOd---TTTTTTT---##----------------------------#
+D:#-------------------------##,,,,,,,###,,,,bOOb,,,,,,,,,,,,O,,,,,O,,,,,,,,,,,,,@@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@,#####,,,#####,,#####,,,,dOOd-----TTTTT-----##---------------------------#
+D:#------------------------##,,,,,,,#####,,,,bOOb,,,,,,,,,,,,OOO,,,O,########,,,,@@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@,,#####OOO#####,,#####,,,dOOd-----------------##--------------------------#
+D:#-----------------------##,,,,,,,,#####,,,,,bOOb,,,,,,########O,,,O0#######,,,,,,@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@,,#####,,,#####,,#####,,dOOdOOOOOOOOOOOOOOOOOOO##-------------------------#
+D:#----------------------##,,,,,,###########,,,bOOb,,,,,#######6O,,,O########,,,,,,@@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@,,,,O,,,,,,,O,,,,,,O,,,dOOd-O.###..#####..###.O-##------------------------#
+D:#----------------------##,,,,,,###########,,,,bOOb,,,,########,O,O,,,,,,,,,,,,,,,@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@,,,OO,,,,,,,,,OOOOOO,,,dOOd--O.###..#####..###.O-##------------------------#
+D:#----------------------##,,,#################,,bOOb,,,,,,,,,,,,,OOO,,,,,,,,,,,,,@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@,#####,,,,,,,#####,,,,dOOd-F-O.###############.O--##-----------------------#
+D:#---------------------##,,,,#################,,,bOOb,,,,,,,#######9O,,,,,,,,,,@@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@@,,#####OOOOOOO#####,,,dOOd-FF-O.###############.O--##-----------------------#
+D:#---------------------##,,,,########q########,,,,bOOb,,,,,,########O,,,,,,,,,@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@,,#####,,,,,,,#####,,dOOd-FFF-O..#############..O--##-----------------------#
+D:#---------------------##,,,,,,,,,,,,,,,,,,,,,,,,,,bOOb,,,,,########,,,,,,,,,,@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@@@,,,,,,,,,,,,,,,,,,,,,dOOd-FFFF-O..#############..O---##----------------------#
+D:#--------------------################,,,,,,,,,,,,,,dOOd,,,,,,,,,,,,,,,,,,,,d##@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@,##d,,,,,,,,,,,,,,,,,dOOd-FFFFF-O..#############..O---##----------------------#
+D:#--------------------##T-------------bbbbbbbbbbbbbbbbOObbbbbbbbbbbbbbbbbbbbbb############################################bbbbbbbbbbbbbbbbbbbOOd--------O..#############..O----##---------------------#
+D:#--------------------##TOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.###############.O----##---------------------#
+D:#--------------------##TOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.###############.O----##---------------------#
+D:#--------------------##TOOcccccccccccbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbOObbb############################################bbbbbbbbbbbbbbbbbbbOOd--------O.f##############.O----##---------------------#
+D:#--------------------##TOOc--VVVVV--c,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,dOOd,d##@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@##d,,,,,,,,,,,,,,,,dOOdbbbbbbb-O.f##############.O----##---------------------#
+D:#--------------------##TOOc-VVdWdVV-c,,,######,,,,,,,,,,,,,,,,,T,,,,,bOOb,,,,,@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@,,,,,,,,,,,,,,,,,,,dOOdbOOOOOb-O.f##############.O----##---------------------#
+D:#--------------------##TOOcVVVWWWVVVc,,,######,,,,,,,,,,,,,,,,TTT,,,bOOb,,,,,,,@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@,,,,dAAAAAAAAAd,,,,dOOdbOVVVOb-O.###############.O----##---------------------#
+D:#--------------------##TOOc-VVdWdVVOc,,,######,,,,,,,,,,,,,,,,,T,,,bOOb,,,,,,,,@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@,,,AAAAAAAAAAAAA,,,dOOdbOVVVbb-O.###############.O----##---------------------#
+D:#--------------------##TOOc--VVVVV-Oc,,,##h###,,,,,,,,######,,,,,,bOOb,,,,,,,,,,@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@,,,,,dAAAAAAAAAd,,,,dOOdbOOOOOOOO..#############..O----##---------------------#
+D:#--------------------##TOOcccccccccO,,,,,,O,,,,,,,,,,,######,,,,,bOOb,,,,,,,,,,,@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@,,,,,,,,,,,,,,,,,,,,,dOOdbbbbbbb-O..#############..O----##---------------------#
+D:#--------------------##TOOOOOOOOOOOO,,,,,,O,,,,,TT,,,,######,,,,bOOb##########,,,@aaaaaaaaaaaaaaaaaaaaaaaa###########dbbbbbbbbbbbbbbbbbbbbbbOO---------O..#############..O---##----------------------#
+D:#--------------------################,,,,,,O,,,TTTT,,,##pp##,,,bOOb,##########,,,@aaaaaaaaaaaaaaaa@@######OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO..#############..O---##----------------------#
+D:#---------------------##,,,,,,,,,,,,,,######O,,,TT,,,,,,O,,,,,bOOb,,##########,,,@aaaaaaaaaaaa######OOOOOO###########dbbbbbbbbbbbbbbbbbbbbbbbOO--------O.###############.O---##----------------------#
+D:#---------------------##,,,,,,,,,,,,,,######,O,,,,,,,,,O,,,,,bOOb,,,##1####e##,,@aaaaaaa######OOOOOO#######aaaaaaaa@,,,,,,,,,,,,,,,,,,,,,,,,,dOOdFFFFF-O.###############.O--##-----------------------#
+D:#----------------------##,,,######,,,,######,,O,,######O,,,,bOOb,,,,,,O,,,,O,,,d########OOOOOO#######aaaaaaaaaaaaaa@,,,,,,,dRRRRRRRRRRRd,,,,,,dOOdFFFF-O.###..#####..###.O--##-----------------------#
+D:#----------------------##,,,######,,,,##jj##,,,O,######O,,,bOOOOOOOOOOOOOOOOOOOOOOOOOOOO#######aaaaaaaaaaaaaaaaaaaa@,,,,,,,RRRRRRRRRRRRR,,,,,,,dOOdFFF-O.###..#####..###.O-##------------------------#
+D:#-----------------------##,,######,,,,,,O,,,,,,,O######O,,bOOb,,,,,,,,,,,,,,,,,d#########aaaaaaaaaaaaaaaaaaaaaaaaaa@,,,,,,,dRRRRRRRRRRRd,,,,,,,,dOOdFF-OOOOOOOOOOOOOOOOOOO##-------------------------#
+D:#------------------------##,##i###,,,,,,,O,,,,,,Or#####O,bOOb,,,,,,,,,,,,,,,,,,,@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,dOOdF-O------------------##-------------------------#
+D:#------------------------##,,,O,,,,,,,,,,O,,,,,,,OOOOOOObOOdbbbbbbbbbbbbbbbbbbd####################################dbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbOOd-O------TTTTT------##--------------------------#
+D:#-------------------------##,,,O,,,,,,,,,O,,,,,,,,O,,,,bOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO-----TTTTTTT----###--------------------------#
+D:#--------------------------##,,,,O######,O,######O,,,,bOOdbbObbbbbbbbbbbbbbbbbd####################################dbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbOO------TTTTT-----##---------------------------#
+D:#---------------------------##,,,O######,O,######O,,,bOOb,,bOb,,,,,,,,,,,,,,,,,,@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,dOOd-------------##----------------------------#
+D:#----------------------------##,,O######,O,######O,,bOOb,,,bOb,,,,,,,,,,,,,,@@@@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@@,,,#####,,,,,,,,,,,,,,,,,,,,#####,,,dOOd-----------##-----------------------------#
+D:#-----------------------------##,O##u###,O,##v###O,bOOb####bOb####,,,,,,,,,@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@,,#####OOOOOOOOOOOOOOOOOOOO#####,,,,dOOd--------###------------------------------#
+D:#------------------------------##,OOO,,,,O,,,OOOO,bOOb,#k,,dOd,,m#,,,,,,,,,@@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@@,,#####,,,,,,,,,,,,,,,,,,,,#####,,,,,dOOd------##--------------------------------#
+D:#-------------------------------##,,,OOOOOOOO,,,,bOOb,,#,,#NON#,,#,,,,,,,,@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@,,,O,,,,,,,,,,,,,,,,,,,,,,,,OOOO,,,,,dOOd----##---------------------------------#
+D:#--------------------------------###,,,,,,,T,,,,bOOb,,,#,,#NON#,,#,,,,,,,@@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@,,#####,,,,,,,,d,,,,,,,,,,,,,,#####,,,,dOO-d###----------------------------------#
+D:#----------------------------------###,,,,TTT,,bOOb,####,##NON##,####,,@@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@,,#####,,,,,,,,,,,,,,,OOOOOOOO#####,,,,,dOOOOO-----------------------------------#
+D:#------------------------------------###,,,T,,bOOb,,#y,,,#-NON-#,,,z#,@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@@@,,,#####,,,,,,,,,,,,,,O,#####,,#####,,,,,####OOOOO--------------------------------#
+D:#--------------------------------------###,,,bOOb,,,#w,,,#-NON-#,,,x#,@@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@,,,,,,,,O,,,,,,,,,,OOOOOO,,#####,,,,,,,,,####-----OOOOO------------------------------#
+D:#----------------------------------------###dOOb,,,,####,##NON##,####@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@,,,,,,#####,,,,,,,O,#####,,#####,,,,,,,####---------OOOOO----------------------------#
+D:#------------------------------------------OOOd,,,,,,,,#,,#N4N#,,#,,@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@,,,,,,,#####,,OOOOO,,#####,,,,,,,,,,,,####-------------OOOOO--------------------------#
+D:#-----------------------------------------OOO###,,,,,,,#,,#####,,#,,,@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@,,,,,,#####,O#####,,#####,,,,,,,,,####-------------------OOOO------------------------#
+D:#----------------------------------------OOO---###,,,,,#l,,,,,,,n#,,@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@@@,,,,,,,,,O,,O,#####,,,,,,,,,,,,,#####------------------------OOOO---------------------#
+D:#---------------------------------------OOO------###,,,###########,,@@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@@@,,,,,,,,,,,,,O,,,#####,,,,,,,,,,####-------------------------------OOOO------------------#
+D:#OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO--------###,,,,,,,,,,,,,,@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@,,,,,,,,,,,,,,,,,,,,,,,,,,,######-------------------------------------OOOOOOOOOOOOOOOOOOOO#
+D:#--------------------------------------------------###############@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@##############################------------------------------------------------------------#
+D:###################################################################################################################################################################################################### \ No newline at end of file
diff --git a/lib/mods/theme/edit/t_pelar.txt b/lib/mods/theme/edit/t_pelar.txt
new file mode 100644
index 00000000..0057518b
--- /dev/null
+++ b/lib/mods/theme/edit/t_pelar.txt
@@ -0,0 +1,105 @@
+# File: t_pelar.txt
+
+# Pelargir map by furiosity <furiosity@zionmainframe.net>
+# NB! The additional terrain features and stores (if any) assume usage of the following files from the 'theme' module:
+# f_info.txt, t_pref.txt, st_info.txt, and ba_info.txt
+# Please download the module and refer to the files for the terrain feature definitions http://modules.t-o-m-e.net/
+# Don't forget to modify the maximum number of terrain features, etc. in misc.txt as well.
+
+### Additional terrain features ###
+
+#Anduin river
+F:a:227:3
+
+### Buildings ###
+
+# The Grey Swan inn
+F:b:74:3:0:0:0:0:0:68
+
+# The Prince's Tower
+F:c:74:3:0:0:0:0:0:86
+
+# Music store
+F:d:74:3:0:0:0:0:0:64
+
+# Rune Shop
+F:e:74:3:0:0:0:0:0:62
+
+# Hunting Store
+F:f:74:3:0:0:0:0:0:61
+
+# Library
+F:i:74:3:0:0:0:0:0:13
+
+# Casino
+F:j:74:3:0:0:0:0:0:15
+
+# Beastmaster
+F:k:74:3:0:0:0:0:0:16
+
+D:######################################################################################################################################################################################################
+D:#-------------------------------------------------@VVVVV@##VVVVV@@-----------------------------------------------------------------------------------------------------------------------------------# #
+D:#-------------------------------------------------@VVVVV@####VVVVV@----------------------------------------------------------------------------------------------------------------------------------#
+D:#-------------------------------------------------@VVVVV@######VVVV@@@-------------------------------------------------------------------------------------------------------------------------------#
+D:#-------------------------------------------------@VVVVV@####,###VVVVV@@-----------------------------------------------------------------------------------------------------------------------------#
+D:#-------------------------------------------------@VVVVV@####,,####VVVVV@@---------------------------------------------------------------------------------------------------------------------------#
+D:#-------------------------------------------------@VVVVV@####,,,,####VVVVV@@@------------------------------------------------------------------------------------------------------------------------#
+D:#-------------------------------------------------@VVVVV@####,,,,,,#####VVVVV@@@---------------------------------------------------------------------------------------------------------------------#
+D:#-------------------------------------------------@VVVVV@####,####,,,,#####VVVVV@@-------------------------------------------------------------------------------------------------------------------#
+D:#-------------------------------------------------@VVVVV@####,####,,,,,,#####VVVVV@@@----------------------------------------------------------------------------------------------------------------#
+D:#-------------------------------------------------@VVVVV@####,###7,,,,,,,,,#####VVVVV@@@-------------------------------------------------------------------------------------------------------------#
+D:#-------------------------------------------------@VVVVV@####,,,,,,,TTTT,,,,,,#####VVVVV@@@----------------------------------------------------------------------------------------------------------#
+D:#-------------------------------------------------@VVVVV@####,,,,TTTT,TTTT,,,,,,,#####VVVVV@@@-------------------------------------------------------------------------------------------------------#
+D:#-------------------------------------------------@VVVVV@####,,,TTTT,,,TTTT,,,,,,,,,#####VVVVV@@@----------------------------------------------------------------------------------------------------#
+D:#-------------------------------------------------@VVVVV@####,,TTTT,,,,,,,,,,,,,,,,,,,,#####VVVVV@@@@------------------------------------------------------------------------------------------------#
+D:#-------------------------------------------------@VVVVV@####,TTTT,,,,###,,,,,,#######,,,,,#####VVVVV@@----------------------------------------------------------------------------------------------#
+D:#-------------------------------------------------@VVVVV@####,,,,,,,,,####,,,,,#######,,,,,,,#####VVVVV@@@-------------------------------------------------------------------------------------------#
+D:#-------------------------------------------------@VVVVV@####,,,,,,,,,,####,,,,###2###,,,,,,OOOO#####VVVVV@@@----------------------------------------------------------------------------------------#
+D:#-------------------------------------------------@VVVVV@####,,,,,,,,,,,####,,,,,,,O,,,,,OOOO,,,,,,##VVVVVVVV@@@-----------------------------------------------------------------------------------aa#
+D:#-------------------------------------------------@VVVVV@####,,,,,,,,,,,,####,,,,,,,O,OOOO,,,,,,,,,#VVVV###VVVVV@@@@----------------------------------------------------------------------------aaaaa#
+D:#-------------------------------------------------@VVVVV@####,,#######,,,,#######,,OOOO,,,,,,,,,,,#VVVV#@@#####VVVVV@@------------------------------------------------------------------------aaaaaaa#
+D:#-------------------------------------------------@VVVVV@####,,#######,,,,##4##OOOOO,,,,TTT,,,,,,#VVVV#,,,,,#####VVVVV@@@-----------------------------------------------------------------aaaaaaaaaaa#
+D:#-------------------------------------------------@VVVVV@####,,#######,,,,###OOO.,,,,,,TTTTT,,,,#VVVV#,,,,,,,,,#####VVVVV@@@-----------------------------------------------------------aaaaaaaaaaaaaa#
+D:#-------------------------------------------------@VVVVV@####,,###3###,,,,#OOO##.###,,,,TTT,,,,#VVVV#,,,,####,,,,,#####VVVVV@@@-----------------------------------------------------aaaaaaaaaaaaaaaaa#
+D:#-------------------------------------------------@VVVVV@####,,,,,O,,,,,,,OOOO##...####,,,,,,,#VVVV#O,,,,####,,,,,,,,#####VVVVV@@@@-----------------------------------------------aaaaaaaaaaaaaaaaaaa#
+D:#-------------------------------------------------@VVVVV@####,,,,,,O,,,OOOO,,,##......####,,,#VVVV#,,O,,,5###,,,,,,,,,O,#####VVVVV@@------------------------------------------aaaaaaaaaaaaaaaaaaaaaaa#
+D:#-------------------------------------------------@VVVVV@####,,,,,,,OOOO,,,,,,##.........####VVVV#,,,,OOOO,,,,,,,,,,,,,O,,,#####VVVVV@@@------------------------------------aaaaaaaaaaaaaaaaaaaaaaaaa#
+D:#-------------------------------------------------@VVVVV@####,,,,OOOO,,,TTT,,,##................#,,,,,,,,OOOO,,,,,,,,,,OOOOOOO#####VVVVV@@@------------------------------aaaaaaaaaaaaaaaaaaaaaaaaaaaa#
+D:#-------------------------------------------------@VVVVV@####,OOOO,,,,,TTTTT,.##...............####,,,,,,,,,OOO,,,,,,,,O,,,,,,,,,#####VVVVV@@@-----------------------aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#
+D:#-------------------------------------------------OOOOOOOOOOOOO,,,,,,,,,TTT,,,##..................####,,,,,,O,,OOO,,,,,O,,,,,,,,,,,,#####VVVVV@@@----------------aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#
+D:#-------------------------------------------------@VVVVV@####,,,,,,,,,,,,,,,,,##......,#cc#..........####,,,O,,,,,O,###d###,,,,,,,,,,,,#####VVVVV@@@---------aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#
+D:#-------------------------------------------------@VVVVV@#######################.....########...........####O,,,,,,O#######,,,,,,,,,,,,,,,#####VVVVV@-----aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#
+D:#-------------------------------------------------OVVVVVVVVVVVVVVVVVVVVVVVVVVV......c########c.............####,,#############,,,,,,,#####,,,#####VVVVV@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#
+D:#-------------------------------------------------OVVVVVVVVVVVVVVVVVVVVVVVVVVV.......########................OOOO6###########9OOOOOOOOO#,,,,,,,,#####VVV@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#
+D:#-------------------------------------------------@VVVVVVVVVVVVVVVVVVVVVVVVVVV.........#cc#...............#####,O#############O,,,,,,#####,,,#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#
+D:#-------------------------------------------------@VVVVV@#######################.......................####,,,,,,O,,#######,OO,,,,,,,,,,,,#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#
+D:#-------------------------------------------------@VVVVV@####,,,,,,,,,,,,OOOOO##....................#####,,,,,,,,,O,###e###O,,,,,,,,,,,#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#
+D:#-------------------------------------------------@VVVVV@####,,#####,,,,O,,,,,##..................###,,,,,,,,,,,,,,OOOOOOOO,,,,,,,,#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#
+D:#-------------------------------------------------@VVVVV@####,,####bOO,O,,,,,,##.................###,,,,,#######,,,,,,,,,,,,,,,,#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#
+D:#-------------------------------------------------@VVVVV@####,,#####,,O,,####,##................aaa##,,,,#######,,,,,,,,,,,,,#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#
+D:#-------------------------------------------------@VVVVV@####,,,,O,,,,OOO1###,##.........####aaaaaaa##,,,#######,,,,,,,,,,#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#
+D:#-------------------------------------------------@VVVVV@####,,,,O,,,,O,,####,##.....#####,,##aaaaaaa##,,,,,,,,,,,,,,,,#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#
+D:#-------------------------------------------------@VVVVV@####,,##f##,,,O,,,,,,##..####,,,,,,,##aaaaaaa##,,,,,,,,,,,,,######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#
+D:#-------------------------------------------------@VVVVV@####,,#####,,,,O,,,,,##O###,,,,,,,,,,##aaaaaaa##,,,,,,,,#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#
+D:#-------------------------------------------------@VVVVV@####,,#####,,,,,O,,,,#O###,,,,,,,,,,,,##aaaaaaa##,,,######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#
+D:#-------------------------------------------------@VVVVV@####,,,,O,,,,,,,,O,,,OO,,,,,#######,,,,##aaaaaaa#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#
+D:#-------------------------------------------------@VVVVV@####,,,,O,,,,,.,,OOOO,O,,,,,#######,,,,,##aaaaaaa##aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#
+D:#-------------------------------------------------@VVVVV@####,,##k##,,,,,O##j##,O,,,,#######,,,,,,##aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#
+D:#-------------------------------------------------@VVVVV@####,,#####,,,,O,#####,,O,,,#######,,,,,,###aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#
+D:#-------------------------------------------------@VVVVV@####,,#####,,,O,,#####,,,O,,,,,,,,,,,,,#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#
+D:#-------------------------------------------------@VVVVV@####,,,,O,,,,O,,,,,,,,,,,,O,,,,,,,,,#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#
+D:#-------------------------------------------------@VVVVV@####,,,,O,,,O,,,,,,,,,,,,,,O,,,,,#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#
+D:#-------------------------------------------------@VVVVV@####,,##i##,OOO0####,,,,,,,,O,#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#
+D:#-------------------------------------------------@VVVVV@####,,#####,O,,#####,,,,,,,#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#
+D:#-------------------------------------------------@VVVVV@####,,#####,O,,#####,,,,#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#
+D:#-------------------------------------------------@VVVVV@####,,,O,,,,O,,,,,,,,,#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#
+D:#-------------------------------------------------@VVVVV@####,,###,,,O,,,,,,#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#
+D:#-------------------------------------------------@VVVVV@####,,###,,,O,,,#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#
+D:#-------------------------------------------------@VVVVV@####,,,,,,,,O#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#
+D:#-------------------------------------------------@VVVVV@####,,,,,,#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#
+D:#-------------------------------------------------@VVVVV@####,,,#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#
+D:#-------------------------------------------------@VVVVV@##########aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#
+D:#-------------------------------------------------@VVVVV@#######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#
+D:#-------------------------------------------------@VVVVV@####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#
+D:#-------------------------------------------------@VVVVV@##aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#
+D:###################################################################################################################################################################################################### \ No newline at end of file
diff --git a/lib/mods/theme/edit/t_pref.txt b/lib/mods/theme/edit/t_pref.txt
new file mode 100644
index 00000000..1159e817
--- /dev/null
+++ b/lib/mods/theme/edit/t_pref.txt
@@ -0,0 +1,145 @@
+# File: t_pref.txt
+
+# Defines the preferences for the town features
+# letter:feature:cave_info:monster:object:ego:artifact:trap:special
+
+# Barrow-Downs entrance
+F:{:7:3:0:0:0:0:0:4
+
+# Mirkwood Forest entrance
+F:~:7:3:0:0:0:0:0:1
+
+# Land of Mordor entrance
+F:|:7:3:0:0:0:0:0:2
+
+# Angband Dungeon entrance
+F:>:7:3:0:0:0:0:0:3
+
+# Mountain chain
+F:^:97:3
+
+# Floor
+F:.:1:3
+
+# Trees
+F:T:96:3
+
+# Deep water
+F:W:187:3
+
+# Shallow water
+F:V:84:3
+
+# Deep Lava
+F:L:85:3
+
+# Shallow Lava
+F:K:86:3
+
+# Chasm
+F:C:87:3
+
+# Dirt
+F:,:88:3
+
+# Mud
+F:@:94:3
+
+# Rubble
+F:;:49:3
+
+# Grass
+F:-:89:3
+
+# Permanent wall
+F:#:63:3
+
+# Brick Roof
+F:s:193:3
+# Brick Roof Top
+F:S:194:3
+# Brick Roof Chimney
+F:t:195:3
+
+# Grass Roof
+F:X:190:3
+# Grass Roof Top
+F:U:191:3
+# Grass Roof Chimney
+F:Y:192:3
+
+# Cobblestone Road
+F:O:200:3
+
+# General Store
+F:1:74:3:0:0:0:0:0:0
+
+# Armoury
+F:2:74:3:0:0:0:0:0:1
+
+# Weapons Smith
+F:3:74:3:0:0:0:0:0:2
+
+# Temple
+F:4:74:3:0:0:0:0:0:3
+
+# Alchemy Shop
+F:5:74:3:0:0:0:0:0:4
+
+# Magic Shop
+F:6:74:3:0:0:0:0:0:5
+
+# Black Market
+F:7:74:3:0:0:0:0:0:6
+
+# Home
+F:8:74:3:0:0:0:0:0:7
+
+# Bookstore
+F:9:74:3:0:0:0:0:0:8
+
+# Pet Shop
+F:0:74:3:0:0:0:0:0:9
+
+# Underground Tunnels -- used for tunnels in towns
+F:I:173:3
+
+# Underground Tunnels -- used for tunnels in towns
+F:M:204:3
+
+# Fake blank feature
+F: :0:3
+
+### Flowers for Theme ###
+
+#Elanor (yellow)
+F:E:79:3
+
+#Fumellar (red)
+F:F:80:3
+
+#Anemones (purple)
+F:A:81:3
+
+#Niphredil (white)
+F:N:82:3
+
+#Iris (blue)
+F:R:83:3
+
+### Destroyed town features ###
+
+# Dead/burnt tree
+F:D:92:3
+
+# Ash
+F:H:93:3
+
+# Fire
+F:=:205:3
+
+# Permanent rubble
+F:$:206:3
+
+# Tainted water
+F:%:174:3 \ No newline at end of file
diff --git a/lib/mods/theme/edit/t_thrand.txt b/lib/mods/theme/edit/t_thrand.txt
new file mode 100644
index 00000000..cce9d684
--- /dev/null
+++ b/lib/mods/theme/edit/t_thrand.txt
@@ -0,0 +1,103 @@
+# File: t_thrand.txt
+
+# Thranduil's Halls map by furiosity <furiosity@zionmainframe.net>
+# NB! The additional terrain features and stores (if any) assume usage of the following files from the 'theme' module:
+# f_info.txt, t_pref.txt, st_info.txt, and ba_info.txt
+# Please download the module and refer to the files for the terrain feature definitions http://modules.t-o-m-e.net/
+# Don't forget to modify the maximum number of terrain features, etc. in misc.txt as well.
+
+#Wooden board - horizontal
+F:a:233:3
+
+#Mallorn
+F:m:243:3
+
+#Force Elven monsters
+f:ELVEN
+
+### Buildings ###
+
+# Thranduil's Hall
+F:b:74:3:0:0:0:0:0:81
+
+# Beastmaster
+F:d:74:3:0:0:0:0:0:16
+
+# Hunter
+F:e:74:3:0:0:0:0:0:61
+
+# Music Store
+F:f:74:3:0:0:0:0:0:64
+
+# Map store
+F:g:74:3:0:0:0:0:0:66
+
+#The Library
+F:h:74:3:0:0:0:0:0:13
+
+D:######################################################################################################################################################################################################
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^@@@@@@@@^^^^^^^^^^^^^^^^^^^^^@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^@,,,,,,,,@^^^^^^^^^^^^^^^^^^^@,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,@^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^@,,,,,,,,@^^^^^^^^^^^^^^^^^^^@,,,,,,,,,,,,,,A,,,,,,,,,,,,,,,@^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^@,,,3,,,,@^^^^^^^^^^^^^^^^^^^@,,,,TTT,,,,,A,b,A,,,,,,TTT,,,,@^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^,,,,,,,,,@^^^^^^^^^^^^^^^^^^^@,,,TTmTT,,,,,F,F,,,,,,TTmTT,,,@^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^,,,,,,,,,,,,,@^^^^^^^^^^^^^^^^^^^@,,,,TTT,,,,,,R,R,,,,,,,TTT,,,,@^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^,,,,,,^^^@@@@@@@,,,^^^^^^^^^^^^^^^^^^@,,,,,,,NE,,,,F,F,,,,,EN,,,,,,,@^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^,,,,,,,^^^^^^^^^^^^^^^^,,^^^^^^^^^^^^^^^^^@,,,,,,,,NE,,,R,R,,,,EN,,,,,,,,@^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^,,,,,,^^^^^^^^^^^^^^^^^^^^^^,^^^^^^^^^^^^^^^^^@,,,,,,,,,NE,,F,F,,,EN,,,,,,,,,@^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^,,,,,,^^^^^^^^^^^^^^^^^^^^^^^^^,^^^^^^^^^^^^^^^^^@,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,@^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^@@@@@@,,^^^^^^^^^^^^^^^^^^^^^^^^^^^^^,^^^^^^^^^^^^^^^^^@,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,@^^^^^^^^^^^^^^^^@@@@@@@^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^@,,,,,,,,,@^^^^^^^^^^^^^^^^^^^^^^^^^^^,^^^^^^^^^^^^^^^^^^@,,@@@@@@@@@@@,@@@@@@@@@@@@@@@,^^^^^^^^^^^^@@@@,,,,,,,@@@@^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^@,,,,2,,,,@^^^^^^^^^^^^^^^^^^^^^^^^^^^,^^^^^^^^^^^^^^^^^^,,,^^^^^^^^^^^,^^^^^^^^^^^^^^^^,^^^^^^^^@@@,,,,,,,,,,,,,,,@@@^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^@,,,,,,,,,,^^^^^^^^^^^^^^^^^^^^^^^^^^^,^^^^^^^^^^^^,,,,,,,,^^^^^^^^^^^^,^^^^^^^^^^^^^^^^^,^^^^^^^@,,,,,,,,,,,,,,,,,,5@^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^@@@@@@@@@,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,^^,,,,,,^^^^^^^^^^^^^^^^^^,^^^^^^^^^^^^^^^^^^,,,,,,,,,,,,,,,,,,,,,,,,,@@@^^^^^^^@@@@@@@@@^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^,,,,,^^^^^^^^^^^^^^^^^^^^^^^,^^^^^^^^^^^^^^^^^^^^^^^^^^^@@@@,,,,,,,@@@@,,^^^^@@@@@,,,,,,h@@@@@^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^,,,,,,^^^^^^^^^^^^^^^^^^^,^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^@@@@@@@^^^^^^,,^^,,,,,,,,,,,,,,,,@^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^,,,,,^^^^^^^^^^^^^^^^^,^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^,,,,,,,,,,,,,,,,,,,@^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^,,,,,^^^^^^^^^^^^^^^^^^^^^^,^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^@@@@@4,,,,,,@@@@@^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^,,,,,^^^^^^^^^^^^^^^^^^^^^^^^^,,,,,,,,^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^@@@@@@@@@^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^,,,,,^^^^^^^^^^^^^^^^^^^^^^^^^^,,^^^^^,,,,^^^^^^^^^^^^^^^^^^@@@@@@@@@^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^,,,,,^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^,^^^^^^^^,,,,^^^^^^^^^^^^^^^@9,,,,,,,6@^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^,,,,,^^^^^^^^^^^^^^^^^^^^^^^^@@@@@@^^,^^^^^^^^^^^^,,,,,,,,,,,,,,,,,,,,,,,,,,,^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^,,,,,^^^^^^^^^^^^^^^^^^^^^^^^^^@e,,,,,,,^^^^^^^^^^^^^^^^^,,^^^^^^^^^^^@@@@@@@@@^,^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^,,,,,^^^^^^^^^^^^^^^^^^^^^^^^^^^^^@@@@@@@^^^^^^^^^^^^^^^^^^^,^^^^^^^^^^^^^^^^^^^^^^,^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#@@@@@@@@^^^^^^^^^^^^^^^^^^^^^^,,,,,^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^,^^^^^^^^^^^^^^^^^^^^^^,^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#VVVVVV@@@@@@@@@@@@@@@@@@@,,,,,,,,,^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^,@@@@@^^^^^^^^^^^^^^^^^,^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#VVVVVVVVVVVVVVVVVVVVVVVVaaa,,,@@@@@@@@^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^@,,,,d@@@@^^^^^^^^^^^^^^^,^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#VVVVVVVVVVVVVVVVVVVVVaaa,,,,aaaVVVV@@@@@@@^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^@@@0,,,,,,,,,,,,,,,,,,,,,,,^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:#@@@@@@@@@@@@@@VVVVaaa,,,,aaaVVVVVVVVVVVVVV@@@@@@@@^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^@@@@@@@^^^^^^^^^^^^^^,,,,,,^^^^^^^^^^^^^^@@@^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:# @@@aaa,,,aaaVVVVVVVVVVVVVVVVVVVVVVV@@@@@@@^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^,,,,^^^^^^^^^^^@,@^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:# @,,,,,@aaa@@@@@@@VVVVVVVVVVVVVVVVVVVVVVVV@@@@@@@@^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^,,,,,,^^^^^^^@,@^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:# @,,,,,@ @@@@@@@@VVVVVVVVVVVVVVVVVVVVVVV@@@@@@@@@^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^,,,,,,,^^,,^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:# @,,,,,@ @@@@VVVVVVVVVVVVVVVVVVVVVVVVV@@@@@@@@@^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^,,,,,,,,,,,,,,^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:# @,,,,,@ @@@@VVVVVVVVVVVVVVVVVVVVVVVVVVVV@@@@@@@@@^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^,,,,,^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:# @,,,,,@ @@@@@@VVVVVVVVVVVVVVVVVVVVVVVVVVVVV@@@@@@@@@@^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^,,,,,,^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:# @,,,,,@ @@@@@VVVVVVVVVVVVVVVVVVVVVVVVVVVVVV@@@@@@@@@@@@@@@@@^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^,,,,,,,,,,,@^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:# @,,,,,@ @@@@@VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV@@@@@@@^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^@,,,,,f@^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:# @,,,,,@ @@@@@@VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV@@@@@@@@@@@^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^@,,,,@^^^^^^^^^^^^^^^^^^^^^^^^^^^^#
+D:# @,,,,,@ @@@@@@@@@@@VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV@@@@@@@@^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^@,,,,,@^^^^^^^^^^^^^^^^^^^^^^^^#
+D:# @,,,,,@ @@@@@VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV@@@@@@@@@@@@^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^@g,,,,,@^^^^^^^^^^^^^^^^^^^^^^#
+D:# @,,,,,@ @@@@@@@@VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV@@@@@@^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^@,,,,,@^^^^^^^^^^^^^^^^^^^#
+D:# @,,,,,@ @@@@@@@@@@@@@VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV@@@@@@@@@@@@^^^^^^^^^^^^^^^^^^^^^^^^@,,,,,,@^^^^^^^^^^^^^^^^^#
+D:# @,,,,,@ @@@@@VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV@@@@@@@@@^^^^^^^^^^^^^^^^^^^^@,,,,,,@^^^^^^^^^^^^^^^#
+D:#@,,,,,@ @@@@@@@@@@@@VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV@@@@@@@@@^^^^^^^^^^^^^^^^^@,,,,,,@^^^^^^^^^^^#
+D:#,,,,,@ @@@@@@@@@VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV@@@@@@@^^^^^^^^^^^^^^^^@,,,,@^^^^^^^^^#
+D:#,,,,@ @@@@@@VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV@@@@@@@@^^^^^^^^^^^^,,,,MMM^^^^^^#
+D:#,,,@ @@@@@VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV@@@@@@@^^^^^^^^^^^^III^^^^^#
+D:#,,@ @@@@@@@@@@@@VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV@@@@@@@^^^^^^^^III^^^^#
+D:#,@ @@@@@@VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV@@@@@^^^^^^III^^^#
+D:#@ @@@@VVVVVVVVVVVVVVVVVVVVVVVVVVVVVV@@@@@@@^^III^^#
+D:# @@@@@@@VVVVVVVVVVVVVVVVVVVVVVVVVVVVV@@@@MMM^#
+D:# @@@@@@@@VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV#
+D:###################################################################################################################################################################################################### \ No newline at end of file
diff --git a/lib/mods/theme/edit/thieves.map b/lib/mods/theme/edit/thieves.map
new file mode 100644
index 00000000..ba025ff6
--- /dev/null
+++ b/lib/mods/theme/edit/thieves.map
@@ -0,0 +1,64 @@
+# Floor
+F:.:1:6
+
+# Dark floor
+F:,:1:4
+
+# Permanent wall
+F:X:61:4
+
+# Lit permanent wall
+F:x:61:6
+
+# Magically locked door
+F:M:38:22
+
+# Locked door
+F:D:38:6
+
+# Open door
+F:d:4:6
+
+# up staircase
+F:<:6:8
+
+# Floor with Novice rogue
+F:a:1:6:44:0:0:0:0:0:0:2
+
+# Floor with Bandit
+F:b:1:6:150:43:*:0:0:0:0:2
+
+# Dark floor with novice rogue
+F:f:1:4:44:0:0:0:0:0:0:2
+
+# Floor with human skeleton
+F:z:1:6:0:395
+
+# Dungeon layout
+D:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+D:x.....x....zx.....x.............x
+D:x.....x.....x.....x.............x
+D:x.....x.....x.....x.............x
+D:xxxMxxxxxdxxxxxdxxxxxxxxxDxxxxxxx
+D:XXx..........................xXXX
+D:XXx.xxxxx.xxxxx.xxxxxxxxx.xx,xXXX
+D:XXxxxXXXxxxXXXxxxXXXXXXXxxx,,,XXX
+D:XXXXxxxxxxxxxxxxxxxxxXXXXX,,,,,XX
+D:XXXXxa..xb..x...x...xXXXX,,,,,,,X
+D:XXXXx...x...xa..x...xXXXX,,,,,,,X
+D:XXXXx..ax...x...x.a.xXXXX,,,,,,,X
+D:xxxxxxDxxxDxxxDxxxDxxXXXXX,,,,,XX
+D:x,,,x...............xXXXXXX,,,XXX
+D:x,,,x..x.........x..xXXXXXXX,XXXX
+D:x,,,D.....x...x.....D,,,,,,,,XXXX
+D:x,,,x..x.........x..xXXXXXXXXXXXX
+D:x,,,x...............xXXXXXXXXXXXX
+D:x,,,xxDxxxDxxxDxxxDxxXXXXXXXXXXXX
+D:x,,,x...x...x.a.xa..xXXXXXXXXXXXX
+D:x,,,xa.ax.a.x...x...xXXXXXXXXXXXX
+D:xf,fx...x...x...x...xXXXXXXXXXXXX
+D:xxxxxxxxxxxxxxxxxxxxxXXXXXXXXXXXX
+
+# Starting position
+P:4:4
+
diff --git a/lib/mods/theme/edit/thrain.map b/lib/mods/theme/edit/thrain.map
new file mode 100644
index 00000000..8adc41be
--- /dev/null
+++ b/lib/mods/theme/edit/thrain.map
@@ -0,0 +1,35 @@
+# Floor
+F:.:1:0:0:0:0:0:0:0:61
+
+# Some Nazguls
+F:1:1:0:951:0:0:0:0:0:61:2
+F:2:1:0:952:0:0:0:0:0:61:2
+F:o:1:0:866:0:0:0:0:0:61
+
+# Marker
+F:,:172:6:0:0:0:0:0:0:61
+
+# Lit permanent wall
+F:x:61:6
+
+# Door
+F:D:48:0:0:0:0:0:0:0:61
+
+# Floor with Trap
+F:t:1:8:0:0:0:0:*
+
+# Deep lava
+F:l:85:0:0:0:0:0:0:0:61
+
+# Dungeon layout
+D:
+D: xxxxxxxx
+D: xoooo..x
+D: xo2oo..x
+D: xlloo..x
+D: x,loo..D
+D: xlloo..x
+D: xo1oo..x
+D: xoooo..x
+D: xxxxxxxx
+D:
diff --git a/lib/mods/theme/edit/tr_info.txt b/lib/mods/theme/edit/tr_info.txt
new file mode 100644
index 00000000..d181487a
--- /dev/null
+++ b/lib/mods/theme/edit/tr_info.txt
@@ -0,0 +1,817 @@
+# This file comes from Angband64 written by Jurriaan Kalkman
+# and describes the traps items can have
+#
+# byte type; /* this goes into sval */
+# s16b probability; /* probability of existence in 1000 */
+# s16b another; /* does this trap easily combine in 1000 */
+# s16b pvalinc; /* how much does this trap attribute to pval */
+# byte difficulty; /* how difficult to disarm */
+# byte level; /* minimum level - disenchantment trap at 200' is */
+# /* not so nice */
+# byte color;
+# cptr name; /* what name does this trap have */
+#
+# d TERM_DARK |r TERM_RED |D TERM_L_DARK |R TERM_L_RED
+# w TERM_WHITE |g TERM_GREEN|W TERM_L_WHITE|G TERM_L_GREEN
+# s TERM_SLATE |b TERM_BLUE |v TERM_VIOLET |B TERM_L_BLUE
+# o TERM_ORANGE|u TERM_UMBER|y TERM_YELLOW |U TERM_L_UMBER
+#
+# b blue for stat traps
+# w white for teleport traps
+# o orange for dungeon rearrangement traps
+# v violet for summoning traps
+# y yellow for stealing/equipment traps
+# r red for other character affecting traps
+# g green for elemental bolt trap
+# B umber for elemental ball trap
+# R l red for arrow/dagger traps
+# W for compound trap!!!
+# don't use U or you'll get trapped doors that are indistinguishable from untrapped doors!
+#
+# an unknown character is multi-hued!
+#
+# N:type:name
+# I:diff:prob:another:pval:minlevel:damage:color
+# I:diff:prob: :minlevel: :color
+# D:description
+
+V:2.0.0
+
+#
+# stat traps
+#
+
+N:1:Weakness Trap
+I:2:100:5:5:2:0d0:b
+D:A poisoned needle weakens you!
+F:FLOOR | CHEST | DOOR
+
+N:2:Weakness Trap
+I:5:100:5:5:20:0d0:b
+D:A poisoned needle seriously weakens you!
+F:FLOOR | CHEST | DOOR
+
+N:3:Weakness Trap
+I:7:100:5:8:40:0d0:b
+D:A poisoned needle permanently weakens you!
+F:FLOOR | CHEST | DOOR
+
+N:4:Intelligence Trap
+I:2:100:5:2:2:0d0:b
+D:A poisoned needle makes you feel stupid!
+F:FLOOR | CHEST | DOOR
+
+N:5:Intelligence Trap
+I:5:100:5:5:20:0d0:b
+D:A poisoned needle makes you feel very stupid!
+F:FLOOR | CHEST | DOOR
+
+N:6:Intelligence Trap
+I:7:100:5:8:40:0d0:b
+D:A poisoned needle makes you feel permanently stupid!
+F:FLOOR | CHEST | DOOR
+
+N:7:Wisdom Trap
+I:2:100:5:2:2:0d0:b
+D:A poisoned needle makes you feel naive!
+F:FLOOR | CHEST | DOOR
+
+N:8:Wisdom Trap
+I:5:100:5:5:20:0d0:b
+D:A poisoned needle makes you feel very naive!
+F:FLOOR | CHEST | DOOR
+
+N:9:Wisdom Trap
+I:7:100:5:8:40:0d0:b
+D:A poisoned needle makes you feel permanently naive!
+F:FLOOR | CHEST | DOOR
+
+N:10:Fumbling Fingers Trap
+I:2:100:5:2:2:0d0:b
+D:A poisoned needle makes you feel clumsy!
+F:FLOOR | CHEST | DOOR
+
+N:11:Fumbling Fingers Trap
+I:5:100:5:5:20:0d0:b
+D:A poisoned needle makes you feel very clumsy!
+F:FLOOR | CHEST | DOOR
+
+N:12:Fumbling Fingers Trap
+I:7:100:5:8:40:0d0:b
+D:A poisoned needle makes you feel permanently clumsy!
+F:FLOOR | CHEST | DOOR
+
+N:13:Wasting Trap
+I:2:100:5:2:2:0d0:b
+D:A poisoned needle makes you feel sickly!
+F:FLOOR | CHEST | DOOR
+
+N:14:Wasting Trap
+I:5:100:5:5:20:0d0:b
+D:A poisoned needle makes you feel very sickly!
+F:FLOOR | CHEST | DOOR
+
+N:15:Wasting Trap
+I:7:100:5:8:40:0d0:b
+D:A poisoned needle makes you feel permanently sickly!
+F:FLOOR | CHEST | DOOR
+
+N:16:Beauty Trap
+I:2:100:5:2:2:0d0:b
+D:A poisoned needle scars you!
+F:FLOOR | CHEST | DOOR
+
+N:17:Beauty Trap
+I:5:100:5:5:20:0d0:b
+D:A poisoned needle scars you horribly!
+F:FLOOR | CHEST | DOOR
+
+N:18:Beauty Trap
+I:7:100:5:8:40:0d0:b
+D:A poisoned needle scars you permanently!
+F:FLOOR | CHEST | DOOR
+
+#
+# miscellaneous traps
+#
+
+N:20:Trap of Curse Weapon
+I:5:10:0:12:20:0d0:y
+D:Your weapon will never be the same...
+F:FLOOR | CHEST | DOOR
+
+N:21:Trap of Curse Armour
+I:5:15:0:12:20:0d0:y
+D:Your armour doesn't exactly get better by setting off this trap...
+F:FLOOR | CHEST | DOOR
+
+N:22:Earthquake Trap
+I:5:20:0:10:10:0d0:o
+D:The ceiling collapses around you!
+F:FLOOR | CHEST | DOOR
+
+N:23:Poison Needle Trap
+I:1:50:50:3:2:0d0:r
+D:A poisoned needle pricks you!
+F:FLOOR | CHEST | DOOR
+
+N:24:Summon Monster Trap
+I:2:50:40:4:2:0d0:v
+D:Monsters defend the memory of the owner...
+F:FLOOR | CHEST | DOOR
+
+N:25:Summon Undead Trap
+I:4:25:40:6:10:0d0:v
+D:Undead rise from the grave to defend this!
+F:FLOOR | CHEST | DOOR
+
+N:26:Summon Greater Undead Trap
+I:8:10:50:20:20:0d0:v
+D:Greater undead defend this!
+F:FLOOR | CHEST | DOOR
+
+N:27:Teleport Trap
+I:3:100:50:3:2:0d0:w
+D:Now you know why nobody ever got close enough to disarm this trap...
+F:FLOOR | CHEST | DOOR
+
+N:28:Paralysing Trap
+I:1:100:20:2:2:0d0:r
+D:You suddenly cannot move!
+F:FLOOR | CHEST | DOOR
+
+N:29:Explosive Device
+I:3:100:80:0:3:3d8:r
+D:Ha! It explodes before your hands can illegally touch it!
+F:FLOOR | CHEST | DOOR
+
+N:30:Teleport Item Trap
+I:3:50:50:3:5:0d0:w
+D:The item magically disappears from your greedy hands!
+F:FLOOR | CHEST
+
+N:31:Lose Memory Trap
+I:6:30:30:6:10:0d0:r
+D:You suddenly can't remember what you were doing here...
+F:FLOOR | CHEST | DOOR
+
+N:32:Bitter Regret Trap
+I:9:15:20:9:20:0d0:r
+D:You already regret trying this...
+F:FLOOR | CHEST | DOOR
+
+N:33:Bowel Cramps Trap
+I:1:90:20:1:6:0d0:r
+D:Your stomach twists with a sharp pang!
+F:FLOOR | CHEST | DOOR
+
+N:34:Blindness/Confusion Trap
+I:4:100:50:4:6:0d0:r
+D:You suddenly can't see, and thinking is difficult too....
+F:FLOOR | CHEST | DOOR
+
+N:35:Aggravation Trap
+I:2:100:50:2:3:0d0:o
+D:Your hear a high-pitched humming noise...
+F:FLOOR | CHEST | DOOR
+
+N:36:Multiplication Trap
+I:3:90:0:3:5:0d0:o
+D:The floor around you doesn't seem the same...
+F:FLOOR | CHEST | DOOR
+
+N:37:Steal Item Trap
+I:3:100:50:3:6:0d0:y
+D:The chest seems to swell, while your backpack feels lighter..
+F:FLOOR | CHEST
+
+N:38:Summon Fast Quylthulgs Trap
+I:8:50:10:10:25:0d0:v
+D:Parts of the owner seem to return from somewhere else, as you slow in awe.
+F:FLOOR | CHEST | DOOR
+
+N:39:Trap of Sinking
+I:2:50:0:0:3:0d0:w
+D:A trapdoor opens up under you!
+F:FLOOR | DOOR
+
+N:40:Trap of Mana Drain
+I:4:100:50:3:4:0d0:r
+D:You suddenly can't think so clearly any more...
+F:FLOOR | CHEST | DOOR
+
+N:41:Trap of Missing Money
+I:2:100:50:2:2:0d0:y
+D:Money isn't everything, they say...
+F:FLOOR | CHEST | DOOR
+
+N:42:Trap of No Return
+I:5:20:10:4:8:0d0:y
+D:Do stay a while!
+F:FLOOR | CHEST | DOOR
+
+N:43:Trap of Silent Switching
+I:4:100:50:3:6:0d0:y
+D:You suddenly are a different person!
+F:FLOOR | CHEST | DOOR
+
+N:44:Trap of Walls
+I:6:100:50:2:10:0d0:o
+D:The room seems to shrink!
+F:FLOOR | CHEST | DOOR
+
+N:45:Trap of Calling Out
+I:10:100:100:5:15:0d0:v
+D:You hear something coming closer, much closer.
+F:FLOOR | CHEST | DOOR
+
+N:46:Trap of Sliding
+I:8:50:50:4:8:0d0:r
+D:Your feet seem to have a life of their own!
+F:FLOOR | CHEST | DOOR
+
+N:47:Trap of Charges Drain
+I:6:100:70:2:3:0d0:y
+D:You feel as if you've just lost something...
+F:FLOOR | CHEST | DOOR
+
+N:48:Trap of Stair Movement
+I:6:100:50:3:4:0d0:o
+D:The dungeon seems different...
+F:FLOOR | CHEST | DOOR
+
+N:49:Trap of New Trap
+I:5:100:5:0:4:0d0:o
+D:Somehow, disarming isn't over, you feel...
+F:FLOOR | CHEST | DOOR
+
+N:50:Trap of Scatter Items
+I:10:50:50:6:12:0d0:w
+D:You hear crashing sounds from all over the dungeon!
+F:FLOOR | CHEST | DOOR
+
+N:51:Trap of Decay
+I:4:100:50:4:4:0d0:r
+D:Your stomach isn't empty, but suddenly you think of food.
+F:FLOOR | CHEST | DOOR
+
+N:52:Trap of Wasting Wands
+I:6:100:40:4:5:0d0:y
+D:Your wands seem different...
+F:FLOOR | CHEST | DOOR
+
+N:53:Trap of Filling
+I:10:100:0:10:25:0d0:o
+D:The whole room vibrates in a strange way...
+F:FLOOR | CHEST | DOOR
+
+N:54:Trap of Drain Speed
+I:8:50:10:25:80:0d0:y
+D:You suddenly seem to have more time to self-reflect...
+F:FLOOR | CHEST | DOOR
+
+#
+# bolt traps
+#
+
+N:60:Lightning Bolt Trap
+I:2:80:5:3:2:2d8:g
+D:You are jolted with electricity!
+F:FLOOR | CHEST | DOOR | LEVEL1
+
+N:61:Poison Bolt Trap
+I:2:80:5:3:2:2d8:g
+D:A blast of poison gas hits you!
+F:FLOOR | CHEST | DOOR | LEVEL1
+
+N:62:Acid Bolt Trap
+I:2:80:5:3:2:2d8:g
+D:A jet of acid shoots out at you!
+F:FLOOR | CHEST | DOOR | LEVEL1
+
+N:63:Cold Bolt Trap
+I:2:80:5:3:2:2d8:g
+D:You are suddenly very cold!
+F:FLOOR | CHEST | DOOR | LEVEL1
+
+N:64:Fire Bolt Trap
+I:2:80:5:3:2:2d8:g
+D:You are suddenly very hot!
+F:FLOOR | CHEST | DOOR | LEVEL1
+
+N:65:Plasma Bolt Trap
+I:6:80:5:6:15:10d12:g
+D:A bolt of plasma hits you!
+F:FLOOR | CHEST | DOOR | LEVEL3
+
+N:66:Water Bolt Trap
+I:4:80:5:5:8:5d10:g
+D:A gush of water hits you!
+F:FLOOR | CHEST | DOOR | LEVEL2
+
+N:67:Light Bolt Trap
+I:4:80:5:5:8:5d10:g
+D:There is a sudden flash of light around you!
+F:FLOOR | CHEST | DOOR | LEVEL2
+
+N:68:Dark Bolt Trap
+I:4:80:5:5:8:5d10:g
+D:A bolt of pure elemental darkness hits you!
+F:FLOOR | CHEST | DOOR | LEVEL2
+
+N:69:Shards Bolt Trap
+I:6:80:5:6:15:6d10:g
+D:A blast of crystal shards hits you!
+F:FLOOR | CHEST | DOOR | LEVEL3
+
+N:70:Sound Bolt Trap
+I:6:80:5:6:15:10d12:g
+D:A sudden roar of sound hurts your eardrums!
+F:FLOOR | CHEST | DOOR | LEVEL3
+
+N:71:Confusion Bolt Trap
+I:4:80:5:5:8:6d10:g
+D:A blast of confusion gas engulfs you!
+F:FLOOR | CHEST | DOOR | LEVEL2
+
+N:72:Force Bolt Trap
+I:6:80:5:6:15:10d12:g
+D:A bolt of pure force hits you!
+F:FLOOR | CHEST | DOOR | LEVEL3
+
+N:73:Inertia Bolt Trap
+I:6:80:5:6:15:10d12:g
+D:Your feet feel like lead!
+F:FLOOR | CHEST | DOOR | LEVEL3
+
+N:74:Mana Bolt Trap
+I:8:80:5:9:25:15d16:g
+D:A bolt of pure magic hits you!
+F:FLOOR | CHEST | DOOR | LEVEL4
+
+N:75:Ice Bolt Trap
+I:4:80:5:5:8:5d10:g
+D:A bolt of ice hits you!
+F:FLOOR | CHEST | DOOR | LEVEL2
+
+N:76:Chaos Bolt Trap
+I:6:80:5:6:15:10d12:g
+D:A blast of raw chaos hits you!
+F:FLOOR | CHEST | DOOR | LEVEL3
+
+N:77:Nether Bolt Trap
+I:8:80:5:9:25:15d16:g
+D:A bolt of negative energy hits you!
+F:FLOOR | CHEST | DOOR | LEVEL4
+
+N:78:Disenchantment Bolt Trap
+I:8:80:5:9:25:15d16:g
+D:There is a static feeling in the air...
+F:FLOOR | CHEST | DOOR | LEVEL4
+
+N:79:Nexus Bolt Trap
+I:6:80:5:6:15:10d12:g
+D:A bolt of nexus hits you!
+F:FLOOR | CHEST | DOOR | LEVEL3
+
+N:80:Time Bolt Trap
+I:8:80:5:9:25:15d16:g
+D:Suddenly, several months pass by in a second!
+F:FLOOR | CHEST | DOOR | LEVEL4
+
+N:81:Gravity Bolt Trap
+I:6:80:5:6:15:10d12:g
+D:Gravity suddenly warps around you!
+F:FLOOR | CHEST | DOOR | LEVEL3
+
+#
+# ball traps
+#
+
+N:82:Lightning Ball Trap
+I:3:60:5:5:8:3d10:B
+D:A massive electrical charge shoots through you!
+F:FLOOR | CHEST | DOOR | LEVEL1
+
+N:83:Poison Ball Trap
+I:3:60:5:5:8:3d10:B
+D:A large cloud of poison gas envelops you!
+F:FLOOR | CHEST | DOOR | LEVEL1
+
+N:84:Acid Ball Trap
+I:3:60:5:5:8:3d10:B
+D:You are suddenly drenched in acid!
+F:FLOOR | CHEST | DOOR | LEVEL1
+
+N:85:Cold Ball Trap
+I:3:60:5:5:8:3d10:B
+D:A blast of hideously cold air envelops you!
+F:FLOOR | CHEST | DOOR | LEVEL1
+
+N:86:Fire Ball Trap
+I:3:60:5:5:8:3d10:B
+D:You are suddenly in the centre of a raging inferno!
+F:FLOOR | CHEST | DOOR | LEVEL1
+
+N:87:Plasma Ball Trap
+I:8:60:5:8:20:12d18:B
+D:You are engulfed in plasma!
+F:FLOOR | CHEST | DOOR | LEVEL3
+
+N:88:Water Ball Trap
+I:5:60:5:6:15:8d12:B
+D:A whirlpool engulfs you!
+F:FLOOR | CHEST | DOOR | LEVEL2
+
+N:89:Light Ball Trap
+I:5:60:5:6:15:8d12:B
+D:A massive flash of light erupts around you!
+F:FLOOR | CHEST | DOOR | LEVEL2
+
+N:90:Darkness Ball Trap
+I:5:60:5:6:15:8d12:B
+D:A large patch of darkness erupts around you!
+F:FLOOR | CHEST | DOOR | LEVEL2
+
+N:91:Shards Ball Trap
+I:8:60:5:8:20:12d18:B
+D:A violent blast of crystal shards hits you!
+F:FLOOR | CHEST | DOOR | LEVEL3
+
+N:92:Sound Ball Trap
+I:8:60:5:8:20:12d18:B
+D:BOOM! Your eardrums nearly explode!
+F:FLOOR | CHEST | DOOR | LEVEL3
+
+N:93:Confusion Ball Trap
+I:5:60:5:6:15:8d12:B
+D:You are enveloped in a cloud of confusion gas!
+F:FLOOR | CHEST | DOOR | LEVEL2
+
+N:94:Force Ball Trap
+I:8:60:5:8:20:12d18:B
+D:A violent blast of pure force smashes down around you!
+F:FLOOR | CHEST | DOOR | LEVEL3
+
+N:95:Inertia Ball Trap
+I:8:60:5:8:20:12d18:B
+D:Suddenly, your entire body feels like lead!
+F:FLOOR | CHEST | DOOR | LEVEL3
+
+N:96:Mana Ball Trap
+I:10:60:5:10:30:16d20:B
+D:You are hit by a blast of pure magic!
+F:FLOOR | CHEST | DOOR | LEVEL4
+
+N:97:Ice Ball Trap
+I:5:60:5:6:15:8d12:B
+D:A massive blast of ice crystals engulfs you!
+F:FLOOR | CHEST | DOOR | LEVEL2
+
+N:98:Chaos Ball Trap
+I:8:60:5:8:20:12d18:B
+D:A violent blast of raw chaos engulfs you!
+F:FLOOR | CHEST | DOOR | LEVEL3
+
+N:99:Nether Ball Trap
+I:10:60:5:10:30:16d20:g
+D:A blast of energy from the netherworld engulfs you!
+F:FLOOR | CHEST | DOOR | LEVEL4
+
+# N:type:name
+# I:diff:prob:another:pval:minlevel:color
+# D:description
+
+N:100:Disenchantment Ball Trap
+I:10:60:5:10:30:16d20:B
+D:You are hit by a blast of pure anti-magic!
+F:FLOOR | CHEST | DOOR | LEVEL4
+
+N:101:Nexus Ball Trap
+I:8:60:5:8:20:12d18:B
+D:A ball of nexus hits you!
+F:FLOOR | CHEST | DOOR | LEVEL3
+
+N:102:Time Ball Trap
+I:10:60:5:10:30:16d20:B
+D:Suddenly, several years pass by in a second!
+F:FLOOR | CHEST | DOOR | LEVEL4
+
+N:103:Gravity Ball Trap
+I:8:60:5:8:20:12d18:B
+D:You suddenly feel gravity warp violently around you!
+F:FLOOR | CHEST | DOOR | LEVEL3
+
+N:110:Arrow Trap
+I:2:100:0:5:2:0d0:R
+D:An arrow shoots out at you.
+F:FLOOR | CHEST | DOOR
+
+N:111:Bolt Trap
+I:2:100:0:5:5:0d0:R
+D:A bolt shoots out at you.
+F:FLOOR | CHEST | DOOR
+
+N:112:Seeker Arrow Trap
+I:2:100:0:6:10:0d0:R
+D:A seeker arrow shoots out at you.
+F:FLOOR | CHEST | DOOR
+
+N:113:Seeker Bolt Trap
+I:2:100:0:6:12:0d0:R
+D:A seeker bolt shoots out at you.
+F:FLOOR | CHEST | DOOR
+
+N:114:Poison Arrow Trap
+I:2:100:0:5:4:0d0:R
+D:A poisoned arrow shoots out at you.
+F:FLOOR | CHEST | DOOR
+
+N:115:Poison Bolt Trap
+I:2:100:0:6:6:0d0:R
+D:A poisoned bolt shoots out at you.
+F:FLOOR | CHEST | DOOR
+
+N:116:Poison Seeker Arrow Trap
+I:2:100:0:7:12:0d0:R
+D:A poisoned seeker arrow shoots out at you.
+F:FLOOR | CHEST | DOOR
+
+N:117:Poison Seeker Bolt Trap
+I:2:100:0:7:15:0d0:R
+D:A poisoned seeker bolt shoots out at you.
+F:FLOOR | CHEST | DOOR
+
+N:118:Broken Dagger Trap
+I:2:100:0:5:2:0d0:R
+D:An broken dagger shoots out at you.
+F:FLOOR | CHEST | DOOR
+
+N:119:Dagger Trap
+I:2:100:0:5:5:0d0:R
+D:A dagger shoots out at you.
+F:FLOOR | CHEST | DOOR
+
+N:120:Poison Broken Dagger Trap
+I:2:100:0:5:4:0d0:R
+D:A poisoned broken dagger shoots out at you.
+F:FLOOR | CHEST | DOOR
+
+N:121:Poison Dagger Trap
+I:2:100:0:6:6:0d0:R
+D:A poisoned dagger shoots out at you.
+F:FLOOR | CHEST | DOOR
+
+#
+# multiple arrows/daggers traps
+#
+
+N:122:Arrows Trap
+I:4:100:0:7:16:0d0:R
+D:Some arrows shoot out at you.
+F:FLOOR | CHEST | DOOR
+
+N:123:Bolts Trap
+I:4:100:0:7:18:0d0:R
+D:Some bolts shoot out at you.
+F:FLOOR | CHEST | DOOR
+
+N:124:Seeker Arrow Trap
+I:5:100:0:8:20:0d0:R
+D:Some seeker arrows shoot out at you.
+F:FLOOR | CHEST | DOOR
+
+N:125:Seeker Bolt Trap
+I:5:100:0:8:24:0d0:R
+D:Some seeker bolts shoot out at you.
+F:FLOOR | CHEST | DOOR
+
+N:126:Poison Arrows Trap
+I:5:100:0:8:18:0d0:R
+D:Some poisoned arrows shoot out at you.
+F:FLOOR | CHEST | DOOR
+
+N:127:Poison Bolt Trap
+I:6:100:0:8:20:0d0:R
+D:Some poisoned bolts shoot out at you.
+F:FLOOR | CHEST | DOOR
+
+N:128:Poison Seeker Arrows Trap
+I:7:100:0:9:27:0d0:R
+D:Some poisoned seeker arrows shoot out at you.
+F:FLOOR | CHEST | DOOR
+
+N:129:Poison Seeker Bolts Trap
+I:9:100:0:9:30:0d0:R
+D:Some poisoned seeker bolts shoot out at you.
+F:FLOOR | CHEST | DOOR
+
+N:130:Broken Daggers Trap
+I:4:100:0:6:12:0d0:R
+D:Some broken daggers shoot out at you.
+F:FLOOR | CHEST | DOOR
+
+N:131:Dagger Trap
+I:4:100:0:6:15:0d0:R
+D:Some daggers shoot out at you.
+F:FLOOR | CHEST | DOOR
+
+N:132:Poison Broken Daggers Trap
+I:5:100:0:7:18:0d0:R
+D:Some poisoned broken daggers shoot out at you.
+F:FLOOR | CHEST | DOOR
+
+N:133:Poison Daggers Trap
+I:6:100:0:7:23:0d0:R
+D:Some poisoned daggers shoot out at you.
+F:FLOOR | CHEST | DOOR
+
+N:140:Trap of Drop Item
+I:3:50:0:2:5:0d0:y
+D:A sudden sound startles you and you drop something!
+F:FLOOR | CHEST | DOOR
+
+N:141:Trap of Drop Items
+I:5:50:0:5:12:0d0:y
+D:A sudden sound startles you and you drop several things!
+F:FLOOR | CHEST | DOOR
+
+N:142:Trap of Drop Everything
+I:8:50:0:8:20:0d0:y
+D:A sudden sound startles you and you drop everything!
+F:FLOOR | CHEST | DOOR
+
+#-SC-
+N:150:Trap of Femininity
+I:4:30:5:0:10:2d8:r
+D:You feel like a new woman!
+F:FLOOR | CHEST | DOOR
+
+N:151:Trap of Masculinity
+I:4:30:5:0:10:2d8:r
+D:You feel like a new man!
+F:FLOOR | CHEST | DOOR
+
+N:152:Trap of Neutrality
+I:4:30:5:0:10:2d8:r
+D:You feel like a new woman... erm, a new man... er, WHAT did you say???
+F:FLOOR | CHEST | DOOR
+
+N:153:Trap of Aging
+I:5:50:5:0:15:1d8:r
+D:You suddenly age very fast!
+F:CHEST | DOOR
+
+N:154:Trap of Growing
+I:3:75:5:0:5:1d8:r
+D:You begin to grow!
+F:FLOOR | CHEST | DOOR
+
+N:155:Trap of Shrinking
+I:3:75:5:0:5:1d8:r
+D:You begin to shrink!
+F:FLOOR | CHEST | DOOR
+
+#N:156: UNUSED
+
+#N:157: UNUSED
+
+N:158:Trap of Divine Anger
+I:6:100:5:0:15:0d0:G
+D:A voice booms out "Have a care, mortal!"
+F:FLOOR | CHEST | DOOR
+
+N:159:Trap of Divine Wrath
+I:9:50:5:0:30:0d0:G
+D:A voice booms out "Sacrilege!"
+F:FLOOR | CHEST | DOOR
+
+N:160:Hallucination Trap
+I:3:100:10:0:4:0d0:r
+D:Your vision is clouded by a blast of kaleidoscopic light!
+F:FLOOR | CHEST | DOOR
+
+# Bolt traps
+N:161:Greater Magic Missile Trap
+I:6:80:5:6:75:25d20:g
+D:A greater magic missile hits you!
+F:FLOOR | CHEST | DOOR | LEVEL3
+
+#N:162:Foulness Trap
+#I:6:80:5:6:15:10d12:g
+#D:You feel foul!
+#F:FLOOR | CHEST | DOOR | LEVEL3
+
+#N:163:Trap of Death Ray
+#I:8:80:5:9:25:15d16:g
+#D:A Ray of Death hits you!
+#F:FLOOR | CHEST | DOOR | LEVEL4
+
+N:164:Trap of Holy Fire
+I:6:80:5:6:15:10d12:g
+D:Holy fire rises around you!
+F:FLOOR | CHEST | DOOR | LEVEL3
+
+N:165:Trap of Hell Fire
+I:6:80:5:6:15:10d12:g
+D:Hellfire rises around you!
+F:FLOOR | CHEST | DOOR | LEVEL3
+
+N:166:Psi Bolt Trap
+I:6:80:5:6:15:10d12:g
+D:Your mind is suddenly blasted!
+F:FLOOR | CHEST | DOOR | LEVEL3
+
+N:167:Psi Drain Trap
+I:6:80:5:6:15:8d10:r
+D:You suddenly can't think clearly any more...
+F:FLOOR | CHEST | DOOR | LEVEL3
+
+# Ball Traps
+
+### this one *ought* to be a Nuke Ball trap, not plasma ball, as trap 87
+### is also plasma ball. I've put the description right in advance.
+
+#N:168:Plasma Ball Trap
+#I:8:60:5:8:20:12d18:B
+#D:A blast of radiation engulfs you!
+#F:FLOOR | CHEST | DOOR | LEVEL3
+
+N:169:Psi Ball Trap
+I:8:60:5:8:20:12d18:B
+D:Your brain is suddenly blasted!
+F:FLOOR | CHEST | DOOR | LEVEL3
+
+# Useful traps
+
+N:170:Acquirement Trap
+I:1:40:5:5:18:0d0:v
+D:Whoa!
+F:FLOOR | DOOR
+
+# More bolt traps
+
+N:171:Greater Lightning Bolt Trap
+I:3:60:5:3:6:6d6:g
+D:You are jolted with electricity!
+F:FLOOR | CHEST | DOOR | LEVEL1
+
+N:172:Greater Poison Bolt Trap
+I:3:60:5:3:6:6d6:g
+D:A blast of deadly poison gas hits you!
+F:FLOOR | CHEST | DOOR | LEVEL1
+
+N:173:Greater Acid Bolt Trap
+I:3:60:5:3:6:6d6:g
+D:A jet of acid shoots out at you! It burns severely!
+F:FLOOR | CHEST | DOOR | LEVEL1
+
+N:174:Greater Cold Bolt Trap
+I:3:60:5:3:6:6d6:g
+D:You are suddenly extremely cold!
+F:FLOOR | CHEST | DOOR | LEVEL1
+
+N:175:Greater Fire Bolt Trap
+I:3:60:5:3:6:6d6:g
+D:You are suddenly extremely hot!
+F:FLOOR | CHEST | DOOR | LEVEL1
diff --git a/lib/mods/theme/edit/trolls.map b/lib/mods/theme/edit/trolls.map
new file mode 100644
index 00000000..e5d104fd
--- /dev/null
+++ b/lib/mods/theme/edit/trolls.map
@@ -0,0 +1,58 @@
+# Permanent wall
+F:X:63:3
+
+# up stairs
+F:<:6:3
+
+# Floor with tree
+F:T:96:3
+
+# Floor with tree(marked)
+F:H:96:1027
+
+# Floor with dirt
+F:.:88:3
+
+# Floor with grass
+F:;:89:3
+
+# Floor with forest troll
+F:f:89:3:297:0:0:0:0:0:0:2
+
+# Floor with stone troll
+F:s:89:3:401:0:0:0:0:0:0:2
+
+# Floor with algroth
+F:a:89:3:424:0:0:0:0:0:0:2
+
+# Floor with Bert
+F:b:89:3:493:0:0:0:0:0:0:2
+
+# Floor with Bill
+F:i:89:3:494:0:0:0:0:0:0:2
+
+# Floor with a Dwarven skeleton
+F:k:89:8:0:396
+
+# Marker
+F:,:172:6
+
+# Dungeon layout
+D:XXXXXXXXXXXXXXXXXXXXXXXXXXXX
+D:X..HTTTTTTTTTTTTTTTTTTTTTTTX
+D:XH...;TTTTTTTTTTTTTTTTTTTTTX
+D:XTTT;;HTTTTTTTTTTTTTa.TTTTTX
+D:XTTH.k...TTTHHkTHTs.fTTTTTTX
+D:XTTTT;..f.TT.;...HTTTTaTTTTX
+D:XTTTTTHT...;......TTT..HTTTX
+D:XTTTTTTT;;.k..;k.HH.i.TTTTTX
+D:XTTTTTTH.HTHTT..TH.,.HTTTTTX
+D:XTTTTT;THTTTTTHTH.bTTTTTTTTX
+D:XTTT.f.TTTTTTTaTTs;TTTTTTTTX
+D:XTTs..TTTTTTT...fHTTTTTTTTTX
+D:XTTTas.TTTTTTTTTTTTTTTTTTTTX
+D:XTTTTTTTTTTTTTTTTTTTTTTTTTTX
+D:XXXXXXXXXXXXXXXXXXXXXXXXXXXX
+
+# Starting position
+P:3:3
diff --git a/lib/mods/theme/edit/v_info.txt b/lib/mods/theme/edit/v_info.txt
new file mode 100644
index 00000000..fb4a4d20
--- /dev/null
+++ b/lib/mods/theme/edit/v_info.txt
@@ -0,0 +1,2287 @@
+# File: v_info.txt
+
+
+# This file is used to initialize the "lib/raw/v_info.raw" file, which is
+# used to initialize the "vault template" information for the Angband game.
+
+# 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/v_info.raw" file.
+
+# Note that the "spacing" in the "description" lines is very important!
+
+
+# New vault types added for Zangband -TY
+
+# Quest vaults added - rr9
+
+# Version stamp (required)
+
+V:2.0.0
+
+
+### Simple Vaults (type 7) -- maximum size 44x22 ###
+
+
+N:0:Lesser vault (round)
+X:7:5:12:20
+D: %%%%%%
+D: %%%..##..%%%
+D: %%....####....%%
+D: %......#**#......%
+D:%...,.##+##+##.,...%
+D:%.,.,.#*#*&#*#.,.,.%
+D:%.,.,.#*#&*#*#.,.,.%
+D:%...,.##+##+##.,...%
+D: %......#**#......%
+D: %%....####....%%
+D: %%%..##..%%%
+D: %%%%%%
+
+
+N:1:Lesser vault (octagon)
+X:7:5:14:20
+D: %%%%%%%%%%%%%%
+D: %%.##########.%%
+D: %%..#..,,,,..#..%%
+D:%%,..#.,####,.#..,%%
+D:%....#.,#**#,.#....%
+D:%.###+,##&&##,+###.%
+D:%.#..,,#*&**#,,..#.%
+D:%.#..,,#**&*#,,..#.%
+D:%.###+,##&&##,+###.%
+D:%....#.,#**#,.#....%
+D:%%,..#.,####,.#..,%%
+D: %%..#..,,,,..#..%%
+D: %%.##########.%%
+D: %%%%%%%%%%%%%%
+
+
+N:2:Lesser vault (octagon)
+X:7:5:12:20
+D: %%%%%%%%%%%%
+D: %%%%..........%%%%
+D: %...###+##+###...%
+D:%%...#,,#,,#,,#...%%
+D:%.###+##+##+##+###.%
+D:%.#,,#&&#**#&&#,,#.%
+D:%.#,,#&&#**#&&#,,#.%
+D:%.###+##+##+##+###.%
+D:%%...#,,#,,#,,#...%%
+D: %...###+##+###...%
+D: %%%%..........%%%%
+D: %%%%%%%%%%%%
+
+
+N:3:Lesser vault (square)
+X:7:5:12:20
+D:%%%%%%%%%%%%%%%%%%%%
+D:%*.......&........*%
+D:%.################.%
+D:%.#,.,.,.,.,.,.,.#.%
+D:%.#.############,#.%
+D:%.#,+,&&+**#&*,#.#&%
+D:%&#.#,*&#**+&&,+,#.%
+D:%.#,############.#.%
+D:%.#.,.,.,.,.,.,.,#.%
+D:%.################.%
+D:%*........&.......*%
+D:%%%%%%%%%%%%%%%%%%%%
+
+
+N:4:Lesser vault (diagonal)
+X:7:5:12:20
+D:%%%%%%%%%%%%%%%%%
+D:%,,,##,,,,##....%%
+D:%,,,,##,,,,##....%%
+D:%#,,,,##,,,,##....%%
+D:%##,,,,##,,,,##....%
+D:%.##,,,,,,,,,,#+...%
+D:%..#+,,,,,,,,,,##..%
+D:%...##,,,,##,,,,##.%
+D:%%...##,,,,##,,,,##%
+D: %%...##,,,,##,,,,#%
+D: %%...##,,,,##,,,,%
+D: %%%%%%%%%%%%%%%%%
+
+
+N:5:Lesser vault (diagonal)
+X:7:5:12:20
+D: %%%%%%%%%%%%%%%%%
+D: %%....##,,,,##,,,%
+D: %%....##,,,,##,,,,%
+D:%%....##,,,,##,,,,#%
+D:%....##,,,,##,,,,##%
+D:%...+#,,,,,,,,,,##.%
+D:%..##,,,,,,,,,,+#..%
+D:%.##,,,,##,,,,##...%
+D:%##,,,,##,,,,##...%%
+D:%#,,,,##,,,,##...%%
+D:%,,,,##,,,,##...%%
+D:%%%%%%%%%%%%%%%%%
+
+
+N:6:Lesser vault (square)
+X:7:5:12:20
+D:%%%%%%%%%%%%%%%%%%%%
+D:%,################,%
+D:%^#.*...&..,....,#^%
+D:%^#...,......&...#^%
+D:%^#######++#######^%
+D:%^+.,..&+,*+*....+^%
+D:%^+..*.,+.&+.,.&.+^%
+D:%^#######++#######^%
+D:%^#....,.,.....,.#^%
+D:%^#..&......*....#^%
+D:%,################,%
+D:%%%%%%%%%%%%%%%%%%%%
+
+N:7:Lesser vault (spiral)
+X:7:5:19:21
+D:%%%%%%%%%%%%%%%%%%%%%
+D:%...................%
+D:%.+################.%
+D:%.#^#*&..,.......*#.%
+D:%.#.#.###########.#.%
+D:%.#.#.#*.,.....*#.#.%
+D:%.#.#.#.#######.#.#.%
+D:%.#.#.#.#,...*#.#.#.%
+D:%.#.#.#.#,###.#.#.#.%
+D:%.#,#,#,#,,*#,#,#,#.%
+D:%.#.#.#.###,#.#.#.#.%
+D:%.#.#.#*.,.*#.#.#.#.%
+D:%.#.#.#######.#.#.#.%
+D:%.#.#*...,...*#.#.#.%
+D:%.#.###########.#.#.%
+D:%.#*.....,....&*#^#.%
+D:%.################+.%
+D:%...................%
+D:%%%%%%%%%%%%%%%%%%%%%
+
+N:8:Lesser vault (layers)
+X:7:5:21:21
+D:%%%%%%%%%%%%%%%%%%%%%
+D:%...................%
+D:%.########+########.%
+D:%.#.......,.......#.%
+D:%.#.#############.#.%
+D:%.#.#....+.#*...#.#.%
+D:%.#.#.####+####.#.#.%
+D:%.#.#.#...&...#.#.#.%
+D:%.#.#.#.#####.#.#.#.%
+D:%.#.#.#.#*,*#.#.#.#.%
+D:%.#^#^#^#,,,#^#^#.#.%
+D:%.#.#.#.#*,*#.#.#.#.%
+D:%.#.#.#.##+##.#.#.#.%
+D:%.#.#.#..+,#*.#.#.#.%
+D:%.#.#.#########.#.#.%
+D:%.#.#.....,.....#.#.%
+D:%.#.######+######.#.%
+D:%.#.....*#.+......#.%
+D:%.#################.%
+D:%...................%
+D:%%%%%%%%%%%%%%%%%%%%%
+
+N:9:Lesser vault (bank)
+X:7:7:9:21
+D:%%%%%%%%%%%%%%%%%%%%%
+D:%...................%
+D:%.&XXXXXXXXXXXXXXXXX%
+D:%&&XXXXX+XXX+XX*,XXX%
+D:%&&+###########,*XXX%
+D:%.&XXX+XXX+XXX+XXXXX%
+D:%.&XXXXXXXXXXXXXXXXX%
+D:%...................%
+D:%%%%%%%%%%%%%%%%%%%%%
+
+N:10:Lesser vault (mine)
+X:7:7:9:21
+D:%%%%%%%%%%%%%%%%%%%%%
+D:%...................%
+D:%.XXXXXXXXXXXXXXXXXX%
+D:%.XX##XXXX*,,XX,*,XX%
+D:%.*#XX,*##X*#XX***XX%
+D:%.XXXX*,XXXXX##,*,XX%
+D:%.XXXXXXXXXXXXXXXXXX%
+D:%...................%
+D:%%%%%%%%%%%%%%%%%%%%%
+
+N:11:Lesser vault (maze)
+X:7:5:22:22
+D:%%%%%%%%%%%%%%%%%%%%%%
+D:%.XXXXXXX............%
+D:%.XX,,.XXXXXXXXXXXXX.%
+D:%.XXXX*...&........X.%
+D:%.X.,,XXXXXXXXXXXX*X.%
+D:%.X.XXX.....*......X.%
+D:%.X..XX.XXXXXXXXXX.X.%
+D:%.XX.X.&.XX.X.....*X.%
+D:%.XX.XXX...*X,XXXX.^.%
+D:%.X.XX,XXXX.XXXX,XXX.%
+D:%.X.XX.....*..&.*X,X.%
+D:%.X.,XXXXXXXXXXX.X,X.%
+D:%.XXXX....*..X,X.X,X.%
+D:%.X....XXX.X.X.X.X.X.%
+D:%.X.XXXX,X.X.&.X.X.X.%
+D:%.X.X...*X.XXXXX.X.X.%
+D:%.X.X,XX&X....&..X.X.%
+D:%.X.XXXX.XXXXXXXXX.X.%
+D:%.X.....*...X*X*X..X.%
+D:%.XX^XXXXXX..X*X,XXX.%
+D:%........XXXXXXXXXXX.%
+D:%%%%%%%%%%%%%%%%%%%%%%
+
+N:12:Lesser vault (prison)
+X:7:10:16:35
+D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+D:%.+..&..+..&..+..&..+..&..+..&..+.%
+D:%.###.#####.#####.#####.#####.###.%
+D:% #,+.+,#,+.+,#,+.+,#,+.+,#,+.+,#.%
+D:%.###.#####.#####.#####.#####.###.%
+D:%.#,+.+,#,+.+,#,+.+,#,+.+,#,+.+,#.%
+D:%.###.#####.#####.#####.#####.###.%
+D:%.#,+.+,#,+.+,#,+.+,#,+.+,#,+.+,#.%
+D:%.###.#####.#####.#####.#####.###.%
+D:%.#,+.+,#,+.+,#,+.+,#,+.+,#,+.+,#.%
+D:%.###.#####.#####.#####.#####.###.%
+D:%.#,+.+,#,+.+,#,+.+,#,+.+,#,+.+,#.%
+D:%.###.#####.#####.#####.#####.###.%
+D:%&+..&..+..&..+..&..+..&..+..&..+.%
+D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+N:13:Lesser vault (camp)
+X:7:10:15:37
+D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+D:%...................................%
+D:%.####^^^^^^^^^^^^^^^^^^^^^^^^^####.%
+D:%.#,&############+++############&,#.%
+D:%.###+.........................+###.%
+D:%.^#....##+#.....#+#....##+#....#^..%
+D:%.^+....#,,#.....#,#....#,,#....+^..%
+D:%.^+....+&&+..&..+&+..&.+&&+....+^..%
+D:%.^+....#,,#.....#,#....#,,#....+^..%
+D:%.^#....#+##.....#+#....#+##....#^..%
+D:%.###+.........................+###.%
+D:%.#,&############+++############&,#.%
+D:%.####^^^^^^^^^^^^^^^^^^^^^^^^^####.%
+D:%...................................%
+D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+N:14:Lesser vault (serpent)
+X:7:10:17:32
+D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+D:%..............................%
+D:%..##########################..%
+D:%.##...#.^.#.^.#...#...#.,.###.%
+D:%.#..#.*.#...#...#.^.#...#...+.%
+D:%.#.##########################.%
+D:%.#..#..#.,.#.^.#.^.#.*.#...##.%
+D:%.##^#.#..#...#...#...#...#..#.%
+D:%.#..#.####################..#.%
+D:%.#,##.&+,,,,,,,,,,,,,,,,,#*##.%
+D:%.#..##&+,,,,,,,,,,,,,,,,,#..#.%
+D:%.##^#######################.#.%
+D:%.#..#...#...#...#...#.^.#...#.%
+D:%.##...#.^.#.,.#.*.#.^.#...###.%
+D:%..##########################..%
+D:%..............................%
+D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+N:15:Lesser vault (zelazny)
+X:7:5:18:19
+D:%%%%%%%%%%%%%%%%%%%
+D:%.................%
+D:%.###############.%
+D:%.+,,,,,,,,,,,,,#.%
+D:%.###########,,,#.%
+D:%.#,,,,+..##,,,##.%
+D:%.#,,,##.##,,,##..%
+D:%.#,*##.##,,,##...%
+D:%.#&##.##,,,##.##.%
+D:%.###.##,,,##.###.%
+D:%.##.##,,,##.##&#.%
+D:%...##,,,##.##*,#.%
+D:%..##,,,##..+,,,#.%
+D:%.##,,,##########.%
+D:%.#,,,,,,,,,,,,,+.%
+D:%.###############.%
+D:%.................%
+D:%%%%%%%%%%%%%%%%%%%
+
+N:16:Lesser vault (overlap)
+X:7:5:12:18
+D:%%%%%%%%%%%%%%%%%%
+D:%................%
+D:%.##########.....%
+D:%.#,,,^^^^^+&....%
+D:%.#,,,##########.%
+D:%.#,,,#****+,,,#.%
+D:%.#,,,+****#,,,#.%
+D:%.##########,,,#.%
+D:%....&+^^^^^,,,#.%
+D:%.....##########.%
+D:%................%
+D:%%%%%%%%%%%%%%%%%%
+
+N:17:Lesser vault (celtic)
+X:7:5:17:21
+D:%%%%%%%%%%%%%%%%%%%%%
+D:%...................%
+D:%.#####..#+#..#####.%
+D:%.#&,##.##&##.##,&#.%
+D:%.#+##..#*^*#..##+#.%
+D:%.#....###.###....#.%
+D:%...####..&..####...%
+D:%.###*##.#+#.##*###.%
+D:%.+&.^..&+*+&..^.&+.%
+D:%.###*##.#+#.##*###.%
+D:%...####..&..####...%
+D:%.#....###.###....#.%
+D:%.#+##..#*^*#..##+#.%
+D:%.#&,##.##&##.##,&#.%
+D:%.#####..#+#..#####.%
+D:%...................%
+D:%%%%%%%%%%%%%%%%%%%%%
+
+
+N:18:Lesser vault (mirror)
+X:7:5:17:19
+D:%%%%%%%%%%%%%%%%%%%
+D:%.................%
+D:%.+#############+.%
+D:%.##&,,,,#,,,,&##.%
+D:%.#&#,,,###,,,#&#.%
+D:%.#,,,,,,#,,,,,,#.%
+D:%.##,,,,,#,,,,,##.%
+D:%.###,,,^#^,,,###.%
+D:%.#######+#######.%
+D:%.###,,,^#^,,,###.%
+D:%.##,,,,,#,,,,,##.%
+D:%.#,,,,,,#,,,,,,#.%
+D:%.#&#,,,###,,,#&#.%
+D:%.##&,,,,#,,,,&##.%
+D:%.+#############+.%
+D:%.................%
+D:%%%%%%%%%%%%%%%%%%%
+
+
+N:19:Lesser vault (tower)
+X:7:5:18:15
+D:%%%%%%%%%%%%%%%
+D:%.............%
+D:%..XXX...XXX..%
+D:%..X&XXXXX&X..%
+D:%..XX*****XX..%
+D:%...XX***XX...%
+D:%....X#+#X....%
+D:%....X&&&X....%
+D:%....X^^^X....%
+D:%....X#+#X....%
+D:%....X,,,X....%
+D:%....X^^^X....%
+D:%...XX+#+XX...%
+D:%..XX,&,&,XX..%
+D:%..X^^^*^^^X..%
+D:%.##+#####+##.%
+D:%...&.....&...%
+D:%%%%%%%%%%%%%%%
+
+
+### Greater vaults (type 8) -- maximum size 66x44 ###
+
+N:20:Greater vault (huge)
+X:8:20:17:39
+D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+D:%XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX%
+D:%+&#8#&#8#&#8#&#8#&#8#&#8#&#8#&#8#&#8X%
+D:%XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX#X%
+D:%X8#&#8#&#8#&#8#&#8#&#8#&#8#&#8#&#8#&X%
+D:%X#XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX%
+D:%X&#8#&#8#&#8#&#8#&#8#&#8#&#8#&#8#&#8X%
+D:%XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX#X%
+D:%X8#&#8#&#8#&#88888888888#8#&#8#&#8#&X%
+D:%X#XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX%
+D:%X&#8#&#8#&#8#&#8#&#8#&#8#&#8#&#8#&#8X%
+D:%XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX#X%
+D:%X8#&#8#&#8#&#8#&#8#&#8#&#8#&#8#&#8#&X%
+D:%X#XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX%
+D:%X&#8#&#8#&#8#&#8#&#8#&#8#&#8#&#8#&#&+%
+D:%XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX%
+D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+N:21:Greater vault (large)
+X:8:35:18:40
+D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+D:%XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX%
+D:%X,#,#,#,#,#,#,#,#*@@*#,#,#,#,#,#,#,#,X%
+D:%X+XXXXXXXXXXXXXXXX##XXXXXXXXXXXXXXXX+X%
+D:%X.,..,.X&.&.,*XX******XX*,.&.&X.,...,#%
+D:%X..,.^^X....,XX***@@***XX,....X^^..,.#%
+D:%XXXXXX+X^&.&XX***@##@***XX&.&^X+XXXXXX%
+D:%X,.&.^^X+XXXX***@#XX#@***XXXX+X^^.,..X%
+D:%X..,&,.X^^^@X**@#X88X#@**#@^^^X.,..&,X%
+D:%X.,....X^^^@#**@#X88X#@**X@^^^X.&.,..X%
+D:%X...,^^X+XXXX***@#XX#@***XXXX+X^^..,.X%
+D:%XXXXXX+X^&.&XX***@##@***XX&.&^X+XXXXXX%
+D:%#.,..^^X.....XX***@@***XX,....X^^.,..X%
+D:%#...,..X&.&.,*XX******XX*,.&.&X..,..,X%
+D:%X+XXXXXXXXXXXXXXXX##XXXXXXXXXXXXXXXX+X%
+D:%X,#,#,#,#,#,#,#,#*@@*#,#,#,#,#,#,#,#,X%
+D:%XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX%
+D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+N:22:Greater vault (butterfly)
+X:8:25:18:40
+D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+D:%XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX%
+D:%X*9..&XX***++^^^^^^^^^^^^++***XX&..*9X%
+D:%X9..&XX,,,,,XX^^^^^^^^^^XX,,,,,#X&..*X%
+D:%X..&#X.....,.XX^^^^^^^^XX..&....XX&..X%
+D:%X.&XX..,.&....XX^^^^^^XX..,...&..XX&.X%
+D:%X&XX..*...&.^..XX^^^^XX..*....,..,XX&X%
+D:%XXXX+XXXXXXXXXXXXX++XXXXXXXXXXXXX+XXXX%
+D:%+....,.,.X&&&&***+99+***&&&&X,.,.,...+%
+D:%+...,.,.,X&&&&***+99+***&&&&X.,.,....+%
+D:%XXXX+XXXXXXXXXXXXX++XXXXXXXXXXXXX+XXXX%
+D:%X&XX..*....&...XX^^^^XX...*...&,..#X&X%
+D:%X.&XX..&.^....XX^^^^^^XX....&....XX&.X%
+D:%X..&XX....&..XX^^^^^^^^XX..,..*.XX&..X%
+D:%X*..&#X,,,,,XX^^^^^^^^^^XX,,,,,XX&..9X%
+D:%X9*..&XX***++^^^^^^^^^^^^++***XX&..*9X%
+D:%XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX%
+D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+
+N:23:Greater vault (castle)
+X:8:35:27:27
+D:%%%%%%%%%%%%%%%%%%%%%%%%%%%
+D:%.........................%
+D:%..XXXXX..XXX+XXX..XXXXX..%
+D:%..X,,,X..X.,,,.X..X,,,X..%
+D:%..X,,*XXXX.&&&.XXXX*,,X..%
+D:%..XXXX+....&&&....+XXXX..%
+D:%.....X.....,,,.....X.....%
+D:%.....X..,XXX+XXX,..X.....%
+D:%.....X.XXX^^^^^XXX.X.....%
+D:%.&...X.X,,*****,,X.X..&..%
+D:%....XX.X,XXX+XXX,X.XX....%
+D:%....X..X,X@@@@@X,X..X....%
+D:%....X..X,X@999@X,X..X....%
+D:%....X..X,X@989@X,X..X....%
+D:%....X..X,X@999@X,X..X....%
+D:%....X..X,X@@@@@X,X..X....%
+D:%....XX.X,XXX+XXX,X.XX....%
+D:%.....X.X,,*****,,X.X.....%
+D:%.....X.XXX^^^^^XXX.X.....%
+D:%.....X..,XXX+XXX,..X.....%
+D:%.....X.....&&&.....X.....%
+D:%..XXXX+....&&&....+XXXX..%
+D:%..X,,*XXXX.&&&.XXXX*,,X..%
+D:%..X,,,X..X.,,,.X..X,,,X..%
+D:%..XXXXX..XX^^^XX..XXXXX..%
+D:%.........................%
+D:%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+N:24:Greater vault (chambers)
+X:8:25:15:40
+D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+D:%&+.^..^..^..^..^..^..^..^..^..^..^..+&%
+D:%+XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX+%
+D:%.X.&.^,X&^&^X****+^*^@^X.*.&..X..*.,X.%
+D:%^X.,.&^+^&^@X^^^^X@^*^*X....*^+.^...X^%
+D:%.X*..,.XXX+XXXX+XXXX+XXX.&.^..X..&,.X.%
+D:%^X..^.*X*..^&&@@*X,,,,,XXXX+XXX,....X^%
+D:%.XX+XXXXXXXXXXXXXX,*8*,X,,,,,,XXX+XXX.%
+D:%^X*&X.&,*.X,*&^*^X,,,,,X,,,,,,X....,X^%
+D:%.X&,+....*+,*&^*^XXXXXXXXXX+XXX.,...+.%
+D:%^X.,X.*.&.X,*&^*^+.,.&.^*.&^&^X.....X^%
+D:%.X^*X.,..,X,*&^*^X*.^*.,..&&&^X,..,.X.%
+D:%+XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX+%
+D:%&+..^..^..^..^..^..^..^..^..^..^..^.+&%
+D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+N:25:Greater vault (Sierpinski)
+X:8:35:28:39
+D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+D:%..................X..................%
+D:%.................XXX.................%
+D:%.................X8X.................%
+D:%.....&..........XX+XX................%
+D:%...............XX999XX........&......%
+D:%......&........X@X9X@X...............%
+D:%..............XXXX+XXXX..............%
+D:%.............XX*@*@*@*XX....&........%
+D:%.............X@X*@*@*X@X.............%
+D:%............XXXX**@**XXXX............%
+D:%..........&XX,,,X***X,,,XX&..........%
+D:%..........XX,X@X,X,X,X@X,XX..........%
+D:%.........XXXXX+XXXXXXX+XXXXX.........%
+D:%........XX+,,,,,,,,,,,,,,,+XX........%
+D:%........X@X,,,,,,,,,,,,,,,X@X........%
+D:%.......XX+XX,,,,,,,,,,,,,XX+XX.......%
+D:%......XX,,,XX,,,,,,,,,,,XX,,,XX......%
+D:%......X,X,X,X,,,,,,,,,,,X,X,X,X......%
+D:%.....XXXX+XXXX,,,,,,,,,XXXX+XXXX.....%
+D:%....XX*******XX,,,,,,,XX*******XX....%
+D:%....X,X*****X,X,,,,,,,X,X*****X,X....%
+D:%...XXXX*****XXXX,,,,,XXXX*****XXXX...%
+D:%..XX,,,X***X,,,XX,,,XX,,,X***X,,,XX..%
+D:%..X,X,X,X*X,X,X,X,,,X,X,X,X*X,X,X,X..%
+D:%.XXXXXXXX+XXXXXXXXXXXXXXXXX+XXXXXXXX.%
+D:%.........&.................&.........%
+D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+N:26:Greater vault (swastika)
+X:8:25:23:29
+D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+D:%....^^^^^^^^^^^^^^^^^^^^^..%
+D:%^^^^^###################^..%
+D:%^####+..#..............#^..%
+D:%^#.....####.XXXXXXXXXX.#^..%
+D:%^#...&.#,&..X,,,@,@,9X.#^..%
+D:%^#.XXX.####.X,XXXXXXXX.#^..%
+D:%^#.X9X..&,#.X,X......&.#^^^%
+D:%^#.X,X.####.X,X.#######+##^%
+D:%^#.X@X.....^X^X^.........#^%
+D:%^#.X@XXXXXXX+*+XXXXXXXXX.#^%
+D:%^#.X,,,,,,,^*X*^,,,,,,,X.#^%
+D:%^#.XXXXXXXXX+*+XXXXXXX@X.#^%
+D:%^#.........^X^X^.....X@X.#^%
+D:%^##+#######.X,X.####.X,X.#^%
+D:%^^^#.&......X,X.#,&..X9X.#^%
+D:%..^#.XXXXXXXX,X.####.XXX.#^%
+D:%..^#.X9,@,@,,,X..&,#.&...#^%
+D:%..^#.XXXXXXXXXX.####.....#^%
+D:%..^#..............#..+####^%
+D:%..^###################^^^^^%
+D:%..^^^^^^^^^^^^^^^^^^^^^....%
+D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+N:27:Greater vault (great spiral)
+X:8:40:39:39
+D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+D:%.....................................%
+D:%.X+XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.%
+D:%.X@X.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^^+.%
+D:%.X.X^XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.%
+D:%.X.X.X,..,..,..,..,..,..,..,..,..,.X.%
+D:%.X.X^X.XXXXXXXXXXXXXXXXXXXXXXXXXXX.X.%
+D:%.X.X.X.X......&...&...&...&...@..X,X.%
+D:%.X.X^X,X@XXXXXXXXXXXXXXXXXXXXXXX.X.X.%
+D:%.X.X.X.X.X&.........8.........&X*X.X.%
+D:%.X.X^X.X.X.XXXXXXXXXXXXXXXXXXX.X.X,X.%
+D:%.X.X.X,X.X.X.^.^.^.^.^.^.^.^.X.X.X.X.%
+D:%.X.X^X.X.X.X^XXXXXXXXXXXXXXX*X.X*X.X.%
+D:%.X.X.X.X&X.X.X,..,..,..,..,X.X.X.X,X.%
+D:%.X.X^X,X.X.X^X.XXXXXXXXXXX.X*X.X.X.X.%
+D:%.X.X.X.X.X.X.X.X..&..&..9X.X.X.X*X.X.%
+D:%.X.X^X.X&X.X^X,X9XXXXXXX.X,X*X.X.X,X.%
+D:%.X.X.X,X.X.X.X.X&X@@..&X.X.X.X.X.X.X.%
+D:%.X.X^X.X.X9X^X.X*X+XXX.X&X.X*X.X*X.X.%
+D:%.X.X.X.X.X.X.X,X^+8+^X.X.X,X.X.X.X,X.%
+D:%.X9X^X,X.X.X^X.XXX+X^X.X*X.X*X.X.X.X.%
+D:%.X.X.X.X&X.X.X.,.,,X.X9X.X.X.X.X*X.X.%
+D:%.X.X^X.X.X.X^XXXXXXX^X.X*X,X*X9X.X,X.%
+D:%.X.X.X,X.X.X.^.^.^.^.X.X.X.X.X.X.X.X.%
+D:%.X.X^X.X.X.XXXXXXXXXXX.X^X.X^X.X*X.X.%
+D:%.X.X.X.X8X&.....9.....&X.X,X.X.X.X,X.%
+D:%.X.X^X,X.XXXXXXXXXXXXXXX^X.X^X.X.X.X.%
+D:%.X.X.X.X..&....8......@..X.X.X.X*X.X.%
+D:%.X.X^X.XXXXXXXXXXXXXXXXXXX,X^X.X.X,X.%
+D:%.X.X.X,..,..,..,..,..,..,..X.X.X.X.X.%
+D:%.X.X^XXXXXXXXXXXXXXXXXXXXXXX^X.X*X.X.%
+D:%.X.X.*.^.*.*.*.*.*.*.*.*.*.^.X.X.X,X.%
+D:%.X.XXXXXXXXXXXXXXXXXXXXXXXXXXX.X.X.X.%
+D:%.X&.............9.............&X*X.X.%
+D:%.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.X,X.%
+D:%.+^^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.X,X.%
+D:%.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX+X.%
+D:%.....................................%
+D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+N:28:Greater vault (greater castle)
+X:8:40:25:51
+D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+D:%.................................................%
+D:%...XXXXXX...............................XXXXXX...%
+D:%..XX,,,,XX.............................XX,,,,XX..%
+D:%.XX,*99*,XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX,*99*,XX.%
+D:%.XX,*99*,+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^+,*99*,XX.%
+D:%..XX,,,,XXXXXXXXXXXXXXX+X+XXXXXXXXXXXXXXX,,,,XX..%
+D:%...XX++XX...............X...............XX++XX...%
+D:%....X^^X.............XXXXXXX.............X^^X....%
+D:%....X^^X.X^^^^^^^^^^^^^^^^^^^^^^^^^^^^^X.X^^X....%
+D:%....X^^X.X^^^XXXXXXXXXXXXXXXXXXXXXXX^^^X.X^^X....%
+D:%....X^^+&X^^XX@.+***************+.@XX^^X&+^^X....%
+D:%....X^^XXX^^+@.@X*9999988899999*X@.@+^^XXX^^X....%
+D:%....X^^+.X^^XX@.+***************+.@XX^^X.+^^X....%
+D:%....X^^X.X^^^XXXXXXXXXXXXXXXXXXXXXXX^^^X.X^^X....%
+D:%....X^^X.X^^^^^^^^^^^^^^^^^^^^^^^^^^^^^X.X^^X....%
+D:%....X^^X............XXXX+XXXX............X^^X....%
+D:%...XX++XX..........XX&.&.&.&XX..........XX++XX...%
+D:%..XX,,,,XXXXXXXXXXXX&.&.&.&.&XXXXXXXXXXXX,,,,XX..%
+D:%.XX,*99*,+********9XXXXX+XXXXX9********+,*99*,XX.%
+D:%.XX,*99*,XXXXXXXXXXX&.&.&.&.&XXXXXXXXXXX,*99*,XX.%
+D:%..XX,,,,XX.........XX&.&.&.&XX.........XX,,,,XX..%
+D:%...XXXXXX...........XXXX+XXXX...........XXXXXX...%
+D:%.................................................%
+D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+N:29:Lesser vault (x-factor)
+X:8:25:25:26
+D:%%%%%%%%%%%%%%%%%%%%%%%%%%
+D:%^^^^^^^^^^^^^^^^^^^^^^^^%
+D:%^##########++##########^%
+D:%^#XX,,,,,,,,,,,,,,,,XX#^%
+D:%^#,XX,,,,,,,,,,,,,,XX,#^%
+D:%^#,,XX,,,,,,,,,,,,XX,,#^%
+D:%^#,,,XX,,,,,,,,,,XX,,,#^%
+D:%^#,,,,XX,,,,,,,,XX,,,,#^%
+D:%^#,,,,,XX,,,,,,XX,,,,,#^%
+D:%^#,,,,,,XX,,,,XX,,,,,,#^%
+D:%^#,,,,,,,X+XX+X,,,,,,,#^%
+D:%^+,,,,,,,,X99X,,,,,,,,+^%
+D:%^+,,,,,,,,X99X,,,,,,,,+^%
+D:%^+,,,,,,,,X99X,,,,,,,,+^%
+D:%^#,,,,,,,X+XX+X,,,,,,,#^%
+D:%^#,,,,,,XX,,,,XX,,,,,,#^%
+D:%^#,,,,,XX,,,,,,XX,,,,,#^%
+D:%^#,,,,XX,,,,,,,,XX,,,,#^%
+D:%^#,,,XX,,,,,,,,,,XX,,,#^%
+D:%^#,,XX,,,,,,,,,,,,XX,,#^%
+D:%^#,XX,,,,,,,,,,,,,,XX,#^%
+D:%^#XX,,,,,,,,,,,,,,,,XX#^%
+D:%^##########++##########^%
+D:%^^^^^^^^^^^^^^^^^^^^^^^^%
+D:%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+N:30:Greater vault (university)
+X:8:30:29:38
+D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+D:%....................................%
+D:%.##################################.%
+D:%.#*+..&#..,#,#..,#,#..,#,#.,#&+*#*#.%
+D:%.#####.#.###.#.###.#.###.#.##.###+#.%
+D:%.#***#.#.#*..#.#*..#.#*..#.#..#..&#.%
+D:%.#+###+#+###+#+###+#+###+#+##+###+#.%
+D:%.#...+&......................&+...#.%
+D:%.#.###.##########++##########.###.#.%
+D:%.#,#.+.#,,,,,,,,,,,,,,,,,,,,#.#*#,#.%
+D:%.###.#.#,.,..,..,@.,..,..,.,#.#.###.%
+D:%.#,..#.#,..,..,..,..,..,..,,#.+..,#.%
+D:%.#####.#,9&,,,9,,&,,&,,.,,,,#.#####.%
+D:%.+^^^+.+,,,&,,,&,,,9,,&,,&,,+.+^^^+.%
+D:%.+^^^+.+,.,...,...,...,...,,+.+^^^+.%
+D:%.###+#.#,,,,&,,&,,,9,&,,,&,,#.#####.%
+D:%.#*#&#.#,,,&,,,9,&,,&,,,,,9,#.#..,#.%
+D:%.#+#*#.#,.,...,....,....,..,#.#.###.%
+D:%.#.###.#,,,&,,,,&,9,,&,,,&,,#.+.#,#.%
+D:%.#&..+.#,,,,,,,,.,,,,,,,,,,,#.###.#.%
+D:%.#####.##########++##########.+...#.%
+D:%.#&..+&......................&#+###.%
+D:%.#.###+#+###+#+###+#+###+#+##+#...#.%
+D:%.#.+*#.#.#*..#.#*..#.#*..#.#..###,#.%
+D:%.#####.#.###.#.###.#.###.#.##&#*###.%
+D:%.#*+..&#..,#,#..,#,#..,#,#.,#.+,*,#.%
+D:%.##################################.%
+D:%....................................%
+D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+N:31:Greater vault (nethack castle (almost))
+X:8:35:19:62
+D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+D:%............................................................%
+D:%.XXXXXXX............................................XXXXXXX.%
+D:%.X,,9,,XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX,,9,,X.%
+D:%.X,,,,,+.......^....*....^ ..........^.......*...^..+,,,,,X.%
+D:%.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX+XXXXXXXXXXXXXXXXXXXXXXXXXXX.%
+D:%......X,.,9,,,,X,,,,,,,,,+,.,.,.,.,.,X,.,.,.+^+,.,.,.X......%
+D:%......X,.9*9,.,X,,,,,,,,,X,.,..,..,.,X,.,.,.X^X,.,.,.X......%
+D:%....&.X.&*@*&,.XXXXXXXXXXX,.,.,9,.,.,XXXXXXXX+XXXXXXXX......%
+D:%......+9*@8@*9.+^^^^^^^^^+,.,,9@9,,.,+^^^^^^^^^^^^^^^+......%
+D:%....&.X.&*@*&,.XXXXXXXXXXX,.,.,9,.,.,XXXXXXXX+XXXXXXXX......%
+D:%......X,.9*9,.,X,,,,,,,,,X,.,.,,,.,.,X.,.,.,X^X.,.,.,X......%
+D:%......X,.,9,,,,X,,,,,,,,,+,.,.,.,.,.,X.,.,.,+^+.,.,.,X......%
+D:%.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX+XXXXXXXXXXXXXXXXXXXXXXXXXXX.%
+D:%.X,,,,,+.......^....*....^...........^.......*...^..+,,,,,X.%
+D:%.X,,9,,XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX,,9,,X.%
+D:%.XXXXXXX............................................XXXXXXX.%
+D:%............................................................%
+D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+N:32:Greater vault (another nethack-style castle)
+X:8:30:18:52
+D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+D:%..................................................%
+D:%.XXXXX......................................XXXXX.%
+D:%.X9,,X......................................X,,9X.%
+D:%.XXX+XXXXXXXXXXXXXXXXXXX++XXXXXXXXXXXXXXXXXXX+XXX.%
+D:%...X^^^^^^^^^^^^^^^^^^^+..+^^^^^^^^^^^^^^^^^^^X...%
+D:%...X^XXXXXXXXXXXXXXXXXXX++XXXXXXXXXXXXXXXXXXX^X...%
+D:%...X^X,,,,,,,,,,,,,,,,,X..X,,,,,,,,,X,,@@@@,X^X...%
+D:%...X^X,,,,,,,,,,,,,,,,,+..+,,,,,,,,,+,,,,998X^X...%
+D:%...X^X,,,,,,,,,,,,,,,,,+..+,,,,,,,,,+,,,,998X^X...%
+D:%...X^X,,,,,,,,,,,,,,,,,X..X,,,,,,,,,X,,@@@@,X^X...%
+D:%...X^XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX^X...%
+D:%...X^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^X...%
+D:%.XXX+XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX+XXX.%
+D:%.X9,,X......................................X,,9X.%
+D:%.XXXXX......................................XXXXX.%
+D:%..................................................%
+D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+N:33:Lesser vault (nethack-style tower)
+X:7:5:15:19
+D:%%%%%%%%%%%%%%%%%%%
+D:%.................%
+D:%...###.###.###...%
+D:%...#&#.#&#.#&#...%
+D:%.###+###+###+###.%
+D:%.#.,.,.,.+.+,,,#.%
+D:%.###+#####.#####.%
+D:%...+*&*&*#.+,#...%
+D:%.###+#####.#####.%
+D:%.#.,.,.,.+.+,,,#.%
+D:%.###+###+###+###.%
+D:%...#&#.#&#.#&#...%
+D:%...###.###.###...%
+D:%.................%
+D:%%%%%%%%%%%%%%%%%%%
+
+
+N:34:Lesser vault (nethack, rooms)
+X:7:5:14:27
+D:%%%%%%%%%%%%%%%%%%%%%%%%%%%
+D:%.........................%
+D:%.#+#####################.%
+D:%.#.^.^.^.+^+^...^#,,,,,#.%
+D:%.#^###+###^#####.+,,,,,#.%
+D:%.#.#,,,,,#.#,,,#^#,,,,,#.%
+D:%.#^#,,,,,#^+,,,#+#######.%
+D:%.#.#######.#,,,#.......#.%
+D:%.#^#,,,,,#^#,,,#..&.&..#.%
+D:%.#.#,,,,,#.#####.......#.%
+D:%.#^+,,,,,#^.^.^+..&.&.^+.%
+D:%.#######################.%
+D:%.........................%
+D:%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+N:35:Lesser vault (nethack city)
+X:7:9:17:33
+D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+D:%...............................%
+D:%.############.....############.%
+D:%.#,,,#,,,#,,#.....#**#,,,#***#.%
+D:%.#,,,#,,,#,,#.....+**#,,,#***#.%
+D:%.#,,,#,,,#,,#.....#**#,,,#&&&#.%
+D:%.#^,,#,,,#+##.....####+###+###.%
+D:%.#+####+##.....................%
+D:%...............................%
+D:%.#+###+###....###+##...........%
+D:%.#^,,#^,,####.#,,,,#.######+##.%
+D:%.#,,,#,,,#**#.#,&&,#.+^^#,,,,#.%
+D:%.#,,,#,,,#*^+.#,&@,#.#^^#,,,,#.%
+D:%.#,,,#,,,#**#.#,,,,#.#**#,,,,#.%
+D:%.############.######.#########.%
+D:%...............................%
+D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+N:36:Greater vault (nethack, large city)
+X:8:25:21:54
+D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+D:%....................................................%
+D:%.##################################################.%
+D:%.#................................................#.%
+D:%.#.####################.########..#####.#########.#.%
+D:%.#.#^,,,,^#^****^#^,,^#.#^,,,,^#..#^^^#.#^,,,,,^#.#.%
+D:%.#.#^,,,,^#^****^#^,,^#.#^,,,,^#..+^**#.#^,,,,,^#.#.%
+D:%.#.#^,,,,^#^,,,,^#^^^^#.#^^^^^^#..#^^^#.#^,,,,,^#.#.%
+D:%.#.#^^^^^^#^^^^^^###+##.###+####..#####.#^^^^^^^#.#.%
+D:%.#.#+#########+###......................######+##.#.%
+D:%.#................................................#.%
+D:%.#.###+######+####......###+########..............#.%
+D:%.#.#^^^^^^#^^^^^^######.#^^^^^^^^^^#...###+#####..#.%
+D:%.#.#^,,,,^#^,,,,^#^^^^+.#^,,,,,,,,^#...#^^^^^^^#..#.%
+D:%.#.#^****^#^,,,,^#,,,^#.#^@999999@^#...#^,,,,,^#..#.%
+D:%.#.#^****^#^,,,,^#,,,^#.#^^^^^^^^^^#...#^,,,,,^#..#.%
+D:%.+.####################.############...#########..#.%
+D:%.#................................................#.%
+D:%.##################################################.%
+D:%....................................................%
+D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+N:37:Lesser vault (nethack, tiny castle)
+X:7:5:14:34
+D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+D:%................................%
+D:%.#####....................#####.%
+D:%.#*,&#....................#&,*#.%
+D:%.###+######################+###.%
+D:%...#,,,,,,,,,,,,,#,,,,,,,,,,#...%
+D:%...+,,,,,,,,,,,,,+,,,,,,,,,,+...%
+D:%...+,,,,,,,,,,,,,+,,,,,,,,,,+...%
+D:%...#,,,,,,,,,,,,,#,,,,,,,,,,#...%
+D:%.###+######################+###.%
+D:%.#*,&#....................#&,*#.%
+D:%.#####....................#####.%
+D:%................................%
+D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+N:38:Greater vault (nethack mirror)
+X:8:25:22:41
+D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+D:%.......................................%
+D:%...............XXXX+XXXX...............%
+D:%...............X**X^X**X...............%
+D:%....XXXXXXXXXXXX**X^X**XXXXXXXXXXXX....%
+D:%....X^+99999999X+XX^XX+X99999999+^X....%
+D:%....X^X9*******X,,X^X,,X*******9X^X....%
+D:%....X^X9*******X,,X^X,,X*******9X^X....%
+D:%.XXXX+XXXXXXXXXXX+X+X+XXXXXXXXXXX+XXXX.%
+D:%.X**X,,,,,,,,,,X,,,,,,,X,,,,,,,,,,X**X.%
+D:%.X*@+,,,,,,,,,,+,,,,8,,X,,,,,,,,,,+@*X.%
+D:%.X*@+,,,,,,,,,,X,,,8,,,+,,,,,,,,,,+@*X.%
+D:%.X**X,,,,,,,,,,X,,,,,,,X,,,,,,,,,,X**X.%
+D:%.XXXX+XXXXXXXXXXX+X+X+XXXXXXXXXXX+XXXX.%
+D:%....X^X9*******X,,X^X,,X*******9X^X....%
+D:%....X^X9*******X,,X^X,,X*******9X^X....%
+D:%....X^+99999999X+XX^XX+X99999999+^X....%
+D:%....XXXXXXXXXXXX**X^X**XXXXXXXXXXXX....%
+D:%...............X**X^X**X...............%
+D:%...............XXXX+XXXX...............%
+D:%.......................................%
+D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+N:39:Greater vault (nethack tomb)
+X:8:25:13:57
+D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+D:%.......................................................%
+D:%..........XXXXX.XXXXX.XXXXX.XXXXX.XXXXX................%
+D:%..........X,,,X.X,,,X.X,,,X.X,,,X.X,,,X................%
+D:%.XXXXXXXXXX,&,XXX,&,XXX,&,XXX,&,XXX,&,XXXXXXXXXXXXXXXX.%
+D:%.X&^&X....^...^...^...^...^...^...^..^..X,,,,,,,,X,,9X.%
+D:%.+^^^+..^...^...^...^...^...^...^...^.@.+,,,,,,,,+,98X.%
+D:%.X&^&X....^...^...^...^...^...^...^.....X,,,,,,,,X,,9X.%
+D:%.XXXXXXXXXX,&,XXX,.,XXX,.,XXX,&,XXX,&,XXXXXXXXXXXXXXXX.%
+D:%..........X,,,X.X,,,X.X,,,X.X,,,X.X,,,X................%
+D:%..........XXXXX.XXXXX.XXXXX.XXXXX.XXXXX................%
+D:%.......................................................%
+D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+N:40:Greater vault (nethack hell level #1)
+X:8:30:17:55
+D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+D:%.....................................................%
+D:%.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.%
+D:%.XX*XXXXXXXXXX**XXXXXXXXXXXX***********************X.%
+D:%.XX*X,,,,X***X+XX,,,,,,X***XXXXXXXXXXXX^^^^^^^^^^^^X.%
+D:%.XX,X,,,,+***X@^+,,,,,,X***+,,,,,,,,,,X^^^^^^^^^^^^X.%
+D:%.XX&X,,,,XXXXXXXX^^^^^^^^^^X,,,XXXXXXXXXXXXXX^^^^^^X.%
+D:%.XX+X....XXXX.............^X,,,+,,,,,,,,,,,9XXXXX^^X.%
+D:%.+^^^^^^^^^^+^^^^^^^^^^^^^^XXXXX,,,,,,,,,,,9+888+@@X.%
+D:%.XX+X....XXXX.............^X,,,+,,,,,,,,,,,9XXXXX^^X.%
+D:%.XX&X,,,,XXXXXXXX^^^^^^^^^^X,,,XXXXXXXXXXXXXX^^^^^^X.%
+D:%.XX,X,,,,+***X@^+,,,,,,X***+,,,,,,,,,,X^^^^^^^^^^^^X.%
+D:%.XX*X,,,,X***X+XX,,,,,,X***XXXXXXXXXXXX^^^^^^^^^^^^X.%
+D:%.XX*XXXXXXXXXX**XXXXXXXXXXXX***********************X.%
+D:%.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.%
+D:%.....................................................%
+D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+N:41:Greater vault (nethack hell level #2)
+X:8:30:15:54
+D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+D:%....................................................%
+D:%.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX...%
+D:%.+^XX,+^^^^^X^^^^^^^^^^^^^^^^^^^^^X,,,X,@^X*^*+9X...%
+D:%.X^XX,X^XXX,X@XXXXXXXXXXXXXXXXXXX^X,X,X,X^X*X*X9X...%
+D:%.X^XX,X^^^X,X^^^^^^^^^^^^^^^^^^@X^X,X,X,X^X*X*X9X...%
+D:%.X^XXXXXX^X,XXXXXXXXXXXXXXXXXXX^X^X,X,X,X^X*X*X+XXX.%
+D:%.X^^^^^^X^X,X,,,,,,,,,,,,,,,,,X^X^X,X,X,X^X*X*X888X.%
+D:%.X+XXXX^X^X,X,XXXXXXXXXXXXXXX,X^X^X,X,X,X^X*X*X+XXX.%
+D:%.X,XX,X^X^X,X,X,,,,,,,,,,,,,,,X^X^X,X,X,X^X*X*X9X...%
+D:%.X,XX,X^X&X,X,X,XXXXXXXXXXXXXXX^X^X,X,X,X^X*X*X9X...%
+D:%.X,XX,+^^^X,,,X^^^^^^^^^^^^^^^^^X^@,X,,,X^@*X*+9X...%
+D:%.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX...%
+D:%....................................................%
+D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+N:42:Greater vault (nethack hell level #3)
+X:8:30:17:55
+D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+D:%.....................................................%
+D:%...XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.........%
+D:%...X,,,,,,,,,,,,,,,,,,,,,XXX^^^^^^^^^^^^^^^X.........%
+D:%...X,^^^^^^^^^^XXXX,,,,,,+&&^XXXXXXXXXXXX^^+.........%
+D:%...X,^XXXXXX******X,,XXXXXXXXX^^^^******XXXX.........%
+D:%...X,^X****X@*XXXXXXXX,,,,,,,,,,,XXXXXXXXXXXXXX......%
+D:%.XXXX+X,,,,XXXX,,,,,,,,,,,,,,,,,^+************XXXXX..%
+D:%.X@,,,,,XX,,,,+,,XXXXXXXXXXXXXXXXX****9999****+888X..%
+D:%.XXXX+X,,,,XXXX,,,,,,,,,,,,,,,,,^+************XXXXX..%
+D:%...X,^X****X@*XXXXXXXX,,,,,,,,,,,XXXXXXXXXXXXXX......%
+D:%...X,^XXXXXX******X,,XXXXXXXXX^^^^******XXXX.........%
+D:%...X,^^^^^^^^^^XXXX,,,,,+&&^^XXXXXXXXXXXX^^+.........%
+D:%...X,,,,,,,,,,,,,,,,,,,,XXX^^^^^^^^^^^^^^^^X.........%
+D:%...XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.........%
+D:%.....................................................%
+D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+N:43:Lesser vault (easter egg)
+X:7:5:14:19
+D:%%%%%%%%%%%%%%%%%%%
+D:%.................%
+D:%.###############.%
+D:%.#,^,^,^,^,^,^,#.%
+D:%.#+###########^#.%
+D:%.#,^,^,^,^,^,#,#.%
+D:%.###########,#^#.%
+D:%.#,^,^,^,^,#^#,#.%
+D:%.#+#######,#,#^#.%
+D:%.#,,,,,,,#^#^#,#.%
+D:%.#,,,,,,,#,+,#^+.%
+D:%.###############.%
+D:%.................%
+D:%%%%%%%%%%%%%%%%%%%
+
+N:44:Greater vault (nethack samurai castle)
+X:8:35:20:59
+D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+D:%.........................................................%
+D:%.XXXXX.............................................XXXXX.%
+D:%.X***X.............................................X***X.%
+D:%.X***XXX.....XX+XXXXXXXXXXXXXXXXXXXXXXXXX+XX.....XXX***X.%
+D:%.XXX@,,X.....X^&^X,,,X***X,,,X***X^^^+8X^&^X.....X,,@XXX.%
+D:%...X,,,XXXXXXX^^^X,,,X^^^X,,,X^^^X@@^X8X^^^XXXXXXX,,,X...%
+D:%...XXX^^^^^^^^^XXXXX+XXX+X+XXXXX+X+XXXXXXX^^^^^^^^^XXX...%
+D:%.....X^^XXXXXXXX*X,,,,,,,,,,,,,,,,,,,,,X*XXXXXXXX^^X.....%
+D:%.....X^^+,,,,,,,,+,,,,,,,,,99,,,,,,,,,,+,,,,,,,,+^^X.....%
+D:%.....X^^+,,,,,,,,+,,,,,,,,,99,,,,,,,,,,+,,,,,,,,+^^X.....%
+D:%.....X^^XXXXXXXX*X,,,,,,,,,,,,,,,,,,,,,X*XXXXXXXX^^X.....%
+D:%...XXX^^^^^^^^^XXXXXXX+X+XXXXX+X+XXX+XXXXX^^^^^^^^^XXX...%
+D:%...X,,,XXXXXXX^^^X8X^@@X^^^X^^^X,,,X,,,X^^^XXXXXXX,,,X...%
+D:%.XXX@,,X.....X^&^X8+^^^X***X***X,,,X,,,X^&^X.....X,,@XXX.%
+D:%.X***XXX.....XX+XXXXXXXXXXXXXXXXXXXXXXXXX+XX.....XXX***X.%
+D:%.X***X.............................................X***X.%
+D:%.XXXXX.............................................XXXXX.%
+D:%.........................................................%
+D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+N:45:Greater vault (nethack samurai castle #2)
+X:8:35:20:61
+D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+D:%...........................................................%
+D:%.XXXXXXXXXXXXX...............................XXXXXXXXXXXXX.%
+D:%.X,,^^^^^^^,,X...............................X,,^^^^^^^,,X.%
+D:%.X,,^XXXXX^,,XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX,,^XXXXX^,,X.%
+D:%.X,,^+999X^,,X,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,X,,^X999+^,,X.%
+D:%.X,,^XXXXX^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^XXXXX^,,X.%
+D:%.X^^^^^^^^^^^XXXXXX+XXXXXXXXXXXXXXXXXXX+XXXXXX^^^^^^^^^^^X.%
+D:%.XXXX^^^XXXXXXXX*X,,,,,,,,,,,,,,,,,,,,,,,X*XXXXXXXX^^^XXXX.%
+D:%....+^^^X********+,,,,,,,,,,,,,,,,,,,,,,,+********X^^^+....%
+D:%....+^^^X********+,,,,,,,,,,,,,,,,,,,,,,,+********X^^^+....%
+D:%.XXXX^^^XXXXXXXX*X,,,,,,,,,,,,,,,,,,,,,,,X*XXXXXXXX^^^XXXX.%
+D:%.X^^^^^^^^^^^XXXXXX+XXXXXXXXXXXXXXXXXXX+XXXXXX^^^^^^^^^^^X.%
+D:%.X,,^XXXXX^,,^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^XXXXX^,,X.%
+D:%.X,,^+999X^,,X,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,X,,^X999+^,,X.%
+D:%.X,,^XXXXX^,,XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX,,^XXXXX^,,X.%
+D:%.X,,^^^^^^^,,X...............................X,,^^^^^^^,,X.%
+D:%.XXXXXXXXXXXXX...............................XXXXXXXXXXXXX.%
+D:%...........................................................%
+D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+N:46:Greater vault (nethack spiral)
+X:8:30:19:38
+D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+D:%.........XXXXXXXXX+XXXXXXXXX........%
+D:%......XXXX^^^^^^^^^^^^^^^^^XXXX.....%
+D:%...XXXX^^^^^XXXXXXXXXXXXX^^^^^XXXX..%
+D:%..XX^^^^^XXXX^^^^^^^^^^^XXXX^^^^^XX.%
+D:%.XX^^^^XXX^^^^XXXXXXXXX^^^^XXX^^^^XX%
+D:%.X^^^^XX^^^^XXX,^^^^^,XXX^^^^XX^^^^X%
+D:%.X,,,XX,,,XXX,,^XX+XX^,,XXX,,,XX,,,X%
+D:%.X,,,X,,,,X,,,^XX***XX^,,,X,,,,X,,,X%
+D:%.X,,,X,99,X,,,^+@888@+^,,,X,,,,+,,,X%
+D:%.X,,,X,,,,X,,,^XX***XX^,,,X,,,,X,,,X%
+D:%.X,,,XX,,,XXX,,^XX+XX^,,XXX,,,XX,,,X%
+D:%.X,,,,XX^^^^XXX,^^^^^,XXX^^^^XX,,,,X%
+D:%.XX,,,,XXX^^^^XXXX+XXXX^^^^XXX,,,,XX%
+D:%..XX,,,**XXXX^^^^^^^^^^^XXXX,,,,,XX.%
+D:%...XXXX**,,,XXXXXXXXXXXXX,,,,,XXXX..%
+D:%......XXXX,,,,,,,,,,,,,,,,,XXXX.....%
+D:%.........XXXXXXXXXXXXXXXXXXX........%
+D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+N:47:Greater vault (nethack building)
+X:8:30:16:41
+D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+D:%...XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX%
+D:%...X^^^^^^^^^^^^^^^^X**@**X**@**X**@**X%
+D:%...X^^XXXXXXXXXXXX^^XXX+XXXXX+XXXXX+XXX%
+D:%...X^^X,,,,,,,,,,X^^X^^^^^^^^^^^^^^^^^X%
+D:%...X^^X,,,,,,,,,,X^^X+XXX+XXX+XXXXX+XXX%
+D:%.XXX^^X,,,,,,,,,,X^^^^^^X,,,X,,,X,,,,,X%
+D:%.+^&^^X,,,,,,,,,,+^^^^^^X,,,X,,,X,989,X%
+D:%.+^&^^X,,,,,,,,,,+^^^^^^X,,,X,,,X,989,X%
+D:%.XXX^^X,,,,,,,,,,X^^^^^^X,,,X,,,X,,,,,X%
+D:%...X^^X,,,,,,,,,,X^^X+XXXXX+XXX+XXX+XXX%
+D:%...X^^X,,,,,,,,,,X^^X^^^^^^^^^^^^^^^^^X%
+D:%...X^^XXXXXXXXXXXX^^XXX+XXXXX+XXXXX+XXX%
+D:%...X^^^^^^^^^^^^^^^^X**@**X**@**X**@**X%
+D:%...XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX%
+D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+N:48:Lesser vault (nethack, spiral rooms)
+X:7:5:13:32
+D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+D:%..............................%
+D:%....#######################...%
+D:%..###^+,,,,,,#^^^^^^^^^^+*###.%
+D:%..#,#^#,,,,,,#+############,#.%
+D:%..#^#^#,,,,,,#,,,+,,,,,,#^#^#.%
+D:%..+^+^#,,,,,,#,,,#,,,,,,#^+^+.%
+D:%..#^#^#,,,,,,+,,,#,,,,,,#^#^#.%
+D:%..#,############+#,,,,,,#^#,#.%
+D:%..###*+^^^^^^^^^^#,,,,,,+^###.%
+D:%....#######################...%
+D:%..............................%
+D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+N:49:Greater vault (nethack building)
+X:8:30:17:54
+D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+D:%....................................................%
+D:%........XXXXXXXXXXXXX.................XXXXXXXXXXXXX.%
+D:%........X***********X.................X***********X.%
+D:%.XXXXXXXX***********XXXXXXXXXXXXXXXXXXX***********X.%
+D:%.+^^^^^^X,,,,,,,,,,,X**X**X**X**X**X**X*,,,,,,,,,*X.%
+D:%.X^,,,,^X^,,,,,,,,,,X,@X,@X,@X,@X,@X,@X,,,,,,,,,,,X.%
+D:%.X^^^^^^+^^^^^^^^^^^XX+XX+XX+XX+XX+XX+X,,,,,,,,,,,X.%
+D:%.XXXXXXXX^^^^^^^^^^^+^^^^^^^^^^^^^^^^^+,,,,,89,,,,X.%
+D:%.X^^^^^^+^^^^^^^^^^^XX+XX+XX+XX+XX+XX+X,,,,,98,,,,X.%
+D:%.X^,,,,^X^,,,,,,,,,,X,@X,@X,@X,@X,@X,@X,,,,,,,,,,,X.%
+D:%.+^^^^^^X,,,,,,,,,,,X**X**X**X**X**X**X*,,,,,,,,,*X.%
+D:%.XXXXXXXX***********XXXXXXXXXXXXXXXXXXX***********X.%
+D:%........X***********X.................X***********X.%
+D:%........XXXXXXXXXXXXX.................XXXXXXXXXXXXX.%
+D:%....................................................%
+D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+N:50:Lesser vault (nethack, head)
+X:7:7:17:29
+D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+D:%........###########........%
+D:%...#####################...%
+D:%...######,,,,,,,,,######...%
+D:%..#+^^^^#,,,,,,,,,#^^^^+#..%
+D:%..##^^^^#,,,,,,,,,+^,,^##..%
+D:%.#####+##,,,,,,,,,#^^^^###.%
+D:%.##^^^^^^,,,,,,,,,########.%
+D:%.####+###++#########*@+*##.%
+D:%.##^^^^^#^^#,,,#^@^####*##.%
+D:%.##^^,,^#^^#,###^#^#****##.%
+D:%..##^,,^#^^#,,,.^#^#@####..%
+D:%..#+^^^^#^^#####^#^^^^^##..%
+D:%...######^^^^^^^^#######...%
+D:%...#####################...%
+D:%........###########........%
+D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+N:51:Lesser vault (maze of rooms)
+X:7:10:16:32
+D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+D:%..............................%
+D:%.#+##########################.%
+D:%.#^#,,,+^#*#^+,,+*#^+^#*#**@#.%
+D:%.#^+,,,#^+^+^######^#^#*###+#.%
+D:%.#########+###,,,,#^#,+@#,,,#.%
+D:%.#,,,,,,+^^+,,,,,,+^#######+#.%
+D:%.###+#######,,,,,#####,,+^^^#.%
+D:%.#,,,+**#**+,,,,,#^^^+,,#^,^#.%
+D:%.#############+###^,^#+##^^^#.%
+D:%.#***#^+,,#,,,,,,+^^^#^######.%
+D:%.#+###^#,,+,,,,,,#####^+,^^^#.%
+D:%.#,,,+^#,,########,,,+^#,^^^#.%
+D:%.##########################+#.%
+D:%..............................%
+D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+N:52:Lesser vault (tetris tiles)
+X:7:5:20:13
+D:%%%%%%%%%%%%%
+D:%..#######..%
+D:%..#**#**#..%
+D:%..#,###,#..%
+D:%..#,#^#,#..%
+D:%.##+#^#+##.%
+D:%.#&,#^#,&#.%
+D:%.#,,+^+,,#.%
+D:%.####+####.%
+D:%.###,^,###.%
+D:%.#*##^##*#.%
+D:%.#,,#+#,,#.%
+D:%.##,#^#,##.%
+D:%.##+#^#+##.%
+D:%.#,,#^#,,#.%
+D:%.##,+^+,##.%
+D:%..#,#+#,#..%
+D:%..###.###..%
+D:%...........%
+D:%%%%%%%%%%%%%
+
+N:53:Lesser vault (hospital ward)
+X:7:5:14:20
+D:%%%%%%%%%%%%%%%%%%%%
+D:%..................%
+D:%.################.%
+D:%.#,,#,,#,,#,,#,,#.%
+D:%.#,,#,,#,,#,,#,,#.%
+D:%.##+##+##+##+##+#.%
+D:%.+..............+.%
+D:%.+..............+.%
+D:%.#+##+##+##+##+##.%
+D:%.#,,#,,#,,#,,#,,#.%
+D:%.#,,#,,#,,#,,#,,#.%
+D:%.################.%
+D:%..................%
+D:%%%%%%%%%%%%%%%%%%%%
+
+N:54:Lesser vault (lesser crypt)
+X:7:5:13:26
+D:%%%%%%%%%%%%%%%%%%%%%%%%%%
+D:%................###.....%
+D:%................#,#.....%
+D:%......#######.###+###...%
+D:%..###.#,#,#,#.#^^^^^#...%
+D:%.##&###+#+#+###^###^###.%
+D:%.+^^^+^^^^^^^+^^#9#^+,#.%
+D:%.##&###+#+#+###^###^###.%
+D:%..###.#,#,#,#.#^^^^^#...%
+D:%......#######.###+###...%
+D:%................#,#.....%
+D:%................###.....%
+D:%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+N:55:Lesser vault (arena)
+X:7:5:15:17
+D:%%%%%%%%%%%%%%%%%
+D:%...............%
+D:%.+###########+.%
+D:%.#...........#.%
+D:%.#.####^####.#.%
+D:%.#.#,,,,,,,#.#.%
+D:%.#.#,,,,,,,#.#.%
+D:%.#.^,,,,,,,^.#.%
+D:%.#.#,,,,,,,#.#.%
+D:%.#.#,,,,,,,#.#.%
+D:%.#.####^####.#.%
+D:%.#...........#.%
+D:%.+###########+.%
+D:%...............%
+D:%%%%%%%%%%%%%%%%%
+
+N:56:Lesser vault (monster wc)
+X:7:5:12:12
+D:%%%%%%%%%%%%
+D:%..#######.%
+D:%..#.&&&&#.%
+D:%..#^#####.%
+D:%.##...+,#.%
+D:%.#*...###.%
+D:%.#*...+,#.%
+D:%.#*...###.%
+D:%.##...+,#.%
+D:%..#+#####.%
+D:%..........%
+D:%%%%%%%%%%%%
+
+N:57:Lesser vault ('not' 'and')
+X:7:5:11:15
+D:%%%%%%%%%%%%%%%
+D:%.............%
+D:%..#########..%
+D:%.#+,,,#,,,+#.%
+D:%.#,#,#+#,#,#.%
+D:%.#,,#+*+#,,#.%
+D:%.#,#,#+#,#,#.%
+D:%.#+,,,#,,,+#.%
+D:%..#########..%
+D:%.............%
+D:%%%%%%%%%%%%%%%
+
+N:58:Lesser vault (brain's lair)
+X:7:5:18:17
+D:%%%%%%%%%%%%%%%%%
+D:%...............%
+D:%.#############.%
+D:%.#...........#.%
+D:%.#.####^####.#.%
+D:% #.#...&...#.#.%
+D:%.#.#.#####.#.#.%
+D:%.#.#.#,,,#.#.#.%
+D:%.#.#.#,,,#.#.#.%
+D:%.#.#.#,,,#.#.#.%
+D:%.#.#.##+##.#.#.%
+D:%.^.#..#^#..#.^.%
+D:%.####.#^#.####.%
+D:%.#,,#.#+#.#,,#.%
+D:%.#,,+..&..+,,#.%
+D:%.#############.%
+D:%...............%
+D:%%%%%%%%%%%%%%%%%
+
+N:59:Lesser vault (yin-yang)
+X:7:5:17:16
+D:%%%%%%%%%%%%%%%%
+D:%..............%
+D:%.#+##########.%
+D:%.#&#^^^^^^^^#.%
+D:%.#.#^######^#.%
+D:%.#&#^#****#^#.%
+D:%.#.#^#*,**#^#.%
+D:%.#&#^#****#^#.%
+D:%.#.#+####+#^#.%
+D:%.#&#,,,,#.#^#.%
+D:%.#.#,,*,#&#^#.%
+D:%.#&#,,,,#.#^#.%
+D:%.#.######&#^#.%
+D:%.#&.&.&.&.#^#.%
+D:%.##########+#.%
+D:%..............%
+D:%%%%%%%%%%%%%%%%
+
+N:60:Greater vault (der el bahri)
+X:8:35:28:45
+D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+D:%.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.%
+D:%.X***X,,X^^^^^^^^X9988899X^^^^^^^^+******X.%
+D:%.X***X,,+^..,...^X9999999X^...,..^XXXX***X.%
+D:%.X***XXXX^......^XXXX+XXXX^......^X**XXXXX.%
+D:%.X^^^X,,X^..,...^^^^^^^^^^^...,..^X******X.%
+D:%.X@@@X,,X^.......................^X,,,,,,X.%
+D:%.X^^^X,,X^..,..,..,..,..,..,..,..^X,,,,,,X.%
+D:%.X^^^X++X^.......................^X,,,,,,X.%
+D:%.X^^^X^^X^..,..,..,..,..,..,..,..^X,,,,,,X.%
+D:%.X^^^^^^+^.......................^X,,,,,,X.%
+D:%.X^^^^^^X^..,..,..,..,..,..,..,..^X,,,,,,X.%
+D:%.XXX+XXXX^.......................^X,,,,,,X.%
+D:%.X***X**X^..,..,..,..,..,..,..,..^X,,,,,,X.%
+D:%.XXXXX**X^.......................^X,,,,,,X.%
+D:%.X,,,,,,+^.......................^+,,,,,,X.%
+D:%.X,,,,,,+^^^^^^^^^^^^^^^^^^^^^^^^^+,,,,,,X.%
+D:%.XXXXXXXXXXXXXXXXXXX+++XXXXXXXXXXXXXXXXXXX.%
+D:%.X.............^^^^^^^^^^^^..............X.%
+D:%.X................^^^^^^^................X.%
+D:%.XXXXXXXXXXXXXXXXXXX^^^XXXXXXXXXXXXXXXXXXX.%
+D:%.X.................X.^.X.................X.%
+D:%.X.X.X.X.X.X.X.X.X.X^^^X.X.X.X.X.X.X.X.X.X.%
+D:%.X.................X.^.X.................X.%
+D:%.X.X.X.X.X.X.X.X.X.X^^^X.X.X.X.X.X.X.X.X.X.%
+D:%.X.................X.^.X.................X.%
+D:%...........................................%
+D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+N:61:Lesser vault (der el bahri sanctuary)
+X:7:5:12:22
+D:%%%%%%%%%%%%%%%%%%%%%%
+D:%....................%
+D:%..........###.......%
+D:%..........#,#.......%
+D:%..###.###.#,#.......%
+D:%.##,###,###,#######.%
+D:%.+^^^^^^^+^^^+,,,,#.%
+D:%.+^^^^^^^+^^^+,,,,#.%
+D:%.######+###########.%
+D:%......###...........%
+D:%....................%
+D:%%%%%%%%%%%%%%%%%%%%%%
+
+N:62:Greater vault (hypostyle of ramses III)
+X:8:40:38:34
+D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+D:%.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.%
+D:%.X888888+*******X*******+88888X.%
+D:%.XXXXXXXXX+XXXXXXXXXXX+XXXXXXXX.%
+D:%.X99+***+^^^+^^^^^^^+^^^+**+99X.%
+D:%.XXXXXXXXXXXXXX+++XXXXXXXXXXXXX.%
+D:%.X**X,,X,,+^X^^^^^^^X^X,,,+***X.%
+D:%.X**X,,X,,X^X^X...X^X^X,,,XXXXX.%
+D:%.X+XX,,X,,X^X^..@..^X^X,,,X***X.%
+D:%.X,,X,,XXXX^X^X...X^X^X^^^X***X.%
+D:%.X,,X,,X,*X^X^^^^^^^X^XX+XXXX+X.%
+D:%.X+XXX+X+XX^XXX+++XXX^X^^X,,,,X.%
+D:%.X^^^^^X^^+^^^^^^^^^^^+^^X,**,X.%
+D:%.X+XXXXXXXX^X.X...X.X^XXXX,**,X.%
+D:%.X^^^^^X,,X^.........^X**X,**,X.%
+D:%.X^X,X^X,,X^X.X.@.X.X^X++X,,,,X.%
+D:%.X^^^^^X,,X^.........^+^^X^^^^X.%
+D:%.XXX+XXX++X^XXX...XXX^XXXX+XXXX.%
+D:%.X^^^^^^^^+^....&....^+****+^^X.%
+D:%.XXXXXXXXXX^X.X...X.X^XXXXXXX^X.%
+D:%.X^^^^^+^^X^.........^X^^^^^^^X.%
+D:%.X^#X#^X^^X^X.X.&.X.X^X^,*XXXXX.%
+D:%.X^X9X^X^^X^.........^X^,*X***X.%
+D:%.X^#X#^X^^X^X.X...X.X^X^,*XXX+X.%
+D:%.X^^^^^X^^X^^^^^^^^^^^X^^^X,,,X.%
+D:%.XXXXXXX++XXXXX+++XXXXXX+XX,,,X.%
+D:%.X*****+^^^^^^^^^^^^^^^^^+,,,,X.%
+D:%.XXXXXXX^.X.X.X...X.X.X.^XXXXXX.%
+D:%.X,,X,,X^...............^+,,,,X.%
+D:%.X,,X,,X^.X.X.X...X.X.X.^XXXXXX.%
+D:%.X++X++X^.....&.&.&.....^+,,,,X.%
+D:%.X^^^^^+^.X.X.X...X.X.X.^XXXXXX.%
+D:%.X++X++X^...............^+,,,,X.%
+D:%.X,,X,,X^.X.X.X...X.X.X.^XXXXXX.%
+D:%.X,,X,,X^^^^^^^^^^^^^^^^^+,,,,X.%
+D:%.XXXXXXXXXXXXXX+++XXXXXXXXXXXXX.%
+D:%................................%
+D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+N:63:Lesser vault (amada temple)
+X:7:10:15:30
+D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+D:%............................%
+D:%.######################.....%
+D:%.#**#,,,,+^^#.....&...#.....%
+D:%.#**#,,,,#^^#...&.....#.....%
+D:%.#+#######^^#..#.#.#.##.....%
+D:%.#,,,,,,,#^^#^^^^^^^^^#####.%
+D:%.#,,,,,,,+^^+^^^^^^^^^+^^^+.%
+D:%.#,,,,,,,#^^#^^^^^^^^^#####.%
+D:%.#+#######^^#..#.#.#.##.....%
+D:%.#**#,,,,#^^#...&..&..#.....%
+D:%.#**#,,,,+^^#.........#.....%
+D:%.######################.....%
+D:%............................%
+D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+N:64:Lesser vault (amenhotep I)
+X:7:10:18:34
+D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+D:%................................%
+D:%...............######...........%
+D:%...............#.&&.#...........%
+D:%.###############.##.#...........%
+D:%.#**#,,,+^^^^^^^^##.###.........%
+D:%.#**#,,,#^^^^^^^^^^...#########.%
+D:%.##+#####^^#######^&#.#.......#.%
+D:%.#,,,,,,+^^+,*,*,+^^^^^^^^^^^^+.%
+D:%.#,,,,,,+^^+*,*,*+^^^^^^^^^^^^+.%
+D:%.##+#####^^#######^&#.#.......#.%
+D:%.#**#,,,#^^^^^^^^^^...#########.%
+D:%.#**#,,,+^^^^^^^^##.###.........%
+D:%.###############.##.#...........%
+D:%...............#.&&.#...........%
+D:%...............######...........%
+D:%................................%
+D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+N:65:Lesser vault (hathor chapel)
+X:7:10:21:19
+D:%%%%%%%%%%%%%%%%%%%
+D:%.................%
+D:%......##+###.....%
+D:%.######^^^######.%
+D:%.#,,#^#...#^#,,#.%
+D:%.#,,+^..*..^+,,#.%
+D:%.#,,#^#...#^#,,#.%
+D:%.####^.....^####.%
+D:%....#^^^^^^^#....%
+D:%....#.##+##.#....%
+D:%....#&#^^^#&#....%
+D:%....###,^,###....%
+D:%....#,,,,,,,#....%
+D:%....####+####....%
+D:%....#,,,,,,,#....%
+D:%....####+####....%
+D:%....#,,,,,,,#....%
+D:%....####+####....%
+D:%.....#*****#.....%
+D:%.....#######.....%
+D:%%%%%%%%%%%%%%%%%%%
+
+
+N:66:Lesser vault (osiris halls)
+X:7:10:17:34
+D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+D:%................................%
+D:%.###########################....%
+D:%.#*,+^^^^^#^^^^^^^^^^^^+,,*#....%
+D:%.####^#.#^#^#.#.#.#.#.^#####....%
+D:%.#*,+^.&.^+^..&...&...^+,,*#....%
+D:%.####^#.#^#^#.#.#.#.#.^#####....%
+D:%.#*,+^^^^^#^^^^^^^^^^^^+,,*#....%
+D:%.####################++########.%
+D:%.#,,#,,#,,#,,#,,#,,#....#,,#,,#.%
+D:%.#,,#,,#,,#,,#,,#,,#....#,,#,,#.%
+D:%.#,,#,,#,,#,,#,,#,,#.&..#,,#,,#.%
+D:%.#++#++#++#++#++#++#....#++#++#.%
+D:%.#^^^^^^^^^^^^^^^^^^^^^^^^^^^^+.%
+D:%.##############################.%
+D:%................................%
+D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+N:67:Lesser vault (temple of sety)
+X:7:10:22:25
+D:%%%%%%%%%%%%%%%%%%%%%%%%%
+D:%.##########+##########.%
+D:%.#,,,,,,,#^^^#,,,,,,,#.%
+D:%.#,,,,,,,+^^^+,,,,,,,#.%
+D:%.#########^^^#########.%
+D:%.#,,,,,,,#^^^#,,,,,,,#.%
+D:%.#,,,,,,,+^^^+,,,,,,,#.%
+D:%.#########+###########.%
+D:%.#^^^+^^^+^^^^^#,.,.,#.%
+D:%.#.#^#^#.#^#.#.#.#.#.#.%
+D:%.#.&^#^.&#^.&..#,.,.,#.%
+D:%.#.#^+^#.#^#.#.#.#.#.#.%
+D:%.#^^^#^^^#^^^^^#,.,.,#.%
+D:%.#+#+###+###+###.#.#.#.%
+D:%.#,#^^^^^^^^^^^#,.,.,#.%
+D:%.#,#.#.#.#.#.#.#+###^#.%
+D:%.#,#...........#,**#^#.%
+D:%.#*#.#.#.#.#.#.#####+#.%
+D:%.#*#^^^^^^^^^^^+&^^^&#.%
+D:%.#######+#############.%
+D:%.......................%
+D:%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+N:68:Lesser vault (temple at abydos)
+X:7:10:21:23
+D:%%%%%%%%%%%%%%%%%%%%%%%
+D:%^^^^^^^^^^^^^^^^^^^^^%
+D:%^#+#+#####+#####+#+#^%
+D:%^#,#,#^^^^^^^^^#,#,#^%
+D:%^#,#,#^#.#.#.#^#,#,#^%
+D:%^#,#,#^...&...^#,#,#^%
+D:%^#####^#.#.#.#^#####^%
+D:%^#*,,+^^^^^^^^^+,,*#^%
+D:%^#########+#########^%
+D:%^#*,,+^^^^^^^^^+,,*#^%
+D:%^#####^#.#.#.#^#####^%
+D:%^#*,,+^...&...^+,,*#^%
+D:%^#####^#.#.#.#^#####^%
+D:%^#*,,+^^^^^^^^^+,,*#^%
+D:%^##+###+##+##+###+##^%
+D:%^#,,,,#,#^^^#,#,,,,#^%
+D:%^#,##,#,#,#,#,#,##,#^%
+D:%^#,,,,#,#***#,#,,,,#^%
+D:%^###################^%
+D:%^^^^^^^^^^^^^^^^^^^^^%
+D:%%%%%%%%%%%%%%%%%%%%%%%
+
+
+N:69:Greater vault (Spiral castle)
+X:8:35:31:25
+D:%%%%%%%%%%%%%%%%%%%%%%%%%
+D:%.......................%
+D:%.XXXXX...........XXXXX.%
+D:%.X,,,X...........X,,,X.%
+D:%.X,,,X...........X,,,X.%
+D:%.XXX+XXXXXXXXXXXXX+XXX.%
+D:%...X^^^^^^^^^^^^^^^X...%
+D:%...X^XXXXXXXXXXXXX^X...%
+D:%...X^X^^^^^^^^^^^+^X...%
+D:%...X^X^XXXXXXXXXXX^X...%
+D:%...X^X^X&..&....&X^X...%
+D:%...X^X^X.XXXXXXX.X^X...%
+D:%...X^X^X.X^^^^^X.X^X...%
+D:%...X^X^X&X+XXX^X.X^X...%
+D:%...X^X^X.X*9*X^X&X^X...%
+D:%...+^X^X,X989X^X.X^+...%
+D:%...X^X^X.X*9*X^X.X^X...%
+D:%...X^X^X.XXX+X^X,X^X...%
+D:%...X^X^X..&..X^X.X^X...%
+D:%...X^X.XXXXXXX^X.X^X...%
+D:%...X^X^^^^^^^^^X&X^X...%
+D:%...X^XXXXXXXXXXX.X^X...%
+D:%...X^+...&..&...,X^X...%
+D:%...X^XXXXXXXXXXXXX^X...%
+D:%...X^^^^^^^^^^^^^^^X...%
+D:%.XXX+XXXXXXXXXXXXX+XXX.%
+D:%.X,,,X...........X,,,X.%
+D:%.X,,,X...........X,,,X.%
+D:%.XXXXX...........XXXXX.%
+D:%.......................%
+D:%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+N:70:Lesser vault (temple of dendereh)
+X:7:10:20:22
+D:%%%%%%%%%%%%%%%%%%%%%%
+D:%....................%
+D:%.##################.%
+D:%.#***+^&#**#&^+***#.%
+D:%.#***#^^#,,#^^#***#.%
+D:%.#####++#++#++#####.%
+D:%.#,,,+^^^^^^^^+,,,#.%
+D:%.#####^######^#####.%
+D:%.#,,,+^#,,,,#^+,,,#.%
+D:%.#####^#,**,#^#####.%
+D:%.#,,,+^#,**,#^#***#.%
+D:%.#####^#,**,#^#^^^#.%
+D:%.#,,,+^#,**,#^##+##.%
+D:%.#####^#,,,,#^#,,,#.%
+D:%.#,,,#^##++##^#&,&#.%
+D:%.#,,,+^^^^^^^^##+##.%
+D:%.#,,,#^^^^^^^^^^^^#.%
+D:%.########++########.%
+D:%....................%
+D:%%%%%%%%%%%%%%%%%%%%%%
+
+
+N:71:Greater vault (Karnak, part I)
+X:8:35:24:44
+D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+D:%.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.%
+D:%.X*****+^+^^^^+^^^X,,,X***X***X***X,****X.%
+D:%.XXXXXXXXX^XX^X,,,X,X,X,X,X,X,X*X*X,X*X*X.%
+D:%.X,X,X,X,X^..^X,,,X,,,X^^^X^^^X**@+^,,,,X.%
+D:%.X^^^^^^^+^@.^X,,,XX+XX+XXXXX+XXXXX+XXXXX.%
+D:%.X,X^^^X,X^XX^X***X^^^+^^^^^^^+,,*X^^^^^X.%
+D:%.XXXX+XXXX^^^^X,,,XXXXX^X.X.X^XXXXX^X^X^X.%
+D:%.X^^^^^^^XXXXXX,,,X,,,X^..@..^+,,*X^^^^&X.%
+D:%.X^X,X,X^X,,,,X,,,X,X,X^X.X.X^XXXXX^XXXXX.%
+D:%.X^^^^^^^X,,,,X^^^X,,,X^^^^^^^+,,*X^+,,*X.%
+D:%.XXXX+XXXXX++XXX+XXX+XXXXX+XXXXXXXX^XXXXX.%
+D:%.X*,+^^^^^^^^^^^^^^^^^^^^^^^^^+,,*X^+,,*X.%
+D:%.XXXX^X.X.X.X.X.X.X.X.X.X.X.X^XXXXX^XXXXX.%
+D:%.X*,+^.........&.....&.......^X,,*X^+,,*X.%
+D:%.XXXX^X.X.X.X.X.X.X.X.X.X.X.X^+,X*X^XXXXX.%
+D:%.X**X^.......................^X,,*X^+,,*X.%
+D:%.X,,+^X.X.X.X.X.X.X.X.X.X.X.X^XXXXX^XXXXX.%
+D:%.XXXX^.........&.....&.......^+^^^^^+,,*X.%
+D:%.X,,+^X.X.X.X.X.X.X.X.X.X.X.X^X,X,X^XXXXX.%
+D:%.X**X^^^^^^^^^^^^^^^^^^^^^^^^^X.*.X^+,,*X.%
+D:%.XXXXXXXXXXXXXXXX+XXXXXXXXXXXXXXXXXXXXXXX.%
+D:%..........................................%
+D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+N:72:Lesser vault (Karnak, part II)
+X:7:10:20:29
+D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+D:%...........................%
+D:%.###+######################%
+D:%.#,+^#,,#,,#^+^+^#*#,#^+,#.%
+D:%.###.#,,#,,#^#^#^#*#,#^###.%
+D:%.#,+^#,,#,,#^#^#^#*#+#^+,#.%
+D:%.###.#++#++#^#^#^#+#.#^###.%
+D:%.#,+^#^^^^^+^#^#^+,,,#^+,#.%
+D:%.###.#^^^^^+^#^#+#+###^###.%
+D:%.#,+^#+#+#+#^#^#,#^+,#^+,#.%
+D:%.###.#,#,#,#^#^#######^###.%
+D:%.#,+^#######+#,,+,,,,,^+,#.%
+D:%.###^^^^^^#,^#,,+,,,,#^###.%
+D:%.#,+^#,#*^##+####,,,,,^+,#.%
+D:%.###^,,,*^#^^^^^#,,,,#^###.%
+D:%.#,+^#,#*^#,,,,^+,,,,,^+,#.%
+D:%.###^^^^^^#^^^^^#,,,,,^###.%
+D:%...##########+##########...%
+D:%...........................%
+D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+N:73:Greater vault (mortuary temple of sety)
+X:8:35:25:34
+D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+D:%................................%
+D:%.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.%
+D:%.X^+,,***X,,+^^^^^+,,X*X,,X*X9X.%
+D:%.X^XXXXXXX,,X^X*X^X,,X,X,,X*X9X.%
+D:%.X^+,,***XXXX^*@*^X,,X^X,,X@X9X.%
+D:%.X^XXXXXXX,,X^X*X^XXXX^X,,X^X9X.%
+D:%.X^+,,***X,,+^^^^^+..X^X,,X^X^X.%
+D:%.X^XXXXXXXXXXXX+XXXXXX+X++X+X+X.%
+D:%.X^X*X*X*X**X,+.+,X**X^^^^+^^^X.%
+D:%.X+X,X,X,X,,XXX.XXX,,X^^^^+^^^X.%
+D:%.X^X^X^X^X,,X,X.X,X,,X^^XXXXXXX.%
+D:%.X^X+X+X+X^^X,X.X,X^^X^^X,,,,,X.%
+D:%.X^+^^^^^X++X+X+X+X++X^^X,X,X,X.%
+D:%.X^XXXXXXX^^^^^^^^^^^X^^X,,,,,X.%
+D:%.X^X*X*X*XXXX^...^XXXX^^X,X,X,X.%
+D:%.X^X,X,X,X,,+^X*X^+,,X^^X,,,,,X.%
+D:%.X^X^X^X^XXXX^.&.^XXXX^^X,X,X,X.%
+D:%.X^X+X+X+X,,+^X*X^+,,X^^X,,,,,X.%
+D:%.X^X^^^^^XXXX^...^XXXX^^X,X,X,X.%
+D:%.X^X*X,X*X,,X^X*X^X,,X^^X,,,,,X.%
+D:%.X^+^^^^^+^^+^^^^^+^^+^^X,,,,,X.%
+D:%.XXXXXXXXXXXXXX+XXXXXXXXXXX+XXX.%
+D:%................................%
+D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+N:74:Lesser vault (edfu)
+X:7:5:15:15
+D:%%%%%%%%%%%%%%%
+D:%.............%
+D:%.###########.%
+D:%.#,+^#,#^+,#.%
+D:%.###+#+#+###.%
+D:%.#,+^...^+,#.%
+D:%.###.###.###.%
+D:%.#,+.#*#.+,#.%
+D:%.###.#,#.###.%
+D:%.#,+.#^#.#,#.%
+D:%.###^...^#+#.%
+D:%.#,+,#+#,+,#.%
+D:%.#####^#####.%
+D:%.............%
+D:%%%%%%%%%%%%%%%
+
+N:75:Greater vault (kom ombo)
+X:8:40:36:30
+D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+D:%.XXXXXXXXXXXXXXXXXXXXXXXXXX.%
+D:%.X****X,99,X9889X,99,X****X.%
+D:%.X****X,,,,X9999X,,,,X****X.%
+D:%.X+XXXX+XXXX+XXXX+XXXX+XXXX.%
+D:%.X@^^^^^^^^^^^^^^^^^^^^^^@X.%
+D:%.X^XXXXXXXXXXXXXXXXXXXXXX^X.%
+D:%.X^X**X,,X,,X,,X,,X,,X**X^X.%
+D:%.X^X,,X+XX+XX+XXX+XX+X,,X^X.%
+D:%.X^X,^+^^^^^^^^^^^^^^+^,X^X.%
+D:%.X^XXXX^XX+XX^^XX+XX^XXXX^X.%
+D:%.X^X,,X^X,,,X^^X,,,X^+^,X^X.%
+D:%.X^X,,X^X***X^^X***X^X,*X^X.%
+D:%.X^X,,X^X9X9X^^X9X9X^XXXX^X.%
+D:%.X^X,,X^X***X^^X***X^+^,X^X.%
+D:%.X^X++X^X,,,X^^X,,,X^X,*X^X.%
+D:%.X^X^^X^XX+XX^^XX+XX^XXXX^X.%
+D:%.X^X^^+^^^^^^^^^^^^^^X,*X^X.%
+D:%.X^X,,X^^^^^^^^^^^^^^+^,X^X.%
+D:%.X^XXXXXXX+XXXXXX+XXXXXXX^X.%
+D:%.X^X,X,X,,,,,XX,,,,,X***X^X.%
+D:%.X^X,X^X,***,++,***,+*@*X^X.%
+D:%.X^X,+^+,,,,,XX,,,,,X***X^X.%
+D:%.X^XXX+XXX+XXXXXX+XXXX+XX^X.%
+D:%.X^X*,^X,,,,,XX,,,,,+^^*X^X.%
+D:%.X^X,,^+,,*,,++,,*,,XX+XX^X.%
+D:%.X^X*,*X,,,,,XX,,,,,X,,,X^X.%
+D:%.X^XXXXXXX+XXXXXX+XXXXXXX^X.%
+D:%.X^X^^^^^^^^^^^^^^^^^^^^X^X.%
+D:%.X^X^^XX,XX^^XX^^XX,XX^^X^X.%
+D:%.X^X^^^^^^^^^^^^^^^^^^^^X^X.%
+D:%.X^+^^XX,XX^^XX^^XX,XX^^+^X.%
+D:%.X,X^^^^^^^^^^^^^^^^^^^^X,X.%
+D:%.XXXXXXXXX+XXXXXX+XXXXXXXXX.%
+D:%............................%
+D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+N:76:Lesser vault (belvoir keep)
+X:7:5:19:21
+D:%%%%%%%%%%%%%%%%%%%%%
+D:%...................%
+D:%.###...........###.%
+D:%.#,######+######,#.%
+D:%.##+^^^^+&+^^^^+##.%
+D:%..#&^####+####^.#..%
+D:%..#.^#,^+^+,,#^.#..%
+D:%..#.^#,^#^#,,#^.#..%
+D:%..#.^#,*#^##+#^.#..%
+D:%..#.^#,^#^#,,#^&#..%
+D:%..#.^#,^+^#*,#^.#..%
+D:%..#.^####+####^.#..%
+D:%.##+^^^^^^^^^^^+##.%
+D:%.#,######+######,#.%
+D:%.###...#,*,#...###.%
+D:%.......#*,*#.......%
+D:%.......#####.......%
+D:%...................%
+D:%%%%%%%%%%%%%%%%%%%%%
+
+#N:77:Lesser vault (Pattern)
+#X:8:30:31:47
+#D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+#D:%XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.%
+#D:%X@&+.............................+&@X,,,,,,X.%
+#D:%XXXX.p...bad.bad.bad.bad.cbb.....XXXX,,,,,,X.%
+#D:%X@&X.a.dcb.dcb.dcb.dcb.dcc.baa...X&@X,,,,,,X.%
+#D:%XX+X.b.d.....................ad..X+XX,,,,,,X.%
+#D:%X....c.a.dabcdabcda...........dc....X,,,,,,X.%
+#D:%X....d.b.d........a..cbadcba...c....X,,,,,,X.%
+#D:%X...ad.c.c.dcbadcba..c.....ad..cb...X++XXX+X.%
+#D:%X...a..d.b.d.........cdabc..d...b...X^^X^^^X.%
+#D:%X...b.ad.a.a..abcd.......cd.dcb.a...X**X^X+X.%
+#D:%X..cb.a..d.b..a..d..adcb..d...b.ad..X,,X^X^X.%
+#D:%X..c..b..c.c..d.ad..a..ba.a...a..d..X&&X^X&X.%
+#D:%X.dc.cb..b.d..c.a..PPP..a.a.cda..dc.X^^X^X+X.%
+#D:%X.d..c...a.a..b.b.PPAPP.d.b.c.....c.+^^X^X*X.%
+#D:%X.da.cd..d.b..a.c.PABAP.c.b.cba..bc.X^^X^X*X.%
+#D:%X..a..d..c.c..d.d.PPAPP.b.c...a..b..X&&X^XXX.%
+#D:%X..ab.da.b.d..c.a..PPP..a.c...d.ab..X,,X^X,X.%
+#D:%X...b..a.a.a..b.ab.....da.d..cd.a...XXXX+X+X.%
+#D:%X...c..b.d.b..a..bcd.bcd..a.bc..d...X**^^^,X.%
+#D:%X...cd.bcd.c..ad...dab...ba.b..cd...X,,,,,,X.%
+#D:%X....d.....d...dc......dcb..a..c....X,,,XXXX.%
+#D:%X....da....da...cbadcbad...da.bc....X,,,+,,X.%
+#D:%X.....a.....abc...........cd..b.....X,,,X,,X.%
+#D:%XX+X..ab......cdabcdabcdabc..ab..X+XXXXXX,,X.%
+#D:%X@&X...bc...................da...X&@X,,,,,,X.%
+#D:%XXXX....cddaabbccddaabbcdabcd....XXXX,,,,,&+.%
+#D:%X@&+.............................+&@X****&&+.%
+#D:%XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX++X.%
+#D:%.............................................%
+#D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+#
+#
+#N:78:Greater vault (Pattern 2)
+#X:8:30:29:45
+#D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+#D:%XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX%
+#D:%X8+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^+8X%
+#D:%X+XXXXXXXXXXXXXXXXXXX+XXXXXXXXXXXXXXXXXXX+X%
+#D:%X^X.....................................X^X%
+#D:%X^X.................p...................X^X%
+#D:%X^X.........adcbadcba.dcbadcbad.........X^X%
+#D:%X@X......dcba.........d.......dcba......X@X%
+#D:%X,X...baad.....abcdab.dabcda.....addc...X,X%
+#D:%X,X..cb.....bcda....b......abcd.....cb..X,X%
+#D:%X,X.dc....dab....adcb.adcb....dab....ba.X,X%
+#D:%X,X.d....cd....cba....a..bad....bc....a.X,X%
+#D:%X,X.a...bc...adc...PPPPP...dcb...cd...d.X,X%
+#D:%X,X.b...b....a....PPPAPPP....b....d...c.X,X%
+#D:%X,X.c...a....b....PPABAPP....a....a...c.X,X%
+#D:%X,X.d...d....c....PPPAPPP....d....b...b.X,X%
+#D:%X,X.a...dc...cda...PPPPP...bcd...cb...b.X,X%
+#D:%X,X.b....cb....abc.......dab....dc....a.X,X%
+#D:%X,X.bc....bad....cddaabbcd....bad....da.X,X%
+#D:%X,X..cd.....dcba...........adcb.....cd..X,X%
+#D:%X,X...dabc.....adcbadcbadcba.....dabc...X,X%
+#D:%X^X......cdab.................abcd......X^X%
+#D:%X^X.........bccddaabcdabcdabcda.........X^X%
+#D:%X^X.....................................X^X%
+#D:%X+XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX+X%
+#D:%X9+^^^@,,,,,&,,,,,,,,&,,,,,,,&,,,,,,@^^^+9X%
+#D:%XXXXXXXXXXXXXXXXXXXXX+XXXXXXXXXXXXXXXXXXXXX%
+#D:%...........................................%
+#D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+#
+#
+#
+#N:79:Greater vault (Pattern 2)
+#X:8:30:30:42
+#D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+#D:%.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX%
+#D:%.X9+^^^^^^^^^^^^^^^^^+,,,,,,,,,,,,,,,+8X%
+#D:%.X+XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX+X%
+#D:%.X,X.................................X^X%
+#D:%.X,X....adcbadcbadcbadcbadcbadc......X^X%
+#D:%.X,X...ba.....................cbad...X^X%
+#D:%.X,X..cb..bad.bad.bad.bad.bad....d...X^X%
+#D:%.X,X..c..cb.dcb.dcb.dcb.dcb.dcba.dc..X^X%
+#D:%.X&X..d.dc.....................a..c..X^X%
+#D:%.X&X..d.d..bbcc...cbadcba..adc.ad.b..X^X%
+#D:%.X+X..a.a.ab..cd.dc.....ad.a.c..d.a..X+X%
+#D:%.X^X..a.b.a....d.d..PPP..d.b.c.cd.d..X@X%
+#D:%&X^X..b.c.ad...a.a.PPAPP.c.c.b.c..dc.X9X%
+#D:%.+^X..b.d..dc..a.b.PABAP.b.d.b.cb..c.+8X%
+#D:%&X^X..c.a...cb.b.c.PPAPP.a.a.a..b..b.X9X%
+#D:%.X^X..d.b....b.c.d..PPP..d.b.d.ab..a.X@X%
+#D:%.X+X..a.c.cdab.d.da..d...dcb.d.a..da.X+X%
+#D:%.X&X..b.d.c....a..abcd.......c.ad.d..X^X%
+#D:%.X&X..c.a.cbad.ab......abc..bc..d.c..X^X%
+#D:%.X,X..d.b....d..bcdabcda.cdab..cd.b..X^X%
+#D:%.X,X..a.bcda.c................bc..a..X^X%
+#D:%.X,X..b....abc..dab.dab.dab.dab..da..X^X%
+#D:%.X,X..bcda.....cd.bcd.bcd.bcd...cd...X^X%
+#D:%.X,X.....abcdabc..............pbc....X^X%
+#D:%.X,X.................................X^X%
+#D:%.X+XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX+X%
+#D:%.X9+^^^^^^^^^^^^^^^^^+,,,,,,,,,,,,,,,+8X%
+#D:%.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX%
+#D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+# XXX
+
+# XXX
+
+N:82:Lesser vault (checkerboard)
+X:7:5:13:21
+D:%%%%%%%%%%%%%%%%%%%%%
+D:%XXXXXXXXXXXXXXXXXXX%
+D:%X&#9#&#9#&#9#&#9#&+%
+D:%X#XXXXXXXXXXXXXXXXX%
+D:%X9#&#9#&#9#&#9#&#9X%
+D:%XXXXXXXXXXXXXXXXX#X%
+D:%X&#9#&#88888#&#9#&X%
+D:%X#XXXXXXXXXXXXXXXXX%
+D:%X9#&#9#&#9#&#9#&#9X%
+D:%XXXXXXXXXXXXXXXXX#X%
+D:%+&#9#&#9#&#9#&#9#&X%
+D:%XXXXXXXXXXXXXXXXXXX%
+D:%%%%%%%%%%%%%%%%%%%%%
+
+
+N:83:Lesser vault (spiral checkers)
+X:7:5:14:17
+D:%%%%%%%%%%%%%%%%%
+D:%XXXXXXXXXXXXXXX%
+D:%X&#9#&#9#&#9#&X%
+D:%+XXXXXXXXXXXX#X%
+D:%XXX@#9#@#9#@X9X%
+D:%X9#XXXXXXXX#X#X%
+D:%X#XXX98X89#9X&X%
+D:%X&X9#98X89XXX#X%
+D:%X#X#XXXXXXXX#9X%
+D:%X9X@#9#@#9#@XXX%
+D:%X#XXXXXXXXXXXX+%
+D:%X&#9#&#9#&#9#&X%
+D:%XXXXXXXXXXXXXXX%
+D:%%%%%%%%%%%%%%%%%
+
+
+N:84:Greater vault (monstrosity)
+X:8:25:17:28
+D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+D:%XXXXXXXXXXXXXXXXXXXXXXXXXX%
+D:%X^@^@^@^@^@#X9X9X9X9X9X9XX%
+D:%X#XXXXXXXXXX9X9X9X9X9X9X9X%
+D:%XX9X9X9X9XXXXXXXXXXXXXXX#X%
+D:%X9X9X9X9X9X##############X%
+D:%XXXXXXXXX#X#XXXXXXXXXXXXXX%
+D:%X&,&X&,&X&X8888X&,&X&,&X&+%
+D:%X,X,X,X,X,XXXXXX,X,X,X,X,X%
+D:%+&X&,&X&,&X8888X&X&,&X&,&X%
+D:%XXXXXXXXXXXXXX#X#XXXXXXXXX%
+D:%X##############X9X9X9X9X9X%
+D:%X#XXXXXXXXXXXXXXX9X9X9X9XX%
+D:%X9X9X9X9X9X9X9XXXXXXXXXX#X%
+D:%XX9X9X9X9X9X9X#@^@^@^@^@^X%
+D:%XXXXXXXXXXXXXXXXXXXXXXXXXX%
+D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+N:85:Cyclone
+X:8:40:23:91
+D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+D:%XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX%
+D:%XXXX^^^^^^^^^XXX^^^^^^^^^XXX^^^#XXX8.X.&.X.&.X..*X+^.^.^.^.^.^..XX*^.^.^.^.^.^.^.^.^.^#8X%
+D:%XX***XXX...XXX...XXX...XXX...XXX^^X*.X^X^X^X^X^X.*XXXXXXXXXXXXX..XX^^XXXXXXXXXXXXXXXXXX#X%
+D:%X88XXX...XXX...XXX...XXX...XXX^^^,X*.X^X^X^X^X^X..*XX8@,,,,,,@XX,.XX^^..........@&.,**X.X%
+D:%XXXX@&@XXX@@@XXX&&&XXX&@&XXX^^^,..X*.X^X^X^X^X^X...@X@........@X,..X...........@&..,**X.X%
+D:%XX...XXX...XXX...XXX...XXX^^^,....X*.X^X^X^X^X^X...@X*..*9*..@XX^^XXXX*.......@&@..,**X.X%
+D:%X*.XXX...XXX...XXX...XXX^^^^....,,X*.&.X.&.X.&.X..*XX*.....,XXX.XXX@@XXX*....@&..@.,**X.X%
+D:%X*XX...XXX...XXX...XXX^^^,.^...XX+XXXXXXXXXXXXXX.*XX*....,,XXX.XXXXXX&&XXX*.@&....@8**X.X%
+D:%X^^^^XXX^^^^^^^^^XXX^^^,..*^.&XX.*X&^^*****^^#X.*XX*....,XXX&&XXX@@X#X*..XX@&.....8@**X.X%
+D:%XXXXXXXXXXXXXXXXXX^^^,...**^.&X8.*X@XXXXXXXXXX^.XX&....XXX&&XXX*****XXX*..XXXXXXXXXXXXX.X%
+D:%#^^^^^^^^^^^^^9#^^^.....*99^.@X8.*#^^^*****8XXXXX8@..XX#@@XX#@@@....8XXX*.+^.^.^.^.^.^+.X%
+D:%XXXXXXXXXXXXXXXXXX^^^,...**^.&X8.*X@XXXXXXXXXX^.XX&....XXX&&XXX*****XXX*..XXXXXXXXXXXXX.X%
+D:%X^^^^XXX^^^^^^^^^XXX^^^,..*^.&XX.*X&^^*****^^#X.*XX*....,XXX&&XXX@@X#X*..XX@&.....8@**X.X%
+D:%X*XX...XXX...XXX...XXX^^^,.^...XX+XXXXXXXXXXXXXX.*XX*....,,XXX.XXXXXX&&XXX*.@&....@8**X.X%
+D:%X*.XXX...XXX...XXX...XXX^^^^....,,X*.&.X.&.X.&.X..*XX*.....,XXX.XXX@@XXX*....@&..@.,**X.X%
+D:%XX...XXX...XXX...XXX...XXX^^^,....X*.X^X^X^X^X^X...@X*..*9*..@XX^^XXXX*.......@&@..,**X.X%
+D:%XXXX@&@XXX@@@XXX&&&XXX&@&XXX^^^,..X*.X^X^X^X^X^X...@X@........@X,..X...........@&..,**X.X%
+D:%X88XXX...XXX...XXX...XXX...XXX^^^,X*.X^X^X^X^X^X..*XX8@,,,,,,@XX,.XX^^..........@&.,**X.X%
+D:%XX***XXX...XXX...XXX...XXX...XXX^^X*.X^X^X^X^X^X.*XXXXXXXXXXXXX..XX^^XXXXXXXXXXXXXXXXXX#X%
+D:%XXXX^^^^^^^^^XXX^^^^^^^^^XXX^^^#XXX8.X.&.X.&.X..*X+^.^.^.^.^.^..XX*^.^.^.^.^.^.^.^.^.^#8X%
+D:%XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX%
+D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+N:86:Miniature Cell
+X:7:5:5:5
+D:%%%%%
+D:%#8#%
+D:%888%
+D:%#8#%
+D:%%%%%
+
+N:87:Castle Death
+X:8:35:20:60
+D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+D:%XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX%
+D:%X,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,+XX....+XX...X****X%
+D:%XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX....XXX....@X****X%
+D:%X.........................................XXX....&.@X****X%
+D:%X+XXXXX+XXXXX+XXXXX+XXXXX+XXXXX+XXXXX+XXXXX....@.&.@X*99*X%
+D:%X999X..9..X&&&&&X,,,,,X@@@@@X..&..X@@@XXX....&.@.&.@X*99*X%
+D:%X@@@X.&.&.X&&&&&X,,,,,X@@@@@X99.99X9XXX.X..@.&.@.&.@X****X%
+D:%XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX...X..@.&.@.&.@XX##XX%
+D:%+^...&.&.&+...@.@.@+...@@@@@+.....99+...+..@.&.@.&.8+^^^^X%
+D:%+^...&.&.&+...@.@.@+...@@@@@+.....99+...+..@.&.@.&.8+^^^^X%
+D:%XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX...X..@.&.@.&.@XX##XX%
+D:%X@@@X.&.&.X&&&&&X,,,,,X@@@@@X99.99X9XXX.X..@.&.@.&.@X****X%
+D:%X999X..9..X&&&&&X,,,,,X@@@@@X..&..X@@@XXX....&.@.&.@X*99*X%
+D:%X+XXXXX+XXXXX+XXXXX+XXXXX+XXXXX+XXXXX+XXXXX....@.&.@X*99*X%
+D:%X.........................................XXX....&.@X****X%
+D:%XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX....XXX....@X****X%
+D:%X,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,+XX....+XX...X****X%
+D:%XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX%
+D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+N:88:Mirrored Quartet
+X:8:20:21:49
+D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+D:%XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX%
+D:%X89@@@XXX,,,,XXX....^^^^^^^....XXX,,,,XXX@@@98X%
+D:%X9@@#XX....XXX**....XXX#XXX....**XXX....XX#@@9X%
+D:%X@XXX&&&&XXX**....@XX&&@&&XX@....**XXX&&&&XXX@X%
+D:%XXX....XXX**......@X**...**X@......**XXX....XXX%
+D:%X@...XXX**.......XXXXX...XXXXX.......**XXX...@X%
+D:%X@.#XX**.......9XX888XX^XX888XX9.......**XX#.@X%
+D:%XXXX&&&&&&&&&&&9#,,,,,X^X,,,,,#9&&&&&&&&&&&XXXX%
+D:%XXXXXXXXXXXXXXXXXXXXXXX#XXXXXXXXXXXXXXXXXXXXXXX%
+D:%%,,,,,,,,,,,,,,,,,,,,,#8#,,,,,,,,,,,,,,,,,,,,,%%
+D:%XXXXXXXXXXXXXXXXXXXXXXX#XXXXXXXXXXXXXXXXXXXXXXX%
+D:%XXXX&&&&&&&&&&&9#,,,,,X^X,,,,,#9&&&&&&&&&&&XXXX%
+D:%X@.#XX**.......9XX888XX^XX888XX9.......**XX#.@X%
+D:%X@...XXX**.......XXXXX...XXXXX.......**XXX...@X%
+D:%XXX....XXX**......@X**...**X@......**XXX....XXX%
+D:%X@XXX&&&&XXX**....@XX&&@&&XX@....**XXX&&&&XXX@X%
+D:%X9@@#XX....XXX**....XXX#XXX....**XXX....XX#@@9X%
+D:%X89@@@XXX,,,,XXX**..^^^^^^^..**XXX,,,,XXX@@@98X%
+D:%XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX%
+D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+N:89:False Wall
+X:8:20:15:64
+D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+D:%X+XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX+X%
+D:%X^+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^+^X%
+D:%X^XXXXXXXXXXXXXXXXXXXXXXXXXX+X##X+XXXXXXXXXXXXXXXXXXXXXXXXXX^X%
+D:%X^+@*&*@*&*@*&*@*&*@*&*@*&*@*X@@X*@*&*@*&*@*&*@*&*@*&*@*&*@+^X%
+D:%X^XXXXXXXXXXXXXXXXXXXXXXXXX+XX,,XX+XXXXXXXXXXXXXXXXXXXXXXXXX^X%
+D:%X^+&.@.&.@.&.@.&.@.&.@.&.@.&X*..*X&.@.&.@.&.@.&.@.&.@.&.@.&+^X%
+D:%X^XXXXXXXXXXXXXXXXXXXXXXXX+XX*..*XX+XXXXXXXXXXXXXXXXXXXXXXXX^X%
+D:%X^+,,,,,,,,,,,,,,,,,,,,,,,,X,,..,,X,,,,,,,,,,,,,,,,,,,,,,,,+^X%
+D:%X^XXXXXXXXXXXXXXXXXXXXXXX+XX##99##XX+XXXXXXXXXXXXXXXXXXXXXXX^X%
+D:%X^+&.@.&.@.&.@.&.@.&.@.&.@X..####..X@.&.@.&.@.&.@.&.@.&.@.&+^X%
+D:%X^XXXXXXXXXXXXXXXXXXXXXX+XX...##...XX+XXXXXXXXXXXXXXXXXXXXXX^X%
+D:%X^+*&*@*&*@*&*@*&*@*&*@*&X&@&@88&@&@X&*@*&*@*&*@*&*@*&*@*&*+^X%
+D:%XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX%
+D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+N:90:Hellpit
+X:8:20:19:60
+D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+D:%..........................................................%
+D:%.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.%
+D:%.X@@&....#8.#9....^^&&&&&&&&&&&&###.^^,,......+8*9+,,,,,X.%
+D:%.X@&@.............^^................^^,,......+9*9+,,,,,X.%
+D:%.X&@@.............^^@@@@@@@@@@@###..^^,,......+9*9+,,,,,X.%
+D:%.X.....#8....#9...^^................^^,,......+9*9+,,,,,X.%
+D:%.X................^^&&&&&&&&&&&&###.^^,,.&&&&&+9*9+,,,,,X.%
+D:%.X.......@@@@.....^^................^^,,.&@@@&+9*9+,,,,,X.%
+D:%.#....#8.@@@@.#9..^^@@@@@@@@@@@###..^^,,.&@9@&+8*9+,,,,,X.%
+D:%.X.......@@@@.....^^................^^,,.&@@@&+9*9+,,,,,X.%
+D:%.X................^^&&&&&&&&&&&&###.^^,,.&&&&&+9*9+,,,,,X.%
+D:%.X.....#8....#9...^^................^^,,......+9*9+,,,,,X.%
+D:%.X&@@.............^^@@@@@@@@@@@###..^^,,......+9*9+,,,,,X.%
+D:%.X@&@.............^^................^^,,......+9*9+,,,,,X.%
+D:%.X@@&....#8.#9....^^&&&&&&&&&&&&###.^^,,......+8*9+,,,,,X.%
+D:%.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.%
+D:%..........................................................%
+D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+N:91:Roundabout Three
+X:8:30:20:97
+D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+D:%XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX#XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX%
+D:%X,&,,,,,,,,,,,^^^^^^^^^^......XX.#X.XXX.......X.X.......XXX.X#.XX......^^^^^^^^^^,,,,,,,,,,,&,X%
+D:%X,&,,,,,,,,,,,^^^^^^^^^^.....XX.XX.XXX..XXXX..X.X..XXXX..XXX.XX.XX.....^^^^^^^^^^,,,,,,,,,,,&,X%
+D:%X,&,,,,,,,,,,,XXXXXXXXXX....XX.XX.XXX^^XX@@XX.X&X.XX@@XX^^XXX.XX.XX....XXXXXXXXXX,,,,,,,,,,,&,X%
+D:%X,&&&&&&&&&&XXX********XXX..XX.XX.XXX^^X****X.X&X.X****X^^XXX.XX.XX..XXX********XXX&&&&&&&&&&,X%
+D:%X,,,,,,,,,,XXX..XXXXXX...XX+XX.XX.XXX^^XX&&...X@X...&&XX^^XXX.XX.XX+XX...XXXXXX..XXX,,,,,,,,,,X%
+D:%X@@@@@@@@XXX..XXX****XXX.....XX.XX.XXX..XX...XX+XX...XX..XXX.XX.XX.....XXX****XXX..XXX@@@@@@@@X%
+D:%X9988899XXX..XXX.XXXX@@XXXXXX.XX.XX.XXX..XXXXX^^^XXXXX..XXX.XX.XX.XXXXXX@@XXXX.XXX..XXX9998999X%
+D:%X######XXX**X##&&@**XX&&&@98X^^^^^XX.##X^^^^^^^^^^^^^^^X##.XX^^^^^X89@&&&XX**@&&##X**XXX######X%
+D:%X######XXX**X##&&@**XX&&&@98X^^^^^XX.##X^^^^^^^^^^^^^^^X##.XX^^^^^X89@&&&XX**@&&##X**XXX######X%
+D:%X9988899XXX..XXX.XXXX@@XXXXXX.XX.XX.XXX..XXXXX^^^XXXXX..XXX.XX.XX.XXXXXX@@XXXX.XXX..XXX9998999X%
+D:%X@@@@@@@@XXX..XXX****XXX.....XX.XX.XXX..XX...XX+XX...XX..XXX.XX.XX.....XXX****XXX..XXX@@@@@@@@X%
+D:%X,,,,,,,,,,XXX..XXXXXX...XX+XX.XX.XXX^^XX&&...X@X...&&XX^^XXX.XX.XX+XX...XXXXXX..XXX,,,,,,,,,,X%
+D:%X,&&&&&&&&&&XXX********XXX..XX.XX.XXX^^X****X.X&X.X****X^^XXX.XX.XX..XXX********XXX&&&&&&&&&&,X%
+D:%X,&,,,,,,,,,,,XXXXXXXXXX....XX.XX.XXX^^XX@@XX.X&X.XX@@XX^^XXX.XX.XX....XXXXXXXXXX,,,,,,,,,,,&,X%
+D:%X,&,,,,,,,,,,,^^^^^^^^^^.....XX.XX.XXX..XXXX..X.X..XXXX..XXX.XX.XX.....^^^^^^^^^^,,,,,,,,,,,&,X%
+D:%X,&,,,,,,,,,,,^^^^^^^^^^......XX.#X.XXX.......X.X.......XXX.X#.XX......^^^^^^^^^^,,,,,,,,,,,&,X%
+D:%XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX#XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX%
+D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+N:92:The Reward is Worth It
+X:8:20:16:63
+D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+D:%XXXXXXXXXXXXXXX##XXXXXXXXXXXXX#XXXXXXXXXXXXX##XXXXXXXXXXXXXXX%
+D:%X@@@@@@@@@@@.XX88XX.......,,,X^X,,,.......XX88XX.@@@@@@@@@@@X%
+D:%X@XXXXXXXXXX..XXXX...XXXX.,,,X^X,,,.XXXX...XXXX..XXXXXXXXXX@X%
+D:%X@X8888888XXX..XX...XXX@XX,,,X^X,,,XX@XXX...XX..XXX8888888X@X%
+D:%X@X88899999XXX.....XXX@@@X..&X^X&..X@@@XXX.....XXX99999888X@X%
+D:%X@X8899.....XXX...XXX@@@@@..&X^X&..@@@@@XXX...XXX.....9988X@X%
+D:%X@X899.......XXX...XXX......&X^X&......XXX...XXX.......998X@X%
+D:%X+XXX...XXX&&&XXX^^^XXX.....&X^X&.....XXX^^^XXX&&&XXX...XXX+X%
+D:%X@@XXX.XXXX&&&&XXX^^^XXX....&X^X&....XXX^^^XXX&&&&XXXX.XXX@@X%
+D:%X^^^^XXX88X^^^^^^XXX^^^XXX..&X^X&..XXX^^^XXX^^^^^^X88XXX^^^^X%
+D:%X&&&&&&&&XX^^^^^^^^XXX...XXX&X^X&XXX...XXX^^^^^^^^XX&&&&&&&&X%
+D:%X,,,,,,,XX,,,,,,,,,,,XXX&&&XXX^XXX&&&XXX,,,,,,,,,,,XX,,,,,,,X%
+D:%X,,,,,,X#@@@@@@@@@@@@@@XXX&&&&&&&&&XXX@@@@@@@@@@@@@@#X,,,,,,X%
+D:%XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX%
+D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+N:93:Little League Treasure Hoard
+X:7:2:5:19
+D:%%%%%%%%%%%%%%%%%%%
+D:%....#...&...#....%
+D:%.#.#.##***##.#.#.%
+D:%....#...&...#....%
+D:%%%%%%%%%%%%%%%%%%%
+
+N:94:Mini Maze
+X:7:2:15:25
+D:%%%%%%%%%%%%%%%%%%%%%%%%%
+D:%.......................%
+D:%.X+XXXXXXXXXXXXXXXXXXX.%
+D:%.X.X,.......X........X.%
+D:%.X.X..XXX.X...XXXX.X.X.%
+D:%.X.XX.X...X.XXX..X...X.%
+D:%.X......X.X.X....XXX.X.%
+D:%.X.XXXXX..X.X.X..X,X.X.%
+D:%.X.X,..XXXX.X.X.XX.X.X.%
+D:%.X.XXX........X...XX.X.%
+D:%.X...XXXXXX.XXXXXXX..X.%
+D:%.X.X........X,.......X.%
+D:%.XXXXXXXXXXXXXXXXXXXXX.%
+D:%.......................%
+D:%%%%%%%%%%%%%%%%%%%%%%%%%
+
+N:95:Circlular Room
+X:7:2:8:9
+D:%%%%%%%%%
+D:%.......%
+D:%..###..%
+D:%.#+*+#.%
+D:%.#+*+#.%
+D:%..###..%
+D:%.......%
+D:%%%%%%%%%
+
+N:96:Minor Boss Vault
+X:7:3:10:10
+D:%%%%%%%%%%
+D:%........%
+D:%..XXXX..%
+D:%.XX.9XX.%
+D:%.X....X.%
+D:%.XX++XX.%
+D:%.XX^^XX.%
+D:%..X++X..%
+D:%........%
+D:%%%%%%%%%%
+
+N:97:(Lesser) Major Boss Vault
+X:7:20:10:10
+D:%%%%%%%%%%
+D:%........%
+D:%..XXXX..%
+D:%.XX.8XX.%
+D:%.X....X.%
+D:%.XX++XX.%
+D:%.XX^^XX.%
+D:%..X++X..%
+D:%........%
+D:%%%%%%%%%%
+
+N:98:(Greater) Majorly Bossy Vault
+X:8:37:10:10
+D:%%%%%%%%%%
+D:%........%
+D:%.@XXXX@.%
+D:%.XX88XX.%
+D:%.X8888X.%
+D:%.XX++XX.%
+D:%.XX^^XX.%
+D:%.@X++X@.%
+D:%........%
+D:%%%%%%%%%%
+
+N:99:Bubbles
+X:8:35:25:41
+D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+D:%XXX#XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX%
+D:%X8X#X8XXX8XXX8XXX8XXX8XXX8XXX8XXX8XXX8X%
+D:%XX#.XX#.XX#.XX#.XX#.XX#.XX#.XX#.XX#.#XX%
+D:%XX.9.#.9.X.9.#.9.X.9.#.9.X.9.#.9.#.9.XX%
+D:%XXX.XXX.XXX.XXX.XXX.XXX.XXX.XXX.XXX.XXX%
+D:%X8XXX8X#X8X#X8X#X8X#X8X#X8X#X8X#X8X#X8X%
+D:%XX#.XX#.XX#.XX#.XX#.XX#.XX#.XX#.XX#.#XX%
+D:%XX.9.#.9.X.9.X.9.#.9.X.9.#.9.X.9.X.9..X%
+D:%XXX.XXX.XXX.XXX.XXX.XXX.XXX.XXX.XXX.XXX%
+D:%X8X#X8XXX8X#X8XXX8XXX8XXX8XXX8XXX8X#X8X%
+D:%XX#.XX#.XX#.XX#.XX#.XX#.XX#.XX#.XX#.#XX%
+D:%XX.9.X.9.#.9.X.9.#.9.#.9.#.9.#.9.X.9.XX%
+D:%XXX.XXX.XXX.XXX.XXX.XXX.XXX.XXX.XXX.XXX%
+D:%X8X#X8X#X8X#X8XXX8XXX8XXX8XXX8X#X8X#X8X%
+D:%XX#.XX#.XX#.XX#.XX#.XX#.XX#.XX#.XX#.#XX%
+D:%XX.9.#.9.X.9.#.9.#.9.#.9.#.9.#.9.X.9.XX%
+D:%XXX.XXX.XXX.XXX.XXX.XXX.XXX.XXX.XXX.XXX%
+D:%X8XXX8XXX8XXX8XXX8XXX8XXX8XXX8XXX8X#X8X%
+D:%XX#.XX#.XX#.XX#.XX#.XX#.XX#.XX#.XX#.#XX%
+D:%##.9.#.9.#.9.#.9.#.9.#.9.#.9.#.9.X.9.XX%
+D:%XX#.XX#.XX#.XX#.XX#.XX#.XX#.XX#.XX#.#XX%
+D:%X8XXX8XXX8XXX8XXX8XXX8XXX8XXX8XXX8XXX8X%
+D:%XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX%
+D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+N:100:Lesser Vault (Cross)
+X:7:10:13:20
+D:%%%%%%%%%%%%%%%%%%%%
+D:%########++########%
+D:%#*....*#..#*....*#%
+D:%#....&,#^^#,&....#%
+D:%#....,##..##,....#%
+D:%#+#####*..*#####+#%
+D:%#^^.....,,.....^^#%
+D:%#+#####*..*#####+#%
+D:%#....,##..##,....#%
+D:%#....&,#^^#,&....#%
+D:%#*....*#..#*....*#%
+D:%########++########%
+D:%%%%%%%%%%%%%%%%%%%%
+
+N:101:The I in the Storm
+X:8:30:25:41
+D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+D:%XXXXXXXXXXXXXXXXXXX#XXXXXXXXXXXXXXXXXXX%
+D:%X&&..^..#9X..^^^^^^^^^^^^^..X9#..^..&&X%
+D:%X&...#....X..XXXXXX^XXXXXX..X....#...&X%
+D:%X...&#..#.X9XX.@8XX^XX8@.XX9X.#..#&...X%
+D:%X..&9#....XXX...@X,,,X@...XXX....#9&..X%
+D:%X^####..#...XX..XX,.,XX..XX...#..####^X%
+D:%X........,#..XX^X,,.,,X^XX..#,........X%
+D:%X.......#.....^XX,...,XX^.....#.......X%
+D:%X........,#...9X,,...,,X9...#,........X%
+D:%X.......#.....XX.......XX.....#.......X%
+D:%X.#......,#..XX^.......^XX..#,......#.X%
+D:%X.9#....#....#^^...9...^^#....#....#9.X%
+D:%X.#......,#..XX^.......^XX..#,......#.X%
+D:%X.......#.....XX.......XX.....#.......X%
+D:%X........,#...9X,,...,,X9...#,........X%
+D:%X.......#.....^XX,...,XX^.....#.......X%
+D:%X........,#..XX^X,,.,,X^XX..#,........X%
+D:%X^####..#...XX..XX,.,XX..XX...#..####^X%
+D:%X..&9#....XXX...@X,,,X@...XXX....#9&..X%
+D:%X...&#..#.X9XX.@8XX^XX8@.XX9X.#..#&...X%
+D:%X&...#....X&&XXXXXX^XXXXXX&&X....#...&X%
+D:%X&&..^..#9X..^^^^^^^^^^^^^..X9#..^..&&X%
+D:%XXXXXXXXXXXXXXXXXXX#XXXXXXXXXXXXXXXXXXX%
+D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+N:102:Roundabout Two
+X:8:30:25:40
+D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+D:%XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX%
+D:%#^X.^^+X@XX.+X^^^^^+.X...X8#@&*X*****X%
+D:%X^X.^XX@XX.XX^^^^^^X.X.X^XXX@.&+9....X%
+D:%X^X.XX&XX.XX^^^^^^^X.X.X^X8#@&*X99...X%
+D:%X^X.X^^X&.XXXXXXXXXX.X.X^XXXXXXXXXX++X%
+D:%X^X.X.*X&.X.......&..X.X^X........X^^X%
+D:%X^X&X.*X^^X.XXXXXXXXXX.X&X#XXXXXX.X^.X%
+D:%X^X.X..X^^X...@........X.X......X.X^^X%
+D:%X^X.X..X^^XXXXXXXXXXXXXX.XXXXXX.X.X.^X%
+D:%X^X.X..X^^X..,.....,....&X8#,*X.X.X^^X%
+D:%X^X&X,,X^^X^XXXXXXXXXXXXXX##,,X.X.X^.X%
+D:%X^+&X..+^^X^^^^^^^^^^^^^^^9...#.X.#^^X%
+D:%X^X&X,,X^^X^XXXXXXXXXXXXXX##,*X.X.X.^X%
+D:%X^X.X..X^^X..,.....,....&X8#,,X.X.X^^X%
+D:%X^X.X..X^^XXXXXXXXXXXXXX.XXXXXX.X.X^.X%
+D:%X^X.X..X^^X...@........X.X......X.X^^X%
+D:%X^X&X.*X^^X.XXXXXXXXXX.X&X#XXXXXX.X.^X%
+D:%X^X.X.*X&.X.......&..X.X^X........X^^X%
+D:%X^X.X^^X&.XXXXXXXXXX.X.X^XXXXXXXXXX++X%
+D:%X^X.XX&XX.XX^^^^^^^X.X.X^X8#@&*X99...X%
+D:%X^X.^XX@XX.XX^^^^^^X.X.X^XXX@.&+9....X%
+D:%#^X.^^+X@XX.+X^^^^^+.X...X8#@&*X*****X%
+D:%XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX%
+D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+N:103:Modified Greater Vault (Huge)
+X:8:45:17:39
+D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+D:%XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX%
+D:%#8#8#8#8#8#8#8#8#8#8#8#8#8#8#8#8#8#8X%
+D:%XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX#X%
+D:%X8#8#8#8#8#8#8#8#8#8#8#8#8#8#8#8#8X.X%
+D:%X#XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX#X#X%
+D:%X8X8#8#8#8#8#8#8#8#8#8#8#8#8#8#8X8X.X%
+D:%X#X#XXXXXXXXXXXXXXXXXXXXXXXXXXX#X#X#X%
+D:%X8X8X8#8#8#8#8#8#8#8#8#8#8#8#8#8X8X.X%
+D:%X#X#X#XXXXXXXXXXXXXXXXXXXXXXXXXXX#X#X%
+D:%X8X8X8#8#8#8#8#8#8#8#8#8#8#8#8#8#8X.X%
+D:%X#X#XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX#X%
+D:%X8X8#8#8#8#8#8#8#8#8#8#8#8#8#8#8#8#.X%
+D:%X#XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX%
+D:%X8#8#8#8#8#8#8#8#8#8#8#8#8#8#8#8#8#8#%
+D:%XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX%
+D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+N:104:The Bank from Hell
+X:8:30:20:31
+D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+D:%XXXXXXXXXXXXXX+XXXXXXXXXXXXXX%
+D:%X.&.&.&.&.&.#...#.&.&.&.&.&.X%
+D:%X.#.#.#.#.#.#...#.#.#.#.#.#.X%
+D:%X...........#...#...........X%
+D:%X##########+##+##+##########X%
+D:%X@........^^^^^^^^^........@X%
+D:%X@^^^.....^^^...^^^.....^^^@X%
+D:%X##+#######+#####+#######+##X%
+D:%X.^^^.#@..^^^...^^^..@#.^^^.X%
+D:%X#...##...............#.###.X%
+D:%X@...@#.&.&.&.&.&.&.&.#..@..X%
+D:%XXXXXXXXXXXXXXXXXXXXXXXXXXX+X%
+D:%X.+^*****X*******^+^******X.X%
+D:%X@X^....^X^......^X^.....*X@X%
+D:%X.X*****^+^*******X*******X.X%
+D:%X@XXXXXXXXXXXXXXXXXXXXXXXXX@X%
+D:%X.@.@.@.@.@.@.@.@.@.@.@.@.@.X%
+D:%XXXXXXXXXXXXXXXXXXXXXXXXXXXXX%
+D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+# Between vaults from weisiger
+N:105:The Between Vault
+X:8:15:6:25
+D:XXXXXXXXXXXXXXXXXXXXXXXXX
+D:#,,,,,X&...@X..**&X....9X
+D:#...&1X.,,,2X..**&X3...9X
+D:#...&.X1,,,.X2.**3X....9X
+D:#,,,,,X&...@X..**&X....9X
+D:XXXXXXXXXXXXXXXXXXXXXXXXX
+
+N:106:Greater Vault (Mix&Match)
+X:8:35:28:73
+D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+D:%.......................................................................%
+D:%.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.%
+D:%.X1.^^^^*&XX,,,9,,,XX...X...X...X&..X@..X@.8X7X8#X8#X8#X8#X8#X8#X8#.7X.%
+D:%.X..^^^*,XX@&@&@&@&X.X...X...X..#X&..X&..X@.#XXX#8XX8XX8XX8XX8XX8XXXXX.%
+D:%.X^^^^*,XXXX.......X6.X...X...X.#.X&..X@..X@.8X8XXXXXXXXXXXXXXXXXX88XX.%
+D:%.X^^^*,XX&&XX.....XXXXXXXX.X...X#..X&.#X&..X@.XX#9#9#9#9X88XX^^XX#8XXX.%
+D:%.X^^*,X#^^^^XX^XXX.X***&@XXXX...X...X&#.X@..X@X8X9X9X9X9X8#X^^XX8#X#8X.%
+D:%.X^*,XX^^^^^^XX^XX5X***@&,,XXX...X...X#..X&..XX#X#X#X#X#XXX^^XX##XX88X.%
+D:%.X*,XX........XX^XXX***&@,,,,XXX..X..#X&..X@..X8X8X8X8X8XX^^XX88XXXXXX.%
+D:%.X&XX..........XX^XX***@&,,,,#.XXX.X.#.X&..X&.X#X#X#X#X#X^^X#8XXXX,#.X.%
+D:%.XXX************XX6X@&@&@,,,,#...XXXX#..X&.#X@X8X8X8X8X8#XXXXXX,,,,#.X.%
+D:%.XX&,&,&,&,&,&,&,XXXX@&@&,,,,#.....XXX...X&#.XX8X8X8X8X8XXXX,,,,,,,#.X.%
+D:%.XX#************XX.^#X,,,,,,,#.......XXXXXXXXXX8X8X8XXXXX@&#,,,,,,XX#X.%
+D:%.X^XX..........XXX.XXXX,,,,,,#................X8XXXXX&&#&@&#,,XXXXX#.X.%
+D:%.X.XXX........XX3X^X99XXXXXXXXXXXXXXX#XXXXXXX.XXXX,#&&&#&@&XXXX,#^X#.X.%
+D:%.X.XXXX......XXX.X.X@@,,,,,,,,,,,,X1X.......X.X,,,,#&&&#XXXX,,,,#^X.#X.%
+D:%.X^XXXXX....XXXX.^.XXXXXXXXXXXXXX*X^X+XXXXX.X.X,,,,#&&XXX##9,,,,#^X.#X.%
+D:%.X.X^^.XX@@XXXXXXXXX9@&,,,,,,,,,X*X.X^^&,,X.X.X#####XXX#9@##@,,,#^X#.X.%
+D:%.X.X^X.XXXXX^^^XXXXXXXXXXXXXXXX,X*X.X^^^,,X.X.X&&&XXX@8##&@##@,,#^X#.X.%
+D:%.X^X.X2XXXX3^^^XXX.^..^..^..^.X,X*X^X&^^^&X.X.X##XX5.@89##9@##&,#^#.#X.%
+D:%.X.X^XXXXXXXXX^^XX.XXXXXXXXXX.X,X*X.X..^^^X.X.X^XXXXXXXXXXXXXXXXXXXXXX.%
+D:%.X.X^^.^..^..X^^^X.^..^..^.4X^X,X*X.X2.&^^+.+.X.^.^.^.^.^.^.^.^.^.^.4X.%
+D:%.X^XXXXXXXXX^X^^^XXXXXXXXXXXX#X#X#X^XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.%
+D:%.X..^..^..^..X^^^#................X..^..^..^..^..^..^..^..^..^..^..^.+.%
+D:%.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.%
+D:%.......................................................................%
+D:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+# Wilderness vault test
+N:107:The Wilderness Vault
+X:10:1:3:7
+D:XXXXXXX
+D:T,,,,8X
+D:XXXXXXX
diff --git a/lib/mods/theme/edit/volcano.txt b/lib/mods/theme/edit/volcano.txt
new file mode 100644
index 00000000..1b89cf3d
--- /dev/null
+++ b/lib/mods/theme/edit/volcano.txt
@@ -0,0 +1,83 @@
+# File: volcano.txt
+
+# Stairway to the Hell
+F:$:7:3:0:0:0:0:0:6
+
+# Hole to the center of the Volcano
+F:>:7:3:0:0:0:0:0:5
+
+############### Town Layout ###############
+
+D:######################################################################################################################################################################################################
+D:#LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL#
+D:#LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL#
+D:#LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL#
+D:#LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL#
+D:#LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL#
+D:#LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL#
+D:#LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL#
+D:#LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL#
+D:#LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL#
+D:#LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL#
+D:#LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL#
+D:#LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL#
+D:#LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL#
+D:#LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL#
+D:#LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL#
+D:#LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL#
+D:#LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL#
+D:#LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL#
+D:#LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL#
+D:#LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL#
+D:#LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL#
+D:#LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL$LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL#
+D:#LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL#
+D:#LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL#
+D:#LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL#
+D:#LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL#
+D:#LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL#
+D:#LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL#
+D:#LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL#
+D:#LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL#
+D:#LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL#
+D:#LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL#
+D:#LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL#
+D:#LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL#
+D:#LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL#
+D:#LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL#
+D:#LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL#
+D:#LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL#
+D:#LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL#
+D:#LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL#
+D:#LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL#
+D:#LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL#
+D:#LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL#
+D:#LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL#
+D:#LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL^^^LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL#
+D:#LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL^>^LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL#
+D:#LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL^K^LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL#
+D:#LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL^K^LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL#
+D:#LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL^^K^^LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL#
+D:#LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL^K^LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL#
+D:#LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL^K^LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL#
+D:#LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL^^K^LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL#
+D:#LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL^K^LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL#
+D:#LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL^K^LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL#
+D:#LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL^^K^^LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL#
+D:#LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL^K^LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL#
+D:#LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL^^K^LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL#
+D:#LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL^K^LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL#
+D:#LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL^K^LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL#
+D:#LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL^^K^LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL#
+D:#LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL^^K^^LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL#
+D:#LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL^K^LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL#
+D:#LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL^K^LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL#
+D:#LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL^K^LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL#
+D:######################################################################################################################################################################################################
+
+
+############### SLarting positions ###############
+
+# Standard starting position for normal races
+?:[EQU $LEAVING_QUEST 0]
+P:64:80
diff --git a/lib/mods/theme/edit/w_info.txt b/lib/mods/theme/edit/w_info.txt
new file mode 100644
index 00000000..18cf7a0f
--- /dev/null
+++ b/lib/mods/theme/edit/w_info.txt
@@ -0,0 +1,141 @@
+# PernAngband wilderness definition file by DarkGod (darkgod@pernangband.org)
+# with the help form Gwidon S. Naskrent (naskrent@artemida.amu.edu.pl)
+# Designed to "look like" Middle-earth map
+# Updated to include a more accurate location of Angband/Gondolin and many new features by furiosity for Theme
+
+W:D:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+W:D:Xg=====================gggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggX
+W:D:Xgggggg==============gggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggX
+W:D:Xggggggg==============ggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggX
+W:D:Xgggggggggg===========ggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggX
+W:D:XWWAAWCCCWWWW===========WWWgggWWWWWgggggggggWWWWWWWWWWggggWWWWWWWWWWWWWggggWWWWWWWWggggWWWWWWWWWggggX
+W:D:XWWAAAACCCCWWWWAA========WWWWWWWWWWWWWggggggggWWWWWWWWWWWWWWWWWWWWWWWWWWggWWWWWWWWWWWWWWWWWWWWWWEEEEX
+W:D:XWWWWAAAAAW%AAAA========WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW.EEEEEEEEX
+W:D:XWWWWWWAAWAAAWW===========WWWWWWW...WWWWWWWWWW..........WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW.EEEEEEEEEEEX
+W:D:XWWWWWWWWWWWWWW==========..WWW....WWWWWWWW................WWWWGGGGWWWWWWWW......WWWWW.EEEEEEEEEEEEEEX
+W:D:XTM.MMMMWWWW===...====...........HHHH..................GGGGGGGWWWDWWWW.........WWWW.EEEEEEEEEEEEEEEEX
+W:D:XT.2MMM=======.BB.=............HHHHHHHH..&&&&&...J..GGGGGGGGGGGGG.................tEEEEEtEEEEttEEEEEX
+?:[EQU $TOWN_DESTROY2 1]
+W:M:0:1
+W:D:XT.PMMM=======.BB.=............HHHHHHHH..&&&&&......GGGGGGGGGGGGG.................tEEEEEtEEEEttEEEEEX
+?:1
+W:D:XMMMMM======..BB.===.............HHHH.......&&&&&&GG.._._.......................ttttttttttttttttttttX
+W:D:X======...._.BB._..._............................&....._._TTT................GG........tttttttttttttX
+W:D:X=====...._..BB.._.._..HHHH................&....&&&~~~~.TT_TTTT..........G.....GGG........tttttt^^^^X
+W:D:X===....._...BB..._._..HHH.......HHHHHH.....&&&&._&&..~.TTT_T_TT..^D......GGGGGG..............ttt^^^X
+W:D:X===...._..TBBB...._._..H.=....HHH|HH..........__.&&__~.TTTT_o_TT.D8........_.....................^^X
+W:D:X===...._....BB....._..HH.=_....H.|..........__...&&..~.TTTTTT_TT.=........_........................X
+W:D:X===..._...BBBB...._....HHHH__....|........._.....&&..~.TTTTTT____a........_........................X
+W:D:X===...._..TTBB..._........._.....|H......._......&q..~6TTTTT&&&T._........._.......................X
+W:D:X===....==..TBBB._......HH.._.TT..|.HH...._..TTT._&&..~..*TT&I&&&T._........._......................X
+W:D:X====...==.....==......HHd+-_TTTT-x1HH---------_Lq&&---------------_........_.......................X
+W:D:X=====..========....H....H|..____H|uH....._..._.._&...~..TTTTTTTTTT._........_......................X
+W:D:X==============....HHH....|..._TTH|......._.._.._&&^...~..TTTTTTTTT.._........_....................tX
+W:D:X======..==....BB...H.....|..._..H|HH...._.._...&&.....~..TTTTTTTT...._......_....................ttX
+W:D:X======........BB.........[---_...|.H...._._..^^&&^.I._~..TTTTTTTT....._......_..................tttX
+W:D:X======........BB............._[--|....._.._..^^&&___I.~~.TTTTTTTT......_.._._..................ttttX
+W:D:X======........BB....B......._....|....._._...^^&&.....~~.TTTTT.T........__.._.................tttttX
+W:D:X=======.....TBBB..BBBB....._.....|....._....^^&&&....~~...TTTT.............._...............tttttttX
+W:D:X==========..TBBBT........._......|...._.....^^&&.....~~...TTTT..............._...._.......TtTttttttX
+W:D:X==========..TTTBBTBB....._.......|II__.....^)^&&....~~....TTTTTTT............._.__._=...TTTTTTtttttX
+W:D:X==========...TTBTT......_........___II_..._^^^&&....~~..TTTTTTTTTT............._....==...T==TTtttttX
+W:D:X==========.....T.T....._........_.....____^___R__...~~.TTTTTTTTTT...................========TTtttttX
+W:D:X===========.=........._........_..........^^&&&_!7!~~..TT&TTTTTTT..................=========TttttttX
+W:D:X================....__........_..ttt......^M&&._!4!~~..TTTTTTTTT...................=========...ttttX
+W:D:X=================.==E........_....tt.....TTMM&..!!!~.....TTTTT..................^^.========......ttX
+W:D:X===================EE........._.........TTMMM.......~~.........................^^^^.=======.......tX
+W:D:X===================E==......._..........TTM)MTTTTT._..~~~~;;....................^^^.==...==.......tX
+W:D:X===================E==......_...........T&MWMMTTTT_I_.....~;;..................^^^^^.=...=........tX
+W:D:X=====================......_.ttt........T&M5MTTTTTT..__I~~;;...................^^^^^^.............tX
+W:D:X=====================.....=_.tt.........&&MMMTTTTT.....~...........................^^.............tX
+W:D:X======================...==..ttt........&&_&&&.._.......~~........................................tX
+W:D:X=======================.===..............^_^....._........~.......................................tX
+W:D:X===========================..............._......._......~........................................tX
+W:D:X==========================.tt......._._.._........_....H=HH...SSS.................................tX
+W:D:X==========================.tt._.._t_...__.........._..H===H.SSSS.................................ttX
+W:D:X==========================..__.__._._._..&&&b....._....H=HH..SS.A.A.............................tttX
+W:D:X============================....._..._.__.&&&......_....~~.....AAOAAA..A..AA..A..A..AA.........ttttX
+W:D:X===========================.............._&&&^^....._....~~I...AA''AAAAAAAAAAAAAAAAAAAAAAA......tttX
+W:D:X===========================.......^.&.^^&&&&&&&......__.~~III...AAVVVVVV$AVVVAVAA_"""_"""""".....ttX
+W:D:X===========================.....^^.&.&_&^&.&^&_&&&9...._..~~II..AAVVUVVVVVVVVVVA_"""""_"""""".....tX
+W:D:X===========================....^....__^^...^^^._^&&........~~.c.AAVVUUVVVVVVVAA_"""""""_"""".......X
+W:D:X===========================..^^^_.._.......^^._.^^&&&........~~.AAVVVVVVVVVVAA""_""""""_"""""""....X
+W:D:X============================.^T_.__._........_&^^^.&&&&&......e.AAsAAVAAAVVV"""""_""""_"""""""....DX
+W:D:X============================.T^_..._....HH.._&&&^^.._&&&&.&...~.AAA""A"A""""""""=="""_"""""""""".DDX
+W:D:X============================.T^._.HHHHHHHH...__...._^&^&&&&&.~..AA""""""""""""======_"""""""""""DDDX
+W:D:X===========================.^^._...H.H........._.._.^&^^._^3.~..sA"""_"_"""""=====""""""""""""DDDDDX
+W:D:X==========================..^^.._.....===.=====_._&^...._...^.~.AA"__"_"__======"""""AA""""DDDDDDDDX
+W:D:X==========================.H...._...===========_&&^...._._...~~.AA_""""""""""""_""A"AADDDDDDDDDDDDDX
+W:D:X========================.HHH=...=_.==========&^^^^.._._..._.~~..AAA""AAA""A"""AA_AAAADDDDDDDDDDDDDDX
+W:D:X======================....=====.==============^.^._=._.....~~...AAAAAAAAAAAAAAAAAAADDDDDDDDDDDDDDDDX
+W:D:X==============================================.^^^==....~~~~....................DDDDDDDDDDDDDDDDDDDX
+W:D:X===============================================..====~~~f~...............DDDDDDDDDDDDDDDDDDDDDDDDDDX
+W:D:X===============================================.==^==_............DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDX
+W:D:X=================================================^^===........DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDX
+W:D:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+
+# Definition of all the entrances to the dungeons
+# W:E:<dungeon>:<y>:<x>
+
+#Orodruin
+W:E:5:50:70
+
+# Numenor
+W:E:7:25:1
+
+# Paths of the Dead
+W:E:16:49:38
+
+# Illusory Castle
+W:E:17:15:96
+
+# Maze
+W:E:18:57:28
+
+# Erebor
+W:E:20:15:66
+
+# Old Forest
+W:E:21:21:31
+
+# The Sacred Land Of Mountains
+W:E:25:37:80
+
+# The Wild Land Of Rhun
+W:E:26:28:92
+
+# The Withered Heath
+W:E:27:10:65
+
+# The Grinding Ice
+W:E:29:1:1
+
+# Dol Guldur
+W:E:23:33:58
+
+# The Northern Waste
+W:E:31:5:44
+
+# The Blue Mountains
+W:E:32:29:18
+
+# Dol Amroth
+W:E:33:60:48
+
+# Angmar
+W:E:34:13:48
+
+# Near Harad
+W:E:35:64:97
+
+# Isengard
+W:E:36:42:43
+
+# Tol Eressea
+W:E:37:64:1
+
+# Utumno
+W:E:38:1:99
+
+# Starting position
+W:P:35:21 \ No newline at end of file
diff --git a/lib/mods/theme/edit/wf_info.txt b/lib/mods/theme/edit/wf_info.txt
new file mode 100644
index 00000000..acdba872
--- /dev/null
+++ b/lib/mods/theme/edit/wf_info.txt
@@ -0,0 +1,394 @@
+# File: wf_info.txt
+
+
+# This file is used to initialize the "lib/raw/wf_info.raw" file, which is
+# used to initialize the "wilderness feats" information for the Angband game.
+
+# 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/wf_info.raw" file.
+
+# The wilderness feat indexes are defined in "defines.h", and must not be
+# changed.
+
+# N:<index>:<name>
+# D:<long name>
+# W:<level>:<entrance>:<road>:<feat>:<terrain_idx>:<character(must be unique)>
+# F:<flags>
+# X:<feat1>...<feat18>
+
+# Note for <road> :
+# 1 = NORTH
+# 2 = SOUTH
+# 4 = EAST
+# 8 = WEST
+
+# Note for <entrance> :
+# if < 1000 then it points to a town
+# if >= 1000 then it points to the x - 1000 dungeon type
+
+# <feat> is the feature from f_info that will be used to represent the tile
+# in the map
+
+# <terrain_idx> is one of the TERRAIN_foo defines of defines.h
+
+# define idx feature r_info flag
+
+# TERRAIN_EDGE 0 /* Edge of the World */ none
+# TERRAIN_TOWN 1 /* Town */ WILD_TOWN
+# TERRAIN_DEEP_WATER 2 /* Deep water */ WILD_OCEAN
+# TERRAIN_SHALLOW_WATER 3 /* Shallow water */ WILD_SHORE
+# TERRAIN_SWAMP 4 /* Swamp */ not implemented
+# TERRAIN_DIRT 5 /* Snow */ WILD_WASTE
+# TERRAIN_GRASS 6 /* Grass */ WILD_GRASS
+# TERRAIN_TREES 7 /* Trees */ WILD_WOOD
+# TERRAIN_DESERT 8 /* Desert */ not implemented
+# TERRAIN_SHALLOW_LAVA 9 /* Shallow lava */ WILD_VOLCANO
+# TERRAIN_DEEP_LAVA 10 /* Deep lava */ WILD_VOLCANO
+# TERRAIN_MOUNTAIN 11 /* Mountain */ WILD_MOUNTAIN
+
+# <character> is the character used to reference this wf_info entry on the
+# wilderness map file
+
+# X: list of f_info features used by the plasma generator to create the levels
+# corresponding to that wilderness tile (like, lots of mountain, some
+# trees, a bit of water...)
+
+# Version stamp (required)
+
+V:2.0.0
+
+N:0:Ekkaia
+D:the Encircling Sea
+W:1:0:0:182:0:X
+X:182:182:182:182:182:182:182:182:182:182:182:182:182:182:182:182:182:182
+
+N:1:Bree
+D:a small village
+W:1:1:0:203:1:1
+X:88:88:89:89:89:89:79:96:96:96:96:96:96:96:96:96:96:96
+
+N:2:Gondolin
+D:The hidden town of the Noldor
+W:1:2:0:203:1:2
+X:88:88:88:89:89:89:89:89:89:89:89:89:89:82:96:96:96:96
+
+N:3:Minas Anor
+D:The great town of Gondor
+W:1:3:0:203:1:3
+X:1:1:88:88:89:89:89:89:89:89:89:89:89:89:89:83:96:96
+
+N:4:Caras Galadhon
+D:Lothlorien's chief city
+W:1:4:0:203:1:4
+X:88:88:96:96:96:96:199:96:80:96:96:96:96:96:96:89:89:89
+
+N:5:grass
+D:a plain of grass
+W:20:0:0:89:6:.
+X:89:89:89:89:89:89:199:89:81:89:89:89:89:89:89:89:96:96
+
+N:6:forest
+D:a forest
+W:40:0:0:96:7:T
+X:88:88:96:96:96:96:199:96:82:96:96:96:96:96:96:89:89:89
+
+N:7:road
+D:a west-east road
+W:5:0:12:200:6:-
+X:200:200:88:88:89:89:199:89:89:89:79:89:89:89:89:89:96:96
+
+N:8:road
+D:a north-south road
+W:5:0:3:200:6:|
+X:200:200:88:88:89:89:199:89:89:89:79:89:89:89:89:89:96:96
+
+N:9:mountain
+D:a mountain chain
+W:60:0:0:97:11:&
+X:1:1:89:89:88:96:96:97:97:97:97:97:97:97:97:97:97:97
+
+N:10:road
+D:a west-east-south road
+W:5:0:14:200:6:+
+X:200:200:88:88:89:199:89:89:89:89:79:89:89:89:89:89:96:96
+
+N:11:road
+D:a west-east-north road
+W:5:0:13:200:6:z
+X:200:200:88:88:89:199:89:89:89:89:79:89:89:89:89:89:96:96
+
+N:12:The Nether Realm
+D:the entrance to the netherworld
+W:127:1006:0:7:10:6
+X:88:88:88:86:86:86:85:85:85:85:85:85:85:85:85:97:97:97
+
+N:13:deep water
+D:a deep water area
+W:90:0:0:187:2:=
+X:187:187:187:187:187:187:187:187:187:187:187:187:84:84:84:84:84:84
+
+N:14:shallow water
+D:a shallow water area
+W:35:0:0:225:3:_
+X:187:187:187:84:84:84:84:84:222:222:84:84:84:84:84:1:88:89
+
+N:15:Mirkwood
+D:The Forest of Mirkwood
+W:13:1001:0:7:7:*
+X:88:88:96:96:82:96:96:96:96:79:96:96:96:96:96:89:89:89
+
+N:16:Barad-Dur
+D:Barad-Dur
+W:34:1002:0:7:11:$
+X:1:1:94:94:94:94:212:94:94:94:94:94:94:94:94:94:212:212
+
+N:17:Angband
+D:The Pits of Angband
+W:67:1003:0:7:11:%
+X:94:94:90:90:90:90:90:90:90:90:90:90:90:90:90:90:92:92
+
+N:18:mountain
+D:a mountain
+W:60:0:0:97:11:^
+X:1:1:89:89:94:96:96:97:97:97:97:97:97:97:97:97:97:97
+
+N:19:desert
+D:a desert
+W:44:0:0:91:5:D
+X:91:91:91:91:91:91:91:91:91:91:91:91:91:91:91:91:91:92
+
+N:20:jungle
+D:a jungle
+W:40:0:0:202:7:t
+X:88:88:202:96:202:96:202:96:81:96:202:96:202:96:96:89:89:89
+
+#The Dead Marshes replace 'swamp'
+# Ugly: I used a non-wilderness terrain_idx to force meaner monsters -furiosity
+N:21:Dead Marshes
+D:a part of the Dead Marshes
+W:127:0:0:223:174:S
+X:223:223:223:223:223:223:223:223:223:223:84:223:210:223:208:208:102:223
+
+N:22:glacier
+D:a glacier
+W:45:0:0:90:5:g
+X:94:94:90:90:90:90:90:90:90:90:90:90:90:90:90:90:92:92
+
+N:23:grass
+D:a plain of grass
+W:15:0:0:228:6:,
+X:1:1:88:88:228:228:228:228:228:79:228:228:228:228:228:228:96:96
+
+N:24:Moria
+D:The Doors of Moria
+W:50:1022:0:7:11:)
+X:1:1:88:88:89:89:89:89:89:89:89:89:89:89:89:89:96:96
+
+N:25:high mountain
+D:a high mountain chain
+W:80:0:0:101:11:M
+X:101:101:101:101:101:101:101:101:101:101:101:101:101:101:101:101:101:101
+
+N:26:Gondolin
+D:The pillaged city of the Noldor
+W:1:2:0:203:1:P
+X:49:49:49:88:88:88:92:92:92:92:93:93:94:94:94:174:205:205
+
+N:27:Khazad-dum
+D:The dwarven stronghold
+W:1:5:0:203:1:5
+X:1:1:1:1:1:1:1:1:1:1:88:88:88:88:88:88:88:88
+
+N:28:dark pit
+D:a dark pit
+W:60:0:0:87:5:C
+X:87:87:87:87:87:87:87:87:87:214:214:214:214:214:214:214:214:214
+
+N:29:low hill
+D:a low hill
+W:15:0:0:213:6:H
+X:1:1:89:89:88:96:96:213:213:213:213:213:213:213:213:213:213:213
+
+N:30:dark mountain
+D:a dark mountain
+W:80:0:0:214:11:A
+X:214:214:214:214:214:214:214:214:214:214:214:214:214:214:214:214:214:214
+
+N:31:blue mountain
+D:a blue mountain
+W:50:0:0:215:11:B
+X:1:1:89:89:88:96:96:215:215:83:215:215:215:215:215:215:215:215
+
+N:32:grey mountain
+D:a grey mountain
+W:40:0:0:216:11:G
+X:1:1:89:89:88:96:96:216:216:216:80:216:216:216:216:216:216:216
+
+N:33:Mount Doom
+D:a part of Mount Doom
+W:127:0:0:217:11:U
+X:217:217:217:217:217:217:217:217:217:217:217:217:217:217:217:217:217:217
+
+N:34:Mallorn forest
+D:a Mallorn forest
+W:5:0:0:243:7:!
+X:88:88:243:243:96:96:243:199:82:243:243:96:243:96:243:243:243:243
+
+N:35:Redhorn Pass
+D:Redhorn Pass
+W:30:0:0:218:6:R
+X:94:94:90:90:90:90:90:94:90:90:90:94:90:90:90:90:95:95
+
+N:36:Morannon
+D:Morannon (the Black Gate of Mordor)
+W:34:0:0:224:11:O
+X:224:224:224:224:224:224:224:224:224:224:224:224:224:224:224:224:224:224
+
+N:37:evergreen wood
+D:an evergreen wood
+W:40:0:0:202:7:E
+X:94:94:219:219:219:219:219:219:82:219:219:219:219:219:219:89:94:94
+
+N:38:Rivendell
+D:the valley of Rivendell
+W:5:14:0:96:1:L
+X:88:97:202:96:202:97:202:96:81:97:202:96:202:96:96:89:97:89
+
+N:39:Gorgoroth
+D:the valley of terror
+W:90:0:0:91:5:V
+X:91:91:91:86:94:94:94:86:91:91:94:94:86:94:94:86:91:94
+
+N:40:Northern Waste
+D:the northern wastelands
+W:30:0:0:93:5:W
+X:91:90:90:91:90:91:90:91:90:91:91:91:90:91:90:91:91:91
+
+N:41:crossroads
+D:a crossroads
+W:5:0:15:200:6:x
+X:200:200:88:88:89:199:89:89:89:89:79:89:89:89:89:89:96:96
+
+N:42:north-south-east road
+D:a north-south-east road
+W:5:0:7:200:6:[
+X:200:200:88:88:89:199:89:89:89:89:79:89:89:89:89:89:96:96
+
+N:43:swamp
+D:a swamp
+W:45:0:0:226:3:I
+X:226:226:174:84:84:226:174:226:84:84:174:226:226:174:226:174:84:174
+
+N:44:Nurn
+D:the valley of Nurn
+W:50:0:0:94:6:"
+X:94:93:94:89:93:89:94:89:93:94:94:93:89:93:89:93:94:94
+
+N:45:The Brown Lands
+D:the Brown Lands
+W:30:0:0:174:5:;
+X:174:174:89:89:174:174:89:89:174:94:93:174:174:94:174:89:89:94
+
+N:46:Udun
+D:the valley of Udun
+W:50:0:0:86:6:'
+X:94:93:86:86:94:93:86:86:94:93:86:86:94:93:86:86:94:93
+
+N:47:Anduin
+D:Anduin, the great river
+W:35:0:0:227:3:~
+X:187:227:187:84:84:227:84:84:222:227:84:84:227:84:84:227:88:94
+
+# Former location of Gondolin (to avoid silliness with Maeglin quest)
+N:48:Secret Valley
+D:the secret valley with directions to Gondolin
+W:0:0:12:89:1:J
+X:228:228:228:228:228:228:228:228:228:228:228:228:228:228:228:228:228:228
+
+### New Towns ###
+
+# Beorn's Halls
+N:49:Beorn's Halls
+D:the dwelling of Beorn the Shape-changer
+W:1:6:0:89:1:6
+X:88:88:89:89:89:89:79:96:96:96:96:96:96:96:96:96:96:96
+
+# Cerin Amroth
+N:50:Cerin Amroth
+D:a place of peace
+W:1:7:0:89:1:7
+X:88:88:89:89:89:89:79:96:96:96:96:96:96:96:96:96:96:96
+
+# Dale
+N:51:Dale
+D:a city of Men, being rebuilt
+W:1:8:0:91:1:8
+X:91:91:91:91:91:91:91:91:91:91:91:91:91:91:91:91:91:91
+
+# Edoras
+N:52:Edoras
+D:the capital of Rohan
+W:1:9:0:203:1:9
+X:88:88:89:89:89:89:79:96:96:96:96:96:96:96:96:96:96:96
+
+# Esgaroth
+N:53:Esgaroth
+D:the city of Lake-Men
+W:1:10:0:203:1:a
+X:88:88:89:89:89:89:79:96:96:96:96:96:96:96:96:96:96:96
+
+# Helm's Deep
+N:54:Helm's Deep
+D:the great fortress of the Rohirrim
+W:1:11:0:89:1:b
+X:88:88:89:89:89:89:79:96:96:96:96:96:96:96:96:96:96:96
+
+# Henneth Annun
+N:55:Henneth Annun
+D:a Ranger hideout
+W:1:12:0:89:1:c
+X:88:88:89:89:89:89:79:96:96:96:96:96:96:96:96:96:96:96
+
+# Hobbiton
+N:56:Hobbiton
+D:a Hobbit village
+W:1:13:0:203:1:d
+X:88:88:89:89:89:89:79:96:96:96:96:96:96:96:96:96:96:96
+
+# Osgiliath
+N:57:Osgiliath
+D:a stronghold of Men
+W:1:15:0:203:1:e
+X:88:88:89:89:89:89:79:96:96:96:96:96:96:96:96:96:96:96
+
+# Pelargir
+N:58:Pelargir
+D:the great city at the mouth of Anduin
+W:1:16:0:203:1:f
+X:88:88:89:89:89:89:79:96:96:96:96:96:96:96:96:96:96:96
+
+# Thranduil's Halls
+N:59:Thranduil's Halls
+D:the hidden realm of the Wood-elves
+W:1:17:0:213:1:o
+X:88:88:89:89:89:89:79:96:96:96:96:96:96:96:96:96:96:96
+
+### Cirith Ungol a 'defined' feature to allow it to have two entrances
+N:60:Cirith Ungol
+D:the dreaded Spider Pass
+W:25:1009:0:7:6:s
+X:91:91:91:86:94:94:94:86:91:91:94:94:86:94:94:86:91:94
+
+### Bree Swamp
+N:61:Bree Swamp
+D:The Bree Swamp
+W:1:0:0:225:6:u
+X:187:187:187:84:84:84:84:84:222:222:84:84:84:84:84:1:88:89
+
+### Orc Cave a 'defined' feature to allow it to have two entrances
+N:62:Orc Cave
+D:a dark tunnel leading to an Orc Cave
+W:15:1019:0:7:6:q
+X:1:1:88:88:89:89:89:89:89:89:89:89:89:89:89:89:96:96 \ No newline at end of file
diff --git a/lib/mods/theme/edit/wights.map b/lib/mods/theme/edit/wights.map
new file mode 100644
index 00000000..b67963ac
--- /dev/null
+++ b/lib/mods/theme/edit/wights.map
@@ -0,0 +1,82 @@
+# Permanent wall
+F:X:63:3
+
+# up stairs
+F:<:6:3
+
+# Floor with mountain
+F:^:97:3
+
+# Floor
+F:.:1:3
+
+# Floor with dirt
+F:;:88:3
+
+# Floor with forest wight
+F:f:88:3:381
+
+# Floor with grave wight
+F:g:88:3:470:0:0:0:0:0:0:2
+
+# Floor with barrow wight
+F:b:88:3:499:0:0:0:0:0:0:2
+
+# Floor with Emperor Wight
+F:e:88:3:604:0:0:0:0:0:0:2
+
+# Floor with a Human Skeleton
+F:k:88:8:0:395
+
+# Marker
+F:,:172:6
+
+# between gate 1
+F:1:160:6:0:0:0:0:0:2057
+
+# between gate 2
+F:2:160:6:0:0:0:0:0:1036
+
+# between gate 3
+F:3:160:6:0:0:0:0:0:3847
+
+# between gate 4
+F:4:160:6:0:0:0:0:0:2321
+
+# between gate 5
+F:5:160:6:0:0:0:0:0:1043
+
+# between gate 6
+F:6:160:6:0:0:0:0:0:3599
+
+# between gate 7
+F:7:160:6:0:0:0:0:0:2071
+
+# between gate 8
+F:8:160:6:0:0:0:0:0:3350
+
+# between gate 9
+F:9:160:6:0:0:0:0:0:771
+
+# Dungeon layout
+D:XXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+D:X..k^^^^^^^^^^^^^^^^^^^^^^^XX
+D:Xfkff^^^^^...^^^^..ff^^^^^^XX
+D:X^f1^^^^^^.ffg^^^^.fgg^^^^^XX
+D:X^^^^^^^^^^^fg4^^^^f6^^^^^^XX
+D:X^^^^^^^^^^^^f^^^^^^^^^fg8^XX
+D:X^^^^^^.f^^^^^^^^^^^^.ffg^^XX
+D:X^^^^.ff2^^^^^^.^^^^^^.f^^^XX
+D:X^^^^^3.^^^^^^^.^^^^^^^^^^^XX
+D:X^^^^^^^^^^^^ff.^^^^^^^^^^^XX
+D:X^^^^^^^^^^^7gfg^^^^^^^^f^^XX
+D:X^^^^^^^^^^^^^^^^^^^..^..^^XX
+D:X^^^^^^^^^^^^.^^^^^^....ff^XX
+D:X^^^^...^^^^^ff^^^^^^..fg^^XX
+D:X^^^.fff^^^^gfg^^^^...fgee^^X
+D:X^^^^g5^^^^..8^^^^^f^fgfe,9^X
+D:X^^^^^^^^^^^^^^^^^^^^^^^^^^^X
+D:XXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+
+# Starting position
+P:3:3
diff --git a/lib/mods/theme/edit/wolves.map b/lib/mods/theme/edit/wolves.map
new file mode 100644
index 00000000..0e3030ea
--- /dev/null
+++ b/lib/mods/theme/edit/wolves.map
@@ -0,0 +1,55 @@
+# permanent wall
+F:X:61:0
+
+# granite
+F:#:57:0
+
+# up staircase
+F:<:6:0
+
+# Grass
+F:-:89:0
+
+# Dirt
+F:.:88:0
+
+# Trees
+F:t:96:0
+
+# Open door
+F:D:4:0
+
+# Broken door
+F:d:5:0
+
+# Grass with elf skeleton
+F:z:89:0:0:397
+
+# Dungeon layout
+D:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+D:X...t.---.......-.-.....-...#.--X
+D:X-..#..-......-.....--......t...X
+D:X...t.--.tt#ddt##t#dd#t#....#...X
+D:Xz-.t....#.--...#...-..#.--.t...X
+D:X#d##....#.z.z..t---...t....#tD#X
+D:X....---.t......t..-.z.#..z.....X
+D:X...--.-.#...z..#.--...t........X
+D:X##t#-z-.#####dd#dd##tt#....#t#tX
+D:X..-t.--.t....-.t...--.#.---t...X
+D:X.--t---.t......#..--z-#----#-..X
+D:X...D....#.--z...---.--t--.-d--.X
+D:X...#....#........---..#--..#z-.X
+D:X#t#t....t..-...t-z-...t....#tt#X
+D:X..-.....#-..-..#......#.....--.X
+D:X...-.--.#dd#ttt##t##Dd#.....--.X
+D:X#Dt#....#-.....#......#....##t#X
+D:X...#...-t----..#......t...-tz--X
+D:X.z.t...-#--.-..t......#.---#-..X
+D:X.--t.---#-z.--.#.....zt--..d-..X
+D:X---#....###dd#tt##dd###--..t...X
+D:X.z-t..-...-....-..-.--.....#<zzX
+D:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+
+# Starting position
+P:3:4
+
diff --git a/lib/mods/theme/file/book-0.txt b/lib/mods/theme/file/book-0.txt
new file mode 100644
index 00000000..5f317ff2
--- /dev/null
+++ b/lib/mods/theme/file/book-0.txt
@@ -0,0 +1,86 @@
+
+ Ted Sandyman's Important Compendium of Deep Thought.
+ ------------------------------------------------
+
+If they ever come up with a swashbuckling School, I think one of the
+courses should be Laughing, Then Jumping Off Something.
+
+It takes a big man to cry, but it takes a bigger man to laugh at that man.
+
+The people in the village were real poor, so none of the children had
+any toys. But this one little boy had gotten an old enema bag and
+filled it with rocks, and he would go around and whap the other
+children across the face with it. Man, I think my heart almost
+broke. Later the boy came up and offered to give me the toy. This was
+too much! I reached out my hand, but then he ran away. I chased him
+down and took the enema bag. He cried a little, but that's the way of
+these people.
+
+Dad always thought laughter was the best medicine, which I guess is
+why several of us died of tuberculosis.
+
+Maybe in order to understand mankind, we have to look at the word
+itself: "Mankind". Basically, it's made up of two separate words -
+"mank" and "ind". What do these words mean? It's a mystery, and
+that's why so is mankind.
+
+Ambition is like a frog sitting on a Venus Flytrap. The flytrap can
+bite and bite, but it won't bother the frog because it only has little
+tiny plant teeth. But some other stuff could happen and it could be
+like ambition.
+
+I'd rather be rich than stupid.
+
+We tend to scoff at the beliefs of the ancients. But we can't scoff at
+them personally, to their faces, and this is what annoys me.
+
+Probably the earliest flyswatters were nothing more than some sort of
+striking surface attached to the end of a long stick.
+
+As the evening sky faded from a salmon color to a sort of flint gray,
+I thought back to the salmon I caught that morning, and how gray he
+was, and how I named him Flint.
+
+When I was a kid my favorite relative was Uncle Caveman. After school
+we'd all go play in his cave, and every once in a while he would eat
+one of us. It wasn't until later that I found out that Uncle Caveman
+was a bear.
+
+Why do there have to be rules for everything? It's gotten to the point
+that rules dominate just about every aspect of our lives. In fact, it
+might be said that rules have become the foot-long sticks of mankind.
+
+If I had a mine shaft, I don't think I would just abandon it. There's
+got to be a better way.
+
+If I had a nickname, I think I would want it to be "Prince of
+Weasels", because then I could go up and bite people and they would
+turn around and go, "What the-?" And then they would recognize me, and
+go, "Oh, it's you, the Prince of Weasels."
+
+It's amazing to me that one of the world's most feared diseases would
+be carried by one of the world's smallest animals: the real tiny
+dog.
+
+Sometimes life seems like a dream, especially when I look down and see
+that I forgot to put on my pants.
+
+I bet it was pretty hard to pick up girls if you had the Black Death.
+
+It's fascinating to think that all around us there's an invisible
+world we can't even see. I'm speaking, of course, of the World of the
+Invisible Scary Skeletons.
+
+Whenever I hear the sparrow chirping, watch the woodpecker chirp,
+catch a chirping trout, or listen to the sad howl of the chirp rat, I
+think: Oh boy! I'm going insane again.
+
+He was the kind of man who was not ashamed to show affection. I guess
+that's what I hated about him.
+
+The next time I have meat and mashed potatoes, I think I'll put a very
+large blob of potatoes on my plate with just a little piece of
+meat. And if someone asks me why I didn't get more meat, I'll just
+say, "Oh, you mean this?" and pull out a big piece of meat from inside
+the blob of potatoes, where I've hidden it. Good magic trick, huh?
+
diff --git a/lib/mods/theme/file/book-1.txt b/lib/mods/theme/file/book-1.txt
new file mode 100644
index 00000000..b1aa102f
--- /dev/null
+++ b/lib/mods/theme/file/book-1.txt
@@ -0,0 +1,83 @@
+
+ Ted Sandyman's Important Compendium of Deep Thought, Vol. 2
+ -------------------------------------------------------
+
+
+It makes me mad when people say I turned and ran like a scared
+rabbit. Maybe it was like an angry rabbit, who was running to go fight
+in another fight, away from the first fight.
+
+Perhaps, if I am very lucky, the feeble efforts of my lifetime will
+someday be noticed, and maybe, in a small way, they will be acknowledged
+as the greatest works of genius ever created by Man.
+
+Sometimes I think I'd be better off dead. No, wait, not me, you.
+
+If you ever catch on fire, try to avoid looking in a mirror, because I
+bet that will really throw you into a panic.
+
+Children need encouragement. If a kid gets an answer right, tell him
+it was a lucky guess. That way he develops a good, lucky feeling.
+
+The crows seemed to be calling his name, thought Caw.
+
+If your friend is already dead, and being eaten by vultures, I think
+it's okay to feed some bits of your friend to one of the vultures, to
+teach him to do some tricks. But only if you're serious about adopting
+the vulture.
+
+Broken promises don't upset me. I just think, why did they believe me?
+
+One thing vampire children have to be taught early on is, don't run
+with a wooden stake.
+
+Consider the daffodil. And while you're doing that, I'll be over here,
+looking through your stuff.
+
+I think my new thing will be to try to be a real happy guy. I'll just
+walk around being real happy until some jerk says something stupid to
+me.
+
+I hope some animal never bores a hole in my head and lays its eggs in
+my brain, because later you might think you're having a good idea but
+it's just eggs hatching.
+
+Whenever you read a good book, it's like the author is right there, in
+the room talking to you, which is why I don't like to read good books.
+
+What is it about a beautiful sunny afternoon, with the birds singing
+and the wind rustling through the leaves, that makes you want to get
+drunk?
+
+Instead of a trap door, what about a trap window? The guy looks out
+it, and if he leans too far, he falls out. Wait. I guess that's like a
+regular window.
+
+If I ever get real rich, I hope I'm not real mean to poor people, like
+I am now.
+
+Most of the time it was probably real bad being stuck down in a
+dungeon. But some days, when there was a bad storm outside, you'd look
+out your little window and think, "Boy, I'm glad I'm not out in that."
+
+Sometimes you have to be careful when selecting a new name for
+yourself. For instance, let's say you have chosen the nickname "Fly
+Head." Normally you would think that "Fly Head" would mean a person
+who has beautiful swept-back features, as if flying through the
+air. But think again. Couldn't it also mean "having a head like a
+fly"? I'm afraid some people might actually think that.
+
+I hope that after I die, people will say of me: "That guy sure owed me
+a lot of money."
+
+The tired and thirsty prospector threw himself down at the edge of the
+watering hole and started to drink. But then he looked around and saw
+skulls and bones everywhere. "Uh-oh," he thought. "This watering hole
+is reserved for skeletons."
+
+Anytime I see something screech across a room and latch onto someone's
+neck, and the guy screams and tries to get it off, I have to laugh,
+because what is that thing.
+
+I hope life isn't a big joke, because I don't get it.
+
diff --git a/lib/mods/theme/file/book-10.txt b/lib/mods/theme/file/book-10.txt
new file mode 100644
index 00000000..995c2453
--- /dev/null
+++ b/lib/mods/theme/file/book-10.txt
@@ -0,0 +1,75 @@
+ ------------------------
+ | Monstrous Compendium 2 |
+ | Mostly never-moving |
+ ------------------------
+
+ *** Floating eyes (e) ***
+
+Strange disembodied eyes, floating around the dungeon. Some
+of them are comparatively harmless (such as the [[[[[oFloating eyes],
+[[[[[RRadiation eyes], [[[[[rBloodshot eyes], and [[[[[vDisenchanter eyes]),
+others moderately dangerous (such as the [[[[[DEvil eyes], [[[[[sGauths],
+[[[[[gGas spores], and [[[[[BSpectators]), yet others extremely deadly -
+these include the [[[[[UBeholders], [[[[[uUndead beholders], [[[[[bEyes of the]
+[[[[[bdeep], and the [[[[[yBeholder hive-mothers]. Whatever you do, do
+not get too close to them
+
+
+ *** Jellies (j) ***
+
+You will sometimes encounter large quavering piles of flesh
+just lying around the dungeon or making their way along the
+walls. They all have different defense mechanisms, which with
+time an adventurer will learn to recognise by looking at their
+colour. Among the less dangerous types are [[[[[wWhite jellies], [[[[[rRed]
+[[[[[rjellies], [[[[[bBlue jellies], [[[[[vGrape jellies], [[[[[gGreen jellies], [[[[[WSilver]
+[[[[[Wjellies], [[[[[yYellow jellies], [[[[[oSpotted jellies], and [[[[[uRot jellies].
+Considerably more dangerous are the [[[[[DUndead masses] and [[[[[UOchre]
+[[[[[Ujellies], as well as [[[[[DBlack puddings]. Among the moving jellies,
+watch out for [[[[[gGreen oozes], [[[[[bBlue oozes], [[[[[DBlack oozes], [[[[[GGelatinous]
+[[[[[Gcubes], [[[[[RGibbering mouthers], and [[[[[BAcidic cytoplasms].
+
+ *** Molds (m) ***
+
+Molds are strange growths on the dungeon floor which have
+developed defense mechanisms to deal with anyone who tries
+to disturb them. They come in many varieties and prefer
+different habitats, and some of them can be quite dangerous
+because they have rudimentary mastery of the elements. The
+most common varieties of mold are the [[[[[sGrey mold], the [[[[[rRed]
+[[[[[rmold], the [[[[[oHairy mold], the [[[[[gGreen mold], the [[[[[uBrown mold],
+the [[[[[yYellow mold], the [[[[[wWhite mold], and the [[[[[WSilver mold].
+More rare are [[[[[vDisenchanter molds], [[[[[bShimmering molds], [[[[[RPink]
+[[[[[Rmolds], [[[[[GTree molds], and [[[[[BBlue molds]. A very rare and dire
+creature is the [[[[[DDeath mold] - unwary adventurers beware! The
+[[[[[UAdventurer molds] are friendly towards their fellows, but
+not very strong.
+
+ *** Mushroom patches (,) ***
+
+You'd think it safe to eat them - you'd be wrong. Mushroom
+patches are masters of disguise and can cause quite a bit
+of damage to unwary adventurers. Fortunately, most of them
+are extremely weak and can be destroyed quickly if you can
+just get close enough. The commonly found varieties include
+the [[[[[sgrey], [[[[[Bclear], [[[[[vpurple], [[[[[ospotted], [[[[[yyellow], [[[[[Rshrieker], [[[[[Ddark],
+[[[[[wwhite], [[[[[ubrown], [[[[[Wsilver], and [[[[[Ggreen] mushroom patches. More rare
+are [[[[[gshambling mounds], [[[[[Bmagic mushroom patches], [[[[[rblood sprouts],
+and [[[[[bmemory mosses].
+
+ *** Quylthulgs (Q) ***
+
+Strange pulsing mounds of flesh that looks utterly harmless.
+As with any other monster, however, looks are very deceiving
+when it comes to the [[[[[yQuylthulgs]. They are expert at asking
+for other creatures' help, as weall as conveyance magic. The
+only friendly type is the [[[[[wAdventurer quylthulg] - these have
+many friends among their own kin. The [[[[[vNexus quylthulg] is
+unmatched in conveyance magic; you will have trouble getting
+close to it. The other quylthulgs usually prefer to call for
+aid, and you can tell what kind of creatures are likely to
+come to its call, usually. There are [[[[[DSpider], [[[[[sCanine], [[[[[bAquatic],
+[[[[[uRotting], [[[[[gDraconic], [[[[[rDemonic], [[[[[UGreater rotting], [[[[[Ggreater]
+[[[[[GDraconic], [[[[[RGreater demonic], and [[[[[BMaster quylthulgs].
+
+
diff --git a/lib/mods/theme/file/book-101.txt b/lib/mods/theme/file/book-101.txt
new file mode 100644
index 00000000..e45865a7
--- /dev/null
+++ b/lib/mods/theme/file/book-101.txt
@@ -0,0 +1,4 @@
+nalo means shadow
+ure means sun
+ido means now
+nimir means shine or elf
diff --git a/lib/mods/theme/file/book-102.txt b/lib/mods/theme/file/book-102.txt
new file mode 100644
index 00000000..3b737923
--- /dev/null
+++ b/lib/mods/theme/file/book-102.txt
@@ -0,0 +1,4 @@
+gimli means star
+kadar means city
+izindi means starlight
+lomi means night
diff --git a/lib/mods/theme/file/book-103.txt b/lib/mods/theme/file/book-103.txt
new file mode 100644
index 00000000..0ffeea37
--- /dev/null
+++ b/lib/mods/theme/file/book-103.txt
@@ -0,0 +1,6 @@
+attu means father
+aru means king
+bawiba means wind
+dulgi means black
+balik means ships
+daira means Earth
diff --git a/lib/mods/theme/file/book-104.txt b/lib/mods/theme/file/book-104.txt
new file mode 100644
index 00000000..3b60e8ca
--- /dev/null
+++ b/lib/mods/theme/file/book-104.txt
@@ -0,0 +1,6 @@
+naur means fire
+mellon means friend
+Edain means Dunedain
+pedo means speak
+Pheriain means Halflings
+a minno means and enter
diff --git a/lib/mods/theme/file/book-105.txt b/lib/mods/theme/file/book-105.txt
new file mode 100644
index 00000000..f3667d64
--- /dev/null
+++ b/lib/mods/theme/file/book-105.txt
@@ -0,0 +1,7 @@
+baraz means red
+Baruk means Axes
+dum means halls
+Khazad means Dwarves
+gabil means great
+aimenu means upon you
+gathol means fortress
diff --git a/lib/mods/theme/file/book-106.txt b/lib/mods/theme/file/book-106.txt
new file mode 100644
index 00000000..81c4043c
--- /dev/null
+++ b/lib/mods/theme/file/book-106.txt
@@ -0,0 +1,5 @@
+dori means land
+hrassa means precipice
+Danas means Green-elves
+dunna means black
+garma means wolf
diff --git a/lib/mods/theme/file/book-107.txt b/lib/mods/theme/file/book-107.txt
new file mode 100644
index 00000000..1abc6d8e
--- /dev/null
+++ b/lib/mods/theme/file/book-107.txt
@@ -0,0 +1,6 @@
+nazg means ring
+ghash means fire
+snaga means slave
+burz means black
+ronk means pool
+bubhosh means great
diff --git a/lib/mods/theme/file/book-11.txt b/lib/mods/theme/file/book-11.txt
new file mode 100644
index 00000000..5d211818
--- /dev/null
+++ b/lib/mods/theme/file/book-11.txt
@@ -0,0 +1,51 @@
+ ------------------------
+ | Monstrous Compendium 3 |
+ | Insects |
+ ------------------------
+
+ *** Ants (a) ***
+
+Ants are worker six-legged insects, and adventurers will
+encounter many different kinds of these on their travels.
+The [[[[[uSoldier ants] and [[[[[oGiant army ants] are just your
+garden-variety ants, and there are also [[[[[UTermites], which
+breed very quickly, and [[[[[BAquatic ants], which have adapted
+to living underwater. The majority of ants, however, come
+from different families, with rudimentary mastery of the
+elements - they vary from [[[[[wwhite], [[[[[rred], [[[[[sgrey], [[[[[Wsilver],
+[[[[[Dblack], and [[[[[yyellow] to [[[[[bblue], [[[[[Rfire], [[[[[gtree], and
+[[[[[Ggreen].
+
+ *** Flying insects (I) ***
+
+There are many different kinds of flying insects in Middle-
+earth - some, like [[[[[BButterflies], are harmless, others are
+only slightly dangerous (like [[[[[WMoths], [[[[[uInsect swarms], and
+[[[[[sGiant fleas]). Yet others are serious nuisances due to their
+explosive breeding, among them are [[[[[gNeekerbreekers], [[[[[GGiant]
+[[[[[Gfruit flies], [[[[[DGiant black midges] and [[[[[wGiant white midges].
+Adventurers should be wary of [[[[[yHummerhorns], [[[[[oKiller bees],
+[[[[[rGiant fireflies], and [[[[[UFlies of Mordor].
+
+ *** Dragonflies (F) ***
+
+Large insects with dazzling wings, the dragonflies inhabit
+many different areas on Middle-earth. Among them are giant
+[[[[[Baquatic], [[[[[ygold], [[[[[sblack], [[[[[Ubronze], [[[[[Ggreen], [[[[[wwhite], [[[[[oswamp], [[[[[rred],
+[[[[[gforest], [[[[[bblue], [[[[[ubrown], [[[[[Wsilver], [[[[[vviolet], and [[[[[Rpink] ones -
+all with rudimentary command of some of the elements. The
+[[[[[DDeath dragonflies] are worth watching out for.
+
+ *** Spiders (S) ***
+
+Ugly eight-legged creatures, the spiders tend to travel in
+packs, and are thus to be reckoned with. The weaker species
+include the [[[[[BPhase spiders], [[[[[DCave spiders], [[[[[WGiant spiders], and
+[[[[[UWood spiders] - these are only dangerous to very inexperienced
+adventurers. The [[[[[RGiant fire ticks], uGiant brown ticks], [[[[[oGiant]
+[[[[[otarantulas], [[[[[wGiant white ticks], [[[[[sGiant grey scorpions], [[[[[rGiant]
+[[[[[rred scorpions], and [[[[[yGiant yellow scorpions] are more dangerous
+than their smaller cousins. The most dangerous of all spiders
+are the aquatic [[[[[gMurk dwellers], the [[[[[rAraneas], the [[[[[bDriders], the
+dreadful [[[[[GMirkwood spiders], and the powerful [[[[[vElder araneas].
+
diff --git a/lib/mods/theme/file/book-12.txt b/lib/mods/theme/file/book-12.txt
new file mode 100644
index 00000000..07b5267d
--- /dev/null
+++ b/lib/mods/theme/file/book-12.txt
@@ -0,0 +1,68 @@
+ ------------------------
+ | Monstrous Compendium 4 |
+ | Animals |
+ ------------------------
+
+
+ *** Cattle (c) ***
+
+Mostly domesticated four-legged beasts of burden, these
+animals will not bother you unless you bother them first.
+In fact, [[[[[wSheep], [[[[[uCows], [[[[[sHorses], [[[[[WMearas], [[[[[yPonies], [[[[[DOxen],
+[[[[[rKine of Araw], and [[[[[UDeer] will tend to ignore adventurers
+completely. [[[[[oBoars], however, are a different matter. They
+have strong legs and fierce tusks, which they will use
+against anyone who stumbles into their territory.
+
+ *** Canines (C) ***
+
+Four-legged animals with shaggy fur. Most of them are not
+very dangerous - in fact, the [[[[[sScruffy little dogs] will
+not do much except growl, and [[[[[yJackals] can be deadly against
+very weak adventurers, but will not hold their own against
+even moderately experienced ones. [[[[[oFoxes], [[[[[uWolves], [[[[[wWhite]
+[[[[[wwolves], and [[[[[BBlink dogs] can be a nuisance, but not overmuch.
+The evil [[[[[gWolf chieftains], [[[[[DWerewolves], [[[[[DWargs], [[[[[RHellhounds],
+and [[[[[rGreater Hellhounds], however, are very dangerous.
+
+ *** Felines (f) ***
+
+Lithe, four-legged animals with sleek fur and sharp claws.
+The [[[[[WScrawny cat] lives in the town and tends to walk by
+itself. The [[[[[UWild cats], [[[[[gTree cats], and [[[[[bNight cats] are all
+quite menacing, but only dangerous in packs. The powerful
+[[[[[DPanthers], [[[[[oTigers], [[[[[wSnow tigers], and [[[[[ySabre-tooth tigers]
+are not to be toyed with. The [[[[[uLeopards] and [[[[[RLions] are the
+strongest of all the feline monsters.
+
+ *** Quadrupeds (q) ***
+
+Four-legged creatures of varying breeds, these monsters
+are all quite large and fierce - their bulk alone is
+enough to intimidate you. The weakest are the [[[[[yApes], who
+make a lot of noise but aren't very dangerous. The [[[[[WOld]
+[[[[[Wbears] just want everyone to leave them alone. There are
+many other different kinds of bears, among them the
+[[[[[uCave bears], [[[[[rWar bears], [[[[[UGrizzly bears], [[[[[wPolar bears],
+[[[[[bBlue bears], [[[[[RFire bears], [[[[[BAquatic bears], and [[[[[DWerebears].
+The [[[[[sMumakil] are gigantic elephantine forms, stomping all
+over the dungeon and waving their tusks threateningly. The
+[[[[[GNight mares] are fearsome skeletal horses with glowing eyes.
+The [[[[[gCatoblepas] are strange ox-like forms with huge heads but
+thin, weak necks. The [[[[[oRust monsters] are weird, small animals
+that look perpetually hungry.
+
+ *** Birds (B) ***
+
+There are many different types of birds on Middle-earth,
+and the [[[[[RChaffinches], [[[[[WSparrows], [[[[[BNightingales], [[[[[UThrushes],
+[[[[[WRavens], [[[[[oGulls], [[[[[rEagles], and [[[[[rGreat eagles] will not harm
+anyone who does not harm them first. The [[[[[wSwans] hold a very
+special place with the Valar, and woe be to anyone who
+knowingly harms a Swan. However, not all birds are harmless.
+The [[[[[RKirinki] can wake up entire towns with their shrill cry,
+The [[[[[sCrows] and [[[[[DCrebain] are ever hungry for carrion, as are
+[[[[[GGorcrows]. The [[[[[uHunting hawks] seek prey without regard for
+friend or foe. The [[[[[DWinged Horrors] are not quite birds, they
+are Great Eagles corrupted by Morgoth to serve his ends.
+
diff --git a/lib/mods/theme/file/book-13.txt b/lib/mods/theme/file/book-13.txt
new file mode 100644
index 00000000..faa7071b
--- /dev/null
+++ b/lib/mods/theme/file/book-13.txt
@@ -0,0 +1,54 @@
+ ------------------------
+ | Monstrous Compendium 5 |
+ | Fliers and Crawlers |
+ ------------------------
+
+
+ *** Bats (b) ***
+
+Small flying creatures with webbed wings and sharp teeth.
+The [[[[[ofruit bats] are the weakest of them all. Other kinds
+include [[[[[Utan], [[[[[ubrown], [[[[[wsnow], [[[[[sgrey], [[[[[Wsilver], [[[[[yyellow], [[[[[Ggreen],
+[[[[[rred dragon], [[[[[bblue dragon], and [[[[[vdisenchanter bats]. The most
+dangerous of this race the [[[[[BMongbats], [[[[[dVampire bats], [[[[[gBats]
+[[[[[gof Gorgoroth], and [[[[[RDoombats].
+
+ *** Rodents (R) ***
+
+Small chittering creatures with quick feet and sharp teeth.
+The [[[[[Uwild rabbits] are utterly harmless unless angered, as
+are [[[[[oSquirrels]. The various giant mice ([[[[[wwhite], [[[[[Bsilver], [[[[[rred],
+[[[[[bblue], and [[[[[yyellow]) and rats ([[[[[Wwhite], [[[[[sgrey], [[[[[Rpink], and [[[[[Gtree])
+are somewhat dangerous, as they tend to run in large packs.
+The [[[[[urock moles], [[[[[Dwererats], and [[[[[gsquirrels of Mirkwood] are
+among the more dangerous rodents.
+
+
+ *** Snakes (J) ***
+
+Fast and stealthy creatures that slither along the floor. The
+[[[[[Ueels] are harmless, except when angered. The large [[[[[bblue], [[[[[Wsilver],
+[[[[[vpurple], [[[[[Rred], [[[[[sgrey], [[[[[yyellow], [[[[[ubrown], and [[[[[wwhite] snakes are
+somewhat dangerous. The [[[[[rRattlesnakes], [[[[[oCopperhead] snakes,
+[[[[[DBlack mambas], and [[[[[gKing cobras] are quite dangerous and fierce.
+The aquatic [[[[[BElectric eels] and [[[[[GLimlugs] (sea serpents) are
+among the most dangerous of their kind.
+
+ *** Beetles (K) ***
+
+Very large insects with tough carapaces. Most of them are not
+too dangerous. They come in the following varieties: [[[[[wwhite],
+[[[[[ubrown], [[[[[rred], [[[[[sgray], [[[[[oorange], [[[[[bblue], [[[[[Wsilver], [[[[[Ggreen], [[[[[Utree],
+[[[[[Rfire], [[[[[gstag], [[[[[Baquatic], [[[[[yslicer], [[[[[viridescent], and [[[[[Ddeath watch].
+
+
+ *** Reptiles (R) ***
+
+The majority of reptiles found on Middle-earth are not very
+dangerous - these include the [[[[[ynewts], [[[[[ucave lizards], [[[[[Urock lizards],
+[[[[[bnight lizards], [[[[[Bblue lizards], [[[[[oswamp lizards], [[[[[rgiant pink frogs],
+[[[[[ggiant green frogs], [[[[[wsnow-frogs], and [[[[[Wgiant silver frogs]. The
+[[[[[Rgiant salamanders] and [[[[[Ggiant turtles] should be approached
+with caution, while the [[[[[sbasilisks] and [[[[[Dgreater basilisks] are
+extremely dangerous and should not be toyed with!
+
diff --git a/lib/mods/theme/file/book-14.txt b/lib/mods/theme/file/book-14.txt
new file mode 100644
index 00000000..eb79aa38
--- /dev/null
+++ b/lib/mods/theme/file/book-14.txt
@@ -0,0 +1,55 @@
+ ------------------------
+ | Monstrous Compendium 6 |
+ | Morgoth's minions |
+ ------------------------
+
+ *** Orcs (o) ***
+
+Squat, swarthy creatures rumoured to have been Elves once.
+The [[[[[Usnotlings] and [[[[[osnaga] are the lowest form of Orc, weak
+but dangerous in packs. There are different breeds of Orc,
+depending on their dwelling-place: [[[[[uHill orcs], [[[[[GCave orcs],
+and [[[[[Dblack orcs]. The [[[[[sHalf-orcs] are a cross-breed of Orcs
+and humans. The [[[[[BUruk-hai] are a stronger breed, they can
+bear the light of the sun. The [[[[[wElite] uruks are the most
+dangerous kind of Orc there is.
+
+ *** Ogres (O) ***
+
+Monstrous and destructive creatures of legend and folklore.
+The [[[[[wOgrillon] is a cross-breed of an Orc and an Ogre, and
+the [[[[[oHalf-ogre] is a cross between an Ogre and a human. The
+garden-variety [[[[[UOgres] are more common than their [[[[[gForest]-
+dwelling, [[[[[sMountain]-dwelling, and [[[[[uCave]-dwelling cousins.
+The [[[[[DBlack ogres] shy away from the sun, the [[[[[BMerrows] live
+in or near water. There are some [[[[[yRebel ogres] who have
+turned against their plundering fellows and will try to aid
+adventurers.
+
+ *** Giants (P) ***
+
+Enormous humanoids with powerful muscles, aligned with evil.
+There are [[[[[WStone giants], [[[[[BStorm giants], [[[[[rFire giants], [[[[[wFrost]
+[[[[[wgiants], and [[[[[UHill giants] - while very large and dangerous,
+they pale in comparison to the much stronger [[[[[uCyclops], [[[[[bCloud]
+[[[[[bgiants], and the terrifying [[[[[sRock giants]. The [[[[[yLesser titans]
+and [[[[[oGreater titans] are in a class of their own, their power
+and magical abilities unmatched by any. The [[[[[RRebel giants] are
+those who have broken with the forces of Darkness.
+
+ *** Trolls (T) ***
+
+Lumbering evil creatures originated in mockery of the Ents.
+The [[[[[UHalf-trolls] are bizarre crosses between trolls and Men.
+The [[[[[uCave-trolls], [[[[[wSnow-trolls], [[[[[sHill trolls], [[[[[gForest trolls],
+[[[[[BWater trolls], and [[[[[WStone trolls] are dangerous and usually
+move in large groups. Even more dangerous are the [[[[[oAlgroths],
+the [[[[[yOlog-hai], and the [[[[[BScrags]. The [[[[[RWar trolls], [[[[[rEldraks], and
+[[[[[bEttins] can only be described as killing machines.
+
+ *** Yeeks (y) ***
+
+Small humanoid figures whose origin lies outside Middle-earth.
+There are [[[[[Bblue], [[[[[ubrown], [[[[[Ddark], [[[[[wwhite], [[[[[sgray], and [[[[[yyellow]
+Yeeks. The [[[[[gmaster yeeks] are somewhat proficient at magic, and
+[[[[[Uadventurer yeeks] will try to help you. \ No newline at end of file
diff --git a/lib/mods/theme/file/book-15.txt b/lib/mods/theme/file/book-15.txt
new file mode 100644
index 00000000..21983f48
--- /dev/null
+++ b/lib/mods/theme/file/book-15.txt
@@ -0,0 +1,68 @@
+ ------------------------
+ | Monstrous Compendium 7 |
+ | Dragons and Worms |
+ ------------------------
+
+ *** Worms (w) ***
+
+Large slimy masses of worms crawl all around dungeons.
+There are [[[[[Bclear], [[[[[rred], [[[[[bblue], [[[[[ggreen], [[[[[wwhite], [[[[[yyellow],
+[[[[[Dnether], and [[[[[vdisenchanter] worm masses. Additionally,
+there are [[[[[Ugiant slugs] and [[[[[ugiant leeches] which are more
+dangerous than the worm masses. The [[[[[vpurple worms] and
+[[[[[ysandworms] are even more dangerous, and then there are
+the [[[[[uwereworms], huge wormlike shapes dripping acid.
+
+ *** Dragon worms (w) ***
+
+These will eventually grow into dragons, unless killed.
+There are [[[[[Rred], [[[[[Bblue], [[[[[Ggreen], [[[[[Wwhite], [[[[[sblack], [[[[[ygold],
+[[[[[ubronze], and [[[[[vmulti-hued ones].
+
+ *** Hatchling dragons (d) ***
+
+The [[[[[opseudo-dragon] is a small relative of the dragon that
+inhabits dark caves. The hatchling dragons are newly-born,
+still soft, with eyes unaccustomed to light and scales
+shimmering with a hint of colour: [[[[[rred], [[[[[bblue], [[[[[ggreen],
+[[[[[wwhite], [[[[[sblack], [[[[[Ubronze], [[[[[ygold], and [[[[[vmulti-hued]. There are
+also the aquatic [[[[[WHatchling dragon turtles].
+
+
+ *** Young dragons (d) ***
+
+The young dragons sport still-tender scales, coloured more
+brightly than those of the Hatchling dragons: [[[[[rred], [[[[[bblue],
+[[[[[ggreen], [[[[[wwhite], [[[[[sblack], [[[[[Ubronze], [[[[[ygold], and [[[[[vmulti-hued].
+The [[[[[Wyoung dragon turtles] live in or near water.
+
+ *** Drakes (d) ***
+
+These dragons are already mature, and their scales are very
+brightly covered, according to the elements each dragon
+draws its power from. There are [[[[[rFire-drakes], [[[[[bBlue drakes],
+[[[[[gGreen drakes], [[[[[wCold-drakes], [[[[[sBlack drakes], [[[[[UBronze drakes],
+[[[[[yGolden drakes], [[[[[vMulti-hued drakes], [[[[[vBalance drakes], [[[[[vLaw]
+[[[[[vdrakes], [[[[[vChaos drakes], [[[[[uCrystal drakes], [[[[[oEthereal drakes],
+[[[[[GShadow drakes], and [[[[[sMature dragon turtles].
+
+
+ *** Ancient dragons (D) ***
+
+These dragons are very old, cunning, and powerful. They are
+considerably larger than the drakes, and they too draw their
+colouring from their elements: [[[[[rred], [[[[[bblue], [[[[[ggreen], [[[[[wwhite],
+[[[[[sblack], [[[[[Ubronze], [[[[[ygold], and [[[[[vmulti-hued]. In addition, there
+are the [[[[[GDeath drakes], [[[[[UGreat crystal drakes], [[[[[oAncient ethereal]
+[[[[[odrakes], [[[[[BSky drakes], and [[[[[WAncient dragon turtles].
+
+ *** Greater dragons (D) ***
+
+The mightiest and most powerful of dragonkind, these beasts
+are older than time itself. Their very names instill fear into
+your very soul: the [[[[[rGreat Worm of Fire], the [[[[[bGreat Storm Worm],
+the [[[[[gGreat Swamp Worm], the [[[[[wGreat Ice Worm], the [[[[[sGreat Bile Worm],
+the [[[[[UGreat Worm of Perplexity], the [[[[[yGreat Worm of Thunder],
+the [[[[[vGreat Worm of Many Colours], the [[[[[GFastitocalon], the [[[[[vGreat]
+[[[[[vWorm of Balance], the [[[[[RDracolisk], the [[[[[vGreat Worm of Chaos], the
+[[[[[GDracolich], the [[[[[BGreat Worm of Law], and the [[[[[vGreat Wyrm of Power].
diff --git a/lib/mods/theme/file/book-16.txt b/lib/mods/theme/file/book-16.txt
new file mode 100644
index 00000000..e19b7b0b
--- /dev/null
+++ b/lib/mods/theme/file/book-16.txt
@@ -0,0 +1,43 @@
+ -------------------------
+ | Monstrous Compendium 8 |
+ | Depth dwellers, hybrids |
+ -------------------------
+
+ *** Nagas (n) ***
+
+Giant snake-like figures with a woman's torso. There are
+[[[[[ggreen], [[[[[Rred], [[[[[Dblack], [[[[[Bwater], [[[[[oswamp], [[[[[ubrown], [[[[[Wsilver],
+[[[[[vnight], [[[[[Gtree], [[[[[sdark], [[[[[bocean], [[[[[yguardian], and [[[[[wspirit nagas].
+The [[[[[Uadventurer nagas] are friendly to their fellows.
+
+ *** Hydras (M) ***
+
+Strange reptilian creatures with several heads, guarding
+treasure hoards. There are [[[[[u2-headed], [[[[[o3-headed], [[[[[y4-headed],
+[[[[[g5-headed], [[[[[w6-headed], [[[[[G7-headed], [[[[[s8-headed], [[[[[r9-headed],
+[[[[[b10-headed], [[[[[R11-headed], [[[[[W12-headed], [[[[[v13-headed], [[[[[B14-headed],
+[[[[[U15-headed], as well as [[[[[DKiller hydras].
+
+ *** Hybrids (H) ***
+
+These creatures are all crosses between two (or sometimes
+more) different beings. The [[[[[wWhite harpies], [[[[[DBlack harpies],
+and [[[[[oOwlbears] are not very dangerous. The [[[[[UHippogryphs],
+[[[[[uGriffons], [[[[[RGorgimaerae], [[[[[BBehemoths], [[[[[rChimaerae], [[[[[yManticores],
+and [[[[[GSphinxes] are more dangerous and deadly. The [[[[[bGorgons],
+[[[[[WHeadless], [[[[[gSwamp things], and [[[[[vJabberwocks] are the deadliest.
+
+ *** Depth dwellers (~) ***
+
+These creatures inhabit the oceans, lakes, and seas of Arda.
+Along with the [[[[[BSand mites], [[[[[BBox jellyfish], [[[[[GBarracudas], and
+[[[[[RPiranhas] there are [[[[[yStargazers], [[[[[gOctopi], [[[[[WGlobefish], [[[[[sPikes],
+[[[[[sSwordfish], and [[[[[sFlounders]. More dangerous are [[[[[rGiant crayfish],
+[[[[[RGiant piranhas], and [[[[[gGiant squid]. Among the larger depth-
+dwellers, there are the [[[[[WHammerhead sharks], [[[[[oTiger sharks],
+[[[[[wWhite sharks], [[[[[oSeahorses], and [[[[[gGiant octopi]. The largest and
+more dangerous creatures include the [[[[[DWhales], [[[[[UElder stargazers],
+[[[[[wGreat white sharks], [[[[[uUndead stargazers], [[[[[GLesser Krakens],
+[[[[[wKiller whales], and [[[[[GGreater Krakens]. The most dangerous ocean
+dweller is the [[[[[vLeviathan].
+
diff --git a/lib/mods/theme/file/book-17.txt b/lib/mods/theme/file/book-17.txt
new file mode 100644
index 00000000..13aa439f
--- /dev/null
+++ b/lib/mods/theme/file/book-17.txt
@@ -0,0 +1,47 @@
+ ------------------------
+ | Monstrous Compendium 9 |
+ | Undead Creatures |
+ ------------------------
+
+ *** Mewlips (i) ***
+
+Mewlips are evil cannibal spirits from the marshlands.
+They come in different varieties: [[[[[wclear], [[[[[sgray], [[[[[oorange],
+[[[[[rbloodshot], [[[[[ggreen], [[[[[bblue], [[[[[ubrown], [[[[[Wstone], [[[[[yyellow], [[[[[Rpink],
+[[[[[Gtree], [[[[[Bair], [[[[[Uplague], and [[[[[Ddeath].
+
+
+ *** Golems (g) ***
+
+Massive animated statues made from different materials.
+There are [[[[[obronze], [[[[[wbone], [[[[[ueog], [[[[[Bmithril], [[[[[siron], [[[[[baquatic],
+[[[[[Wstone], [[[[[Uclay], [[[[[Rflesh], and [[[[[ffire golems], in addition to the
+more cunning [[[[[ycolbrans], [[[[[DPukelmen], [[[[[gdrolems], [[[[[Gcolossus], and
+[[[[[ssilent watchers].
+
+ *** Skeletons (s) ***
+
+There are skeletal forms of just about any monster that once
+inhabited Middle-earth. Some such forms, however, have never
+been alive in the first place - they are horrible abominations
+animated by powerful wizards. Among them are the [[[[[wice skeletons],
+[[[[[sflying skulls], [[[[[Dcrypt creeps], [[[[[yhand druj], [[[[[oskull druj], and
+[[[[[reye druj].
+
+ *** Zombies (z) ***
+
+Zombie forms of all living creatures may appear in the dungeons.
+However, some zombie-like undead from before the First Age do
+exist: [[[[[Ughouls], [[[[[ygreater mummies], [[[[[Dghoulkings], [[[[[ughasts], and
+[[[[[Rrotting corpses].
+
+ *** Vampires (V) ***
+
+There are vampire forms of just about any race - [[[[[Whuman], [[[[[Gelf], [[[[[Dorc],
+[[[[[wyeek], [[[[[oogre], [[[[[utroll], [[[[[Rdwarf], and [[[[[Bgnome]. The [[[[[sOriental vampires]
+come from beyond the land of Rhun. There are [[[[[bVampire lords], [[[[[rElder]
+[[[[[rvampires], and [[[[[gMaster vampires]. The [[[[[UAdventurer vampires] are those
+who have denounced the way of the Dark and attempt to follow a path
+of Light as best they can.
+
+
diff --git a/lib/mods/theme/file/book-18.txt b/lib/mods/theme/file/book-18.txt
new file mode 100644
index 00000000..36cbee04
--- /dev/null
+++ b/lib/mods/theme/file/book-18.txt
@@ -0,0 +1,55 @@
+ --------------------------
+ | Monstrous Compendium 10 |
+ | Demons and other Horrors |
+ --------------------------
+
+ *** Minor Demons (u) ***
+
+These demons (roeg) are corrupted forms of natural creatures.
+The individual types of demons are as follows: [[[[[bLimrog] (fish),
+[[[[[UCaborrog] (frog), [[[[[DLygrog] (snake), [[[[[oDraugrog] (wolf), [[[[[rHurog] (dog),
+[[[[[sSarnrog] (stone), [[[[[gNarrog] (rat), [[[[[yAewrog] (bird), [[[[[BRawrog] (lion),
+and [[[[[RAdanrog] (human).
+
+ *** Major Demons (u) ***
+
+The major demons are of two kinds - the spider demons, spawn of
+Ungoliant, and the Balroeg, corrupted Maiar. The spider demons
+are as follows: [[[[[gUngorrog] (power spider demon), [[[[[WHelcungol] (ice),
+[[[[[rNaurungol] (fire), [[[[[sMornungol] (black), and [[[[[BFaunungol] (cloud).
+There are also the [[[[[BGaurroeg] (water demons), [[[[[oMorgulroeg] (magic
+demons), [[[[[uDagorrog] (war demons), [[[[[ySererrog] (blood demons), and
+the [[[[[UMenelroeg] (sky demons). The Balroeg can be [[[[[RRed], [[[[[DBlack],
+[[[[[wWhite], and [[[[[bBlue] - commanded by [[[[[GBalrog Captains] and [[[[[vGreater]
+[[[[[vBalroeg].
+
+ *** Greater Undead (G) ***
+
+The ghosts are incorporeal beings with awesome magical powers.
+Some of them aren't very impressive, like the [[[[[gGreen glutton]
+[[[[[gghost] and the [[[[[sPoltergeist]. Others are deadlier - [[[[[wGhosts],
+[[[[[BPhantom beasts], [[[[[BDrowned souls], [[[[[BPhantom warriors], the [[[[[DShadows],
+[[[[[DPossessors], [[[[[DShades], and [[[[[USpectres]. The friendly [[[[[WSpirits] will
+try to help adventurers. The [[[[[bBanshee], [[[[[GSpirit troll], [[[[[vPhantom],
+[[[[[uHeadless ghost], and [[[[[uMoaning spirit] are all to be reckoned with.
+In a class of their own are the [[[[[oDreads], [[[[[rDreadlords], and the
+[[[[[yDreadmasters].
+
+ *** Liches (L) ***
+
+Yet another kind of powerful undead. Many things can take the form
+of a lich, but the [[[[[oLich], [[[[[GCrypt thing], [[[[[WIron lich], [[[[[rMaster lich],
+[[[[[uMonastic lich], [[[[[UDemilich], [[[[[BArchlich], [[[[[DBlack reaver], and [[[[[sLesser]
+[[[[[sblack reaver] all deserve special mention.
+
+
+ *** Wraiths (W) ***
+
+Wraiths are incorporeal beings frequently found in graveyards and
+at the sites of unavenged murders. There are [[[[[wWhite wraiths], [[[[[sGrey]
+[[[[[swraiths], [[[[[WSilver wraiths], [[[[[GNether wraiths], and [[[[[DBlack wraiths].
+The [[[[[UAdventurer wraiths] will try to help you. Fierce and magical
+are the many wights: [[[[[BBarrow wights], [[[[[gForest wights], [[[[[bGrave wights],
+[[[[[oSwamp wights], and [[[[[rEmperor wights]. The most dangerous among the
+wraith beings are the [[[[[uRevenant], [[[[[DNightwalker], [[[[[DNightcrawler], and
+[[[[[DNightwing]. \ No newline at end of file
diff --git a/lib/mods/theme/file/book-19.txt b/lib/mods/theme/file/book-19.txt
new file mode 100644
index 00000000..a36285f0
--- /dev/null
+++ b/lib/mods/theme/file/book-19.txt
@@ -0,0 +1,47 @@
+ -------------------------
+ | Monstrous Compendium 11 |
+ | Elemental creatures |
+ -------------------------
+
+ *** Vortices (v) ***
+
+These strange creatures are like localised tornadoes,
+carrying with them the various elements: [[[[[rfire], [[[[[benergy],
+[[[[[ggas], [[[[[wcold], [[[[[sacid], [[[[[ushards], [[[[[vnexus], [[[[[ymana], [[[[[Uconfusion],
+[[[[[Wslowness], [[[[[vchaos], [[[[[Gnether], [[[[[Rplasma], and [[[[[Btime]. Among
+these, the nastiest by far are the [[[[[vstorms of unmagic],
+as well as [[[[[oshimmering], [[[[[Ddeath], and [[[[[vaether] vortices.
+
+ *** Spirits (E) ***
+
+These are the spirits contained in various elements, they
+are weaker than the proper elementals. There are [[[[[rFire]
+[[[[[rspirits], [[[[[bWater spirits], [[[[[uEarth spirits], and [[[[[BAir spirits]
+alongside [[[[[WWill'o the wisps] and [[[[[yInvisible stalkers].
+
+ *** Elementals (E) ***
+
+Towering masses of raw elements, twisting and shaking all
+in their wake: [[[[[rfire], [[[[[bwater], [[[[[uearth], [[[[[Bair], [[[[[wice], [[[[[omagma],
+[[[[[Uconfusion], [[[[[Ddark], [[[[[Rsmoke], [[[[[gooze], [[[[[sslowness], [[[[[Gtime], and
+[[[[[vchaos].
+
+ *** Hulking figures (X, Y) ***
+
+These are strange hulking shapes that puzzle anyone who
+comes across them. They include the [[[[[sXaren], the [[[[[uXorn],
+[[[[[UUmber hulk], [[[[[DDeath hulk], [[[[[wWhite hulk], [[[[[oOrange hulk], [[[[[rFire]
+[[[[[rhulk], [[[[[gForest hulk], [[[[[bNight hulk], [[[[[WSilver hulk], [[[[[vChaos hulk],
+[[[[[yYellow hulk], [[[[[RRed hulk], [[[[[GGreen hulk], and [[[[[Bblue hulk]. The
+[[[[[sSasquatch] and [[[[[wYeti] resemble humans, but they are still
+quite strange.
+
+ *** Zephyr Hounds (Z) ***
+
+They are dog-like figures wreathed in the elements. They
+tend to move in packs, and are among the most vicious of
+all dungeon dwellers. The hounds may be: [[[[[Bclear], [[[[[rfire],
+[[[[[benergy], [[[[[gair], [[[[[wcold], [[[[[sacid], [[[[[vmulti-hued], [[[[[Ddark], [[[[[olight],
+[[[[[uearth], [[[[[Baquatic], [[[[[vnexus], [[[[[rwater], [[[[[Rplasma], [[[[[yvibration],
+[[[[[vchaos], [[[[[Gnether], [[[[[uimpact], [[[[[Winertia], [[[[[Ugravity], [[[[[Gethereal],
+[[[[[Btime], and [[[[[vaether]. \ No newline at end of file
diff --git a/lib/mods/theme/file/book-2.txt b/lib/mods/theme/file/book-2.txt
new file mode 100644
index 00000000..bfadd6ce
--- /dev/null
+++ b/lib/mods/theme/file/book-2.txt
@@ -0,0 +1,90 @@
+
+ Ted Sandyman's Important Compendium of Deep Thought, Vol. 3
+ -------------------------------------------------------
+
+
+I think my new thing will be to try to be a real happy guy. I'll just
+walk around being real happy until some jerk says something stupid to
+me.
+
+When you're going up the stairs and you take a step, kick the other
+leg up high behind you to keep people from following too close.
+
+I wonder if angels believe in ghosts.
+
+I don't understand people who say life is a mystery, because what is
+it they want to know?
+
+I think people tend to forget that trees are living creatures. They're
+sort of like dogs. Huge, quiet, motionless dogs, with bark instead of
+fur.
+
+Sometimes I think the world has gone completely mad. And then I think,
+"Aw, who cares?" And then I think, "Hey, what's for supper?"
+
+If a kid asks where rain comes from, I think a cute thing to tell him
+is "God is crying". And if he asks why God is crying, another cute
+thing to tell him is "Probably because of something you did".
+
+Contrary to popular belief, the most dangerous animal is not the lion
+or tiger or even the elephant. The most dangerous animal is a shark
+riding on an elephant, just trampling and eating everything they see.
+
+As I bit into the nectarine, it had a crisp juiciness about it that
+was very pleasurable- until I realized it wasn't a nectarine at all,
+but a HUMAN HEAD!!
+
+Anytime I see something screech across a room and latch onto someone's
+neck, and the guy screams and tries to get it off, I have to laugh,
+because what _is_ that thing?!
+
+If you define cowardice as running away at the first sign of danger,
+screaming and tripping and begging for mercy, then yes, Mister Brave
+Man, I guess I am a coward.
+
+Blow ye winds, like the trumpet blows, but without that noise.
+
+The face of a child can say it all, especially the mouth part of the face.
+
+When I heard that trees grow a new "ring" for each year they live, I
+thought, we humans are kind of like that; we grow a new layer of skin
+each year; and after many years we are thick and unwieldy from all our
+skin layers.
+
+It's too bad that whole families have been torn apart by something as
+simple as wild dogs.
+
+Even though he was an enemy of mine, I had to admit that what he had
+accomplished was a brilliant piece of strategy. First, he punched me,
+then he kicked me, then he punched me again.
+
+To me, truth is not some vague, foggy notion. Truth is real. And, at
+the same unreal. Fiction and fact and everything in-between, plus some
+things I can't remember, all rolled into one big "thing". This is
+truth, to me.
+
+If you're ever stuck in some thick undergrowth, in your underwear,
+don't stop and start thinking of what other words have "under" in
+them, because that's probably the first sign of jungle madness.
+
+Sometimes the beauty of the world is so overwhelming, I just want to
+throw back my head and gargle. Just gargle and gargle, and I don't
+care who hears me, because I am beautiful.
+
+We used to laugh at Grandpa when he'd head off to go fishing. But we
+wouldn't be laughing when he'd come back with some whore he picked up
+in town.
+
+I think in one of my previous lives I was a mighty king, because I
+like people that do what I say.
+
+A man doesn't automatically get my respect. He has to get down in the
+dirt and beg for it.
+
+People think it would be fun to be a bird because you could fly. But
+they forget the negative side, which is the preening.
+
+When I think back on all the blessings I have been given in my life, I
+can't think of a single one, unless you count that rattlesnake that
+granted me all those wishes.
+
diff --git a/lib/mods/theme/file/book-20.txt b/lib/mods/theme/file/book-20.txt
new file mode 100644
index 00000000..21418fe9
--- /dev/null
+++ b/lib/mods/theme/file/book-20.txt
@@ -0,0 +1,192 @@
+#####R /----------------------------------------\
+#####R < Adventurer's guide to the Middle-earth >
+#####R \----------------------------------------/
+
+Summary:
+*****/abook-20.txt*1[(a) The main towns and dungeons]
+*****/bbook-20.txt*2[(b) Other towns]
+*****/cbook-20.txt*3[(c) Other strange and frightening places]
+*****/dbook-20.txt*4[(d) Equipment issues]
+*****/ebook-20.txt*5[(e) Macros]
+
+#####GIntroduction:
+
+Middle-earth is vast and mysterious, full of dangers and rewards for
+the brave adventurer.
+
+New adventurers should know that pressing < and > can switch
+the wilderness view between a normal scale and a larger map. This map
+makes travelling faster, but you cannot enter wilderness dungeons from
+it, and chances of being ambushed are high. The wariest of adventurers
+will choose to take the well-worn roads when such roads are available,
+and grass fields when there are no roads. Beware of Belegaer and the
+Dead Marshes!
+
+
+~~~~~1
+#####G(a) The main towns and dungeons
+
+You start in a small village named Bree in the western part of Middle-earth.
+Here you will also find the entrance to the Barrow-Downs, a fairly safe and
+simple dungeon.
+
+When the Barrow-Downs become too easy for you, and Bree too small,
+you might consider going to Lothlorien, the land of Galadriel. [[[[[BNote that]
+[[[[[Byou should take a lot of food with you, for it is a long journey.]
+You'll have to head south-east following the Moria mountain's chain, then
+walk around the forest of Fangorn to head north to finally find your destination.
+Lothlorien is instantly recognisable by its Mallorn trees. The chief city of this
+land and the abode of Galadriel and Celebron is Caras Galadhon. The Forest of
+Mirkwood (another dungeon) can be found to the north-east of Lothlorien.
+
+If you survive this dangerous dungeon, you should head south, following
+the Anduin river. There, near the dark land of Mordor, you will find the
+great town of Gondor, Minas Anor. From there you may want to pay a visit
+to the land of Mordor, which is east of Minas Anor. You cannot pass through
+the Black Gate of Mordor without a means of climbing mountains, for the
+gate is guarded heavily, night and day. The only ways into Mordor are through
+the dreaded Spider Pass (Cirith Ungol), or the circuitous route through the
+valley of Nurnen and the horrid plains of Gorgoroth.
+
+After Mordor you should finally travel to Gondolin, the hidden town of the
+Noldor. From this city, you will be able to attack Angband, the
+dungeon of Morgoth, which is north-east of Gondolin. This city is well-
+protected by what remains of the Echoriath, and there is but one route
+into it that does not force you to travel by the sea. To be sure of finding
+Gondolin, travel north along the Blue Mountains, then take the north-eastern
+route from the second northernmost peak.
+
+
+~~~~~2
+#####G(b) Other towns
+
+To the west of Bree, in the middle of a land called the Shire, there is a
+small village called Hobbiton, inhabited by Halflings. Nested in some low
+hills, it isn't hard to find, and their hospitality is legendary.
+
+To the east of Bree, there is Rivendell - the hidden valley of the Elves,
+where Elrond lives in the Last Homely House (Imladris). Beyond the Misty
+Mountains, near the entrance to Mirkwood Forest, there is the house of
+Beorn.
+
+When you are in Lothlorien, be sure to pay your respects to the Valar at
+Cerin Amroth, which is immediately to the north of Caras Galadhon.
+
+Edoras, the capital of Rohan (home of the horse-lords, the Rohirrim) can be
+found to the south of Caras Galadhon. It is a well-protected fortress, second
+only to the fortress of Helm's Deep, which stands watch against Isengard.
+
+There are two cities near Minas Anor - Pelargir (the great city at the
+mouth of the Anduin River) and Osgiliath, the citadel of Stars. Pelargir is
+to the south-west of Minas Anor, and Osgiliath is to the north-east of
+Gondor's capital. Rumour has it that there is a Ranger outpost somewhere in
+Ithilien, immediately to the north of Osgiliath.
+
+If you travel north towards the Lonely Mountain, you will come upon
+Esgaroth, the city of Lake-men. Near Esgaroth is the construction site for
+Dale, and if you follow the river, you may find yourself a guest in the
+Halls of Thranduil, King of the Wood-Elves.
+
+Deep in the heart of the Misty Mountains, in a heavily guarded area that
+cannot be access but through the Mines of Moria, lies Khazad-dum, the
+greatest city ever built by Dwarves.
+
+~~~~~3
+#####G(c) Other strange and frightening places
+
+The Old Forest to the west of Bree (and east of Hobbiton) is what remains
+of the big forests of the First Age, but it has been corrupted. It is said
+that it is guarded by a living tree.
+
+You may also wish to investigate the Orc Caves east of Bree; they are
+another place suitable for those finished with the Barrow-Downs. They also
+are rumoured to hold great mysteries - these are the same caves where Bilbo
+had once found the One Ring of power.
+
+Durin's Bane, the Balrog of Moria, guards the Mines of Moria, to the south-east
+of Bree. The Mines are also the only means of access to the Dwarven
+stronghold of Khazad-dum.
+
+Nearly at the edge of land, there is a magical Maze. Many adventurers
+that ventured there never came back. It is rumoured that a Minotaur is
+lurking down there, guarding an ancient and powerful artifact.
+Bring along digging equipment and some means to recall.
+
+During the Second Age of the world there was a great island called
+Numenor. The people who dwelt there were wise and powerful, but as time
+passed their last kings fell under the power of Sauron. Under Sauron's
+orders, they tried to attack Valinor, the blessed land, and for this
+Numenor was destroyed, swallowed by the sea. The ruins are still
+accessible, far out to sea to the west of Bree. Any adventurer going
+there should be sure to bring equipment that enables underwater
+breathing, however - without it, you shall perish.
+
+Many other strange places wait to be explored by the valiant adventurer,
+but their locations are secret. You will have to find them yourself!
+Among them are the Grinding Ice of the Helcaraxe, Forodwaith, the caves
+beneath Isengard, the land of Rhun, and many others.
+
+
+~~~~~4
+#####G(d) Equipment issues
+
+Beware, adventurer! If you plan to go down into the dungeons, be prepared. Some
+items you will need badly.
+
+First, think of some light: maybe a lantern is better than the torches.
+
+Second things to mention are your combat equipment. Sometimes the weapon and
+armor you got from your mentor are not enough for the nasties inside the
+dungeons.
+
+And third and most important, [[[[[Balways carry a shovel or other digger with you],
+because there is much rubble in the dungeons, which you cannot clear with
+your hands.
+
+~~~~~5
+#####G(e) Macros
+
+Spellcasters might find that pressing 4 keys (at least) to cast a spell is a
+lot, they are right. That is why there are macros. You can access the macro
+screen by pressing @. You can find help on the *****macrofaq.txt*0[macros] in the docs.
+
+Now you either have the hard way or the easy way.
+
+**The Hard Way**
+
+What the fellow adventurer should know is how to create a basic spell macro.
+Press @ to enter the macro screen.
+Press 4 to create a new macro.
+Press the key to bind the macro to, usually one uses the F* keys(you can combine
+them with the ctrl, shift, ... keys too)
+Enter the key sequence to be done for the macro.
+Press 2 to save the macro.
+
+Now a problem that might arise, imagine your macro looks like: mcaa*t
+to cast manathrust spell('m' to use skill, 'c' for cast a spell skill,
+'a' for first book, 'a' for first spell, *t to… target the first monster).
+This macro will break if you gain a new skill so that "Cast a spell" is no more
+the skill 'c', or if you get a new book. There is a way around that.
+When the game asks for a skill or a spell it allows you to press @ to enter
+the skill/spell name directly, so your macro would become:
+m@Cast a spell\r@Manathrust\r*t
+Now this will always work as long as one of your books have the spell in it.
+
+
+**The Easy Way**
+
+This time you will only use the macro recorder. To do that:
+Press $ to start it
+Now each key you press will be recorded, so press all keys you want.
+It is recommended to start your macro by pressing Escape key a few time, so
+if there are messages when you use the macro it will first erase them instead
+of screwing your macro :)
+it is also recommended to take advantage of the @ key when selecting skills or
+objects whenever the possibility is offered to you. It will make sure you
+always use the good object/skill even if it moves in your inventory.
+Once all keys are pressed press $ again to stop it.
+It you are satisfied with your macro now you get to press the key to bind it
+to.
+
+As in the Hard Way you must use the macro screen if you want to permanently
+save your macros.
diff --git a/lib/mods/theme/file/book-200.txt b/lib/mods/theme/file/book-200.txt
new file mode 100644
index 00000000..75577e1a
--- /dev/null
+++ b/lib/mods/theme/file/book-200.txt
@@ -0,0 +1,5 @@
+4
+35
+21
+6
+0
diff --git a/lib/mods/theme/file/book-201.txt b/lib/mods/theme/file/book-201.txt
new file mode 100644
index 00000000..fdcae8aa
--- /dev/null
+++ b/lib/mods/theme/file/book-201.txt
@@ -0,0 +1,5 @@
+4
+3
+11
+8
+0
diff --git a/lib/mods/theme/file/book-202.txt b/lib/mods/theme/file/book-202.txt
new file mode 100644
index 00000000..3c61caee
--- /dev/null
+++ b/lib/mods/theme/file/book-202.txt
@@ -0,0 +1,5 @@
+4
+50
+34
+4
+0
diff --git a/lib/mods/theme/file/book-203.txt b/lib/mods/theme/file/book-203.txt
new file mode 100644
index 00000000..c169a628
--- /dev/null
+++ b/lib/mods/theme/file/book-203.txt
@@ -0,0 +1,5 @@
+4
+60
+56
+3
+0
diff --git a/lib/mods/theme/file/book-204.txt b/lib/mods/theme/file/book-204.txt
new file mode 100644
index 00000000..37b88559
--- /dev/null
+++ b/lib/mods/theme/file/book-204.txt
@@ -0,0 +1,5 @@
+4
+1
+1
+99
+64
diff --git a/lib/mods/theme/file/book-205.txt b/lib/mods/theme/file/book-205.txt
new file mode 100644
index 00000000..fecab40c
--- /dev/null
+++ b/lib/mods/theme/file/book-205.txt
@@ -0,0 +1,5 @@
+4
+51
+50
+3
+0
diff --git a/lib/mods/theme/file/book-206.txt b/lib/mods/theme/file/book-206.txt
new file mode 100644
index 00000000..ed1f1c17
--- /dev/null
+++ b/lib/mods/theme/file/book-206.txt
@@ -0,0 +1,5 @@
+4
+66
+18
+1
+0 \ No newline at end of file
diff --git a/lib/mods/theme/file/book-207.txt b/lib/mods/theme/file/book-207.txt
new file mode 100644
index 00000000..0a9fb804
--- /dev/null
+++ b/lib/mods/theme/file/book-207.txt
@@ -0,0 +1,5 @@
+4
+25
+21
+3
+0 \ No newline at end of file
diff --git a/lib/mods/theme/file/book-208.txt b/lib/mods/theme/file/book-208.txt
new file mode 100644
index 00000000..1a853553
--- /dev/null
+++ b/lib/mods/theme/file/book-208.txt
@@ -0,0 +1,5 @@
+4
+63
+53
+1
+0 \ No newline at end of file
diff --git a/lib/mods/theme/file/book-209.txt b/lib/mods/theme/file/book-209.txt
new file mode 100644
index 00000000..040cf93c
--- /dev/null
+++ b/lib/mods/theme/file/book-209.txt
@@ -0,0 +1,5 @@
+4
+57
+62
+3
+0 \ No newline at end of file
diff --git a/lib/mods/theme/file/book-210.txt b/lib/mods/theme/file/book-210.txt
new file mode 100644
index 00000000..7c1f25d5
--- /dev/null
+++ b/lib/mods/theme/file/book-210.txt
@@ -0,0 +1,5 @@
+4
+55
+19
+1
+0 \ No newline at end of file
diff --git a/lib/mods/theme/file/book-211.txt b/lib/mods/theme/file/book-211.txt
new file mode 100644
index 00000000..3806768d
--- /dev/null
+++ b/lib/mods/theme/file/book-211.txt
@@ -0,0 +1,5 @@
+4
+67
+16
+1
+0 \ No newline at end of file
diff --git a/lib/mods/theme/file/book-212.txt b/lib/mods/theme/file/book-212.txt
new file mode 100644
index 00000000..c2891872
--- /dev/null
+++ b/lib/mods/theme/file/book-212.txt
@@ -0,0 +1,5 @@
+4
+63
+51
+1
+0 \ No newline at end of file
diff --git a/lib/mods/theme/file/book-213.txt b/lib/mods/theme/file/book-213.txt
new file mode 100644
index 00000000..0716c26e
--- /dev/null
+++ b/lib/mods/theme/file/book-213.txt
@@ -0,0 +1,5 @@
+4
+45
+46
+3
+0 \ No newline at end of file
diff --git a/lib/mods/theme/file/book-214.txt b/lib/mods/theme/file/book-214.txt
new file mode 100644
index 00000000..d99dd3d8
--- /dev/null
+++ b/lib/mods/theme/file/book-214.txt
@@ -0,0 +1,5 @@
+4
+61
+16
+3
+0 \ No newline at end of file
diff --git a/lib/mods/theme/file/book-215.txt b/lib/mods/theme/file/book-215.txt
new file mode 100644
index 00000000..fc5b3ed3
--- /dev/null
+++ b/lib/mods/theme/file/book-215.txt
@@ -0,0 +1,5 @@
+4
+48
+21
+1
+0 \ No newline at end of file
diff --git a/lib/mods/theme/file/book-216.txt b/lib/mods/theme/file/book-216.txt
new file mode 100644
index 00000000..4acc56af
--- /dev/null
+++ b/lib/mods/theme/file/book-216.txt
@@ -0,0 +1,5 @@
+4
+1
+1
+99
+6
diff --git a/lib/mods/theme/file/book-22.txt b/lib/mods/theme/file/book-22.txt
new file mode 100644
index 00000000..99dd4e90
--- /dev/null
+++ b/lib/mods/theme/file/book-22.txt
@@ -0,0 +1,56 @@
+ -----------------------
+ | Artifact Lore Vol. IV |
+ | Axes |
+ -----------------------
+
+The Great Axe of Durin
+ The twin massive axe heads of this ancient demon's dread gleam with
+ mithril inlay, which tell sagas of endurance, invoking the powers of
+ Khazad-dum to protect the wearer and slay all evils found underground.
+
+The Great Axe of Eonwe
+ The axe of Eonwe, leader of the Hosts of the West before the gates of
+ Thangorodrim, strikes with icy wrath at the undead, disperses hosts of
+ evil at a word, and grants Maia-like powers of body and mind.
+
+The Broad Axe 'Barukkheled'
+ A royal heirloom of the southern coast, strong in combat against evil
+ creatures of the earth.
+
+The Bearded Axe of Gimli
+ "Gimli sensed the Dead behind following, but he continued on after
+ Aragorn." The trusty axe of Gimli son of Gloin, one of the Nine
+ Walkers of old.
+
+The Light War Axe 'Cam-tal-crist'
+ The Petty-dwarves of Bathak forged this blade, and it shares their thirst
+ for blood.
+
+The Broad Axe 'Orchast'
+ Forged by the dwarves of Khazad-dum in a time of desperation, this axe
+ turned many a battle against the invading orcs.
+
+The Hatchet of the Night
+ Found on an unmarked grave after a violent storm, this hatchet has a
+ sinister aura of darkness and decay.
+
+The Slaughter Axe 'Lavandagnir'
+ Used by the orcs in their battle at Dagor Bragollach against the elves,
+ this axe has a bloodthirst for nature.
+
+The Light War Axe of Helcar
+ Crafted of purest ice and held solid by powerful spells, this icy axe
+ delivers a chill of death to its victims.
+
+The Slaughter Axe 'Dramborleg'
+ The great axe of Tuor, Thudder-Sharp is its name. The axe that smote both
+ a heavy dint as of a club and cleft as a sword. When it was swung by the
+ hands of Tuor, it sang like the rush of eagle's wings in the air and took
+ death as it fell. Its name alone instills fear in Balrogs and other
+ corruptions of Morgoth.
+
+The Slaughter Axe 'Garachoth'
+ A ghastly axe with the soul of a demon lord trapped inside, this horrifying
+ creation reverberates with the screams of the damned. As you gaze into its
+ glassy, translucent blade, it seems that endless sulphurous wastelands
+ stretch away from you into the distance, obscured, by sheets of fire.
diff --git a/lib/mods/theme/file/book-23.txt b/lib/mods/theme/file/book-23.txt
new file mode 100644
index 00000000..5d5c22f9
--- /dev/null
+++ b/lib/mods/theme/file/book-23.txt
@@ -0,0 +1,81 @@
+ ----------------------
+ | Artifact Lore Vol. V |
+ | Missile Weapons |
+ ----------------------
+
+The Long Bow 'Belthronding'
+ The great bow of Beleg, made of black yew and strung with elven hair that
+ faintly shines a pale clear gold.
+
+The Long Bow of Bard
+ The great yew bow of grim-faced Bard, who shot the mightiest arrow that
+ songs record.
+
+The Light Crossbow 'Cubragol'
+ A crossbow that grants fiery speed to he who finds it, and from which
+ shoot bolts that blaze with flame unquenchable.
+
+The Sling of the Thain
+ This sling was crafted by Faramir I, Thain of the Shire, just in case the
+ nasties of his father's stories ever dare to enter the Shire again.
+
+The Sling of Farmer Maggot
+ This ordinary seeming leather sling has been raised to legendary status
+ amongst generations of hobbit children. Farmer Maggot's ability to notice
+ and strike any mushroom thief anywhere within his patch almost keeps young
+ poachers at bay, but once they get within range they soon flee for less
+ painful pastures, frequently with rounded pebbles stinging their
+ backsides...
+
+The Heavy Crossbow of Umbar
+ A great brazen arbalest with arms of gleaming steel, shooting quarrels
+ with speed and power for those brave enough to risk betrayal.
+
+The Short Bow of Amrod
+ This bow, and its twin, belonged to Feanor's last two twin sons, Amrod and
+ Amras, who both hunted with the Green-elves for a time. Like the twins,
+ the bows are similar, for both protect their wielders from the elementsand
+ strength, while the other gives quickness and subtlety.
+
+The Short Bow of Amras
+ This bow, and its twin, belonged to Feanor's last two twin sons, Amrod and
+ Amras, who both hunted with the Green-elves for a time. Like the twins,
+ the bows are similar, for both protect their wielders from the elementsand
+ subtlety, while the other gives endurance and strength.
+
+The Light Crossbow of Brand
+ The bow of Brand, last King of Dale. It was given to him as a gift by the
+ King under the Mountain of Erebor, and has access to an especially secret
+ realm of Dwarven lore.
+
+The Seeker Arrow of Bard
+ Deadliest of arrows, imbued with elemental strength, this shaft is feared
+ especially by the wyrmkin.
+
+The Seeker Arrow of Gondor
+ An arrow that was created to rid the world of demons.
+
+The Seeker Bolt of Feanor
+ Made during the war against Morgoth by Feanor, this powerful bolt is the
+ bane of Morgoth's power, and has especial strength against those foes who
+ are already dead.
+
+The Silver Bolt 'Dailir'
+ The beloved dart of Beleg Cuthalion. It never failed to be found unharmed,
+ until it broke when Beleg fell upon it while he was carrying Turin
+ Turambar away from an Orc-camp, the night Beleg met his end. Turin remade
+ the bolt and kept it to his dying day in memory of his friend.
+
+The Metal Boomerang of Beor
+ Beor's boomerang makes its wielder as agile as the winds, and as hard to
+ harm.
+
+The Metal Boomerang 'Glimdrir'
+ A powerful boomerang that makes one agile and fast, with a thirst for evil
+ and undead creatures, but demands its wielder not teleport, for fear of
+ desertion.
+
+The Long Bow of Legolas
+ The great bow of Legolas, one of the Nine Walkers of old. Handcrafted specially
+ for Thranduil's son in Lothlorien, this bow gives clarity of sight and agility
+ to the wielder.
diff --git a/lib/mods/theme/file/book-24.txt b/lib/mods/theme/file/book-24.txt
new file mode 100644
index 00000000..86d998b7
--- /dev/null
+++ b/lib/mods/theme/file/book-24.txt
@@ -0,0 +1,59 @@
+ -----------------------
+ | Artifact Lore Vol. VI |
+ | Instruments |
+ -----------------------
+
+The Harp of Thorin
+ This magical instrument once belonged to Thorin Oakenshield, a mighty
+ dwarf warrior of old. The sounds emanating from it once gave a frightened
+ hobbit a glimpse of beauty and helped allay his fears, and to this day the
+ harp preserves its magical powers to encourage when all seems horribly
+ wrong.
+
+The Harp of Maglor
+ This harp that once belonged to Maglor makes those who use it seem more
+ forceful and convincing. It is also said that those who have used it
+ found themselves walking faster, as if to an unheard beat.
+
+The Drum of the Sky
+ The drum is decorated with the images of the stars, the clouds, the Sun
+ guided by Arien and the Moon with Tilion. It imparts to the wearer an
+ echo of the beauty of the sky, and protects him from the elements day or
+ night. The beat of the drum marks the passage of time, and will make time
+ pass differently for the wearer.
+
+The Harp of Daeron
+ A pretty harp that makes those who play it beautiful, wise and fast.
+
+The Drum of the Druedain
+ The fabled Drum of the Druedain that will protect those who play it from
+ darkness and poison attacks. It also aids in the seeing of warm blooded
+ creatures.
+
+The Horn of Rohan
+ A horn carved from the bones of the Dragon of Ered-Mithrin, this heirloom
+ of the House of Eorl bestows to its user the gifts of courage and command.
+
+The Horn of Helm
+ Heedless of cold, fearless of darkness -- besiegers fled at the wind of
+ the solitary coming of King Helm Hammerhand, proclaimed by a single
+ horn-blast in the dead of winter.
+
+The Horn of Boromir
+ The great horn made of the horns of kine of Araw. It is inlaid with silver
+ and gold signs; when blown, it can be heard for miles over. The horn gives
+ courage and endurance to its wearer, provided that secrecy is not desired.
+ "Loud and clear it sounds in the valleys of the hills... and then let all
+ the foes of Gondor flee!"
+
+The Harp of Tom Bombadil
+ This small, serviceable wooden harp once belonged to Tom Bombadil - a
+ mysterious figure whose song prevented the Wight-King from attacking Frodo
+ and his companions. Its music still inspires boldness and strengthens the
+ life force of all who play it.
+
+The Horn 'Valaroma'
+ This heavenly instrument, wrought from gleaming silver, most often appears
+ in the hands of the Valarin huntsman Orome; yet he may lend mortal
+ champions the horn from time to time. Its music inspires courage and
+ clarity of mind in pure-hearted beings, but drives evil ones far away. \ No newline at end of file
diff --git a/lib/mods/theme/file/book-25.txt b/lib/mods/theme/file/book-25.txt
new file mode 100644
index 00000000..a8cfdadf
--- /dev/null
+++ b/lib/mods/theme/file/book-25.txt
@@ -0,0 +1,98 @@
+ ------------------------
+ | Artifact Lore Vol. VII |
+ | Body Armour |
+ ------------------------
+
+The Leather Scale Mail 'Thalkettoth'
+ A tunic and skirt sewn with thick, overlapping scales of hardened leather
+ whose wearer moves with agility and assurance.
+
+The Robe of Incanus
+ Gandalf's long, flowing robe. It provides insight and allows the wearer
+ to see things not seen by all.
+
+The Robe of Great Luck
+ Once created by a powerful wizard this robe to grant him incredible
+ luck... It seems he forgot to wear it.
+
+The Hard Leather Armour of Himring
+ Contained within this studded cuirass of pliable leather is the memory of
+ unvanquished Himring, defiant fortress surrounded by the legions of
+ Morgoth.
+
+The Soft Leather Armour 'Hithlomir'
+ Familiar with the secret ways hidden in darkness, this leather cuirass is
+ truly more than it appears.
+
+The Robe of Belegaer
+ This pearl-trimmed blue robe was created by a Maia loremaster in Ulmo's
+ service. No ocean storm can harm its wearer or anything he carries; the
+ pressure and darkness of deep water cannot hinder him, either.
+
+The Leather Jerkin of Tom Bombadil
+ This garment was once the property of Tom Bombadil - a strange being
+ rumoured to be older than Arda itself. It may be the explanation for how
+ Tom could always turn up when he was most needed.
+
+The Filthy Rag of Ghan-buri-Ghan
+ The wrappings of a leader among the wild Men of Druadan forest. It
+ contains a multitude of tiny pockets filled with small darts dripping with
+ venom.
+
+The Robe of Curunir
+ The white robe of the Istari wizard Curunir, known on Middle-earth as
+ Saruman the White and Saruman of Many Colours. Imbued with cold and
+ lightning used in the creation of the Fire of Orthanc, it grants the
+ wearer some mastery over these elements.
+
+The Galvorn Plate Mail of Eol
+ A suit of imperishable galvorn, with conquerable strength to endure evil
+ and disruptive magics, that protects the life force of its wearer like
+ nothing else can. Eol the Dark Elf made it in secret for his son, but
+ Maeglin left Nan Elmoth with his mother Aredhel and never got to wear it.
+
+The Full Plate Armour of Isildur
+ A gleaming steel suit covering the wearer from neck to foot, with runes of
+ warding and stability deeply engraved into its surface.
+
+The Metal Brigandine Armour of the Rohirrim
+ A stiff suit of armour composed of small metal plates sewn to an inner
+ layer of heavy canvas, and covered with a second layer of cloth. Within it
+ is the spirit of Eorl the Young, matchless in combat.
+
+The Mithril Chain Mail 'Belegennon'
+ This wondrous suit of fine-linked chain shimmers as though of pure silver.
+ It stands untouched amidst the fury of the elements, and a power of
+ concealment rests within.
+
+The Mithril Plate Mail of Celeborn
+ A shimmering suit of true-silver, forged long ago by dwarven smiths of
+ legend. It gleams with purest white as you gaze upon it, and mighty are
+ it powers to protect and banish.
+
+The Chain Mail of Arvedui
+ A hauberk, leggings, and sleeves of interlocking steel rings, well padded
+ with leather. You feel strong and tall as Arvedui, last king of Arnor, as
+ you put it on.
+
+The Augmented Chain Mail of Caspanion
+ A hauberk, leggings, and sleeves of interlocking steel rings,
+ strategically reinforced at vital locations with a second layer of chain.
+ Magics to enhance body and mind lie within, and no door can hope to resist
+ the wearer.
+
+The Chain Mail of Peregrin Took
+ This sturdy mail shirt was a gift from the nobility of Gondor to the
+ halfling Peregrin Took. It enables a warrior to fight more capably and
+ cling to life when others would be killed. It also reveals enemies
+ (especially trolls) hiding in the dark, and terrifies anyone who threatens
+ the wearer.
+
+The Multi-Hued Dragon Scale Mail 'Lothronfaun'
+ A massive suit of heavy dragon scales deeply saturated with many colours.
+ It throbs with angry energies. May-cloud it is called, after the element
+ lightning which courses with it with unusual vigour.
+
+The Power Dragon Scale Mail 'Loknare'
+ A mighty suit of dragon armour, set with the scales of dragons of both Law
+ and Chaos, and with power over both. Loknare means Dragonblaze. \ No newline at end of file
diff --git a/lib/mods/theme/file/book-26.txt b/lib/mods/theme/file/book-26.txt
new file mode 100644
index 00000000..a042b8b5
--- /dev/null
+++ b/lib/mods/theme/file/book-26.txt
@@ -0,0 +1,56 @@
+ -------------------------
+ | Artifact Lore Vol. VIII |
+ | Cloaks |
+ -------------------------
+
+The Cloak 'Holcolleth'
+ This elven-grey mantle possesses great powers of tranquility and of
+ concealment, and grants the wearer the knowledge and understanding of the
+ Sindar.
+
+The Cloak of Thingol
+ A sable-hued cloak, with glowing elven-runes to restore magic showing calm
+ and clear as moonlight on still water.
+
+The Cloak of Thorongil
+ A cloak of shimmering green and brown that grants sight beyond sight and
+ shakes off holding magics, worn by Aragorn son of Arathorn in his youth as
+ he adventured under the name of Thorongil.
+
+The Cloak 'Colannon'
+ A crystal-blue cape of fine silk worn by a silent messenger of the forces
+ of Law. Somehow, its wearer is always able to escape trouble.
+
+The Shadow Cloak of Luthien
+ The opaque midnight folds, inset with a multitude of tiny diamonds, of
+ this cloak swirl around you and you feel a hint, a fragment of the
+ knowledge and power to restore that lay in Luthien, the most beautiful
+ being that ever knew death.
+
+The Shadow Cloak of Tuor
+ From the ruin of Gondolin did Tuor escape, through secret ways and
+ travail, shielded by his cloak from a multitude of hostile eyes.
+
+The Elven Cloak of Peregrin Took
+ This simple-looking cloak, dyed in hues that blend into the woodlands, was
+ a gift from the elves of Lothlorien to the halfling Peregrin Took. Its
+ wearer has an uncanny knack for making friends, escaping bonds, moving
+ among enemies completely unseen - and finding food.
+
+The Cloak 'Menelcol'
+ This deep-blue velvet cloak, embroidered with silvery stars, sheds
+ acelestial light that reveals hidden things and bestows unearthly beauty.
+ It also wards off damage from elements of the skies, and allows the wearer
+ to fly unscathed even through airless space.
+
+The Cloak of Ghan-buri-Ghan
+ This dark-coloured cloak once belonged to the leader of the Druedain. As
+ you put it on, you feel safer from attempts to waylay you on your travels.
+
+The Cloak of Valinor
+ A magical cloak that grants the wearer ultimate protection.
+
+The Elven Cloak of Mellyrn
+ Bearing the same lyrical name as the great trees of Lothlorien and containing
+ in its close-woven folds the speed and skill of the Galadhrim, this grey cloak
+ is ideal for those who travel in forests.
diff --git a/lib/mods/theme/file/book-27.txt b/lib/mods/theme/file/book-27.txt
new file mode 100644
index 00000000..3e958d90
--- /dev/null
+++ b/lib/mods/theme/file/book-27.txt
@@ -0,0 +1,75 @@
+ -----------------------
+ | Artifact Lore Vol. IX |
+ | Shields and Boots |
+ -----------------------
+
+The Small Mithril Shield of Thorin
+ Invoking the strength and endurance of Thorin, King under the Mountain,
+ this little metal shield is proof against the Element of Earth.
+
+The Large Leather Shield of Celegorm
+ This shield emblazoned with a multitude of creatures not seen for ages
+ once protected Celegorm, lord of Himlad; around it lies a mystic balance
+ that contains the conflicts of the elements.
+
+The Large Metal Shield of Anarion
+ The great metal-bound shield of Anarion, son of Elendil, who Sauron found
+ himself powerless to wither or diminish.
+
+The Small Metal Shield of Gimli
+ A gift from the King of Rohan to Gimli the Dwarf, this shield combines the
+ cunning and stamina of Gimli Elf-friend, Gimli the Lock-bearer.
+
+The Shield of Deflection of Gil-galad
+ The legendary shield of Gil-Galad, who fought his way to the gates of the
+ Dark Tower, and with whom came light even to Gorgoroth.
+
+The Large Leather Shield of the Haradrim
+ A great shield from the far lands of the South, whose wielder will go
+ charging into battle heedless of danger, with the strength and endurance
+ of a madman. Nor will he fear poison, for the Southron barbarians handle
+ poisoned darts naturally.
+
+The Mithril Shield of Earendil
+ A shining shield, once borne by the great mariner Earendil, "scored with
+ runes to keep all wounds and harm from him".
+
+The Large Metal Shield of Erkenbrand
+ Tall and strong stood Erkenbrand, Lord of the Westfold, as he rode to combat
+ the forces of Isengard. The valour of Helm Hammerhand lived again in him.
+ This shield is painted red according to Rohan custom and it grants magical
+ protection against enemy projectiles, as well as lets the wearer sense
+ approaching enemy hordes.
+
+The Pair of Soft Leather Boots of Wormtongue
+ The pair of boots used by Grima son of Galmod, also named the Wormtongue - a
+ treacherous but persuasive counsellor, ever ready to betray, sneak, lie,
+ cheat and steal - but never ready to actually fight.
+
+The Pair of Hard Leather Boots of Feanor
+ This wondrous pair of leather boots once sped Feanor, creator of the
+ Silmarils and the mightiest of the Eldar, along the Grinding Ice and to
+ Middle-earth at last.
+
+The Pair of Soft Leather Boots 'Dal-i-thalion'
+ A pair of high-laced shoes, strong against the powers of corruption and
+ withering, that grant the wearer extraordinary agility.
+
+The Pair of Metal Shod Boots of Thror
+ Sturdy footwear of leather and steel as enduring as the long-suffering
+ Dwarven King-in-exile who wore them. Of dwarven make, the wearer of these
+ boots will be completely at home in the mountains.
+
+The Pair of Hard Leather Boots of Nevrast
+ Footgear made of bear leather and set with opals, which grant the wearer
+ silent, hasted movement.
+
+The Pair of Metal Shod Boots of Gimli
+ A set of iron-shod boots stamped by Gimli's combat prowess, a peerless
+ ally to those journeying through halls of stone under mountains.
+
+The Pair of Metal Shod Boots of the Machine
+ A massive pair of adamantite boots studded with gold, the final and greatest
+ product of the petty-dwarven magical forge. Despite the great powers they
+ contain, they are heavy and awkward enough to make quite a racket whenever
+ you move.
diff --git a/lib/mods/theme/file/book-28.txt b/lib/mods/theme/file/book-28.txt
new file mode 100644
index 00000000..b55cf360
--- /dev/null
+++ b/lib/mods/theme/file/book-28.txt
@@ -0,0 +1,102 @@
+ ----------------------
+ | Artifact Lore Vol. X |
+ | Headgear and Gloves |
+ ----------------------
+
+The Hard Leather Cap of Thranduil
+ The hunting cap of King Thranduil, to whose ears come all the secrets of
+ his forest domain.
+
+The Metal Cap of Thengel
+ A ridged helmet made of steel, and embossed with scenes of valour in
+ fine-engraved silver. It grants the wearer nobility, clearness of thought
+ and understanding.
+
+The Steel Helm of Hammerhand
+ A great helm as steady as the heroes of the Westdike. Mighty were the
+ blows of Helm, the Hammerhand!
+
+The Dragon Helm of Dor-Lomin
+ The legendary dragon helm of Turin Turambar, an object of dread to the
+ servants of Morgoth.
+
+The Iron Helm 'Holhenneth'
+ A famous helm of forged iron granting extraordinary powers of mind and
+ awareness.
+
+The Iron Helm of Gorlim
+ A headpiece, gaudy and barbaric, that betrayed a warrior when he most
+ needed succour.
+
+The Metal Cap of Thorin
+ Mighty was Thorin Oakenshield as he emerged from the Gate of the Lonely
+ Mountain on the day of the Battle of the Five Armies, clad in shining
+ armour, part of which was this helm. He gleamed like gold in the dying
+ fire of the day, red light leapt from his eyes, and his foes were
+ terrified at the mere sight of him.
+
+The Iron Helm of Knowledge
+ This helm, designed by Petty-Dwarves ages ago to act as the brain of a
+ long lost project, is made of finest glass. Its light banishes all
+ secrets, and makes audible whispers from the deceased.
+
+The Metal Cap of Celebrimbor
+ This once belonged to Celebrimbor, maker of the Rings of Power. One who
+ knows both fire and acid, from the business of forging and engraving, will
+ fear neitheraware of Sauron before Sauron became aware of him, when Sauron
+ put on the One Ring for the first time.
+
+The Steel Helm of Gil-galad
+ The shining helm that Gil-galad, legendary Elven-king, wore in battle.
+
+The Iron Crown of Beruthiel
+ The midnight-hued steel circlet of the sorceress-queen Beruthiel, which
+ grants extraordinary powers of sight and awareness at a terrible physical
+ cost.
+
+The Golden Crown of Gondor
+ The shining winged circlet brought by Elendil from dying Numenor, emblem
+ of Gondor though an age of the world.
+
+The Jewel-Encrusted Crown of Numenor
+ A crown of massive gold, set with wondrous jewels of thought and warding,
+ worn by the kings of ancient Numenor. Its wearer may go into battle
+ always knowing what he faces - unless his own folly blinds him to the
+ nature and magnitude of the task.
+
+The Set of Leather Gloves 'Cambeleg'
+ A hero's handgear that lends great prowess in battle.
+
+The Set of Leather Gloves 'Cammithrim'
+ These gloves glow so brightly as to light the way for their owner and cast
+ magical bolts with great frequency.
+
+The Set of Gauntlets 'Paurhach'
+ A fiery set of gauntlets that can even shoot fire from the user's hands.
+
+The Set of Gauntlets 'Paurnimmen'
+ A set of handgear so icy as to be able to fire frost bolts.
+
+The Set of Gauntlets 'Pauraegen'
+ A set of handgear with sparks surrounding it, able to fire bolts of
+ electricity.
+
+The Set of Gauntlets 'Paurnen'
+ A set of handgear so corrosive that it may fire bolts of acid.
+
+The Set of Gauntlets 'Camlost'
+ A pair of gauntlets that sap combat ability, named after the empty hand of
+ Beren that once clasped a Silmaril.
+
+The Set of Cesti of Fingolfin
+ The hand-sheathing of Fingolfin, warrior-king of Elves and Men, who gave
+ Morgoth seven mighty wounds and pain that will last forever.
+
+The Set of Gauntlets of Eol
+ The iron-shod gauntlets of the Dark Elven smith Eol, tingling with magics
+ that he could channel in battle.
+
+The Set of Cesti 'Skycleaver'
+ The handgear of a legendary dragonslaying hero. The wearer of these wyrmskin
+ gauntlets will be versed in all aerial ways, and will fear no dragon that walks
+ or flies. \ No newline at end of file
diff --git a/lib/mods/theme/file/book-29.txt b/lib/mods/theme/file/book-29.txt
new file mode 100644
index 00000000..750c68cf
--- /dev/null
+++ b/lib/mods/theme/file/book-29.txt
@@ -0,0 +1,75 @@
+ -----------------------
+ | Artifact Lore Vol. XI |
+ | Rumoured Item Sets |
+ -----------------------
+
+Rumour has it that if an item set is complete, the
+wearer shall gain additional magical powers.
+
+Gothmog's Armoury
+ The Demonblade of Gothmog
+ The Demonshield of Gothmog
+ The Demonhorn of Gothmog
+
+The Elven Gifts
+ Phial of Galadriel
+ Sting
+
+The Dragon Slayer
+ The Long Bow of bard
+ The Black Arrow of Bard
+
+The Trinity
+ The Dagger of Samwise
+ The Dagger of Meriadoc
+ The Dagger of Peregrin
+
+Thorin's Gear
+ The Small Metal Shield of Thorin
+ The Harp of Thorin
+ The Metal Cap of Thorin
+
+Peregrin's Gifts
+ The Chain Mail of Peregrin Took
+ The Elven Cloak of Peregrin Took
+
+Ghan-buri-Ghan's Garb
+ The Filthy Rag of Ghan-Buri-Ghan
+ The Cloak of Ghan-buri-Ghan
+
+The Glory of the King
+ The Long Sword 'Anduril'
+ The Black Banner of Gondor
+ The Golden Crown of Gondor
+
+Saruman's Travel Gear
+ The Mage Staff of Saruman
+ The Robe of Curunir
+ The Palantir of Orthanc
+
+Elendil's Heirlooms
+ The Ring of Barahir
+ The Star of Elendil
+ The Rod of Annuminas
+
+Flame of Wrath
+ The Amulet of Carlammas
+ The Morning Star 'Naurgil'
+
+Shadow Ward
+ The Soft Leather Armour 'Hithlomir'
+ The Set of Leather Gloves 'Cammithrim'
+
+Eorl's Arms
+ Lance of Eorlingas
+ The Metal Brigandine Armour of the Rohirrim
+
+Gil-Galad's Battle Gear
+ The Shield of Deflection of Gil-Galad
+ The Spear 'Aiglos'
+ The Steel Helm of Gil-Galad
+
+Dwarven Heritage
+ Arkenstone of Thrain
+ Mattock of Nain
+ Lochaber Axe of the Dwarves \ No newline at end of file
diff --git a/lib/mods/theme/file/book-30.txt b/lib/mods/theme/file/book-30.txt
new file mode 100644
index 00000000..bfd20631
--- /dev/null
+++ b/lib/mods/theme/file/book-30.txt
@@ -0,0 +1,58 @@
+ ------------------------
+ | Artifact Lore Vol. XII |
+ | Light sources |
+ ------------------------
+
+The Phial of Galadriel
+ A small crystal phial, with the light of Earendil's Star contained inside.
+ Its light is imperishable, and near it darkness cannot endure.
+
+The Star of Elendil
+ The shining Star of the West, a famed heirloom of Elendil's house.A white
+ diamond set as a star in a silver fillet to be bound at the forehead.
+
+The Arkenstone of Thrain
+ A great globe seemingly filled with moonlight, the famed Heart of the
+ Mountain, which splinters the light that falls upon it into a thousand
+ glowing shards.
+
+The Anchor of Space-Time
+ A powerful stone that provides a strong light for any who wields it. It is
+ rumoured that it may even protect the wearer from the passing of the time.
+
+The Key of Orthanc
+ The key to the tower of Saruman, which fills your mind with images of
+ knowledge and dreadful understanding. It is not a regular key - it is a
+ perfectly round stone that is meant to fit into a hole. It can be used to
+ light your way in the dungeon as well.
+
+The Feanorian Lamp of Taniquetil
+ This holy lamp once belonged to a seeress who warned Ar-Pharazon ofthe
+ dire fate Numenor would suffer for daring to break the ban against
+ mortals' entering the Blessed Realms alive. The king had the seeress
+ executed and discarded her possessions--but rumors persist that a source
+ of pure vision, untainted by Sauron's darkness, lies hidden away somewhere
+ on Arda.
+
+The Palantir of Orthanc
+ A shining white ball of unbreakable crystal, the ancient Palantiri were
+ used by kings of Numenor and later by the Exiles for rapid communication
+ between distant lands. Nothing is hidden from one who gazes into a
+ Palantirobserver, as was Sauron when Saruman tried to spy on him with this
+ particular Palantir.
+
+The Palantir of Minas Ithil
+ A shining white ball of unbreakable crystal, the ancient Palantiri were
+ used by kings of Numenor and later by the Exiles for rapid communication
+ between distant lands. This Palantir, however, was taken by Sauron long
+ ago, and mastered to his evil uses, to the destruction of all others who
+ would gaze into it.
+
+The Black Banner of Gondor
+ A large banner of pure black, strangely gleaming with a dark light that is
+ faint and at the same time so bright it attracts attention.
+
+The Pearl 'Nimphelos'
+ It was a gift from the Falas-Elves to the Naugrim who built Menegroth, the
+ abode of Thingol and Melian. It shines like starlight on the waves of the
+ sea.
diff --git a/lib/mods/theme/file/book-31.txt b/lib/mods/theme/file/book-31.txt
new file mode 100644
index 00000000..15f677e9
--- /dev/null
+++ b/lib/mods/theme/file/book-31.txt
@@ -0,0 +1,63 @@
+ -------------------------
+ | Artifact Lore Vol. XIII |
+ | Amulets and Rings |
+ -------------------------
+
+The Amulet of Carlammas
+ A fiery circle of bronze, with mighty spells to ward off evil.
+ It is one of two items infused with holy fire.
+
+The Amulet of Ingwe
+ The ancient heirloom of Ingwe, high lord of the Vanyar, against whom
+ nothing of evil could stand.
+
+The Necklace 'Nauglamir'
+ A carencet of gold, set with a multitude of shining gems of Valinor.
+ Despite its size, its weight seems as that of gossamer.
+
+The Blue Stone 'Coimir'
+ Called 'Life-jewel' by the Vanyar of old, this flawless sapphire pendant
+ bears potent runes that preserve body and soul.
+
+The Elfstone 'Elessar'
+ This green gem glows with inner light. Aragorn son of Arathorn wore it at
+ the Battle of the Pelennor Fields, and he was himself given the name of
+ 'Elessar' by the people of Gondor because of this.
+
+The Jewel 'Evenstar'
+ A pure white jewel, the last gift of Queen Arwen Undomiel to Frodo
+ Baggins, intended to be worn around his neck on the chain that had once
+ borne the One Ring.
+
+The Necklace of Girion
+ A necklace of emeralds, green as the grass. It once belonged to Girion,
+ King of Dale, and was given to the Dwarves of the Lonely Mountain as
+ payment for a mithril mail shirt for Girion's son. It seems to have
+ overgrown with a strange moss over the years.
+
+The Amulet of Faramir
+ A slim neckpiece of True-silver, with quiet spells of Ithilien to aid and
+ protect the wearer.
+
+The Ring of Barahir
+ A ring shaped into twinned serpents with eyes of emerald meeting beneath a
+ crown of flowers, an ancient treasure of Isildur's house.
+
+The Ring of Power 'Narya'
+ The Ring of Fire, set with a ruby that glows like flame. Narya is one of
+ the three Rings of Power created by the Elves and hidden by them from
+ Sauron.
+
+The Ring of Power 'Nenya'
+ The Ring of Adamant, with a pure white stone as centrepiece. Nenya is one
+ of the three Rings of Power created by the Elves and hidden by them from
+ Sauron.
+
+The Ring of Power 'Vilya'
+ The Ring of Sapphire, with clear blue gems that shine like stars,
+ glittering untouchable despite all that Sauron ever wrought. Vilya is one
+ of the three Rings of Power created by the Elves and hidden by them from
+ Sauron.
+
+Rumour speaks of other rings of Power, too, as well as of a single ring
+whose name is foul and history treacherous. \ No newline at end of file
diff --git a/lib/mods/theme/file/book-32.txt b/lib/mods/theme/file/book-32.txt
new file mode 100644
index 00000000..d06e2ce2
--- /dev/null
+++ b/lib/mods/theme/file/book-32.txt
@@ -0,0 +1,37 @@
+ ------------------------
+ | Artifact Lore Vol. XIV |
+ | Tools and Trapkits |
+ ------------------------
+
+The Sceptre of Numenor
+ The chief mark of royalty in Westernesse, it is said to have perishedin
+ the fall of Numenor. It once belonged to Ar-Pharazon the Golden and the
+ evilness of that fallen King still courses through it.
+
+The Rod of Annuminas
+ The chief mark of royalty in Arnor, possibly the oldest remaining work of
+ Men. It came from Numenor, but it belonged to the Lords of Andunie of whom
+ the first was Valandil son of Silmarien. It was passed down to Elendil and
+ thus survived the downfall of Numenor.
+
+The Dwarven Pick of Erebor
+ A pick that provides a magical light to see by while tunnelling.
+
+The Mattock of Nain
+ Wielded by Nain of the Iron Hills at the Battle of Azanulbizar, this great
+ mattock brought victory to the Dwarves over Azog's Orcs - though Nain
+ himself fell at the last, even with victory already assured.
+
+The Bolt Trap Set of the Edain
+ A trap that can almost never be detected. Its missiles may be mere
+ pebbles, but fired at an incredibly high velocity to penetrate even the
+ toughest hide or armour.
+
+The Device Trap Set of the Noegyth Nibin
+ A magical trap, armed with a wand. Unaccountably, its victims keep on
+ coming back for more.
+
+The Arrow Trap Set of the Naugrim
+ A snare set not for animals, or people, but for demons alone, and
+ enchanted so that whenever the demon sets foot or claw into the (hidden)
+ pentagram, its hide is immediately pierced by many magical crossbow bolts. \ No newline at end of file
diff --git a/lib/mods/theme/file/book-33.txt b/lib/mods/theme/file/book-33.txt
new file mode 100644
index 00000000..4846c707
--- /dev/null
+++ b/lib/mods/theme/file/book-33.txt
@@ -0,0 +1,21 @@
+ ---------------------------------------------------------------
+| ^ |
+| ^^^ |
+| ------------------------> ^^^^^ |
+| ^^^^^^^ |
+| ^^^^^^^^^ |
+| ^^^^^^^^^^^ |
+| ^^^^^^^^^^^^^ |
+| ^^^^^^^^^^^^^^^ |
+| ^^^^^^^^^^^^^^^^ |
+| ~~ |
+| ~~ |
+| ~~ |
+| ~~ |
+| ~~ |
+| ~~ |
+| ~~ |
+| ~~ |
+| |> \ |- \/ ~~ |
+| | /\ | \ ~~ |
+ --------------------------------------------------------------- \ No newline at end of file
diff --git a/lib/mods/theme/file/book-4.txt b/lib/mods/theme/file/book-4.txt
new file mode 100644
index 00000000..29501076
--- /dev/null
+++ b/lib/mods/theme/file/book-4.txt
@@ -0,0 +1,11 @@
+Ash nazg durbatuluk,
+ash nazg gimbatul,
+ash nazg thrakatuluk
+agh burzum-ishi krimpatul.
+
+-------------------------------
+
+One Ring to rule them all,
+One Ring to find them,
+One Ring to bring them all,
+And in the darkness bind them.
diff --git a/lib/mods/theme/file/book-6.txt b/lib/mods/theme/file/book-6.txt
new file mode 100644
index 00000000..83740e08
--- /dev/null
+++ b/lib/mods/theme/file/book-6.txt
@@ -0,0 +1,171 @@
+ ----------------------
+ | Artifact Lore Vol. I |
+ | Edged Weapons |
+ ----------------------
+
+The Main Gauche of Azaghal
+ The weapon of Azaghal when he wounded Glaurung. It is deadly when
+ fighting dragons and is said to make the breaths of fire completely
+ harmless.
+
+The Main Gauche of Maedhros
+ A short thrusting blade with a large guard worn by Maedhros the Tall,
+ eldest son of Feanor, and wielded with his left hand after the loss of his
+ right hand in the pits of Thangorodrim.
+
+The Broken Dagger 'Angrist'
+ The knife Beren Barahir`s son took from Curufin and with which he cut out
+ a Silmaril from the crown of Morgoth, The blade snapped and broke when he
+ tried to gain one more and the splint hit Morgoth at his chin. It was
+ made of Telchar the dwarf from Nogrod and it could cut through stone. Even
+ broken, it retains power.
+
+The Dagger of Samwise
+ A fiery dagger finely balanced for deadly throws.
+ It is one of the 3 legendary daggers.
+
+The Dagger of Peregrin
+ A frosty dagger finely balanced for deadly throws.
+ It is one of the 3 legendary daggers.
+
+The Dagger of Meriadoc
+ A dagger covered in sparks and finely balanced for deadly throws.
+ It is one of the 3 legendary daggers.
+
+The Dagger of Rilia
+ A large stiletto dagger that glistens with odourless poison, to which the
+ wearer seems oddly immune.
+
+The Dagger 'Belangil'
+ A frosty dagger surrounded in a nimbus of ice with a hilt of elk horn and
+ an edge to wound the wind.
+
+The Bastard Sword 'Calris'
+ This sword has runes of power incused on its ornate hilt, and a single
+ blood channel that gleams coldly blue as you grasp this mighty weapon of
+ peril.
+
+The Broad Sword 'Aranruth'
+ The beautiful sword of Thingol with a hilt of gold and silver inlay,
+ glistening icily enough to freeze the hearts of demons. You feel supple
+ and lightfooted as you hold it.
+
+The Broad Sword 'Glamdring'
+ This fiery, shining blade earned its sobriquet "Foe-Hammer" from dying
+ orcs who dared to come near hidden Gondolin. Inscribed upon the guard in
+ Cirth is the followinggd daedheloth, dam an Glamhoth." - "Turgon King of
+ Gondolin wields, has and holdsthe sword Glamdring, foe of Morgoth's realm,
+ hammer to the Din-horde."
+
+The Broad Sword 'Orcrist'
+ This coldly gleaming blade is called simply "Biter", by orcs who came to
+ know its power all too well.
+
+The Two-Handed Sword 'Anglachel'
+ A giant sword once wielded by mighty Turin, and a great dragonbane which
+ bathed in Glaurung's blood. Its blade once shone brightly, it can cleave
+ iron as though it is old wood. Beleg Cuthalion chose this sword from the
+ armoury of Thingol in Doriath. Turin son of Hurin slew his friend Beleg
+ with it by accident, and since then the blade is black and dull.
+
+The Two-Handed Sword 'Zarcuthra'
+ Dark and deadly runes stand stark against the naked steel of this awesome
+ weapon, and you feel a stunning power of slaying and rending as you slowly
+ approach.
+
+The Dark Sword 'Mormegil'
+ A foul, twisted sword with blackened spines and knobs, whose very name is
+ a curse upon the lips of Elves and Men.
+
+The Cutlass 'Gondricam'
+ Famed sea-defender of Lebennin. A short, slightly curved chopping blade
+ with a perfect edge shining cleanly in the sun, an object of hate to the
+ men of Umbar who met it in combat.
+
+The Executioner's Sword 'Crisdurian'
+ A giant's weapon, with a long blade tall and straight thrusting out from a
+ massive double-pronged hilt. On its blade are written doomspells against
+ both the living and undead.
+
+The Long Sword 'Ringil'
+ The weapon of Fingolfin, High King of the Noldor; it shines like a column
+ of ice lit by light unquenchable. Morgoth came but unwillingly to meet it
+ of old; his lame foot will remind him of its might should he meet it again.
+
+The Long Sword 'Anguirel'
+ Forged of black galvorn by the Dark-Elven smith Eol, this blade has the
+ living lightning trapped inside.
+
+The Long Sword 'Elvagil'
+ The "Singing Blade", whose wearer can slay Orcs and Trolls in the hidden
+ and secret places of the earth.
+
+The Rapier 'Forasgil'
+ A slender, tapered blade whose wielder strikes icy blows with deadly
+ accuracy.
+
+The Sabre 'Careth Asdriag'
+ An heirloom of the Lords of Rhun far to the east, and a name of dismay to
+ creatures natural and unnatural.
+
+The Short Sword 'Sting'
+ The perfect size for Bilbo, and stamped forever by the courage he found in
+ Mirkwood, this sturdy little blade grants the wearer combat prowess and
+ survival abilities they did not know they had. The blade is inscribed with
+ Tengwar writing "Sting is my name, I am the spiders' bane."
+
+The Scimitar 'Haradekket'
+ A damascened scimitar that seems wondrously easy to hold. Famed in song
+ as the "Sickle of Harad", and a deadly foe to the undead.
+
+The Short Sword 'Gilettar'
+ A stubby blade worn by Beren, whose horn sounded of old in the glades of
+ Brethil.
+
+The Blade of Chaos 'Daedheloth'
+ This weapon of wrath is named after the realm of Morgoth Bauglir. Cursed
+ with a violent anger, dives hungrily into the flesh of its enemies. It
+ gathers shadows of death into its owner as they inflict wounds that will
+ never heal.
+
+The Long Sword 'Sereghathol'
+ Blood-Sword it is called, after its thirst for the blood of foes.
+
+The Long Sword of Angmar
+ Dark flames wreath the naked steel of the Witch-King of Angmar. A mighty
+ curse to all those who wield it apart from its master, the torture of the
+ wraithworld awaits those who dare.
+
+The Broken Sword 'Narsil'
+ These are the shards of the mighty blade of Isildur, which deprived the
+ dark lord Sauron of The One Ring of Power. Legend has it that the sword
+ that was broken shall be reforged. You can barely make out a Tengwar
+ inscription on the pommel, reading "Narsil essenya, macil meletya;Telchar
+ carneron Navarotesse." - "Narsil is my name, a mighty sword;Telchar made
+ me in Nogrod."
+
+The Long Sword of Dernhelm
+ Eomer's sister Eowyn once wielded this shining sword when she battled
+ the Witch-King of Angmar, hiding her true identity to join the battle.
+ Others are less likely to notice the wielder immediately. Eowyn's sword
+ also allowed her to move swiftly, sense powerful enemies, inflict terrible
+ wounds, and partly withstand the worst attacks of the Nazgul.
+
+The Bluesteel Blade 'Ancanaur'
+ "The Jaws of Fire", this is the sword that Feanor forged in secret to do
+ battle against his enemies. The sword which threatened Fingolfin, the
+ sword which in the end did not prevent its owner's untimely death.
+
+The Broad Sword 'Guthwine'
+ The sword of Eomer, son of Eomund, leader of the Riders of the Mark. As
+ one flashed this sword with Anduril during a battle long ago. Legendary
+ are its powers in the rallying of desperate troops.
+
+The Long Sword 'Herugrim'
+ The ancient blade of Theoden, King of the Mark. It was taken from the king
+ by Grima the Wormtongue, and hidden from him in a dusty chest. It was once
+ instrumental in restoring the King's wits from evil bewitchment.
+
+The Bluesteel Blade of Ephel Duath
+ This filthy orc-blade is famed for vile deeds of torture and blood, and its
+ wielder will never cease to fear treachery.
diff --git a/lib/mods/theme/file/book-7.txt b/lib/mods/theme/file/book-7.txt
new file mode 100644
index 00000000..ea7d0df2
--- /dev/null
+++ b/lib/mods/theme/file/book-7.txt
@@ -0,0 +1,83 @@
+ -----------------------
+ | Artifact Lore Vol. II |
+ | Polearms |
+ -----------------------
+
+The Spear of Melkor
+ The mighty spear used once by Melkor to slay the trees of Valinor.
+
+The Beaked Axe of Hurin
+ Wielded by Hurin Thalion in the Fifth Battle of Beleriand, this troll-bane
+ smoked in the black blood of Gothmog's guards.
+
+The Beaked Axe of Dain Ironfoot
+ The narrow axe head of this weapon, finely balanced by a crow's beak,
+ would pierce even the armour of Smaug, and its wielder becomes aware of
+ the minds of their enemies.
+
+The Glaive of Pain
+ The massive chopper that crowns this glaive glows blood-red and black;
+ fell spells of annihilation swirl and dance as you swing death's myrmidon
+ down.
+
+The Halberd 'Osondir'
+ Lordly and tall did Osondir stand against the wrath of giants, and
+ clear-eyed in barrows fell, wielding a halberd glowing ruby red.
+
+The Pike 'Til-i-arc'
+ Within this long thrusting spear lie the spirits of frost giants and fire
+ demons, who war forever, trapped by magely spells.
+
+The Spear 'Aiglos'
+ The mighty spear of Gil-galad, famed as "Snow-point" in the songs of
+ Elves, against which all the foul corruptions of Sauron dashed in vain.The
+ spear is inscribed with Tengwar runes, reading "Gil-galad ech vae
+ vaegannen matha, / Aith heleg nin i orch gostatha; / Nin cniel na
+ nguruthos / Hon ess nn istathawell-made spear,/ The Orc will fear my point
+ of ice; / When he sees me, in fear of death / he will know my name.
+
+The Spear of Caradhras
+ A magical spear, rumoured to have been forged by Orome himself in the
+ coldest reach of the cruel Redhorn.
+
+The Spear 'Nimloth'
+ A thin spike of thrice-forged steel caps a straight sylvan shaft cut from
+ a legendary tree; spells to break the will of the undead and strike cold
+ fear into the hearts of foes lie on this perfectly balanced spear.
+
+The Lance of Eorlingas
+ "Forth Eorlingas!". To the field of Cormallen came Eorl the Young to save
+ beleaguered Gondor, and from his lance fled massive trolls and dire wolves.
+ It is one of two items that once belonged to Eorl the Young, valiant hero
+ of the Mark.
+
+The Battle Axe of Balli Stonehand
+ The twin blades of this weapon were forged in Belegost, and powerful
+ forces to resist and endure lie ready for he who shall wield it once more.
+
+The Battle Axe 'Lotharang'
+ A superbly crafted double-bladed axe that slays the creatures of earth and
+ allows rapid recovery from their blows.
+
+The Lochaber Axe of the Dwarves
+ A massive axe with twin razor-sharp heads, so large that it usually
+ requires two hands to wield, intricately engraved in gold with spells to
+ ward off the elements and smite evil.
+
+The Trident of Osse
+ The awesome weapon is imbued with some of the power of the Vala Ulmo, Lord of
+ Waters. It allows the wearer to laugh in scorn at the dread powers of the
+ undead, and be utterly in command of the element of water.
+
+The Scythe 'Avavir'
+ With elemental powers whose struggles turn this weapon red and purest
+ white, this shining reaper bears within it a power of going forth and
+ returning.
+
+The Lochaber Axe of Gothmog
+ The black axe of Gothmog, which struck Fingon at Nirnaeth. Mighty spells
+ of evil make it unsafe in any hands but of the original wielder.
+
+The Lochaber Axe 'Lhugdagnir'
+ Forged by the Dwarves to defend their home of Khazad-dum from dragons,
+ this axe has been lost to time... until now.
diff --git a/lib/mods/theme/file/book-8.txt b/lib/mods/theme/file/book-8.txt
new file mode 100644
index 00000000..bf99a12a
--- /dev/null
+++ b/lib/mods/theme/file/book-8.txt
@@ -0,0 +1,101 @@
+ ------------------------
+ | Artifact Lore Vol. III |
+ | Hafted Weapons |
+ ------------------------
+
+The Mighty Hammer 'Grond'
+ The mighty Hammer of the Underworld, blackened by doomspells of
+ shattering, whose wielder holds the lives of all Morgoth's servants in his
+ hand.
+
+The Flail 'Totila'
+ A flail whose head befuddles those who stare as you whirl it around, and
+ becomes a fiery comet as you bring it down.
+
+The Two-Handed Flail 'Thunderfist'
+ The long-lost weapon of Kzurin, Dwarven champion of ancient Belegost, with
+ runes of strength in its handle, and flames and sparks that roar and
+ crackle around its massive head.
+
+The Morning Star 'Maegnas-in-sereg'
+ You feel strong and firm of foot as you whip the chain-suspended spiked
+ orb around - and bathe it in the blood of your foes.
+
+The Morning Star 'Naurgil'
+ A famed battle-lord of old, with a ruddy head, coloured as embers are that
+ can yet rise up in wrath.
+
+The Mace 'Taratol'
+ A great ridged mace that calls around you a nimbus of living lightning;
+ you remain utterly untouched even as fat sparks arc around your fingers
+ and eyebrows.
+
+The War Hammer of Gamil Zirak
+ Gamil Zirak was a great craftsman, the master of Telchar of Nogrod. This
+ weapon was rescued from Thingol's treasury, and it is rumoured that its
+ wielder need not fear dragons or other fell beings of the Dark.
+
+The Quarterstaff 'Nar-i-vagil'
+ Named for a fiery star and set with gems of great worth binding mystic
+ virtues of protection and thought.
+
+The Quarterstaff 'Eriril'
+ The radiant golden staff of an Istari of legend, this wizard's companion
+ grants keen sight and the knowledge of many hidden things.
+
+The Quarterstaff of Olorin
+ A staff tall and sturdy, with rough-hewn runes that invoke the element of
+ Earth, and which strikes down all creatures who live in the shadow of
+ mountains.
+
+The Mace of Disruption 'Nguruthos'
+ A weapon so massive it seems beyond the strength of mortals, yet you feel
+ the might of giants within you as you heft it. As you grip the handle of
+ ebony and steel, coronas of fire blaze and mighty spells to preserve magic
+ activate around you. It is named 'Fear of Death' - you wield the Fear of
+ Dragons and the Despair of the Undead.
+
+The Lucerne Hammer 'Turmil'
+ Wielded by the High Priest of Meneltarma, this great mace gleams coldly as
+ though moonlit, and it can strike as mighty a blow spiritually as
+ physically.
+
+The Whip of Gothmog
+ With this unbearably bright whip of flame, the Balrog Gothmog has become
+ known for never having lost in combat.
+
+The Whip 'Lasher'
+ A powerful whip that is deadly against orcs. It poisons your foes and is
+ said to go "snicker snack".
+
+The Ball-and-Chain of Fundin Bluecloak
+ The weapon of one of the great dwarven priests, with powers to preserve
+ body, soul and enchantments, and the bane of those who seek life beyond
+ death.
+
+The Lead-Filled Mace 'Dolcrist'
+ This mighty bludgeon brings destruction to all around it, and is the bane
+ of dragons and magic. Skull-cleaver (or head-cleaver) it is called.
+
+The Quarterstaff of Radagast
+ Rumored to be a gift from Yavanna to Radagast the Brown, this
+ plain-seeming oak staff shields its bearer against the elements and helps
+ him fight off malicious beasts (such as the goblins' Warg-steeds). It
+ also grants exceptional insight into Nature magic, and can even cause
+ trees or healing herbs to spring forth at the bearer's command.
+
+The Mage Staff of Saruman
+ A white quarterstaff that faintly gleams a pale white, it once belonged to
+ one of the most powerful beings on Middle-Earth, Saruman the White.
+ Saruman fell into shadow, and the staff left him during his travels. As
+ you wield it, you become much more attuned to magic.
+
+The Quarterstaff of Thranduil
+ The carven oak staff of the King of the Woodland Realm, this weapon is a
+ fighter's best friend in a forest.
+
+The Mage Staff of Forochel
+ A shaft of pure, invincible crystal cut from the heart of one of the great
+ glaciers ringing the Ice-Bay of Forochel. While you hold it, your mind feels
+ as clear as the winter sky.
+
diff --git a/lib/mods/theme/file/book-9.txt b/lib/mods/theme/file/book-9.txt
new file mode 100644
index 00000000..878d4b74
--- /dev/null
+++ b/lib/mods/theme/file/book-9.txt
@@ -0,0 +1,99 @@
+ ------------------------
+ | Monstrous Compendium 1 |
+ | Humanoids |
+ ------------------------
+
+ *** Townsfolk (t) ***
+
+These are the monsters you will find in the various towns all across
+Middle-earth. Most of them are neutral to the player, though those who
+are not neutral are quite harmless, unless you take them on before you
+are strong enough. The townsfolk include [[[[[oAimless-looking merchants],
+[[[[[UPitiful-looking beggars], [[[[[ySinging, happy drunks], [[[[[uMangy-looking lepers],
+[[[[[GVillage idiots], [[[[[WBlubbering idiots], [[[[[RBoil-covered wretches], [[[[[gWoodsmen],
+[[[[[wSanctimonious-looking preachers], [[[[[vWeary-looking travellers],
+[[[[[DFilthy street urchins], [[[[[rMean-looking mercenaries],
+[[[[[bAgents of the black market], and [[[[[BBattle-scarred veterans].
+
+ *** Humans (p) ***
+
+These are the various humans inhabiting Middle-earth, from all trades
+and professions, of varying degrees of experience. The novices and
+apprentices are just what their titles imply: new to the craft and thus
+easier to deal with than more advanced masters. Depending on the
+player's race, some of these may be neutral or even coaligned. The
+trades include [[[[[brogues], [[[[[uwarriors], [[[[[rmages], [[[[[omystics], [[[[[Rsorcerers], [[[[[Wrangers],
+[[[[[Gdruids], [[[[[wpaladins], [[[[[ymindcrafters], and [[[[[gpriests].
+
+These also include various subraces of humans from different parts of
+Middle-earth, including the moderately dangerous [[[[[Ueasterlings], [[[[[rVariags],
+[[[[[UCorsairs of Umbar], [[[[[uHaradrim], [[[[[sWainriders], and [[[[[gDunlendings], the very
+dangerous [[[[[DBlack Numenoreans] and [[[[[DOathbreakers], as well as the friendly
+(yet deadly when roused) [[[[[BWavelords].
+
+
+ *** Elves and Halflings (h) ***
+
+The Halflings are a shy race, so there are not that many of them - only
+the [[[[[sScruffy-looking hobbits] and [[[[[UHalfling slingers]. Very stealthy and
+good shots, Halflings. They make excellent burglars.
+
+The [[[[[BMermaids] are an enigma, some argue that they are simply drowned
+Elven maidens, others say they're half-human, half-fish. Whatever they
+are, they are quite dangerous to the unwary adventurer. Another odd
+race are the [[[[[yMind flayers], whose mind powers are legendary and ability
+to deprive others of their sanity unmatched.
+
+The majority of Elven monsters an adventurer will encounter in the
+dungeons will be Dark Elves, all good at a particular profession, and
+much better at these professions than their human counterparts. There
+are simple [[[[[DDark elves] who live by their wits and a bit of magic, and
+then there are [[[[[vDark elven warlocks], [[[[[RDark elven sorcerers], [[[[[GDark elven]
+[[[[[Gdruids], [[[[[gDark elven priests], [[[[[uDark elven warriors], and [[[[[rDark elven]
+[[[[[rmages], all commanded by [[[[[DDark elven lords].
+
+Not all Elves you meet will be hostile and expert at the Dark arts,
+however, among them the [[[[[bAquatic elven warriors], [[[[[WElven archers],
+[[[[[wHigh-elven rangers], and [[[[[oAquatic elven mages].
+
+ *** Dwarves (k) ***
+
+A hardy and stout race, the Dwarves make formidable opponents to any
+adventurer who encounters them. They, too, practice a variety of trades,
+though their spectrum is not as wide-ranging as that of humans or elves.
+The [[[[[DDark dwarven lords] rule over the [[[[[gDark dwarven priests], [[[[[uDark dwarven]
+[[[[[uwarriors], and [[[[[wDark dwarven smiths].
+
+The Dwarves do not trust magic, but a subrace of them - the Petty-dwarves
+- do practice it, you will see both plain [[[[[sPetty-dwarves] and [[[[[RPetty-dwarf]
+[[[[[Rmages].
+
+Some adventurers who know the correct incantation will be able to summon
+[[[[[Udwarven warriors] to their aid.
+
+ *** Gnomes, leprawns, and their kin (l) ***
+
+The gnomes are a less-well-known race on Middle-earth; they are related
+to the Petty-dwarves, but they are not nearly as stout as Dwarves. The
+gnomes are quite cunning and smart, but not very strong. Their [[[[[sgnome lords]
+command the [[[[[ugnome warriors], [[[[[bgnome rogues], [[[[[rgnome priests], [[[[[Rgnome mages],
+[[[[[wgnome paladins], and [[[[[ognome mystics].
+
+A race closely related to gnomes are the leprawns - they are even smaller
+than gnomes, and much weaker. However, leprawns breed very quickly and an
+unwary adventurer might be overrun if he is not careful! The [[[[[vmalicious]
+[[[[[vleprawns] are a nuisance, the [[[[[Wwizard leprawns] are a dangerous nuisance,
+and one is not advised to underestimate the [[[[[Ddeath leprawns].
+
+There also exist [[[[[Gcheerful leprawns] and [[[[[Uadventurer gnomes], who have broken
+with the traditions of their races, and might agree to help other adventurers.
+
+A strange race from the depths are the [[[[[glizard men] with their [[[[[rlizard kings] -
+they are quite strong and command powerful magic. These creatures prefer to
+live in swamps and shallow water areas, however, so you will not encounter
+them in the dungeons often.
+
+
+
+
+
diff --git a/lib/mods/theme/file/bravado.txt b/lib/mods/theme/file/bravado.txt
new file mode 100644
index 00000000..13dec95a
--- /dev/null
+++ b/lib/mods/theme/file/bravado.txt
@@ -0,0 +1,105 @@
+103
+******** BUFFER LINE *********************************** DO NOT REMOVE *******
+cackles evilly.
+cackles diabolically.
+says: 'Surrender, miserable flea!'
+says: 'You shall not pass!'
+says: 'Let's see if you are worthy!'
+laughs devilishly.
+says: 'Flee while you can, gnat!'
+says: 'You are about to die, worm!'
+says: 'Read your prayers!'
+hisses: 'Die!'
+says: 'You don't have a chance!'
+says: 'Fear my wrath, fool!'
+says: 'Feel my fury!'
+stares at you darkly.
+gives you a contemptuous glance.
+says: 'Prepare to meet your destiny!'
+says: 'Perish, mortal!'
+says: 'Your puny efforts make me laugh!'
+says: 'Hell hath no fury like mine!'
+says: 'You should have fled while you had the chance.'
+screams: 'Die by my hand!'
+says: 'Your last wish?'
+says: 'Your death shall be a slow, painful one.'
+says: 'Your head shall be my next trophy.'
+screams: 'You are DOOMED!'
+grins sadistically.
+says: 'This dungeon shall be your TOMB!'
+laughs fiendishly.
+says: 'Your fate is sealed, worm.'
+says: 'Resistance is useless.'
+says: 'Hell shall soon claim your remains.'
+says: 'Thou shalt repent of thy cunning.'
+says: 'Aye, you will make fine eating, when you have hung a bit.'
+says: 'Surrender or die!'
+says: 'Savor thy breath, it be thine last.'
+says: 'Prepare do die!'
+says: 'You shall be bruised and battered to pieces when I'm through!'
+says: 'And ever so my foes shall fall!'
+says: 'Begone now ere my arrows fly!'
+says: 'Hammer and tongs! Knocker and gongs!'
+whispers nasty things.
+says: 'I shall flatten you!'
+says: 'I could spare you, but why?'
+says: 'I'll slaughter you slowly...'
+says: 'Nothing can save you now!'
+eyes your money pouch covetously.
+says: 'I bet I can shoot better than you...'
+says: 'I hope you enjoy pain!'
+says: 'Give me your best blow!'
+spouts torrents of obscenities.
+says: 'A time to die, fool!'
+bellows frighteningly!
+says: 'You will never leave this dungeon alive!'
+says: 'You'll leave this dungeon only in a wooden box!'
+attempts to read a Scroll of Curse Weapon at you!
+snickers: 'Now, I strike a blow for *our* side!'
+says: 'I love the smell of fresh blood.'
+says: 'I shall torture you slowly.'
+chuckles evilly.
+says: 'Victim is your name and you shall fall.'
+says: 'Stepping out? You'll feel our hell on your back!'
+says: 'Now I will waste my hate on you.'
+says: 'I will prepare something particularly uncomfortable for you.'
+says: 'I shall smite thee with extreme prejudice!'
+says: 'Verily, it is too late for thee.'
+says: 'You'll die as you lived, in a flash of the blade.'
+brags: 'My power is beyond compare!'
+says: 'I just want to see your blood, I just want to stand and stare.'
+says: 'I've been looking so long for you; you won't get away from my grasp.'
+says: 'A mere mortal dares challenge my might?'
+says: 'Too bad you are unlucky. But even that would not help you now.'
+sings: 'Swish, smack! Whip crack!'
+says: 'Think of it this way: you are fated to die here. DIE!'
+says: 'There is no escape and that's for sure.'
+says: 'This is the end; I won't take anymore.'
+says: 'Say goodbye to the world you live in.'
+says: 'Your weapon is no match for mine!'
+brags: 'I'm a friend of the Boss's, I am.'
+says: 'I can't help but laugh at your pathetic attempts.'
+lets out a truly awful cry of rage!
+says: 'My innocent victims are slaughtered with wrath and despise!'
+says: 'I have found you, and there is no place to run.'
+laughs at your wild swings.
+says: 'And damn'd be him that first cries: Hold, enough!'
+says: 'I can smell your blood!'
+says: 'Has your folly led to this?'
+wonders aloud how many experience points you're worth.
+says: 'Pride yourself on this, that you were slain by a champion.'
+thunders: 'May Eru have mercy on your soul, for I will have none.'
+screams for your blood!
+sighs: 'They send a poorer grade of adventurers down each year than the last.'
+says: 'Your life-blood will baptise my blade!'
+shouts: 'You are already dead!'
+snickers: 'You and what army could harm me?'
+says: 'You're almost not worth killing... almost!'
+leaps towards you with death in its eye.
+sings: 'Clash, crash! Crush, smash!'
+says: 'Another adventurer? I just got through picking my teeth with the last.'
+says: 'Your two ears will decorate my belt.'
+says: 'Consider yourself warned.'
+says: 'I don't want to hurt you, I only want to kill you.'
+says: 'I am fated never to die by the hand of a mortal. Just give up.'
+screams: 'I'm out to destroy and I will cut you down!'
diff --git a/lib/mods/theme/file/chainswd.txt b/lib/mods/theme/file/chainswd.txt
new file mode 100644
index 00000000..4755391c
--- /dev/null
+++ b/lib/mods/theme/file/chainswd.txt
@@ -0,0 +1,8 @@
+6
+******** BUFFER LINE *********************************** DO NOT REMOVE *******
+KILL, KILL, KILL!
+The Chainsword roars noisily!
+VROOM! VROOM!
+Kill, kill, kill, kill, kill, kill!
+Blood, blood, blood!
+Bloodbath!
diff --git a/lib/mods/theme/file/dam_huge.txt b/lib/mods/theme/file/dam_huge.txt
new file mode 100644
index 00000000..62f2ba60
--- /dev/null
+++ b/lib/mods/theme/file/dam_huge.txt
@@ -0,0 +1,9 @@
+7
+******** BUFFER LINE *********************************** DO NOT REMOVE *******
+You nearly decapitate %s!
+You impale %s on your weapon.
+Your weapon almost slices %s in half!
+%^s's head caves in!
+You broke %s's spine!
+Your weapon slices into %s's heart!
+You smashed %s's ribcage!
diff --git a/lib/mods/theme/file/dam_lots.txt b/lib/mods/theme/file/dam_lots.txt
new file mode 100644
index 00000000..1784d67c
--- /dev/null
+++ b/lib/mods/theme/file/dam_lots.txt
@@ -0,0 +1,21 @@
+18
+******** BUFFER LINE *********************************** DO NOT REMOVE *******
+You stab %s in the stomach.
+You cut off %s's hand.
+You chop down on %s's shins.
+You gave %s a deep gash.
+You gave %s a gigantic bruise.
+You cut off %s's arm!
+You cut off %s's leg!
+You stab %s in the heart.
+You slash at %s face.
+You throw %s down at the ground.
+You attempt to strangle %s.
+You grab %s's head and twist it.
+You knocked out several of %s's teeth!
+You broke some of %s's ribs!
+%^s spins around dizzily after your blow.
+%^s sputters at your tight, choking hold!
+%^s grunts under the force of your blows.
+%^s screams shrilly in fear.
+
diff --git a/lib/mods/theme/file/dam_med.txt b/lib/mods/theme/file/dam_med.txt
new file mode 100644
index 00000000..fc1db066
--- /dev/null
+++ b/lib/mods/theme/file/dam_med.txt
@@ -0,0 +1,25 @@
+23
+******** BUFFER LINE *********************************** DO NOT REMOVE *******
+You kick %s in the belly!
+You head-butt %s.
+You push %s over.
+You broke %s's finger!
+You broke %s's toe!
+You kick %s in the shins.
+You stab %s in the arm.
+You stab %s in the leg.
+You hit %s over the head.
+You knee %s in the groin!
+You aim a high kick at %s's head.
+You stab %s in the ribs.
+You chop at %s's neck.
+You put a tight choke-hold on %s.
+You attempt to topple %s over.
+You punch %s.
+You attempt to poke %s in the eye!
+You twist %s's leg.
+You twist %s's arm.
+You bend %s's fingers.
+You punch %s in the kidneys!
+You smash %s with your elbow.
+You smash %s with your knee.
diff --git a/lib/mods/theme/file/dam_none.txt b/lib/mods/theme/file/dam_none.txt
new file mode 100644
index 00000000..a6c20248
--- /dev/null
+++ b/lib/mods/theme/file/dam_none.txt
@@ -0,0 +1,24 @@
+22
+******** BUFFER LINE *********************************** DO NOT REMOVE *******
+You scratch %s.
+You give %s a nasty bruise.
+You stub %s's toe.
+You jab %s in the ribs.
+You almost poked your eye out while fighting %s!
+You made %s's nose bleed.
+You almost slipped while fighting %s.
+%^s doesn't even flinch!
+You accidentally hurt yourself while fighting %s.
+You slap %s.
+%^s slips and falls.
+%^s laughs at your wild swings.
+You pull at %s's hair.
+You punch %s in the nose.
+You pull at %s's ear.
+%^s growls at you.
+%^s is very, very annoyed!
+You scream an insult at %s.
+%^s makes a nasty face.
+You scowl at %s.
+%^s gnashes his teeth.
+%^s lets out a gurgling laugh.
diff --git a/lib/mods/theme/file/dam_xxx.txt b/lib/mods/theme/file/dam_xxx.txt
new file mode 100644
index 00000000..afceffe1
--- /dev/null
+++ b/lib/mods/theme/file/dam_xxx.txt
@@ -0,0 +1,11 @@
+9
+******** BUFFER LINE *********************************** DO NOT REMOVE *******
+%^s disintegrates into a fine mist!
+%^s splatters all over the floor.
+%^s explodes into tiny chunks.
+%^s's bones are crushed at the force of your blow!
+You almost squash %s into a pancake!
+Your weapons neatly slice %s into many little pieces.
+You cleave %s in half.
+%^s's head flies off in a wide trajectory.
+%^s is driven several feet into the ground under your blow!
diff --git a/lib/mods/theme/file/dead.txt b/lib/mods/theme/file/dead.txt
new file mode 100644
index 00000000..f32dae4d
--- /dev/null
+++ b/lib/mods/theme/file/dead.txt
@@ -0,0 +1,24 @@
+ #s_____#w #D,#w-#Wv#s___#w
+ #s_d&#y*#D'"#w #W/#w #D`#w|
+ #D,#W/#s?#D'#w | |#D'#w
+ #s?#D'#w|#D'#w | #D.,#W~#w-#D'""'#w |#D.#w
+ #D,#w| #sT#w --#y+#w-- #D,#W~#D'#w #D.,#W~#s:#w| #D`#W~\#w
+ | #sL#w | #D,#Wv#s_#D.#w #W/#D'#w #D,#W/#D"#w | #sT#D`#W\#D.`#W\#D.#w
+ |#D.#w |#W\#w | #D""'#w #s?#w--#Wv#D,#s?#w |#D'#w #s?#D,#w #W\#D.#w
+ #W\#w #D`#W\#D.#w #sT#w #D`#W~#w-#W\#s_]#w |
+ #D`#W\#D.#w #D"#W^~v#D.#w | #D"#W^#w-#W~v#w
+ #D`#W\#s_#w #sT#D.#w #D"#W^~v#w #D.#s__#D.#w #W/#w
+ #D``#w-#W~#w--| | |#D,#w #D"#s:#w| #D.#s___#D.#w #D.#w|
+ #D`#W\#w #s?#W\#w #W/#w #W/#w #D"#s:&#w #D,#w-#Wv#s_#W/#w
+ #D`#W\#D.#w #D`#W\#w| |#D'#w #D.,#W~#D'#w #D.#W/#D'#w
+ #D`#W~\#D.#w #D`#W^#D'"#w #D,#W~#D'#w
+ #D.#w| #s__#Wv#w-#W~#D''#w
+ #W/#w #W/#D'#w
+ #D,#w| #D.#w|
+ #W/#w #sJ#w
+ |#D'#w |
+---------------------------------------------#W/#w #W/#s:#w-------------------------
+ |#D'#w #D,#w|
+ |#D'#w #D'#w
+ #D`#w
+
diff --git a/lib/mods/theme/file/death.txt b/lib/mods/theme/file/death.txt
new file mode 100644
index 00000000..f033fa56
--- /dev/null
+++ b/lib/mods/theme/file/death.txt
@@ -0,0 +1,351 @@
+349
+******** BUFFER LINE *********************************** DO NOT REMOVE *******
+Tangado a chadad!
+AAAAAAAAARRRRRRRRRRRRRRGGGGGGGGGGGGGHHHHHHHHHHHHHHH!!!!!!!!!!!!
+AAAARRRGGGHHH!!!
+Somehow, I have a bad feeling about this...
+Strangely, all of a sudden I don't feel so good.
+You can see armored women on winged horses coming for you.
+Oh well, you can't always win.
+I'm too young to die!
+I'll be back!
+O, untimely death!
+Slave, thou hast slain me!
+Prepare to fire!
+Who knocked?
+Hello again, poor Yorick.
+Ouch.
+Et tu, Brute! Then fall, Caesar!
+O! I die, Horatio...
+I told you to be careful with that sword...
+This guy's a little crazy...
+Ok, ok, I get it.
+YASD
+Who turned off the light..?
+Join the army, see the world, they said...
+This one's for the YASD hall of fame.
+Rats!
+Shall this fellow live?
+Help, ho!
+What ho! Help!
+What hast thou done?
+I'll be revenged on the whole pack of you!
+You will *pay* for this!
+They say blood will have blood...
+Violence is no solution!
+Yes?
+#&%#&#%*#*&%!!!!!
+I must away, ere break of day...
+No time to make a testament?
+Ugh!
+Aargh!
+Aaagghhh!
+I'm melting!
+Oof..
+Oh!
+Did somebody knock?
+I hear the tramp of doom.
+To fly would be folly.
+The wind came down from mountains cold.
+Cut the bridges! To arms! To arms!
+Eeek!
+Aah!
+I hate it when that happens.
+One direct hit can ruin your whole day.
+Oh no!
+Not me!
+Ouch.
+Oh no, not again.
+Another one bites the dust.
+Goodbye.
+Help me!
+Farewell, cruel world.
+O! wandering folk, the summons heed!
+I go now to the halls of waiting.
+This is the End, my only friend.
+It's all over.
+This is a bitter adventure, if it must end so.
+Why does everything happen to me?
+I'm going down.
+I leave now all gold and silver, and go where it is of no worth.
+But sad or merry, I must leave it now. Farewell!
+His armour is shivered, his splendour is humbled.
+Roads go ever ever on.
+Yet feet that wandering have gone, turn at last to home afar.
+I should've listened to my mother...
+Presumed dead.
+What was that noise?
+For blood ye shall render blood.
+It's just one of those days...
+I see a bright light...
+The Shadow does not hold sway yet.
+I let you hit me!
+...and in the Darkness bind them.
+I didn't want to live anyway.
+-<sob>-
+One Ring to rule them all, One Ring to find them...
+Was that as close as I think it was?
+Monsters rejoice: the hero has been defeated.
+It wasn't just a job it was an adventure!
+I didn't like violence anyway!
+I thought you liked me?
+Such senseless violence! I don't understand it.
+Leithio i philinn!
+Somehow I don't feel like killing anymore.
+Help me! I am undone!
+Fire the arrows!
+This fell sergeant, Death, is strict in his arrest...
+The rest is silence.
+Guh!
+Sedho, hodo.
+You've run out of life.
+Thou art slain.
+Finish him!
+Trust me, I know what I'm doing...
+Die, mortal!
+Kill men i' the dark! What be these bloody thieves?
+Ho! Murder! Murder!
+O! I am spoil'd, undone by villains!
+O murderous slave! O villain!
+O, falsely, falsely murder'd!
+A guiltless death I die.
+AAAAAAAAAAAAAAAAAAAAAAAAHHHHHHH!
+Trust me.
+Be still, lie still.
+There-is-no life in-the-cold, in-the-dark.
+Look, behind you!!!
+Here - in-the-void only death.
+I have kept no hope for myself.
+I don't believe this!
+Oops.
+I Aear can ven na mar.
+Can't you take a joke?
+Well, I didn't much like this character, anyway...
+Oops, sorry... didn't mean to disturb you.
+I never get to have any fun!
+Stop!
+The Sea calls us home.
+Don't worry. I've got a plan.
+It didn't look so tough.
+Run away!
+Aiya Earendil Elenion Ancalima!
+AGAIN!?!?!
+I don't like this dungeon...
+Maybe this wasn't such a good idea.
+My God will protect me.
+You wouldn't dare!
+Hail Earendil brightest of the Stars!
+Farewell sweet earth and northern sky.
+And I've *never* done you any harm.
+I don't understand. It should be dead by now.
+I'm heir to the crown. They wouldn't dare!
+Mourn not overmuch! Mighty was the fallen.
+When winter comes without a spring that I shall ever see.
+Cover me.
+Watch this.
+O! Rowan dead, upon your head your hair is dry and grey.
+I will not yield.
+...but like a man he died.
+If you cut me down, I will only become more powerful.
+Well, at least I tried...?
+What could possibly have gone wrong?
+You die...
+Out of doubt, out of dark, to the day's rising.
+Surrender? Never!
+I'm sure reinforcements will get here on time. They promised.
+Hope he rekindled, and in hope ended.
+I have a very bad feeling about this.
+Over death, over dread, over doom lifted.
+I feel I could cast 'Speak with Dead' and talk to myself.
+Oh, that's just a light wound.
+Out of loss, out of life, unto long glory.
+I thought you were on MY side...
+Next time, try talking!
+Now for wrath, now for ruin and a red nightfall!
+Death in the morning and at day's ending...
+For into darkness fell his star...
+Where'd everybody go?
+Caveyard! Paveyard!
+What do you mean 'aaargllhhhh'? Hey man, I've paid for this.
+Ay! Ay! Ay!
+Ohe! Ohe! Ohe!
+Et tu, Caesar! Then fall, Brute!
+Even the best laid plans...
+Hey, not too rough!
+The Random Number Generator hates me!
+So when I die, the first thing I will see in heaven is a score list?
+Can't we talk this over?
+Wait! Spare me and I'll make you rich! Money is not a problem!
+I hate you!
+By the kind gods, 'twas most ignobly done!
+Thy nuncle was dead as a lump o' lead.
+A bump o' the boot on the seat.
+I'm the hero of this story! I CAN'T die!
+I thought heroes were supposed to win!
+I stood upon the bridge alone.
+You've fallen and can't get up!
+Dark is the path appointed for thee.
+Sure don't look good...
+Thy heart shall then rest in the forest no more.
+Hey - I've got lawyers.
+Thanks, I needed that.
+The Winter comes, the bare and leafless Day.
+Where now the horse and the rider?
+Fatality!
+Brutality!
+Who shall gather the smoke of the dead wood burning?
+For our days are ending and our years failing.
+I saw him walk in empty lands, until he passed away.
+All is lost. Monks, monks, monks!
+All my possessions for a moment of time!
+His cloven shield, his broken sword, they to the water brought.
+It is death, my boy: they have deceived me.
+Everyone dances with the Grim Reaper.
+His limbs they laid to rest.
+I will not say the Day is done, nor bid the Stars farewell.
+I am innocent, innocent, innocent!
+Watch where you're pointing with that sword! You nearly...
+The shadow lies upon my tomb...
+My cup runneth over...
+Of course I know what I am doing.
+It looked harmless.
+I have drained my cup to the bitter dregs.
+Si man i yulma nin enquantuva?
+Look! I'm flying!
+Namarie!
+I'll be back... as soon as I can.
+Fell deeds awake: fire and slaughter!
+Cold be hand and heart and bone...
+Yes! Yes! YES! YES! YY... AAARRRGGGHH!
+...cold be sleep under stone.
+Never more to wake on stony bed...
+Been nice knowing you.
+But I just got a little prick!
+Till the Sun fails and the Moon is dead.
+Hey guys, where are you?
+Hey look... ARCHERS!
+I can't probably miss...
+I don't care. I have a Scroll of Raise Dead.
+I don't care. I have a Ring of Regeneration.
+I have this dungeon at home, I know where everything is!
+This HAS to be an illusion. I attempt to disbelieve it.
+I thought you could be trusted.
+Never try to sneak in a plate mail.
+I'll never surrender.
+I'll use the Cheat Death option...
+I'm invincible!
+I'm death incarnate! Nothing can harm me!
+Hey, it was only a joke, all right?
+Hey, don't talk to me like that!
+In the black wind the stars shall die...
+Out into the barren lands.
+Where is my spellbook of Hand of Doom?
+Let me handle this.
+No problem. That's easy.
+But I have double resist!
+So what?
+Tell me this is an illusion... please!
+I hate the Random Number Generator.
+Oh. I didn't know it could resist that.
+Trust me.
+CHARGE!
+What do you mean, how many hit points do I have?
+What do you mean, my GOI expired?
+Yeah, I knew it was dangerous, but I was thinking about the experience points.
+I knew I should have played with stupid monsters on.
+I knew I shouldn't have let monsters learn from their mistakes.
+I'm not afraid of death. I just don't want to be there when it happens.
+I have such sweet thoughts.
+I pray you all pray for me.
+I shall hear in heaven.
+Is not this dying with courage and true greatness?
+I must sleep now.
+OK, turning that option on was a bad idea.
+It is finished.
+That unworthy hand! That unworthy hand!
+I am dying.
+Oh, dear.
+I will not kneel. Strike!
+I have led a happy life.
+Dying, dying.
+I feel the flowers growing over me.
+Now it is come.
+Let me die to the sound of sweet music.
+I will now enter the Halls of Mandos.
+Ungrateful traitors!
+We perish, we disappear, but the march of time goes on forever.
+Youth, I forgive thee.
+Treason! Treason!
+Coward! Why did you not protect me?
+I am absolutely undone.
+It is well. I die hard, but am not afraid to go.
+Do let me die in peace.
+Nothing is real but pain now.
+Violent use brings violent plans.
+Ha, ha, wrong again.
+Bodies fill the fields I see, the slaughter never ends.
+Life planned out before my birth, nothing could I say.
+Blood will follow blood, dying time is here.
+Never happy endings on these dark sets.
+This was supposed to be easy.
+I don't get it.
+But I read the manual!
+I was born for dying.
+The higher you walk, the farther you fall.
+Where's your crown, King Nothing?
+*sigh*
+My descendants will avenge me.
+I should have listened to my ancestors.
+I should have read the help files.
+There's a time to live, and a time to die, when it's time to meet the maker.
+One ill turn deserves another.
+Only the good die young, all the evil seem to live forever.
+That's not what the Wand of Death was supposed to do.
+And in my last hour, I'm a slave to the power of death.
+Now I am cold, but a ghost lives in my veins.
+*whimper*
+No, this really isn't happening.
+You'll take my life but I'll take yours too.
+We won't live to fight another day.
+As I lay forgotten and alone, without fear I draw my parting groan.
+Somebody please tell me that I'm dreaming!
+Can't it be there's been some sort of error?
+Is it really the end, not some crazy dream?
+Life down there is just a strange illusion.
+Your body tries to leave your soul.
+I'm so tired of living, I might as well end today.
+Life, life! Death, death! How curious it is!
+*bang*
+Flames? Not yet, I think.
+This can't be real.
+Someone call the Shiriff!
+And now the dreams end.
+Awake! Awake! Fear, Fire, Foes! Awake!
+Death greets me warm, now I will just say goodbye.
+What is this? I've been stricken by fate!
+This can't be happening to me!
+I didn't know it was a Scroll of Aggravate Monster!
+You have been dying since the day you were born.
+No point asking who's to blame.
+But for all his power he couldn't foresee his own demise.
+My creator will lay my soul to rest.
+Was that worth dying for?
+Can you say you are proud of what you've done?
+But there are some things which cannot be excused.
+Why is it some of us are here just so that we'll die?
+The shortest straw, pulled for you.
+There's got to be just more to it that this or tell me why do we exist?
+I can't believe that really my time has come.
+'New blood joins this earth...'
+But my Saving Throw is Good!
+I really only like writing poetry.
+What is Time, friend or foe?
+Time waits for none.
+Why didn't I start a Necromancer?
+Flash before my eyes: now it's time to die.
+Gaaaah! This is most frustrating.
+I hate summoners.
+I'm not dead yet. I still have five hit points.
+To sleep, perchance to dream.
+I rolled a 20. How could that be a miss?
+This thing all things devours.
diff --git a/lib/mods/theme/file/elvish.txt b/lib/mods/theme/file/elvish.txt
new file mode 100644
index 00000000..a00b5a22
--- /dev/null
+++ b/lib/mods/theme/file/elvish.txt
@@ -0,0 +1,218 @@
+216
+******** BUFFER LINE *********************************** DO NOT REMOVE *******
+adan
+ael
+in
+agl
+ar
+aina
+alda
+al
+qua
+am
+arth
+amon
+anca
+an
+dune
+anga
+anna
+ann
+on
+ar
+ien
+atar
+band
+bar
+ad
+bel
+eg
+brag
+ol
+breth
+il
+brith
+cal
+en
+gal
+en
+cam
+car
+ak
+cel
+eb
+cor
+on
+cu
+cui
+vie
+cul
+curu
+dae
+dag
+or
+del
+din
+dol
+dor
+draug
+du
+duin
+dur
+ear
+ech
+or
+edh
+el
+eith
+elen
+er
+ereg
+es
+gal
+fal
+as
+far
+oth
+faug
+fea
+fin
+for
+men
+fuin
+gaer
+gaur
+gil
+gir
+ith
+glin
+gol
+odh
+gond
+gor
+groth
+grod
+gul
+gurth
+gwaith
+gwath
+wath
+had
+hod
+haudh
+heru
+him
+hini
+hith
+hoth
+hyar
+men
+ia
+iant
+iath
+iaur
+ilm
+iluve
+kal
+gal
+kano
+kel
+kemen
+khel
+ek
+khil
+kir
+lad
+laure
+lhach
+lin
+lith
+lok
+lom
+lome
+londe
+los
+loth
+luin
+maeg
+mal
+man
+mel
+men
+menel
+mer
+eth
+min
+as
+mir
+mith
+mor
+moth
+nan
+nar
+naug
+dil
+dur
+nel
+dor
+nen
+nim
+orn
+orod
+os
+pal
+an
+pel
+quen
+quet
+ram
+ran
+rant
+ras
+rauko
+ril
+rim
+ring
+ris
+roch
+rom
+rond
+ros
+ruin
+ruth
+sarn
+ser
+eg
+sil
+sir
+sul
+tal
+dal
+tal
+ath
+tar
+tath
+ar
+taur
+tel
+thal
+thang
+thar
+thaur
+thin
+thol
+thon
+thor
+on
+til
+tin
+tir
+tol
+tum
+tur
+uial
+ur
+val
+wen
+wing
+yave
diff --git a/lib/mods/theme/file/error.txt b/lib/mods/theme/file/error.txt
new file mode 100644
index 00000000..5829ffbc
--- /dev/null
+++ b/lib/mods/theme/file/error.txt
@@ -0,0 +1,67 @@
+65
+******** BUFFER LINE *********************************** DO NOT REMOVE *******
+What game do you think you are playing anyway?
+Aivan sairas kaveri kun tuollaista aikoo puuhata!
+Insufficient data for further analysis.
+Non sequitur. Your facts are uncoordinated.
+Type '?' or '\' for help.
+Invalid command.
+What?
+WHAT?!
+You must be out of your mind!
+You're killing me.
+Are you sure?
+Are you sure you know what you are doing?
+Aww, come on!
+That makes no sense.
+I beg your pardon.
+Degreelessness mode on.
+Degreelessness mode off.
+Syntax error.
+That doesn't compute.
+I don't understand you.
+???
+Sure. Piece of cake.
+Error.
+You can't do that!
+Help!
+Come again?
+Sorry?
+Sorry, I'm not sure I understand you.
+What's your point?
+Unknown command.
+Command not found.
+An unexpected error has occurred because an error of type 42 occurred.
+Somehow, you think that would never work.
+Welcome to level 42.
+Don't be ridiculous!
+lfae aierty agnxzcg?
+Soyha, azho bouate!
+I don't fully understand you.
+Why would anybody want to do THAT?
+Yes, yes, now tell me about your childhood.
+Satisfied?
+Something is wrong here.
+There's something wrong with YOU.
+You leap up 9' and perform a miraculous 5xSpiral in the air.
+Aw, shaddap!
+Shut up, smartass!
+I see little point in doing that.
+Oh, really?
+Very funny.
+You've got to be kidding!
+I'm not amused.
+I must have misheard you.
+Nothing happens.
+Where did you learn THAT command?
+When all else fails, read the instructions.
+Why not read the instructions first?
+Cut it out!
+Nothing interesting happens.
+Just how exactly am I supposed to do THAT?
+That's morally wrong and I won't do it.
+I'm not gonna take this abuse.
+AAAAAAAAAAAAAHHHHHHHHHHHHHHHRRRRRRRRRRRGGGGGGGGGGG!
+No more, if you value your character's life!
+I don't have any options, oh my!
+Disk error. (a)bort, (r)etry, (f)ail?
diff --git a/lib/mods/theme/file/mondeath.txt b/lib/mods/theme/file/mondeath.txt
new file mode 100644
index 00000000..e1dc7967
--- /dev/null
+++ b/lib/mods/theme/file/mondeath.txt
@@ -0,0 +1,334 @@
+332
+****** BUFFER LINE *********************************** DO NOT REMOVE *******
+'I must away, ere break of day...'
+'AAAAAAAAARRRRRRRRRRRRRRRRGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHH!!!!!!!!!!!'
+'AAAARRRGGGHHH!!!'
+'Somehow, I have a bad feeling about this...'
+'Strangely, all of a sudden I don't feel so good.'
+'I can see armored women on winged horses coming for me.'
+'Oh well, you can't always win.'
+'I'm too young to die!'
+'I'll be back!'
+'O, untimely death!'
+'Slave, thou hast slain me!'
+'I hear the tramp of doom.'
+'Who knocked?'
+'What's a burrahobbit?'
+'Ouch.'
+'Et tu, Brute! Then fall, Caesar!'
+'To fly would be folly.'
+'I told you to be careful with that sword...'
+'The wind came down from mountains cold.'
+'Cut the bridges! To arms! To arms!'
+'O! wandering folk, the summons heed!'
+'Who turned off the light..?'
+'I go now to the halls of waiting.'
+'I leave now all gold and silver, and go where it is of no worth.'
+'Rats!'
+'Shall this fellow live?'
+'Help, ho!'
+'What ho! Help!'
+'What hast thou done?'
+'I'll be revenged on the whole pack of you!'
+'You will *pay* for this!'
+'They say blood will have blood...'
+'Violence is no solution!'
+'Yes?'
+'#&%#&#%*#*&%!!!!!'
+'This is a bitter adventure, if it must end so.'
+'No time to make a testament?'
+'Ugh!'
+'Aargh!'
+'Aaagghhh!'
+'I'm melting!'
+'Oof..'
+'Oh!'
+'Did somebody knock?'
+'But sad or merry, I must leave it now. Farewell!'
+'His armour is shivered, his splendour is humbled.'
+'Roads go ever ever on.'
+'Yet feet that wandering have gone, turn at last to home afar.'
+'Eeek!'
+'Aah!'
+'I hate it when that happens.'
+'One direct hit can ruin your whole day.'
+'Oh no!'
+'Not me!'
+'Presumed dead.'
+'Oh no, not again.'
+'Another one bites the dust.'
+'Goodbye.'
+'Help me!'
+'Farewell, cruel world.'
+'Blackheart! I have done thy bidding.'
+'For blood ye shall render blood.'
+'This is the End, my only friend.'
+'It's all over.'
+'The Shadow does not hold sway yet.'
+'Why does everything happen to me?'
+'I'm going down.'
+'...and in the Darkness bind them.'
+'One Ring to rule them all, One Ring to find them...'
+'Hail Sauron, Lord of the Ring, Lord of the Earth!'
+'Leithio i philinn!'
+'Fire the arrows!'
+'Sedho, hodo.'
+'Be still, lie still.'
+'What was that noise?'
+'There-is-no life in-the-cold, in-the-dark.'
+'It's just one of those days...'
+'I see a bright light...'
+'Here - in-the-void only death.'
+'I let you hit me!'
+'I have kept no hope for myself.'
+'I didn't want to live anyway.'
+'-<sob>-'
+'I Aear can ven na mar.'
+'Was that as close as I think it was?'
+'The monsters rejoice: the hero has been defeated.'
+'It wasn't just a job it was an adventure!'
+'I didn't like violence anyway!'
+'I thought you liked me?'
+'Such senseless violence! I don't understand it.'
+'The Sea calls us home.'
+'Somehow I don't feel like killing anymore.'
+'Help me! I am undone!'
+'Farewell sweet earth and northern sky.'
+'This fell sergeant, Death, is strict in his arrest...'
+'The rest is silence.'
+'Guh!'
+'Mourn not overmuch! Mighty was the fallen.'
+'Trust me, I know what I'm doing...'
+'Kill men i' the dark! What be these bloody thieves?'
+'Ho! Murder! Murder!'
+'O! I am spoil'd, undone by villains!'
+'O murderous slave! O villain!'
+'O, falsely, falsely murder'd!'
+'A guiltless death I die.'
+'AAAAAAAAAAAAAAAAAAAAAAAAHHHHHHH!'
+'Trust me.'
+'When winter comes without a spring that I shall ever see.'
+'Out of doubt, out of dark, to the day's rising.'
+'Look, behind you!!!'
+'Hope he rekindled, and in hope ended.'
+'Over death, over dread, over doom lifted.'
+'I don't believe this!'
+'Oops.'
+'Can't you take a joke?'
+'Out of loss, out of life, unto long glory.'
+'Oops, sorry... didn't mean to disturb you.'
+'I never get to have any fun!'
+'Stop!'
+'Now for wrath, now for ruin and a red nightfall!'
+'Don't worry. I've got a plan.'
+'It didn't look so tough.'
+'Run away!'
+'Death in the morning and at day's ending...'
+'AGAIN!?!?!'
+'I don't like this dungeon...'
+'Maybe this wasn't such a good idea.'
+'My God will protect me.'
+'You wouldn't dare!'
+'For into darkness fell his star...'
+'Caveyard! Paveyard!'
+'And I've *never* done you any harm.'
+'I don't understand. It should be dead by now.'
+'I'm heir to the crown. They wouldn't dare!'
+'Hey! Where's my stomach? My hands?'
+'Ha! That's the oldest trick in the book.'
+'Cover me.'
+'Watch this.'
+'And damn'd be him that first cries: Hold, enough!'
+'I will not yield.'
+'...but like a man he died.'
+'If you cut me down, I will only become more powerful.'
+'Well, at least I tried...?'
+'What could possibly have gone wrong?'
+'Thy nuncle was dead as a lump o' lead.'
+'Surrender? Never!'
+'I'm sure reinforcements will get here on time. They promised.'
+'A bump o' the boot on the seat.'
+'I have a very bad feeling about this.'
+'I stood upon the bridge alone.'
+'I feel I could cast Speak with Dead and talk to myself.'
+'Oh, that's just a light wound.'
+'Dark is the path appointed for thee.'
+'I thought you were on MY side...'
+'Thy heart shall then rest in the forest no more.'
+'The Winter comes, the bare and leafless Day.'
+'Where now the horse and the rider?'
+'Uhh... oh-oh...'
+'Gee, where'd everybody go?'
+'Who shall gather the smoke of the dead wood burning?'
+'Ay! Ay! Ay!'
+'Ohe! Ohe! Ohe!'
+'Et tu, Caesar! Then fall, Brute!'
+'Even the best laid plans...'
+'For our days are ending and our years failing.'
+'The Random Number Generator hates me!'
+'So when I die, the first thing I will see in heaven is a score list?'
+'Can't we talk this thing over?'
+'Wait! Spare me and I'll make you rich! Money is not a problem!'
+'I hate you!'
+'By the kind gods, 'twas most ignobly done!'
+'I saw him walk in empty lands, until he passed away.'
+'His cloven shield, his broken sword, they to the water brought.'
+'I'm the hero of this story! I CAN'T die!'
+'His limbs they laid to rest.'
+'I've fallen and I can't get up!'
+'I'll be back for my revenge.'
+'Sure don't look good...'
+'I will not say the Day is done, nor bid the Stars farewell.'
+'I'll be back...'
+'The shadow lies upon my tomb...'
+'Thanks, I needed that.'
+'My cup runneth over...'
+'I have drained my cup to the bitter dregs.'
+'Oh, basely done! I had hoped for better of thee!'
+'I am death incarnate! NOTHING can harm me!'
+'Si man i yulma nin enquantuva?'
+'Namarie!'
+'All is lost. Monks, monks, monks!'
+'All my possessions for a moment of time!'
+'Fell deeds awake: fire and slaughter!'
+'Cold be hand and heart and bone...'
+'Everyone dances with the Grim Reaper.'
+'...cold be sleep under stone.'
+'Never more to wake on stony bed...'
+'I am innocent, innocent, innocent!'
+'Watch where you're pointing with that sword! You nearly...'
+'Till the Sun fails and the Moon is dead.'
+'In the black wind the stars shall die...'
+'Of course I know what I am doing.'
+'It looked harmless.'
+'Out into the barren lands.'
+'Where is my spellbook of Hand of Doom?'
+'Look! I'm flying!'
+'But I have double resist!'
+'I'll be back... as soon as I can.'
+'Oh. I didn't know it could resist that'
+'This was supposed to be easy.'
+'Yes! Yes! YES! YES! YY... AAARRRGGGHH!'
+'I don't get it.'
+'But I read the manual!'
+'Been nice knowing you.'
+'But I just got a little prick!'
+'*sigh*'
+'Hey guys, where are you?'
+'Hey look... ARCHERS!'
+'I can't probably miss...'
+'I don't care. I have a Scroll of Raise Dead.'
+'I don't care. I have a Ring of Regeneration.'
+'I have this dungeon at home, I know where everything is!'
+'This HAS to be an illusion. I attempt to disbelieve it.'
+'I thought you could be trusted.'
+'Never try to sneak in a plate mail.'
+'I'll never surrender.'
+'I'll use the Cheat Death option...'
+'I'm invincible!'
+'Hey, it was only a joke, all right?'
+'Hey, don't talk to me like that!'
+'*bang*'
+'You have robbed my revenge of sweetness.'
+'I'll see your descendants later!'
+'Let me handle this.'
+'No problem. That's easy.'
+'*whimper*'
+'So what?'
+'Tell me this is an illusion... please!'
+'I hate the Random Number Generator.'
+'Oh, great.'
+'Trust me.'
+'CHARGE!'
+'What do you mean, how many hit points do I have?'
+'What do you mean, my GOI expired?'
+'One ill turn deserves another.'
+'But, Sharkey!'
+'But I'm famous!'
+'Awake! Awake! Fear, Fire, Foes! Awake!'
+'Idiots! I am surrounded by incompetent idiots!'
+'I have such sweet thoughts'
+'I pray you all pray for me.'
+'Is not this dying with courage and true greatness?'
+'I must sleep now.'
+'I really only like writing poetry.'
+'That unworthy hand! That unworthy hand!'
+'I am dying.'
+'I like happy things. I'm really calm and peaceful.'
+'I will not kneel. Strike!'
+'I have led a happy life.'
+'Dying, dying.'
+'I feel the flowers growing over me.'
+'Now it is come.'
+'Let me die to the sound of sweet music.'
+'I will now enter the Halls of Mandos.'
+'Ungrateful traitors!'
+'We perish, we disappear, but the march of time goes on forever.'
+'Youth, I forgive thee.'
+'Treason! Treason!'
+'Cowards! Why did you not protect me?'
+'I am absolutely undone.'
+'It is well. I die hard, but am not afraid to go.'
+'Do let me die in peace.'
+'Nothing is real but pain now.'
+'Violent use brings violent plans.'
+'Won't you look at all the pretty flowers?'
+'Bodies fill the fields I see, the slaughter never ends.'
+'Life planned out before my birth, nothing could I say.'
+'Blood will follow blood, dying time is here.'
+'Never happy endings on these dark sets.'
+'Gaaaah! This is most frustrating.'
+'What treachery is this?'
+'Greetings, Death, I'm yours to take away.'
+'I was born for dying.'
+'The higher you walk, the farther you fall.'
+'Down here, we all float.'
+'New blood joins this earth...'
+'You labeled me, I'll label you, so I dub thee unforgiven.'
+'See you in the Void!'
+'There's a time to live, and a time to die, when it's time to meet the maker.'
+'Isn't it strange, as soon as you're born you're dying?'
+'Only the good die young, all the evil seem to live forever.'
+'No, no, no. It's not fair.'
+'And in my last hour, I'm a slave to the power of death.'
+'Now I am cold, but a ghost lives in my veins.'
+'This didn't just happen.'
+'You hit me for HOW MUCH damage?'
+'You'll take my life but I'll take yours too.'
+'We won't live to fight another day.'
+'As I lay forgotten and alone, without fear I draw my parting groan.'
+'Somebody please tell me that I'm dreaming!'
+'Can't it be there's been some sort of error?'
+'You cheated!'
+'Life down there is just a strange illusion.'
+'My life suffocates, planting seeds of hate.'
+'I'm not dead yet. I still have five hit points'
+'My body tries to leave my soul.'
+'I'm so tired of living, I might as well end today.'
+'Life, life! Death, death! How curious it is!'
+'Oh well, it's back to square one in HMa.'
+'Flames? Not yet, I think.'
+'Great. Now I can finish my memoirs.'
+'And now the dreams end.'
+'Sharkey made me do it.'
+'Death greets me warm, now I will just say goodbye.'
+'What is this? I've been stricken by fate!'
+'This can't be happening to me!'
+'Flash before my eyes: now it's time to die.'
+'You have been dying since the day you were born.'
+'No point asking who's to blame.'
+'But for all my power I couldn't foresee my own demise.'
+'My creator will lay my soul to rest.'
+'Was that worth dying for?'
+'Can you say you are proud of what you've done?'
+'But there are some things which cannot be excused.'
+'Why is it some of us are here just so that we'll die?'
+'The shortest straw, pulled for me.'
+'There's got to be just more to it that this or tell me why do we exist?'
+'I can't believe that really my time has come.'
+'This is just gruesome.'
+'When the dream dies, the nightmare begins.'
+'This thing all things devours.'
+'This can't be real.'
+'No, this really isn't happening.'
+'I believe my kingdom will come'
diff --git a/lib/mods/theme/file/monfear.txt b/lib/mods/theme/file/monfear.txt
new file mode 100644
index 00000000..fbff8538
--- /dev/null
+++ b/lib/mods/theme/file/monfear.txt
@@ -0,0 +1,63 @@
+61
+*********** BUFFER LINE ********************** DO NOT REMOVE *****************
+says: 'I am too young to die.'
+says: 'Ok, ok!'
+screams: 'Help, ho!'
+screams: 'What ho! Help!'
+says: 'You will pay for this!'
+says: 'Violence is no solution!'
+says: 'I thought you liked me.'
+says: 'Such senseless violence! I don't understand it!'
+screams: 'Ho! Murder! Murder!'
+says: 'Look, behind you!'
+screams: 'Run away!'
+screams: 'Run to the hills! Run for your lives!'
+says: 'Wait! Spare me and I'll make you rich! Money isn't a problem!'
+says: 'I'll be back...'
+begs for you to spare its life.
+says: 'All my possession for a moment of time!'
+says: 'Hey, it was only a joke, all right?'
+says: 'Stop!'
+grovels at your feet.
+says: 'Money? Sure, take it all back!'
+screams: 'Cowards! Why did you not protect me?'
+sobs: 'I didn't MEAN it...'
+begs: 'Spare me and I'll get you Ringil! Really!'
+whimpers and grovels.
+screams: 'Keep that lunatic away from me!'
+shouts: 'Drop that weapon, now!'
+says: 'Fool! You don't know what you're doing!'
+screams for help!
+begs for mercy.
+sobs.
+screams: 'Help! The maniac's murdering me!'
+sobs: 'All right! I apologise! I really, really do!'
+says: 'Wait! Let's make a deal!'
+says: 'Just can't stop this surmounting terror!'
+says: 'If there is a God, then why has he let me die?'
+cringes and whimpers.
+says: 'No hope, no life, just pain and fear.'
+says: 'I am a fugitive, hunted down like game.'
+says: 'You'll live to regret this blasphemous offence!'
+says: 'All my life's blood is slowly draining away...'
+asks: 'Should we be fighting at all?'
+asks: 'What are we fighting for?'
+asks you: 'Can you say you are proud of what you've done?'
+says: 'Every minute I get weaker...'
+says: 'All my life I've run away...'
+says: 'All that I see, absolute horror!'
+says: 'I have fallen prey to failure.'
+says: 'Just leave me alone!'
+says: 'Please, save me!'
+says: 'You've won a battle, but I'll win the war!'
+says: 'You've won this round, next time it's *my* turn!'
+says: 'Another time, another battlefield, *my* victory.'
+says: 'I've got to keep running.'
+says: 'It's all so futile!'
+says: 'Cowards live to fight another day.'
+says: 'Life it seems will fade away, drifting further every day.'
+says: 'Emptiness is filling me, to the point of agony.'
+says: 'Cannot stand this hell I feel!'
+cries: 'Someone help me, oh please God help me!'
+prays fervently to any Gods that are listening.
+cries: 'Spare me!'
diff --git a/lib/mods/theme/file/monspeak.txt b/lib/mods/theme/file/monspeak.txt
new file mode 100644
index 00000000..221326be
--- /dev/null
+++ b/lib/mods/theme/file/monspeak.txt
@@ -0,0 +1,517 @@
+# This is the file for allowing uniques to speak their "own" lines.
+# Deleting this file will have no real effect on the game. Modifying it may
+# cause STRANGE unique lines to come up if the format's wrong, but shouldn't
+# crash anything. The format goes like so:
+#
+# N:45:whoever this is
+# 3
+# says bravado line 1
+# says bravado line 2
+# says bravado line 3
+# 2
+# says fear line 1
+# says fear line 2
+#
+# The number after the N: is the "monster index number" obtained from
+# r_info.txt. The text field after that number isn't actually used--it's
+# just there to help humans edit the file. The numbers on lines by
+# themselves say the number of "bravado" and "fear" lines. Getting these
+# numbers wrong won't crash anything, but will produce strange lines.
+#
+# Two or more monsters can share lines; just put their N: lines in a
+# contiguous block.
+#
+# To stop a certain monster from having unique lines, put a # in front of
+# its N: line.
+#
+# Have fun with this! --Matt G
+
+N:63:Smeagol
+27
+snickers.
+grovels.
+picks his nose.
+pines for his precious.
+searches his pockets.
+eats some slimy creatures.
+mutters: 'My preciouss, where iss my preciouss?'
+shouts: 'No Master Hobbitsisisisis!'
+cries: 'The ring was ours for agesisisisis!'
+says: 'Smeagol sneaking! ME! Shneeeakingsisis!'
+screams: 'Nassty Hobbitsisisisis...'
+says: 'Come on, quickly, follow Smeagol!'
+coughs: 'Gollum! Gollum!'
+says: 'Every way is guarded, silly foolsis!'
+says: 'Nassty Bagginsis, stole my precious.'
+says: 'She will kill them, oh yes she will preciouss.'
+says: 'Does it guess easy? It must have a competition with us, preciouss!'
+hisses: 'What has it got in its pocketses?'
+whimpers: 'We've lost it, we have.'
+says: 'No food, no rest; Smeagol a SNEAK!'
+says: 'What a dainty little dish you will be for her.'
+says: 'Hobbitses always SOOOO polite.'
+screams: 'Stop, Thief!'
+says: 'Makeses him drop his weapon precious.'
+grovels: 'He has only four fingers on the black hand.'
+growls: 'Not nice Hobbits, not sensible!'
+says: 'If you findesis it, give it us back.'
+3
+says, 'Don't hurt us, mastersisis.'
+says, 'Poor Smeagol, poor Smeagol.'
+says, 'No AH! Don't hurtsis us.'
+
+N:102:Lurtz, Uruk Captain of the White Hand
+N:140:Lagduf, the Snaga
+N:170:Radbug, the Goblin
+N:186:Grishnakh, the Hill Orc
+N:215:Golfimbul, the Hill Orc Chief
+N:260:Ufthak of Cirith Ungol
+N:314:Shagrat, the Orc Captain
+N:315:Gorbag, the Orc Captain
+N:330:Bolg, Son of Azog
+N:350:Ugluk, the Uruk
+N:356:Lugdush, the Uruk
+N:370:Muzgash, the Snaga
+N:373:Azog, King of the Uruk-Hai
+N:399:Mauhur, the Uruk
+17
+fingers his blade and grins evilly.
+says, 'I'll bet your innards would taste real sweet...'
+says, 'I love the smell of fresh blood.'
+wonders aloud how many experience points you're worth.
+sings, 'Clap! Snap! the black crack!'
+sings, 'Grip, grab! Pinch, nab!'
+sings, 'And down down to Goblin-town you go, my lad!'
+sings, 'Clash, crash! Crush, smash!'
+sings, 'Hammer and tongs! Knocker and gongs!'
+sings, 'Pound, pound, far underground!'
+sings, 'Ho, ho! my lad!'
+sings ' Swish, smack! Whip crack!'
+sings 'Batter and beat! Yammer and bleat!'
+sings, 'Work, work! Nor dare to shirk,'
+sings, 'While Goblins quaff, and Goblins laugh,'
+sings, 'Round and round far underground...'
+sings, 'Below, my lad!'
+6
+screams, 'Hey, orcs have rights too!'
+says, 'You're just prejudiced against orc-kind, aren't you?'
+begs, 'Spare me and I'll get you Ringil! Really!'
+says, 'Next time, I'm bringing more Uruks with me!'
+says, 'Don't hate me because I'm ugly!'
+whimpers and grovels.
+
+N:137:Grima Wormtongue, Agent of Saruman
+3
+says, 'Lathspell I name you, Ill-news; and Ill-news is an ill guest they say.'
+says, 'Forbid his staff!'
+yells, 'You lie!'
+3
+screams, 'Let me go, let me go!'
+says, 'My messages are useless now!'
+hisses, 'You told me to; you made me do it!'
+
+N:412:Lotho Sackville-Baggins, Betrayer of the Shire
+N:374:Bill Ferny
+N:437:Harry Goatleaf, Gatekeeper of Bree
+5
+whines and snickers.
+whispers nasty things.
+says, 'I'll slaughter you slowly...'
+giggles as he fingers his knife.
+says, 'Now, you shall taste my wrath!'
+3
+begs you to spare his miserable life.
+whines, 'This is not my fault!'
+screams, 'Help! Help!'
+
+N:138:Robin Hood, the Outlaw
+5
+eyes your money pouch covetously.
+says, 'You look like Nottingham's man to me!'
+says, 'I bet I can shoot better than you...'
+says, 'Give till it hurts!'
+says, 'Do not force me to put an arrow in your skull...'
+3
+begs you to spare his life.
+says, 'But I'm a GOOD guy, really!'
+says, 'Money? Sure, take it all back!'
+
+N:254:Maedhros the Tall
+N:263:Maglor the Mighty Singer
+N:268:Celegorm the Fair
+N:274:Caranthir the Dark
+N:276:Curufin the Crafty
+N:318:Amrod, Son of Feanor
+N:319:Amras, Son of Feanor
+8
+says, 'I swore an oath which none shall break.'
+says, 'I sword an oath which none should take.'
+says, 'I swore by the name of even Iluvatar.'
+says, 'I called the Everlasting Dark upon me if I kept it not.'
+says, 'I named Manwe my witness.'
+says, 'I named Varda, and hallowed Taniquetil, my witnesses.'
+says, 'I will pursue with vengeance and hatred.'
+says, 'None shall keep or hold a Silmaril from me.'
+3
+says, 'I accept my fate.'
+says, 'This must be payment for the Kinslaying.'
+says, 'The blood of my kin burns my hands.'
+
+N:169:Brodda, the Easterling
+N:291:Ulfast, Son of Ulfang
+N:413:Ulwarth, Son of Ulfang
+N:392:Sangahyando of Umbar
+N:380:Angamaite of Umbar
+N:573:Lorgan, Chief of the Easterlings
+N:987:Uldor the Accursed
+N:990:Ulfang the Black
+11
+fingers his blade and grins evilly.
+snickers, 'Now, I strike a blow for *our* side!'
+calls your mother nasty names.
+belches and spits.
+scratches his armpits.
+says, 'I love the smell of fresh blood.'
+says, 'Yeeha! Another idiot to slaughter!'
+wonders aloud how many experience points you're worth.
+says, 'My brain's on fire with the feeling to kill!'
+says, 'I shall torture you slowly.'
+says, 'I shall have my way with your women!'
+3
+whimpers, 'No, I will really fight on your side!'
+says, 'Morgoth made me do it.'
+says, 'Please don't kill me!'
+
+#This next may be unnecessarily evil... :-]
+N:393:It
+4
+says, 'Nyah, nyah, betcha can't find me!'
+magically summons mighty undead opponents!
+casts a spell and cackles evilly.
+magically summons special opponents!
+2
+howls, 'I'll be back!'
+whimpers, 'They said this invisibility thing was fool-proof!'
+
+N:441:Tom Bombadil
+8
+sings, 'Hey dol! merry dol! ring a dong dillo!'
+sings, 'Old Tom Bombadil water-lilies bringing...'
+sings, 'Goldberry, Goldberry, merry yellow berry-o!'
+sings, 'Hey! Come derry dol! Can you hear me singing?'
+says, 'Eat earth! Dig deep! Drink water! Go to sleep!'
+says, 'Bombadil is talking!'
+sings, 'Hey! Come derry dol! Hop along, my hearties!'
+sings, 'Old Tom Bombadil is a merry fellow!'
+0
+
+#N:467:Beorn, the Shape-Changer
+6
+says, 'They don't look dangerous!'
+laughs a great rolling laugh.
+says, 'O ho, so you've had trouble with THEM, have you?'
+says, 'I don't need your service, thank you.'
+asks, 'Where are they? Killed, eaten, gone home?'
+admonishes, 'I would have given them more than fireworks!'
+0
+
+N:489:Varda, Lady of the Stars
+N:490:Vaire, the Weaver
+N:492:Irmo of Lorien
+N:497:Este, the Gentle
+N:498:Nienna, the Sorrowful
+N:506:Nessa the Lithe
+N:511:Orome, the Huntsman of the Valar
+N:515:Vana, the Ever-young
+56
+gazes southwards.
+reveals: The Helcaraxe is in the north-west.
+gazes northwards.
+reveals: Don't bring any glassware to the Helcaraxe.
+gazes eastwards.
+reveals: The Wastelands of the North are guarded by the Hunter.
+gazes westwards.
+reveals: The Withered Heath is in the Grey Mountains.
+sings softly.
+reveals: Utumno has not been destroyed completely.
+whispers something.
+reveals: The Blue Wizards are trapped in Utumno.
+weeps quietly.
+reveals: Utumno is in the north-east.
+looks at you sadly.
+reveals: There is an artifact that will let you identify items.
+turns away from you.
+reveals: There is a powerful artifact guarded in Near Harad.
+says, 'Don't you have a quest to complete, child?'
+reveals: The Castle of Dol Amroth is in the south.
+gazes southwards.
+reveals: A strange creature guards the Maze in the south.
+gazes northwards.
+reveals: Cirith Ungol is poisonous.
+gazes eastwards.
+reveals: There is a passage to The Lonely Isle in the southwest.
+gazes westwards.
+reveals: Saruman waits for you beneath Isengard.
+sings softly.
+reveals: To get to Khazad-Dum, you must pass through Moria.
+whispers something.
+reveals: There is a snowy passage through the Misty Mountains.
+weeps quietly.
+reveals: The Witch-Realm of Angmar will poison and disenchant.
+looks at you sadly.
+reveals: There is a great treasure in the Blue Mountains.
+turns away from you.
+reveals: You must bring a Map and a Key to Smaug's lair in Erebor.
+says, 'Don't you have a quest to complete, child?'
+reveals: Beware of the Deep Marshes.
+gazes southwards.
+reveals: Level 95 of Angband is a special level.
+gazes northwards.
+reveals: Level 85 of Angband is a special level.
+gazes eastwards.
+reveals: Level 70 of Angband is a special level.
+gazes westwards.
+reveals: Level 21 of the Orc Caves is a special level.
+sings softly.
+reveals: Level 35 of Moria is a special level.
+whispers something.
+reveals: The last level of Mount Doom never changes.
+weeps quietly.
+reveals: Mirkwood forest will lead you to the Heart of the World.
+looks at you sadly.
+reveals: There is a small water cave in Moria.
+0
+
+N:493:Bert the Stone Troll
+N:494:Bill the Stone Troll
+N:495:Tom the Stone Troll
+7
+asks, 'What are yer?'
+asks, 'What's a burrahobbit got to do with my pockets?'
+muses, 'You wouldn't make above a mouthful.'
+taunts, 'You're a fat fool!'
+says, 'You're a booby.'
+says, 'That'll teach yer!'
+says, 'I won't take that from you!'
+0
+
+N:505:Groo the Wanderer
+0
+1
+says: 'A fray! A fray!'
+
+N:523:N:523:Ingeborg, the Runemistress
+6
+says: 'Hey, I just had a neat idea!'
+says: 'Ringil? Never heard of it where I come from!'
+scribbles busily on a stack of parchment.
+mutters something in an unknown tongue.
+cuddles something warm and fuzzy.
+offers you a hug.
+3
+shrieks: 'Oh my gods, I'm doomed!'
+protests: 'Awww, I just wanted to hug you...'
+protests: 'Hey, it's only a game--please don't hurt me!'
+
+N:531:Lindal Lossehelin
+N:552:Erianyth, the Sorceress
+N:557:Karrazix the Brave
+N:564:Sir Physt
+N:572:Slappy, Abbess of Pain
+5
+asks, 'Hey, you got a Cloak of Air I can borrow?'
+states matter-of-factly, 'You're not as tough as I am.'
+asks, 'Are you going to DiTL this one?'
+brags, 'My CON is higher than yours.'
+gloats, 'I got Boots of Speed from that stupid princess.'
+2
+screams, 'See you on the t-o-m-e.net forums!'
+screams, 'ToME rules!'
+
+N:535:Zizzo, Last of the Yeeks
+N:569:Nick LeYeek, Second Last of the Yeeks
+N:595:Orfax, son of Boldor
+N:596:Boldor, King of the Yeeks
+5
+wonders aloud about your sexual orientation.
+spouts torrents of obscenities.
+shouts, 'YEEK! YEEK! YEEK!'
+wonders aloud how many experience points you're worth.
+says, 'I'll teach you to respect yeeks!'
+2
+sobs, 'I didn't MEAN it...'
+whimpers and moans.
+
+N:660:Eol, the Dark Elf
+5
+says, 'I acknowledge not your law.'
+says, 'I care nothing for your secrets.'
+says, 'I came not to spy on you but to claim my own.'
+screams, 'My son you shall not withhold from me!'
+screams, 'You shall not hold what is mine!'
+1
+'Here you may yet die the same death as I.'
+
+N:697:Smaug the Golden
+12
+says, 'Well, thief! I smell you and I feel your air. I hear your breath.'
+says, 'Come along! Help yourself, there is plenty and to spare.'
+says, 'You have nice manners for a thief and a liar.'
+wonders: 'Who are you and where do you come from, may I ask?'
+says, 'Lucky numbers don't often come off.'
+says, 'Some nasty scheme of those Lake-men, or I'm a lizard.'
+brags, 'I kill where I wish and none dare resist.'
+brags, 'I laid low the warriors of old whose like is not in the world today.'
+brags, 'Now I am old and strong, strong, strong!'
+brags, 'My armour is like tenfold shields, my teeth are swords, my claws spears.'
+brags, 'The shock of my tail is a thunderbolt, my wings a hurricane!'
+brags, 'I am armoured above and below with iron scales and hard gems.'
+2
+wails, 'No, no, no! Not the Black Arrow!'
+admits defeat.
+
+N:714:Quickbeam, the Ent
+2
+says, 'I like birds, even when they chatter.'
+shouts, 'Ra-hoom-rah!'
+0
+
+N:715:Glaurung, Father of the Dragons
+5
+calls you a thankless fosterling.
+taunts, 'Captain foolhardy!'
+calls you The Usurper of Nargothrond!
+says, 'If thou wilt be slain, I will slay thee gladly.'
+lectures, 'They lie who say we do not honour the valour of foes.'
+1
+lets out a bloodcurdling scream.
+
+N:771:Saruman of Many Colours
+3
+says, 'One ill turn deserves another.'
+brags, 'Whoever strikes me shall be accursed.'
+admonishes, 'Meddle not in policies which you do not understand.'
+3
+says, 'Spare me your pity. I would hate you even more for it.'
+croaks, 'Do not expect me to wish you health and long life.'
+lets out a shrill shriek
+
+N:850:Carcharoth, the Jaws of Thirst
+N:840:Draugluin, Sire of All Werewolves
+7
+barks and bellows frighteningly!
+says, 'Oh good, another chew toy!'
+says, 'Yummy! I was getting tired of chicken...'
+lets out an earsplitting howl.
+drools all over the dungeon.
+says, 'Bad adventurer! No more living for you!'
+snarls and howls.
+1
+cringes and whimpers.
+
+N:818:The Mouth of Sauron
+6
+asks, 'Anyone with authority to treat with me? Not thou at least!'
+says, 'This time thou hast stuck out thy nose too far.'
+says, 'Thou shalt see what comes to him who defy Sauron the Great.'
+says, 'Take swift counsel with what little wit is left to you.'
+says, 'And now thou shalt endure the slow torment of years!'
+says, 'Do not bandy words in your insolence with the Mouth of Sauron!'
+1
+screams, 'This CAN'T be happening!'
+shouts, 'Kill me if you want, the Boss will get you!'
+
+N:804:Vecna, the Emperor Lich
+N:844:Feagwath the Undead Sorceror
+N:856:Gothmog, the High Captain of Balrogs
+N:860:Sauron, the Sorcerer
+8
+brags, 'My power is beyond compare!'
+snorts, 'A mere mortal dares challenge my might?'
+says, 'Not another one! I just finished chewing on the last!'
+wonders aloud how many experience points you're worth.
+says, 'Hell shall claim your remains!'
+yawns at your pathetic efforts to kill him.
+says, 'Minions, slaughter this fool!'
+says, 'Set thine house in order, for thou shalt die...'
+2
+screams, 'This CAN'T be happening!'
+shouts, 'Kill me if you want, the Boss will get you!'
+
+N:853:Huan, Wolfhound of the Valar
+1
+asks, 'Have you seen Carcharoth? I seek him.'
+0
+
+N:861:Dark God, the Mighty Coder of Hell
+6
+says 'Hullo'.
+emits a low 'hmmmm'.
+screams 'I came from the Hell for YOU!'.
+laughs out loudly.
+mutters something about bugs.
+asks you about the new version.
+1
+screams 'ToME rules!'.
+
+N:928:Mathilde, the Science Student
+3
+waves.
+wishes you luck.
+skips along happily.
+1
+is surrounded by the purple aura of the RNG. Touch at your peril.
+
+N:934:Fangorn the Treebeard
+5
+says: 'The night stretches out on the Isengard!'
+says: 'Trolls are strong, Ents are STRONGER!'
+says: 'Hoom, hm, ah well.'
+says: 'Saruman will now stop using his axes on the trees...'
+says: 'I will crush all those burarum ... those orcs!'
+says: 'I am totally of the side of nobody since nobody is totally of my side...'
+0
+
+N:954:The Witch-King of Angmar
+2
+says, 'Do you not know Death when you see it?'
+says, 'Thou fool. No living man may hinder me!'
+0
+
+N:969:Princess
+4
+cries.
+screams, 'Help me!'.
+whines, 'I need your help, great hero!'.
+implores you to help her.
+1
+screams 'I didn't REALISE I was STANDING on the stairs, OKAY???'.
+
+N:1010:The Insane Player
+4
+screams, 'There can be only one!'
+makes a chattering noise with his teeth.
+screams, 'Morgoth is MY quarry! GO AWAY!!!'
+scrapes some slime off the wall and eats it, repeating 'grow mold!'
+2
+whimpers, 'You sure looked harmless.'
+sobs uncontrollably.
+
+N:1036:Sanctimonious-looking preacher
+5
+screams 'And the streets shall flow with the blood of the non-believers!'
+says: 'Eru is the One. There is no mistaking it, nor arguing with it.'
+says: 'I have never killed, but I have read many obituaries with pleasure.'
+hisses, 'Repent, evil-doer! Ere it is too late.'
+yells, 'And He will execute vengeance in anger and fury upon the heathen!'
+3
+says: 'Okay, I admit it. Religion is basically guilt, with different holidays.'
+whispers, 'Walk with those seeking Truth. Run from those who think they've found it.'
+says, 'The light of Valinor is with me.'
+
+N:1039:Improv, the mighty MoLD
+2
+screams 'Your code is ugly!'
+mutters something about bugs.
+1
+screams 'ToME rules!'. \ No newline at end of file
diff --git a/lib/mods/theme/file/news.txt b/lib/mods/theme/file/news.txt
new file mode 100644
index 00000000..67691fb4
--- /dev/null
+++ b/lib/mods/theme/file/news.txt
@@ -0,0 +1,23 @@
+#G #W ~ ~~~ ~~~ ( #G
+#G ======/ ===== #W ~~ ) ~~ ) #G === === ===
+#G / // / __ \ #W )~ #r,.#W~ ( (#G // || \\ //
+#G // | | | | #W _#r,-"####`-^ #W ) #G || || || ||==:
+#G || | | | | #W ,#D###########r`W='#D###W`.#W () #G || || || ||
+#G \\_// \ -- / #W ,#D#######################D###W:#r,=. #G || || || \\===
+#G \_/ ===== #W /.#D###W,".#D#####W,".#D###########r"#W##\
+#W ,-. _,-= /"._ ,-. #w ," #W `:' `:#D#####W[JW] ,. #G #R "Theme"
+#W," `," `=._ `" -#w; #G The #W\#D#####W;"' V \#W __,-. ,-=.
+#W / " `-. #w / #GTroubles of #W `" `-.#W__,-""._," "--," >-=-
+#W ,-"`. #w _' #G Middle Earth#w "._ #W` _/
+ _," #w"=.".
+ _," #ohttp://www.t-o-m-e.net #w`._,=-._ _,-.
+ _._ ,"._," #w"-." \,-.
+-" `-" #w`-
+ ToME maintained by darkgod Module by furiosity
+ #Bdarkgod@t-o-m-e.net #Bfuriosity@gmail.com
+#y One Ring to rule them all,
+#y One Ring to find them,
+#y One Ring to bring them all,
+#y And in the Darkness bind them
+#y In the Land of Mordor, where the Shadows lie.
+#B [J.R.R. Tolkien] \ No newline at end of file
diff --git a/lib/mods/theme/file/news2.txt b/lib/mods/theme/file/news2.txt
new file mode 100644
index 00000000..67691fb4
--- /dev/null
+++ b/lib/mods/theme/file/news2.txt
@@ -0,0 +1,23 @@
+#G #W ~ ~~~ ~~~ ( #G
+#G ======/ ===== #W ~~ ) ~~ ) #G === === ===
+#G / // / __ \ #W )~ #r,.#W~ ( (#G // || \\ //
+#G // | | | | #W _#r,-"####`-^ #W ) #G || || || ||==:
+#G || | | | | #W ,#D###########r`W='#D###W`.#W () #G || || || ||
+#G \\_// \ -- / #W ,#D#######################D###W:#r,=. #G || || || \\===
+#G \_/ ===== #W /.#D###W,".#D#####W,".#D###########r"#W##\
+#W ,-. _,-= /"._ ,-. #w ," #W `:' `:#D#####W[JW] ,. #G #R "Theme"
+#W," `," `=._ `" -#w; #G The #W\#D#####W;"' V \#W __,-. ,-=.
+#W / " `-. #w / #GTroubles of #W `" `-.#W__,-""._," "--," >-=-
+#W ,-"`. #w _' #G Middle Earth#w "._ #W` _/
+ _," #w"=.".
+ _," #ohttp://www.t-o-m-e.net #w`._,=-._ _,-.
+ _._ ,"._," #w"-." \,-.
+-" `-" #w`-
+ ToME maintained by darkgod Module by furiosity
+ #Bdarkgod@t-o-m-e.net #Bfuriosity@gmail.com
+#y One Ring to rule them all,
+#y One Ring to find them,
+#y One Ring to bring them all,
+#y And in the Darkness bind them
+#y In the Land of Mordor, where the Shadows lie.
+#B [J.R.R. Tolkien] \ No newline at end of file
diff --git a/lib/mods/theme/file/rart_f.txt b/lib/mods/theme/file/rart_f.txt
new file mode 100644
index 00000000..50a55b93
--- /dev/null
+++ b/lib/mods/theme/file/rart_f.txt
@@ -0,0 +1,86 @@
+85
+The Bag of Tricks
+Pandora's Box
+The Deck of Wild Magic
+The Box of Horrors
+The Thirteenth Eye of Sauron
+Saruman's Unfinished Works
+The Gem of Fire
+The Gem of Ice
+The Gem of Venom
+The Gem of Knowledge
+The Gem of Rage
+The Gem of Hate
+The Gem of Wisdom
+The Gem of Ghosts
+The Boulder of Entmoot
+The Voodoo Doll of Ghan-buri-ghan
+The Mirror of Alternate Dimensions
+The Ebon Cube of Darkness
+The Diamond Prism of Light
+The Gem of Chaos
+The Pentagram of Lore
+The Fourteenth Eye of Sauron
+The Space-Time Continuum
+The Shard of Pottery that is Not Junk
+Curunir's Alteration Manual
+Gandalf's Tome of Unconventional Warfare
+The Tome of Collected Strange Magic
+The Pendulum of Immortality
+The Black Candle of Ered Mithrin
+Smeagol's Lost Toy
+The Staff of the Ithryn Luin
+The Tome of Chaos
+The Dagger ``Thanc''
+The Tome of Elven Household Magic
+a Piece of the Mage Staff of Olorin
+a Parchment titled ``Magic for the Layman''
+The Shopping Bag of Gaffer Gamgee
+The Bag of Magic Toys
+The Skull of Ancient Wisdom
+The Box of Wizardry
+The Potion of Winning
+Radagast's Summoning Manual
+The Gem of Time
+The Lost Works of Melian
+The Crystal Ball of Godly Sights
+The Box of Many Wonders
+Carcharoth's Favourite Toy
+The Hat of Radagast
+The Bottomless Bottle
+a Parchment titled ``How to Win the Game''
+The Wand Construction Kit
+The Clay Tablets of Antiquity
+The Blood of Death
+Darkgod's Voodoo Doll of the Player
+The Skeleton of Nob
+The Magical Honey Jar
+a Parchment titled ``Concerning Hobbits''
+a Parchment titled ``On Beren and Luthien''
+The Fifteenth Eye of Sauron
+The Sixteenth Eye of Sauron
+The Seventeenth Eye of Sauron
+The Crystal Ball of The Witch-King of Angmar
+a Parchment titled ``Secrets of the Gnomish Wizards''
+The Medallion of Good Will
+The Immortal Skull of Telepathy
+The Ultimate Slime Mold
+Saruman's Big Book of Brutality
+The Shopping List of Barliman
+a Parchment titled ''There And Back Again''
+The Portable Soldier
+The Torch of Isengard
+One Rune to Rule them All
+a Parchment titled ''Famous Last Words''
+The Fire of Orthanc
+Radagast's Compendium of Strange Behaviour
+The Antique Acorn of Watchfulness
+The Horn of Ages
+Gandalf's Portable Pandemonium
+The Perfect Symbiote
+Curunir's Book of Impossible Occurences
+a Parchment titled ''Of the Kinslaying Wars''
+The Altruistic Assassin
+The Pipe of Buckland
+The True Totem of an Ostrich
+The Collapsible Crutch
diff --git a/lib/mods/theme/file/rart_s.txt b/lib/mods/theme/file/rart_s.txt
new file mode 100644
index 00000000..cc84631f
--- /dev/null
+++ b/lib/mods/theme/file/rart_s.txt
@@ -0,0 +1,87 @@
+85
+a Bag
+a Shiny, Black Box
+a Deck of Cards
+a Rusty, Slimy Box
+an Eyeball
+a Red Tome
+a Red Gem
+a Blue Gem
+a Green Gem
+a White Gem
+an Orange Gem
+a Black Gem
+a Gray Gem
+a Translucent Gem
+a Boulder
+a Voodoo Doll
+a Mirror
+a Black Cube
+a Prism
+a Violet Gem
+a Pentagram
+a Glass Eyeball
+something weird
+a Shard of Pottery
+a Green Tome
+a Black Tome
+a White Tome
+a Pendulum
+a Black Candle
+a Tiny Doll
+a Black Staff
+a Violet Tome
+a Shiny Dagger
+a Gray Tome
+a Broken Stick
+a Parchment
+a Big Bag
+a Small Bag
+a Broken Skull
+a Blue Box
+a Gray Bottle
+an Orange Tome
+a Shiny Gem
+an Ancient Gray Tome
+a Crystal Ball
+a Golden Box
+a Broken Bone
+a Soft Leather Hat
+a Broken Bottle
+an Arcane Parchment
+many Small Wooden Sticks
+some Clay Tablets
+a Smoky Vial
+a Doll
+a Human Skeleton
+a Clay Jar
+an Arcane Parchment
+a Strange Parchment
+a Large Eye
+a Small Eye
+a Decayed Eye
+a Large Crystal Ball
+a Mud-Stained Parchment
+a Medallion
+a Jewel-Encrusted Skull
+a Slimy Mold
+a Battered Book
+a Small Note
+an Old Parchment
+a Small Figurine
+a Torch
+a Rune
+a Singed Parchment
+a Sphere
+a Red Book
+an Acorn
+a Strange Horn
+a Music-Box
+a Blue Mold
+a Torn Book
+a Greasy Parchment
+a Blackened Figurine
+a Pipe
+an Avian Figurine
+a Crutch
+
diff --git a/lib/mods/theme/file/readme! b/lib/mods/theme/file/readme!
new file mode 100644
index 00000000..90b6bbf2
--- /dev/null
+++ b/lib/mods/theme/file/readme!
@@ -0,0 +1,36 @@
+Most files in this directory are use by the get_rnd_line function for various
+purposes in the game. They can be edited and customised by the user with any
+ascii text editor. If you add / remove lines you should modify the index (the
+first line) accordingly. If you set an invalid index or remove the buffer line
+weird messages and other things can appear, and you can crash the game. Please
+see sample.txt before you try modifying the files.
+The a_*.txt and w_*.txt are used when the game generates a random artifact.
+However, instead of picking a name from the appropriate file, the game may
+form a new name from syllables[].
+
+The files in this directory:
+
+A_CURSED TXT Possible names for randomly generated cursed armour artifacts
+A_HIGH TXT Possible names for randomly generated 'powerful' armour artifacts
+A_LOW TXT Possible names for randomly generated 'weak' armour artifacts
+A_MED TXT Possible names for randomly generated 'medium' armour artifacts
+BRAVADO TXT Possible lines for speaking uniques
+CHAINSWD TXT Possible noise for the Chainsword
+CRIME TXT Possible crimes that speaking uniques may have committed
+DEAD TXT The tombstone picture (the death screen)
+DEATH TXT Possible 'last words' when the player dies
+ELVISH TXT Syllables for the names of random artifacts
+ERROR TXT Possible random error messages (instead of "Type ? for help")
+MONDEATH TXT Possible 'last words' for speaking uniques
+MONFEAR TXT Possible lines for scared speaking uniques
+NEWS TXT The game intro screen
+README! You are reading this file right now
+RUMORS TXT Possible rumours (for scrolls or rumour and shopkeepers)
+SAMPLE TXT A sample file for the random line selecting function
+SILLY TXT Silly monster names for hallucination
+SMEAGOL TXT Smeagol lines
+SMEAGOLR TXT Smeagol fleeing
+W_CURSED TXT Possible names for randomly generated cursed weapon artifacts
+W_HIGH TXT Possible names for randomly generated 'powerful' weapon artifacts
+W_LOW TXT Possible names for randomly generated 'weak' weapon artifacts
+W_MED TXT Possible names for randomly generated 'medium' weapon artifacts
diff --git a/lib/mods/theme/file/rumors.txt b/lib/mods/theme/file/rumors.txt
new file mode 100644
index 00000000..2790cafd
--- /dev/null
+++ b/lib/mods/theme/file/rumors.txt
@@ -0,0 +1,201 @@
+199
+******** BUFFER LINE *********************************** DO NOT REMOVE *******
+They say that you can't trust rumors.
+You have no more Black Potions of Death.
+Losto Caradhras, sedho, hodo, nuitho i 'ruith!
+Ando Eldarinwa a lasta quettanya, Fenda Casarinwa!
+Andelu i ven.
+Le aphadar aen.
+Nai tiruvantel ar varyuvantel i Valar tielyanna nu vilya.
+Throw a Potion of Blindness at a monster and it cannot cast any spells!
+Gu kibum kelkum-ishi, burzum-ishi. Akha - gum-ishi ashi gurum.
+Not satisfied with the artifacts you find? Then create your own!
+They say that Sauron has forged an all-powerful Ring.
+A good item will not corrode.
+They say that Nibelungs live in dark caves.
+Some weapons that slay dragons can be very deadly against them...
+Finding the Phial of Galadriel at Level 1 is nothing to be proud of.
+There are Black Market stores hidden deep in the dungeon.
+What a pity, you cannot read it!
+You will encounter a dark, tall stranger...
+A Mithril mail will not rust.
+An Galvorn mail cannot be destroyed by the elements.
+A Rusty Chain Mail cannot rust any further.
+Nedin dagor hen ú-'erir ortheri. Natha daged dhaer!
+A Eruchin, u-dano i faelas a hyn an uben tanatha le faelas!
+Tangado a chadad!
+A Wand of Death is useless against monsters that are tougher than you.
+A Wand of Death is of little use against foes that are dead already.
+Try taking off your armor before fighting a Gelatinous Cube!
+They say that only one sword can score *CRITICAL* hits.
+This rumor is not true.
+If you can fall like a feather, you need not care about gravity.
+They say that you should rejoice if you find a scroll labeled ""!
+You don't always have to kill everything you meet!
+If you can't beat it, leave it alone!
+An umber hulk can be a confusing sight.
+There *is* a good use for Potions of Detonations, Ruination and Death...
+Watch your step!
+It's a bad idea to throw away a Longsword (4d5).
+It's a bad idea to wield a Longsword (4d5).
+It's useless to bash monsters with bows - but there's one notable exception...
+Actually, Slime Mold Juice is not completely useless.
+Faeg i-varv din na lanc a nu ranc!
+Ever tried inscribing your armor {erodeproof}?
+Using a Morningstar in the evening has no effect.
+Why are you wasting time reading fortunes?
+There is a horrible, ghastly fate awaiting you... at 2700'!
+You can get the Longsword 'Ringil' by doing the following:
+You can protect yourself from Great Wyrms of Power by doing the following:
+Togo hon dad! Dago hon!
+Za dashu snaku Zigur, Durbgu nazgshu, Durbgu dashshu!
+Forth Eorlingas!
+Try inscribing the name of the first monster killed by it in the weapon!
+I Aear can ven na mar.
+Aiya Earendil Elenion Ancalima!
+There's something bad about what you are carrying in your backpack...
+Thieves are more likely to appear if you are carrying a lot of money.
+Brand's sword, Werewindle, probably knows more than just one trick.
+They say that Scrolls of *Curse Weapon* can create powerful cursed artifacts.
+They say that the Chainsword makes monsters mad with its awful noise!
+They say that Ringil shines so brightly that it makes monsters angry.
+Orcs are mortally afraid of weapons that can slay them.
+There is a way to turn a Ring of Speed (-20) into a Ring of Speed (+20).
+There is no way to turn a Ring of Speed (-20) into a Ring of Speed (+20).
+FRODO LIVES!!!
+A Elbereth! Gilthoniel!
+Hail Earendil brightest of the Stars!
+You feel the Longsword (t) you are carrying in your backpack is special...
+If you start seeing red monsters, you have probably gained infravision.
+They say that the dungeon is deeper than the Abyss.
+When all else fails, read the instructions.
+No poison is immediately deadly.
+I have seen a Ring of Speed (+50) in the Black Market!
+Telepathy works like a two-way door.
+Elvish waybread might negate the effects of poison.
+Once uncursed, Calris will become a deadly weapon.
+Havo dad and pass the damn Lembas.
+You feel your luck is turning...
+If you thought Death swords were bad, wait until you meet Killer katanas!
+Overeating can be bad for your health if there are others nearby.
+Cave dwellers are accustomed to darkness and rarely enjoy bright light.
+A creature made of stone can be slain by a spell that turns stone to mud.
+It is often a good idea to throw items that you don't want to eat or drink.
+The faster you run the more food you will burn.
+Invisible monsters will often expose themselves if you drop items around you.
+They say that the key to killing tougher monsters is called "hit&run".
+The Sea calls us home.
+Wearing an Amulet of Doom will take you into the Dungeons of Doom.
+You can often wrest one last charge from an empty wand if you try hard enough.
+Wands may recharge themselves if you leave them on the floor long enough.
+There is more than one way to deal with a locked door.
+Afraid of your valuables getting stolen? Carry more junk!
+Their armour is weak at the neck... and beneath the arm.
+If you hear something smash into splinters, you had better watch out.
+They say that you had better leave Greater hell-beasts alone.
+Selling unidentified potions to shopkeepers might be safer than quaffing them.
+Always look out for trapdoors on "special" feeling levels!
+There is a way to max out your stats with Potions of Charisma & Nexus.
+Unique opponents will recover their health faster than other creatures.
+Prepare to fire!
+Show them no mercy, for you shall receive none.
+Iorhael, lasto beth nin, tolo dan nan galad!
+A Potion of Detonations is also known as nitroglycerin.
+They cannot win this fight. They are all going to die!
+There is a trap on this level!
+A weapon of Undead Slaying has all you need to kill a ghost.
+A weapon of Dragon Slaying may give you resistance to a dragon's breath attack.
+There-is-no life in-the-cold, in-the-dark. Here - in-the-void only death.
+All that is shall come to an end - a dark day dawns for the gods.
+The One Ring is powerful, but will eventually destroy its owner.
+May your blood-stained horn fall upon the enemy-heads!
+May the Valar protect you on your path under the sky.
+Wands of Heal Monster are useful! Hint: ball spell, @....moo(o)ooo
+Guaranteed heal self - scenario: o'@, type c4c4c4c4
+If it can't see you, it can't hurt you!
+If it can't see you, you might still be able to hurt it...
+Nadath na i moe cerich.
+No animal is interested in sex if it is mortally scared.
+There is much yet you have to do.
+You are being followed.
+There is a plenty of Longswords around 1000'.
+The Road is very dangerous.
+Sleep Caradhras, be still, lie still, hold your wrath!
+The Shadow does not hold sway yet.
+There are often stairways in graveyards: bad people are carried to hell...
+Only a god of Thunder could ride a lightning bolt!
+The world is changed; I can feel it in the water...
+I can feel it in the earth, I can smell it in the air.
+They say the Valar have returned to walk upon Middle-earth.
+Weapons of Flame will light your way.
+Nauthannen i ned ol reniannen.
+Gandalf was here.
+They say that the gods get angry if you pray too much.
+For any remedy there is a misery.
+Poison will kill you slowly.
+Didn't you forget to pay?
+Death is just life's way of telling you you've been fired.
+They say that nobody can defeat his own ghost.
+A greedy genocide can be a fatal mistake, especially if you are low on hits.
+Ignore the previous rumour.
+There are scrolls that can be read only by mages.
+Some undead opponents will come back if defeated, more powerful than before!
+The answer is 42.
+I thought I had strayed into a dream.
+One level further down somebody is getting killed, right now.
+Gate of Elves listen to my word, Threshold of Dwarves!
+Bashing a creature may sometimes stun it.
+Nin o Chithaeglir lasto beth daer; rimmo nin Bruinen dan in Ulaer!
+One Ring to rule them all, One Ring to find them.
+One Ring to bring them all and in the darkness bind them.
+Three Rings for the Elven-kings under the sky...
+Never carry a Potion of Detonations if there is a fire trap nearby!
+Laugh to scorn the power of man, for none of woman born shall harm thee!
+All hail thee that shalt be king hereafter!
+You are fated to never die by the hand of a mortal being.
+The Hru hits you. The Hru hits you. The Hru hits you. The Hru hits you.
+-more-
+Appearance is only the frosting, not the cake!
+A feeling of Death flows through your body.
+Violence is no solution.
+Boots of Speed (+50) are no myth!
+You will need to Restore the Constitution if the Anarchists strike.
+Drain you of your sanity: Face the Thing That Should Not Be!
+Since by curse it came to me, accursed be this Ring!
+Each shall itch to possess the Ring, but none in it shall find pleasure!
+I know whatever was; whatever is, whatever shall be.
+You are fated to find something special on Level 99.
+Pudpadnoy Tooboothokoot is possessed by a demon known only as "It".
+They say that the One Ring has a very special curse.
+They say that alcohol is bad for your health.
+What if you DON'T give a name to the artifact you create..?
+They say that ancient battlefields are often haunted.
+Beware of pits that fill the whole level!
+Liar! I have not the gold!
+They say that the true name of wall monsters is 177.
+Never mind the Phial of Galadriel - the Phial of the Gods is better.
+A Ring of Speed? Phooey! Try looking for a Ring of *Speed*!
+Noro lim, Asfaloth, noro lim!
+If you hear heavy steps - watch out!
+A visit to the Zoo is educational: you meet many strange animals.
+What happens if you wear a Ring of Extra Ring Fingers (-2) {cursed}?
+I amar prestar aen, han mathon ne nen han mathon ne chae a han noston ned 'wilith.
+If I cancel tomorrow the undead will thank me today.
+Hellfire will burn your soul...
+You are fated to die on level 1.
+Why doesn't Detect Monsters show invisible monsters? 'Cos you can't see 'em!
+You are fated to find the Long Sword 'Ringil' on level 5.
+There's slime all over the walls.
+*** LOW HITPOINT WARNING! ***
+You cruelly stab the helpless, sleeping Software bug!
+Tangado haid! Leithio i philinn!
+It looked harmless.
+Spirit, hatch that painted spirit of the lamb sparrow.
+Gone insane from the pain that sure they know: for who the flange sound?
+'Ere, 'oo are you?
+Not to be never, never not to see, so as to dub the thee unforgiven.
+A Morphic Oil of Abomination will turn you into Morgoth himself.
+A Morphic Oil of Abomination will kill you.
+You are fated to win this game.
+The eternal death of eons of the foreigner of the lie can die not absolutely.
+They say that the dark mists of Morgoth can both bestow and remove the curse.
diff --git a/lib/mods/theme/file/sample.txt b/lib/mods/theme/file/sample.txt
new file mode 100644
index 00000000..5ff826f7
--- /dev/null
+++ b/lib/mods/theme/file/sample.txt
@@ -0,0 +1,5 @@
+3
+******** BUFFER LINE *********************************** DO NOT REMOVE *******
+line # 1
+line # 2
+line # 3
diff --git a/lib/mods/theme/file/sfail.txt b/lib/mods/theme/file/sfail.txt
new file mode 100644
index 00000000..ca4d9cb5
--- /dev/null
+++ b/lib/mods/theme/file/sfail.txt
@@ -0,0 +1,34 @@
+32
+******** BUFFER LINE *********************************** DO NOT REMOVE *******
+rose petals
+dirty straw
+rusty metal cutlery
+small, furry animals
+assorted toy jewelry
+visions of merry, dancing gnomes
+old and dusty accounting records
+moldy crusts of bread
+grass
+wet mud
+smelly bilge water
+clean linens
+scrap metal
+rotting wood
+leaves
+small insects
+rainwater
+flowers
+perfumed water
+overcooked sausage
+twigs
+pine needles
+hard leather
+small bones
+feathers
+crumbling manuscripts
+fresh air
+stale, smelly air
+dust
+clay
+earth
+wood shavings
diff --git a/lib/mods/theme/file/silly.txt b/lib/mods/theme/file/silly.txt
new file mode 100644
index 00000000..c5eca172
--- /dev/null
+++ b/lib/mods/theme/file/silly.txt
@@ -0,0 +1,301 @@
+299
+******************BUFFER LINE -- DO NOT REMOVE!*****************************
+Borg
+little Morgoth
+Sauron
+Ur-Vile
+Wizard of Yendor
+Smurf
+Moose
+Osama bin Laden
+Space Invader
+Agent
+Morpheus
+Hydralisk
+Infested Terran
+Asha'man
+Aes Sedai
+little lamb
+IRA Terrorist
+Nazi
+Klingon
+Tea-kettle
+Vorlon
+Giant flea
+Killer penguin
+Tractor trailer
+Giant were-penguin
+Zergling
+Dark Templar
+Dragon Reborn
+George Bush
+Saddam Hussein
+Death Orb
+Hru
+Greater Titan
+Lesser Titan
+Deodorant
+Minion of DarkGod, the Mighty Coder of Hell
+Mouth of Sauron
+Devil
+Anti-Christ
+Dark Avenger
+Evil Computer
+Evil Genius
+Satan
+Sea Folk Windfinder
+Fire Hydrant
+Multi-hued elephant
+Martian
+Seanchan
+Eminem
+Madonna
+Dementor
+Insurance salesman
+Moldoux, the Defenceless Mold
+Great Wyrm of Power
+Great Wyrm of Balance
+Typewriter
+Great Wyrm of Law
+Great Crystal Drake
+Munchkin
+Mad Scientist
+Great Wyrm of Chaos
+Great Bile Wyrm
+Great Hell Wyrm
+Great Wyrm of Nothing
+Great Wyrm of Toxic Waste
+Batman
+Damane
+Incredible Hulk
+Amazing Spider-Man
+Man in Black
+Matrix agent
+Secret agent
+Spy
+Harry Potter
+Vacuum cleaner
+Lawnmower
+Star-Spawn of Cthulhu
+Killer Banana
+Fear Mold
+Oracle
+Trinity
+Undead beholder
+Beholder Hive-mother
+Gauth
+Dumbledore
+Voldemort
+Maia
+Vala
+Elf
+Human
+Gnome
+Half-Troll
+Pope
+Skywalker cronie
+Jedi knight
+Dark Jedi
+Sith Lord
+Vulcan
+Existentialist philosopher
+Midichlorian
+Scientologist
+Jehovah's witness
+Skinhead
+Feanorian
+Umbarite
+Druj
+Yogi
+Karateka
+President
+King
+Prime Minister
+Trashman
+Teacher
+Cheshire Cat
+Mad Hatter
+March Hare
+Voodoo doll
+Rag doll
+Scarecrow
+Stormcrow
+Stone idol
+Hacker
+Samurai
+Dragkhar
+Phantom of the Opera
+Stone Dog
+Warrior of the Dawn
+Maiden of the Spear
+t-o-m-e.net forum poster
+Chimpanzee
+Messenger of Eru
+Grohlm
+G. I. Joe
+Aiel Wise One
+Alley cat
+Keanuholic
+Battlemage
+Saboteur
+Shadowkiller
+Cyborg
+Lemming
+Green Goblin
+Robocop
+Alien
+Lurker
+Iron Fist
+Trapper
+Amulet of Yendor
+Xeroc
+Catwoman
+Christian
+Muslim
+Extremist
+Forsaken
+Carnivore
+Xenu
+King of Arnor
+False prophet
+Emperor
+Rider of Rohan
+Draco Malfoy
+Cheeky bastard
+Ghost of Frodo Baggins
+Red Rose Knight
+Unholy cow
+Demonic Quylthulg
+Draconic Quylthulg
+Rotting Quylthulg
+Greater Demonic Quylthulg
+Lizard King
+Greater Draconic Quylthulg
+Greater Rotting Quylthulg
+Wookie
+Pit Fiend
+Muad' Dib
+Ent
+Huorn
+Werepotato
+Nycadaemon
+Alien queen
+Greater Balrog
+Lesser Balrog
+Doppleganger
+Evil dead
+Death incarnate
+Greater Kraken
+Death mold
+Rhinoceros
+Leviathan
+Software Bug
+Blob
+Cyberdemon
+Body snatcher
+Ghost of your past
+Biology professor
+Frankenstein
+Brain that would not die
+Breather
+Neekerbreeker
+Creature from the Black Lagoon
+Loch Ness monster
+Creeping death
+Creeping unknown
+Caligula
+Man of Haleth
+Budweiser frog
+Bride of Frankenstein
+Terminator
+T-800
+Purple space chicken
+Simpsons character
+UN weapons inspector
+Green giant
+Noldorin mercenary
+Squint-eyed rogue
+Egomaniac
+Russian mafia
+Godfather
+UFO
+Superman
+Hound of the Baskervilles
+Evil wizard
+Streetcar
+Karaoke machine
+Arch-vile
+Pain elemental
+Lesser kraken
+Murk dweller
+Killer tomato
+Chaos beastman
+Random Number Generator
+RNG
+Yakuza
+Wolverine
+Hunchback of Notre Dame
+Lovecraftian nightmare
+Shakespeare's imitator
+Morlock
+King Kong
+Protoss probe
+Shai'tan
+Baba Yaga
+Saucepan
+Ethereal dragon
+Pseudo-dragon
+Floating brain of Hitler
+Marshmallow Man
+High-elven ranger
+Swamp Thing
+Thing
+Teenage Frankenstein
+Teenage Werewolf
+Cellular automaton
+Strawman
+Logic gate
+Xenophobe
+Unspeakable horror
+Unknown terror
+Spirit of Roger Wilco
+Long sword 'Ringil'
+E.T.
+Zoolander
+Intel(R) Pentium processor
+Pac-Man
+Gangster
+Waterboy
+Long sword 'Mormegil'
+Wizard of Oz
+Battlecruiser
+Ultralisk
+Believer
+Heretic
+Loser
+Moron
+Libido
+Super-ego
+Imbecile
+Nebuchadnezzar
+Tomb raider
+Zelda
+Super Mario
+Hammer of Thor
+Wrath of the gods
+Betrayer of Turin
+Traitor of Gondolin
+Balrog
+Lesser Maia
+Greater Maia
+Cheerleader
+Model T-1000 Terminator
+Terminatrix
+Dragonlance
+Ancient multi-hued dragon
+Hillside strangler
+Texas chainsaw
+Pampers commercial
+Marilith
+White Balrog
+Bus driver
diff --git a/lib/mods/theme/file/smeagol.txt b/lib/mods/theme/file/smeagol.txt
new file mode 100644
index 00000000..22cb7038
--- /dev/null
+++ b/lib/mods/theme/file/smeagol.txt
@@ -0,0 +1,29 @@
+27
+******** BUFFER LINE *******************
+sniggers.
+grovels.
+picks his nose.
+pines for his precious.
+searches his pockets.
+eats some slimy creatures.
+mutters: 'My preciouss, where iss my preciouss?'
+shouts: 'No Master Hobbitsisisisis!'
+cries: 'The ring was ours for agesisisisis!'
+says: 'Smeagol sneaking! ME! Shneeeakingsisis!'
+screams: 'Nassty Hobbitsisisisis...'
+says: 'Come on, quickly, follow Smeagol!'
+coughs: 'Gollum! Gollum!'
+says: 'Every way is guarded, silly foolsis!'
+says: 'Nassty Bagginsis, stole my precious.'
+says: 'She will kill them, oh yes she will preciouss.'
+says: 'Does it guess easy? It must have a competition with us, preciouss!'
+hisses: 'What has it got in its pocketses?'
+whimpers: 'We've lost it, we have.'
+says: 'No food, no rest; Smeagol a SNEAK!'
+says: 'What a dainty little dish you will be for her.'
+says: 'Hobbitses always SOOOO polite.'
+screams: 'Stop, Thief!'
+says: 'Makeses him drop his weapon precious.'
+grovels: 'He has only four fingers on the black hand.'
+growls: 'Not nice Hobbits, not sensible!'
+says: 'If you findesis it, give it us back.'
diff --git a/lib/mods/theme/file/smeagolr.txt b/lib/mods/theme/file/smeagolr.txt
new file mode 100644
index 00000000..cc13c96f
--- /dev/null
+++ b/lib/mods/theme/file/smeagolr.txt
@@ -0,0 +1,5 @@
+3
+******** BUFFER LINE **************
+says: 'Don't hurt us, mastersisis.'
+says: 'Poor Smeagol, poor Smeagol.'
+says: 'No AH! Don't hurtsis us.'
diff --git a/lib/mods/theme/file/speakpet.txt b/lib/mods/theme/file/speakpet.txt
new file mode 100644
index 00000000..c6707e45
--- /dev/null
+++ b/lib/mods/theme/file/speakpet.txt
@@ -0,0 +1,53 @@
+51
+******** BUFFER LINE *********************************** DO NOT REMOVE *******
+admonishes: 'You need not be frightened like a rabbit.'
+says: 'Nice boots.'
+says: 'Isn't it dark down here?'
+says: 'I think I saw something move...'
+says: 'I really think I saw something move this time...'
+says: 'Phew, what's that smell?'
+says: 'There's slime all over the walls.'
+wonders: 'What is all this uproar in the forest tonight?'
+says: 'Hullo! You came pretty quick - where were you hiding?'
+says: 'Havo dad, and pass the damn Lembas.'
+says: 'Go on, go on! I will do the stinging!'
+says: 'The Eagles! The Eagles! The Eagles are coming!'
+says: 'If ever you are passing my way, do not wait to knock.'
+wonders aloud: 'Have I read about you in the ToME forums?'
+sings: 'Merry is May-time, and merry our meeting.'
+says: 'Hey, where did you find that thing?'
+muses: 'By the light of the Trees of Valinor, what IS that thing?'
+yells: 'After Morgoth to the ends of the earth!'
+says: 'Oops. I have slime mold on my wisp of vapor.'
+says: 'Show them no mercy, for you shall receive none.'
+says: 'I love troll. Eat once, stay full for a week.'
+says: 'Your sword sure is shiny.'
+says: 'Hey! WATCH IT! You almost hit me.'
+says: 'Their armour is weak at the neck... and beneath the arm.'
+says: 'Keep that demon blade away from me.'
+lectures: 'Gil-galad was an Elven king.'
+lectures: 'Earendil was a mariner that tarried in Arvernien.'
+says: 'The One Ring. That sure is a silly name...'
+says: 'Meddle not in the affairs of Wizards.'
+says: 'If Lokkak asks, I am not here.'
+sings: 'Together we will take the road beneath the bitter rain.'
+admonishes: 'What is with all this Dwarvish racket?'
+says: 'This is one for the Day in the Life archives!'
+recites: 'Seven stars and seven stones, and one white tree.'
+recites: 'All that is gold does not glitter.'
+says: 'Very fancy. Bet you cannot do it again.'
+says: '10AU says I can behead that snaga!'
+recites: 'Not all those who wander are lost.'
+sings: 'With a ping and a pong the fiddle-strings broke!'
+says: 'Were you looking for these?'
+sings: '...the cow jumped over the Moon'
+sings: 'Now let the fun begin! Let us sing together!'
+says: 'Kill, kill, kill. Let us play chess.'
+hums a song peppered with derry-dols and merry-dols.
+says: 'ToME just switched to an HMO.'
+says: 'Do you like my outfit?'
+says: 'Your shoelaces are untied.'
+asks: 'What did you go near them for?'
+says: 'You should post about that on the ToME forums.'
+says: 'A wand of rockets. Yeah, that's the ticket.'
+says: 'Where did everybody go?'
diff --git a/lib/mods/theme/file/timefun.txt b/lib/mods/theme/file/timefun.txt
new file mode 100644
index 00000000..ca3f642f
--- /dev/null
+++ b/lib/mods/theme/file/timefun.txt
@@ -0,0 +1,92 @@
+S:0000
+E:0059
+D:It's the witching hour!
+
+S:0100
+E:0259
+D:There may be Vampires around!
+
+S:0200
+E:0459
+D:Only ToME players are up now!
+
+S:0100
+E:0459
+D:It's really *very* late!
+
+S:0500
+E:0558
+D:Aren't you sleepy yet?
+
+S:0559
+E:0559
+D:It doesn't matter what you found!
+
+S:0600
+E:0759
+D:The sun is up. Time to have fun!
+
+S:0601
+E:0800
+D:Are you having fun yet?
+
+S:0800
+E:0905
+D:@$#$@$!%@$#%$@&$^#%@$!^#&#*
+
+S:0800
+E:1059
+D:You feel there is something special about this level.
+
+S:1100
+E:1159
+D:You see a maze of twisty passages, all alike.
+
+S:1155
+E:1200
+D:Are you having fun yet?
+
+S:1159
+E:1200
+D:This fortune is broken!
+
+S:1200
+E:1205
+D:This fortune is still broken!
+
+S:1200
+E:1359
+D:Uh oh, now you've done it!
+
+S:1400
+E:1729
+D:What did you do with the Phial?
+
+S:1730
+E:1744
+D:You need your chocolate vitamin!
+
+S:1745
+E:1759
+D:Tornado Warning!
+
+S:1759
+E:1800
+D:Night is coming. Danger! Danger!
+
+S:1700
+E:1859
+D:Take a Vampire out for dinner!
+
+S:2100
+E:2159
+D:Warp Factor Nine. Now!
+
+S:2200
+E:2359
+D:PARTY!
+
+S:2359
+E:2359
+D:It's almost the witching hour!
+
diff --git a/lib/mods/theme/file/timenorm.txt b/lib/mods/theme/file/timenorm.txt
new file mode 100644
index 00000000..611da496
--- /dev/null
+++ b/lib/mods/theme/file/timenorm.txt
@@ -0,0 +1,83 @@
+S:0000
+E:0000
+D:It is midnight.
+
+S:0001
+E:0200
+D:It is deep night.
+
+S:0300
+E:0400
+D:It is early morning, but still dark.
+
+S:0500
+E:0544
+D:It will be day soon.
+
+S:0545
+E:0559
+D:The sun is rising.
+
+S:0600
+E:0614
+D:The sun has risen.
+
+S:0615
+E:0659
+D:Morning has broken.
+
+S:0700
+E:0859
+D:It is early morning.
+
+S:0900
+E:0959
+D:It is midmorning.
+
+S:1000
+E:1154
+D:It is late morning.
+
+S:1155
+E:1159
+D:It is almost noon.
+
+S:1200
+E:1200
+D:It is noon.
+
+S:1201
+E:1459
+D:It is early afternoon.
+
+S:1500
+E:1559
+D:It is midafternoon.
+
+S:1600
+E:1659
+D:It is late afternoon.
+
+S:1700
+E:1729
+D:It will be night soon.
+
+S:1730
+E:1759
+D:The sun is setting.
+
+S:1800
+E:1859
+D:The night has begun.
+
+S:1900
+E:2059
+D:It is early night.
+
+S:2100
+E:2358
+D:It is late night.
+
+S:2359
+E:2358
+D:It is almost midnight.
diff --git a/lib/mods/theme/help/ability.txt b/lib/mods/theme/help/ability.txt
new file mode 100644
index 00000000..175d6745
--- /dev/null
+++ b/lib/mods/theme/help/ability.txt
@@ -0,0 +1,115 @@
+|||||oy
+~~~~~01|Abilities
+#####R=== ToME Abilities ===
+As well as spending your skill points on *****skills.txt*0[skills], you can also choose
+to spend them on abilities.
+Abilities are bought once, and then have a permanent effect. You cannot
+continue adding skill points into them, (which you can with *****skills.txt*0[skills]) as there
+would be no way that these abilities can improve. They are a "one-off
+purchase".
+As a consequence of this, they are often quite powerful abilities and can
+cost quite a few skill points to buy.
+Most abilities have a prerequisite skill or stat level which you must reach
+before being able to buy.
+
+For instance, you can invest in the *****ability.txt*03[Tree walking] ability. This will allow
+you to pass through dense undergrowth. In order to purchase this skill you must
+first have your *****skills.txt*34[Nature] skill at 20 or greater, and then it will cost you 7
+skill points to buy. This means you have to "save up" enough skill points in
+order to be able to afford this ability.
+
+You can access the Ability screen by pressing 'N' (in the original keyset, or
+'\N' in the roguelike keyset). Scroll up and down the abilities and then
+navigate right to buy selected ability.
+
+Adapt your character with skills and abilities in order to make it unique,
+playable, and maybe even powerful enough to win the game!
+
+Here follows a list of all the available abilities:
+
+*****ability.txt*02[Spread blows] *****ability.txt*03[Tree walking]
+*****ability.txt*04[Perfect casting] *****ability.txt*05[Extra Max Blow(1)]
+*****ability.txt*06[Extra Max Blow(2)] *****ability.txt*07[Ammo creation]
+*****ability.txt*08[Touch of death] *****ability.txt*09[Artifact Creation]
+*****ability.txt*10[Far reaching attack] *****ability.txt*11[Trapping]
+*****ability.txt*12[Undead Form]
+
+~~~~~02|Abilities|Spread blows
+[[[[[BSpread blows]
+If a monster dies to your attack but you still have blows left
+you won't lose the full turn, allowing you to attack some other
+monster in the same turn.
+#####UPrereq: Weaponmastery skill@30, Dex@17
+#####rCost: 5
+Warriors (of all types) gain this ability for free at character level 25.
+~~~~~03|Abilities|Tree walking
+[[[[[BTree walking]
+Allows you to walk in dense forest.
+#####UPrereq: Nature skill@20
+#####rCost: 7
+Ents and Wood Elves are born with this ability.
+~~~~~04|Abilities|Perfect casting
+[[[[[BPerfect casting]
+Allows you to reach 0% failure rate on spells.
+#####UPrereq: Magic skill@35
+#####rCost: 6
+Priests and Mages (of all types) are born with this ability.
+~~~~~05|Abilities|Extra Max Blow 1
+[[[[[BExtra Max Blow(1)]
+Increases your max possible blows number by 1.
+#####UPrereq: Combat skill@10
+#####rCost: 7
+Warriors (of all types) and Paladins are born with this ability.
+Rogues (of all types) gain this ability for free at character level 10.
+~~~~~06|Abilities|Extra Max Blow 2
+[[[[[BExtra Max Blow(2)]
+Increases your max possible blows number by 1 (Cumulative with
+Extra Max Blow(1)).
+#####UPrereq: Combat skill@20, Extra Max Blow(1)
+#####rCost: 7
+Warriors (of all types) are born with this ability.
+~~~~~07|Abilities|Ammo creation
+[[[[[BAmmo creation]
+Allows you to create shots, arrows and bolts from various materials.
+You can always make shots.
+At Archery level 10 you can start making arrows.
+At Archery level 20 you can start making bolts.
+#####UPrereq: Archery skill@10
+#####rCost: 8
+Archers (of all types) gain this ability for free at character level 2.
+~~~~~08|Abilities|Touch of death
+[[[[[BTouch of death]
+Your melee blows can insta-kill, but you only receive 1/3 of the experience
+for that kill.
+You must activate this from your 'm' menu.
+#####UPrereq: Necromancy skill@50, Combat skill@40, DEX@30, STR@30
+#####rCost: 15
+~~~~~09|Abilities|Artifact Creation
+[[[[[BArtifact Creation]
+In combination with a high alchemy skill this ability will let you
+design your very own artifacts.
+Prereq: Alchemy@40, INT@35, WIS@35
+#####rCost: 70
+~~~~~10|Abilities|Far reaching attack
+[[[[[BFar reaching attack]
+You can attack an enemy one square far using a long polearm.
+At high levels of Polearm-mastery skill, you can even hit two enemies at once.
+#####UPrereq: Combat@15, Polearm-mastery@15
+#####rCost: 10
+~~~~~11|Abilities|Trapping
+[[[[[BTrapping]
+Enables you to set traps which harm monsters.
+#####UPrereq: Disarming@15
+#####rCost: 10
+Rogues are born with this ability.
+~~~~~12|Abilities|Undead Form
+[[[[[BUndead Form]
+With this ability your character receives a small amount of Death Points (DP)
+when they 'die'. Every normal (+0 speed) turn, one DP
+is lost; you can regain it like you would do with Hit Points.
+If you manage to kill enough monsters before your DP goes below 0, your
+character is brought back to life.
+#####UPrereq: Necromancy@30, INT@25
+#####rCost: 15
+Necromancers gain this ability for free at character level 25.
+
diff --git a/lib/mods/theme/help/advanced.hlp b/lib/mods/theme/help/advanced.hlp
new file mode 100644
index 00000000..3f6fe4bd
--- /dev/null
+++ b/lib/mods/theme/help/advanced.hlp
@@ -0,0 +1,15 @@
+|||||oy
+#####RWelcome to the ToME Advanced Help System.
+#####R=============================================
+
+Please choose one of the following help files:
+
+ *****/aoption.txt*0[(a) Options]
+ *****/bmacrofaq.txt*0[(b) Macros]
+ *****/cautomat.txt*0[(c) Automatizer help]
+ (d) Lua scripting help - coming soon
+ *****/edebug.txt*0[(e) Debug commands]
+ *****/fversion.txt*0[(f) Version information] A history of ToME's roots
+
+ *****/zhelp.hlp*0[(z) Main Help menu]
+
diff --git a/lib/mods/theme/help/attack.txt b/lib/mods/theme/help/attack.txt
new file mode 100644
index 00000000..c72e9725
--- /dev/null
+++ b/lib/mods/theme/help/attack.txt
@@ -0,0 +1,148 @@
+|||||oy
+~~~~~01|Attacking Monsters
+~~~~~02|Monsters|Attacking
+#####R=== Attacking and Being Attacked ===
+
+{{{{{<p>}Attacking is simple in ToME; attempting to move over a creature
+attacks it. It is also possible to attack from a distance by firing a missile
+or by magical means (wand, rod, spell, etc). Creatures attack in the same way.
+This means that if you do not wish to melee with a creature, it is wise to keep
+distant from it. This strategy is not perfect -- some monsters, such as
+dragons, have a way to attack from a distance.
+
+Some creatures, such as Ghosts, have the ability to pass through walls.
+To attack creatures (that you can see) who are currently in a wall,
+attempt to move over it (even if you cannot pass through walls, the
+attack will still happen). Monsters will take less damage from attacks
+while they are in walls. Also, if you cannot see the monster (e.g. if you
+are blind, or it is invisible and you do not have see invisible), this
+will not work: you'll have to try to tunnel. Most spells and magic devices
+cannot target monsters in walls. In situations like this, it is usually wise to
+lure the monster out of the wall before attacking it.
+
+Melee attacks are handled as such:
+#####G To-hit:
+ Your strength grants a bonus or penalty to-hit
+ Your class might grant a bonus or penalty to-hit
+ Your skill with specific kinds of weapons gives a bonus
+ to-hit (e.g.: Swordmastery gives a to-hit bonus
+ when using swords)
+ Enchantments on your weapon grant a bonus or penalty to-hit
+ Certain rings (accuracy, slaying) may also grants a bonus
+ or penalty to-hit
+ Your Tactic setting may give bonuses o penalties to-hit
+ (to change it, press 'C' and then 't' or 'T')
+ Other temporary effects (berserk, etc) might affect your
+ chance to hit
+ The armor rating of the monster you're attacking makes a
+ big difference
+
+#####G Blows:
+ Your strength and dexterity affect how many blows you get
+ Your class and level might affect how many blows you get
+ The weight of the weapon very likely will affect how many
+ blows you get
+ Certain skills (e.g. Swordmastery) may affect how many blows
+ you get with particular weapons
+ Enchantments on your weapon might also affect how many
+ blows you get (this is rare)
+ Certain very rare rings (of attacks) may also affect how
+ many blows you get
+
+#####G Damage:
+ The base damage of your weapon is rolled
+ Strength grants a bonus or penalty
+ Your class might grant a bonus or penalty
+ Combat and Weaponmastery skills increase your melee damage
+ Ranged masteries increase the damage multiplier of slings,
+ bows, crossbows or boomerangs(see below)
+ Enchantments on your weapon might also grant a bonus or
+ penalty
+ Your Tactic setting may give bonuses o penalties to damage
+ (to change it, press 'C' and then 't'or'T')
+ Temporary effects also might grant a bonus or penalty
+
+So, each blow you are entitled to is checked for a hit. If this is the case,
+the damage is then applied to the monster. Note that unless you have some
+barehanded combat training or are possessing a monster, melee without a weapon
+will result in a single blow that does base damage of 1d1. This might, however,
+be useful in attacking certain rare monsters that destroy weapons.
+
+Combat with a bow/sling is similar, except ammo is used (which will eventually
+run out, requiring replacement). Bows don't have a base damage rating (ammo
+does), instead having a damage multiplier. Bows can, however, be enchanted,
+and enchantment on bows and arrows is cumulative (meaning that well-enchanted
+bows and arrows can be one of the more effective weapons in the game. They
+do, however, tend to be very expensive, as non-artifact arrows frequently break
+after being fired).
+Using ammo without the appropriate bow generally has poor results.
+~~~~~03|Armor
+#####R=== Armor ===
+
+As the armor class of a monster greatly affects how hard it is for it
+to be hit, your armor class affects how hard it is for it to hit you.
+A high armor rating will make it much easier to survive deep in the dungeon.
+For a warrior style class (Unbelievers, Fighters, Archers, etc), it is
+generally wise to wear as much and as powerful armor as possible (subject
+to weight limitations, of course). Spellcasting classes, however, have
+limits on how much armor they can wear before it disrupts their motion
+and makes it hard for them to cast spells properly. For many of these classes,
+gloves are especially bad for spellcasting. Monks and Rogues skilled
+at dodging will often find heavy armor cumbersome, too.
+Armor has a base rating and an enchantment rating. The base rating is constant
+for the type of armor (e.g. paper armor always has a base rating of 4), and
+the enchantment depends on the item. There are also ways to further enchant
+armor you have. Certain very powerful enchantments grant resistances to
+specific forms of magical attacks.
+~~~~~04|Attacking Monsters|Resistances
+~~~~~05|Armor|Resistances
+#####R=== Resistances and typed attacks===
+Many kinds of monsters, traps, and other effects do damage that has a type.
+Types can have side effects in addition to the raw damage they deal. Certain
+enchanted items can grant resistances, reducing the raw damage and possibly
+reducing or eliminating the side effects. Some monsters also have resistances,
+so watching the messages when attacking a monster can often reveal that a
+particular attack is ineffective.
+~~~~~06|Attacking Monsters|Damage Effect type (Fire/cold/nether etc)
+~~~~~09|Damage Effects
+#####GLow attacks
+ Fire - Destroys weapons, armor, scrolls, and staves. Reduces strength.
+ Cold - Shatters potions.
+ Elec - Reduces dexterity.
+ Acid - Reduces bonuses on equipped armor, reduces charisma
+
+#####GMiddle attacks
+ Poison - Player becomes poisoned
+ Light - Blinds player, perma-lights area
+ Dark - Blinds player, darkens area
+ Confusion - Confuses player
+
+#####GHigh attacks
+ Nether - Drains experience
+ Nexus - Scrambles statistics, teleports player randomly
+ Disenchantment - Reduces bonuses on equipped items
+ Chaos - Confuses, drains life, causes hallucination, and more
+ Sound - Shatters potions
+ Shards - Cuts player
+
+#####GUnresistable attacks
+ Water - Stuns player
+ Ice - Stuns player, shatters potions
+ Plasma - Stuns player, otherwise same as fire attacks
+ Force - Pushes player a few squares back
+ Inertia - Slows player
+ Gravity - Slows and teleports player a few squares
+ Disintegration - Destroys items on ground, destroys walls
+ Mana - Destroys items on ground
+~~~~~07|Monsters|Monster Memory
+#####R=== Monster Memory ===
+
+The thousands of different creatures in ToME have many different
+characteristics, including spells, resistances, health, attacks, and speed.
+The information you have learned about each monster from your encounters
+with them is recorded in the monster memory (accessed with '/' or by 'l'ooking
+at a monster). It is possible to eventually learn all the characteristics
+of any given monster by interacting with them enough, but this is not always
+desirable (hanging around great hell wyrms, for example, can be hazardous
+to one's health). Certain spells may help you learn faster, as well as
+research centres in town.
diff --git a/lib/mods/theme/help/automat.txt b/lib/mods/theme/help/automat.txt
new file mode 100644
index 00000000..bf6478f8
--- /dev/null
+++ b/lib/mods/theme/help/automat.txt
@@ -0,0 +1,504 @@
+|||||oy
+~~~~~01|Automatizer
+~~~~~02|Auto pick-up
+~~~~~03|Auto destroy
+~~~~~04|Autosquelch
+#####R /----------------------------------------\
+#####R < The Automatizer >
+#####R \----------------------------------------/
+
+#####GWhat is the Automatizer?
+The automatizer is an advanced auto-pickup or auto-squelch (auto-destroyer). At
+a basic level, it will allow you to automatically destroy things that you have
+no use for once you walk over them, providing that you have identified one of
+them with your current character.
+
+#####GIs that it?
+Well no. The automatizer is far more flexible than that. The old-fashioned auto
+squelch allowed you to destroy things dependent on how they pseudo-id'd - you
+could auto-destroy all {cursed} swords for instance.
+This is fine to start with, but once you get deep in the dungeon, and have a lot
+of money and a decent weapon, you'll be interested in destroying {average} and
+{good} items too right? Well the automatizer allows you to define destruction of
+things providing you are of a certain level.
+
+#####GSounds quite cool, but wha...
+STOP RIGHT THERE! I haven't finished yet! Let's look at some other examples.
+Most of the time, scrolls of darkness are pretty useless. Unless you are a
+vampire, or an alchemist, right? So you might think it was no good to add
+auto-destroy of scrolls of darkness to the automatizer. But you'd be wrong, for
+you can add rules that are dependent on certain conditions, like that you are
+of a certain race, or class.
+
+#####GHey this is sounding good. What if it destroys my artifacts?
+It can't. Artifacts can never be destroyed, by the automatizer. However, watch
+out for items that are VERY cool but not artifacts... you wouldn't want to go
+destroying boots of speed would you? Fortunately there are provisions for this
+too, you could set a rule that destroyed all excellent boots (providing you were
+past character level 45 say), but not if they were boots of speed.
+
+#####GWoah! This sounds amazing!
+Yes it is, isn't it.
+
+#####GSo how do I use it?
+Well the very simplest way is as follows. When you hit 'k' (^D in the roguelike
+keyset) to destroy an item, you'll see that one option is "$ new automatizer
+rule(OFF)". If you want to destroy all future items like that that you find,
+then hit the $ key. You'll see that (OFF) changes to (ON). Now pick the item you
+want to destroy. Let's say it is a Potion of Salt Water. You would now, as
+normal, see a message "You destroy a Potion of Salt Water". Following this you
+get a prompt, "Destroy all of the same [T]ype, [F]amily, or [N]ame, also use
+[S]tatus (no)?". Let's take the easy one first and hit 'n' to go with name.
+You'll now see a message, "Rule added, please go to the automatizer screen
+(press = then T) to save the modified ruleset". Let's do that then, shall we. If
+this is the first time you have used the automatizer with this savefile, you'll
+be asked to enable it as you hit T. Confirm that you would like to enable it,
+otherwise it won't work.
+
+#####GWhat's the point in having it disabled then?
+Well let's say you spotted something that you weren't sure how it would be
+affected by your rules, but didn't want to destroy it; you could just disable
+the automatizer for a moment and check it over before deciding what to do with
+it and switching the automatizer back on.
+
+#####GHmmm, ok. So I've enabled the automatizer, now what?
+Well, you'll see a screen like this:
+
+&&&&&B/B-B-B-B-BRBuBlBeBsB-B-B-B-B-B/B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B\
+&&&&&B|GsGaGlGtG GwGaGtGeGrB B B w B|G<GrGuGlGeB BnBaBmBew=w"ysyaylyty ywyaytyeyrw"B BtByBpBew=w"ydyeysytyryoyyw"G>B B B B B B B B B B B B B B B B B B B B B B B B w B|
+&&&&&B|wfwowowdB B B B B B B B B w B|G G G G G<GnGaGmGeG>wpwowtwiwownw wowfw wswawlwtw wwwawtwewrg<g/gngagmgeg>B B B B B B B B B B B B B B B B B B B B B B B B B B w B|
+&&&&&B|B B B B B B B B B B B B B w B|g<g/grguglgeg>B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B w B|
+&&&&&B|B B B B B B B B B B B B B w B|B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B w B|
+&&&&&B|B B B B B B B B B B B B B w B|B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B w B|
+&&&&&B|B B B B B B B B B B B B B w B|B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B w B|
+&&&&&B|B B B B B B B B B B B B B w B\B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B/
+&&&&&B|B B B B B B B B B B B B B w B|w BuBpW/BdBoBwBnW WtWoW WsWcWrWoWlWlW,W BtBaBbW WtWoW WsWwWiWtWcWhW WtWoW WtWhWeW WrWuWlWeW WwWiWnWdWoWww w w w w w w w w w w w w
+&&&&&B|w w w w w w w w w w w w w w B|w BuW/BdW WtWoW WmWoWvWeW WrWuWlWeWsW,W BnWeWwW WrWuWlWeW,W BrWeWnWaWmWeW WrWuWlWeW,W BsWaWvWeW WrWuWlWeWsw w w w w w w w w w w w
+&&&&&B\B-B-B-B-B-B-B-B-B-B-B-B-B-B-B/w RkW WtWoW rdrirsrarbrlreW WtWhWeW WaWuWtWoWmWaWtWiWzWeWrw w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w
+
+
+(snipped for brevity).
+
+The automatizer rules are written in XML, so if you're familiar with that format
+you shouldn't find things too difficult. It's also similar in format to HTML, as
+you may notice from the way that there are opening tags (<name>) and closing
+tags (</name>), and that everything between those tags is affected by that
+rule.
+
+#####GXML? HTML? What is this? Isn't ToME enough acronyms to be going on with?
+OK, so you don't know anything about mark-up languages, it's no problem. Let's
+take a look at the automatizer screen bit by bit, starting with the instructions
+bottom right.
+
+up/down to scroll. Well as you move the up/down cursor keys or number keys, a
+different rule name is highlighted in the left hand window, and that rule is
+displayed in the right hand window.
+tab to switch to the rule window. Does what it says on the tin: switches to the
+rule window (the right hand pane) to allow editing of existing rules.
+u/d to move rules. Pressing 'u' or 'd' will move the rule up or down the order
+displayed in the left hand window. Purely for cosmetic reasons.
+new rule. Adds the beginning of a new rule.
+rename rule. This is handy, as every rule added from the destroy prompt (as
+explained above) is automatically named 'destroy', which gets a bit confusing
+when you have 50 or so rules... renaming your rules will make them much easier
+to edit later.
+save rules. Saves all existing rules to a filename you designate (default is
+automat.atm). Don't forget to do this after adding new rules/before exiting the
+game.
+k to disable the automatizer. Disables the automatizer, preserving the rules you
+have made.
+
+#####GYeah yeah, so what about the rule window on the right hand side itself?
+OK, here we go. This is the real juicy stuff.
+
+Anything inside pointy brackets (greater than and less than signs) is called a
+tag. You'll notice that each tag opens with a word, and then that same word
+appears in another tag later on, preceded by a slash. These are referred to as
+opening tags (like <name> ) and closing tags (like </name> ). Everything within
+a set of closing and opening tags is affected by those tags. This will make more
+sense as we continue. Tags and the things they enclose are like "mini-rules"
+which will together make up one rule. I call these mini-rules, clauses.
+
+the first line:
+<rule name="destroy" type="destroy">
+Each rule starts with the tag <rule>, and this contains the rule name, and the
+rule type. The rule name is how it is identified in the left hand window, and
+need not be unique. The rule type will be either "destroy" (destroys items when
+conditions stated below are met) or "pickup" (picks up item when conditions are
+met) or "nothing" (neither picks up, nor destroys item when conditions are met)
+
+The second line:
+ <name>Potion of Salt Water</name>
+This tells us that for the rule to be carried out, the name of the item must be
+"Potion of Salt Water"
+
+The third line:
+</rule>
+This tells us the rule is ended.
+
+In total then, the rule named "destroy" checks to see if the name of every item
+is Potion of Salt water, and if it is, it destroys it.
+
+Nice and simple huh?
+
+#####GYes Yes, very simple. It doesn't look very advanced at the moment.
+Well, we've barely scratched the surface.
+Let's take a look at those other options we got at the destroy prompt. Let's say
+I was at a stage in the game where I wanted to be able to switch on an auto-
+destroy for all swords that pseudo-id'd as {average}. So let's say I have a
+dagger in my backpack, and I want to create an auto-destroy rule for that and
+all subsequent swords... This is what I'd do:
+Hit 'k' to destroy items and hit '$' to turn on automatizer rules. Then I'd
+select the dagger and confirm the destruction. Hit 's' to switch the status
+toggle. This toggle will include (when ON) how the dagger pseudo-ids, and
+finally hit 'f' to add a rule saying destroy by family. What you'll see in the
+automatizer screen now is this:
+
+&&&&&B/B-B-B-B-BRBuBlBeBsB-B-B-B-B-B/B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B\
+&&&&&B|GdGeGsGtGrGoGyB B B B B B w B|G<GrGuGlGeB BnBaBmBew=w"ydyeysytyryoyyw"B BtByBpBew=w"ydyeysytyryoyyw"G>B B B B B B B B B B B B B B B B B B B B B B B B B B B w B|
+&&&&&B|wdwewswtwrwowyB B B B B B w B|G G G G G<GaGnGdG>B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B w B|
+&&&&&B|wfwowowdB B B B B B B B B w B|G G G G G G G G G<GtGvGaGlG>w2w3g<g/gtgvgaglg>B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B w B|
+&&&&&B|B B B B B B B B B B B B B w B|G G G G G G G G G<GsGtGaGtGuGsG>wawvwewrwawgweg<g/gsgtgagtgugsg>B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B w B|
+&&&&&B|B B B B B B B B B B B B B w B|g g g g g<g/gagngdg>B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B w B|
+&&&&&B|B B B B B B B B B B B B B w B|g<g/grguglgeg>B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B w B|
+&&&&&B|B B B B B B B B B B B B B w B|B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B w B|
+&&&&&B|B B B B B B B B B B B B B w B|B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B w B|
+&&&&&B|B B B B B B B B B B B B B w B|B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B w B|
+&&&&&B|B B B B B B B B B B B B B w B|w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w B|
+&&&&&B|B B B B B B B B B B B B B w B\B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B/
+&&&&&B|B B B B B B B B B B B B B w B|w BuBpW/BdBoBwBnW WtWoW WsWcWrWoWlWlW,W BtBaBbW WtWoW WsWwWiWtWcWhW WtWoW WtWhWeW WrWuWlWeW WwWiWnWdWoWww w w w w w w w w w w w w
+&&&&&B|w w w w w w w w w w w w w w B|w BuW/BdW WtWoW WmWoWvWeW WrWuWlWeWsW,W BnWeWwW WrWuWlWeW,W BrWeWnWaWmWeW WrWuWlWeW,W BsWaWvWeW WrWuWlWeWsw w w w w w w w w w w w
+&&&&&B\B-B-B-B-B-B-B-B-B-B-B-B-B-B-B/w RkW WtWoW rdrirsrarbrlreW WtWhWeW WaWuWtWoWmWaWtWiWzWeWrw w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w
+
+#####GOK, well I can see the pseudo-id status is there, what's that tval thing? And
+#####Gwhere does it say swords?
+Well actually the tval thing is where it says swords! This is what is added by
+the 'destroy by family' option.
+
+It's probably worth explaining a bit here about the internal structure of ToME
+code. Don't worry it's not too scary. In ToME, all objects are divided into
+types: swords, axes, hafted-weapons, scrolls, rings etc. Every type is further
+divided into sub-types. Eg swords are divided into daggers, broad swords, two-
+handed swords and so on. Scrolls are divided into their specific actions;
+scrolls of light, scrolls of satisfy hunger etc. Each type has a number assigned
+to it, that never changes, and so does each sub-type. In this way we can
+identify an exact object using just two values: it's type, or tvalue (tval) and
+it's sub-type, or svalue (sval). You see where we're going with this?
+Now daggers have a tval of 23 and an sval of 4. So you can see that we've said
+in the rule that all things with a tval of 23 and a status of average can be
+destroyed.
+
+#####GAh, right. I see. And what's with the <and> tags?
+Well, everything in those tags must be true for the rule to carry out. If we had
+the <tval>23</tval> and the <status>average</average> lines without the <and>
+tags, it would not be clear whether we wanted just one of those clauses to be
+true for the rule to be carried out, or both of them.
+
+#####GErr...
+In other words, without the <and> tags it might look like we wanted to destroy
+a) EVERYTHING that pseudo id'd as average, and
+b) EVERY sword, regardless of how it pseudo-id'd!
+
+#####GRight. What if I did want a rule that was more general, and had either/or
+options in it?
+Then there are tags to do that - the <or> </or> tags. If ANY of the clauses
+return as true within or tags, then the rule is carried out. Substitute <or>
+tags for the <and> tags in our sword example above, and the rule will operate in
+the rather unhelpful way I explained above (all {average} things destroyed, and
+all swords destroyed, regardless of how they pseudo-id). So essentially, if your
+rule has more than one clause, you will need to include either <and> tags or
+<or> tags, or in some cases both.
+
+#####GOK and so what does the [T]ype option do?
+It merely adds the sval, thus narrowing down the parameters for the auto-
+destroy. For instance if I'd chosen to destroy by type rather than family in the
+last example, we'd have ended up with this:
+
+&&&&&B/B-B-B-B-BRBuBlBeBsB-B-B-B-B-B/B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B\
+&&&&&B|GdGeGsGtGrGoGyB B B B B B w B|G<GrGuGlGeB BnBaBmBew=w"ydyeysytyryoyyw"B BtByBpBew=w"ydyeysytyryoyyw"G>B B B B B B B B B B B B B B B B B B B B B B B B B B B w B|
+&&&&&B|wdwewswtwrwowyB B B B B B w B|G G G G G<GaGnGdG>B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B w B|
+&&&&&B|wfwowowdB B B B B B B B B w B|G G G G G G G G G<GaGnGdG>B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B w B|
+&&&&&B|B B B B B B B B B B B B B w B|G G G G G G G G G G G G G<GtGvGaGlG>w2w3g<g/gtgvgaglg>B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B w B|
+&&&&&B|B B B B B B B B B B B B B w B|G G G G G G G G G G G G G<GsGvGaGlB BmBiBnw=w"y4w"B BmBaBxw=w"y4w"G>g<g/gsgvgaglg>B B B B B B B B B B B B B B B B B B B B B B w B|
+&&&&&B|B B B B B B B B B B B B B w B|g g g g g g g g g<g/gagngdg>B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B w B|
+&&&&&B|B B B B B B B B B B B B B w B|G G G G G G G G G<GsGtGaGtGuGsG>wawvwewrwawgweg<g/gsgtgagtgugsg>B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B w B|
+&&&&&B|B B B B B B B B B B B B B w B|g g g g g<g/gagngdg>B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B w B|
+&&&&&B|B B B B B B B B B B B B B w B|g<g/grguglgeg>B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B w B|
+&&&&&B|B B B B B B B B B B B B B w B|B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B w B|
+&&&&&B|B B B B B B B B B B B B B w B|B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B w B|
+&&&&&B|B B B B B B B B B B B B B w B|B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B w B|
+&&&&&B|B B B B B B B B B B B B B w B|w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w B|
+&&&&&B|B B B B B B B B B B B B B w B\B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B/
+&&&&&B|B B B B B B B B B B B B B w B|w BuBpW/BdBoBwBnW WtWoW WsWcWrWoWlWlW,W BtBaBbW WtWoW WsWwWiWtWcWhW WtWoW WtWhWeW WrWuWlWeW WwWiWnWdWoWww w w w w w w w w w w w w
+&&&&&B|w w w w w w w w w w w w w w B|w BuW/BdW WtWoW WmWoWvWeW WrWuWlWeWsW,W BnWeWwW WrWuWlWeW,W BrWeWnWaWmWeW WrWuWlWeW,W BsWaWvWeW WrWuWlWeWsw w w w w w w w w w w w
+&&&&&B\B-B-B-B-B-B-B-B-B-B-B-B-B-B-B/w RkW WtWoW rdrirsrarbrlreW WtWhWeW WaWuWtWoWmWaWtWiWzWeWrw w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w
+
+You can see in this example that we have nested <and> tags. Evaluating the tags
+from the ones nested deepest first we can see that if an object has a tval of 23
+and an sval between the values of 4 and 4 (i.e. if it is 4) then the rule will
+check against the next part, which is to see if the object identifies {average}.
+If it does, then all the clauses have been met and rule is carried out. In
+short, it destroys all average daggers, rather than all average swords. Strictly
+speaking the nested <and> tags aren't needed, but they do no harm, and are added
+automatically when destroying by [T]ype.
+
+#####GThis is all well and good but the numbers are going to get rather confusing
+#####Garen't they? Be much easier if I could just write 'swords' or 'daggers'.
+Well, you can. Kind of. Instead of using the admittedly rather obtuse numbers,
+you can use the name of that tvalue rather than the number it represents. So
+instead of <tval>23</tval> you could write <tval>TV_SWORD</tval>.
+
+#####GAh that would be better. But where can I find out what all the names, and
+#####Gnumbers of tvalues are?
+Well I've written a *****defines.txt*0[file] which lists tvalues and one which lists svalues for you
+to check on, and you may want to check the objects entry in k_info.txt in your
+lib/edit directory. If you look at the entry for dagger you'll see:
+
+N:43:& Dagger~
+G:|:W
+I:23:4:0
+W:0:0:12:10
+A:0/1:5/1:10/1:20/1
+P:0:1d4:0:0:0
+<snip>
+The only line we're interested in is the one that starts I (for Index). The
+first number is the tval, and the second is the sval.
+Of course you could always rename your rule to make things clearer.
+
+#####GOK so you mentioned something about setting rules up that happen only if a
+#####Gplayer is a certain level?
+Yeah, good point. Well, let's develop our destroy average swords rule for the
+moment. Let's say we always wanted to destroy average swords by the time we got
+to character level 20. They don't earn enough gold to make it worth carrying
+back to town, and we'll have a better weapon by then anyway. So here we are in
+the automatizer screen, with the destroy sword rule displaying in the right hand
+window. If we hit tab, the right window becomes active and the rules at the
+bottom change:
+
+&&&&&B/B-B-B-B-BRBuBlBeBsB-B-B-B-B-B/B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B\
+&&&&&B|gdgegsgtgrgogyB B B B B B w B|v<vrvuvlveB BnBaBmBew=w"ydyeysytyryoyyw"B BtByBpBew=w"ydyeysytyryoyyw"v>B B B B B B B B B B B B B B B B B B B B B B B B B B B w B|
+&&&&&B|wdwewswtwrwowyB B B B B B w B|G G G G G<GaGnGdG>B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B w B|
+&&&&&B|wfwowowdB B B B B B B B B w B|G G G G G G G G G<GtGvGaGlG>w2w3g<g/gtgvgaglg>B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B w B|
+&&&&&B|B B B B B B B B B B B B B w B|G G G G G G G G G<GsGtGaGtGuGsG>wawvwewrwawgweg<g/gsgtgagtgugsg>B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B w B|
+&&&&&B|B B B B B B B B B B B B B w B|g g g g g<g/gagngdg>B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B w B|
+&&&&&B|B B B B B B B B B B B B B w B|v<v/vrvuvlvev>B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B w B|
+&&&&&B|B B B B B B B B B B B B B w B|B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B w B|
+&&&&&B|B B B B B B B B B B B B B w B|B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B w B|
+&&&&&B|B B B B B B B B B B B B B w B|B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B w B|
+&&&&&B|B B B B B B B B B B B B B w B\B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B/
+&&&&&B|B B B B B B B B B B B B B w B|w BuBpW/BdBoBwBnW/BlBeBfBtW/BrBiBgBhBtW WtWoW WnWaWvWiWtWaWgWeW WrWuWlWeW,W B9W/B3W/B7W/B1W WtWoW WsWcWrWoWlWlw w w w w w w w w w
+&&&&&B|w w w w w w w w w w w w w w B|w BtBaBbW WfWoWrW WsWwWiWtWcWhW,W BaWdWdW WcWlWaWuWsWeW,W BdWeWlWeWtWeW WcWlWaWuWsWeW/WrWuWlWew w w w w w w w w w w w w w w w w w
+&&&&&B\B-B-B-B-B-B-B-B-B-B-B-B-B-B-B/w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w
+
+You can see the <rule> tags have changed to purple, indicating they are the
+active ones, that all key presses will act upon. Let's just quickly scoot
+through these new commands:
+up/down/left/right to navigate rule: These will change which clause is active,
+enabling you to delete that clause, or add further clauses inside that one if it
+so allows it.
+9/3/7/1 to scroll: scrolls the whole screen which can become useful if you have
+a particularly long rule or one with lots of nested clauses.
+tab for switch: will make the left-hand window active again.
+add clause: adds a new clause within the active one, providing the active clause
+is either a <and>, <or> or <not> tag.
+delete clause/rule: deletes the active clause, and any clauses nested within
+that one. Therefore if the <rule> tags are active, the whole rule will be
+deleted. Beware!
+
+So if we now hit our right arrow we see that the <and> tags are active. We can
+now add a new clause here. Let's do so by pressing 'a'. You'll now see a list of
+different types of clauses you can add, which you simply scroll through using up
+and down keys, and select by hitting enter. A brief description of the selected
+clause is shown in the right hand window. Scroll down to the 'level' rule type
+and hit enter. You'll be asked to enter a player level. Let's go for 20. You'll
+then be asked for a maximum level, put 50, as we want the rule to be true from
+level 20 and upwards. You'll now see our rule displays as:
+
+&&&&&B/B-B-B-B-BRBuBlBeBsB-B-B-B-B-B/B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B\
+&&&&&B|gdgegsgtgrgogyB B B B B B w B|G<GrGuGlGeB BnBaBmBew=w"ydyeysytyryoyyw"B BtByBpBew=w"ydyeysytyryoyyw"G>B B B B B B B B B B B B B B B B B B B B B B B B B B B w B|
+&&&&&B|wdwewswtwrwowyB B B B B B w B|v v v v v<vavnvdv>B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B w B|
+&&&&&B|wfwowowdB B B B B B B B B w B|G G G G G G G G G<GtGvGaGlG>w2w3g<g/gtgvgaglg>B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B w B|
+&&&&&B|B B B B B B B B B B B B B w B|G G G G G G G G G<GsGtGaGtGuGsG>wawvwewrwawgweg<g/gsgtgagtgugsg>B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B w B|
+&&&&&B|B B B B B B B B B B B B B w B|G G G G G G G G G<GlGeGvGeGlB BmBiBnw=w"y2y0w"B BmBaBxw=w"y5y0w"G>g<g/glgegvgeglg>B B B B B B B B B B B B B B B B B B B B B B w B|
+&&&&&B|B B B B B B B B B B B B B w B|v v v v v<v/vavnvdv>B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B w B|
+&&&&&B|B B B B B B B B B B B B B w B|g<g/grguglgeg>B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B w B|
+&&&&&B|B B B B B B B B B B B B B w B|B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B w B|
+&&&&&B|B B B B B B B B B B B B B w B|B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B w B|
+&&&&&B|B B B B B B B B B B B B B w B|B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B w B|
+&&&&&B|B B B B B B B B B B B B B w B\B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B/
+&&&&&B|B B B B B B B B B B B B B w B|w BuBpW/BdBoBwBnW/BlBeBfBtW/BrBiBgBhBtW WtWoW WnWaWvWiWtWaWgWeW WrWuWlWeW,W B9W/B3W/B7W/B1W WtWoW WsWcWrWoWlWlw w w w w w w w w w
+&&&&&B|w w w w w w w w w w w w w w B|w BtBaBbW WfWoWrW WsWwWiWtWcWhW,W BaWdWdW WcWlWaWuWsWeW,W BdWeWlWeWtWeW WcWlWaWuWsWeW/WrWuWlWew w w w w w w w w w w w w w w w w w
+&&&&&B\B-B-B-B-B-B-B-B-B-B-B-B-B-B-B/w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w
+
+So there we go. A rule which will destroy all {average} swords once the player
+is past character level 20.
+
+#####GHmmm I've tried this, it doesn't destroy cursed swords though...
+Nope. You haven't told it to. If you want a scaling rule, which always destroys
+cursed swords and then destroys average swords at character level 20, then {good}
+swords at character level 35, have a look at this, rather more complicated rule.
+
+&&&&&B/B-B-B-B-BRBuBlBeBsB-B-B-B-B-B/B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B\
+&&&&&B|wswhwiwewlwdB B B B B B B w B|G<GrGuGlGeB BnBaBmBew=w"ysywyoyrydysw"B BtByBpBew=w"ydyeysytyryoyyw"G>B B B B B B B B B B B B B B B B B B B B B B B B B B B B w B|
+&&&&&B|wbwowwB B B B B B B B B B w B|G G G G G<GaGnGdG>B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B w B|
+&&&&&B|whwrwdw wawrwmwowuwrB B B w B|G G G G G G G G G<GtGvGaGlG>w2w3g<g/gtgvgaglg>B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B w B|
+&&&&&B|wawxwewsB B B B B B B B B w B|G G G G G G G G G<GoGrG>B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B w B|
+&&&&&B|whwewlwmwsB B B B B B B B w B|G G G G G G G G G G G G G<GaGnGdG>B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B w B|
+&&&&&B|wswowfwtw wawrwmB B B B B w B|G G G G G G G G G G G G G G G G G<GlGeGvGeGlB BmBiBnw=w"y0w"B BmBaBxw=w"y5y0w"G>g<g/glgegvgeglg>B B B B B B B B B B B B B B B w B|
+&&&&&B|wbwowlwtwsB B B B B B B B w B|G G G G G G G G G G G G G G G G G<GoGrG>B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B w B|
+&&&&&B|wbwowowtwsB B B B B B B B w B|G G G G G G G G G G G G G G G G G G G G G<GsGtGaGtGuGsG>wvwewrwyw wbwawdg<g/gsgtgagtgugsg>B B B B B B B B B B B B B B B B B B w B|
+&&&&&B|wgwlwowvwewsB B B B B B B w B|G G G G G G G G G G G G G G G G G G G G G<GsGtGaGtGuGsG>wbwawdg<g/gsgtgagtgugsg>B B B B B B B B B B B B B B B B B B B B B B B w B|
+&&&&&B|wpwowlwewawrwmwsB B B B B w B|g g g g g g g g g g g g g g g g g<g/gogrg>B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B w B|
+&&&&&B|wcwlwowawkB B B B B B B B w B|g g g g g g g g g g g g g<g/gagngdg>B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B w B|
+&&&&&B|GsGwGoGrGdGsB B B B B B B w B|G G G G G G G G G G G G G<GaGnGdG>B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B w B|
+&&&&&B|whwawfwtwewdwsB B B B B B w B|G G G G G G G G G G G G G G G G G<GlGeGvGeGlB BmBiBnw=w"y1y5w"B BmBaBxw=w"y5y0w"G>g<g/glgegvgeglg>B B B B B B B B B B B B B B w B|
+&&&&&B|wawrwrwowwwsB B B B B B B w B|G G G G G G G G G G G G G G G G G<GsGtGaGtGuGsG>wawvwewrwawgweg<g/gsgtgagtgugsg>B B B B B B B B B B B B B B B B B B B B B B B w B|
+&&&&&B|wswhwowtB B B B B B B B B w B|g g g g g g g g g g g g g<g/gagngdg>B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B w B|
+&&&&&B|wbwowowmwewrwawnwgB B B B w B|G G G G G G G G G G G G G<GaGnGdG>B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B w B|
+&&&&&B|wtwowrwcwhB B B B B B B B w B|G G G G G G G G G G G G G G G G G<GlGeGvGeGlB BmBiBnw=w"y2y5w"B BmBaBxw=w"y5y0w"G>g<g/glgegvgeglg>B B B B B B B B B B B B B B w B|
+&&&&&B|wrwowdw wtwiwpwsB B B B B w B|G G G G G G G G G G G G G G G G G<GsGtGaGtGuGsG>wgwowowdg<g/gsgtgagtgugsg>B B B B B B B B B B B B B B B B B B B B B B B B B B w B|
+&&&&&B|wpwowtwiwownwsB B B B B B w B|g g g g g g g g g g g g g<g/gagngdg>B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B w B|
+&&&&&B|wrwiwnwgwsB B B B B B B B w B|g g g g g g g g g<g/gogrg>B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B w B|
+&&&&&B|wwwawnwdwsB B B B B B B B w B|g g g g g<g/gagngdg>B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B w B|
+&&&&&B|wmwuwswhwrwowowmwsB B B B w B|g<g/grguglgeg>B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B w B|
+&&&&&B|wswcwrwowlwlwsB B B B B B w B|B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B w B|
+&&&&&B|wawmwuwlwewtwsB B B B B B w B|w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w B|
+&&&&&B|wpwawrwcwhwmwewnwtwsB B B w B\B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B/
+&&&&&B|wswhwawpwew wpwowtB B B B w B|w BuBpW/BdBoBwBnW WtWoW WsWcWrWoWlWlW,W BtBaBbW WtWoW WsWwWiWtWcWhW WtWoW WtWhWeW WrWuWlWeW WwWiWnWdWoWww w w w w w w w w w w w w
+&&&&&B|wswtwawvwewsw w w w w w w w B|w BuW/BdW WtWoW WmWoWvWeW WrWuWlWeWsW,W BnWeWwW WrWuWlWeW,W BrWeWnWaWmWeW WrWuWlWeW,W BsWaWvWeW WrWuWlWeWsw w w w w w w w w w w w
+&&&&&B\B-B-B-B-B-B-B-B-B-B-B-B-B-B-B/w RkW WtWoW rdrirsrarbrlreW WtWhWeW WaWuWtWoWmWaWtWiWzWeWrw w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w
+
+#####GWoah! What the heck is that?!
+OK ok slow down a minute. Look at it carefully and a clause at a time. It's not
+difficult. Let's take it from the top. It's a destroying rule called swords. It
+opens with some <and> tags. The object must be a sword (tval 23). Now we have an
+OR tag, so we know that there are going to be some options:
+option 1: the player is between level 0 and level 50, and the sword pseudo id's
+as either cursed or worthless.
+option 2: the player is above character level 15, and the sword pseudo id's as
+average.
+option 3: the player is above character level 25, and the sword pseudo id's as
+good.
+If any of these options are true, the rule is carried out. This rule could
+easily be copied for other weapons or pieces of armour, substituting only the
+tval, and perhaps the name.
+
+#####GHmmm ok. looks good. I might want to change those character level values
+#####Gthough. they look a bit low...
+Well yeah, that's up to your playing style I guess... If you want to edit
+clauses directly rather than delete and re-add them, you might want to edit the
+automat.atm file directly. Just open it in your text editor (it's located in
+your lib/user directory or in ~/.tome on multiuser systems) and you'll see the
+format is identical to how it is displayed in the automatizer file. Just watch
+your spellings, and keep a back-up of the original to replace if things go
+wrong. Don't mess about in there if you feel unsure of what you're doing though.
+
+#####GSo what about those examples you gave up above? Like destroying scrolls of
+#####Gdarkness unless you are a vampire or an alchemist?
+OK, let's add this rule from scratch rather than from the destroy item prompt.
+In the automatizer screen, hit 'n' for new rule. It asks for a name and a type
+of rule (destroy/pickup/nothing). I called my rule "? of darkness", and it's a
+destroy rule. It is worthwhile thinking at this point how the rule is going to
+be structured; for very complicated rules pen and paper may help. We're going to
+need to define the object (either by name, or by tval and sval) then we're going
+to say unless the player race modifier is vampire, or the player class is
+alchemist. So we are obviously going to have more than one clause, and the
+clauses are going to have to BOTH be true for the rule to take effect so the
+first clause we add is an <and> one. So hit 'a' for add clause and enter to
+select the <and> clause. Lets now hit our right arrow, so the <and> tags are
+active, and add a new rule. We can now select the <name> tags. At this point
+we're prompted for the name. Now it's not case-sensitive, but you do need to
+spell it correctly!
+With the <and> tags still highlighted we now want to add our "unless vampire or
+alchemist" clause. Seeing as this is an "unless" type clause, we start with a
+<not> tag. So again, 'a'dd a new clause, and select <not>.
+Now make the <not> tag active by moving right and down with the cursor keys. We
+want "EITHER vampire or alchemist" so we include <or> tags, again by moving
+across to make the <not> tags active and 'a'dding a new <or> clause. Then select
+the <or> tags and 'a'dd a new <subrace> clause. Enter 'vampire'.
+So the last part is to add alchemist. Now this might at first glance seem to be
+a simple case of 'a'dding a new clause of the <class> type, within the <or>
+tags, and there is certainly nothing 'wrong' with doing this. At present there
+is no way for non-alchemists to get the alchemy skill, but it is sometimes best
+to 'future-proof' against such possibilities. That's what we're going to do
+here.
+So rather than add a <class> clause, we're going to add a <skill> clause.
+With the <or> tags active, 'a'dd a new <skill> clause. You're first asked for a
+minimum skill level. Well, we can't use any skill unless we have 1.00 whole
+skill points in it or more, so we can put 1 in here. We're then asked for a
+maximum skill level, so we'll put in 50 here. The skill name must be spelled
+correctly (as it appears on the skill screen) so we put 'Alchemy' here. Your
+complete rule now appears as follows:
+
+&&&&&B/B-B-B-B-BRBuBlBeBsB-B-B-B-B-B/B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B\
+&&&&&B|G?G GdGaGrGkGnGeGsGsB B B w B|G<GrGuGlGeB BnBaBmBew=w"y?y ydyayrykynyeysysw"B BtByBpBew=w"ydyeysytyryoyyw"G>B B B B B B B B B B B B B B B B B B B B B B B B w B|
+&&&&&B|wswwwowrwdwsB B B B B B B w B|G G G G G<GaGnGdG>B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B w B|
+&&&&&B|wswawlwtw wwwawtwewrB B B w B|G G G G G G G G G<GnGaGmGeG>wSwcwrwowlwlw wowfw wdwawrwkwnwewswsg<g/gngagmgeg>B B B B B B B B B B B B B B B B B B B B B B B B w B|
+&&&&&B|wfwowowdB B B B B B B B B w B|G G G G G G G G G<GnGoGtG>B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B w B|
+&&&&&B|B B B B B B B B B B B B B w B|G G G G G G G G G G G G G<GoGrG>B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B w B|
+&&&&&B|B B B B B B B B B B B B B w B|G G G G G G G G G G G G G G G G G<GsGuGbGrGaGcGeG>wvwawmwpwiwrweg<g/gsgugbgrgagcgeg>B B B B B B B B B B B B B B B B B B B B B w B|
+&&&&&B|B B B B B B B B B B B B B w B|G G G G G G G G G G G G G G G G G<GsGkGiGlGlB BmBiBnw=w"y1w"B BmBaBxw=w"y5y0w"G>wAwlwcwhwewmwyg<g/gsgkgiglglg>B B B B B B B B w B|
+&&&&&B|B B B B B B B B B B B B B w B|g g g g g g g g g g g g g<g/gogrg>B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B w B|
+&&&&&B|B B B B B B B B B B B B B w B|g g g g g g g g g<g/gngogtg>B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B w B|
+&&&&&B|B B B B B B B B B B B B B w B|g g g g g<g/gagngdg>B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B w B|
+&&&&&B|B B B B B B B B B B B B B w B|g<g/grguglgeg>B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B w B|
+&&&&&B|B B B B B B B B B B B B B w B|B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B w B|
+&&&&&B|B B B B B B B B B B B B B w B|B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B w B|
+&&&&&B|B B B B B B B B B B B B B w B|B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B w B|
+&&&&&B|B B B B B B B B B B B B B w B\B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B/
+&&&&&B|B B B B B B B B B B B B B w B|w BuBpW/BdBoBwBnW WtWoW WsWcWrWoWlWlW,W BtBaBbW WtWoW WsWwWiWtWcWhW WtWoW WtWhWeW WrWuWlWeW WwWiWnWdWoWww w w w w w w w w w w w w
+&&&&&B|w w w w w w w w w w w w w w B|w BuW/BdW WtWoW WmWoWvWeW WrWuWlWeWsW,W BnWeWwW WrWuWlWeW,W BrWeWnWaWmWeW WrWuWlWeW,W BsWaWvWeW WrWuWlWeWsw w w w w w w w w w w w
+&&&&&B\B-B-B-B-B-B-B-B-B-B-B-B-B-B-B/w RkW WtWoW rdrirsrarbrlreW WtWhWeW WaWuWtWoWmWaWtWiWzWeWrw w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w
+
+You'll notice I've also renamed the rules to make things a bit more legible.
+
+#####GOK I'm getting there now, what about the boots of speed thing you talked about?
+Heh. Take a look at this, and see if you can work out what it's doing first
+before I talk you through it
+
+&&&&&B/B-B-B-B-BRBuBlBeBsB-B-B-B-B-B/B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B\
+&&&&&B|GbGoGoGtGsB B B B B B B B w B|G<GrGuGlGeB BnBaBmBew=w"ybyoyoytysw"B BtByBpBew=w"ydyeysytyryoyyw"G>B B B B B B B B B B B B B B B B B B B B B B B B B B B B B w B|
+&&&&&B|w?w wdwawrwkwnwewswsB B B w B|G G G G G<GaGnGdG>B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B w B|
+&&&&&B|wswwwowrwdwsB B B B B B B w B|G G G G G G G G G<GtGvGaGlG>wTwVw_wBwOwOwTwSg<g/gtgvgaglg>B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B w B|
+&&&&&B|wswawlwtw wwwawtwewrB B B w B|G G G G G G G G G<GoGrG>B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B w B|
+&&&&&B|wfwowowdB B B B B B B B B w B|G G G G G G G G G G G G G<GaGnGdG>B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B w B|
+&&&&&B|B B B B B B B B B B B B B w B|G G G G G G G G G G G G G G G G G<GlGeGvGeGlB BmBiBnw=w"y0w"B BmBaBxw=w"y5y0w"G>g<g/glgegvgeglg>B B B B B B B B B B B B B B B w B|
+&&&&&B|B B B B B B B B B B B B B w B|G G G G G G G G G G G G G G G G G<GoGrG>B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B w B|
+&&&&&B|B B B B B B B B B B B B B w B|G G G G G G G G G G G G G G G G G G G G G<GsGtGaGtGuGsG>wvwewrwyw wbwawdg<g/gsgtgagtgugsg>B B B B B B B B B B B B B B B B B B w B|
+&&&&&B|B B B B B B B B B B B B B w B|G G G G G G G G G G G G G G G G G G G G G<GsGtGaGtGuGsG>wbwawdg<g/gsgtgagtgugsg>B B B B B B B B B B B B B B B B B B B B B B B w B|
+&&&&&B|B B B B B B B B B B B B B w B|g g g g g g g g g g g g g g g g g<g/gogrg>B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B w B|
+&&&&&B|B B B B B B B B B B B B B w B|g g g g g g g g g g g g g<g/gagngdg>B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B w B|
+&&&&&B|B B B B B B B B B B B B B w B|G G G G G G G G G G G G G<GaGnGdG>B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B w B|
+&&&&&B|B B B B B B B B B B B B B w B|G G G G G G G G G G G G G G G G G<GlGeGvGeGlB BmBiBnw=w"y2y0w"B BmBaBxw=w"y5y0w"G>g<g/glgegvgeglg>B B B B B B B B B B B B B B w B|
+&&&&&B|B B B B B B B B B B B B B w B|G G G G G G G G G G G G G G G G G<GsGtGaGtGuGsG>wawvwewrwawgweg<g/gsgtgagtgugsg>B B B B B B B B B B B B B B B B B B B B B B B w B|
+&&&&&B|B B B B B B B B B B B B B w B|g g g g g g g g g g g g g<g/gagngdg>B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B w B|
+&&&&&B|B B B B B B B B B B B B B w B|G G G G G G G G G G G G G<GaGnGdG>B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B w B|
+&&&&&B|B B B B B B B B B B B B B w B|G G G G G G G G G G G G G G G G G<GlGeGvGeGlB BmBiBnw=w"y3y5w"B BmBaBxw=w"y5y0w"G>g<g/glgegvgeglg>B B B B B B B B B B B B B B w B|
+&&&&&B|B B B B B B B B B B B B B w B|G G G G G G G G G G G G G G G G G<GsGtGaGtGuGsG>wgwowowdg<g/gsgtgagtgugsg>B B B B B B B B B B B B B B B B B B B B B B B B B B w B|
+&&&&&B|B B B B B B B B B B B B B w B|g g g g g g g g g g g g g<g/gagngdg>B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B w B|
+&&&&&B|B B B B B B B B B B B B B w B|G G G G G G G G G G G G G<GaGnGdG>B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B w B|
+&&&&&B|B B B B B B B B B B B B B w B|G G G G G G G G G G G G G G G G G<GlGeGvGeGlB BmBiBnw=w"y4y5w"B BmBaBxw=w"y5y0w"G>g<g/glgegvgeglg>B B B B B B B B B B B B B B w B|
+&&&&&B|B B B B B B B B B B B B B w B|G G G G G G G G G G G G G G G G G<GsGtGaGtGuGsG>wvwewrwyw wgwowowdg<g/gsgtgagtgugsg>B B B B B B B B B B B B B B B B B B B B B w B|
+&&&&&B|B B B B B B B B B B B B B w B|G G G G G G G G G G G G G G G G G<GsGtGaGtGeG>wiwdwewnwtwiwfwiwewdg<g/gsgtgagtgeg>B B B B B B B B B B B B B B B B B B B B B B w B|
+&&&&&B|B B B B B B B B B B B B B w B|G G G G G G G G G G G G G G G G G<GnGoGtG>B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B w B|
+&&&&&B|B B B B B B B B B B B B B w B|G G G G G G G G G G G G G G G G G G G G G<GcGoGnGtGaGiGnG>wswpwewewdg<g/gcgogngtgagigng>B B B B B B B B B B B B B B B B B B B w B|
+&&&&&B|B B B B B B B B B B B B B w B|g g g g g g g g g g g g g g g g g<g/gngogtg>B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B w B|
+&&&&&B|B B B B B B B B B B B B B w B|g g g g g g g g g g g g g<g/gagngdg>B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B w B|
+&&&&&B|B B B B B B B B B B B B B w B|g g g g g g g g g<g/gogrg>B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B w B|
+&&&&&B|B B B B B B B B B B B B B w B|g g g g g<g/gagngdg>B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B w B|
+&&&&&B|B B B B B B B B B B B B B w B|g<g/grguglgeg>w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w B|
+&&&&&B|B B B B B B B B B B B B B w B\B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B-B/
+&&&&&B|B B B B B B B B B B B B B w B|w BuBpW/BdBoBwBnW WtWoW WsWcWrWoWlWlW,W BtBaBbW WtWoW WsWwWiWtWcWhW WtWoW WtWhWeW WrWuWlWeW WwWiWnWdWoWww w w w w w w w w w w w w
+&&&&&B|w w w w w w w w w w w w w w B|w BuW/BdW WtWoW WmWoWvWeW WrWuWlWeWsW,W BnWeWwW WrWuWlWeW,W BrWeWnWaWmWeW WrWuWlWeW,W BsWaWvWeW WrWuWlWeWsw w w w w w w w w w w w
+&&&&&B\B-B-B-B-B-B-B-B-B-B-B-B-B-B-B/w RkW WtWoW rdrirsrarbrlreW WtWhWeW WaWuWtWoWmWaWtWiWzWeWrw w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w
+
+The majority of this is fairly similar to the swords rule; it destroys {average}
+boots at character level 20, {good} ones at character level 35 and cursed ones
+always. The addition is at the bottom. It adds clauses which will destroy
+excellent items providing that they have been identified and that the name does
+not contain the word "speed". The <state>identified</state> bit is important
+here, as it would destroy the boots on pseudo-id otherwise, before it even saw
+the full name of the boots.
+
+#####GThis is fantastic! Where can I get more help?
+email me: fearoffours@t-o-m-e.net
diff --git a/lib/mods/theme/help/birth.txt b/lib/mods/theme/help/birth.txt
new file mode 100644
index 00000000..9e7da8dd
--- /dev/null
+++ b/lib/mods/theme/help/birth.txt
@@ -0,0 +1,659 @@
+|||||oy
+~~~~~84|Birth
+~~~~~11|Character
+#####R /----------------------------------------\
+#####R < Creating a Character >
+#####R \----------------------------------------/
+
+ *****birth.txt*01[Creating a Character] *****birth.txt*02[Character Characteristics]
+ *****birth.txt*03[Races] *****birth.txt*04[Race Modifiers]
+ *****birth.txt*05[Classes] *****birth.txt*83[Gods]
+ *****birth.txt*06[Stats] *****birth.txt*07[Abilities]
+ *****birth.txt*08[Combinations of Race and Class] *****birth.txt*09[Stat bonus tables]
+
+~~~~~01|Character|Creating a Character
+~~~~~12|Creating a Character
+#####R=== Creating a Character ===
+
+ToME is a roleplaying game, in which you, the player, control a
+character in the various dungeons and places of Arda. Perhaps the most
+important thing you control is the birth of your character, in which you
+choose or allow to be chosen various attributes that will affect the future
+life of your character.
+
+Character creation, or birth, is controlled through a variety of choices
+as to constraints on the type of character you wish to play, followed by
+a series of random calculations to generate ("roll up") a random character
+matching the appropriate constraints.
+
+Once your character has been generated, you will be given the choice to
+generate a new character obeying the same constraints, and once you have
+generated more than one character, you can switch back and forth between
+the two most recent characters, until you are presented with a personality
+that you feel comfortable with.
+
+You may start the entire process over at any time.
+
+Once you have accepted a character you will asked to provide a name for the
+character. In general, the actual choice of a name is not important, but do
+keep in mind that it may have some effect on the game itself. For example,
+on some machines, the character name determines the filename that will be
+used to save the character to disk. On others, the character name specifies
+special "pref" files. And the character name is used on the high score list.
+
+~~~~~02|Character|Characteristics
+~~~~~13|Character|Stats 1
+~~~~~14|Stats|Display
+~~~~~37|Display
+~~~~~82|Stats
+#####R=== Character Characteristics ===
+
+Each character has four primary attributes -- gender, race, race modifier and
+class -- that are chosen before the character is generated, and all but gender
+stay fixed for the entire life of that character. These attributes have many
+effects, which will be mentioned as they come up. Keep in mind that in the
+current version of ToME, your choice of race may restrict your choice
+of class.
+
+Each character has a few secondary attributes -- height, weight, social class,
+and background history -- which are randomly determined, but which are affected
+by the gender and race of the character. In general, these attributes are only
+used to provide "flavor" to the character, to assist in the role playing, but
+they do have a few minor effects on the game. For example, background history
+affects social class, which affects the amount of money the character will
+start with.
+
+Each character also has six primary "stats": strength (STR), intelligence
+(INT), wisdom (WIS), dexterity (DEX), constitution (CON), and charisma(CHR).
+These stats will increase automatically every 5 levels, until the limit for
+each statistic has been reached or until you reach level 50 (whichever
+comes first.) Note that this automatic gain is given to
+a character only once, so if you restart a character from an old savefile,
+he will be considered a descendant of the original character and will not start
+gaining stats every 5 levels until he reaches the point where the original
+character died.
+
+By default, primary statistics are represented in a linear way rather than a
+percentile way. You can change to percentile via the game option sequence '=',
+'5' (ToME options), arrow down to 'stats are represented in a linear way', and
+type 'n' for no. Don't forget to save your options when you are done.
+
+These stats modify the abilities of the character in a variety of ways. Every
+stat has a numerical value, ranging from a minimum of 3, up to a normal maximum
+of 18, and even higher, into the "percentile" range, represented as "18/01"
+through "18/100". Actually, every stat can be raised even above 18/100 by
+magical means, up to a pure maximum of 18/220, which is represented as
+"18/***". Traditionally, a percentile stat such as "18/50" has been though of
+as representing a value part way between 18 and 19, and this is one way to
+think of them. However, often, the best way to view the "bonus" values after
+the "18/" is as "tenth" points, since it often takes the same magic to raise a
+stat from, say, 4 to 5, or 16 to 17, as it does from, say, 18/40 to 18/50. The
+important thing to remember is that almost all internal calculations "ignore"
+the final digit of any "bonus", so that, for example, "18/40" and "18/49"
+generally have the same effects. During character generation, each stat is
+rolled out as a number from 8 to 17, with a normal (bell-curve) distribution,
+and is then immediately modified based on the race and class of the character.
+
+Each character also has several primary "skills" -- disarming, magic devices,
+saving throws, stealth, searching ability, searching frequency, fighting skill,
+and shooting skill -- which are derived from the character's race, class, level,
+stats, and current equipment. These skills have rather obvious effects, but
+will be described more completely below.
+
+Each character may have one or more "intrinsic racial skills", based on
+the race of the character. These may include special resistances, abilities
+such as infravision, or even activatable powers such as food creation.
+~~~~~16|Gold
+~~~~~81|Abbreviations
+~~~~~17|Abbreviations|AU
+~~~~~18|Money
+Money in ToME is referred to in gold pieces, also frequently abbreviated as AU
+(the chemical symbol for gold).
+
+Each character starts with some gold, which can be used to buy items from the
+shops in town. Additionally, gold can be obtained by several means:
+
+ * selling items you have, or find, to the shops
+ * taking it from dead monsters
+ * finding it lying around on the floor in the dungeon
+ * digging it out of the walls in certain dungeons
+
+Each character starts out with some gold. The amount you start with is based on
+social class (higher is better), charisma (higher is better), and some other
+stats (less powerful characters start with more gold).
+~~~~~85|Inventory - starting info
+Inventory is what you are carrying and/or wearing at the moment. All items you
+carry/wear have a certain weight. If the weight is very heavy for your
+strength, it can slow you down, and that is not a good thing for your
+character's continuing health. When your character is first created, all items
+you are granted upon creation will be in your inventory. Sometimes starting
+inventory includes something other than a weapon or armor (for example, a light
+source, scroll, potion, or food.)
+~~~~~86|Weapons - starting info
+Some characters start with a weapon. If yours does, you will need to 'w'ield it
+in order to gain its attack capabilities.
+~~~~~23|Character|Armor Class
+~~~~~19|Armor|Armor Class
+~~~~~20|Abbreviations|AC
+#####R === Armour Class ===
+Each character has an armor class, representing how well the character can
+avoid damage. The armor class is affected by dexterity, the equipment, and
+sometimes the race. The higher the AC, the better.
+
+The numbers following a piece of armor's name indicate how good it is. A Metal
+Cap [3,+0] is not as good as an Iron Helm [5,+0], AC-wise, since the 5 is a
+bigger number than the 3. On the other hand, an Iron Helm is heavier than a
+Metal Cap, and that may make a difference to you.
+
+The plusses following the first number (e.g. the +0) indicate a magical bonus.
+If the plus number is more than zero, it should be added on to the base
+number. E.g. a Metal Cap [3,+3] has a higher AC than an Iron Helm [5,+0].
+
+Some characters start with armor. If yours does, you need will need to 'w'ield
+it in order to gain its protection.
+~~~~~21|Abbreviations|HP
+~~~~~22|Character|Hit Points
+Each character has hit points (HP), representing how much damage the character
+can sustain before death. Hit points are derived from your race, class,
+level, and constitution, and can be temporarily boosted by magical means.
+Hit points may be regained by resting, or by a variety of magical means.
+~~~~~24|Abbreviations|SN
+~~~~~25|Character|Sanity Points
+Each character has sanity points (SN), representing how much mental damage the
+character can sustain before death. Sanity points are derived from your wisdom
+and character level. Sanity points may only be regained by magical means and
+won't be regained by resting.
+~~~~~26|Abbreviations|SP
+~~~~~27|Magic|Mana
+~~~~~28|Character|Mana
+Each character has a certain amount of mana. The amount of mana represents how
+many spells of a certain difficulty a character can cast. When a spell is
+cast, you lose amount of mana corresponding to the 'cost' of the spell.
+
+When all mana is gone, or the cost of a given spell is greater than the amount
+of mana you have left, you may attempt to cast a spell; beware, as there are
+consequences to such a rash act.
+
+Spell points may be regained by resting. They can also be restored by a few
+magical means.
+
+Your spell points are derived from your Magic skill, player level and the
+greatest of INT and WIS.
+
+Your total spell points are additionally affected by:
+
+ * your character's race modifier
+ * character class
+
+Your total spell points may be affected by:
+
+ * your encumbrance
+ * what you wear
+
+~~~~~29|Abbreviations|Pt
+~~~~~30|Gods|Piety
+~~~~~31|Character|Piety
+Finally, characters that have chosen to follow a *****gods.txt*0[God] will have piety points
+(Pt). These points represent the character's standing with their God, a
+standing which may rise or fall over time. A character may spend piety points
+to cast a spell granted by his/her God. Spent piety points can be regained in
+different fashions, depending on which God is involved -- each is pleased or
+displeased by assorted actions. Pleasing your God gains you piety, while
+displeasing your god will lose you piety.
+
+In addition to forming the basis for God-granted spells, accumulated piety
+points may also confer various benefits or penalties upon your character,
+depending on the God involved. For example, followers of Eru who have
+accmulated lots of piety points gain a WIS bonus. The actual rules are
+quite specific to each God.
+~~~~~03|Races
+#####R=== Races ===
+
+There are lots different races that you can choose from in ToME. Some
+races are restricted as to what profession they may be, and each race has
+its own adjustments to a character's stats and abilities. Most races also
+have intrinsic abilities, which can be accessed via the "U" command (original
+keyset, or "O" in the roguelike keyset).
+
+ *****r_beorn.txt*0[Beorning] *****r_hafelf.txt*0[Half-Elf] *****r_orc.txt*0[Orc]
+ *****r_drkelf.txt*0[Dark Elf] *****r_hafogr.txt*0[Half-Ogre] *****r_pettyd.txt*0[Petty-Dwarf]
+ *****r_dragon.txt*0[Dragon] *****r_hielf.txt*0[High-Elf] *****r_rohank.txt*0[Rohan Knight]
+ *****r_dunad.txt*0[Dunadan] *****r_hobbit.txt*0[Hobbit] *****r_eagle.txt*0[Eagle]
+ *****r_dwarf.txt*0[Dwarf] *****r_human.txt*0[Human] *****r_troll.txt*0[Troll]
+ *****r_elf.txt*0[Elf] *****r_druadan.txt*0[Druadan] *****r_wodelf.txt*0[Wood Elf]
+ *****r_ent.txt*0[Ent] *****r_maia.txt*0[Maia] *****r_yeek.txt*0[Yeek]
+ *****r_gnome.txt*0[Gnome] *****r_demon.txt*0[Demon]
+~~~~~04|Race Modifiers
+#####R=== Race Modifiers ===
+There are many different race modifiers from which you can choose in ToME.
+Some are restricted as to what race they can be used with, and each one has
+its own adjustments to a character's stats and abilities. Most also have
+intrinsic abilities. If you are not asked for a race modifier, it is because
+your race only supports the classical form.
+
+ *****rm_class.txt*0[Classical] *****rm_barb.txt*0[Barbarian]
+ *****rm_herm.txt*0[Hermit] *****rm_lsoul.txt*0[Lost Soul]
+ *****rm_skel.txt*0[Skeleton] *****rm_spec.txt*0[Spectre]
+ *****rm_zomb.txt*0[Zombie] *****rm_vamp.txt*0[Vampire]
+
+Dragon subraces:
+
+ *****rm_red.txt*0[Red] *****rm_blue.txt*0[Blue]
+ *****rm_black.txt*0[Black] *****rm_white.txt*0[White]
+ *****rm_green.txt*0[Green] *****rm_ether.txt*0[Ethereal]
+
+Demon subraces:
+
+ *****rm_narrog.txt*0[Narrog] *****rm_drarog.txt*0[Draugrog]
+ *****rm_aewrog.txt*0[Aewrog] *****rm_lygrog.txt*0[Lygrog]
+ *****rm_hurog.txt*0[Hurog] *****rm_limrog.txt*0[Limrog]
+ *****rm_sarnrog.txt*0[Sarnrog] *****rm_rawrog.txt*0[Rawrog]
+ *****rm_cabrog.txt*0[Caborrog] *****rm_adanrog.txt*0[Adanrog]
+
+~~~~~05|Classes
+#####R=== Classes ===
+
+Once a race has been chosen, you will need to pick a class. Some classes will
+not be available to certain races, for instance, a Troll cannot become a
+Paladin. For the first few adventures it is suggested that you run a warrior
+or rogue. Spell casting generally requires a more experienced player that is
+familiar with survival techniques.
+
+ *****c_archer.txt*0[Archer] *****c_mimic.txt*0[Mimic] *****c_rogue.txt*0[Rogue]
+ *****c_ascet.txt*0[Ascetic] *****c_mindcr.txt*0[Mindcrafter] *****c_runecr.txt*0[Runecrafter]
+ *****c_assass.txt*0[Assassin] *****c_monk.txt*0[Monk] *****c_sorcer.txt*0[Sorceror]
+ *****c_axemas.txt*0[Axemaster] *****c_necro.txt*0[Necromancer] *****c_stonewr.txt*0[Stonewright]
+ *****c_bard.txt*0[Bard] *****c_palad.txt*0[Paladin] *****c_swordm.txt*0[Swordmaster]
+ *****c_clairv.txt*0[Clairvoyant] *****c_peacemag.txt*0[Peace-mage] *****c_symbia.txt*0[Symbiant]
+ *****c_pr_drk.txt*0[Dark-Priest] *****c_polear.txt*0[Polearmmaster] *****c_thaum.txt*0[Thaumaturgist]
+ *****c_demono.txt*0[Demonologist] *****c_posses.txt*0[Possessor] *****c_trapper.txt*0[Trapper]
+ *****c_druid.txt*0[Druid] *****c_pr_eru.txt*0[Priest(Eru)] *****c_unbel.txt*0[Unbeliever]
+ *****c_geoman.txt*0[Geomancer] *****c_pr_mand.txt*0[Priest(Mandos)] *****c_wainrid.txt*0[Wainrider]
+ *****c_hafted.txt*0[Haftedmaster] *****c_pr_man.txt*0[Priest(Manwe)] *****c_warper.txt*0[Warper]
+ *****c_lorema.txt*0[Loremaster] *****c_pr_ulmo.txt*0[Priest(Ulmo)] *****c_warmage.txt*0[War-mage]
+ *****c_mage.txt*0[Mage] *****c_pr_varda.txt*0[Priest(Varda)] *****c_warrio.txt*0[Warrior]
+ *****c_mercen.txt*0[Mercenary] *****c_ranger.txt*0[Ranger]
+
+#####R=== Gods ===
+
+Once a class has been chosen you may be given the option to choose a god. Some
+classes (notably most Priests) will be given a God to worship automatically.
+Some classes are not necessarily suited to following a God, and Gods are not
+recommended for new players. You can also choose your mind about who (if
+anyone) to worship during the game by finding an *****tome_faq.txt*04[altar] of that God.
+
+Read *****gods.txt*0[gods.txt] for a little more information about Gods.
+
+ *****g_eru.txt*0[Eru Iluvatar] *****g_tulkas.txt*0[Tulkas]
+ *****g_manwe.txt*0[Manwe Sulimo] *****g_aule.txt*0[Aule]
+ *****g_varda.txt*0[Varda Elentari] *****g_ulmo.txt*0[Ulmo]
+ *****g_yavann.txt*0[Yavanna Kementari] *****g_mandos.txt*0[Mandos]
+ *****g_melkor.txt*0[Melkor Bauglir]
+
+~~~~~39|Character|Stats 2
+~~~~~06|Stats|Individual explanations
+#####R=== Stats ===
+~~~~~32|Stats|Strength
+~~~~~34|Strength
+#####G Strength (STR)
+ Strength is important in fighting with weapons and in melee
+ combat. A high strength can improve your chances of hitting
+ as well as the amount of damage done with each hit. Char-
+ acters with low strengths may receive penalties. Strength
+ is also useful in tunnelling and in carrying heavy items.
+~~~~~33|Stats|Intelligence
+~~~~~35|Intelligence
+#####G Intelligence (INT)
+ Intelligence affects the spellcasting abilities of mage-like
+ spell schools (whether these spells are learned directly through
+ their associated skills, or indirectly through the Prayer
+ skill), as well as some of the special abilities of various
+ classes (e.g. Symbiants). Intelligence will affect the number
+ of spell points you receive. A high intelligence may also
+ improve your chances of successfully casting a spell. You cannot
+ learn spells if your intelligence is 7 or lower. A good
+ intelligence can also help with using magic devices, picking
+ locks, and disarming traps.
+~~~~~36|Stats|Wisdom
+~~~~~38|Wisdom
+#####G Wisdom (WIS)
+ The primary function of wisdom is to determine the ability
+ of a priest or paladin to use prayers (God-granted spells), just
+ like intelligence affects mage spells. Again, high wisdom will
+ increase the number of spell points you have (even though
+ prayers use piety points), and will improve the chance that a
+ prayer will be successful. A good wisdom can also help to
+ improve your chances of resisting magical spells cast
+ upon you by monsters.
+~~~~~40|Stats|Dexterity
+~~~~~41|Dexterity
+#####G Dexterity (DEX)
+ Dexterity is a combination of agility and quickness. A high
+ dexterity may allow your character to get multiple blows with
+ lighter weapons, thus greatly increasing your kill power, and
+ will increase your chances of hitting with any weapon and
+ dodging blows from enemies. Dexterity is also useful in
+ picking locks, disarming traps, and protecting yourself from
+ some of the thieves that inhabit the dungeons. The unscrupulous
+ adventurer may also find dexterity effective in obtaining items
+ from stores without rendering payment.
+~~~~~42|Stats|Constitution
+~~~~~43|Constitution
+#####G Constitution (CON)
+ Constitution is a character's ability to resist damage to his
+ body, and to recover from damage received. Therefore a
+ character with a high constitution will receive more hit
+ points and also recover them faster while resting.
+~~~~~44|Stats|Charisma
+~~~~~45|Charisma
+#####G Charisma (CHR)
+ Charisma represents a character's personality and physical
+ appearance. A character with a high charisma will receive
+ better prices from store owners, whereas a character with a
+ very low charisma may be robbed blind. A high charisma will
+ also mean more starting money for the character.
+~~~~~07
+~~~~~46|Character|Abilities
+#####R=== Abilities ===
+
+ Characters possess some different abilities which can help them
+ to survive. The starting abilities of a character are based upon
+ race and class. Abilities may be adjusted by high or low stats,
+ and increase with the corresponding *****skills.txt*0[skill] level.
+~~~~~48|Attacking monsters|Fighting ability
+#####G Fighting
+ Fighting is the ability to hit and do damage with weapons or
+ fists. Normally a character gets a single blow from any
+ weapon, but if his dexterity and strength are high enough,
+ he may receive more blows per round with lighter weapons.
+ Strength and dexterity both modify the ability to hit an
+ opponent. This skill increases with the *****skills.txt*02[Weaponmastery] skill
+ and its sub-skills.
+~~~~~50|Attacking monsters|Shooting
+#####G Shooting Ability (Bows/Throw)
+ Using ranged missile weapons (and throwing objects) is
+ included in this skill. Different stats apply to different
+ weapons, but this ability may modify the distance an object
+ is thrown/fired, the amount of damage done, and the ability
+ to hit a creature. This skill increases with the *****skills.txt*08[Archery] skill
+ and its sub-skills.
+~~~~~52|Saving throw
+#####G Saving Throw
+ A Saving Throw is the ability of a character to resist the
+ effects of a spell cast on him by another person/creature.
+ This does not include spells cast on the player by his own
+ stupidity, such as quaffing a nasty potion. This ability
+ increases with the *****skills.txt*38[Spirituality] skill,
+ A high wisdom also increases this ability.
+~~~~~54|Stealth
+#####G Stealth
+ The ability to move silently about is very useful. Charac-
+ ters with good stealth can usually surprise their opponents,
+ gaining the first blow. Also, creatures may fail to notice
+ a stealthy character entirely, allowing a player to avoid
+ certain fights. This skill is based upon race, class and the
+ *****skills.txt*15[Stealth] skill.
+~~~~~56|Disarming traps
+#####G Disarming
+ Disarming is the ability to remove traps (safely), and
+ includes picking locks on traps and doors. A successful
+ disarming will gain the character some experience. A trap
+ must be found before it can be disarmed. Dexterity and
+ intelligence both modify the ability to disarm, and this
+ ability increases with the *****skills.txt*16[Disarming] skill.
+~~~~~58|Magical Devices
+#####G Magic Device
+ Using a magical device such as a wand or staff requires
+ experience and knowledge. Spell users such as magi and
+ priests are therefore much better at using a magical device
+ than say a warrior. This skill is modified by intelligence,
+ and increases with the *****skills.txt*54[Magic-Device] skill.
+~~~~~60|Searching
+~~~~~61|Searching|Searching Frequency - Perception
+~~~~~62|Perception
+#####G Searching Frequency (Perception)
+ Perception is the ability to notice something without
+ actively seeking it out. This skill is based upon race,
+ class and the *****skills.txt*14[Sneakiness] skill.
+~~~~~63|Searching|Searching Ability
+#####G Searching Ability (Searching)
+ To search is to actively look for secret doors, floor traps,
+ and traps on chests. Rogues are the best at searching, but
+ magi, rangers, and priests are also good at it. This skill
+ is based upon race, class and the *****skills.txt*14[Sneakiness] skill.
+~~~~~66|Infra-vision
+#####G Infra-vision
+ Infra-vision is the ability to see heat sources. Since most
+ of the dungeon is cool or cold, infra-vision will not allow
+ the player to see walls and objects. Infra-vision will allow
+ a character to see any warm-blooded creatures up to a cer-
+ tain distance. This ability works equally well with or with
+ out a light source. The majority of ToME's creatures are
+ cold-blooded, and will not be detected unless lit up by a
+ light source. Most non-human races have innate infra-vision
+ ability. Humans can gain infra-vision only through magic
+ enhancement.
+
+~~~~~08|Character|Race and Class Combinations
+~~~~~67|Races|Combinations with class
+~~~~~68|Classes|Combinations with Race
+~~~~~69|Tables
+~~~~~70|Tables|Combinations of Race and Class
+#####R=== Combinations of Race and Class ===
+
+These are the classes that are recommended for different races. You can
+still select a race that is not in the chart, but these combinations are
+either rather poor (like a zombie mage), a concept so silly that they
+are not recommended, or an incredibly unfair combination of race and class.
+If you pick a combination that is not on the chart, don't complain if things
+don't turn out as you expected them to.
+
+#####B Warrior Archer Rogue Mage Priest Loremaster
+#####B
+Beorning Yes No Yes No No Yes
+Dark Elf Yes Yes Yes Yes Yes No
+Dragon No No No Yes Yes Yes
+Dunadan Yes Yes Yes Yes Yes Yes
+Dwarf Yes No No No Yes No
+Elf Yes Yes No Yes Yes Yes
+Ent Yes No No No Yes Yes
+Gnome Yes No Yes Yes No No
+Half-Elf Yes Yes Yes Yes Yes Yes
+Half-Ogre Yes No No No Yes No
+High-Elf Yes Yes No Yes Yes Yes
+Hobbit Yes Yes Yes Yes No Yes
+Human Yes Yes Yes Yes Yes Yes
+Druadan Yes Yes Yes No No Yes
+Maia Yes Yes Yes Yes Yes Yes
+Orc Yes Yes Yes No Yes No
+Petty Dwarf Yes No Yes No No No
+RohanKnight Yes No No No Yes No
+Eagle No No No Yes Yes Yes
+Troll Yes No No No No No
+Wood Elf Yes Yes No Yes Yes Yes
+Yeek Yes Yes Yes Yes Yes Yes
+Easterling Yes Yes No No No No
+Demon Yes Yes Yes Yes Yes Yes
+
+~~~~~09|Character|Stat Bonus Table
+~~~~~71|Stats|Bonus table
+~~~~~72|Tables|Stat bonuses
+#####R=== Stat Bonus Tables ===
+
+Stat, hit dice, and experience points per level modifications due to race
+are listed in the following table.
+~~~~~75|Races|Stat Bonuses
+#####GRaces:
+#####B STR INT WIS DEX CON CHR Hit Dice Rqd Exp/level
+ Beorning +4 -2 -2 -1 +3 -5 12 +50%
+ Dark Elf -1 +3 +2 +2 -2 +1 9 +50%
+ Dragon +3 +2 +2 -2 +2 -5 9 +150%
+ Dunadan +1 +2 +2 +2 +3 +2 10 +80%
+ Dwarf +2 -2 +2 -2 +2 -3 11 +25%
+ Elf -1 +2 +2 +1 -2 +2 8 +20%
+ Ent +10 -3 +2 -5 +11 -3 14 +110%
+ Gnome -1 +2 0 +2 +1 -2 8 +35%
+ Half-Elf 0 +1 +1 +1 -1 +1 9 +10%
+ Half-Ogre +3 -1 -1 -1 +3 -3 12 +30%
+ High-Elf +1 +3 +2 +3 +1 +5 10 +100%
+ Hobbit -2 +2 +1 +3 +2 +1 7 +10%
+ Human 0 0 0 0 0 0 10 +0%
+ Druadan -2 -3 +2 +3 +2 -2 9 +15%
+ Maia 0 0 0 0 0 0 10 +0%
+ Petty Dwarf +1 -1 +2 0 +2 -4 11 +35%
+ Orc +2 -1 0 +1 +1 -4 10 +10%
+ RohanKnight +4 -2 +3 +1 +4 +2 10 +120%
+ Eagle +6 +2 +1 -2 +3 +6 12 +200%
+ Troll +4 -4 -2 -4 +3 -6 12 +37%
+ Wood Elf +2 +2 -3 +5 0 +1 7 +30%
+ Yeek -5 -5 -5 -5 -5 -5 6 -75%
+ Easterling +2 -2 -2 -2 +2 -1 10 +40%
+ Demon 0 0 0 0 0 -1 10 +70%
+~~~~~76|Race Modifiers|Stat Bonuses
+#####GRace Modifiers:
+#####B STR INT WIS DEX CON CHR Hit Dice Rqd Exp/level
+ Classical 0 0 0 0 0 0 +0 +0%
+ Barbarian +2 -3 -2 +1 +1 -3 +1 +25%
+ Hermit -3 +1 +1 -3 -3 +1 -3 +20%
+ Lost Soul 0 0 0 0 0 0 +0 +0%
+ Skeleton 0 -2 -2 0 +1 -4 +0 +45%
+ Spectre -5 +1 +1 +2 -3 -6 -4 +80%
+ Vampire +3 +2 -3 -2 +1 -4 +1 +100%
+ Zombie +2 -6 -6 +1 +4 -5 +3 +45%
+
+
+#####R Dragons:
+ Red +3 0 0 0 0 0 +0 +0%
+ Black 0 0 0 0 0 +3 +0 +0%
+ Green 0 0 0 0 +3 0 +0 +0%
+ Blue 0 0 0 +3 0 0 +0 +0%
+ White 0 +3 0 0 0 0 +0 +0%
+ Ethereal 0 0 +3 0 0 0 +0 +0%
+
+#####R Demons:
+ (Narrog) -1 +1 +1 +1 -1 -2 +1 +20%
+ (Aewrog) -2 0 0 0 +3 0 +1 +0%
+ (Hurog) 0 0 0 0 0 -1 +0 -10%
+ (Sarnrog) +2 -1 -2 -2 +2 -1 +2 +20%
+ (Caborrog) -1 +2 +1 0 0 -3 +2 +10%
+ (Draugrog) +1 +1 +1 +1 +1 -1 +0 -20%
+ (Lygrog) -3 +5 +5 +5 -1 -6 +2 +40%
+ (Limrog) -2 +1 +1 +3 -1 -1 +1 +50%
+ (Rawrog) +2 +1 +1 -1 +2 +1 +2 +30%
+ (Adanrog) +1 +1 +1 +1 +1 +1 +3 +50%
+
+~~~~~77|Classes|Stat Bonuses
+#####GClasses:
+#####B STR INT WIS DEX CON CHR
+ Axemaster +5 -2 -2 +2 +2 -1
+ Demonologist +5 -2 -2 +2 +2 -1
+ Haftedmaster +5 -2 -2 +2 +2 -1
+ Polearmmaster +5 -2 -2 +2 +2 -1
+ Swordmaster +5 -2 -2 +2 +2 -1
+ Unbeliever +5 -2 -2 +2 +2 -1
+ Warrior +5 -2 -2 +2 +2 -1
+ Wainrider +5 -2 -2 +2 +2 -1
+
+ Clairvoyant -5 +3 0 +1 -2 +1
+ Geomancer -5 +3 0 +1 -2 +1
+ Mage -5 +3 0 +1 -2 +1
+ Necromancer -5 +3 0 +1 -2 +1
+ Runecrafter -5 +3 0 +1 -2 +1
+ Sorceror -5 +3 0 +1 -2 +1
+ Thaumaturgist -5 +3 0 +1 -2 +1
+ Warper -5 +3 0 +1 -2 +1
+
+ Archer +2 +1 0 +2 +1 +1
+ Ranger +2 +2 0 +2 +1 +1
+ Sniper +2 +2 0 +2 +1 +1
+
+ Assassin +2 +1 -2 +3 +1 -1
+ Rogue +2 +1 -2 +3 +1 -1
+ Mercenary +2 +1 -2 +3 +1 -1
+
+ Ascetic +1 -2 +1 +1 0 +1
+ Bard +1 -2 +1 +1 0 +1
+ Loremaster +1 -2 +1 +1 0 +1
+ Mimic +1 -2 +1 +1 0 +1
+ Monk +1 -2 +1 +1 0 +1
+ Possessor +1 -2 +1 +1 0 +1
+ Summoner +1 -2 +1 +1 0 +1
+ Symbiant +1 -2 +1 +1 0 +1
+
+ Dark-Priest -1 -3 +3 -1 0 +2
+ Druid -1 -3 +3 -1 0 +2
+ Mindcrafter -1 -3 +3 -1 0 +2
+ Paladin -1 -3 +3 -1 0 +2
+ Priest(Eru) -1 -3 +3 -1 0 +2
+ Priest(Mandos)-1 -3 +3 -1 0 +2
+ Priest(Manwe) -1 -3 +3 -1 0 +2
+ Priest(Ulmo) -1 -3 +3 -1 0 +2
+ Priest(Varda) -1 -3 +3 -1 0 +2
+ Stonewright -1 -3 +3 -1 0 +2
+
+ Trapper 0 +2 +2 +2 0 +4
+ Peace-mage 0 +2 +2 +2 0 +4
+
+
+~~~~~10|Character|Ability tables
+~~~~~74|Tables|Ability Tables
+#####R=== Ability Tables ===
+
+~~~~~78|Races|Ability table
+#####GRaces:
+#####B Dsrm Dvce Save Stlh Srch Prcp HtH Misl Infra
+ Beorning -6 -8 -6 -2 -1 +5 +25 +5 30 feet
+ Dark Elf +5 +15 +20 +3 +8 +12 -5 +10 50 feet
+ Dragon +5 +5 +5 -10 +5 +5 +5 -20 50 feet
+ Dunadan +4 +5 +5 +2 +3 +13 +15 +10 None
+ Dwarf +2 +9 +10 -1 +7 +10 +15 +0 50 feet
+ Elf +5 +6 +6 +2 +8 +12 -5 +15 30 feet
+ Ent +5 +5 +20 -6 +5 +4 +15 +5 50 feet
+ Gnome +10 +12 +12 +3 +6 +13 -8 +12 40 feet
+ Half-Elf +2 +3 +3 +1 +6 +11 -1 +5 20 feet
+ Half-Ogre -3 -5 -5 -2 -1 +5 +20 +0 30 feet
+ High-Elf +4 +20 +20 +4 +3 +14 +10 +25 40 feet
+ Hobbit +15 +18 +18 +5 +12 +15 -10 +20 40 feet
+ Human +0 +0 +0 +0 +0 +10 +0 +0 None
+ Druadan +5 +0 +0 +5 +15 +15 +0 +5 30 feet
+ Maia +0 +0 +0 +0 +0 +10 +0 +0 None
+ Orc -3 -3 -3 -1 +0 +7 +12 -5 30 feet
+ Petty Dwarf +3 +5 +10 +1 +5 +10 +9 +0 50 feet
+ RohanKnight +10 +5 +5 -8 +1 +1 +5 +5 None
+ Eagle +6 0 +10 -16 +30 +10 + 0 +0 50 feet
+ Troll -5 -8 -8 -2 -1 +5 +20 -10 30 feet
+ Wood Elf +5 +6 +6 +5 +8 +12 -5 +40 40 feet
+ Yeek -5 -5 -10 +0 -5 +0 -10 -10 20 feet
+ Easterling +0 -5 -1 +0 +0 +10 +5 +5 None
+ Demon +0 +0 +0 +0 +0 +0 +0 +0 30 feet
+~~~~~79|Race Modifiers|Ability table
+#####GRace Modifiers:
+#####B Dsrm Dvce Save Stlh Srch Prcp HtH Misl Infra
+ Classical +0 +0 +0 +0 +0 +0 +0 +0 +0 feet
+ Barbarian -2 -10 +2 -2 +0 +1 +12 +5 +0 feet
+ Hermit +5 +10 +5 +3 +4 +10 -5 -5 +10 feet
+ Lost Soul +0 +0 +0 +0 +0 +0 +0 +0 +0 feet
+ Skeleton -5 -5 +5 -1 -1 +8 +8 +0 +10 feet
+ Spectre +2 +8 +7 +2 +2 +7 -5 -2 +30 feet
+ Vampire +0 +0 +0 +0 +0 +0 +0 +0 +0 feet
+ Zombie -2 -2 +5 -1 -1 +2 +5 +0 +10 feet
+
+#####R Dragons:
+ Red +0 +0 +0 -2 +2 +0 +5 +0 +10 feet
+ Black +2 +0 +1 +0 +0 +0 +0 +0 +0 feet
+ Green +0 +0 +2 +0 +0 +0 +0 +0 +0 feet
+ Blue +3 +0 +2 +1 +0 +0 +0 +0 +10 feet
+ White +0 +2 +0 +0 +0 +0 +0 +0 +0 feet
+ Ethereal +0 +0 +1 +5 +2 +2 +0 +0 +30 feet
+
+#####R Demons:
+ (Narrog) +2 +0 +1 +2 +2 +20 +0 +0 +10 feet
+ (Aewrog) +0 +0 +1 -2 +0 +10 +0 +0 +10 feet
+ (Hurog) +2 +0 +2 +0 +5 +30 +0 +0 +20 feet
+ (Sarnrog) -1 +0 +0 -8 -2 -10 +5 +0 +0 feet
+ (Caborrog) +0 +0 +1 -10 +2 +10 +0 +0 +0 feet
+ (Draugrog) +2 +0 +2 -20 +5 +30 +0 +0 +20 feet
+ (Lygrog) +5 +5 +5 +10 +5 +50 +0 +0 +30 feet
+ (Limrog) +2 +2 +2 +2 +2 +30 +0 +0 +20 feet
+ (Rawrog) +0 +0 +4 -3 +0 +10 +10 +10 +0 feet
+ (Adanrog) +1 +1 +1 +1 +1 +20 +15 +10 +20 feet \ No newline at end of file
diff --git a/lib/mods/theme/help/c_alchem.txt b/lib/mods/theme/help/c_alchem.txt
new file mode 100644
index 00000000..2f7cd58c
--- /dev/null
+++ b/lib/mods/theme/help/c_alchem.txt
@@ -0,0 +1,135 @@
+|||||oy
+~~~~~01|Alchemist
+~~~~~02|Classes|Alchemist
+#####R=== Alchemists ===
+
+#####GDescription
+Alchemists are the only class that can harness the abilities of the
+essences found in the dungeon. They can add these essences to staves,
+rings, wands, rods, and sometimes weapons and armour to create new items
+or recharge old ones. They can also extract essences from magical items
+they find. Using these abilities, Alchemists can get very good items at
+low levels. The trouble is getting them to survive later on.
+
+Alchemists are extremely proficient with all kinds of magical devices,
+and have made a fine art of extracting, storing, and using these
+objects' magical energies. Because they neither fight well nor cast
+powerful spells, Alchemists rely on their craftsmanship to cope with
+the dangers of the dungeons. They will quickly learn to create damage-
+dealing wands, rods, and staffs, forge powerful weapons and armour,
+make highly useful objects of other kinds, and eventually, at great cost
+to other knowledge, they can learn the perilous art of artifact creation
+itself.
+
+#####GStarting Stat Modifiers
+Strength -5
+Intelligence +3
+Wisdom +0
+Dexterity +1
+Constitution -2
+Charisma +1
+Hit Die +d0
+Spell Points +0%
+Exp Penalty 30%
+
+#####GStarting Skills:
+#####BSkill Start Level Skill Point Gains
+Combat 1.000 [0.700]
+ Weaponmastery 0.700 [0.700]
+Sneakiness 1.000 [0.900]
+ Stealth 0.000 [0.400]
+Magic 3.000 [0.900]
+ Magic-Device 1.000 [1.250]
+ Geomancy
+ Fire 0.000 [0.100]
+ Water 0.000 [0.100]
+ Air 0.000 [0.100]
+ Earth 0.000 [0.100]
+ Meta 0.000 [0.500]
+ Conveyance 0.000 [0.100]
+ Divination 0.000 [0.500]
+ Temporal 0.000 [0.100]
+ Mind 0.000 [0.100]
+ Nature 0.000 [0.100]
+ Necromancy 0.000 [0.100]
+ Runecraft 0.000 [0.700]
+ Thaumaturgy 0.000 [0.100]
+ Alchemy 1.000 [0.800]
+Spirituality 1.000 [0.800]
+ Prayer 0.000 [0.500]
+Monster-lore 0.000 [0.500]
+
+*An Alchemist cannot learn the Geomancy skill, but it is shown in his skill
+screen because the elemental schools are sub-skills of it.
+
+#####GInnate Abilities:
+#####BAbility Character level
+Perfect casting 1
+
+#####GStarting Equipment
+An Alchemist begins the game with:
+ a Dagger
+ six Essences of Explosion
+ an Empty Bottle
+ a Set of Leather Gloves
+~~~~~03|Alchemist|Alchemy powers explained
+~~~~~05|Skills|Alchemy - Alchemy powers
+#####GAlchemy
+[[[[[BThe alchemical techniques are accessed using the 'm' key.]
+Alchemists may then 'E'xtract essences or add 'P'owers. The Alchemist [[[[[vmust]
+be wearing GLOVES to use their alchemy powers.
+
+An Alchemist is also capable of [[[[[Bcreating their own artifacts], but
+this is a time-consuming, and costly, activity. To do so, he must first
+learn the ability *****ability.txt*09[Artifact Creation], which costs a whopping 70 skill points
+to learn, and requires some high pre-requisites. Once he has done so,
+he needs to imbue an ego item with a number of essences of magic (equal
+to their skill level) and then wield the item. While using the item,
+it will gain experience (which reduces the amount of exp the wearer
+gains during this time). When the Alchemist feels that the item is
+powerful enough, he can finalise the artifact by "buying" powers using
+the experience the artifact has collected. He will also require exotic
+ingredients to add the abilities.
+
+Most (but not all) potions, scrolls, wands, staffs, rods, rings, and
+amulets contain usable magical energies. An Alchemist taps that
+energy, using the technique "'E'xtract essences" to create one or more
+essences of a type appropriate to the original object.
+
+The drained object itself is now called "of nothing". Unlike any
+other kind of object, it can have new magics added to it.
+
+An Alchemist can add power to such items by using essences he made or
+found. He does this with the technique "'P'ower". He can then select
+the object he wishes to enchant, and the kind of object he wishes to
+create. Only object types for which he knows the recipe will be displayed,
+and ones for which essences are lacking will be displayed in red. Objects
+whose level exceeds his own are sometimes difficult to create, though
+he can always add gold to improve the chances of his success.
+
+[[[[[BA few pointers:]
+ -Recipes are (usually) logical. Acid essences don't make Dragon
+ Weapons. And you can always look at the recipes you know with
+ the "recipe 'B'ook" command.
+ -Not all objects or ego-item types can be made using alchemy.
+ -Alchemy is mostly reversible. Most items that you can
+ 'E'xtract from, you can later re-create, if you learn about
+ them when extracting from them. You won't always get enough
+ essences from destroying an item to recreate it, though the
+ chance of doing so will get higher as you increase in skill.
+ -*Identifying* an object that you can destroy will always teach
+ you how to create it (if creating it is possible).
+ -Since you can't create abilities in artifacts that you aren't
+ aware of, make sure to *identify* all the artifacts you can.
+ -You can't *identify* things you buy in shops, so you'll have
+ to extract from them and take your chances.
+
+[[[[[BSome Recipes:]
+Any Alchemist worth his salt knows lots of recipes. By extracting from
+items in the dungeon, he learns to create more and more items. You can
+see the recipes you know using the "recipe 'B'ook" command. The Alchemist
+starts off knowing some basic recipes, and gains more recipes as time
+goes on.
+
+More details can be found in the *****essences.txt*0[Essences SPOILER]).
+
diff --git a/lib/mods/theme/help/c_archer.txt b/lib/mods/theme/help/c_archer.txt
new file mode 100644
index 00000000..a115e6f2
--- /dev/null
+++ b/lib/mods/theme/help/c_archer.txt
@@ -0,0 +1,68 @@
+~~~~~01|Archer
+~~~~~02|Classes|Archer
+#####R=== Archers ===
+
+#####GDescription
+Archers are to bows what warriors are to melee. They are the best class
+around with any bow/crossbow/sling/boomerang.
+
+Needing a lot of ammo, they will learn early how to make it from junk found
+in the dungeons. They also gain, at skill level 20, the unique ability to make
+their arrows/bolts/shots pierce through monsters!
+
+#####GStarting Stat Modifiers
+Strength +2
+Intelligence +1
+Wisdom +0
+Dexterity +2
+Constitution +1
+Charisma +1
+Hit Die +d4
+Spell Points +0%
+Exp Penalty 30%
+
+#####GStarting Skills:
+#####BSkill Start Level Skill Point Gains
+Combat 1.000 [0.800]
+ Weaponmastery 1.000 [0.500]
+ Archery 1.000 [0.850]
+ Sling-mastery 0.000 [0.500]
+ Bow-mastery 0.000 [0.500]
+ Crossbow-mastery 0.000 [0.500]
+ Boomerang-mastery 0.000 [0.500]
+Sneakiness 1.000 [0.900]
+ Stealth 0.000 [0.400]
+ Disarming 1.000 [0.900]
+Magic 0.000 [0.200]
+ Magic-Device 1.000 [1.100]
+Spirituality 1.000 [0.400]
+ Prayer 0.000 [0.500]
+Monster-lore 0.000 [0.500]
+
+#####GInnate Abilities:
+#####BAbility Character level
+Ammo creation 2
+
+#####GStarting Equipment
+An Archer begins the game with:
+ a Short Bow
+ a Sling
+ some ammo
+~~~~~03|Creating Ammo
+#####GCreating Ammo
+Archers automatically gain the *****ability.txt*07[Ammo Creation] ability when they reach character
+level 2. (Other classes can purchase this ability when they have enough skill
+points.) This ability is accessed via the 'm' command. The first type of
+ammo you can make is sling ammo (pebbles or shots); as you increase in skill
+you'll be able to make other arrows (bow ammo) or bolts (crossbow ammo).
+
+Shots (or other sling ammo) are created from rubble piles found in the dungeons
+and other places. To make shots, stand next to a rubble pile, activate the
+ammo creation ability from the 'm' menu, select 's'hots, then specify the
+direction to the rubble pile, which will be consumed during the ammo creation.
+Arrows or bolts are made from "junk" items ('~' symbol, such as shards of
+pottery) that you can find in the dungeons and other places. To make arrows or
+bolts, assuming you have sufficient Archery skill, you must have the junk item
+in your inventory or on the ground at your feet. Specify the junk item after
+selecting 'a'rrows or 'b'olts from the ammo creation menu, and it will be
+consumed and replaced with a stack of ammo.
diff --git a/lib/mods/theme/help/c_ascet.txt b/lib/mods/theme/help/c_ascet.txt
new file mode 100644
index 00000000..cc2a2ab4
--- /dev/null
+++ b/lib/mods/theme/help/c_ascet.txt
@@ -0,0 +1,46 @@
+~~~~~01|Ascetic
+~~~~~02|Classes|Ascetic
+#####R=== Ascetics ===
+
+#####GDescription
+An Ascetic is a monk who has forsaken all worldly
+things, including deity worship and magic. Ascetics
+must survive by their fists and their natural
+ability to resist magic. Despite not worshipping any
+gods, Ascetics are highly spiritual, and can achieve
+excellent saving throws in addition to their magic-
+repelling abilities.
+
+#####GStarting Stat Modifiers
+Strength +1
+Intelligence -2
+Wisdom +1
+Dexterity +1
+Constitution +0
+Charisma +1
+Bonus Blows 0
+Hit Die +d8
+Exp Penalty 40%
+
+#####GStarting Skills:
+#####BSkill Start Level Skill Point Gains
+Combat 1.000 [0.900]
+ Archery 1.000 [0.700]
+ Barehand-combat 1.000 [0.900]
+ Antimagic 1.000 [1.000]
+Sneakiness 1.000 [0.700]
+ Stealth 1.000 [1.000]
+ Disarming 1.000 [0.900]
+ Dodging 0.000 [1.000]
+Spirituality 1.000 [0.700]
+Monster-lore 1.000 [1.100]
+ Corpse-preservation 1.000 [0.700]
+
+#####GStarting Equipment
+An ascetic begins the game with:
+ a potion of healing
+
+#####GInnate Abilities:
+#####BAbility Character level
+Extra Max Blow(1) 1
+Extra Max Blow(1) 5 \ No newline at end of file
diff --git a/lib/mods/theme/help/c_assass.txt b/lib/mods/theme/help/c_assass.txt
new file mode 100644
index 00000000..4269e3e8
--- /dev/null
+++ b/lib/mods/theme/help/c_assass.txt
@@ -0,0 +1,58 @@
+~~~~~01|Assassin
+~~~~~02|Classes|Assassin
+#####R=== Assassins ===
+#####GDescription
+Assassins are similar to Rogues, but have trained their combat abilities more
+extensively by neglecting the study of magic. They also tend to be more stealthy
+and careful in their dungeon exploration, but aren't so good at stealing,
+trapping and disarming as their more "peaceful" counterparts.
+
+Assassins have access to the schools of *****m_convey.txt*0[Conveyance], *****m_divin.txt*0[Divination] and *****m_tempo.txt*0[Temporal] magic.
+
+#####GStarting Stat Modifiers
+Strength +2
+Intelligence +1
+Wisdom -2
+Dexterity +3
+Constitution +1
+Charisma -1
+Hit Die +d6
+Spell Points +0%
+Exp Penalty 25%
+
+#####GStarting Skills
+#####BSkill Start Level Skill Point Gains
+Combat 1.000 [0.800]
+ Weaponmastery 1.000 [0.800]
+ Sword-mastery 1.000 [0.600]
+ Critical-hits 2.000 [0.800]
+ Archery
+ Boomerang-mastery 1.000 [0.300]
+Sneakiness 1.000 [2.000]
+ Stealth 1.000 [2.000]
+ Disarming 1.000 [1.000]
+ Backstab 1.000 [2.000]
+ Stealing 1.000 [0.200]
+ Dodging 1.000 [2.000]
+Magic 1.000 [0.200]
+ Magic-Device 1.000 [0.750]
+ Conveyance 0.000 [0.100]
+ Divination 0.000 [0.100]
+ Temporal 0.000 [0.200]
+Spirituality 1.000 [0.700]
+ Prayer 0.000 [0.500]
+Monster-lore 0.000 [0.500]
+
+*An Assassin cannot learn the Archery skill, but it is shown in his skill
+screen because Boomerang-mastery is a sub-skill of it.
+
+#####GInnate Abilities:
+#####BAbility Character level
+Extra Max Blow(1) 10
+
+#####GStarting Equipment
+An Assassin begins the game with:
+ a Dagger
+
+
+
diff --git a/lib/mods/theme/help/c_axemas.txt b/lib/mods/theme/help/c_axemas.txt
new file mode 100644
index 00000000..cdd6ba88
--- /dev/null
+++ b/lib/mods/theme/help/c_axemas.txt
@@ -0,0 +1,51 @@
+~~~~~01|Axemaster
+~~~~~02|Classes|Axemaster
+#####R=== Axemasters ===
+
+#####GDescription
+The Axemaster is a Warrior who specialises in axes.
+The training is so intense and specific that Axemasters gain huge bonuses
+when fighting with their chosen weapon, dependent on their Axe-mastery skill.
+In most other respects they perform about as well as a generic Warrior.
+
+#####GStarting Stat Modifiers
+Strength +5
+Intelligence -2
+Wisdom -2
+Dexterity +2
+Constitution +2
+Charisma -1
+Hit Die +d9
+Spell Points +0%
+Exp Penalty 0%
+
+#####GStarting Skills:
+#####BSkill Start Level Skill Point Gains
+Combat 2.000 [0.900]
+ Weaponmastery 1.000 [0.950]
+ Sword-mastery 0.000 [0.300]
+ Axe-mastery 1.000 [0.700]
+ Hafted-mastery 0.000 [0.300]
+ Polearm-mastery 0.000 [0.300]
+ Archery 1.000 [0.600]
+ Antimagic 0.000 [0.550]
+Sneakiness 1.000 [0.900]
+ Stealth 0.000 [0.400]
+ Disarming 1.000 [0.900]
+Magic 1.000 [0.300]
+ Magic-Device 1.000 [1.150]
+Spirituality 1.000 [0.400]
+ Prayer 0.000 [0.500]
+Monster-lore 0.000 [0.500]
+
+#####GInnate Abilities:
+#####BAbility Character level
+Extra Max Blow(1) 1
+Extra Max Blow(2) 1
+Spread blows 25
+
+#####GStarting Equipment
+An Axemaster begins the game with:
+ a Ring of Fear Resistance
+ a Chain Mail
+ a Hatchet
diff --git a/lib/mods/theme/help/c_bard.txt b/lib/mods/theme/help/c_bard.txt
new file mode 100644
index 00000000..23ba42ca
--- /dev/null
+++ b/lib/mods/theme/help/c_bard.txt
@@ -0,0 +1,69 @@
+|||||oy
+~~~~~01|Bard
+~~~~~02|Classes|Bard
+#####R=== Bards ===
+
+#####GDescription
+Bards are traditional musicians. Their magical attacks are sound-based, and
+last as long as the Bard has mana. If the Bard runs out of mana, he/she stops
+singing. There is also a low-level "spell" that will cease the song.
+
+While any class can use musical instruments, only Bards can tap the
+power of voice to aid themselves and hinder, dismay, and kill their
+foes.
+
+#####GMagic Usage
+
+Songs are continuous, and the song consumes mana every turn in order to
+maintain itself. The song will continue, once played, until either the 'Stop
+Singing' song is sung, or the player's mana runs out.
+
+Each song has a magic school level associated with, just as any other magic
+spell does. Each song also has a Roman numeral (e.g. I, II, III, IV, V)
+following its name. These numerals correspond to 1, 2, 3, 4, 5. The higher the
+numeral, the more music skill the Bard must have to play that song.
+
+Each musical instrument has a value between 1 and 4 assigned to it, as well.
+The higher the number, the better the craftmanship. A Bard can only play
+higher level songs with a more powerful instrument. You would be able to cast
+"Stop Singing (I)" and "Song of the Sun (I)" with a a Harp (+1). A Harp (+2)
+would allow you to sing those songs, as well as "Flow of Life (II)".
+
+For information on song effects see the *****m_music.txt*0[Music Songs] file.
+
+#####GStarting Stat Modifiers
+Strength +1
+Intelligence -2
+Wisdom +1
+Dexterity +1
+Constitution +0
+Charisma +1
+Hit Die +d8
+Spell Points +0%
+Exp Penalty 40%
+
+#####GStarting Skills:
+#####BSkill Start Level Skill Point Gains
+Combat 1.000 [0.700]
+ Weaponmastery 1.000 [0.700]
+ Barehand-combat 1.000 [0.600]
+Sneakiness 1.000 [0.700]
+ Stealth 1.000 [0.700]
+ Disarming 1.000 [0.600]
+Magic 1.000 [0.600]
+ Magic-Device 1.000 [1.000]
+Spirituality 1.000 [0.800]
+ Prayer 0.000 [0.500]
+ Music 1.000 [0.800]
+Monster-lore 1.000 [1.100]
+ Summoning 0.000 [0.400]
+ Corpse-preservation 1.000 [0.700]
+ Symbiosis 0.000 [0.400]
+ Mimicry 0.000 [0.400]
+
+#####GStarting Equipment
+A Bard begins the game with:
+ a Harp (+1)
+ a Short Sword
+ a Robe
+ a Potion of Healing
diff --git a/lib/mods/theme/help/c_clairv.txt b/lib/mods/theme/help/c_clairv.txt
new file mode 100644
index 00000000..7d537486
--- /dev/null
+++ b/lib/mods/theme/help/c_clairv.txt
@@ -0,0 +1,47 @@
+~~~~~01|Clairvoyant
+~~~~~02|Classes|Clairvoyant
+#####R=== Clairvoyants ===
+
+#####GDescription
+Clairvoyants are masters of the mind, they are
+especially proficient at Mindcraft, Divination,
+and the Mind school of magic. They sacrifice
+breadth of ability for additional favour with
+their deity, so it makes sense to pick a deity
+to worship when playing a clairvoyant character.
+It is not, however, a requirement.
+
+#####GStarting Stat Modifiers
+Strength -5
+Intelligence +3
+Wisdom +0
+Dexterity +1
+Constitution -2
+Charisma +1
+Bonus Blows 0
+Hit Die +d0
+Exp Penalty 30%
+
+#####GStarting Skills:
+#####BSkill Start Level Skill Point Gains
+Combat 1.000 [0.300]
+ Weaponmastery 0.700 [0.500]
+Sneakiness 1.000 [0.900]
+Magic 1.000 [0.900]
+ Magic-Device 1.000 [1.200]
+ Spell-power 0.000 [0.600]
+ Divination 1.000 [1.000]
+ Mind 1.000 [1.000]
+Spirituality 1.000 [1.000]
+ Prayer 0.000 [1.000]
+ Mindcraft 1.000 [0.700]
+Monster-lore 0.000 [0.500]
+
+#####GStarting Equipment
+A clairvoyant begins the game with:
+ A book of Beginner Cantrips
+ A quarterstaff
+
+#####GInnate Abilities:
+#####BAbility Character level
+Perfect casting 1 \ No newline at end of file
diff --git a/lib/mods/theme/help/c_demono.txt b/lib/mods/theme/help/c_demono.txt
new file mode 100644
index 00000000..98b0bc9b
--- /dev/null
+++ b/lib/mods/theme/help/c_demono.txt
@@ -0,0 +1,54 @@
+|||||oy
+~~~~~01|Demonologist
+~~~~~02|Classes|Demonologist
+#####R=== Demonologists ===
+
+#####GDescription
+Masters of the Demons, members of this class can gain tremendous power
+over demonkind, either for good or for evil ends.
+
+Their spells are contained in specific blades, shields and helms (actually
+shaped in the form of horns) which when wielded allow the Demonologist to
+cast spells unique to her class; each piece of equipment holds 3 spells.
+
+See the information on the *****m_demono.txt*0[Demonology] school of magic for more details.
+
+#####GStarting Stat Modifiers
+Strength +5
+Intelligence -2
+Wisdom -2
+Dexterity +2
+Constitution +2
+Charisma -1
+Hit Die +d9
+Spell Points +0%
+Exp Penalty 0%
+
+#####GStarting Skills:
+#####BSkill Start Level Skill Point Gains
+Combat 2.000 [0.750]
+ Weaponmastery 1.000 [0.750]
+ Sword-mastery 0.000 [0.600]
+ Archery 2.000 [0.400]
+Sneakiness 2.000 [1.800]
+ Stealth 0.000 [0.400]
+ Disarming 2.000 [1.800]
+Magic 2.000 [0.700]
+ Magic-Device 1.000 [1.150]
+ Demonology 1.000 [1.000]
+Spirituality 2.000 [0.700]
+ Prayer 0.000 [0.500]
+Monster-lore 0.000 [0.500]
+
+#####GInnate Abilities:
+#####BAbility Character level
+Extra Max Blow(1) 1
+Extra Max Blow(2) 1
+Spread blows 25
+
+#####GStarting Equipment
+A Demonologist begins the game with:
+ a Ring of Fear Resistance
+ a Demonblade
+ a Chain Mail
+
diff --git a/lib/mods/theme/help/c_druid.txt b/lib/mods/theme/help/c_druid.txt
new file mode 100644
index 00000000..0b0493e2
--- /dev/null
+++ b/lib/mods/theme/help/c_druid.txt
@@ -0,0 +1,55 @@
+|||||oy
+~~~~~01|Druid
+~~~~~02|Classes|Druid
+~~~~~03|Yavanna|Druid
+#####R=== Druids ===
+
+#####GDescription
+When Melkor first dug up Utumno and Angband, rivers were polluted and gave
+birth to dark clouds of stinging insects; animals changed into dark, horrible
+horned things and the forests themselves screamed in horror at their corruption.
+
+*****g_yavann.txt*0[Yavanna] heard this scream and gave to some of the children of Eru the strength
+to defend Nature; at first Ents were chosen, but later on other races were
+allowed to tread the path of the Druid.
+
+The embodiment of life itself, a Druid is a true force of nature and nothing
+can prevent him from completing his final quest: returning Angband to the
+grassy sunlit plain it once was.
+
+
+#####GStarting Stat Modifiers
+Strength -1
+Intelligence -3
+Wisdom +3
+Dexterity -1
+Constitution +0
+Charisma +2
+Hit Die +d2
+Spell Points +0%
+Exp Penalty 20%
+
+#####GStarting Skills:
+#####BSkill Start Level Skill Point Gains
+Combat 2.000 [0.700]
+ Weaponmastery 1.000 [0.750]
+Sneakiness 1.000 [0.900]
+ Stealth 0.000 [0.400]
+ Disarming 0.000 [0.900]
+Magic 1.000 [0.900]
+ Magic-Device 1.000 [1.050]
+ Spell-power 0.000 [0.600]
+Spirituality 1.000 [1.000]
+ Prayer 1.000 [1.500]
+ Mindcraft 0.000 [0.600]
+Monster-lore 1.000 [1.200]
+ Summoning 1.000 [0.700]
+
+#####GInnate Abilities:
+#####BAbility Character level
+Perfect casting 1
+
+#####GStarting Equipment
+A Druid begins the game with:
+ a Spellbook of Charm Animal
+ a Mace
diff --git a/lib/mods/theme/help/c_geoman.txt b/lib/mods/theme/help/c_geoman.txt
new file mode 100644
index 00000000..47855875
--- /dev/null
+++ b/lib/mods/theme/help/c_geoman.txt
@@ -0,0 +1,59 @@
+|||||oy
+~~~~~01|Geomancer
+~~~~~02|Classes|Geomancer
+#####R=== Geomancers ===
+
+#####GDescription
+Geomancers harness the power of the elements earth, air, fire and water.
+The level of their *****skills.txt*60[Geomancy] skill gives them access to their own
+*****m_geoman.txt*0[school of Geomancy], but the levels of the Fire, Water, Air, and Earth
+skills will have an effect on the outcome of each spell.
+
+Geomancers need the aid of a Mage Staff in order to use their powers.
+
+#####GStarting Stat Modifiers
+Strength -5
+Intelligence +3
+Wisdom +0
+Dexterity +1
+Constitution -2
+Charisma +1
+Hit Die +d0
+Spell Points +50%
+Exp Penalty 30%
+
+#####GStarting Skills:
+#####BSkill Start Level Skill Point Gains
+Combat 1.000 [0.200]
+ Weaponmastery 0.700 [0.400]
+Sneakiness 1.000 [0.900]
+ Stealth 0.000 [0.400]
+Magic 1.000 [0.900]
+ Magic-Device 1.000 [1.050]
+ Spell-power 1.000 [0.700]
+ Geomancy 1.000 [0.700]
+ Fire 1.000 [1.050]
+ Water 1.000 [1.050]
+ Air 1.000 [1.050]
+ Earth 1.000 [1.050]
+ Meta 0.000 [0.700]
+ Conveyance 0.000 [0.700]
+ Divination 0.000 [0.700]
+ Temporal 0.000 [0.700]
+ Mind 0.000 [0.700]
+ Nature 0.000 [0.700]
+ Necromancy 0.000 [0.700]
+ Runecraft 0.000 [0.700]
+ Thaumaturgy 0.000 [0.700]
+Spirituality 1.000 [0.550]
+ Prayer 0.000 [0.500]
+Monster-lore 0.000 [0.500]
+
+#####GInnate Abilities:
+#####BAbility Character level
+Perfect casting 1
+
+#####GStarting Equipment
+A Geomancer begins the game with:
+ a Spellbook of Geyser
+ a Mage Staff
diff --git a/lib/mods/theme/help/c_hafted.txt b/lib/mods/theme/help/c_hafted.txt
new file mode 100644
index 00000000..7e8a3f89
--- /dev/null
+++ b/lib/mods/theme/help/c_hafted.txt
@@ -0,0 +1,54 @@
+~~~~~01|Haftedmaster
+~~~~~02|Classes|Haftedmaster
+#####R=== Haftedmasters ===
+
+#####GDescription
+The Haftedmaster is a Warrior who specialises in blunt weapons.
+
+The training is so intense and specific that Haftedmasters gain huge bonuses
+when fighting with their chosen weapon, dependent on their *****skills.txt*06[Hafted-mastery] skill.
+
+In most other respects they perform about as well as a generic Warrior.
+
+#####GStarting Stat Modifiers
+Strength +5
+Intelligence -2
+Wisdom -2
+Dexterity +2
+Constitution +2
+Charisma -1
+Hit Die +d9
+Spell Points +0%
+Exp Penalty 0%
+
+#####GStarting Skills:
+#####BSkill Start Level Skill Point Gains
+Combat 2.000 [0.900]
+ Weaponmastery 1.000 [0.950]
+ Sword-mastery 0.000 [0.300]
+ Axe-mastery 0.000 [0.300]
+ Hafted-mastery 1.000 [0.700]
+ Stunning-blows 0.000 [0.500]
+ Polearm-mastery 0.000 [0.300]
+ Archery 1.000 [0.600]
+ Antimagic 0.000 [0.550]
+Sneakiness 1.000 [0.900]
+ Stealth 0.000 [0.400]
+ Disarming 1.000 [0.900]
+Magic 1.000 [0.300]
+ Magic-Device 1.000 [1.150]
+Spirituality 1.000 [0.400]
+ Prayer 0.000 [0.500]
+Monster-lore 0.000 [0.500]
+
+#####GInnate Abilities:
+#####BAbility Character level
+Extra Max Blow(1) 1
+Extra Max Blow(2) 1
+Spread blows 25
+
+#####GStarting Equipment
+An Haftedmaster begins the game with:
+ a Ring of Fear Resistance
+ a Chain Mail
+ a Flail
diff --git a/lib/mods/theme/help/c_lorema.txt b/lib/mods/theme/help/c_lorema.txt
new file mode 100644
index 00000000..35c2093b
--- /dev/null
+++ b/lib/mods/theme/help/c_lorema.txt
@@ -0,0 +1,54 @@
+|||||oy
+~~~~~01|Loremaster
+~~~~~02|Classes|Loremaster
+#####R=== Loremasters ===
+
+#####GDescription
+Loremasters are students of the creatures of Arda.
+
+To protect themselves during their observations, they usually learn how to
+pass unobserved, but should their attempt fail they have decent saving throws
+and almost always learn some kind of combat style, but the exact preference
+varies from Loremaster to Loremaster.
+
+As a result of their studies, they become familiar with a broad range of
+skills, ranging from *****skills.txt*45[Possession] and *****m_symbio.txt*0[Symbiosis] to *****skills.txt*43[Summoning] and *****skills.txt*47[Mimicry].
+
+#####GStarting Stat Modifiers
+Strength +1
+Intelligence -2
+Wisdom +1
+Dexterity +1
+Constitution +0
+Charisma +1
+Hit Die +d8
+Spell Points +0%
+Exp Penalty 40%
+
+#####GStarting Skills:
+#####BSkill Start Level Skill Point Gains
+Combat 1.000 [0.700]
+ Weaponmastery 1.000 [0.700]
+ Archery 1.000 [0.700]
+ Barehand-combat 1.000 [0.700]
+Sneakiness 1.000 [0.700]
+ Stealth 1.000 [0.700]
+ Disarming 1.000 [0.700]
+Magic 0.000 [0.600]
+ Magic-Device 1.000 [1.000]
+Spirituality 1.000 [0.700]
+ Prayer 0.000 [0.500]
+ Music 0.000 [0.300]
+Monster-lore 1.000 [1.100]
+ Summoning 0.000 [0.500]
+ Corpse-preservation 1.000 [0.700]
+ Possession 0.000 [0.500]
+ Symbiosis 0.000 [0.500]
+ Mimicry 0.000 [0.500]
+
+#####GStarting Equipment
+A Loremaster begins the game with:
+ a Sling
+ a Hard Leather Armour
+ a Quarterstaff
+ some Rounded Pebbles
diff --git a/lib/mods/theme/help/c_mage.txt b/lib/mods/theme/help/c_mage.txt
new file mode 100644
index 00000000..949d3bcc
--- /dev/null
+++ b/lib/mods/theme/help/c_mage.txt
@@ -0,0 +1,67 @@
+|||||oy
+~~~~~01|Mage
+~~~~~02|Classes|Mage
+#####R=== Mages ===
+
+#####GDescription
+A Mage must live by his wits. He cannot hope to simply hack his way
+through the dungeon, and so must therefore use his magic to defeat,
+deceive, confuse, and escape. A Mage is not really complete without an
+assortment of magical devices to use in addition to his spells. He can
+master the higher level magical devices easily and has good saving throws.
+
+There is no reason a Mage cannot become a good fighter, but spells are
+his true realm. For more information on magic schools and spell effects see
+the *****magic.txt*01[Magic help file].
+
+#####GStarting Stat Modifiers
+Strength -5
+Intelligence +3
+Wisdom +0
+Dexterity +1
+Constitution -2
+Charisma +1
+Hit Die +d0
+Spell Points +50%
+Exp Penalty 30%
+
+#####GStarting Skills:
+#####BSkill Start Level Skill Point Gains
+Combat 1.000 [0.500]
+ Weaponmastery 0.700 [0.500]
+Sneakiness 1.000 [0.900]
+ Stealth 0.000 [0.400]
+Magic 1.000 [0.900]
+ Magic-Device 1.000 [1.200]
+ Spell-power 0.000 [0.600]
+ Sorcery 0.000 [0.200]
+ Mana 1.000 [0.900]
+ Geomancy
+ Fire 0.000 [0.900]
+ Water 0.000 [0.900]
+ Air 0.000 [0.900]
+ Earth 0.000 [0.900]
+ Meta 0.000 [0.900]
+ Conveyance 0.000 [0.900]
+ Divination 0.000 [0.900]
+ Temporal 0.000 [0.900]
+ Mind 0.000 [0.900]
+ Nature 0.000 [0.900]
+ Necromancy 0.000 [0.700]
+ Runecraft 0.000 [0.700]
+ Thaumaturgy 0.000 [0.700]
+Spirituality 1.000 [0.550]
+ Prayer 0.000 [0.500]
+Monster-lore 0.000 [0.500]
+
+*A Mage cannot learn the Geomancy skill, but it is shown in his skill
+screen because the elemental schools are sub-skills of it.
+
+#####GInnate Abilities:
+#####BAbility Character level
+Perfect casting 1
+
+#####GStarting Equipment
+A Mage begins the game with:
+ a Book of Beginner Cantrips
+ a Dagger
diff --git a/lib/mods/theme/help/c_mercen.txt b/lib/mods/theme/help/c_mercen.txt
new file mode 100644
index 00000000..75129d56
--- /dev/null
+++ b/lib/mods/theme/help/c_mercen.txt
@@ -0,0 +1,49 @@
+~~~~~01|Mercenary
+~~~~~02|Classes|Mercenary
+#####R=== Mercenaries ===
+
+#####GDescription
+Mercenaries are daring swashbucklers, masters of the blade. They
+do not have the magical abilities Rogues have, but they are just
+as stealthy and much deadlier with a light sword. They do gain
+some magical mastery over time, but only in the Temporal school.
+
+#####GStarting Stat Modifiers
+Strength +2
+Intelligence +1
+Wisdom -2
+Dexterity +3
+Constitution +1
+Charisma -1
+Bonus Blows 0
+Hit Die +d6
+Exp Penalty 25%
+
+#####GStarting Skills:
+#####BSkill Start Level Skill Point Gains
+Combat 1.000 [0.700]
+ Weaponmastery 1.000 [0.900]
+ Sword-mastery 1.000 [0.700]
+ Critical-hits 1.000 [0.700]
+Sneakiness 1.000 [2.000]
+ Stealth 1.000 [1.500]
+ Disarming 1.000 [2.000]
+ Backstab 1.000 [1.000]
+ Stealing 1.000 [2.000]
+ Dodging 1.000 [2.000]
+Magic 1.000 [0.700]
+ Magic-Device 1.000 [1.550]
+ Temporal 0.000 [1.000]
+Spirituality 1.000 [0.700]
+ Prayer 0.000 [0.500]
+Monster-lore 0.000 [0.500]
+
+#####GStarting Equipment
+A mercenary begins the game with:
+ a rapier
+ a cloak
+
+#####GInnate Abilities:
+#####BAbility Character level
+Extra-Max-Blow(1) 10
+Extra-Max-Blow(1) 15 \ No newline at end of file
diff --git a/lib/mods/theme/help/c_merch.txt b/lib/mods/theme/help/c_merch.txt
new file mode 100644
index 00000000..31fb60dd
--- /dev/null
+++ b/lib/mods/theme/help/c_merch.txt
@@ -0,0 +1,29 @@
+#####R=== Merchants ===
+
+#####GDescription
+A Merchant is neither a warrior nor a spellcaster. They still have some great
+advantages, they can use chests to warp items into other items, they can
+indentify items, they soon learn to detect all objects in the area, and
+at higher level they can see all monsters carrying objects. They will also
+get the power to appraise items and to turn them into gold. A merchant will
+naturraly get better prices in shops and get access to the merchant guild
+services, loan and item request.
+
+#####GPrimary Stats
+Charisma
+Intelligence (Ability stat)
+
+#####GMagic Usage
+Merchants can use portable holes to carry more stuff than other classes but
+at the cost of an increased weight. To do that they must wear a portable hole
+and use it with 'm'.
+They also can use their merchants abilities and midas touch in the 'U' menu.
+
+#####GStarting Equipment
+A merchant begins the game with:
+ A portable hole
+ A small steel chest containing gold and items
+ A long sword
+ A wand of tame monsters
+
+
diff --git a/lib/mods/theme/help/c_mimic.txt b/lib/mods/theme/help/c_mimic.txt
new file mode 100644
index 00000000..b9378a03
--- /dev/null
+++ b/lib/mods/theme/help/c_mimic.txt
@@ -0,0 +1,53 @@
+~~~~~01|Mimic
+~~~~~02|Classes|Mimic
+#####R=== Mimics ===
+
+#####GDescription
+Mimics possess the ability to transform into various creatures using
+special cloaks. While transformed, they lose their intrinsic abilities,
+and gain those of the creature they have transformed into.
+
+At higher skill levels, Mimics gain additional Mimicry powers which help them
+to further blend in with their surroundings or modify themselves.
+
+See more on *****m_mimic.txt*0[Mimicry powers].
+
+
+#####GStarting Stat Modifiers
+Strength +1
+Intelligence -2
+Wisdom +1
+Dexterity +1
+Constitution +0
+Charisma +1
+Hit Die +d8
+Spell Points +0%
+Exp Penalty 40%
+
+#####GStarting Skills:
+#####BSkill Start Level Skill Point Gains
+Combat 1.000 [0.800]
+ Weaponmastery 1.000 [0.800]
+ Archery 1.000 [0.700]
+ Barehand-combat 1.000 [0.600]
+Sneakiness 1.000 [0.800]
+ Stealth 1.000 [0.800]
+ Disarming 1.000 [0.700]
+Magic 1.000 [0.700]
+ Magic-Device 1.000 [1.000]
+Spirituality 1.000 [0.500]
+ Prayer 0.000 [0.500]
+ Music 0.000 [0.300]
+Monster-lore 1.000 [1.100]
+ Corpse-preservation 1.000 [0.900]
+ Possession 0.000 [0.100]
+ Mimicry 1.000 [0.800]
+
+#####GStarting Equipment
+A Mimic begins the game with:
+ a Mouse Fur
+ a Potion of Healing
+ a Dagger
+
+
+
diff --git a/lib/mods/theme/help/c_mindcr.txt b/lib/mods/theme/help/c_mindcr.txt
new file mode 100644
index 00000000..c4ed2747
--- /dev/null
+++ b/lib/mods/theme/help/c_mindcr.txt
@@ -0,0 +1,57 @@
+|||||oy
+~~~~~01|Mindcrafter
+~~~~~02|Classes|Mindcrafter
+#####R=== Mindcrafters ===
+
+#####GDescription
+The Mindcrafter is a priest who uses the powers of mind instead of magic.
+These abilities vary from simple extrasensory perception to mental domination of
+others. Since these powers are developed by the practice of certain
+disciplines, a Mindcrafter requires no spellbooks to use them.
+The Mindcrafter uses the Mindcraft skill to determine how well she can
+perform these psychic "spells", and available powers are simply determined by
+the skill level. In combat a Mindcrafter is roughly the equivalent of a
+priest.
+
+#####GStarting Stat Modifiers
+Strength -1
+Intelligence -3
+Wisdom +3
+Dexterity -1
+Constitution +0
+Charisma +2
+Hit Die +d2
+Spell Points +0%
+Exp Penalty 20%
+
+#####GStarting Skills:
+#####BSkill Start Level Skill Point Gains
+Combat 2.000 [0.700]
+ Weaponmastery 1.000 [0.700]
+Sneakiness 1.000 [1.100]
+ Stealth 0.000 [0.400]
+ Disarming 0.000 [0.900]
+Magic 1.000 [0.900]
+ Magic-Device 1.000 [1.150]
+ Spell-power 0.000 [0.600]
+ Necromancy 0.000 [0.400]
+Spirituality 1.000 [1.000]
+ Prayer 1.000 [0.900]
+ Mindcraft 1.000 [0.900]
+Monster-lore 0.000 [0.500]
+
+#####GInnate Abilities:
+#####BAbility Character level
+Perfect casting 1
+
+#####GMindcraft Powers
+Although the powers of a Mindcrafter may seem like magic, this is not
+-- strictly speaking -- the case. They are mental powers, independent
+of the ordinary sources of magic. Consequently, Mindcrafters are not
+interested in 'magic' and learn no spells. These mental powers can be
+accessed through the "m" command, and you can find a full list of their
+powers in the *****m_mindcr.txt*0[Mindcraft powers] document.
+
+#####GStarting Equipment
+A Mindcrafter begins the game with:
+ a Mace
diff --git a/lib/mods/theme/help/c_monk.txt b/lib/mods/theme/help/c_monk.txt
new file mode 100644
index 00000000..87730f18
--- /dev/null
+++ b/lib/mods/theme/help/c_monk.txt
@@ -0,0 +1,87 @@
+|||||oy
+~~~~~01|Monk
+~~~~~02|Classes|Monk
+#####R=== Monks ===
+
+#####GDescription
+The Monk character class is very different from all other classes.
+Although they can use weapons and armour just like any other class,
+their training in martial arts makes them much more powerful with no
+armour nor weapons.
+
+As the Monk's skill level rises, new and more powerful forms of attack become
+available. It is also rumoured that the monastic training makes experienced
+monks faster than any other character class!
+
+A Monk might need to wear some kind of armour to gain the resistances necessary
+for survival at higher levels, but if that armour is too heavy, it will
+severely disturb his/her martial arts maneuvers.
+
+If skill points are invested in *****skills.txt*20[Dodging], a Monk's defensive capabilities
+(blocking and dodging) will also increase. However, if armour is being worn,
+dodging is much less effective. Fortunately, a Monk can increase his/her
+ability to fight while still wearing armor by increasing his/her
+*****skills.txt*13[Barehanded-combat] skill.
+
+Monks also have access to the schools of *****m_meta.txt*0[Meta],
+*****m_tempo.txt*0[Temporal] and *****m_mind.txt*0[Mind] magic.
+
+#####GStarting Stat Modifiers
+Strength +1
+Intelligence -2
+Wisdom +1
+Dexterity +1
+Constitution +0
+Charisma +1
+Hit Die +d8
+Spell Points +0%
+Exp Penalty 40%
+
+#####GStarting Skills:
+#####BSkill Start Level Skill Point Gains
+Combat 0.000 [0.900]
+ Weaponmastery 0.000 [0.300]
+ Archery 0.000 [0.400]
+ Barehand-combat 1.000 [0.900]
+Sneakiness 1.000 [0.900]
+ Stealth 1.000 [0.900]
+ Disarming 1.000 [0.900]
+ Dodging 0.000 [0.700]
+Magic 0.000 [0.600]
+ Magic-Device 1.000 [1.000]
+ Meta 0.000 [0.500]
+ Temporal 0.000 [0.500]
+ Mind 0.000 [0.500]
+Spirituality 1.000 [0.900]
+ Prayer 0.000 [0.500]
+ Music 0.000 [0.300]
+Monster-lore 1.000 [1.100]
+ Corpse-preservation 1.000 [0.500]
+ Possession 0.000 [0.100]
+
+#####GStarting Equipment
+A Monk begins the game with:
+ a Potion of Healing
+ a Soft Leather Armour
+~~~~~03|Monk|Monk attacks
+~~~~~04|Tables|Monk attacks
+#####GMonk Attacks
+#####BAttack Name Min.lvl Damage Stun Notes
+-----------------------------------------------------------------------------
+Punch 1 1d4 -
+Kick 2 1d6 -
+Strike 3 1d7 -
+Knee 5 2d3 * Painful to males; likely to stun them
+Elbow 7 1d8 -
+Butt 9 2d5 -
+Ankle Kick 11 3d4 - May slow down the opponent
+Uppercut 13 4d4 6
+Double-kick 16 5d4 8
+Cat's Claw 20 5d5 -
+Jump Kick 25 5d6 10
+Eagle's Claw 29 6d6 -
+Circle Kick 33 6d8 10
+Iron Fist 37 8d8 10
+Flying Kick 41 8d10 12
+Dragon Fist 45 10d10 16
+Crushing Blow 48 10d12 18
diff --git a/lib/mods/theme/help/c_necro.txt b/lib/mods/theme/help/c_necro.txt
new file mode 100644
index 00000000..f3a5ad2c
--- /dev/null
+++ b/lib/mods/theme/help/c_necro.txt
@@ -0,0 +1,80 @@
+|||||oy
+~~~~~01|Necromancer
+~~~~~02|Classes|Necromancer
+#####R=== Necromancers ===
+
+#####GDescription
+As a Priest devotes his life to his chosen deity, so Necromancers
+devote their lives to the study of death. Familiar with all of the
+forms of unbeing, they are able to manipulate spirit and flesh for
+great effect.
+
+#####GStarting Stat Modifiers
+Strength -5
+Intelligence +3
+Wisdom +0
+Dexterity +1
+Constitution -2
+Charisma +1
+Hit Die +d0
+Spell Points +50%
+Exp Penalty 30%
+
+#####GStarting Skills:
+#####BSkill Start Level Skill Point Gains
+Combat 1.000 [0.400]
+ Weaponmastery 0.700 [0.600]
+Sneakiness 1.000 [0.900]
+ Stealth 0.000 [0.400]
+Magic 1.000 [0.900]
+ Magic-Device 1.000 [1.200]
+ Spell-power 0.000 [0.600]
+ Mana 0.000 [0.600]
+ Geomancy
+ Fire 0.000 [0.800]
+ Water 0.000 [0.700]
+ Air 0.000 [0.700]
+ Earth 0.000 [0.800]
+ Meta 0.000 [0.700]
+ Conveyance 0.000 [0.700]
+ Divination 0.000 [0.700]
+ Temporal 0.000 [0.800]
+ Mind 0.000 [0.900]
+ Nature 0.000 [0.500]
+ Necromancy 1.000 [1.000]
+ Runecraft 0.000 [0.700]
+ Thaumaturgy 0.000 [0.700]
+Spirituality 1.000 [0.550]
+ Prayer 0.000 [0.500]
+Monster-lore 1.000 [1.100]
+ Corpse-preservation 5.000 [0.900]
+
+*A Necromancer cannot learn the Geomancy skill, but it is shown in his skill
+screen because the elemental schools are sub-skills of it.
+
+#####GInnate Abilities:
+#####BAbility Character level
+Perfect casting 1
+Undead Form 25
+
+#####GStarting Equipment
+A Necromancer begins the game with:
+ a Book of Beginner Cantrips
+ a Dagger
+
+#####GNecromancy
+*****m_necrom.txt*0[Necromancy powers] [[[[[Bare accessed using the 'm' key.]
+Even from the start of his career, an inexperienced Necromancer
+can channel forces from the underworld to assault the mind of
+living creatures, therefore terrifying them. With little effort he
+can also learn the art of reanimating a dead corpse, turning it into
+an undead slave. It is only at a later point in his career that this
+foul mage learns to manipulate his life force as well, gaining the
+ability to absorb hit points from both living and dead opponents.
+The greatest Necromancers even gain the ability to survive their own
+death: when they should be killed, they instead turn into a ghostly
+being; they then receive a set number of Death Points, which are in
+all respects similar to hit points except that they go automatically
+down each turn. If the Necromancer manages to kill a certain number
+of creatures before his Death Points reach 0 he is returned to life;
+otherwise his will dissipates and he finally achieves true death.
diff --git a/lib/mods/theme/help/c_pacif.txt b/lib/mods/theme/help/c_pacif.txt
new file mode 100644
index 00000000..7ec7e7d1
--- /dev/null
+++ b/lib/mods/theme/help/c_pacif.txt
@@ -0,0 +1,10 @@
+~~~~~01|Pacifist
+~~~~~02|Classes|Pacifist
+#####R=== Pacifists ===
+
+#####GDescription
+A Pacifist is someone who prefers not to use violence to
+achieve their ends. There are two types of Pacifists:
+
+*****c_peacemag.txt*0[Peace-mage]
+*****c_trapper.txt*0[Trapper] \ No newline at end of file
diff --git a/lib/mods/theme/help/c_palad.txt b/lib/mods/theme/help/c_palad.txt
new file mode 100644
index 00000000..b4cc650b
--- /dev/null
+++ b/lib/mods/theme/help/c_palad.txt
@@ -0,0 +1,49 @@
+|||||oy
+~~~~~01|Paladin
+~~~~~02|Classes|Paladin
+~~~~~03|Tulkas|Paladin
+#####R=== Paladins ===
+
+#####GDescription
+A Paladin is a warrior-priest at the service of *****g_tulkas.txt*0[Tulkas]. As such, his duty
+is to be ever vigilant against the forces of evil and even seek and destroy
+those monsters which are evil to the core, especially the foulest
+spawns of hell. Luckily, his quest is eased by the blessing bestowed
+by Tulkas himself.
+
+#####GStarting Stat Modifiers
+Strength -1
+Intelligence -3
+Wisdom +3
+Dexterity -1
+Constitution +0
+Charisma +2
+Hit Die +d2
+Spell Points +0%
+Exp Penalty 20%
+
+#####GStarting Skills:
+#####BSkill Start Level Skill Point Gains
+Combat 2.000 [0.800]
+ Weaponmastery 1.000 [0.800]
+ Barehand-combat 0.000 [0.900]
+Sneakiness 1.000 [0.900]
+ Stealth 0.000 [0.400]
+ Disarming 0.000 [0.900]
+Magic 1.000 [0.900]
+ Magic-Device 1.000 [1.050]
+ Spell-power 0.000 [0.600]
+Spirituality 1.000 [1.000]
+ Prayer 1.000 [1.400]
+ Mindcraft 0.000 [0.600]
+Monster-lore 0.000 [0.500]
+
+#####GInnate Abilities:
+#####BAbility Character level
+Perfect casting 1
+Extra Max Blow(1) 1
+
+#####GStarting Equipment
+A Paladin begins the game with:
+ a Spellbook of Divine Aim
+ a Two-Handed Sword
diff --git a/lib/mods/theme/help/c_peacemag.txt b/lib/mods/theme/help/c_peacemag.txt
new file mode 100644
index 00000000..f75664f3
--- /dev/null
+++ b/lib/mods/theme/help/c_peacemag.txt
@@ -0,0 +1,46 @@
+~~~~~01|Peace-mage
+~~~~~02|Classes|Peace-mage
+#####R=== Peace-mages ===
+
+#####GDescription
+A Pacifist is someone who prefers not to use violence to
+achieve their ends. The peace-mages choose to use defensive
+spells and rely on symbiosis to protect themselves. They
+may also use spells provided by their deities.
+
+#####GStarting Stat Modifiers
+Strength 0
+Intelligence +2
+Wisdom +2
+Dexterity +2
+Constitution 0
+Charisma +4
+Bonus Blows 0
+Hit Die 0
+Exp Penalty 0%
+
+#####GStarting Skills:
+#####BSkill Start Level Skill Point Gains
+Sneakiness 0.000 [0.600]
+ Stealth 0.000 [0.600]
+ Disarming 1.000 [0.600]
+ Dodging 1.000 [0.700]
+Magic 1.000 [0.600]
+ Spell-power 0.000 [0.500]
+ Meta 0.000 [0.700]
+ Conveyance 1.000 [0.700]
+ Divination 0.000 [0.700]
+ Temporal 0.000 [0.700]
+ Nature 1.000 [1.000]
+Spirituality 0.000 [0.700]
+ Prayer 0.000 [0.500]
+Monster-lore 1.000 [0.900]
+ Symbiosis 1.000 [0.600]
+
+#####GStarting Equipment
+A peace-mage begins the game with:
+ a scroll of summon never-moving pet
+
+#####GInnate Abilities:
+#####BAbility Character level
+Perfect casting 15 \ No newline at end of file
diff --git a/lib/mods/theme/help/c_polear.txt b/lib/mods/theme/help/c_polear.txt
new file mode 100644
index 00000000..8ea2f04a
--- /dev/null
+++ b/lib/mods/theme/help/c_polear.txt
@@ -0,0 +1,52 @@
+~~~~~01|Polearmmaster
+~~~~~02|Classes|Polearmmaster
+#####R=== Polearmmasters ===
+
+#####GDescription
+The Polearmmaster is a Warrior who specialises in polearms.
+
+The training is so intense and specific that Polearmmasters gain huge bonuses
+when fighting with their chosen weapon, dependent on their Polearm-mastery
+skill. In most other respects they perform about as well as a generic Warrior.
+
+#####GStarting Stat Modifiers
+Strength +5
+Intelligence -2
+Wisdom -2
+Dexterity +2
+Constitution +2
+Charisma -1
+Hit Die +d9
+Spell Points +0%
+Exp Penalty 0%
+
+#####GStarting Skills:
+#####BSkill Start Level Skill Point Gains
+Combat 2.000 [0.900]
+ Weaponmastery 1.000 [0.950]
+ Sword-mastery 0.000 [0.300]
+ Axe-mastery 0.000 [0.300]
+ Hafted-mastery 0.000 [0.300]
+ Polearm-mastery 1.000 [0.700]
+ Archery 1.000 [0.600]
+ Antimagic 0.000 [0.550]
+Sneakiness 1.000 [0.900]
+ Stealth 0.000 [0.400]
+ Disarming 1.000 [0.900]
+Magic 1.000 [0.300]
+ Magic-Device 1.000 [1.150]
+Spirituality 1.000 [0.400]
+ Prayer 0.000 [0.500]
+Monster-lore 0.000 [0.500]
+
+#####GInnate Abilities:
+#####BAbility Character level
+Extra Max Blow(1) 1
+Extra Max Blow(2) 1
+Spread blows 25
+
+#####GStarting Equipment
+A Polearmmaster begins the game with:
+ a Ring of Fear Resistance
+ a Chain Mail
+ a Pike
diff --git a/lib/mods/theme/help/c_posses.txt b/lib/mods/theme/help/c_posses.txt
new file mode 100644
index 00000000..2d67a883
--- /dev/null
+++ b/lib/mods/theme/help/c_posses.txt
@@ -0,0 +1,70 @@
+~~~~~01|Possessor
+~~~~~02|Classes|Possessor
+#####R=== Possessors ===
+
+#####GDescription
+Possessors are unusual; they aren't good fighters, and they can't cast
+magic. Their special ability is that of being able to leave their
+bodies and inhabit corpses. While "in" a corpse, the Possessor gains
+the abilities of the monster, and their hit points and the monster's
+are averaged. (Most monsters have no, or very few, spell points.) While
+in the incorporeal form between bodies, they have only one hitpoint.
+
+#####GStarting Stat Modifiers
+Strength +1
+Intelligence -2
+Wisdom +1
+Dexterity +1
+Constitution +0
+Charisma +1
+Hit Die +d8
+Spell Points +0%
+Exp Penalty 40%
+
+#####GStarting Skills:
+#####BSkill Start Level Skill Point Gains
+Combat 1.000 [0.600]
+ Weaponmastery 1.000 [0.600]
+ Archery 1.000 [0.400]
+Sneakiness 1.000 [0.700]
+ Stealth 1.000 [0.700]
+ Disarming 1.000 [0.500]
+Magic 0.000 [0.600]
+ Magic-Device 1.000 [1.000]
+Spirituality 1.000 [0.500]
+ Prayer 0.000 [0.500]
+ Music 0.000 [0.300]
+Monster-lore 1.000 [1.100]
+ Corpse-preservation 1.000 [0.900]
+ Possession 1.000 [0.800]
+
+#####GStarting Equipment
+A Possessor begins the game with:
+ a Potion of Healing
+ a Short Sword
+ a Hard Leather Armour
+
+~~~~~03|Possessor|Possessor powers
+~~~~~04|Skills|Possession - Possessor powers
+#####GPossession
+The strange art of reanimating the corpse of a monster and making
+it one's own can be of extreme benefit to those skilled in it. The body
+the player possesses can grant powerful abilities, such as increased
+speed, summoning, healing, breathing, and various resistances, and often
+gives the player a large number of hit points. Possessing uniques is
+especially neat.
+
+Possessors leave their own body by using the 'm' command, and choosing
+"[I]incarnating powers". Lacking a life force to sustain it, a corpse may rot
+immediately when a Possessor leaves it, but a high Possession skill score
+may prevent this from happening. They then become a very vulnerable ghostly
+being which travels to where another corpse is lying on the floor, and
+possesses it by again using the 'm' command. Once possessed, many
+monster corpses allow the player to perform various special actions
+(such as blinking or summoning) by using the option "Use your [R]ace
+powers".
+
+All corpses alter the player's melee attacks. When they incarnate in a
+monster that allows the use of a weapon, monster blows are ignored
+[[[[[Btotally]. When they incarnate in a monster that doesn't allow use of a
+weapon (dragons for example) they use the monster blows [[[[[Band only them]!
diff --git a/lib/mods/theme/help/c_pr_drk.txt b/lib/mods/theme/help/c_pr_drk.txt
new file mode 100644
index 00000000..fa99f89f
--- /dev/null
+++ b/lib/mods/theme/help/c_pr_drk.txt
@@ -0,0 +1,57 @@
+|||||oy
+~~~~~01|Dark Priest
+~~~~~02|Classes|Dark Priest
+~~~~~03|Melkor|Dark Priests
+#####R=== Melkor's Priests ===
+
+#####GDescription
+All gods have priests; but those serving *****g_melkor.txt*0[Melkor], the dark enemy, are not
+like their good counterparts. While usually it takes devotion and awe to be
+inspired into serving a deity, Melkor's followers revere him because of the
+power he gives them. Some of them may even be so ambitious as to aspire to
+take his place upon the black throne of Angband. This he knows very well, but
+as long as he can use those puny mortals to inspire fear into the followers of
+the Valar and to bring destruction to Arda, he doesn't mind; he even lends power
+to the ones more bent on destruction, while sapping their minds to reduce them
+to unthinking slaves.
+
+#####GStarting Stat Modifiers
+Strength -1
+Intelligence -3
+Wisdom +3
+Dexterity -1
+Constitution +0
+Charisma +2
+Hit Die +d2
+Spell Points +0%
+Exp Penalty 20%
+
+#####GStarting Skills:
+#####BSkill Start Level Skill Point Gains
+Combat 2.000 [0.700]
+ Weaponmastery 1.000 [0.700]
+Sneakiness 1.000 [0.900]
+ Stealth 0.000 [0.400]
+ Disarming 0.000 [0.900]
+Magic 1.000 [0.900]
+ Magic-Device 1.000 [1.050]
+ Spell-power 0.000 [0.800]
+**Udun 0.000 [0.400]
+ Necromancy 0.000 [0.800]
+Spirituality 1.000 [1.000]
+ Prayer 1.000 [1.400]
+Monster-lore 0.000 [0.500]
+ Corpse-preservation 1.000 [1.000]
+
+**Actually, every character has this level of proficiency with the *****m_udun.txt*0[Udun] school,
+provided they are worshipping Melkor
+
+
+#####GInnate Abilities:
+#####BAbility Character level
+Perfect casting 1
+
+#####GStarting Equipment
+A Priest serving Melkor begins the game with:
+ a Spellbook of Curse
+ a Mace
diff --git a/lib/mods/theme/help/c_pr_eru.txt b/lib/mods/theme/help/c_pr_eru.txt
new file mode 100644
index 00000000..ff5a0126
--- /dev/null
+++ b/lib/mods/theme/help/c_pr_eru.txt
@@ -0,0 +1,55 @@
+|||||oy
+~~~~~01|Priest - Eru
+~~~~~02|Classes|Priest - Eru
+~~~~~03|Eru|Priest - Eru
+#####R=== Eru's Priests ===
+
+#####GDescription
+*****g_eru.txt*0[Eru] is the father of the Valar: he created the world and all its inhabitants. He is the wisest being ever and even if he foresaw Morgoth's
+evil, his role was that of the creator; as such, he chose not to destroy
+anything on Arda.
+
+His priests are therefore expected to avoid all forms of bloodshed (so they
+can only use blunt weapons without penalty); however, Eru knows that sometimes
+destruction is unavoidable and marks a blade with his rune; his priests call
+them Blessed and use them without feeling guilty, for they know that divine
+wisdom will guide every swing of those weapons.
+
+Still, a priest serving Eru will find that his true strength lies in knowledge
+and in the use of the force of Mana to avoid close contact with evil beings,
+rather than in blind assault of Morgoth's hordes.
+
+#####GStarting Stat Modifiers
+Strength -1
+Intelligence -3
+Wisdom +3
+Dexterity -1
+Constitution +0
+Charisma +2
+Hit Die +d2
+Spell Points +0%
+Exp Penalty 20%
+
+#####GStarting Skills:
+#####BSkill Start Level Skill Point Gains
+Combat 2.000 [0.700]
+ Weaponmastery 1.000 [0.700]
+Sneakiness 1.000 [0.900]
+ Stealth 0.000 [0.400]
+ Disarming 0.000 [0.900]
+Magic 1.000 [0.900]
+ Magic-Device 1.000 [1.050]
+ Spell-power 0.000 [0.700]
+Spirituality 1.000 [1.000]
+ Prayer 1.000 [1.500]
+ Mindcraft 0.000 [0.600]
+Monster-lore 0.000 [0.500]
+
+#####GInnate Abilities:
+#####BAbility Character level
+Perfect casting 1
+
+#####GStarting Equipment
+A Priest serving Eru begins the game with:
+ a Spellbook of See the Music
+ a Mace
diff --git a/lib/mods/theme/help/c_pr_man.txt b/lib/mods/theme/help/c_pr_man.txt
new file mode 100644
index 00000000..3f83e8af
--- /dev/null
+++ b/lib/mods/theme/help/c_pr_man.txt
@@ -0,0 +1,54 @@
+|||||oy
+~~~~~01|Priest - Manwe
+~~~~~02|Classes|Priest - Manwe
+~~~~~03|Manwe|Priest - Manwe
+#####R=== Manwe's Priests ===
+
+#####GDescription
+As the forces of darkness arose, *****g_manwe.txt*0[Manwe], lord of air, realised that urgent
+action was needed to save Arda from the incoming darkness. So he started
+gathering followers from the ranks of men and elves and he instructed them to
+do battle against the forces of Udun.
+
+His priests must be quick and strike before the situation becomes
+critical, always keeping a direct line of prayer with their patron deity.
+
+Manwe doesn't tolerate laziness, but He also does not appreciate mindless
+killing; only a few measure up to his standards, but those are granted access
+to a whole series of divine powers which will help them in their enduring
+efforts.
+
+#####GStarting Stat Modifiers
+Strength -1
+Intelligence -3
+Wisdom +3
+Dexterity -1
+Constitution +0
+Charisma +2
+Hit Die +d2
+Spell Points +0%
+Exp Penalty 20%
+
+#####GStarting Skills:
+#####BSkill Start Level Skill Point Gains
+Combat 2.000 [0.700]
+ Weaponmastery 1.000 [0.750]
+Sneakiness 1.000 [0.900]
+ Stealth 0.000 [0.400]
+ Disarming 0.000 [0.900]
+Magic 1.000 [0.900]
+ Magic-Device 1.000 [1.050]
+ Spell-power 0.000 [0.600]
+Spirituality 1.000 [1.000]
+ Prayer 1.000 [1.500]
+ Mindcraft 0.000 [0.600]
+Monster-lore 0.000 [0.500]
+
+#####GInnate Abilities:
+#####BAbility Character level
+Perfect casting 1
+
+#####GStarting Equipment
+A Priest serving Manwe begins the game with:
+ a Spellbook of Manwe's Blessing
+ a Mace
diff --git a/lib/mods/theme/help/c_pr_mand.txt b/lib/mods/theme/help/c_pr_mand.txt
new file mode 100644
index 00000000..df98e911
--- /dev/null
+++ b/lib/mods/theme/help/c_pr_mand.txt
@@ -0,0 +1,49 @@
+|||||oy
+~~~~~01|Priest - Mandos
+~~~~~02|Classes|Priest - Mandos
+~~~~~03|Mandos|Priest - Mandos
+#####R=== Priests of Mandos ===
+
+#####GDescription
+*****g_mandos.txt*0[Mandos] is the Doomsman of the Valar, Lord of
+the House of the Dead and he recalls the souls of the fallen ones.
+A Master of Spirit, he knows all that is going to happen, except
+that which lies in the will of Eru himself. Manwe calls upon Mandos
+to pass judgment upon the Ainur and Eru's children alike. The priests
+of Mandos fight righteously to rid the world of evil.
+
+#####GStarting Stat Modifiers
+Strength -1
+Intelligence -3
+Wisdom +3
+Dexterity -1
+Constitution +0
+Charisma +2
+Bonus Blows 0
+Hit Die +d2
+Exp Penalty 20%
+
+#####GStarting Skills:
+#####BSkill Start Level Skill Point Gains
+Combat 2.000 [0.700]
+ Weaponmastery 1.000 [0.700]
+ Hafted-mastery 0.000 [0.400]
+Sneakiness 1.000 [0.900]
+ Stealth 0.000 [0.400]
+ Disarming 0.000 [0.900]
+Magic 1.000 [0.900]
+ Magic-Device 1.000 [1.050]
+ Spell-power 0.000 [0.800]
+Spirituality 1.000 [1.000]
+ Prayer 1.000 [1.500]
+ Mindcraft 0.000 [0.600]
+Monster-lore 0.000 [0.500]
+
+#####GInnate Abilities:
+#####BAbility Character level
+Perfect-casting 1
+
+#####GStarting Equipment
+A priest serving Varda begins the game with:
+ A spellbook of Tears of Luthien
+ A mace \ No newline at end of file
diff --git a/lib/mods/theme/help/c_pr_ulmo.txt b/lib/mods/theme/help/c_pr_ulmo.txt
new file mode 100644
index 00000000..6f82b368
--- /dev/null
+++ b/lib/mods/theme/help/c_pr_ulmo.txt
@@ -0,0 +1,50 @@
+|||||oy
+~~~~~01|Priest - Ulmo
+~~~~~02|Classes|Priest - Ulmo
+~~~~~03|Ulmo|Priest - Ulmo
+#####R=== Ulmo's Priests ===
+
+#####GDescription
+*****g_ulmo.txt*0[Ulmo] is the Lord of the Waters, second in power only
+to Manwe, and the most wrathful of the Valar after Tulkas Astaldo. He
+made a great contribution to the War of Wrath when he led Tuor to Gondolin,
+and he is ever watchful for the contrivances of Melkor Bauglir. His
+preferred weapon type is the polearm, and his priests learn to become
+very proficient with it. A priest of Ulmo is like unto living
+water, channelled through Ulmo's magic.
+
+#####GStarting Stat Modifiers
+Strength -1
+Intelligence -3
+Wisdom +3
+Dexterity -1
+Constitution +0
+Charisma +2
+Bonus Blows 0
+Hit Die +d2
+Exp Penalty 20%
+
+#####GStarting Skills:
+#####BSkill Start Level Skill Point Gains
+Combat 2.000 [0.700]
+ Weaponmastery 1.000 [0.700]
+ Polearm-mastery 0.000 [0.400]
+Sneakiness 1.000 [0.900]
+ Stealth 0.000 [0.400]
+ Disarming 0.000 [0.900]
+Magic 1.000 [0.900]
+ Magic-Device 1.000 [1.050]
+ Spell-power 0.000 [0.800]
+Spirituality 1.000 [1.000]
+ Prayer 1.000 [1.500]
+ Mindcraft 0.000 [0.600]
+Monster-lore 0.000 [0.500]
+
+#####GInnate Abilities:
+#####BAbility Character level
+Perfect-casting 1
+
+#####GStarting Equipment
+A priest serving Ulmo begins the game with:
+ A spellbook of Song of Belegaer
+ A trident \ No newline at end of file
diff --git a/lib/mods/theme/help/c_pr_varda.txt b/lib/mods/theme/help/c_pr_varda.txt
new file mode 100644
index 00000000..f6473df4
--- /dev/null
+++ b/lib/mods/theme/help/c_pr_varda.txt
@@ -0,0 +1,50 @@
+|||||oy
+~~~~~01|Priest - Varda
+~~~~~02|Classes|Priest - Varda
+~~~~~03|Varda|Priest - Varda
+#####R=== Varda's Priests ===
+
+#####GDescription
+*****g_varda.txt*0[Varda] is called Elentari, which means The Queen
+of the Stars. She set the stars in the sky, for which the Eldar of
+Middle-earth revered her, calling her by the name of Elbereth. Her
+priests battle the darkness with light, and also have access to the
+Mana and Meta schools of magic by the grace of Varda. Varda prefers
+it if her servants do not get too close to the Shadow, and thus she
+grants a bonus in Archery to her priests.
+
+#####GStarting Stat Modifiers
+Strength -1
+Intelligence -3
+Wisdom +3
+Dexterity -1
+Constitution +0
+Charisma +2
+Bonus Blows 0
+Hit Die +d2
+Exp Penalty 20%
+
+#####GStarting Skills:
+#####BSkill Start Level Skill Point Gains
+Combat 2.000 [0.700]
+ Weaponmastery 1.000 [0.700]
+ Archery 0.000 [0.400]
+Sneakiness 1.000 [0.900]
+ Stealth 0.000 [0.400]
+ Disarming 0.000 [0.900]
+Magic 1.000 [0.900]
+ Magic-Device 1.000 [1.050]
+ Spell-power 0.000 [0.800]
+Spirituality 1.000 [1.000]
+ Prayer 1.000 [1.500]
+ Mindcraft 0.000 [0.600]
+Monster-lore 0.000 [0.500]
+
+#####GInnate Abilities:
+#####BAbility Character level
+Perfect-casting 1
+
+#####GStarting Equipment
+A priest serving Varda begins the game with:
+ A spellbook of Light of Valinor
+ A mace \ No newline at end of file
diff --git a/lib/mods/theme/help/c_priest.txt b/lib/mods/theme/help/c_priest.txt
new file mode 100644
index 00000000..1eb7bcbb
--- /dev/null
+++ b/lib/mods/theme/help/c_priest.txt
@@ -0,0 +1,17 @@
+|||||oy
+~~~~~01|Priests
+#####R=== Priests ===
+
+#####GDescription
+There are 10 separate classes of Priest:
+
+*****c_pr_eru.txt*0[Priest(Eru)]
+*****c_pr_man.txt*0[Priest(Manwe)]
+*****c_pr_ulmo.txt*0[Priest(Ulmo)]
+*****c_pr_mand.txt*0[Priest(Mandos)]
+*****c_pr_varda.txt*0[Priest(Varda)]
+*****c_druid.txt*0[Druid]
+*****c_palad.txt*0[Paladin]
+*****c_stonewr.txt*0[Stonewright]
+*****c_pr_drk.txt*0[Dark-Priest]
+*****c_mindcr.txt*0[Mindcrafter]
diff --git a/lib/mods/theme/help/c_ranger.txt b/lib/mods/theme/help/c_ranger.txt
new file mode 100644
index 00000000..81af7715
--- /dev/null
+++ b/lib/mods/theme/help/c_ranger.txt
@@ -0,0 +1,56 @@
+|||||oy
+~~~~~01|Ranger
+~~~~~02|Classes|Ranger
+#####R=== Rangers ===
+
+#####GDescription
+Rangers are warrior-mages, devoted to nature. They are good fighters
+and quite effective with bows; their magic often allows them to avoid
+the worst of situations, but they have only a mild chance of resisting
+magical effects and are not terribly stealthy. They can, however,
+learn the ability to summon aid using totems.
+
+They have access to the schools of *****m_divin.txt*0[Divination] and *****m_nature.txt*0[Nature] magic.
+
+#####GStarting Stat Modifiers
+Strength +2
+Intelligence +1
+Wisdom +0
+Dexterity +2
+Constitution +1
+Charisma +1
+Hit Die +d4
+Spell Points +0%
+Exp Penalty 30%
+
+#####GStarting Skills:
+#####BSkill Start Level Skill Point Gains
+Combat 1.000 [0.800]
+ Weaponmastery 1.000 [0.700]
+ Archery 1.000 [0.750]
+ Sling-mastery 0.000 [0.300]
+ Bow-mastery 0.000 [0.300]
+ Crossbow-mastery 0.000 [0.300]
+ Boomerang-mastery 0.000 [0.300]
+Sneakiness 1.000 [0.950]
+ Stealth 0.000 [0.400]
+ Disarming 1.000 [1.600]
+Magic 1.000 [0.700]
+ Magic-Device 1.000 [1.100]
+ Divination 0.000 [0.500]
+ Nature 0.000 [0.500]
+Spirituality 1.000 [0.400]
+ Prayer 0.000 [0.500]
+Monster-lore 0.000 [0.900]
+ Summoning 0.000 [0.300]
+
+
+#####GInnate Abilities:
+#####BAbility Character level
+Ammo creation 2
+
+#####GStarting Equipment
+A Ranger begins the game with:
+ a Short Sword
+ a Short Bow
+ some Arrows
diff --git a/lib/mods/theme/help/c_rogue.txt b/lib/mods/theme/help/c_rogue.txt
new file mode 100644
index 00000000..b42df3d5
--- /dev/null
+++ b/lib/mods/theme/help/c_rogue.txt
@@ -0,0 +1,62 @@
+|||||oy
+~~~~~01|Rogue
+~~~~~02|Classes|Rogue
+#####R== Rogues ===
+
+#####GDescription
+A rogue is a jack of all trades, but the master of none. With the notable
+exception of Archery and Monster-related skills, Rogues are capable of adapting
+to almost any situation. Their strong point lies in stealth and careful
+planning: Where a Warrior would simply hack away (and risk being hacked up
+himself) or a Mage would Manathrust, a Rogue would awaken a monster with a
+dagger in the back, or would wait for the creature to be killed by the line of
+traps she had previously laid between her and her opponent.
+
+Rogues have access to the schools of *****m_convey.txt*0[Conveyance], *****m_divin.txt*0[Divination] and *****m_tempo.txt*0[Temporal] magic.
+
+#####GStarting Stat Modifiers
+Strength +2
+Intelligence +1
+Wisdom -2
+Dexterity +3
+Constitution +1
+Charisma -1
+Hit Die +d6
+Spell Points +0%
+Exp Penalty 25%
+
+#####GStarting Skills
+#####BSkill Start Level Skill Point Gains
+Combat 1.000 [0.700]
+ Weaponmastery 1.000 [0.700]
+ Sword-mastery 1.000 [0.300]
+ Critical-hits 1.000 [0.500]
+Sneakiness 1.000 [2.000]
+ Stealth 1.000 [1.500]
+ Disarming 1.000 [2.000]
+ Backstab 1.000 [1.000]
+ Stealing 1.000 [2.000]
+ Dodging 1.000 [2.000]
+Magic 1.000 [0.700]
+ Magic-Device 1.000 [1.550]
+ Conveyance 0.000 [0.500]
+ Divination 0.000 [0.500]
+ Temporal 0.000 [0.500]
+Spirituality 1.000 [0.700]
+ Prayer 0.000 [0.500]
+Monster-lore 0.000 [0.500]
+
+#####GInnate Abilities:
+#####BAbility Character level
+Trapping 1
+Extra Max Blow(1) 10
+
+#####GStarting Equipment
+A Rogue begins the game with:
+ a Dagger
+ a Catapult Trap Set
+ some Iron Shots
+
+
+
+
diff --git a/lib/mods/theme/help/c_runecr.txt b/lib/mods/theme/help/c_runecr.txt
new file mode 100644
index 00000000..8388eff9
--- /dev/null
+++ b/lib/mods/theme/help/c_runecr.txt
@@ -0,0 +1,110 @@
+~~~~~01|Runecrafter
+~~~~~02|Classes|Runecrafter
+#####R=== Runecrafters ===
+
+#####GDescription
+Instead of using spellbooks like the other spellcasters they instead
+use mystic runes. To cast a spell they select a primary rune of the
+elements (fire, cold, etc.) and they also choose a set of secondary runes,
+which shape the effect of the first one. The secondary runes include
+Self, Arrow, Ray, ... and Armageddon. After that they chose the amount
+of mana to use and the spell is cast! But the more secondary runes they
+chose the more mana is used to cast the spell. They also are bad
+fighters, but if they concentrate all their mana in one spell
+(especially with a mage staff of mana) they could kill nearly anything.
+
+#####GStarting Stat Modifiers
+Strength -5
+Intelligence +3
+Wisdom +0
+Dexterity +1
+Constitution -2
+Charisma +1
+Hit Die +d0
+Spell Points +50%
+Exp Penalty 30%
+
+#####GStarting Skills:
+#####BSkill Start Level Skill Point Gains
+Combat 1.000 [0.200]
+ Weaponmastery 0.700 [0.400]
+Sneakiness 1.000 [0.900]
+ Stealth 0.000 [0.400]
+Magic 2.000 [0.950]
+ Magic-Device 1.000 [1.200]
+ Spell-power 0.000 [0.600]
+ Mana 1.000 [0.600]
+ Geomancy
+ Fire 0.000 [0.700]
+ Water 0.000 [0.700]
+ Air 0.000 [0.700]
+ Earth 0.000 [0.700]
+ Meta 0.000 [0.700]
+ Conveyance 0.000 [0.700]
+ Divination 0.000 [0.700]
+ Temporal 0.000 [0.700]
+ Mind 0.000 [0.700]
+ Nature 0.000 [0.700]
+ Necromancy 0.000 [0.700]
+ Runecraft 1.000 [1.000]
+ Thaumaturgy 0.000 [0.700]
+Spirituality 1.000 [0.550]
+ Prayer 0.000 [0.500]
+Monster-lore 0.000 [0.500]
+
+*A Runecrafter cannot learn the Geomancy skill, but it is shown in his skill
+screen because the elemental schools are sub-skills of it.
+
+#####GInnate Abilities:
+#####BAbility Character level
+Perfect casting 1
+
+~~~~~03|Runecrafter|Runecrafter powers
+~~~~~04|Skills|Runecrafting - Runecrafter powers
+#####GRune Magic
+Runecrafters combine runes using the 'm' command. They first select a
+rune that controls magic type, then apply one or more runes to fine-tune
+effects, (pressing ESC when done), and then input the amount of mana
+they wish to expend on the spell.
+
+Runecrafters can cast the spells from their runes in several ways:
+1. On-the-fly by combining runes when they need them.
+2. Memorise rune combinations for quick use when needed (and they don't
+ need to be able to see then!), and then later cast from memory.
+3. Carving them into a Runestone, then using the Runestone later (takes
+ less mana, but they have to be able to see).
+
+[[[[[BSpell Types:]
+(Some kinds are not listed, and are left for the reader to discover...)
+ Knowledge: Identify all objects in affected grids, Self-knowledge
+ if Self rune is used.
+ Life: Heals monsters in affected grids, heals player if Self rune
+ is used.
+ Fire, Cold, Lightning, Acid: Casts magics of that element.
+ Elements: Irresistible damage.
+ Mind: A mind blast that badly effects intelligent monsters.
+ Temporary ESP if Self rune is used.
+ Gravity: A gravity spell that both does damage and whisks affected
+ creatures around.
+
+[[[[[BSpell Effects] (all are listed):
+ Self: Effects the caster. This rune can be used with any other;
+ if used alone, only the caster's grid is affected.
+ Arrow: Spell will include a bolt effect. This allows aiming.
+ Ray: Spell will include a beam effect. This allows aiming.
+ Increases difficulty slightly.
+ Sphere: Spell will end with a circular explosion. Increases
+ difficulty a bit. Can be used alone, or with Self, Arrow, or
+ Ray.
+ Power Surge: Not currently recommended for use. Increases
+ difficulty a lot.
+ Armageddon: Hurls down meteors of the magical type in the vicinity
+ of the caster. Increases difficulty noticeably, but can do a
+ great deal of damage.
+
+#####GStarting Equipment
+A Runecrafter begins the game with:
+ a Rune [Fire]
+ a Rune [Arrow]
+ a Dagger
+
diff --git a/lib/mods/theme/help/c_sniper.txt b/lib/mods/theme/help/c_sniper.txt
new file mode 100644
index 00000000..008202d8
--- /dev/null
+++ b/lib/mods/theme/help/c_sniper.txt
@@ -0,0 +1,50 @@
+~~~~~01|Sniper
+~~~~~02|Classes|Sniper
+#####R=== Snipers ===
+
+#####GDescription
+Snipers are stealthy archers who kill from a safe
+distance and aren't very good at hand-to-hand combat.
+They have some ability in the Conveyance school of
+magic, which can let them disappear quickly if the
+need should arise.
+
+#####GStarting Stat Modifiers
+Strength +2
+Intelligence +1
+Wisdom +0
+Dexterity +2
+Constitution +1
+Charisma +1
+Bonus Blows 0
+Hit Die +d4
+Exp Penalty 30%
+
+#####GStarting Skills:
+#####BSkill Start Level Skill Point Gains
+Combat 1.000 [0.500]
+ Weaponmastery 1.000 [0.500]
+ Archery 1.000 [0.750]
+ Sling-mastery 0.000 [0.300]
+ Bow-mastery 0.000 [0.300]
+ Crossbow-mastery 0.000 [0.300]
+ Boomerang-mastery 0.000 [0.300]
+Sneakiness 2.000 [1.000]
+ Stealth 1.000 [0.700]
+ Disarming 1.000 [1.000]
+ Backstab 1.000 [0.700]
+Magic 1.000 [0.600]
+ Magic-Device 1.000 [1.100]
+ Conveyance 1.000 [0.500]
+Spirituality 0.000 [0.500]
+ Prayer 0.000 [0.500]
+Monster-lore 0.000 [0.500]
+
+#####GStarting Equipment
+A sniper begins the game with:
+ a short bow
+ some ammo
+
+#####GInnate Abilities:
+#####BAbility Character level
+Ammo creation 2 \ No newline at end of file
diff --git a/lib/mods/theme/help/c_sorcer.txt b/lib/mods/theme/help/c_sorcer.txt
new file mode 100644
index 00000000..8a33184f
--- /dev/null
+++ b/lib/mods/theme/help/c_sorcer.txt
@@ -0,0 +1,68 @@
+|||||oy
+~~~~~01|Sorceror
+~~~~~02|Classes|Sorceror
+#####R=== Sorcerors ===
+
+#####GDescription
+Sorcerors are to magic what Unbelievers are to melee. They are the all-
+around best magicians, being able to cast spells from any school using
+only a single skill. They cannot comfortably use any weapon but a Mage Staff, and even with a Mage Staff, they will be unable to achieve anything remotely resembling battle effectiveness.
+
+The energies used for learning Sorcery also sap the life force of a
+Sorceror, penalising them with the loss of a percentage of their hit
+points equal to their Sorcery skill score and penalising their combat
+ability even more strongly.
+
+For more information on magic schools and spell effects see the
+*****magic.txt*01[Magic help file].
+
+#####GStarting Stat Modifiers
+Strength -5
+Intelligence +3
+Wisdom +0
+Dexterity +1
+Constitution -2
+Charisma +1
+Hit Die +d0
+Spell Points +50%
+Exp Penalty 30%
+
+#####GStarting Skills:
+#####BSkill Start Level Skill Point Gains
+Sneakiness 1.000 [0.900]
+ Stealth 0.000 [0.400]
+Magic 1.000 [1.000]
+ Magic-Device 1.000 [1.000]
+ Spell-power 0.000 [0.600]
+ Sorcery 1.000 [0.700]
+ Mana 0.000 [0.900]
+ Geomancy
+ Fire 0.000 [1.000]
+ Water 0.000 [1.000]
+ Air 0.000 [1.000]
+ Earth 0.000 [1.000]
+ Meta 0.000 [1.000]
+ Conveyance 0.000 [1.000]
+ Divination 0.000 [1.000]
+ Temporal 0.000 [1.000]
+ Mind 0.000 [1.000]
+ Nature 0.000 [1.000]
+ Necromancy 0.000 [1.000]
+ Runecraft 0.000 [0.900]
+ Thaumaturgy 0.000 [0.900]
+Spirituality 1.000 [0.550]
+ Prayer 0.000 [0.500]
+Monster-lore 0.000 [0.500]
+
+*A Sorceror cannot learn the Geomancy skill, but it is shown in his skill
+screen because the elemental schools are sub-skills of it.
+
+#####GInnate Abilities:
+#####BAbility Character level
+Perfect casting 1
+
+#####GStarting Equipment
+A Sorceror begins the game with:
+ a Book of Beginner Cantrips
+ a Robe
+
diff --git a/lib/mods/theme/help/c_stonewr.txt b/lib/mods/theme/help/c_stonewr.txt
new file mode 100644
index 00000000..7de1c0ef
--- /dev/null
+++ b/lib/mods/theme/help/c_stonewr.txt
@@ -0,0 +1,50 @@
+|||||oy
+~~~~~01|Stonewright
+~~~~~02|Classes|Stonewright
+~~~~~03|Aule|Stonewright
+#####R=== Aule's Priests ===
+
+#####GDescription
+*****g_aule.txt*0[Aule] the Smith is concerned with the substance of
+Arda; rock and metal. His priests serve him best by forging better
+weapons to use in the fight against the Dark, and his most beloved
+weapon is the axe, which his followers will find much easier to use
+than other types of weapons. Aule's realms are earth and fire, and
+his priests have access to these realms by the grace of their Vala.
+
+#####GStarting Stat Modifiers
+Strength -1
+Intelligence -3
+Wisdom +3
+Dexterity -1
+Constitution +0
+Charisma +2
+Bonus Blows 0
+Hit Die +d2
+Exp Penalty 20%
+
+#####GStarting Skills:
+#####BSkill Start Level Skill Point Gains
+Combat 2.000 [0.700]
+ Weaponmastery 1.000 [0.700]
+ Axe-mastery 0.000 [0.400]
+Sneakiness 1.000 [0.900]
+ Stealth 0.000 [0.400]
+ Disarming 0.000 [0.900]
+Magic 1.000 [0.900]
+ Magic-Device 1.000 [1.050]
+ Spell-power 0.000 [0.800]
+Spirituality 1.000 [1.000]
+ Prayer 1.000 [1.500]
+ Mindcraft 0.000 [0.600]
+Monster-lore 0.000 [0.500]
+
+#####GInnate Abilities:
+#####BAbility Character level
+Perfect-casting 1
+Extra Max Blow(1) 10
+
+#####GStarting Equipment
+A priest serving Aule begins the game with:
+ A spellbook of Firebrand
+ A light war axe \ No newline at end of file
diff --git a/lib/mods/theme/help/c_summon.txt b/lib/mods/theme/help/c_summon.txt
new file mode 100644
index 00000000..a3eca1de
--- /dev/null
+++ b/lib/mods/theme/help/c_summon.txt
@@ -0,0 +1,80 @@
+~~~~~01|Summoners
+~~~~~02|Classes|Summoners
+#####R=== Summoners ===
+
+#####GDescription
+A Summoner is, with one exception, a fairly weak class. While he starts
+out a decent enough fighter, his fighting skill doesn't improve that much,
+he doesn't cast magic and has little in the way of survival skills. However,
+this weakness doesn't trouble him much, because he can summon creatures to
+do his bidding and still gain experience from their kills.
+
+#####GStarting Stat Modifiers
+Strength +1
+Intelligence -2
+Wisdom +1
+Dexterity +1
+Constitution 0
+Charisma +1
+Hit Die +d8
+Spell Points +0%
+Exp Penalty 40%
+
+#####GStarting Skills
+#####BSkill Start Level Skill Point Gains
+Combat 1.000 [0.600]
+ Weaponmastery 1.000 [0.600]
+ Archery 1.000 [0.400]
+Sneakiness 1.000 [0.700]
+ Stealth 1.000 [0.700]
+ Disarming 1.000 [0.500]
+Magic 1.000 [0.800]
+ Magic-Device 1.000 [1.000]
+Spirituality 1.000 [0.500]
+ Prayer 0.000 [0.500]
+ Music 0.000 [0.300]
+Monster-lore 16.000 [1.200]
+ Summoning 1.000 [0.700]
+ Corpse-preservation 1.000 [1.000]
+
+#####GStarting Equipment
+A Summoner starts the game with:
+ A Potion of Healing
+ A Short Sword
+ A Suit of Hard Leather Armour
+~~~~~03|Summoners|Summoning
+~~~~~04|Skills|Summoning - Summoning powers
+#####GSummoning
+[[[[[BThe summoner's powers of invocation are accessed using the 'm' key.]
+In order to invoke a monster, a summoner must possess a related totem.
+
+There are two kinds of summoning, decided by the totem used:
+
+[[[[[BPartial Summoning]
+Partial summoning creates a simulacrum of the monster, with little will
+of its own. The Summoner must maintain the simulacrum using mana; when
+he runs out, or stops paying the mana, the simulacrum vanishes.
+
+[[[[[BTrue Summoning]
+True summoning is quite different in effect from Partial Summoning, but the
+two are closely related in usage. A True Totem conjures a full copy of the
+creature in question; the process tends to make the monster a loyal ally to
+the summoner, but this loyalty is not guaranteed, nor is the survival of the
+totem used in the summoning.
+
+[[[[[BTotem Creation]
+In order to summon any creature, the Summoner needs a totem. Totems cannot be
+found; they must be created through a special process which involves taking
+the corpse of a creature (the summoner need not have been involved in the
+death of the creature in question), and extracting certain essences from it.
+
+The summoner can create a totem using the 'm' command, and unless one is
+working on a unique's corpse, must choose whether the resulting totem is a
+Partial or True Totem.
+
+[[[[[BImportant Note]
+Uniques are very willful creatures by definition, and thus have three special
+rules about their summoning:
+1. No partial totem can be made from a unique's corpse.
+2. The totem in question is always destroyed.
+3. The unique is twice as likely to be disloyal.
diff --git a/lib/mods/theme/help/c_swordm.txt b/lib/mods/theme/help/c_swordm.txt
new file mode 100644
index 00000000..a3b5ed05
--- /dev/null
+++ b/lib/mods/theme/help/c_swordm.txt
@@ -0,0 +1,52 @@
+~~~~~01|Swordmasters
+~~~~~02|Classes|Swordmasters
+#####R=== Swordmasters ===
+
+#####GDescription
+The Swordmaster is a Warrior who specialises in swords.
+
+The training is so intense and specific that Swordmasters gain huge bonuses
+when fighting with their chosen weapon, dependent on their Sword-mastery skill.
+In most other respects they perform about as well as a generic Warrior.
+
+#####GStarting Stat Modifiers
+Strength +5
+Intelligence -2
+Wisdom -2
+Dexterity +2
+Constitution +2
+Charisma -1
+Hit Die +d9
+Spell Points +0%
+Exp Penalty 0%
+
+#####GStarting Skills:
+#####BSkill Start Level Skill Point Gains
+Combat 2.000 [0.900]
+ Weaponmastery 1.000 [0.950]
+ Sword-mastery 1.000 [0.700]
+ Axe-mastery 0.000 [0.300]
+ Hafted-mastery 0.000 [0.300]
+ Polearm-mastery 0.000 [0.300]
+ Archery 1.000 [0.600]
+ Antimagic 0.000 [0.550]
+Sneakiness 1.000 [0.900]
+ Stealth 0.000 [0.400]
+ Disarming 1.000 [0.900]
+Magic 1.000 [0.300]
+ Magic-Device 1.000 [1.150]
+Spirituality 1.000 [0.400]
+ Prayer 0.000 [0.500]
+Monster-lore 0.000 [0.500]
+
+#####GInnate Abilities:
+#####BAbility Character level
+Extra Max Blow(1) 1
+Extra Max Blow(2) 1
+Spread-blows 25
+
+#####GStarting Equipment
+A Swordmaster begins the game with:
+ a Ring of Fear Resistance
+ a Chain Mail
+ a Broad Sword
diff --git a/lib/mods/theme/help/c_symbia.txt b/lib/mods/theme/help/c_symbia.txt
new file mode 100644
index 00000000..9bbd92fd
--- /dev/null
+++ b/lib/mods/theme/help/c_symbia.txt
@@ -0,0 +1,68 @@
+|||||oy
+~~~~~01|Symbiant
+~~~~~02|Classes|Symbiant
+#####R=== Symbiants ===
+
+#####GDescription
+Symbiants live in harmony with all of the monsters that do not move:
+the Mushrooms, Molds, Floating Eyes, and such. They can hypnotise these
+creatures and then form a symbiotic relationship. Using other symbiotic
+powers, they can even use the magical abilities of their pets.
+
+Once hypnotised, the monster is placed onto the body, or "worn" in order to
+initiate the symbiotic relationship.
+
+#####GStarting Stat Modifiers
+Strength +1
+Intelligence -2
+Wisdom +1
+Dexterity +1
+Constitution 0
+Charisma +1
+Hit Die +d8
+Spell Points +0%
+Exp Penalty 40%
+
+#####GStarting Skills
+#####BSkill Start Level Skill Point Gains
+Combat 1.000 [0.800]
+ Weaponmastery 1.000 [0.800]
+ Archery 1.000 [0.700]
+ Barehand-combat 1.000 [0.600]
+Sneakiness 1.000 [0.800]
+ Stealth 1.000 [0.800]
+ Disarming 1.000 [0.700]
+Magic 1.000 [0.700]
+ Magic-Device 1.000 [1.000]
+Spirituality 1.000 [0.500]
+ Prayer 0.000 [0.500]
+ Music 0.000 [0.300]
+Monster-lore 1.000 [1.100]
+ Corpse-preservation 1.000 [0.900]
+ Possession 0.000 [0.100]
+ Symbiosis 1.000 [0.800]
+
+#####GStarting Equipment
+A Symbiant begins the game with:
+ a Dagger
+ a Scroll of Summon Never-Moving Pet
+
+
+#####GSymbiosis
+Symbiants rely on the partnerships they form, hypnotising creatures
+and then "wearing" them: "I get by with a little help from my friends".
+Depending on the monster, this does nothing except protect the player
+slightly (the worn monster takes some of the damage the player would
+otherwise) or grant some very powerful attacks and summons.
+Their "spells" are used by the 'm' command; as their Symbiosis skill
+increases, they automatically gain more powers.
+For more detail about the specific powers, look here: *****m_symbio.txt*0[Symbiosis]
+~~~~~03|Symbiant|Naming your symbiote
+#####GNaming your symbiote
+For those sentimental Symbiants who like to name your symbiotes, you
+can use the Inscribe command '{'. Inscribe your hypnotized symbiote
+with "#named Fido" (or whatever name you choose, but don't forget the
+leading '#'), and it will be listed in your equipment as "a Red Mold
+named Fido", and the game will refer to your symbiote by name ("Fido
+is healed", for instance, rather than "Your Red mold is healed").
+
diff --git a/lib/mods/theme/help/c_thaum.txt b/lib/mods/theme/help/c_thaum.txt
new file mode 100644
index 00000000..653e84fa
--- /dev/null
+++ b/lib/mods/theme/help/c_thaum.txt
@@ -0,0 +1,84 @@
+~~~~~01|Thaumaturgist
+~~~~~02|Classes|Thaumaturgy
+#####R=== Thaumaturgists ===
+
+#####GDescription
+A Thaumaturgist is a Mage that prefers chaos to order. As such, they tend to
+learn random spells, and since attacking something creates more chaos than
+anything else, every spell they learn is an attack spell. They have no need
+for spell-books, as they harness the spells from within themselves. However,
+they also have no ability to improve the power of a particular spell - once
+learnt it will remain at the same strength for ever. Likewise, they also have
+no ability to control what they learn, and some of their spells will cause
+them damage (like darkness spells blinding them if they do not resist
+darkness).
+
+#####GStarting Stat Modifiers
+Strength -5
+Intelligence +3
+Wisdom +0
+Dexterity +1
+Constitution -2
+Charisma +1
+Hit Die +d0
+Spell Points +50%
+Exp Penalty 30%
+
+#####GStarting Skills:
+#####BSkill Start Level Skill Point Gains
+Combat 1.000 [0.200]
+ Weaponmastery 0.700 [0.400]
+Sneakiness 1.000 [0.900]
+ Stealth 0.000 [0.400]
+Magic 3.000 [0.950]
+ Magic-Device 1.000 [1.050]
+ Spell-power 0.000 [0.600]
+ Mana 0.000 [0.600]
+ Geomancy
+ Fire 0.000 [0.700]
+ Water 0.000 [0.700]
+ Air 0.000 [0.700]
+ Earth 0.000 [0.700]
+ Meta 0.000 [0.700]
+ Conveyance 0.000 [0.700]
+ Divination 0.000 [0.700]
+ Temporal 0.000 [0.700]
+ Mind 0.000 [0.700]
+ Nature 0.000 [0.700]
+ Necromancy 0.000 [0.700]
+ Runecraft 0.000 [0.700]
+ Thaumaturgy 1.000 [1.000]
+Spirituality 1.000 [0.550]
+ Prayer 0.000 [0.500]
+Monster-lore 0.000 [0.500]
+
+*A Thaumaturgist cannot learn the Geomancy skill, but it is shown in his skill
+screen because the elemental schools are sub-skills of it.
+
+#####GInnate Abilities:
+#####BAbility Character level
+Perfect casting 1
+
+#####GStarting Equipment
+A Thaumaturgist begins the game with:
+ a Book of Beginner Cantrips
+ a Dagger
+
+
+#####GThaumaturgy
+Thaumaturgists can wreak an amazing amount of destruction, and they don't
+even need spellbooks to do it. As they gain skill they memorise new,
+randomly generated attack spells. Note that they possess no guaranteed
+utility or alteration magics, and can never alter themselves.
+[[[[[BThaumaturgists just kill.]
+
+They use their magics through the 'm' key. They then select a general
+group of spells, followed by a specific spell. Thaumaturgists can learn
+more about a specific spell by browsing it; this is very useful for
+choosing the perfect spell for the occasion.
+
+Thaumaturgy spells can take the form of a bolt, a beam, a ball (either
+centred on the caster or targetable), an area (multiple balls in the
+vicinity of the caster), or a spell that affects all monsters in line of sight.
+
+You can find a little more information here: *****m_thaum.txt*0[Thaumaturgy].
diff --git a/lib/mods/theme/help/c_trapper.txt b/lib/mods/theme/help/c_trapper.txt
new file mode 100644
index 00000000..eb0badbe
--- /dev/null
+++ b/lib/mods/theme/help/c_trapper.txt
@@ -0,0 +1,46 @@
+~~~~~01|Trapper
+~~~~~02|Classes|Trapper
+#####R=== Trappers ===
+
+#####GDescription
+A Pacifist is someone who prefers not to use violence to
+achieve their ends. The trappers are not averse, however,
+to destroying monsters via traps and using corpses they
+find to create totems in order to summon aid. They
+may also use spells provided by their deities.
+
+#####GStarting Stat Modifiers
+Strength 0
+Intelligence +2
+Wisdom +2
+Dexterity +2
+Constitution 0
+Charisma +4
+Bonus Blows 0
+Hit Die 0
+Exp Penalty 0%
+
+#####GStarting Skills:
+#####BSkill Start Level Skill Point Gains
+Sneakiness 0.000 [0.600]
+ Stealth 0.000 [0.600]
+ Disarming 1.000 [0.600]
+ Dodging 1.000 [0.700]
+Magic 1.000 [0.600]
+ Spell-power 0.000 [0.500]
+ Nature 1.000 [1.000]
+Spirituality 0.000 [0.700]
+ Prayer 0.000 [0.500]
+Monster-lore 1.000 [0.900]
+ Summoning 1.000 [0.600]
+
+#####GStarting Equipment
+A trapper begins the game with:
+ a catapult trap set
+ some iron shots
+
+#####GInnate Abilities:
+#####BAbility Character level
+Trapping 1
+Ammo creation 10
+Perfect casting 15 \ No newline at end of file
diff --git a/lib/mods/theme/help/c_unbel.txt b/lib/mods/theme/help/c_unbel.txt
new file mode 100644
index 00000000..feec5723
--- /dev/null
+++ b/lib/mods/theme/help/c_unbel.txt
@@ -0,0 +1,65 @@
+~~~~~01|Unbeliever
+~~~~~02|Classes|Unbeliever
+#####R=== Unbelievers ===
+
+#####GDescription
+The full opposite of Sorcerors, Unbelievers so strongly despise magic
+that not only do they refuse to use magic spells, they refuse all
+training in the use of magic items, which leaves them almost totally
+incompetent when trying to use a magic item.
+
+#####GStarting Stat Modifiers
+Strength +5
+Intelligence -2
+Wisdom -2
+Dexterity +2
+Constitution +2
+Charisma -1
+Hit Die +d9
+Spell Points +0%
+Exp Penalty 0%
+
+#####GStarting Skills
+#####BSkill Start Level Skill Point Gains
+Combat 2.000 [0.800]
+ Weaponmastery 1.000 [0.850]
+ Sword-mastery 0.000 [0.400]
+ Axe-mastery 0.000 [0.400]
+ Hafted-mastery 0.000 [0.400]
+ Polearm-mastery 0.000 [0.400]
+ Archery 1.000 [0.600]
+ Antimagic 1.000 [0.650]
+Sneakiness 1.000 [0.900]
+ Stealth 0.000 [0.400]
+ Disarming 1.000 [0.900]
+Monster-lore 0.000 [0.500]
+
+#####GInnate Abilities:
+#####BAbility Character level
+Extra Max Blow(1) 1
+Extra Max Blow(2) 1
+Spread blows 25
+
+#####GStarting Equipment
+An Unbeliever begins the game with:
+ a Ring of Fear Resistance
+ a Dark Sword
+ a Chain Mail
+
+~~~~~03|Unbelievers|Antimagic
+~~~~~04|Antimagic
+~~~~~05|Skills|Antimagic powers
+#####GAntimagic
+Thought carries power. And since Unbelievers think that magic doesn't
+exist, they can suppress its manifestation around them.
+Their magic-inhibiting ability and the area of effect around them are
+determined by the skill level in Antimagic. If they wield a Dark Sword,
+the strength and radius of the magic disrupting field are increased further,
+with best results if the blade is unenchanted.
+
+High levels of proficiency in Antimagic allow them also to stabilise the
+space-time continuum, so preventing teleportation, to sense the magical
+emanations coming from traps and to destroy these around them.
+These abilities are accessed using the 'm' key.
+
+
diff --git a/lib/mods/theme/help/c_wainrid.txt b/lib/mods/theme/help/c_wainrid.txt
new file mode 100644
index 00000000..cf3c3d69
--- /dev/null
+++ b/lib/mods/theme/help/c_wainrid.txt
@@ -0,0 +1,49 @@
+~~~~~01|Wainrider
+~~~~~02|Classes|Wainrider
+#####R=== Wainriders ===
+
+#####GDescription
+Proud warriors riding majestic chariots. They are most effective
+with short, thrusting blades. They are highly spiritual, but their
+deity must be Melkor Bauglir, they do not have a choice when they
+embark upon their adventure. They are better skilled in magic than
+other warrior classes, although their magical ability is limited to
+the Udun school.
+
+#####GStarting Stat Modifiers
+Strength +5
+Intelligence -2
+Wisdom -2
+Dexterity +2
+Constitution +2
+Charisma -1
+Bonus Blows 3
+Hit Die +d9
+Exp Penalty 0%
+
+#####GStarting Skills:
+#####BSkill Start Level Skill Point Gains
+Combat 2.000 [0.800]
+ Weaponmastery 1.000 [0.850]
+ Sword-mastery 0.000 [0.700]
+ Critical-hits 0.000 [0.500]
+ Archery 1.000 [0.600]
+Sneakiness 1.000 [0.900]
+ Disarming 1.000 [0.900]
+Magic 2.000 [0.800]
+ Magic-Device 1.000 [1.150]
+ Udun 0.000 [0.400]
+Spirituality 1.000 [0.900]
+ Prayer 1.000 [0.700]
+Monster-lore 0.000 [0.500]
+
+#####GStarting Equipment
+A Wainrider begins the game with:
+ a spellbook of Curse
+ a potion of Corruption
+ a Shadow Blade
+
+#####GInnate Abilities:
+#####BAbility Character level
+Extra Max Blow(1) 1
+Extra Max Blow(2) 1 \ No newline at end of file
diff --git a/lib/mods/theme/help/c_warper.txt b/lib/mods/theme/help/c_warper.txt
new file mode 100644
index 00000000..55d16be5
--- /dev/null
+++ b/lib/mods/theme/help/c_warper.txt
@@ -0,0 +1,60 @@
+|||||oy
+~~~~~01|Warper
+~~~~~02|Classes|Warper
+#####R=== Warpers ===
+
+#####GDescription
+A Warper is a type of mage that prefers to deal in magic that alters the
+fabric of space and time. They specialise in the schools of *****m_convey.txt*0[Conveyance],
+*****m_divin.txt*0[Divination] and *****m_tempo.txt*0[Temporal] magic.
+
+#####GStarting Stat Modifiers
+Strength -5
+Intelligence +3
+Wisdom +0
+Dexterity +1
+Constitution -2
+Charisma +1
+Hit Die +d0
+Spell Points +50%
+Exp Penalty 30%
+
+#####GStarting Skills:
+#####BSkill Start Level Skill Point Gains
+Combat 1.000 [0.200]
+ Weaponmastery 0.700 [0.400]
+Sneakiness 1.000 [0.900]
+ Stealth 0.000 [0.400]
+Magic 1.000 [0.900]
+ Magic-Device 1.000 [1.050]
+ Spell-power 1.000 [0.700]
+ Mana 1.000 [0.700]
+ Geomancy
+ Fire 0.000 [0.800]
+ Water 0.000 [0.800]
+ Air 0.000 [0.800]
+ Earth 0.000 [0.800]
+ Meta 0.000 [0.800]
+ Conveyance 0.000 [1.200]
+ Divination 0.000 [1.200]
+ Temporal 0.000 [1.200]
+ Mind 0.000 [0.700]
+ Nature 0.000 [0.800]
+ Necromancy 0.000 [0.700]
+ Runecraft 0.000 [0.700]
+ Thaumaturgy 0.000 [0.700]
+Spirituality 1.000 [0.550]
+ Prayer 0.000 [0.500]
+Monster-lore 0.000 [0.500]
+
+*A Warper cannot learn the Geomancy skill, but it is shown in his skill
+screen because the elemental schools are sub-skills of it.
+
+#####GInnate Abilities:
+#####BAbility Character level
+Perfect casting 1
+
+#####GStarting Equipment
+A Warper begins the game with:
+ a Book of Beginner Cantrips
+ a Dagger
diff --git a/lib/mods/theme/help/c_warrio.txt b/lib/mods/theme/help/c_warrio.txt
new file mode 100644
index 00000000..942b34bb
--- /dev/null
+++ b/lib/mods/theme/help/c_warrio.txt
@@ -0,0 +1,54 @@
+~~~~~01|Warrior
+~~~~~02|Classes|Warrior
+#####R=== Warriors ===
+
+#####GDescription
+A Warrior is a hack-and-slash character, who solves most of his problems
+by cutting them to pieces, but will occasionally fall back on the help
+of a magical device or a bow.
+
+A Warrior learns no magic, and can even suppress it like an Unbeliever through
+the Antimagic skill.
+
+#####GStarting Stat Modifiers
+Strength +5
+Intelligence -2
+Wisdom -2
+Dexterity +2
+Constitution +2
+Charisma -1
+Hit Die +d9
+Spell Points +0%
+Exp Penalty 0%
+
+#####GStarting Skills:
+#####BSkill Start Level Skill Point Gains
+Combat 2.000 [0.800]
+ Weaponmastery 1.000 [0.850]
+ Sword-mastery 0.000 [0.400]
+ Axe-mastery 0.000 [0.400]
+ Hafted-mastery 0.000 [0.400]
+ Polearm-mastery 0.000 [0.400]
+ Archery 1.000 [0.600]
+ Antimagic 0.000 [0.550]
+Sneakiness 1.000 [0.900]
+ Stealth 0.000 [0.400]
+ Disarming 1.000 [0.900]
+Magic 1.000 [0.300]
+ Magic-Device 1.000 [1.150]
+Spirituality 1.000 [0.400]
+ Prayer 0.000 [0.500]
+Monster-lore 0.000 [0.500]
+
+#####GInnate Abilities:
+#####BAbility Character level
+Extra Max Blow(1) 1
+Extra Max Blow(2) 1
+Spread blows 25
+
+#####GStarting Equipment
+A Warrior begins the game with:
+ a Ring of Fear Resistance
+ a Broad Sword
+ a Chain Mail
+
diff --git a/lib/mods/theme/help/command.txt b/lib/mods/theme/help/command.txt
new file mode 100644
index 00000000..6616c252
--- /dev/null
+++ b/lib/mods/theme/help/command.txt
@@ -0,0 +1,1251 @@
+|||||oy
+~~~~~99|Commands
+#####R=== List of Commands ===
+
+
+ Angband commands are entered as an "underlying command" (a single key)
+plus a variety of optional or required arguments. You may choose how the
+"keyboard keys" are mapped to the "underlying commands" by choosing one of
+two standard "keysets", the "original" keyset or the "roguelike" keyset.
+
+ The original keyset is very similar to the "underlying" command set,
+with a few additions (such as the ability to use the numeric "directions" to
+"walk" or the "5" key to "stay still"). The roguelike keyset provides similar
+additions, and also allows the use of the h/j/k/l/y/u/b/n keys to "walk" (or,
+in combination with the shift or control keys, to run or tunnel), which thus
+requires a variety of key mappings to allow access to the underlying commands
+used for walking/running/tunneling. In particular, the "roguelike" keyset
+includes many more "capital" and "control" keys, as shown below.
+
+ Note that any keys that are not required for access to the underlying
+command set may be used by the user as "command macro" triggers (see below).
+You may always specify any "underlying command" directly by pressing backslash
+("\") plus the "underlying command" key. This is normally only used in "macro"
+definitions. [[[[[BYou may often enter "control-keys" as a caret ("^") plus the key]
+(so "^" + "p" often yields "^P").
+
+ Some commands allow an optional "repeat count", which allows you to tell
+the game that you wish to do the command multiple times, unless you press a
+key or are otherwise disturbed. To enter a "repeat count", type '0', followed
+by the numerical count, followed by the command. You must type "space" before
+entering certain commands. Skipping the numerical count yields a count of 99.
+An option allows certain commands (open, disarm, tunnel, etc) to auto-repeat.
+
+ Some commands will prompt for extra information, such as a direction, an
+inventory or equipment item, a spell, a textual inscription, the symbol of a
+monster race, a sub-command, a verification, an amount of time, a quantity,
+a file name, or various other things. Normally you can hit return to choose
+the "default" response, or escape to cancel the command entirely.
+
+ Some commands will prompt for a spell or an inventory item. Pressing
+space (or '*') will give you a list of choices. Pressing "-" (minus) selects
+the item on the floor. Pressing a lowercase letter selects the given item.
+Pressing a capital letter selects the given item after verification. Pressing
+a numeric digit '#' selects the first item (if any) whose inscription contains
+"@#" or "@x#", where "x" is the current "underlying command". You may only
+specify items which are "legal" for the command. Whenever an item inscription
+contains "!*" or "!x" (with "x" as above) you must verify its selection.
+
+ In ToME, there are items which occasionally teleport you away, asking
+for permission first. The recurring "Teleport (y/n)?" can be annoying, and
+this behavior can be eliminated by inscribing the object which causes the
+teleportation with "." (or any inscription containing the character ".").
+With this inscription, the object will no longer teleport you around nor
+keep asking you. If you want to restore the teleport ability to the object,
+just remove the "." from its inscription. Note that cursed items which
+teleport you are unaffected by the inscription.
+
+ Some commands will prompt for a direction. You may enter a "compass"
+direction using any of the "direction keys" shown below. Sometimes, you may
+specify that you wish to use the current "target", by pressing "t" or "5", or
+that you wish to select a new target, by pressing "*" (see "Target" below).
+~~~~~95
+#####G Original Keyset Directions Roguelike Keyset Directions
+
+ 7 8 9 y k u
+ 4 6 h l
+ 1 2 3 b j n
+
+ Each of the standard keysets provides some short-cuts over the "underlying
+commands". For example, both keysets allow you to "walk" by simply pressing
+an "original" direction key (or a "roguelike" direction key if you are using
+the roguelike keyset), instead of using the "walk" command plus a direction.
+[[[[[BThe roguelike keyset allows you to "run" or "tunnel" by simply holding the]
+[[[[[Bshift or control modifier key down while pressing a "roguelike" direction key,]
+[[[[[Binstead of using the "run" or "tunnel" command plus a direction.] Both keysets
+allow the use of the "5" key to "stand still", which is most convenient when
+using the original keyset.
+
+ Note that on many systems, it is possible to define "macros" (or "command
+macros") to various keys, or key combinations, so that it is often possible to
+make macros which, for example, allow the use of the shift or control modifier
+keys, plus a numeric keypad key, to specify the "run" or "tunnel" command, with
+the given direction, regardless of any keymap definitions, by using the fact
+that you can always, for example, use "\" + "." + "6", to specify "run east".
+~~~~~100|Commands|Original keyset
+#####R=== Original Keyset Command Summary (4.2.x) ===
+
+ *****command.txt*1[a Aim a wand] *****command.txt*2[A Activate an artifact]
+ *****command.txt*3[b Browse a book] *****command.txt*4[B Bash a door]
+ *****command.txt*5[c Close a door] *****command.txt*6[C Character description]
+ *****command.txt*7[d Drop an item] *****command.txt*8[D Disarm a trap]
+ *****command.txt*9[e Equipment list] *****command.txt*10[E Eat some food]
+ *****command.txt*11[f Fire (shoot) an item] *****command.txt*12[F Fuel your lantern/torch]
+ *****command.txt*13[g Stay still (flip pickup)] *****command.txt*14[G Gain new skills]
+ *****command.txt*15[h Hack up a corpse] *****command.txt*16[H Drink from a fountain]
+ *****command.txt*17[i Inventory list] *****command.txt*18[I Inspect (closely examine) an item]
+ *****command.txt*19[j Jam a door] J (unused)
+ *****command.txt*20[k Destroy an item] *****command.txt*21[K Cure meat]
+ *****command.txt*22[l Look around] *****command.txt*23[L Look around dungeon by sector]
+ *****command.txt*24[m Cast a spell / use mental power] *****command.txt*25[M Full dungeon map]
+ *****command.txt*85[n Repeat last command] *****command.txt*91[N Abilities Screen]
+ *****command.txt*26[o Open a door or chest] *****command.txt*27[O Sacrifice at an altar]
+ *****command.txt*28[p Pray to your god (if any)] *****command.txt*29[P Pet commands]
+ *****command.txt*30[q Quaff a potion] *****command.txt*31[Q Quit (commit suicide)]
+ *****command.txt*32[r Read a scroll] *****command.txt*33[R Rest for a period]
+ *****command.txt*34[s Search for traps/doors] *****command.txt*35[S Toggle search mode]
+ *****command.txt*36[t Take off equipment] *****command.txt*37[T Dig a tunnel]
+ *****command.txt*38[u Use a staff] *****command.txt*39[U Use bonus power (if any)]
+ *****command.txt*40[v Throw an item] *****command.txt*41[V Version Info]
+ *****command.txt*42[w Wear/wield equipment] W (unused)
+ *****command.txt*43[x Engrave the floor] X (unused)
+ *****command.txt*44[y Give item to monster] *****command.txt*96[Y Chat with a monster]
+ *****command.txt*45[z Zap a rod] *****command.txt*46[Z Steal]
+ *****command.txt*47[! Interact with system] *****debug.txt*101[^A (special - debug command)]
+ *****command.txt*49[@ Interact with macros] ^B (unused)
+ *****command.txt*89[# Begin extended command] ^C (special - break)
+ *****command.txt*97[$ Record macros] ^D (unused)
+ *****command.txt*51[% Interact with visuals] *****command.txt*52[^E Toggle choice window]
+ ^ (special - control key) *****command.txt*53[^F Repeat level feeling]
+ *****command.txt*54[& Interact with colors] ^G (unused)
+ *****command.txt*55[* Target monster or location] ^H (unused)
+ ( (unused) ^I (special - tab)
+ ) (unused) ^J (special - linefeed)
+ *****command.txt*58[{ Inscribe an object] ^K (unused)
+ *****command.txt*59[} Uninscribe an object] ^L (unused)
+ [ (unused) ^M (special - return)
+ ] (unused) ^N (unused)
+ *****command.txt*60[- Walk (flip pickup)] ^O (unused)
+ *****command.txt*61[_ Re-Enter store] *****command.txt*62[^P Show previous messages]
+ *****command.txt*63[+ Alter grid] *****command.txt*64[^Q Quit to next midi song]
+ *****command.txt*65[= Set options] *****command.txt*66[^R Redraw the screen]
+ *****command.txt*67[; Walk (with pickup)] *****command.txt*68[^S Save and don't quit]
+ *****command.txt*69[: Take notes] *****command.txt*70[^T Time of the day]
+ ' (unused) ^U (unused)
+ *****command.txt*71[" Enter a user pref command] ^V (unused)
+ *****command.txt*72[, Stay still (with pickup)] ^W (special - wizard mode)
+ *****command.txt*74[< Go up staircase] *****command.txt*75[^X Save and quit]
+ *****command.txt*76[. Run] ^Y (unused)
+ *****command.txt*77[> Go down staircase] ^Z (special - borg command)
+ *****command.txt*79[\ (special - bypass keymap)] *****command.txt*80[| Do cmovies]
+ *****command.txt*81[` (special - escape)] *****command.txt*82[~ Display current knowledge]
+ *****command.txt*83[/ Identify symbol] *****command.txt*84[? Help]
+ *****command.txt*98[^\] Take an html screenshot]
+
+
+~~~~~101|Commands|Roguelike keyset
+#####R=== Roguelike Keyset Command Summary (4.2.x) ===
+
+ *****command.txt*45[a Zap a rod (Activate)] *****command.txt*2[A Activate an artifact]
+ *****command.txt*95[b (walk - south west)] *****command.txt*95[B (run - south west)]
+ *****command.txt*5[c Close a door] *****command.txt*6[C Character description]
+ *****command.txt*7[d Drop an item] *****command.txt*8[D Disarm a trap or chest]
+ *****command.txt*9[e Equipment list] *****command.txt*10[E Eat some food]
+ *****command.txt*4[f Bash a door (force)] *****command.txt*12[F Fuel your lantern/torch]
+ *****command.txt*13[g Stay still (flip pickup)] *****command.txt*14[G Gain new skills]
+ *****command.txt*95[h (walk - west)] *****command.txt*95[H (run - west)]
+ *****command.txt*17[i Inventory list] *****command.txt*18[I Observe an item]
+ *****command.txt*95[j (walk - south)] *****command.txt*95[J (run - south)]
+ *****command.txt*95[k (walk - north)] *****command.txt*95[K (run - north)]
+ *****command.txt*95[l (walk - east)] *****command.txt*95[L (run - east)]
+ *****command.txt*24[m Spell casting / mental power] *****command.txt*25[M Full dungeon map]
+ *****command.txt*95[n (walk - south east)] *****command.txt*95[N (run - south east)]
+ *****command.txt*26[o Open a door or chest] *****command.txt*39[O Use bonus power (if any)]
+ *****command.txt*28[p Pray to your god (if any)] *****command.txt*3[P Browse a book]
+ *****command.txt*30[q Quaff a potion] *****command.txt*31[Q Quit (commit suicide)]
+ *****command.txt*32[r Read a scroll] *****command.txt*33[R Rest for a period]
+ *****command.txt*34[s Search for traps/doors] *****command.txt*97[S Record macros]
+ *****command.txt*11[t Fire an item] *****command.txt*36[T Take off equipment]
+ *****command.txt*95[u (walk - north east)] *****command.txt*95[U (run - north east)]
+ *****command.txt*40[v Throw an item] *****command.txt*16[V Drink from a fountain]
+ *****command.txt*42[w Wear/wield equipment] *****command.txt*23[W Locate player on map (Where)]
+ *****command.txt*22[x Look around] *****command.txt*29[X Pet commands]
+ *****command.txt*95[y (walk - north west)] *****command.txt*95[Y (run - north west)]
+ *****command.txt*1[z Aim a wand (Zap)] *****command.txt*38[Z Use a staff (Zap)]
+ *****command.txt*47[! Interact with system] ^A (special - debug command)
+ *****command.txt*49[@ Interact with macros] *****command.txt*95[^B (tunnel - south west)]
+ *****command.txt*35[# Toggle search mode] ^C (special - break)
+ *****command.txt*15[$ Hack up a corpse] *****command.txt*20[^D Destroy item]
+ *****command.txt*51[% Interact with visuals] *****command.txt*52[^E Toggle choice window]
+ ^ (special - control key) *****command.txt*53[^F Repeat level feeling]
+ *****command.txt*54[& Interact with colors] *****command.txt*27[^G Sacrifice at an altar]
+ *****command.txt*55[* Target monster or location] *****command.txt*95[^H (tunnel - west)]
+ *****command.txt*96[( Chat] ^I (special - tab)
+ *****command.txt*89[) Begin extended command] *****command.txt*95[^J (tunnel - south)]
+ *****command.txt*58[{ Inscribe an object] *****command.txt*95[^K (tunnel - north)]
+ *****command.txt*59[} Uninscribe an object] *****command.txt*95[^L (tunnel - east)]
+ [*****command.txt*46[ Steal] *****command.txt*95[^M (tunnel - south)]
+ ]*****command.txt*43[ Engrave the floor] *****command.txt*95[^N (tunnel - south east)]
+ *****command.txt*60[- Walk (flip pickup)] *****command.txt*21[^O Cure meat]
+ *****command.txt*61[_ Enter store] *****command.txt*62[^P Show previous messages]
+ *****command.txt*63[+ Alter grid] *****command.txt*64[^Q Quit to next midi song]
+ *****command.txt*65[= Set options] *****command.txt*66[^R Redraw the screen]
+ *****command.txt*67[; Walk (with pickup)] *****command.txt*68[^S Save and don't quit]
+ *****command.txt*69[: Take notes] *****command.txt*37[^T Dig a Tunnel]
+ *****command.txt*44[' Give object to monster] *****command.txt*95[^U (tunnel - north east)]
+ *****command.txt*71[" Enter a user pref command] ^V (unused)
+ *****command.txt*76[, Run] ^W (special - wizard mode)
+ *****command.txt*74[< Go up staircase] *****command.txt*75[^X Save and quit]
+ *****command.txt*72[. Stay still (with pickup)] *****command.txt*95[^Y (tunnel - north west)]
+ *****command.txt*77[> Go down staircase] ^Z (special - borg command)
+ *****command.txt*79[\ (special - bypass keymap)] *****command.txt*80[| Do cmovies]
+ *****command.txt*81[` (special - escape)] *****command.txt*82[~ Display current knowledge]
+ *****command.txt*83[/ Identify symbol] *****command.txt*84[? Help]
+
+~~~~~102|Commands|Special keys
+#####R=== Special Keys ===
+
+ Certain special keys may be intercepted by the operating system or
+the host machine, causing unexpected results. In general, these special keys
+are control keys, and often, you can disable their special effects.
+
+ If you are playing on a UNIX or similar system, then Ctrl-C will
+interrupt ToME. The second and third interrupt will induce a warning
+bell, and the fourth will induce both a warning bell and a special message,
+since the fifth will quit the game, after killing your character. Also,
+Ctrl-Z will suspend the game, and return you to the original command shell,
+until you resume the game with the "fg" command. There is now a compilation
+option to force the game to prevent the "double ctrl-z escape death trick".
+The Ctrl-\ and Ctrl-D and Ctrl-S keys should not be intercepted.
+
+ It is often possible to specify "control-keys" without actually
+pressing the control key, by typing a caret ("^") followed by the key.
+This is useful for specifying control-key commands which might be caught
+by the operating system as explained above.
+~~~~~79
+ Pressing [[[[[Gbackslash ("\\")] before a command will bypass all keymaps,
+and the next keypress will be interpreted as an "underlying command" key,
+unless it is a caret ("^"), in which case the keypress after that will be
+turned into a control-key and interpreted as a command in the underlying
+ToME keyset. The backslash key is useful for creating macro actions
+which are not affected by any keymap definitions that may be in force, for
+example, the sequence "\" + "." + "6" will always mean "run east", even if
+the "." key has been mapped to a different underlying command.
+
+ The "0" and "^" and "\" keys all have special meaning when entered
+at the command prompt, and there is no "useful" way to specify any of them
+as an "underlying command", which is okay, since they would have no effect.
+~~~~~81
+ For many input requests or queries, the [[[[[Gspecial character ESCAPE]
+will abort the command. The "[y/n]" prompts may be answered with "y" or
+"n", or escape. The "-more-" message prompts may be cleared (after reading
+the displayed message) by pressing ESCAPE, SPACE, RETURN, LINEFEED, or by
+any keypress, if the "quick_messages" option is turned on.
+~~~~~103|Commands|Command counts
+~~~~~104|Commands|Repeating a command
+#####R=== Command Counts ===
+
+ Some commands can be executed a fixed number of times by preceding
+them with a count. Counted commands will execute until the count expires,
+until you type any character, or until something significant happens, such
+as being attacked. Thus, a counted command doesn't work to attack another
+creature. While the command is being repeated, the number of times left
+to be repeated will flash by on the line at the bottom of the screen.
+
+ [[[[[BTo give a count to a command, type 0, the repeat count, and then]
+[[[[[Bthe command.] If you want to give a movement command and you are using the
+original command set (where the movement commands are digits), press space
+after the count and you will be prompted for the command.
+
+ Counted commands are very useful for searching or tunneling, as
+they automatically terminate on success, or if you are attacked. You may
+also terminate any counted command (or resting or running), by typing any
+character. This character is ignored, but it is safest to use a SPACE or
+ESCAPE which are always ignored as commands in case you type the command
+just after the count expires.
+
+ You can tell ToME to automatically use a repeat count of 99
+with commands you normally want to repeat (open, disarm, tunnel, bash,
+alter, etc) by setting the "always_repeat" option.
+
+
+#####R=== Selection of Objects ===
+
+ Many commands will also prompt for a particular object to be used.
+For example, the command to read a scroll will ask you which of the
+scrolls that you are carrying that you wish to read. In such cases, the
+selection is made by typing a letter of the alphabet. The prompt will
+indicate the possible letters, and will also allow you to type the key
+"*", which causes all of the available options to be described. The list
+of choices will also be shown in the Choice window, if you are using a
+windows environment and windows are turned on. Often you will be able to
+press "/" to select an object from your equipment instead of your
+inventory. Pressing space once will have the same effect as "*", and
+the second time will cancel the command and run the "i" or "e" command.
+
+ [[[[[BThe particular object may be selected by an upper case or a lower]
+[[[[[Bcase letter. If lower case is used, the selection takes place]
+[[[[[Bimmediately. If upper case is used, then the particular option is]
+[[[[[Bdescribed, and you are given the option of confirming or retracting that]
+[[[[[Bchoice.] Upper case selection is thus safer, but requires an extra key
+stroke. Also see the "!*" and "!x" inscriptions, below.
+
+ For many commands, [[[[[Byou can also use "-" to select an object on the]
+[[[[[Bfloor where you are standing.] This lets you read scrolls or quaff
+potions, for example, off the dungeon floor without picking them up.
+~~~~~90
+ If you enter a number between 0 and 9, the first item engraved
+with "@#" where "#" is the number you entered will be selected. For example,
+if you have a shovel engraved with "@0" and you type "w" (for wield) and
+then 0, you will wield the shovel. This is very useful for macros (see
+below), since you can use this to select an object regardless of its
+location in your pack. Multiple numbers can be engraved on the same object; for
+example, if a sword is engraved with @1@0, then either "w1" or "w0" will
+wield it. Normally, you inscribe "@1@0" on your primary weapon, and
+"@2@0" on your secondary weapon. [[[[[BNote that an inscription containing]
+[[[[[B"@x#" will act like "@#" but only when the current "ToME command"]
+[[[[[Bis "x".] Thus you can put "@z4" on a rod and "@u4" on a staff, and then
+use both "z4" and "u4" as desired.
+
+ Note that any object containing "!x" in its inscription, where
+"x" is the current "ToME command" (or containing "!*" ever) will induce
+"verification" whenever that object is "selected". Thus, inscribing, say,
+"!f!k!d" on an object will greatly reduce the odds of you "losing" it by
+accident, and [[[[[Binscribing "!*" on an object] will allow you to be very paranoid
+about the object. Note that "selling" and "dropping" both use the "d" command.
+
+~~~~~105|Pref files
+#####R=== User Pref Files ===
+
+ ToME allows you to change various aspects of the game to suit
+your tastes. You may define keymaps (changing the way ToME maps your
+keypresses to underlying commands), create macros (allowing you to map a
+single keypress to a series of keypresses), modify the visuals (allowing
+you to change the appearance of monsters, objects, or terrain features),
+change the colors (allowing you to make a given color brighter, darker,
+or even completely different), or set options (turning them off or on).
+
+ ToME stores your preferences in files called "user pref files",
+which contain comments and "user pref commands", which are simple strings
+describing one aspect of the system about which the user has a preference.
+There are many ways to load a user pref file, and in fact, some of these
+files are automatically loaded for you by the game. All of the files are
+kept in the "lib/user/" directory, though you may have to use one of the
+command line arguments to redirect this directory, especially on multiuser
+systems. You may also enter single user pref commands directly, using the
+special "Enter a user pref command" command, activated by "double quote".
+You may have to use the "redraw" command (^R) after changing certain of
+the aspects of the game, to allow ToME to adapt to your changes.
+
+ When the game starts up, after you have loaded an old character,
+or created a new character, some user pref files are loaded automatically.
+First, the "pref.prf" file is loaded. This file contains some user pref
+commands which will work on all platforms. Then one of "font-xxx.prf"
+(for normal usage) or "graf-xxx.prf" (for bitmap usage) is loaded. These
+files contain attr/char changes to allow the monsters, objects, and/or
+terrain features to look "better" on your system. Then the "pref-xxx.prf"
+file is loaded. This file contains pre-defined system specific stuff
+(macros, color definitions, etc). Then, the "user-xxx.prf" file is loaded.
+This file contains user-defined system specific stuff. The "user-xxx.prf"
+file is used as the "default" user pref file in many places. The "xxx" is
+the "system suffix" for your system, taken from the "main-xxx.c" file which
+was used to generate your executable. Finally, the "Race.prf", "Class.prf",
+and "Name.prf" files are loaded, where "Race", "Class", and "Name" are
+replaced by the actual race, class, and name of the current character.
+
+ Several commands allow you to both load existing user pref files,
+create new user pref files, append information to existing user pref files,
+and/or interact with various of the user preferences in a more intuitive
+way than the user pref commands allow. The commands include "Interact with
+macros" (@), "Interact with visuals" (%), and "Interact with colors" (&),
+described below.
+~~~~~106|Pref files|Macros
+#####G--- User Pref Files (Macros) ---
+
+ The "Interact with macros" command allows you to define or remove
+"macros", which are mappings from a single logical keypress to a sequence
+of keypresses, allowing you to use special keys on the keyboard, such as
+function keys or keypad keys, possibly in conjunction with modifier keys,
+to "automate" repetitive multi-keypress commands that you use a lot.
+
+ Since macros represent keypress sequences, and not all keypresses
+have a printable representation, macro triggers and actions must often be
+"encoded" into a human readable form. This is done using several types
+of encoding, including "\xHH" for character number HH in hexidecimal, "\e"
+for the "escape" code, "\n" for the "newline" code, "\r" for the "return"
+code, "\s" for the "space" code, "\\" for backslash, "\^" for caret, and
+"^X" for the code for any "control" key "ctrl-X". Note that the "action"
+of a macro will not be checked against other macro triggers (unless the
+macro action contains a "control-backslash"), so you cannot make infinite
+loops. You may specify extremely long macros, but you are limited in
+length by the underlying input mechanisms, which in general limit you
+to about 1024 keys in both triggers and actions.
+
+ The special "\" command (which must be encoded in macros as "\\")
+is very useful in macros, since it bypasses all keymaps and allows the next
+keystroke to be considered a command in the underlying ToME command set.
+For example, a macro which maps Shift-KP6 to "\" + "." + "6" will induce
+the "run east" behavior, regardless of what keyset the user has chosen, and
+regardless of what keymaps have been defined.
+
+ Macros can be specified in user pref files as a pair of lines, one
+of the form "A:<str>", which defines the encoded macro action, and one of
+the form "P:<str>", which defines the encoded macro trigger.
+
+ A [[[[[Bcommon example of a macro] to cast the first spell in your first spell
+book at the nearest monster would be: \e\e\em1a*t where \e is an escape (to make
+sure you are not still within another command), m1 selects the spell book that
+is inscribed ({) with @m1, a selects the first spell in that book, and *t targets
+the nearest monster.
+
+ More detailed information about specific macros can be found in
+*****macrofaq.txt*0[macrofaq.txt], originally written by Jim Lyon (jplyon@attglobal.net),
+modified for ToME with Jim's permission by Dawnmist
+(angband@dawnmist.8m.com).
+~~~~~107|Pref files|Keymaps
+#####G--- User Pref Files (Keymaps) ---
+
+ The "Interact with macros" command also allows you to define
+"keymaps", which are vaguely related to macros. A keymap maps a single
+keypress to a series of keypresses, which bypass both other keymaps and
+any macros. ToME uses keymaps to map the original and the roguelike
+keysets to the underlying command set, and allows the user to modify or
+add keymaps of their own. Note that all keymap actions must be specified
+using underlying commands, not keypresses from the original or roguelike
+keysets. The original keyset is almost identical to the underlying keyset,
+except that "numbers" are mapped to ";" plus a direction, "5" is mapped to
+",", and a few control-keys are mapped to various things. See "command.txt"
+for the full set of underlying commands. Some uses for keymaps include the
+ability to "disable" a command by mapping it to "\x00",
+
+ Keymaps can be specified in user pref files as line of the form
+"M:<T> <key> <str>", where <T> is the keyset (0/1 for original/roguelike),
+<key> is the encoded trigger key, and <str> is the encoded keymap action.
+~~~~~108|Pref files|Visuals
+#####G--- User Pref Files (Visuals) ---
+
+ You can use the "Interact with visuals" command to change various
+visual information, currently including the choice of what attr/char values
+are used to represent various monsters, objects, or terrain features. Note
+that in combination appropriate support in "main-xxx.c", and with the use of
+the "use_graphics" flag, you may be able to specify that "graphic bitmaps"
+should be used instead of normal "colored characters" for various things.
+
+ When interactively modifying the attr/char values for monsters,
+objects, or terrain features, pressing "n" or "N" will change which entry
+you are changing, pressing "a" or "A" will rotate through the available
+attr values, and pressing "c" or "C" will rotate though the available char
+values. Note that attr/char values with the "high bit" set may induce the
+display of special "graphic" pictures if the "use_graphics" flag is set,
+and your system supports the "use_graphics" flag.
+
+ Note that this command can be abused in various ways, and if you
+must do so, remember that you are only cheating yourself.
+
+ Keymaps can be specified in user pref files as line of the form
+"R:<N>:<A>/<C>" or "K:<N>:<A>/<C>" or "F:<N>:<A>/<C>" or "U:<N>:<A>/<C>".
+~~~~~109|Pref files|Colors
+#####G--- User Pref Files (Colors) ---
+
+ The "Interact with colors" command allows you to change the actual
+internal values used to display various colors. This command may or may
+not have any effect on your machine. Advanced machines may allow you to
+change the actual RGB values used to represent each of the 16 colors used
+by ToME, and perhaps even allow you to define new colors which are not
+currently used by ToME.
+
+ Colors can be specified in user pref files as line of the form
+"V:<N>:<V>:<R>:<G>:<B>".
+~~~~~110|Pref files|Options
+#####G--- User Pref Files (Options) ---
+
+ The "Interact with options" command allows you to turn options
+on or off. You may turn options off or on using the user pref commands
+of the form "X:<option>" or "Y:<option>" respectively.
+
+~~~~~111|Commands|Command descriptions
+#####R=== Command Descriptions ===
+
+ The following command descriptions are listed as the command name
+plus the "underlying command" key. This is followed by the command name
+and "roguelike" keyset key, if different from the underlying command key.
+Then comes a brief description of the command, including information about
+alternative methods of specifying the command in each keyset, when needed.
+Several commands (tunnel, disarm, bash, open) are repeated 99 times if the
+"always_repeat" option is set and no repeat count is given. Some commands
+use the "repeat count" to automatically repeat the command several times,
+while others use the "repeat count" as an "argument", for example, commands
+which need a "quantity" will use the "repeat count" instead of asking for
+a quantity, allowing the use of "0d" for "drop all". Commands which ask
+for a quantity will convert any "letters" into the maximal legal value.
+~~~~~112|Commands|Inventory
+#####R--- Inventory Commands ---
+~~~~~17
+[[[[[GInventory list (i)]
+ Displays a list of objects being carried but not equipped. You
+ can carry up to 23 different items, not counting those in your
+ equipment. Often, many identical objects can be "stacked" into
+ a "pile" which will count as a single item. This is always
+ true of things like potions, scrolls, and food, but you may have
+ to set options to allow wands, staves, and other such objects to
+ stack. Each object has a weight, and if you carry more objects
+ than your strength permits, you will begin to slow down.
+~~~~~9
+[[[[[GEquipment list (e)]
+ Use this command to display a list of the objects currently being
+ used by your character. The number and type of available slots for
+ equipment may vary. A human for example has 15 slots for equipment,
+ each corresponding to a different location on the body, and each of
+ which may contain only a single object at a time, and each of which
+ may only contain objects of the proper "type".
+ If the option "show_labels" is set, the slots are labelled as follows:
+ Wielding (weapon), Shooting (missile launcher or instruments),
+ On finger (ring), Around neck (amulet), Light source (light source),
+ On body (armor), About body (cloak), On arm (shield), On head (helmet),
+ On hands (gloves), On feet (boots), Carrying (symbiote), Quiver (ammo),
+ Using (tool). You must be using an object to receive any of its special
+ powers.
+~~~~~7
+[[[[[GDrop an item (d)]
+ This command drops an item from your inventory or equipment onto the
+ dungeon floor. If the place you are standing on already has objects
+ in it, ToME will attempt to drop the item onto an adjacent space.
+ A floor spot can hold more than one object, but there is still the
+ possibility that if the floor is too full and you attempt to drop
+ something, it may disappear and be destroyed. If the selected pile
+ contains multiple items, you may specify a quantity.
+~~~~~20
+[[[[[GDestroy an item (k) or Destroy an item (^D)]
+ This destroys an item in your inventory or on the dungeon floor.
+ If the selected pile contains multiple objects, you may specify
+ a quantity. You must always verify this command, unless the item
+ is cursed or worthless and the option "auto_destroy" is set.
+~~~~~42
+[[[[[GWear/Wield equipment (w)]
+ To wear or wield an object in your inventory, use this command.
+ Since only one object can be in each slot at a time, if you wear
+ or wield an item into a slot which is already occupied, the old
+ item will be first be taken off, and may in fact be dropped if
+ there is no room for it in your inventory.
+~~~~~36
+[[[[[GTake off equipment (t) or Take off equipment (T)]
+ Use this command to take off a piece of equipment and return it
+ to your inventory. Occasionally, you will run into a cursed item
+ which cannot be removed. These items normally penalise you in some
+ way and cannot be taken off until the curse is removed. If there
+ is no room in your inventory for the item, your pack will overflow
+ and you will drop the item after taking it off.
+~~~~~113|Commands|Movement
+#####R--- Movement Commands ---
+~~~~~67
+[[[[[GWalk (with pickup) (;)]
+ Moves one step in the given direction. The square you are moving
+ into must not be blocked by walls or doors. You will pick up any
+ items in the destination grid if the "always_pickup" option is set,
+ or if the "query_pickup" option is set and you respond correctly.
+ This command can take a count and requires a direction. You may
+ also use the "original" direction keys (both keysets) or the
+ "roguelike" direction keys (roguelike keyset) to walk in a
+ direction.
+~~~~~60
+[[[[[GWalk (flip pickup) (-)]
+ This is just like normal move, except that the "Pick things up"
+ option is inverted. In other words, if you normally pick up
+ anything you encounter (the default), you will not pick things up
+ when using this command. If you normally do not pick things up,
+ you will when using this command. This command can take a count
+ and requires a direction.
+~~~~~76
+[[[[[GRun (.) or Run (,)]
+ This command will move in the given direction, following any bends
+ in the corridor, until you either have to make a "choice" between
+ two directions or you are disturbed. You can configure what will
+ disturb you by setting the disturbance options. Run requires a
+ direction. You may also use shift plus the "roguelike" direction
+ keys (roguelike keyset), or shift plus the "original" direction keys
+ on the keypad (both keysets, some machines) to run in a direction.
+~~~~~74
+[[[[[GGo up staircase (<)]
+ Climbs up an up staircase you are standing on. There is always at
+ least one staircase going up on every level (this doesn't mean it's
+ easy to find) except for the surface, where '<' will bring up the
+ wilderness map. Going up a staircase will take you to a new dungeon
+ level unless you are at the first level of the dungeon, in which case
+ you will return to the surface. Note that whenever you leave a dungeon
+ level, you will never find it again, unless the level contains a dungeon
+ town. This means that for all intents and purposes, any objects on that
+ level are destroyed. This includes unknown artifacts unless the "Create
+ characters in preserve mode" option was set when your character was
+ created, in which case the artifacts may show up again later.
+~~~~~77
+[[[[[GGo down staircase (>)]
+ Descends a down staircase you are standing on. There are always
+ at least two staircases going down on each level, except for the
+ last level of a dungeon, and some "quest" levels, which have none until
+ the quest monsters are killed. Going down a staircase will take you
+ to a new dungeon level. See "Go Up Staircase" for more info.
+
+ This command is also used to enter Void Jumpgates, and to zoom in from
+ the wilderness map.
+~~~~~114|Commands|Resting
+#####R--- Resting Commands ---
+~~~~~72
+[[[[[GStay still (with pickup) (,) or Stay still (with pickup) (.)]
+ Stays in the same square for one move. If you normally pick up
+ objects you encounter, you will pick up whatever you are standing
+ on. This command can take a count. You may also use the "5" key
+ (both keysets).
+~~~~~13
+[[[[[GStay still (flip pickup) (g)]
+ Stays in the same square for one move. If you normally pick up
+ objects you encounter, you will not pick up whatever you are
+ standing on. If you normally do not pick up objects, you will
+ pick up what you are standing on. This command is normally only
+ used when the "always_pickup" option is false. This command can
+ take a count.
+~~~~~33
+[[[[[GRest (R)]
+ Resting is better for you than repeatedly staying still, and can
+ be told to automatically stop after a certain amount of time, or
+ when various conditions are met. In any case, you always wake up
+ when anything disturbing happens, or when you press any key. To
+ rest, enter the Rest command, followed by the number of turns you
+ want to rest, or "*" to rest until your hit points and mana are
+ restored, or "&" to rest until you are fully "healed". This command
+ can take a count, which is used for the number of turns to rest.
+~~~~~61
+[[[[[GEnter store (_)]
+ When standing on the door of a store, this command allows the character
+ to enter the store again.
+~~~~~115|Commands|Searching
+#####R--- Searching Commands ---
+~~~~~34
+[[[[[GSearch (s)]
+ This command can be used to locate hidden traps and secret doors
+ in the spaces adjacent to the player. More than a single turn of
+ searching will be required in most cases. You should always
+ search a chest before trying to open it, since they are generally
+ trapped. This command can take a count, which is useful if you
+ are fairly sure of finding something eventually, since the command
+ stops as soon as anything is found. This command can take a count.
+~~~~~35
+[[[[[GToggle search mode (S) or Toggle search mode (#)]
+ This command will take you into and out of search mode. When
+ first pressed, the message "Searching" will appear at the bottom
+ of the screen. You are now taking two turns for each command, one
+ for the command and one turn to search. This means that you are
+ taking twice the time to move around the dungeon, and therefore
+ twice the food. Search mode will automatically turn off if you
+ are disturbed. You may also turn off search mode by entering the
+ Search Mode command again.
+~~~~~116|Commands|Alteration commands
+~~~~~117|Commands|Terrain interaction
+#####R--- Alter Commands ---
+~~~~~37
+[[[[[GTunnel (T) or Tunnel (^T)]
+ Tunnelling or mining is a very useful art. There are many kinds of
+ rock, with varying hardness, including permanent rock (permanent),
+ granite (very hard), quartz veins (hard), magma veins (soft), and
+ rubble (very soft). Quartz and Magma veins may be displayed in a
+ special way, and may sometimes contain treasure, in which case they
+ will be displayed in a different way. Rubble sometimes covers an
+ object. It is only possible to tunnel if you are wielding a digging
+ tool such as a shovel or a pick. Tunnelling ability increases with
+ strength and tool weight. This command can take a count, requires a
+ direction, and is affected by the "always_repeat" option.
+~~~~~26
+[[[[[GOpen a door or chest (o)]
+ To open an object such as a door or chest, you must use this
+ command. If the object is locked, you will attempt to pick the
+ lock based on your disarming ability. If you open a trapped chest
+ without disarming the traps first, the trap will be set off. Some
+ doors will be jammed shut and may have to be forced open. You may
+ need several tries to open a door or chest. Open can take a count,
+ requires a direction, and is affected by the "always_repeat" option.
+~~~~~5
+[[[[[GClose a door (c)]
+ Non-intelligent and some other creatures cannot open doors, so
+ shutting doors can be quite valuable. Broken doors cannot be closed.
+ Bashing a door open may break it. Close can take a count, requires a
+ direction, and is affected by the "always_repeat" option.
+~~~~~19
+[[[[[GJam a door (j) or Spike a door (S)]
+ Many monsters can simply open closed doors, and can eventually
+ get through a locked door. You may therefore occasionally want
+ to jam a door shut with iron spikes. Each spike used on the door
+ will make it harder to bash down the door, up to a certain limit.
+ Smaller monsters are less able to bash down doors. In order to
+ use this command, you must be carrying iron spikes. Jam or Spike
+ requires a direction.
+~~~~~4
+[[[[[GBash a door (B) or Force a door (f)]
+ This command allows you to bash down jammed doors. Your bashing
+ ability increases with strength. Bashing open a door can (briefly)
+ throw you off balance. Doors that are stuck, or which have been
+ jammed closed with spikes can only be opened by bashing, and all
+ closed doors can be bashed open if desired. Bashing a door open
+ may permanently break it so that it can never be closed. Bash or
+ Force can take a count, requires a direction, and is affected by
+ the "always_repeat" option.
+~~~~~8
+[[[[[GDisarm a trap or chest (D)]
+ You can attempt to disarm traps on the floor or on chests. If you
+ fail, there is a chance that you will blunder and set it off. You
+ can only disarm a trap after you have found it (usually with the
+ Search command). Disarm can take a count, requires a direction,
+ and is affected by the "always_repeat" option.
+~~~~~63
+[[[[[GAlter (+)]
+ This special command allows the use of a single keypress to select
+ any of the "obvious" commands above (attack, tunnel, bash, open,
+ disarm, close), and, by using macros or keymaps, to combine this
+ keypress with directions. In general, this allows the use of the
+ "control" key plus the appropriate "direction" key (including the
+ roguelike direction keys in roguelike mode) as a kind of generic
+ "alter the terrain feature of an adjacent grid" command. Alter
+ can take a count, requires a direction, and is affected by the
+ "always_repeat" option.
+~~~~~43
+[[[[[GEngrave the floor (x)]
+ The dungeon is full of magics, and as such pools of it collect on
+ the floor in places. With the "inscribe" command, it is possible
+ to create some spell effects by inscribing words you have read from
+ various parchments detailing the languages used within the dungeon.
+ Then, if there is enough mana collected on that square, walking over
+ the inscription will trigger the spell. Some spells can be triggered
+ only by the player, some only by monsters, and some are triggered by
+ both.
+~~~~~46
+[[[[[GSteal (Z)]
+ Allows the player to try to steal items from shops. Also allows
+ rogues to steal from monsters.
+~~~~~118|Commands|Spells and prayers
+#####R--- Spell and Prayer Commands ---
+~~~~~3
+[[[[[GBrowse a book (b) or Peruse a book (P)]
+ Only characters with some knowledge in the magic schools, such as
+ mages, priests, rogues, and rangers, can read magic spellbooks.
+ Warriors normally cannot read any books. When this command is used,
+ all of the spells or prayers contained in the selected book are
+ displayed, along with information such as their level, the amount of
+ mana or piety required to cast them, and whether or not you know the
+ spell or prayer.
+~~~~~14
+[[[[[GGain new skills (G)]
+ Use this command to access the skills menu and spend the skill points
+ you gain at each new character level to increase the range of things
+ your character is able to do.
+~~~~~91
+[[[[[GGain new abilities (N)]
+ Use this command to access the Abilities menu and spend the skill points
+ you gain at each new character level to increase the range of things
+ your character is able to do.
+~~~~~24
+[[[[[GCast a spell / Pray a prayer (m) / Use a mental power]
+ To cast a spell or prayer, you must have the skill level required in
+ that school of magic to be able access that spell, and a book that
+ contains that spell in your inventory (for most schools). Each spell
+ has a chance of failure which starts out fairly large but decreases
+ as you gain levels. If you don't have enough mana to cast a spell,
+ you will be told you do not have enough mana to cast it. Since in most
+ cases you must read the spell from a book, you cannot be blind or
+ confused while casting, and there must be some light present.
+
+ Some classes (for example, Thaumaturgists) have the ability to use
+ some magic without actually needing spell books of any sort. These
+ classes are able to access their magical powers through the use of
+ the 'm' command.
+~~~~~39
+[[[[[GUse bonus power (if any) (U) or (O)]
+ Some races and classes have special natural abilities. All of these
+ possible abilities are listed in an index under the U (or O) command.
+ These type of abilities can include the Vampire's bite, a DeathMold's
+ telekinesis, and a RohanKnight's light speed capabilities.
+~~~~~119|Commands|Object manipulation
+#####R--- Object Manipulation Commands ---
+~~~~~10
+[[[[[GEat some food (E)]
+ You must eat regularly to prevent starvation. As you grow hungry,
+ a message will appear at the bottom of the screen saying "Hungry".
+ If you go hungry long enough, you will become weak, then start
+ fainting, and eventually, you may will die of starvation. You
+ may use this command to eat food in your inventory. Note that
+ you can sometimes find food in the dungeon, or you can butcher
+ corpses of killed creatures to obtain raw meat, but it is not
+ always wise to eat strange food.
+~~~~~12
+[[[[[GFuel your lantern/torch (F)]
+ If you are using a torch and have more torches in your pack,
+ or you are using a lantern and have flasks of oil in your pack,
+ then your can "refuel" them with this command. Torches and Lanterns
+ are limited in their maximal fuel. In general, two flasks will fully
+ fuel a lantern and two torches will fully fuel a torch.
+~~~~~30
+[[[[[GQuaff a potion (q)]
+ Use this command to drink a potion. Potions affect the player in
+ various ways, but the effects are not always immediately obvious.
+~~~~~32
+[[[[[GRead a scroll (r)]
+ Use this command to read a scroll. Scroll spells usually have an
+ area effect, except for a few cases where they act on other objects.
+ Reading a scroll causes the parchment to disintegrate as the scroll
+ takes effect, unless you are an Alchemist. Most scrolls which prompt
+ for more information can be aborted (by pressing escape), which will
+ stop reading the scroll before it disintegrates.
+~~~~~58
+[[[[[GInscribe an object ({)]
+ This command inscribes a string on an object. The inscription is
+ displayed inside curly braces after the object description. The
+ inscription is limited to the particular object (or pile) and is
+ not automatically transferred to all similar objects. Under certain
+ circumstances, ToME will display "fake" inscriptions on certain
+ objects ("cursed", "broken", "tried", "empty", "NN% off") when
+ appropriate. These "fake" inscriptions are "covered up" by real
+ inscriptions, but will re-appear if the real inscription is removed.
+ In addition, ToME will occasionally place a "real" inscription on
+ an object for you, normally as the result of your character getting
+ a "feeling" about the item. All characters will get "feelings" about
+ weapons and armor after carrying them for a while. Warriors get the
+ most detailed feelings, and get them quicker than any other class.
+ An item labeled as "{empty}" was found to be out of charges, and an
+ item labeled as "{tried}" is a "flavoured" item which the character
+ has used, but whose effects are unknown. Certain inscriptions have
+ a meaning to the game, see "@#", "@x#", "!*", and "!x", in the section
+ on *****command.txt*90[inventory object selection.]
+~~~~~59
+[[[[[GUninscribe an object (})]
+ This command removes the inscription on an object. This command will
+ have no effect on "fake" inscriptions added by the game itself.
+~~~~~15
+[[[[[GHack up a corpse (h or $)]
+ Corpses can be cut up into smaller pieces of meat, allowing the user to
+ eat the meat, or cure it for later use.
+~~~~~21
+[[[[[GCure meat (K)]
+ Curing meat requires the use of a potion of salt water, and is used to
+ protect meat from hacked-up corpses from going bad.
+~~~~~16
+[[[[[GDrink from a fountain (H)]
+ All fountains in Arda are magical, and act like magical potions. The
+ game will ask you whether you want to quaff from a fountain or to fill
+ empty bottles. The only way to identify the type of fountain is to
+ fill your bottles from it and see what you get.
+~~~~~44
+[[[[[GGive item to monster (y)]
+ This command is used to give an item within your inventory to a monster
+ standing next to you. The monster may not accept the item you give it,
+ however.
+~~~~~96
+[[[[[GChat (Y)]
+ This command allows you to chat with someone. Be warned that most
+ monsters won't chat
+
+#####R--- Magical Object Commands ---
+~~~~~2
+[[[[[GActivate an artifact (A)]
+ You have heard rumours of special weapons and armour deep in the
+ Pits, items that can let you breath fire like a dragon or light
+ rooms with just a thought. Should you ever be lucky enough to
+ find such an item, this command will let you activate its special
+ ability. Special abilities can only be used if you are wearing or
+ wielding the item.
+ Note that there are also a few common objects that can be activated,
+ e.g. music instruments, monster eggs and spell-storing mage staves,
+ and that some artifacts, so-called "junkarts", can't be wielded, but
+ must be activated from the backpack.
+~~~~~1
+[[[[[GAim a wand (a) or Zap a wand (z)]
+ Wands must be aimed in a direction to be used. Wands are magical
+ devices, and therefore there is a chance you will not be able to
+ figure out how to use them if you aren't good with magical
+ devices. They will fire a shot that affects the first object or
+ creature encountered or fire a beam that affects anything in a
+ given direction, depending on the wand. An obstruction such as a
+ door or wall will generally stop the effects from traveling any
+ farther. This command requires a direction and can use a target.
+~~~~~38
+[[[[[GUse a staff (u) or Zap a staff (Z)]
+ This command will use a staff. A staff is normally very similar
+ to a scroll, in that they normally either have an area effect or
+ affect a specific object. Staves are magical devices, and there
+ is a chance you will not be able to figure out how to use them.
+~~~~~45
+[[[[[GZap a rod (z) or Activate a rod (a)]
+ Rods are extremely powerful magical items, which cannot be burnt
+ or shattered, and which can have either staff-like or wand-like
+ effects, but unlike staves and wands, they don't have charges.
+ Instead, they draw on the ambient magical energy to recharge
+ themselves, and therefore can only be activated once every few
+ turns. The recharging time varies depending on the type of rod.
+ This command may require a direction (depending on the type of
+ rod, and whether you are aware of its type) and can use a target.
+~~~~~120|Commands|Throwing and missile weapons
+#####R--- Throwing and Missile Weapons ---
+~~~~~11
+[[[[[GFire an item (f) or Fire an item (t)]
+ You may throw any object carried by your character. Depending on
+ the weight, it may travel across the room or drop down beside you.
+ Only one object from a pile will be thrown at a time. Note that
+ throwing an object will often cause it to break, so be careful!
+ If you throw something at a creature, your chances of hitting it
+ are determined by your pluses to hit, your ability at throwing,
+ and the object's pluses to hit. Once the creature is it, the
+ object may or may not do any damage to it. You've heard rumors
+ that some objects found in the dungeon can do huge amounts of
+ damage when thrown, but you're not sure which objects those
+ are.... Note that flasks of oil will do a fairly large chunk
+ of damage to a monster on impact, supposedly representing fire
+ damage, but it works against fire elementals too... If you are
+ wielding a missile launcher compatible with the object you are
+ throwing, then you automatically use the launcher to fire the
+ missile with much higher range, accuracy, and damage, then you
+ would get by just throwing the missile. Fire or Throw requires
+ a direction. Targeting mode (see the next command) can be invoked
+ with "*" at the "Direction?" prompt.
+~~~~~40
+[[[[[GThrow an item (v)]
+ You may throw any object carried by your character. The lighter
+ the object, the farther you can throw it. Only one object from a
+ stack may be thrown at a time. Throwing an object may break it.
+ If you throw something at a monster, your chances of hitting it
+ are determined by your pluses to hit, your ability at throwing,
+ and the object's pluses to hit. If the object hits the monster,
+ it may or may not do damage. Some objects, such as weapons, or
+ flasks of oil, can do a substantial amount of damage. This
+ command requires a direction, and can take a target.
+~~~~~55
+[[[[[GTargeting Mode (*)]
+ This will allow you to aim your spells and such at a specific
+ monster or grid, so that you can point directly towards that
+ monster or grid (even if this is not a "compass" direction) when
+ you are asked for a direction. You can set a target using this
+ command, or you can set a new target at the "Direction?" prompt when
+ appropriate. At the targeting prompt, you have many options. First
+ of all, targetting mode starts targetting nearby monsters which can
+ be reached by "projectable" spells and thrown objects. In this mode,
+ you can press "t" (or "5" or ".") to select the current monster,
+ space to advance to the next monster, "-" to back up to the previous
+ monster, direction keys to advance to a monster more or less in that
+ direction, "r" to "recall" the current monster, "q" to exit targetting
+ mode, and "p" (or "o") to stop targetting monsters and enter the mode
+ for targetting a location on the floor or in a wall. Note that if
+ there are no nearby monsters, you will automatically enter this mode.
+ Note that hitting "o" is just like "p", except that the location
+ cursor starts on the last examined monster instead of on the player.
+ In this mode, you use the "direction" keys to move around, and the
+ "q" key to quit, and the "t" (or "5" or ".") key to target the cursor
+ location. Note that targetting a location is slightly "dangerous",
+ as the target is maintained even if you are far away. To cancel an
+ old target, simply hit "*" and then ESCAPE (or "q"). Note that when
+ you cast a spell or throw an object at the target location, the path
+ chosen is the "optimal" path towards that location, which may or may
+ not be the path you want. Sometimes, by clever choice of a location
+ on the floor for your target, you may be able to convince a thrown
+ object or cast spell to squeeze through a hole or corridor that is
+ blocking direct access to a different grid. Launching a ball spell
+ or breath weapon at a location in the middle of a group of monsters
+ can often improve the effects of that attack, since ball attacks are
+ not stopped by interposed monsters if the ball is launched at a target.
+ This command takes no time.
+~~~~~121|Commands|Looking
+#####R--- Looking Commands ---
+~~~~~25
+[[[[[GFull screen map (M)]
+ This command will show a map of the entire dungeon, reduced by a
+ factor of nine, on the screen. Only the major dungeon features
+ will be visible because of the scale, so even some important
+ objects may not show up on the map. This is particularly useful
+ in locating where the stairs are relative to your current
+ position, or for identifying unexplored areas of the dungeon.
+ This command takes no time.
+~~~~~23
+[[[[[GLocate player on map (L) or Where is the player (W)]
+ This command lets you scroll your map around, looking at all sectors
+ of the current dungeon level, until you press escape, at which point
+ the map will be re-centred on the player if necessary. To scroll
+ the map around, simply press any of the "direction" keys. The top
+ line will display the sector location, and the offset from your
+ current sector. This command takes no time.
+~~~~~22
+[[[[[GLook around (l) or Examine things (x)]
+ This command is used to look around at nearby monsters (to determine
+ their type and health) and objects (to determine their type). It is
+ also used to find out what objects (if any) are under monsters, and
+ if a monster is currently inside a wall. This command takes no time.
+ When you are looking at something, you may hit space for more details,
+ or to advance to the next interesting monster or object, or minus ("-")
+ to go back to the previous monster or object, or a direction key to
+ advance to the nearest interesting monster or object (if any) in that
+ general direction, or "r" to recall information about the current
+ monster race, or "q" or escape to stop looking around. You always
+ start out looking at the "nearest" interesting monster or object.
+~~~~~18
+[[[[[GObserve an item (I)]
+ This command lets you observe a previously *identified* item.
+ This will tell you things about the special powers of the object.
+ Currently, it only makes sense for artifacts and ego-items.
+~~~~~122|Commands|Messages
+#####R--- Message Commands ---
+~~~~~53
+[[[[[GRepeat level feeling (^F)]
+ Repeats the feeling about the dungeon level that you got when you
+ first entered the level.
+~~~~~62
+[[[[[GView previous messages (^P)]
+ This command shows you all the recent messages. You can scroll
+ through them, or exit with ESCAPE. This command takes no time.
+~~~~~69
+[[[[[GTake notes (:)]
+ This command allows you to take notes, which will then appear in your
+ note file, if the birth-option "take_notes" was set (the default), or
+ in your message list (prefixed with "Note:"), if the option was not set.
+ The note file can be displayed through the "Display Current Knowledge"
+ command (~ or |). This command takes no time.
+~~~~~123|Commands|Game status
+#####R--- Game Status Commands ---
+~~~~~6
+[[[[[GCharacter Description (C)]
+ Brings up a full description of your character, including your
+ skill levels, your current and potential stats, and various other
+ information. From this screen, you can change your name or use
+ the file character description command to save your character
+ status to a file. That command saves additional information,
+ including your background, your inventory, and the contents of
+ your house.
+~~~~~82
+[[[[[GDisplay Current Knowledge (~ or |)]
+ The command opens a menu from which you can lookup information
+ collected so far. This includes known artifacts, unique monsters,
+ identified objects, killed creatures, recall depths, acquired
+ corruptions, current pets, current quests, current fates, known
+ traps, known dungeon towns and last but not least the note file.
+
+ Display known artifacts
+ This selection lists all of the artifacts that you have encountered.
+ Any artifact that appears in this list, which you cannot seem to
+ find, has been lost forever. The "preserve" mode will prevent
+ you from accidentally losing any artifacts, but will also prevent
+ you from ever getting a "special" level feeling.
+
+ Display known uniques
+ Brings up a list of known unique monsters, plus their current
+ status. Once killed, unique monsters never show up again, with a
+ few remarkable exceptions.
+
+ Display known objects
+ This list all 'flavoured' objects (such as rings, scrolls, wands,
+ potions, etc.) which you have identified.
+
+ Display kill count
+ This lists all killed creatures together with a total kill count.
+
+ Display recall depths
+ This lists all recall depths of entered dungeons as well as marks
+ the current recall dungeon with an asterisk.
+
+ Display corruptions
+ This lists all acquired corruptions with their beneficial and
+ detrimental effects.
+
+ Display current pets
+ Display current quests
+ Display current fates
+ Display known traps
+ Display known dungeon towns
+
+ Display notes
+ If the option "take_notes" is set shows you your notes file, where all
+ remarkable events are noted. You can add notes yourself by using the
+ "Take notes" command (:).
+
+~~~~~70
+[[[[[GTime of the day (^T)]
+ This command is used to give the current date and time within the game.
+ Extremely useful for characters such as Vampires to check whether
+ it is safe to leave the dungeon.
+~~~~~124|Commands|Saving and Exiting
+~~~~~125|Saving and Exiting
+#####R--- Saving and Exiting Commands ---
+~~~~~75
+[[[[[GSave and Quit (Ctrl-X)]
+ To save your game so that you can return to it later, use this
+ command. Save files will also be generated (hopefully) if the
+ game crashes due to a system error. After you die, you can use
+ your savefile to play again with the same options and such.
+~~~~~68
+[[[[[GSave (Ctrl-S)]
+ This command saves the game but doesn't exit ToME. Use this
+ frequently if you are paranoid about having the computer crash
+ while you are playing.
+~~~~~31
+[[[[[GQuit (commit suicide) (Q)]
+ Kills your character and exits ToME. You will be prompted to
+ make sure you really want to do this, and then asked to verify
+ that choice. Note that dead characters are dead forever.
+~~~~~126|Commands|Pref files
+~~~~~127|Pref files|Commands
+#####R--- User pref file commands ---
+~~~~~65
+[[[[[GInteract with options (=)]
+ Allow you to interact with options. Note that using the "cheat"
+ options may mark your savefile as unsuitable for the high score
+ list. You may change normal options using the "X" and "Y" user
+ pref commands. You must use the "redraw" command (^R) after
+ changing certain options.
+~~~~~49
+[[[[[GInteract with macros (@)]
+ Allow you to interact with macros. You may load or save macros
+ from user pref files, create macros of various types, or define
+ keymaps. You must define a "current action", shown at the bottom
+ of the screen, before you attempt to use any of the "create macro"
+ commands, which use that "current action" as their action. This
+ is a horrible interface, and will be fixed eventually.
+~~~~~51
+[[[[[GInteract with visuals (%)]
+ Allow you to interact with visuals. You may load or save visuals
+ from user pref files, or modify the attr/char mappings for the
+ monsters, objects, and terrain features. You must use the "redraw"
+ command (^R) to redraw the map after changing attr/char mappings.
+~~~~~54
+[[[[[GInteract with colors (&)]
+ Allow the user to interact with colors. This command only
+ works on some systems.
+~~~~~47
+[[[[[GInteract with the system (!)]
+ Allow the user to interact with the underlying visual system.
+ This command is currently unused.
+~~~~~71
+[[[[[GEnter a user pref command (")]
+ ToME stores your preferences in files called "user pref files",
+ which contain comments and "user pref commands", which are simple strings
+ describing one aspect of the system about which the user has a preference.
+ You may enter single user pref commands directly, using the special "Enter
+ a user pref command" command, activated by "double quote". You may have to
+ use the "redraw" command (^R) after changing certain of the aspects of the
+ game, to allow ToME to adapt to your changes.
+~~~~~128|Commands|Help
+#####R--- Help ---
+~~~~~84
+[[[[[GHelp (?)]
+ Brings up the ToME on-line help system. Note that the help
+ files are just text files in a particular format, and that other
+ help files may be available on the Net. In particular, there are
+ a variety of spoiler files which do not come with the standard
+ distribution. Check the place you got ToME from or ask on the
+ newsgroup rec.games.roguelike.angband about them.
+~~~~~83
+[[[[[GIdentify Symbol (/)]
+ Use this command to find out what a character stands for. For
+ instance, by pressing "/.", you can find out that the "." symbol
+ stands for a floor spot. When used with a symbol that represents
+ creatures, the this command will tell you only what class of
+ creature the symbol stands for, not give you specific information
+ about a creature you can see. To get that, use the Look command.
+
+ There are three special symbols you can use with the Identify
+ Symbol command to access specific parts of your monster memory.
+ Typing Ctrl-A when asked for a symbol will recall details about
+ all monsters, typing Ctrl-U will recall details about all unique
+ monsters, and typing Ctrl-N will recall details about all
+ non-unique monsters.
+
+ If the character stands for a creature, you are asked if you want
+ to recall details. If you answer yes, information about the
+ creatures you have encountered with that symbol is shown in the
+ Recall window if available, or on the screen if not. You can also
+ answer "k" to see the list sorted by number of kills, or "p" to
+ see the list sorted by dungeon level the monster is normally found
+ on. Pressing ESCAPE at any point will exit this command.
+~~~~~41
+[[[[[GGame Version (V)]
+ This command will tell you what version of ToME you are using.
+ For more information, see the "version.txt" help file.
+
+~~~~~129|Commands|Extras
+#####R--- Extra Commands ---
+~~~~~85
+[[[[[GRepeat last command (n)]
+ This will automatically repeat the last command you inputted.
+~~~~~27
+[[[[[GSacrifice at an altar (O)]
+ Altars are places dedicated to the worship of a particular God. To
+ start worshipping the God who owns the altar, you must first sacrifice
+ on their altar.
+
+ Be warned, not all Gods are equal in power, and once you have selected
+ a God to worship, it is almost impossible to change which God you worship.
+ When your God is happy with you, you will receive more benefits from them.
+ Your God's happiness will decrease over time, so you will need to accomplish
+ deeds that increase your standing. Note that there is no requirement
+ for most classes to worship any God. (See *****gods.txt*0[gods.txt] for more information)
+~~~~~28
+[[[[[GPray to your God (p)]
+ If you worship a God, you have the option of praying. The effects of
+ praying differ considerably depending on the god, ranging from the
+ battle frenzy of paladins to the self-healing powers of druids.
+ However, Gods do not like being disturbed, with negative effects on
+ your piety. See *****gods.txt*0[gods.txt] for more information.
+~~~~~29
+[[[[[GPet commands (P)]
+ From time to time, you may acquire a pet within the dungeon. Pets are able
+ (to a more or less limited extent) to follow some simple commands, like
+ follow me. These commands are all accessed through the menu under "Pet
+ Commands".
+~~~~~52
+[[[[[GToggle Choice Window (^E)]
+ Toggles the display in the choice window (if available) between
+ your inventory and your equipment. This command only applies if
+ you are running ToME under a windowing environment and the
+ choice window is available. This also redraws the choice window.
+~~~~~66
+[[[[[GRedraw Screen (^R)]
+ This command adapts to various changes in global options, and
+ redraws all of the windows. This command should be used after
+ changing various global properties (options, attr/char mappings,
+ color definitions, etc). When in doubt, use it.
+~~~~~56
+[[[[[GLoad screen dump (left-paren)]
+ This command loads a "snap-shot" of the current screen from the file
+ "dump.txt", and displays it on the screen.
+~~~~~57
+[[[[[GSave screen dump (right-paren)]
+ This command dumps a "snap-shot" of the current screen to the file
+ "dump.txt", including encoded color information.
+~~~~~64
+[[[[[GQuit to next midi song (^Q)]
+ In the DOS binary (and maybe Windows) of ToME, it is possible for
+ the game to play any midi song in the lib/xtra/music directory. This
+ command allows the player to force the game to finish the current song
+ and move on to another one (i.e. if you are tired of hearing the current
+ song, you can change it).
+~~~~~80
+[[[[[GDo cmovies (|)]
+ The cmovie command (press | key in both normal or roguelike set) allows
+ you to make a "movie" that you can send to people showing your movement
+ through a part of the dungeon (like clearing that GCV . . .)
+
+ It asks for a name (it will add the extension itself) and then if you wish
+ to play or record it.
+
+ The cmovie files (.cmv) are located in lib/cmov, note that they quickly
+ become huge and so you REALLY should compress them before sending to friends.
+~~~~~97
+[[[[[GRecord macros ($)]
+ This is an easier way to create macros. Activate it, press the key
+ sequence for your macro, reactivate it and it will create the macro
+ for you. Note than when possible using the @ key at item selection
+ is a good idea since it removes the need to inscribe items.
+~~~~~98
+[[[[[GTake html screenshot (^\])]
+ Creates an html screenshot of the current screen.
+~~~~~89
+[[[[[GBegin extended command (#)]
+ Begins an extended command. Type "help" or "?" at the prompt for a
+ list of these commands.
+
+--
+Original: Alexander Cutler and Andy Astrand
+Updated (2.7.6): Russ Allbery (rra@cs.stanford.edu)
+Updated (2.7.9): Ben Harrison (benh@phial.com)
+Updated PernAngband 5.x.x: Dawnmist (angband@dawnmist.8m.com)
+Updated for ToME 2.1
diff --git a/lib/mods/theme/help/corspoil.txt b/lib/mods/theme/help/corspoil.txt
new file mode 100644
index 00000000..baac4fae
--- /dev/null
+++ b/lib/mods/theme/help/corspoil.txt
@@ -0,0 +1,136 @@
+~~~~~01|Corruptions (Spoiler)
+~~~~~02|Spoilers|Corruptions
+#####R=== ToME Corruptions Spoiler ===
+
+Sometimes adventurers become exposed to the dark powers of Morgoth. If they
+are unable to resist these powers, they become corrupted. Corruptions can
+change their physical or mental abilities, some of which can be good, and
+some bad. Most corruptions will affect you permanently, although some only
+operate when they are activated (whether by player choice or as a random
+event). You can check which corruptions do you have in the knowledge screen
+6 (accessed through the '~' menu) or in a character dump.
+
+#####GGaining and (not) losing corruptions
+There are several ways that you can become corrupted.
+
+You can become corrupted by quaffing a Potion of Corruption or by drinking
+from a Fountain of Corruption. Also some strange items can be activated
+for corruption.
+
+Corruptions are permanent. Once you have one, you have it for life.
+
+[[[[[BBalrog Aura]
+ Surrounds you with a fiery aura
+ But it can burn scrolls when you read them
+[[[[[GGain message: A corrupted wall of flames surrounds you.]
+[[[[[RLose message: The wall of corrupted flames abandons you.]
+
+
+[[[[[BBalrog Wings]
+ Creates ugly, but working, wings allowing you to fly
+ But it reduces charisma by 4 and dexterity by 2
+[[[[[GGain message: Wings of shadow grow in your back.]
+[[[[[RLose message: The wings in your back fall apart.]
+
+
+[[[[[BBalrog Strength]
+ Provides 3 strength and 1 constitution
+ But it reduces charisma by 1 and dexterity by 3
+[[[[[GGain message: Your muscles get unnatural strength.]
+[[[[[RLose message: Your muscles get weaker again.]
+
+
+[[[[[BBalrog Form]
+ Allows you to turn into a Balrog at will
+ You need Balrog Aura, Balrog Wings and Balrog Strength to activate it
+[[[[[GGain message: You feel the might of a Balrog inside you.]
+[[[[[RLose message: The presence of the Balrog seems to abandon you.]
+It depends on:
+ Balrog Aura
+ Balrog Wings
+ Balrog Strength
+
+
+[[[[[BDemon Spirit]
+ Increases your intelligence by 1
+ But reduce your charisma by 2
+[[[[[GGain message: Your spirit opens to corrupted thoughts.]
+[[[[[RLose message: Your spirit closes again to the corrupted thoughts.]
+
+
+[[[[[BDemon Hide]
+ Increases your armour class by your level
+ Provides immunity to fire at level 40
+ But reduces speed by your level / 7
+[[[[[GGain message: Your skin grows into a thick hide.]
+[[[[[RLose message: Your skin returns to a natural state.]
+
+
+[[[[[BDemon Breath]
+ Provides fire breath
+ But gives a small chance to spoil potions when you quaff them
+[[[[[GGain message: Your breath becomes mephitic.]
+[[[[[RLose message: Your breath is once again normal.]
+
+
+[[[[[BDemon Realm]
+ Provides access to the demon school skill and the use of demonic equipment
+ You need Demon Spirit, Demon Hide and Demon Breath to activate it
+[[[[[GGain message: You feel more attuned to the demon realm.]
+[[[[[RLose message: You lose your attunement to the demon realm.]
+It depends on:
+ Demon Spirit
+ Demon Hide
+ Demon Breath
+
+
+[[[[[BRandom teleportation]
+ Randomly teleports you around
+[[[[[GGain message: Space seems to fizzle around you.]
+[[[[[RLose message: Space solidify again around you.]
+It is opposed to:
+ Anti-teleportation
+
+
+[[[[[BAnti-teleportation]
+ Prevents all teleportations, be it of you or monsters
+[[[[[GGain message: Space continuum freezes around you.]
+[[[[[RLose message: Space continuum can once more be altered around you.]
+It is opposed to:
+ Random teleportation
+
+
+[[[[[BTroll Blood]
+ Troll blood flows in your veins, granting increased regeneration
+ It also enables you to feel the presence of other troll beings
+ But it will make your presence more noticeable and aggravating
+[[[[[GGain message: Your blood thickens, you sense corruption in it.]
+[[[[[RLose message: Your blood returns to a normal state.]
+
+
+[[[[[BVampiric Teeth]
+ Your teeth allow you to drain blood to feed yourself
+ However your stomach now only accepts blood.
+[[[[[GGain message: You grow vampiric teeth!]
+It is not removable.
+
+
+[[[[[BVampiric Strength]
+ Your body seems somewhat dead
+ In this near-undead state it has improved strength, constitution and
+ intelligence, but also reduced dexterity, wisdom and charisma.
+[[[[[GGain message: Your body seems more dead than alive.]
+It is not removable.
+It depends on:
+ Vampiric Teeth
+
+
+[[[[[BVampire]
+ You are a Vampire. As such you resist cold, poison, darkness and nether.
+ Your life is sustained, but you cannot stand the light of the sun.
+[[[[[GGain message: You die to be reborn in a Vampire form.]
+It is not removable.
+It depends on:
+ Vampiric Strength
+
+
diff --git a/lib/mods/theme/help/debug.txt b/lib/mods/theme/help/debug.txt
new file mode 100644
index 00000000..56d57098
--- /dev/null
+++ b/lib/mods/theme/help/debug.txt
@@ -0,0 +1,278 @@
+|||||oy
+~~~~~99|Debug
+#####R=== Debug Commands ===
+
+
+Debug commands are entered as an "underlying command" (a single key)
+plus a variety of optional or required arguments.
+
+The debug commands are used for debugging and experimenting. The game
+will not be scored if you use debug commands.
+
+~~~~~100|Debug|Command List
+#####R=== Command List Summary ===
+
+ *****debug.txt*1[a Autorestore] *****debug.txt*2[A Show all stats]
+ *****debug.txt*3[b Teleport to target] *****debug.txt*4[B HP to zero]
+ *****debug.txt*5[c Create object] *****debug.txt*6[C Create artifact]
+ *****debug.txt*7[d Detect all] *****debug.txt*8[D Teleport to the wilderness]
+ *****debug.txt*9[e Edit character attributes] *****debug.txt*10[E Change grid's mana]
+ *****debug.txt*11[f *IDENTIFY*] *****debug.txt*12[F Features]
+ *****debug.txt*13[g Create good item] G (unused)
+ *****debug.txt*15[h Change life rating] *****debug.txt*16[H Hostile monster creation]
+ *****debug.txt*17[i Identify] I (unused)
+ *****debug.txt*19[j Jump to other level] J (unused)
+ *****debug.txt*21[k Check attributes] K (unused)
+ *****debug.txt*23[l Learn about objects] L (unused)
+ *****debug.txt*25[m Magic Mapping] *****debug.txt*26[M Gain corruption]
+ *****debug.txt*27[n Summon named monster] *****debug.txt*28[N Summon _friendly_ named monster]
+ *****debug.txt*29[o Edit object attributes] O (unused)
+ *****debug.txt*31[p Phase door] *****debug.txt*32[P Panic save]
+ *****debug.txt*33[q Get a quest] Q (unused)
+ *****debug.txt*35[r Gain reward] *****debug.txt*36[R Create a trap]
+ *****debug.txt*37[s Summon monster] *****debug.txt*38[S Change the feature of the map]
+ *****debug.txt*39[t Teleport] *****debug.txt*40[T Teleport to a town]
+ *****debug.txt*41[u Complete map] *****debug.txt*42[U Become undead]
+ *****debug.txt*43[v Random artifact/ego item] V (unused)
+ *****debug.txt*45[w Wizard light the level] *****debug.txt*46[W Wish]
+ *****debug.txt*47[x XP boost] X (unused)
+ y (unused) Y (unused)
+ *****debug.txt*51[z Zap monsters] Z (unused)
+ ! (unused) ^A (unused)
+ *****debug.txt*55[@ Increment monster level] ^B (unused)
+ # (unused) ^C (unused)
+ $ (unused) ^D (unused)
+ % (unused) ^E (unused)
+ ^ (unused) ^F (unused)
+ & (unused) ^G (unused)
+ *****debug.txt*61[* Lose special powers] ^H (unused)
+ ( (unused) ^I (unused)
+ ) (unused) ^J (unused)
+ { (unused) ^K (unused)
+ } (unused) ^L (unused)
+ [ (unused) ^M (unused)
+ ] (unused) ^N (unused)
+ *****debug.txt*67[- Create object] ^O (unused)
+ *****debug.txt*69[_ The path to the god dark] ^P (unused)
+ *****debug.txt*71[+ Gain a fate] ^Q (unused)
+ *****debug.txt*73[= Align monster] ^R (unused)
+ ; (unused) ^S (unused)
+ : (unused) ^T (unused)
+ ' (unused) ^U (unused)
+ *****debug.txt*75[" Create spoiler] ^V (unused)
+ , (unused) ^W (unused)
+ < (unused) ^X (unused)
+ . (unused) ^Y (unused)
+ *****debug.txt*81[> Lua script] ^Z (unused)
+ \ (unused) | (unused)
+ ` (unused) ~ (unused)
+ *****debug.txt*91[/ Summon monster] *****debug.txt*92[? Help]
+ ^\ (unused)
+
+~~~~~111|Debug|Command descriptions
+#####R=== Command Descriptions ===
+
+ The following command descriptions are listed as the command name
+plus the "underlying command" key. Then comes a brief description of the
+command. Some commands use the "repeat count" to automatically repeat the
+command several times, while others use the "repeat count" as an "argument",
+for example, commands which need a "quantity" will use the "repeat count"
+instead of asking for a quantity, allowing the use of "0d" for "drop all".
+Commands which ask for a quantity will convert any "letters" into the
+maximal legal value.
+~~~~~112|Debug|General
+#####R--- General Commands ---
+~~~~~1
+[[[[[GAutorestore (a)]
+ Restores all your stats. This includes HP, SP, hunger, lost levels, etc.
+~~~~~2
+[[[[[GShow all stats (A)]
+ This brings up the Character status menu, where you can view
+ all the stats about your character.
+~~~~~3
+[[[[[GTeleport to target (b)]
+ You first need to have a monster targeted, then you can use
+ this command to teleport next to the monster.
+~~~~~4
+[[[[[GHP to zero (B)]
+ Bring your health down to zero.
+~~~~~5
+[[[[[GCreate object (c)]
+ Allows you to select and create a new object where you stand.
+ This brings up a menu where you can choose what type of object
+ you want created.
+~~~~~6
+[[[[[GCreate artifact (C)]
+ Allows you to select and create a new artifact where you stand.
+ Use the "Command count", aka 0, to specify a number from
+ a_info.txt to put it on the ground where you are standing.
+ For example : 03^AC will create the Arkenstone of Thrane (+3)
+~~~~~7
+[[[[[GDetect all (d)]
+ Sense ways out/monsters/objects/traps.
+~~~~~8
+[[[[[GTeleport to the wilderness (D)]
+ From a dungeon this will teleport you to the wilderness level
+ and if used in the wilderness it acts like teleport.
+~~~~~9
+[[[[[GEdit character attributes (e)]
+ Edit character attributes including Str, Int, Dex, experience, gold, luck, etc.
+~~~~~10
+[[[[[GChange grid's mana (E)]
+ Alter how much mana a grid has.
+ Use the "Command count", aka 0, to specify the amount of mana
+ that you want.
+~~~~~11
+[[[[[G*IDENTIFY* (f)]
+ Like a Scroll of *Identify*.
+~~~~~12
+[[[[[GFeatures (F)]
+ Use the "Command count", aka 0, to specify a number from
+ f_info.txt to put a feature on the ground where you are
+ standing.
+~~~~~13
+[[[[[GCreate good item (g)]
+ Create a random good item where you stand.
+~~~~~15
+[[[[[GChange life rating (h)]
+ Change your life rating.
+~~~~~16
+[[[[[GHostile monster creation (H)]
+ Summons a Pack of Creatures of the same kind. Will only work
+ if MONSTER_HORDES has been defined at compile time.
+~~~~~17
+[[[[[GIdentify (i)]
+ Like a Scroll of Identify.
+~~~~~19
+[[[[[GJump to other level (j)]
+ Jump to other dungeon level. This does not work in the
+ wilderness as it is treated as all one level.
+~~~~~21
+[[[[[GCheck attributes (k)]
+ Displays your characters attributes.
+~~~~~23
+[[[[[GLearn about objects (l)]
+ Make you know about all objects. Not sure how this works.
+~~~~~25
+[[[[[GMagic Mapping (m)]
+ Like a Scroll of Magic mapping.
+~~~~~26
+[[[[[GGain corruption (M)]
+ Allows your character to gain a corruption.
+~~~~~27
+[[[[[GSummon named monster (n)]
+ Summon a monster that will appear next to you.
+ Use the "Command count", aka 0, to specify a number from
+ r_info.txt to summon a monster.
+~~~~~28
+[[[[[GSummon _friendly_ named monster (N)]
+ The same as n but the creature will be your pet. Try this
+ with number 861, Darkgod is now your pet.
+~~~~~29
+[[[[[GEdit object attributes (o)]
+ Allows you to alter the attributes of any object that you
+ have in your backpack.
+~~~~~31
+[[[[[GPhase door (p)]
+ Like a Scroll of Phase Door.
+~~~~~32
+[[[[[GPanic save (P)]
+ Save and quit the game, which is the same as doing a ^X.
+~~~~~33
+[[[[[GGet a quest (q)]
+ Get a quest.
+ Use the "Command count", aka 0, to specify a number from
+ 1 to 25, as defined in defines.h ( the QUEST_XXX items ).
+ For example : 04^Aq will get you the thieves quest.
+~~~~~35
+[[[[[GGain reward (r)]
+ Some high being grants you a reward.
+~~~~~36
+[[[[[GCreate a trap (R)]
+ Use the "Command count", aka 0, to specify a number from
+ tr_info.txt to put a trap on the ground where you are
+ standing.
+~~~~~37
+[[[[[GSummon monster (s)]
+ Summon a random monster, next to where you stand.
+~~~~~38
+[[[[[GChange the feature of the map (S)]
+ This allows you to change the "special" field of the current
+ grid. This special field is used to store things like quest
+ ids, dungeon entries, and so on, not to be used unless
+ one knows what it's doing.
+~~~~~39
+[[[[[GTeleport (t)]
+ Like a Scroll of Teleport.
+~~~~~40
+[[[[[GTeleport to a town (T)]
+ Teleports you to a specific town.
+ Use the "Command count", aka 0, to specify a number from
+ wf_info.txt for where you want to go.
+ standing.
+ For example : 02^AT will teleport you to Gondolin
+~~~~~41
+[[[[[GComplete map (u)]
+ Displays the complete map of the dungeon.
+~~~~~42
+[[[[[GBecome undead (U)]
+ This is supposed to make you undead (as in the Necromantic power).
+~~~~~43
+[[[[[GRandom artifact/ego item (v)]
+ Create a random artifact/ego item where you stand.
+~~~~~45
+[[[[[GWizard light the level (w)]
+ Looks like the same as u.
+~~~~~46
+[[[[[GWish (W)]
+ Makes all your wishes come true.
+
+ Read the *****wishing.txt*0[wishing spoiler] to see how these work.
+~~~~~47
+[[[[[GXP boost (x)]
+ Use the "Command count", aka 0, to specify the increment,
+ if you do not specify a parameter it doubles your XP,
+ otherwise it increments by the specified amount.
+~~~~~51
+[[[[[GZap monsters (z)]
+ All monsters in sight range vanish like Mass Genocide, only with no
+ HP price.
+~~~~~55
+[[[[[GIncrement monster level (@)]
+ Level up a monster.
+~~~~~61
+[[[[[GLose special powers (*)]
+ Returns your powers to a normal level.
+~~~~~67
+[[[[[GCreate object (-)]
+ Allows you to create a new object where you stand. You must
+ specify an object number from k_info.txt.
+~~~~~69
+[[[[[GThe path to the god dark (_)]
+ Do not use this as it is used by DarkGod as a test for Lua
+ and will CRASH the game. You have been warned.
+~~~~~71
+[[[[[GGain a fate (+)]
+ Unearth more of your prophecy.
+~~~~~73
+[[[[[GAlign monster (=)]
+ Use the "Command count", aka 0, to specify one of the following
+ alignment types:
+ 0 monster becomes enemy
+ 1 monster becomes neutral
+ 2 monster becomes friendly
+ 3 monster becomes pet
+ 4 monster becomes companion
+ You then point at an enemy and press space.
+~~~~~75
+[[[[[GCreate spoiler (")]
+ Brings up a menu that allows you to create a spoiler file.
+~~~~~81
+[[[[[GLua script (>)]
+ Allows you to run a Lua script.
+~~~~~91
+[[[[[GSummon monster (/)]
+ Summons a random monster next to you.
+~~~~~91
+[[[[[GHelp (?)]
+ Displays the main help file.
diff --git a/lib/mods/theme/help/def.aux b/lib/mods/theme/help/def.aux
new file mode 100644
index 00000000..983e9683
--- /dev/null
+++ b/lib/mods/theme/help/def.aux
@@ -0,0 +1,3 @@
+file_ext="html"
+link_prefix=""
+link_suffix=""
diff --git a/lib/mods/theme/help/defines.txt b/lib/mods/theme/help/defines.txt
new file mode 100644
index 00000000..ac997501
--- /dev/null
+++ b/lib/mods/theme/help/defines.txt
@@ -0,0 +1,639 @@
+|||||oy
+~~~~~81|Defines
+~~~~~85|Defines|Tvals
+~~~~~82|Automatizer|Defines
+~~~~~83|Tvals
+#####R /----------------------------------------\
+#####R < Tvals and svals >
+#####R \----------------------------------------/
+
+Some objects don't have svals as such. Spellbooks, wands, and staves for
+instance don't have svalues as they are defined in lua.
+
+TV_SKELETON 1 /* Skeletons ('s') */
+TV_BOTTLE 2 /* Empty bottles ('!') */
+*****defines.txt*04[TV_BATERIE] 4 /* For the Alchemists */
+TV_SPIKE 5 /* Spikes ('~') */
+TV_MSTAFF 6 /* Mage Staffs */
+TV_CHEST 7 /* Chests ('~') */
+TV_PARCHMENT 8 /* Parchments from Kamband */
+*****defines.txt*09[TV_CORPSE] 9 /* Monster corpses */
+TV_EGG 10 /* Monster Eggs */
+TV_JUNK 11 /* Sticks, Pottery, etc ('~') */
+*****defines.txt*12[TV_TOOL] 12 /* Tools */
+*****defines.txt*14[TV_INSTRUMENT] 14 /* Musical instruments */
+*****defines.txt*15[TV_BOOMERANG] 15 /* Boomerangs */
+*****defines.txt*16[TV_SHOT] 16 /* Ammo for slings */
+*****defines.txt*16[TV_ARROW] 17 /* Ammo for bows */
+*****defines.txt*16[TV_BOLT] 18 /* Ammo for x-bows */
+*****defines.txt*19[TV_BOW] 19 /* Slings/Bows/Xbows */
+*****defines.txt*20[TV_DIGGING] 20 /* Shovels/Picks */
+*****defines.txt*21[TV_HAFTED] 21 /* Priest Weapons */
+*****defines.txt*22[TV_POLEARM] 22 /* Pikes/Glaives/Spears/etc. */
+*****defines.txt*23[TV_SWORD] 23 /* Edged Weapons */
+*****defines.txt*24[TV_AXE] 24 /* Axes/Cleavers */
+*****defines.txt*30[TV_BOOTS] 30 /* Boots */
+*****defines.txt*31[TV_GLOVES] 31 /* Gloves */
+*****defines.txt*32[TV_HELM] 32 /* Helms */
+*****defines.txt*32[TV_CROWN] 33 /* Crowns */
+*****defines.txt*34[TV_SHIELD] 34 /* Shields */
+*****defines.txt*35[TV_CLOAK] 35 /* Cloaks */
+*****defines.txt*36[TV_SOFT_ARMOR] 36 /* Soft Armor */
+*****defines.txt*37[TV_HARD_ARMOR] 37 /* Hard Armor */
+*****defines.txt*38[TV_DRAG_ARMOR] 38 /* Dragon Scale Mail */
+*****defines.txt*39[TV_LITE] 39 /* Lites (including Specials) */
+*****defines.txt*40[TV_AMULET] 40 /* Amulets (including Specials) */
+*****defines.txt*45[TV_RING] 45 /* Rings (including Specials) */
+*****defines.txt*46[TV_TRAPKIT] 46 /* Trapkits */
+TV_TOTEM 54 /* Summoner totems */
+*****defines.txt*55[TV_STAFF] 55 /* Staffs */
+*****defines.txt*65[TV_WAND] 65 /* Wands */
+*****defines.txt*66[TV_ROD] 66 /* Rod tips */
+*****defines.txt*67[TV_ROD_MAIN] 67 /* Rod body's */
+*****defines.txt*70[TV_SCROLL] 70 /* Scrolls */
+*****defines.txt*71[TV_POTION] 71 /* potions */
+*****defines.txt*72[TV_POTION2] 72 /* Second set of potion */
+TV_FLASK 77 /* Flasks of oil */
+*****defines.txt*80[TV_FOOD] 80 /* Food, including mushrooms */
+TV_HYPNOS 99 /* To wield monsters !:) */
+TV_GOLD 100 /* Gold can only be picked up by players */
+TV_RANDART 102 /* Random Artifacts */
+TV_RUNE1 104 /* Base runes */
+TV_RUNE2 105 /* Modifier runes */
+TV_BOOK 111 /* spell books */
+*****defines.txt*115[TV_DAEMON_BOOK] 115 /* Demon blades, shields and horns */
+~~~~~84|Defines|Svals
+~~~~~12|Svals
+/* The "sval" codes for TV_TOOL */
+ SV_TOOL_CLIMB 0
+ SV_PORTABLE_HOLE 1
+~~~~~16
+/* The "sval" codes for TV_SHOT/TV_ARROW/TV_BOLT */
+ SV_AMMO_LIGHT 0 /* pebbles */
+ SV_AMMO_NORMAL 1 /* shots, arrows, bolts */
+ SV_AMMO_HEAVY 2 /* seeker arrows and bolts, mithril shots */
+~~~~~14
+/* The "sval" codes for TV_INSTRUMENT */
+ SV_FLUTE 1
+ SV_BANJO 2
+ SV_LUTE 3
+ SV_MANDOLIN 4
+ SV_DRUM 5
+ SV_HARP 6
+ SV_HORN 7
+~~~~~46
+/* The "sval" codes for TV_TRAPKIT */
+ SV_TRAPKIT_SLING 1
+ SV_TRAPKIT_BOW 2
+ SV_TRAPKIT_XBOW 3
+ SV_TRAPKIT_POTION 4
+ SV_TRAPKIT_SCROLL 5
+ SV_TRAPKIT_DEVICE 6
+~~~~~15
+/* The "sval" codes for TV_BOOMERANG */
+ SV_BOOM_S_WOOD 1 /* 1d4 */
+ SV_BOOM_WOOD 2 /* 1d9 */
+ SV_BOOM_S_METAL 3 /* 1d8 */
+ SV_BOOM_METAL 4 /* 2d4 */
+~~~~~19
+/* The "sval" codes for TV_BOW (note information in "sval") */
+ SV_SLING 2 /* (x2) */
+ SV_SHORT_BOW 12 /* (x2) */
+ SV_LONG_BOW 13 /* (x3) */
+ SV_LIGHT_XBOW 23 /* (x3) */
+ SV_HEAVY_XBOW 24 /* (x4) */
+~~~~~20
+/* The "sval" codes for TV_DIGGING */
+ SV_SHOVEL 1
+ SV_GNOMISH_SHOVEL 2
+ SV_DWARVEN_SHOVEL 3
+ SV_PICK 4
+ SV_ORCISH_PICK 5
+ SV_DWARVEN_PICK 6
+ SV_MATTOCK 7
+~~~~~21
+/* The "sval" values for TV_HAFTED */
+ SV_CLUB 1 /* 1d4 */
+ SV_WHIP 2 /* 1d6 */
+ SV_QUARTERSTAFF 3 /* 1d9 */
+ SV_NUNCHAKU 4 /* 2d3 */
+ SV_MACE 5 /* 2d4 */
+ SV_BALL_AND_CHAIN 6 /* 2d4 */
+ SV_WAR_HAMMER 8 /* 3d3 */
+ SV_LUCERN_HAMMER 10 /* 2d5 */
+ SV_THREE_PIECE_ROD 11 /* 3d3 */
+ SV_MORNING_STAR 12 /* 2d6 */
+ SV_FLAIL 13 /* 2d6 */
+ SV_LEAD_FILLED_MACE 15 /* 3d4 */
+ SV_TWO_HANDED_FLAIL 18 /* 3d6 */
+ SV_GREAT_HAMMER 19 /* 4d6 */
+ SV_MACE_OF_DISRUPTION 20 /* 5d8 */
+ SV_GROND 50 /* 3d4 */
+~~~~~24
+/* The "sval" values for TV_AXE */
+ SV_HATCHET 1 /* 1d5 */
+ SV_CLEAVER 2 /* 2d4 */
+ SV_LIGHT_WAR_AXE 8 /* 2d5 */
+ SV_BEAKED_AXE 10 /* 2d6 */
+ SV_BROAD_AXE 11 /* 2d6 */
+ SV_BATTLE_AXE 22 /* 2d8 */
+ SV_GREAT_AXE 25 /* 4d4 */
+ SV_LOCHABER_AXE 28 /* 3d8 */
+ SV_SLAUGHTER_AXE 30 /* 5d7 */
+~~~~~22
+/* The "sval" values for TV_POLEARM */
+ SV_SPEAR 2 /* 1d6 */
+ SV_SICKLE 3 /* 2d3 */
+ SV_AWL_PIKE 4 /* 1d8 */
+ SV_TRIDENT 5 /* 1d9 */
+ SV_FAUCHARD 6 /* 1d10 */
+ SV_BROAD_SPEAR 7 /* 1d9 */
+ SV_PIKE 8 /* 2d5 */
+ SV_GLAIVE 13 /* 2d6 */
+ SV_HALBERD 15 /* 3d4 */
+ SV_GUISARME 16 /* 2d5 */
+ SV_SCYTHE 17 /* 5d3 */
+ SV_LANCE 20 /* 2d8 */
+ SV_TRIFURCATE_SPEAR 26 /* 2d9 */
+ SV_HEAVY_LANCE 29 /* 4d8 */
+ SV_SCYTHE_OF_SLICING 30 /* 8d4 */
+~~~~~23
+/* The "sval" codes for TV_SWORD */
+ SV_BROKEN_DAGGER 1 /* 1d1 */
+ SV_BROKEN_SWORD 2 /* 1d2 */
+ SV_DAGGER 4 /* 1d4 */
+ SV_MAIN_GAUCHE 5 /* 1d5 */
+ SV_RAPIER 7 /* 1d6 */
+ SV_SMALL_SWORD 8 /* 1d6 */
+ SV_BASILLARD 9 /* 1d8 */
+ SV_SHORT_SWORD 10 /* 1d7 */
+ SV_SABRE 11 /* 1d7 */
+ SV_CUTLASS 12 /* 1d7 */
+ SV_KHOPESH 14 /* 2d4 */
+ SV_TULWAR 15 /* 2d4 */
+ SV_BROAD_SWORD 16 /* 2d5 */
+ SV_LONG_SWORD 17 /* 2d5 */
+ SV_SCIMITAR 18 /* 2d5 */
+ SV_KATANA 20 /* 3d4 */
+ SV_BASTARD_SWORD 21 /* 3d4 */
+ SV_GREAT_SCIMITAR 22 /* 4d5 */
+ SV_CLAYMORE 23 /* 2d8 */
+ SV_ESPADON 24 /* 2d9 */
+ SV_TWO_HANDED_SWORD 25 /* 3d6 */
+ SV_FLAMBERGE 26 /* 3d7 */
+ SV_EXECUTIONERS_SWORD 28 /* 4d5 */
+ SV_ZWEIHANDER 29 /* 4d6 */
+ SV_BLADE_OF_CHAOS 30 /* 6d5 */
+ SV_SHADOW_BLADE 31 /* 4d4 */
+ SV_BLUESTEEL_BLADE 32 /* 3d9 */
+ SV_DARK_SWORD 33 /* 3d7 */
+~~~~~34
+/* The "sval" codes for TV_SHIELD */
+ SV_SMALL_LEATHER_SHIELD 2
+ SV_SMALL_METAL_SHIELD 3
+ SV_LARGE_LEATHER_SHIELD 4
+ SV_LARGE_METAL_SHIELD 5
+ SV_DRAGON_SHIELD 6
+ SV_SHIELD_OF_DEFLECTION 10
+~~~~~32
+/* The "sval" codes for TV_HELM */
+ SV_HARD_LEATHER_CAP 2
+ SV_METAL_CAP 3
+ SV_IRON_HELM 5
+ SV_STEEL_HELM 6
+ SV_DRAGON_HELM 7
+ SV_IRON_CROWN 10
+ SV_GOLDEN_CROWN 11
+ SV_JEWELED_CROWN 12
+ SV_MORGOTH 50
+~~~~~30
+/* The "sval" codes for TV_BOOTS */
+ SV_PAIR_OF_SOFT_LEATHER_BOOTS 2
+ SV_PAIR_OF_HARD_LEATHER_BOOTS 3
+ SV_PAIR_OF_METAL_SHOD_BOOTS 6
+~~~~~35
+/* The "sval" codes for TV_CLOAK */
+ SV_CLOAK 1
+ SV_ELVEN_CLOAK 2
+ SV_FUR_CLOAK 3
+ SV_SHADOW_CLOAK 6
+~~~~~31
+/* The "sval" codes for TV_GLOVES */
+ SV_SET_OF_LEATHER_GLOVES 1
+ SV_SET_OF_GAUNTLETS 2
+ SV_SET_OF_CESTI 5
+~~~~~36
+/* The "sval" codes for TV_SOFT_ARMOR */
+ SV_FILTHY_RAG 1
+ SV_ROBE 2
+ SV_PAPER_ARMOR 3 /* 4 */
+ SV_SOFT_LEATHER_ARMOR 4
+ SV_SOFT_STUDDED_LEATHER 5
+ SV_HARD_LEATHER_ARMOR 6
+ SV_HARD_STUDDED_LEATHER 7
+ SV_RHINO_HIDE_ARMOR 8
+ SV_CORD_ARMOR 9 /* 6 */
+ SV_PADDED_ARMOR 10 /* 4 */
+ SV_LEATHER_SCALE_MAIL 11
+ SV_LEATHER_JACK 12
+ SV_STONE_AND_HIDE_ARMOR 15 /* 15 */
+ SV_THUNDERLORD_SUIT 16
+~~~~~37
+/* The "sval" codes for TV_HARD_ARMOR */
+ SV_RUSTY_CHAIN_MAIL 1 /* 14- */
+ SV_RING_MAIL 2 /* 12 */
+ SV_METAL_SCALE_MAIL 3 /* 13 */
+ SV_CHAIN_MAIL 4 /* 14 */
+ SV_DOUBLE_RING_MAIL 5 /* 15 */
+ SV_AUGMENTED_CHAIN_MAIL 6 /* 16 */
+ SV_DOUBLE_CHAIN_MAIL 7 /* 16 */
+ SV_BAR_CHAIN_MAIL 8 /* 18 */
+ SV_METAL_BRIGANDINE_ARMOUR 9 /* 19 */
+ SV_SPLINT_MAIL 10 /* 19 */
+ SV_PARTIAL_PLATE_ARMOUR 12 /* 22 */
+ SV_METAL_LAMELLAR_ARMOUR 13 /* 23 */
+ SV_FULL_PLATE_ARMOUR 15 /* 25 */
+ SV_RIBBED_PLATE_ARMOUR 18 /* 28 */
+ SV_MITHRIL_CHAIN_MAIL 20 /* 28+ */
+ SV_MITHRIL_PLATE_MAIL 25 /* 35+ */
+ SV_ADAMANTITE_PLATE_MAIL 30 /* 40+ */
+~~~~~38
+/* The "sval" codes for TV_DRAG_ARMOR */
+ SV_DRAGON_BLACK 1
+ SV_DRAGON_BLUE 2
+ SV_DRAGON_WHITE 3
+ SV_DRAGON_RED 4
+ SV_DRAGON_GREEN 5
+ SV_DRAGON_MULTIHUED 6
+ SV_DRAGON_SHINING 10
+ SV_DRAGON_LAW 12
+ SV_DRAGON_BRONZE 14
+ SV_DRAGON_GOLD 16
+ SV_DRAGON_CHAOS 18
+ SV_DRAGON_BALANCE 20
+ SV_DRAGON_POWER 30
+~~~~~39
+/* The sval codes for TV_LITE */
+ SV_LITE_TORCH 0
+ SV_LITE_LANTERN 1
+ SV_LITE_TORCH_EVER 2
+ SV_LITE_DWARVEN 3
+ SV_LITE_FEANORIAN 4
+ SV_LITE_GALADRIEL 100
+ SV_LITE_ELENDIL 101
+ SV_LITE_THRAIN 102
+ SV_LITE_UNDEATH 103
+ SV_LITE_PALANTIR 104
+ SV_ANCHOR_SPACETIME 105
+ SV_STONE_LORE 106
+~~~~~40
+/* The "sval" codes for TV_AMULET */
+ SV_AMULET_DOOM 0
+ SV_AMULET_TELEPORT 1
+ SV_AMULET_ADORNMENT 2
+ SV_AMULET_SLOW_DIGEST 3
+ SV_AMULET_RESIST_ACID 4
+ SV_AMULET_SEARCHING 5
+ SV_AMULET_BRILLANCE 6
+ SV_AMULET_CHARISMA 7
+ SV_AMULET_THE_MAGI 8
+ SV_AMULET_REFLECTION 9
+ SV_AMULET_CARLAMMAS 10
+ SV_AMULET_INGWE 11
+ SV_AMULET_DWARVES 12
+ SV_AMULET_NO_MAGIC 13
+ SV_AMULET_NO_TELE 14
+ SV_AMULET_RESISTANCE 15
+ SV_AMULET_NOTHING 16
+ SV_AMULET_SERPENT 17
+ SV_AMULET_TORIS_MEJISTOS 18
+ SV_AMULET_ELESSAR 19
+ SV_AMULET_EVENSTAR 20
+ SV_AMULET_SUSTENANCE 21
+ SV_AMULET_TELEPATHY 22
+ SV_AMULET_TRICKERY 23
+ SV_AMULET_WEAPONMASTERY 24
+ SV_AMULET_DEVOTION 25
+ SV_AMULET_INFRA 26
+ SV_AMULET_SPELL 27
+ SV_AMULET_WISDOM 28
+ SV_AMULET_RESIST_ELEC 29
+ SV_AMULET_REGEN 30
+~~~~~45
+/* The sval codes for TV_RING */
+ SV_RING_WOE 0
+ SV_RING_AGGRAVATION 1
+ SV_RING_WEAKNESS 2
+ SV_RING_STUPIDITY 3
+ SV_RING_TELEPORTATION 4
+ SV_RING_SPECIAL 5
+ SV_RING_SLOW_DIGESTION 6
+ SV_RING_FEATHER_FALL 7
+ SV_RING_RESIST_FIRE 8
+ SV_RING_RESIST_COLD 9
+ SV_RING_SUSTAIN_STR 10
+ SV_RING_SUSTAIN_INT 11
+ SV_RING_SUSTAIN_WIS 12
+ SV_RING_SUSTAIN_CON 13
+ SV_RING_SUSTAIN_DEX 14
+ SV_RING_SUSTAIN_CHR 15
+ SV_RING_PROTECTION 16
+ SV_RING_ACID 17
+ SV_RING_FLAMES 18
+ SV_RING_ICE 19
+ SV_RING_RESIST_POIS 20
+ SV_RING_FREE_ACTION 21
+ SV_RING_SEE_INVIS 22
+ SV_RING_SEARCHING 23
+ SV_RING_STR 24
+ SV_RING_INT 25
+ SV_RING_DEX 26
+ SV_RING_CON 27
+ SV_RING_ACCURACY 28
+ SV_RING_DAMAGE 29
+ SV_RING_SLAYING 30
+ SV_RING_SPEED 31
+ SV_RING_BARAHIR 32
+ SV_RING_TULKAS 33
+ SV_RING_NARYA 34
+ SV_RING_NENYA 35
+ SV_RING_VILYA 36
+ SV_RING_POWER 37
+ SV_RING_RES_FEAR 38
+ SV_RING_RES_LD 39
+ SV_RING_RES_NETHER 40
+ SV_RING_RES_NEXUS 41
+ SV_RING_RES_SOUND 42
+ SV_RING_RES_CONFUSION 43
+ SV_RING_RES_SHARDS 44
+ SV_RING_RES_DISENCHANT 45
+ SV_RING_RES_CHAOS 46
+ SV_RING_RES_BLINDNESS 47
+ SV_RING_LORDLY 48
+ SV_RING_ATTACKS 49
+ SV_RING_NOTHING 50
+ SV_RING_PRECONITION 51
+ SV_RING_FLAR 52
+ SV_RING_INVIS 53
+ SV_RING_FLYING 54
+ SV_RING_WRAITH 55
+ SV_RING_ELEC 56
+ SV_RING_DURIN 57
+ SV_RING_SPELL 58
+ SV_RING_CRIT 59
+~~~~~55
+/* The "sval" codes for TV_STAFF */
+ SV_STAFF_SCHOOL 1
+ SV_STAFF_NOTHING 2
+~~~~~65
+/* The "sval" codes for TV_WAND */
+ SV_WAND_SCHOOL 1
+ SV_WAND_NOTHING 2
+~~~~~66
+/* The "sval" codes for TV_ROD(Rod Tips) */
+ SV_ROD_NOTHING 0
+ SV_ROD_DETECT_DOOR 1
+ SV_ROD_IDENTIFY 2
+ SV_ROD_RECALL 3
+ SV_ROD_ILLUMINATION 4
+ SV_ROD_MAPPING 5
+ SV_ROD_DETECTION 6
+ SV_ROD_PROBING 7
+ SV_ROD_CURING 8
+ SV_ROD_HEALING 9
+ SV_ROD_RESTORATION 10
+ SV_ROD_SPEED 11
+ SV_ROD_TELEPORT_AWAY 13
+ SV_ROD_DISARMING 14
+ SV_ROD_LITE 15
+ SV_ROD_SLEEP_MONSTER 16
+ SV_ROD_SLOW_MONSTER 17
+ SV_ROD_DRAIN_LIFE 18
+ SV_ROD_POLYMORPH 19
+ SV_ROD_ACID_BOLT 20
+ SV_ROD_ELEC_BOLT 21
+ SV_ROD_FIRE_BOLT 22
+ SV_ROD_COLD_BOLT 23
+ SV_ROD_ACID_BALL 24
+ SV_ROD_ELEC_BALL 25
+ SV_ROD_FIRE_BALL 26
+ SV_ROD_COLD_BALL 27
+ SV_ROD_HAVOC 28
+ SV_ROD_DETECT_TRAP 29
+ SV_ROD_HOME 30
+~~~~~67
+/* The "sval" codes for TV_ROD_MAIN(Rods) */
+ SV_ROD_WOODEN 10
+ SV_ROD_COPPER 20
+ SV_ROD_IRON 50
+ SV_ROD_ALUMINIUM 75
+ SV_ROD_SILVER 100
+ SV_ROD_GOLDEN 125
+ SV_ROD_MITHRIL 160
+ SV_ROD_ADMANTITE 200
+~~~~~70
+/* The "sval" codes for TV_SCROLL */
+ SV_SCROLL_DARKNESS 0
+ SV_SCROLL_AGGRAVATE_MONSTER 1
+ SV_SCROLL_CURSE_ARMOR 2
+ SV_SCROLL_CURSE_WEAPON 3
+ SV_SCROLL_SUMMON_MONSTER 4
+ SV_SCROLL_SUMMON_UNDEAD 5
+ SV_SCROLL_SUMMON_MINE 6
+ SV_SCROLL_TRAP_CREATION 7
+ SV_SCROLL_PHASE_DOOR 8
+ SV_SCROLL_TELEPORT 9
+ SV_SCROLL_TELEPORT_LEVEL 10
+ SV_SCROLL_WORD_OF_RECALL 11
+ SV_SCROLL_IDENTIFY 12
+ SV_SCROLL_STAR_IDENTIFY 13
+ SV_SCROLL_REMOVE_CURSE 14
+ SV_SCROLL_STAR_REMOVE_CURSE 15
+ SV_SCROLL_ENCHANT_ARMOR 16
+ SV_SCROLL_ENCHANT_WEAPON_TO_HIT 17
+ SV_SCROLL_ENCHANT_WEAPON_TO_DAM 18
+ SV_SCROLL_ENCHANT_WEAPON_PVAL 19
+ SV_SCROLL_STAR_ENCHANT_ARMOR 20
+ SV_SCROLL_STAR_ENCHANT_WEAPON 21
+ SV_SCROLL_RECHARGING 22
+ SV_SCROLL_RESET_RECALL 23
+ SV_SCROLL_LIGHT 24
+ SV_SCROLL_MAPPING 25
+ SV_SCROLL_DETECT_GOLD 26
+ SV_SCROLL_DETECT_ITEM 27
+ SV_SCROLL_DETECT_TRAP 28
+ SV_SCROLL_DETECT_DOOR 29
+ SV_SCROLL_DETECT_INVIS 30
+ SV_SCROLL_DIVINATION 31
+ SV_SCROLL_SATISFY_HUNGER 32
+ SV_SCROLL_BLESSING 33
+ SV_SCROLL_HOLY_CHANT 34
+ SV_SCROLL_HOLY_PRAYER 35
+ SV_SCROLL_MONSTER_CONFUSION 36
+ SV_SCROLL_PROTECTION_FROM_EVIL 37
+ SV_SCROLL_RUNE_OF_PROTECTION 38
+ SV_SCROLL_TRAP_DOOR_DESTRUCTION 39
+ SV_SCROLL_DEINCARNATION 40
+ SV_SCROLL_STAR_DESTRUCTION 41
+ SV_SCROLL_DISPEL_UNDEAD 42
+ SV_SCROLL_MASS_RESURECTION 43
+ SV_SCROLL_GENOCIDE 44
+ SV_SCROLL_MASS_GENOCIDE 45
+ SV_SCROLL_ACQUIREMENT 46
+ SV_SCROLL_STAR_ACQUIREMENT 47
+ SV_SCROLL_FIRE 48
+ SV_SCROLL_ICE 49
+ SV_SCROLL_CHAOS 50
+ SV_SCROLL_RUMOR 51
+ SV_SCROLL_ARTIFACT 52
+ SV_SCROLL_NOTHING 53
+ SV_SCROLL_SPELL 54
+~~~~~71
+/* The "sval" codes for TV_POTION */
+ SV_POTION_WATER 0
+ SV_POTION_APPLE_JUICE 1
+ SV_POTION_SLIME_MOLD 2
+ SV_POTION_BLOOD 3
+ SV_POTION_SLOWNESS 4
+ SV_POTION_SALT_WATER 5
+ SV_POTION_POISON 6
+ SV_POTION_BLINDNESS 7
+ SV_POTION_INVIS 8
+ SV_POTION_CONFUSION 9
+ SV_POTION_MUTATION 10
+ SV_POTION_SLEEP 11
+ SV_POTION_LEARNING 12
+ SV_POTION_LOSE_MEMORIES 13
+ SV_POTION_RUINATION 15
+ SV_POTION_DEC_STR 16
+ SV_POTION_DEC_INT 17
+ SV_POTION_DEC_WIS 18
+ SV_POTION_DEC_DEX 19
+ SV_POTION_DEC_CON 20
+ SV_POTION_DEC_CHR 21
+ SV_POTION_DETONATIONS 22
+ SV_POTION_DEATH 23
+ SV_POTION_INFRAVISION 24
+ SV_POTION_DETECT_INVIS 25
+ SV_POTION_SLOW_POISON 26
+ SV_POTION_CURE_POISON 27
+ SV_POTION_BOLDNESS 28
+ SV_POTION_SPEED 29
+ SV_POTION_RESIST_HEAT 30
+ SV_POTION_RESIST_COLD 31
+ SV_POTION_HEROISM 32
+ SV_POTION_BESERK_STRENGTH 33
+ SV_POTION_CURE_LIGHT 34
+ SV_POTION_CURE_SERIOUS 35
+ SV_POTION_CURE_CRITICAL 36
+ SV_POTION_HEALING 37
+ SV_POTION_STAR_HEALING 38
+ SV_POTION_LIFE 39
+ SV_POTION_RESTORE_MANA 40
+ SV_POTION_RESTORE_EXP 41
+ SV_POTION_RES_STR 42
+ SV_POTION_RES_INT 43
+ SV_POTION_RES_WIS 44
+ SV_POTION_RES_DEX 45
+ SV_POTION_RES_CON 46
+ SV_POTION_RES_CHR 47
+ SV_POTION_INC_STR 48
+ SV_POTION_INC_INT 49
+ SV_POTION_INC_WIS 50
+ SV_POTION_INC_DEX 51
+ SV_POTION_INC_CON 52
+ SV_POTION_INC_CHR 53
+ SV_POTION_AUGMENTATION 55
+ SV_POTION_ENLIGHTENMENT 56
+ SV_POTION_STAR_ENLIGHTENMENT 57
+ SV_POTION_SELF_KNOWLEDGE 58
+ SV_POTION_EXPERIENCE 59
+ SV_POTION_RESISTANCE 60
+ SV_POTION_CURING 61
+ SV_POTION_INVULNERABILITY 62
+ SV_POTION_NEW_LIFE 63
+~~~~~72
+/* The "sval" codes for TV_POTION2 */
+ SV_POTION2_MIMIC_ABOMINATION 1
+ SV_POTION2_MIMIC_WOLF 2
+ SV_POTION2_MIMIC_APE 3
+ SV_POTION2_MIMIC_GOAT 4
+ SV_POTION2_MIMIC_INSECT 5
+ SV_POTION2_MIMIC_SPARROW 6
+ SV_POTION2_MIMIC_STATUE 7
+ SV_POTION2_MIMIC_VAMPIRE 8
+ SV_POTION2_MIMIC_SPIDER 9
+ SV_POTION2_MIMIC_MANA_BALL 10
+ SV_POTION2_MIMIC_FIRE_CLOUD 11
+ SV_POTION2_MIMIC_COLD_CLOUD 12
+ SV_POTION2_MIMIC_CHAOS_CLOUD 13
+ SV_POTION2_CURE_LIGHT_SANITY 14
+ SV_POTION2_CURE_SERIOUS_SANITY 15
+ SV_POTION2_CURE_CRITICAL_SANITY 16
+ SV_POTION2_CURE_SANITY 17
+ SV_POTION2_CURE_WATER 18
+~~~~~80
+/* The "sval" codes for TV_FOOD */
+ SV_FOOD_POISON 0
+ SV_FOOD_BLINDNESS 1
+ SV_FOOD_PARANOIA 2
+ SV_FOOD_CONFUSION 3
+ SV_FOOD_HALLUCINATION 4
+ SV_FOOD_PARALYSIS 5
+ SV_FOOD_WEAKNESS 6
+ SV_FOOD_SICKNESS 7
+ SV_FOOD_STUPIDITY 8
+ SV_FOOD_NAIVETY 9
+ SV_FOOD_UNHEALTH 10
+ SV_FOOD_DISEASE 11
+ SV_FOOD_CURE_POISON 12
+ SV_FOOD_CURE_BLINDNESS 13
+ SV_FOOD_CURE_PARANOIA 14
+ SV_FOOD_CURE_CONFUSION 15
+ SV_FOOD_CURE_SERIOUS 16
+ SV_FOOD_RESTORE_STR 17
+ SV_FOOD_RESTORE_CON 18
+ SV_FOOD_RESTORING 19
+ SV_FOOD_BISCUIT 32
+ SV_FOOD_JERKY 33
+ SV_FOOD_RATION 35
+ SV_FOOD_SLIME_MOLD 36
+ SV_FOOD_WAYBREAD 37
+ SV_FOOD_PINT_OF_ALE 38
+ SV_FOOD_PINT_OF_WINE 39
+ SV_FOOD_ATHELAS 40
+ SV_FOOD_GREAT_HEALTH 41
+ SV_FOOD_FORTUNE_COOKIE 42
+~~~~~04
+/* The "sval" codes for TV_BATERIE */
+ SV_BATERIE_POISON 1
+ SV_BATERIE_EXPLOSION 2
+ SV_BATERIE_TELEPORT 3
+ SV_BATERIE_COLD 4
+ SV_BATERIE_FIRE 5
+ SV_BATERIE_ACID 6
+ SV_BATERIE_LIFE 7
+ SV_BATERIE_CONFUSION 8
+ SV_BATERIE_LITE 9
+ SV_BATERIE_CHAOS 10
+ SV_BATERIE_TIME 11
+ SV_BATERIE_MAGIC 12
+ SV_BATERIE_XTRA_LIFE 13
+ SV_BATERIE_DARKNESS 14
+ SV_BATERIE_KNOWLEDGE 15
+ SV_BATERIE_FORCE 16
+ SV_BATERIE_LIGHTNING 17
+ SV_BATERIE_MANA 18
+ MAX_BATERIE_SVAL 18
+~~~~~09
+/* The "sval" codes for TV_CORPSE */
+ SV_CORPSE_CORPSE 1
+ SV_CORPSE_SKELETON 2
+ SV_CORPSE_HEAD 3
+ SV_CORPSE_SKULL 4
+ SV_CORPSE_MEAT 5
+~~~~~115
+/* The "sval" codes for TV_DAEMON_BOOK */
+ SV_DEMONBLADE 55
+ SV_DEMONSHIELD 56
+ SV_DEMONHORN 57
diff --git a/lib/mods/theme/help/dungeon.txt b/lib/mods/theme/help/dungeon.txt
new file mode 100644
index 00000000..21c9651e
--- /dev/null
+++ b/lib/mods/theme/help/dungeon.txt
@@ -0,0 +1,703 @@
+|||||oy
+~~~~~02|Dungeons
+#####R /----------------------------------------\
+#####R < The Dungeons and Places of Middle-earth >
+#####R \----------------------------------------/
+
+ *****dungeon.txt*04[Symbols On Your Map] *****dungeon.txt*07[The Town and Buildings]
+ *****dungeon.txt*01[The Wilderness] *****dungeon.txt*06[In the Dungeon]
+ *****dungeon.txt*08[Objects] *****dungeon.txt*13[Mining]
+ *****dungeon.txt*12[Doors, Rooms, Staircases etc.] *****dungeon.txt*18[Pets]
+ *****dungeon.txt*14[Winning] *****dungeon.txt*15[Dying]
+ *****dungeon.txt*16[Where to get more help]
+
+After you have *****birth.txt*0[created your character], you will begin your ToME
+adventure. Symbols appearing on your screen will represent the world's
+walls, floor, objects, features, and creatures lurking about. In order
+to direct your character through his adventure, you will enter single
+character commands (see "*****command.txt*0[command.txt]").
+
+~~~~~03|Symbols
+~~~~~04|Identifying features
+#####R=== Symbols On Your Map ===
+
+Symbols on your map can be broken down into three categories: Features of
+the world such as walls, floor, doors, and traps; Objects which can be
+picked up such as treasure, weapons, magical devices, etc; and creatures
+which may or may not move about the dungeon, but are mostly harmful to your
+character's well being.
+
+Some symbols are used to represent more than one type of entity, and some
+symbols are used to represent entities in more than one category. The "@"
+symbol (by default) is used to represent the character.
+
+It will not be necessary to remember all of the symbols and their meanings.
+The "slash" command ("/") will identify any character appearing on your map
+(see "*****command.txt*0[command.txt]").
+
+Note that you can use a *****command.txt*105["user pref file"] to change any of these symbols to
+something you are more comfortable with.
+
+
+#####G Features that do not block line of sight
+
+ . A floor space 1 Entrance to General Store
+ . A trap (hidden) 2 Entrance to Armoury
+ ^ A trap (known) 3 Entrance to Weapon Smith
+ [[[[[y;] A glyph of warding 4 Entrance to Temple
+ [[[[[U'] An open door 5 Entrance to Alchemy Shop
+ [[[[[U'] A broken door 6 Entrance to Magic Shop
+ < A staircase up 7 Entrance to the Black Market
+ [[[[[y<] A quest exit 8 Entrance to your Home
+ [[[[[r<] A quest up level 9 Entrance to Bookstore
+ [[[[[U<] A shaft up [[[[[r>] A quest down level
+ > A staircase down [[[[[U>] A shaft down
+ [[[[[y>] A quest entrance [[[[[v>] Dungeon entrance
+ _ A fountain [[[[[D_] An empty fountain
+ * Straight road start/exit [[[[[B*] Section of the Straight Road
+ [[[[[b*] Section of the Straight Road [[[[[W*] Section of the Straight Road
+ [[[[[D*] Corrupted straight road [[[[[R*] An explosive rune
+ [[[[[B~] Stream of water (shallow) [[[[[b~] Stream of water (deep)
+ [[[[[u~] Tainted stream (water) [[[[[s#] Underground tunnel
+ [[[[[U#] Pool of lava (shallow) [[[[[r#] Pool of lava (deep)
+ [[[[[D#] Dark pit [[[[[u.] Dirt
+ [[[[[g.] Patch of Grass [[[[[W.] Ice
+ [[[[[y.] Sand [[[[[D.] Ash
+ [[[[[u.] Mud [[[[[v.] Nether mist
+ [[[[[r.] Floor [[[[[D0] Altar of Darkness
+ [[[[[R0] Altar of Force [[[[[B0] Altar of Winds
+ [[[[[W0] Altar of Being [[[[[v+] Void Jumpgate
+ [[[[[v;] Monster trap [[[[[B.] Glass wall
+ [[[[[w#] Illusion wall [[[[[g;] Grass with flowers
+ [[[[[w.] Cobblestone road [[[[[g#] Small tree
+ [[[[[w*] Town (in wilderness) [[[[[U^] Underground tunnel
+ [[[[[y+] A web
+
+#####G Features that block line of sight
+
+ [[[[[w#] A secret door # A wall
+ [[[[[U+] A closed door % A mineral vein
+ [[[[[U+] A locked door [[[[[o*] A mineral vein + treasure
+ [[[[[U+] A jammed door [[[[[w:] A pile of rubble
+ [[[[[D#] A dead tree [[[[[W#] Ice wall
+ [[[[[G#] A tree [[[[[y#] Sand wall
+ [[[[[U^] A mountain chain [[[[[W^] High mountain chain
+
+
+#####G Objects
+
+ ! A potion (or flask) / A pole-arm
+ ? A scroll, book, map, parchment / Music instrument
+ ? A rune, runestone | An edged weapon
+ , A mushroom (or food) \ A hafted weapon or digger
+ - A wand, rod or rod tip } A sling, bow, or x-bow
+ _ A staff { A shot, arrow, bolt, boomerang
+ = A ring ( Soft armour/cloak
+ " An amulet [ Hard armour
+ $ Gold or gems ] Misc. armour
+ ~ Lites, Tools, Chests, etc ) A shield
+ ~ Junk, Sticks, Skeletons, etc ` Trapping kit, climbing set
+ ~ Stone, random artifact o Egg
+ * An essence & (unused)
+
+~~~~~05|Monsters
+#####G Monsters
+
+ $ Creeping Coins , Mushroom Patch
+ a Giant Ant A Maia/Vala
+ b Giant Bat B Bird
+ c Cattle C Canine
+ d Dragon D Ancient Dragon
+ e Floating Eye E Elemental
+ f Feline F Dragon Fly
+ g Golem G Ghost
+ h Humanoids H Hybrid
+ i Mewlip I Insect
+ j Jelly J Snake
+ k Dwarf K Killer Beetle
+ l Giant Louse L Lich
+ m Mold M Multi-Headed Hydra
+ n Naga N (unused)
+ o Orc O Ogre
+ p Human P Giant Human(oid)
+ q Quadruped Q Quylthulg
+ r Rodent R Reptile/Amphibian
+ s Skeleton S Spider/Scorpion/Tick
+ t Townsperson T Troll
+ u Minor demon U Major demon
+ v Vortex V Vampire
+ w Worm or Worm Mass W Wight/Wraith
+ x (unused) X Xorn/Xaren
+ y Yeek Y Strange Humanoid
+ z Zombie/Mummy Z Zephyr Hound
+
+
+~~~~~07|Town
+#####R=== The Town Level ===
+
+The town level is where you will begin your adventure. The town consists of
+several buildings (most with an entrance), some townspeople, and a main wall
+which surrounds the town (with gates in it). Outside the gates may be found
+unclaimed lands and wilderness, where beasts still run wild. The first time
+you are in town it will be daytime (unless you are an undead character), but
+note that the sun will rise and set (rather instantly) as time passes.
+
+There are a few different towns around the world map, and your starting town
+will eventually become too small for you (if you survive the dangers of the
+dungeon). Other towns will have some different facilities, and you can find
+your way to other towns by reading the "Adventurer's Guide to Middle-earth"
+parchment with which *every* character begins the game.
+
+
+#####R=== Townspeople ===
+
+The town contains many different kinds of people. There are the street
+urchins, young children who will mob an adventurer for money, and seem to
+come out of the woodwork when excited. Blubbering idiots are a constant
+annoyance, but not harmful. Public drunks wander about the town singing,
+and are of no threat to anyone. Sneaky rogues who work for the black
+market are always greedily eyeing your backpack for potential new
+'purchases'... And finally, what town would be complete without a
+swarm of half drunk warriors, who take offense or become annoyed just for
+the fun of it.
+
+Most of the townspeople should be avoided by the largest possible distance
+when you wander from store to store. Fights will break out, though, so be
+prepared. Since your character grew up in this world of intrigue, no
+experience is awarded for killing the town inhabitants, though you may
+acquire treasure.
+
+~~~~~21|Buildings
+#####R=== Town Buildings ===
+
+Your character will begin his adventure with some basic supplies, and some
+extra gold with which to purchase more supplies at the town stores.
+
+You may enter any open store and barter with the owner for items you can
+afford. When bartering, you enter prices you will pay (or accept) for some
+object. You can either enter the absolute amount, or precede a number with
+a plus or minus sign to give a positive or negative increment on your
+previous offer. But be warned that the owners can easily be insulted, and
+may even throw you out for a while if you insult them too often. [[[[[BTo enter]
+[[[[[Ba store, simply move onto the entrance, which is represented by a number]
+[[[[[Bfrom 1 to 9.]
+
+If you consistently bargain well in a store, that is, you reach the final
+offer much more often than not, then the store owner will eventually
+recognise that you are a superb haggler, and will go directly to the final
+offer instead of haggling with you. Items which cost less than 10 gold
+pieces do not count, as haggling well with these items is usually either
+very easy or almost impossible. The more expensive the item is, the less
+likely the store owner is to assume that you are a good haggler. Note that
+you may disable haggling with a software option, though this will inflict a
+10% "sales tax" on all purchases for which the store owner would have
+required you to haggle.
+
+Once inside a store, you will see the name and race of the store owner, the
+name of the store, the maximum amount of cash that the store owner will pay
+for any one item, and the store inventory, listed along with tentative
+prices, which will become "fixed" (at the "final offer") should you ever
+manage to haggle a store owner down to his final offer.
+
+You will also see an (incomplete) list of available commands. Note that
+many of the commands which work in the dungeon work in the stores as well,
+but some do not, especially those which involve "using" objects.
+
+Stores do not always have everything in stock. As the game progresses, they
+may get new items, so check back from time to time. Also, if you sell them
+an item, it may get sold to a customer while you are adventuring, so don't
+always expect to be able to get back everything you have sold. If you have
+a lot of spare gold, you can purchase every item in a store, which will
+induce the store owner to bring out new stock, and perhaps even retire. If
+you are low on funds (and morals), you may attempt to steal an item from
+the store, but beware -- if you are caught, the store owner will not let you
+back in for a very long time.
+
+Store owners will not buy harmful or useless items. If an object is
+unidentified, they will pay you some base price for it. Once they have
+bought it they will immediately identify the object. If it is a good object,
+they will add it to their inventory. If it was a bad bargain, they simply
+throw the item away. In any case, you may receive some knowledge of the
+item in case another is encountered.
+
+#####GThe General Store ("1")
+ The General Store sells foods, drinks, some clothing, torches, lamps,
+ oil, shovels, picks, and spikes. All of these items and some others
+ can be sold back to the General store for money.
+
+#####GThe Armoury ("2")
+ The Armoury is where the town's armour is fashioned. All sorts of
+ protective gear may be bought and sold here.
+
+#####GThe Weaponsmith's Shop ("3")
+ The Weaponsmith's Shop is where the town's weapons are fashioned. Hand
+ and missile weapons may be purchased and sold here, along with arrows,
+ bolts, and shots.
+
+#####GThe Temple ("4")
+ The Temple deals in healing and restoration potions, as well as bless
+ scrolls, word of recall scrolls, some approved priestly weapons, and
+ priest spell books.
+
+#####GThe Alchemy shop ("5")
+ The Alchemy Shop deals in all types of potions and scrolls.
+
+#####GThe Magic User's Shop ("6")
+ The Magic User's Shop deals in all sorts of rings, wands, amulets, and
+ staves, as well as spell books.
+
+#####GThe Black Market ("7")
+ The Black Market will sell and buy anything at extortionate prices.
+ However it occasionally has VERY good items in it. The shopkeepers are
+ not known for their tolerance...
+
+#####GYour Home ("8")
+ This is your house where you can store objects that you cannot carry
+ on your travels, or will need at a later date.
+
+#####GThe Bookstore ("9")
+ The Bookstore deals in all sorts of magical books. You can purchase
+ and sell spellbooks for spellcasters and priests here.
+
+
+#####ROther Buildings
+In addition to the basic stores, there are some special buildings that can be
+found in some towns. These Buildings (represented by +'s) include:
+
+#####GMayor's Office/Castle
+ The home office for the town. Adventurers looking for work besides
+ exploring the dungeon should hunt in here.
+
+#####GPet Shop
+ Great place to purchase eggs and get pets.
+
+#####GThe Soothsayer
+ To discover what *****/afatespoi.txt*0[fates ("a")] lie in store for you.
+
+#####GThe Prancing Pony
+ Wine, dine, rest and relax!
+
+#####GThe Nest
+ Thunderlords are masters of teleportation, and will consent to bear you
+ to your chosen dungeon destination for a fee.
+
+#####GBeastmaster Shanty
+ For those who enjoy trophy hunting, and to research that strange animal
+ you saw during your adventures.
+
+#####GFighters Hall
+ The place to reforge weapons and armour.
+
+#####GRangers Guild
+ The place to reforge distance weapons and their ammunition.
+
+#####GLibrary
+ For information of all kinds.
+
+#####GGambling House
+ Read the *****/bgambling.txt*0[rules ("b")] before paying. The games are
+ not rigged, just naturally difficult.
+
+#####GTower of Magery/Wizards Spire
+ The wizards will identify your items or recharge your magical items for
+ a fee.
+
+#####GInner temple/Priests Circle
+ A place of healing.
+
+#####GPaladin guild
+ Some healing and enchantments available.
+
+
+~~~~~1|Wilderness
+#####R=== The Wilderness and the Wilderness Map ===
+
+Between the towns, the hand of civilisation has not tamed the lands, and
+wild creatures run rampant. This is another place that is worth exploring.
+Hidden within the wilderness are several interesting locations, with the
+four main ones for any adventurer - Barrow Downs, Mirkwood, Mordor and
+Angband each being located at or near one of the main towns of Middle-
+earth. These locations should be explored consecutively, as each one
+increases in difficulty from the point where the previous dungeon finished.
+A new character should not try to go at Mordor or Angband as their first
+dungeon (well, not if you wish to survive your first step, anyway)!
+
+As well as these (and other) locations, the wilderness can be a good place
+to go when you are seeking a change from the scenery of the dungeons, or just
+a bit of fast experience.
+
+Be warned - some creatures found in the wilderness can be quite dangerous,
+and travel through the wilderness can be time-consuming. If you are wishing
+to simply move to another town, there is an overview map (called the
+"Wilderness Map") that can be travelled through by going up "<" from the
+town level. While travelling through this map, your character is still having
+to actually walk through each square of the normal view, but you only see the
+end result of them moving from one 4x4 panel to the next. As such, food
+consumption will appear to be much higher in the Wilderness View than it is
+normally, and it is recommended that you travel prepared. It is also possible
+for the wild creatures within the wilderness to ambush you when travelling,
+which will force you out of the Wilderness Map so that you can safely get
+yourself out of trouble, before continuing on your way.
+
+All of the special locations can be seen as downstairs (">") on the
+Wilderness Map and towns as "*"s. This makes it *much* easier to find your
+way from one interesting place to another.
+
+The "Adventurer's Guide to Middle-earth" (a parchment with which *every*
+character begins the game) contains details about the towns and some of
+the dungeons, including rough directions on how to get there.
+
+~~~~~06|Dungeons|In the dungeon
+#####R=== Within The Dungeon ===
+
+Once your character is adequately supplied with food, light, armor, and
+weapons, he is ready to enter Barrow Downs. Move on top of the ">" symbol
+and use the "Down" command (">").
+
+Your character will enter a maze of interconnecting staircases and finally
+arrive somewhere on the first level of the dungeon. Each level of the
+dungeon is fifty feet high (thus dungeon level "Lev 1" is often called
+"50 ft"), and is divided into rectangular regions several times
+larger than the screen. Once you leave a level by a
+staircase, you will never again find your way back to that region of that
+level, but there are an infinite number of other regions at that same "depth"
+that you can explore later. So be careful that you have found all the
+treasure before you leave a level, or you may never find it again! The
+monsters, of course, can use the stairs, and you may eventually encounter
+them again.
+
+In the dungeon, there are many things to find, but your character must
+survive many horrible and challenging encounters to find the treasure lying
+about and take it safely back to the town to sell.
+
+~~~~~23|Light
+There are two sources for light once inside the dungeon: permanent light
+which has been magically placed within rooms, and a light source carried by
+the player (or some of the monsters). If neither is present, the character
+will be unable to see. This will affect searching, picking locks, disarming
+traps, reading scrolls, casting spells, browsing books, etc. So be very
+careful not to run out of light!
+
+A character must wield a torch or lamp in order to supply his own light. A
+torch or lamp burns fuel as it is used, and once it is out of fuel, it stops
+supplying light. You will be warned as the light approaches this point. You
+may use the "Fuel" command ("F") to refuel your lantern (with flasks of oil)
+or your torch (with other torches), so it is a good idea to carry extra
+torches or flasks of oil, as appropriate. There are rumours of objects of
+exceptional power which glow with their own never-ending light.
+
+~~~~~08|Objects
+#####R=== Objects Found In The Dungeon ===
+
+The mines are full of objects just waiting to be picked up and used. How
+did they get there? Well, the main source for useful items are all the
+foolish adventurers (like you?) that proceeded into the dungeon before you.
+They get killed, and the helpful creatures scatter the various treasures
+throughout the dungeon. Most cursed items are placed there by the joyful evil
+sorcerers, who enjoy a good joke when it gets you killed.
+
+You pick up objects by moving on top of them. You can carry up to 23
+different items in your backpack while wearing and wielding up to 12 others.
+Although you are limited to 23 different items, each item may actually be a
+"pile" of up to 99 similar items. If you somehow manage to stuff 24 items
+into your pack, for example, by removing an item from your head while your
+pack is full, then your pack will "overflow" and the most recently added
+item will fall out and onto the ground. You will be warned about any command
+that seems likely to induce this behaviour.
+
+You are, in addition, limited in the total amount of weight that you can
+carry. As you approach this value, you become slower, making it easier for
+monsters to chase you. Note that there is no upper bound on how much you can
+carry, if you do not mind being slow. Your weight limit is determined by your
+strength.
+
+Objects do not block the line of sight, but may stack on top of one another,
+with the one on top hiding others beneath it.
+
+ Q: I'm standing on a pile of items. How do I see what's in the pile
+ without picking it all up, moving it, or destroying it all?
+ A: 1. Stand on the pile in question
+ 2. Type shift + i (examine)
+ 3. Type - (examine items on floor)
+ 4. Type * (expand list of items on floor)
+ 5. (as needed) Type letter associated with item to look at it more
+ closely.
+
+Objects may also obscure stairs, Ways and void jumpgates.
+
+ Q: I'm standing on a pile of items. Is there a command to see if
+ there is a stair beneath the pile?
+ A: Stairs, void jumpgates and Ways that obscured by clutter still
+ function.
+ You are advised to take a good hard look at your surroundings before
+ creating lots of dungeon clutter. You can see if there is a stair
+ beneath the pile with either of these methods:
+ 1. Pick up, move, or eliminate the pile.
+ 2. Press l (look), then select the square you wish to inquire about.
+ Press <enter>; it will scroll through everything on the ground,
+ and eventually it ends with "It is in a Void Jumpgate", or
+ whatever.
+
+
+Many objects found within the dungeon have special commands for their use.
+Wands must be Aimed, staves must be Used, scrolls must be Read, and potions
+must be Quaffed. You may, in general, not only use items in your pack, but
+also items on the ground, if you are standing on top of them. For a detailed
+list of the commands to use objects, see *****command.txt*0[command.txt].
+
+Chests are complex objects, containing traps, locks, and possibly treasure
+or other objects inside them once they are opened. Many of the commands that
+apply to traps or doors also apply to chests and, like traps and doors, these
+commands do not work if you are carrying the chest.
+
+One item in particular will be discussed here. [[[[[BThe scroll of "Word of]
+[[[[[BRecall"] can be found within the dungeon, or bought at the temple in
+town. It acts in two manners, depending upon your current location. If read
+within the dungeon, it will teleport you back to town. If read in town, it
+will teleport you back down to the deepest level of the dungeon to which your
+character has previously journeyed. This makes the scroll very useful for
+getting back to the deeper levels of the dungeon. Once the scroll has been
+read it takes a while for the spell to act, so don't expect it to save you
+in a crisis. Reading a second scroll before the first has had a chance to
+take effect will cancel both scrolls. Since an accidental dive to a new depth
+(via a trapdoor, for example), may result in the Word of Recall dungeon depth
+being 'broken', so to speak (meaning that the next Word of Recall in town
+will take you back deeper than you would like to), there is a feature in
+ToME which allows you to read a scroll of Word of Recall on a different
+level and 'reset' the recall depth to that level (instead of the deepest
+level). Some dungeons cannot be recalled into, though you can still recall
+out.
+
+You may "inscribe" any object with a textual inscription of your choice.
+These inscriptions are not limited in length, though you may not be able to
+see the whole inscription on the item. The game applies special meaning to
+inscriptions containing any text of the form "@#" or "@x#" or "!x" or "!*",
+see "*****command.txt*0[command.txt]" and "*****macrofaq.txt*0[macrofaq.txt]".
+
+The game provides some "fake" inscriptions to help you keep track of your
+possessions. Wands and staves which are known to be empty will be inscribed
+with "empty". Objects which have been tried at least once but haven't been
+identified yet will be inscribed with "tried". Cursed objects are inscribed
+with "cursed". Broken objects may be inscribed with "broken". Also, any
+item which was purchased at a discount, implying that it is slightly
+"sub-standard", will be inscribed with the appropriate "discount", such as
+"25% off". Note that these inscriptions are fake, and cannot be removed,
+though they can be covered up by a real inscription if you so desire. Try
+"_" as a nice short one.
+
+Also, occasionally you will notice that something in your inventory or
+equipment list seems to be magical. High level characters are much more
+likely to notice this than beginning characters. When you do notice this,
+the item in question will be inscribed with "good" or "cursed" as is
+relevant. You can increase your ability to notice magical effects of armour
+and weapons by increasing the *****skills.txt*01[Combat] skill. You can increase your ability
+to sense particularly well enchanted magical items (potions, scrolls. wands
+etc) by increasing your *****skills.txt*21[Magic] skill. If you increase these
+high enough, you will gain a special method of "sensing" your
+inventory/equipment items, which tells you not only whether an item is "good"
+or "cursed", but also if it is "average", "special", "excellent", "terrible" or
+"worthless".
+
+~~~~~21|Objects|Colour of inventory slot letter
+The colour of the letter that identifies each item in your backpack can tell
+you something about their magical status. Grey indicates the item has not been
+identified yet. After identification, the colour changes to one of the
+following: white, indicating it is normal; blue indicates it is an ego-item
+(pseudo-id's as {excellent}); yellow indicates it is an artifact {special};
+green shows it is an artifact which is part of a set.
+
+It is rumoured that rings of power and extra rare spell books may be found
+deeper in the dungeon....
+
+And lastly, a final warning: not all objects are what they seem. The line
+between tasty food and annoying mushroom is a fine one, and sometimes a
+potion will reach out and bite you...
+~~~~~09|Objects|Cursed Objects
+~~~~~10|Cursed Objects
+#####R=== Cursed Objects ===
+
+Some objects, mainly armour and weapons, have had curses laid upon them.
+These horrible objects will look like any other normal item, but will
+detract from your character's stats or abilities if worn. They will also
+be impossible to remove until the curse is removed. In fact some are
+so badly cursed that even this will not work, and more potent methods are
+needed.
+
+If you wear or wield a cursed item, you will immediately feel something
+wrong. The item will also be inscribed "cursed".
+
+Shopkeepers will refuse to buy any known cursed item.
+~~~~~13|Mining
+~~~~~11|Dungeons|Mining
+#####R=== Digging and Mining ===
+
+It is possible for you to be trapped within the dungeon. You will not be able
+to dig your way out without a digging tool (shovel, pick, or other means of
+digging). It is absolutely essential to always carry some kind of digging tool,
+even when you are not planning on tunnelling for treasure. Do not leave the
+town level of Bree without a digger!
+
+Picks and shovels have a digging ability expressed as "(+<num>)", e.g. (+2).
+The higher the number, the better the digging ability of the tool. Diggers are
+effective against rubble, trees, and many walls. Rubble and veins may hide
+treasure; trees do not.
+
+You dig in something with the tunnel (shift + t) command. Thorough digging
+removes one ASCII square (i.e. tile) of what is being dug. This may require
+multiple attempts depending on how good your digger is (and how high your
+strength is). Once the square is removed, you will be informed if you found
+anything there. If another diggable square exists beyond the area you just dug,
+you can begin the process again.
+
+Some dungeons contain rich strikes which may be found only by mining it out of
+the walls. Quartz veins are the richest, yielding the most metals and gems, but
+magma veins may also hide hoards within them. When digging rock, granite is
+much harder to dig through than quartz or magma veins, so it is much faster to
+follow a vein exactly and dig around the granite. There is also a game option
+for highlighting magma and quartz within the walls, which makes this easier.
+
+If the character has a scroll, staff, or spell of treasure location, she can
+immediately locate all strikes of treasure within a vein shown on the screen.
+This makes mining much easier and more profitable.
+~~~~~12|Dungeons|Doors, Passages, Rooms and Staircases
+#####R=== Staircases, Ways, Void jumpgates, Secret Doors, Passages, and Rooms ===
+
+Staircases are the manner in which you get deeper or climb out of the
+dungeon. The symbols for the up and down staircases are the same as the
+commands to use them. A "<" represents an up staircase and a ">" represents
+a down staircase. You must move your character over the staircase before
+you can use it. You use it by typing the same character as the staircase
+itself (either "<" or ">".)
+
+In flat environments such as forests, Ways replace staircases. On the map, Ways
+are identical to staircases and behave the same way.
+
+Yellow down stairs and Ways are quest entrances (although not every quest
+is reached by such means).
+
+Shafts are also represented by "<" or ">", but are brown. They work similarly
+to stairs and Ways, but if you use one, you might traverse more than one
+dungeon level all in one go as a result.
+
+Stairs, impenetrable walls, and shop entrances like titanium walls, and the
+doors into shops, cannot be destroyed by any means (although their location can
+occasionally change under the right circumstances).
+~~~~~23|Void jumpgates
+A void jumpgate appears on your map as a violet "+". Jumpgates always occur in
+pairs. To activate a jumpgate, stand on it and type ">". You will instantly
+appear on top of its paired jumpgate, which will be somewhere else on the same
+dungeon level.
+
+Many secret doors are used within the dungeon to confuse and demoralise
+adventurers foolish enough to enter. But with some luck, and lots of
+concentration, you can find these secret doors. Secret doors will sometimes
+hide rooms or corridors, or even entire sections of that level of the
+dungeon. Sometimes they simply hide small empty closets or even dead ends.
+Secret doors always look like granite walls, just like traps always look
+like normal floors.
+
+Creatures in the dungeon will generally know and use these secret doors, and
+can sometimes be counted on to leave them open behind them when they pass
+through.
+
+For historical reasons, secret doors are never locked.
+
+~~~~~18|Pets
+~~~~~19|Companions
+~~~~~20|Monsters|Pets
+#####R=== Pets and Companions ===
+You may, in the course of a game, acquire friendly monsters who will help you
+defeat enemies. There are several different types of these, you can determine
+which your monster is by 'l'ooking at it.
+[[[[[vneutral] This monster will not help you by attacking other monsters, but nor
+ will it attack you.
+[[[[[vco-aligned] This monster will attack other enemy monsters, but you will not
+ gain any experience for its kills.
+[[[[[vpet] This monster will kill things for you. The amount of experience you gain
+ from its kills is determined by the level of your *****skills.txt*42[Monster-lore] skill.
+ This monster will gain levels and experience of its own, but cannot travel
+ between dungeon levels.
+[[[[[vcompanion] This type of monster will not only take experience and level up like
+ pets, but will also follow you from one dungeon level to the next. If
+ you successfully complete an adventurer quest for a lost sword and let
+ him join you, he will become a companion. Once again the amount of
+ experience you gain from a companion's kill depends upon your
+ Monster-lore skill.
+
+Your Monster-lore skill also determines the maximum number of pets and
+companions you can have at any one time.
+
+Pets, companions and co-aligned creatures cannot deliver killing blows to
+uniques or quest monsters. You must do this yourself!
+
+You can give commands to pets and companions to make them more useful, using
+the "P" command. The list of available commands is as follows:
+[[[[[vdismiss companions] Dismisses your companions. They can be difficult to get rid
+ of any other way.
+[[[[[vdismiss pets] Dismisses pets. You will be given the opportunity to dismiss all
+ current pets, or if you answer no to that first question, to
+ dismiss specific pets.
+[[[[[vcall pets] Calls your pets (and companions) to you.
+[[[[[vfollow me] Asks your pets (and companions) to follow you. They do have a mind of
+ their own, and may not be able to travel as fast as you can.
+[[[[[vseek and destroy] Selecting this will cause your pets and companions to wander
+ further from you, looking for enemies to kill.
+[[[[[vallow/disallow open doors] Selecting this toggles whether your pets and
+ companions can open doors.
+[[[[[vallow/disallow pickup items] Selecting this toggles whether your pets and
+ companions can pick up items. Disallowing it will
+ cause the monster to drop any items he is carrying on
+ the floor.
+[[[[[vgive target to a friend] Selecting this will cause one of your pets or
+ companions to attack your current target.
+[[[[[vgive target to all friends] Causes all pets or companions to attack your
+ current target.
+[[[[[vfriend forget target] All your friends will follow their normal attack
+ patterns, neglecting any targets you have given them.
+
+~~~~~14|Objectives
+#####R=== Game Objectives ===
+
+In ToME you will be required to complete a certain number of quests. Your
+first quest is to discover the true nature of the evil lurking in the Tower of
+Dol Guldur near Mirkwood.
+
+Each quest may lead on to others, and most quests can be postponed until when
+you feel ready to tackle them. Simply explore other dungeons until you feel you
+have gained enough experience to tackle your next task. Other quests are
+optional and can be used for further experience.
+
+Once you have finished your final quest, when you are ready to retire, simply
+"commit suicide" ("^Q") to have your character entered into the high score list
+as a winner. Note that until you retire, you can still be killed, so you may
+want to retire before wandering into a hoard of nasties....
+
+You may also like to make a character sheet of your winning character (by
+going through the "C"haracter screen and choosing "f"ile), and post in the
+rec.games.roguelike.angband newsgroup with a text copy of the dump pasted
+into the post. Include details about anything major that happened to your
+character - did they find a ring of speed (+10) on dungeon level 2? Or had
+they reached dungeon level 60 before finding their first artifact? Did you
+have a really scary moment that stands out from the rest of the game? And how
+*did* you actually win the game, anyway?
+
+~~~~~15|Dying
+~~~~~17|Loading old characters
+#####R=== Upon Death and Dying ===
+
+If your character falls below 0 hit points, he has died and cannot be
+restored (for most classes, anyway). A tombstone showing information about
+your character will be displayed. You are also permitted to get a record of
+your character, and all your equipment (identified) either on the screen or
+in a file.
+
+Your character will leave behind a reduced save file, which contains only
+the monster memory and your option choices. It may be restored, in which
+case the new character is generated exactly as if the file was not there,
+but the new player will find his monster memory containing all the experience
+of past incarnations.
+
+In this way, death in ToME is permanent. You cannot simply 'reload at the last
+save' as in most other contemporary games. Death is permanent, just as it is
+in real life.
+
diff --git a/lib/mods/theme/help/dunspoil.txt b/lib/mods/theme/help/dunspoil.txt
new file mode 100644
index 00000000..2da6d6b7
--- /dev/null
+++ b/lib/mods/theme/help/dunspoil.txt
@@ -0,0 +1,173 @@
+|||||oy
+~~~~~01|Dungeons|Spoilers
+~~~~~02|Spoilers|Dungeons
+#####R=== ToME's DUNGEONS ===
+
+There are numerous dungeons within Middle-earth, but not all
+of them are required to be ventured into. The original Angband
+dungeon has been split into 4 parts, each found near or at a
+different town. Travel between towns is usually easiest by
+using the wilderness overview map ("<" from the town level),
+but remember to take lots of food with you!
+
+#####GThe Basic Dungeons
+#####G------------------
+
+#####G1. Barrow-Downs
+Found near the outskirts of Bree (the starting town), this
+dungeon is where you should begin your adventure. It
+contains the main Dungeon levels 1 (50') to 10 (500'),
+after which it becomes necessary for the character to seek
+out a new dungeon in order to be able to descend further in
+their quest to kill Morgoth.
+
+#####G2. Mirkwood
+The Mirkwood forest contains levels 11 (550') to 33 (1650'),
+and can be found to the north-east of Lothlorien.
+
+#####G3. Mordor
+The Land of Mordor is a hot, cavernous region, containing
+levels 34 (1700') to 66 (3300') of the dungeon. Located to
+the East of Minas Anor, it is a place filled with danger,
+and only a wary adventurer will make it through to the other
+end of this dungeon.
+
+#####G4. Angband
+Only the most successful of adventurers usually make it this
+far. The Dungeon Angband contains both Sauron and Morgoth,
+who will gladly wipe out any who dare to oppose them! This
+dungeon covers levels 67 (3350') to 127 (6350'), but Sauron
+waits for you at level 99, and Morgoth at level 100. This
+dungeon can be found near Gondolin.
+
+
+#####GAdditional ToME Dungeons
+#####G------------------------
+
+In addition to the basic 4 dungeons, there are numerous other
+dungeons scattered around the world for an adventurer to explore
+while preparing for the final fight. Many of the dungeons have a
+guardian at the bottom of them, and a few have unique levels
+somewhere within them (like an orc town) with guaranteed artifacts
+and nasties within them. Other than the unique levels, all of the
+dungeons can be exited and re-entered at your leisure.
+
+Be warned though that some dungeons are partly toxic to the
+adventurer, and will damage you BY THEMSELVES just by you walking
+within them!
+
+#####GOrc Cave
+A dark tunnel leading to an Orc Cave, guarded at its base by Azog,
+King of the Uruk-Hai. Also somewhere within this dungeon is the
+hidden special level called Deathwatch.
+Equivalent to dungeon levels 10 to 22.
+
+#####GThe Old Forest
+A Forest is a haven for many animals, both of the good variety, and
+the bad. This forest is no exception. In the past, unsuccessful
+attempts have been made to cultivate this land, and it is possible
+that some of the towns may remain. It is also rumoured that Old Man
+Willow has made his home here, and is the source of the Forest's
+resistance to cultivation.
+Equivalent to dungeon levels 13 to 25.
+
+#####GHelcaraxe
+The Grinding Ice of Helcaraxe is a bitterly cold series of caverns,
+and guarded by the White Balrog.
+Equivalent to dungeon levels 20 to 40.
+
+#####GThe Sandworm lair
+A deep sandhole where most worms originated, it is guarded at its
+base by the Sandworm Queen.
+Equivalent to dungeon levels 22 to 30.
+
+#####GThe Heart of the Earth
+A dark passage leading into the heart of the world, the Heart of
+the Earth is the source of all the earth's changes. Some claim it
+to be the home of Golgarach, the Living Rock, who assists in the
+creation of new, ever-changing landforms.
+Equivalent to dungeon levels 25 to 36.
+
+#####GMaze
+A strange Maze where it becomes very difficult to remember where you
+have been, it is guarded at the bottom by The Minotaur of the Labyrinth.
+Equivalent to dungeon levels 25 to 37.
+
+#####GCirith Ungol
+The dungeon Cirith Ungol is full of poisonous fumes rising from the
+ground, and the land here looks diseased. Shelob is said to lurk
+within these depths.
+Equivalent to dungeon levels 25 to 50.
+
+#####GThe Land Of Rhun
+The Land Of Rhun is located on a large plain, and has been taken over
+by Ulfang the Black, Morgoth's first Easterling follower.
+Equivalent to dungeon levels 26 to 40.
+
+#####GThe Mines of Moria
+A stone door leads down to the depths of the Moria. Once the home of
+the dwarves, the mines have been taken over by creeping evil things, and
+unlucky adventurers may well stumble upon their training grounds. In
+the depths lurks Durin's Bane, the Balrog of Moria, and return from
+these depths can be difficult....
+Equivalent to dungeon levels 30 to 50.
+
+#####GThe Small Water Cave
+A small water cave filled with salt water, which rusts and damages an
+adventurer's equipment. This cave is not very deep, and is guarded by
+The Watcher in the Water.
+Equivalent to dungeon levels 32 to 34.
+
+#####GSubmerged Ruins
+The lost land of Numenor lies submerged here. The salt water causes
+everything to rust. These ruins are guarded by Ar-Pharazon the
+Golden.
+Equivalent to dungeon levels 35 to 50.
+
+#####GIllusory Castle
+The Illusory Castle is a very strange and confusing place for an
+adventurer to visit, and is rumoured to contain many strange
+monsters. Deep within the castle can be found The Glass Golem.
+Equivalent to dungeon levels 35 to 52.
+
+#####GPaths of the Dead
+A dark underground graveyard, this place looks extremely dangerous.
+It is claimed that the dead have all arisen in these depths, and are
+lead by Feagwath, the Undead Sorcerer.
+Equivalent to dungeon levels 40 to 70.
+
+#####GThe Sacred Land Of Mountains
+The Sacred Land Of Mountains is located in a large mountain range,
+with the remains of many old towns. Considered a perfect place to hide
+for one who could fly, it is rumoured that Trone the rebel Thunderlord
+fled into the ruins here.
+Equivalent to dungeon levels 45 to 70.
+
+#####GThe Tower of Dol Guldur
+The tower of of Dol Guldur is the last known residence of one known only
+as "the Necromancer". It is rumoured to be filled with his conjurations,
+although none have made it out of the Tower alive to confirm or deny this
+rumour.
+Equivalent to dungeon levels 57 to 70.
+
+#####GErebor, the Lonely Mountain
+A big, dark and frightening tunnel leading to the depth of the Lonely
+Mountain, this large cave is the ancestral home of the Dragons.
+Glaurung, Father of the Dragons has long made his home here.
+Equivalent to dungeon levels 60 to 72.
+
+#####GMount Doom
+A steaming cave in the centre of Mount Doom, this place is *hot*.
+It is said that Sauron forged the One Ring here and that it's the only place
+where it could be destroyed.
+Equivalent to dungeon levels 85 to 99.
+
+#####GNether Realm
+The Nether Realm is accessible only through a magic portal. Also
+known as Hell, this land is lethal to any who are unprepared for the
+ravages of Nether, and is guarded by Tik'srvzllat.
+#####BEquivalent to dungeon levels 666 to 696!!!!!
+
+
+ Created by Dawnmist for PernAngband 5.x.x
+ Updated for ToME 2.1.x
diff --git a/lib/mods/theme/help/essences.txt b/lib/mods/theme/help/essences.txt
new file mode 100644
index 00000000..f329fa80
--- /dev/null
+++ b/lib/mods/theme/help/essences.txt
@@ -0,0 +1,219 @@
+|||||oy
+~~~~~01|Spoilers|Essences
+~~~~~02|Alchemist|Essence Spoiler
+#####REssence Spoiler for ToME 2.2.0
+#####R------------------------------
+
+Essences are the tools of the trade for Alchemists, and unfortunately are
+useless for any other class. Alchemists use essences to create magical
+items for them to use.
+
+They can be either found on the floor while exploring the dungeon, or
+extracted from other magical items the alchemist finds during his
+adventures.
+
+To create an artifact, the alchemist will first have to have learnt the
+Artifact Creation ability. This ability costs 70 skill points (yes, 70,
+it's a very powerful ability!). And you need an alchemy skill of at least
+40, plus INT and WIS at 35 (thats 18/170 in non-linear form).
+To create the artifact, the alchemist will have to sacrifice 10 hit points,
+and an amount of magic essence similar to his skill in alchemy. The
+alchemist then allows the artifact to gain experience, and when it has
+enough, uses that experience to add abilities to the artifact. The
+alchemist can allow the artifact to continue to gain experience, thus
+keeping open the option to add more abilities later. This requires a
+similar amount of magic essence, but does not require the sacrifice of
+more hit points.
+
+Note that the experience you gain is divided among the artifacts that you
+have as well as going to yourself, so you will gain levels more slowly when
+empowering artifacts. Also, the artifact only gets 60% of the experience.
+So killing a creature worth 20xp would gain 10 for you, and 6 for the
+artifact.
+
+You can also modify existing artifacts when you attain skill level 50. Also
+at skill level 50 you will gain the ability to make temporary artifacts,
+which don't require the complex empowerments that regular items require,
+but also vanish after awhile.
+
+You cannot give an artifact an ability unless you have *Identified* an
+artifact which has that ability.
+
+For every four levels gained in the alchemy skill, the alchemist learns
+about objects of level (skill level)/4, starting by learning about level 1
+objects at skill level 0. (actually 1, but who's counting?)
+
+At skill level 5 you gain the ability to make ego items - but watch it!
+Your base failure rate will be 90%, and won't be 0% until you reach skill
+level 50. Adding gold will increase the chances of success in direct
+proportion to the value of the item you are trying to create. Note that
+this results in automatic success when the item you are trying to create
+happens to pick up a curse in the process.
+
+At skill level 5 you also gain knowledge of some basic ego item recipes.
+These are: Acidic, Shocking, Fiery, Frozen, Venomous, and Chaotic weapons,
+Resist Fire armour, and light sources of Fearlessness.
+
+At skill level 10 you will gain knowledge of digging ego items, if you have
+selected the option "always generate very unusual rooms" (ironman_rooms).
+
+At skill level 15 you can create ego wands, staves, rings, etc.
+
+At skill level 25 you gain the ability to empower double ego items.
+
+At skill level 50 you gain the ability to create temporary artifacts, which
+don't require any exotic ingredients beyond a single corpse of any type.
+
+Between skill levels 25 and 50, you will steadily gain the ability to set
+more and more flags.
+
+To finalise an artifact, you "P"ower it, and select the powers you want.
+Powers are divided into the following six categories:
+*****essences.txt*03[Stats, Sustains, Luck, Speed, Vision, etc.]
+*****essences.txt*04[Misc. (Auras, Light, See Invisibility, etc.)]
+*****essences.txt*05[Weapon Brands]
+*****essences.txt*06[Resistances and Immunities]
+*****essences.txt*07[ESP and Curses]
+*****essences.txt*08[Artifact Activations]
+
+~~~~~03
+#####GStats, Sustains, Luck, Speed, Vision, etc.
+lvl xp Power
+40 5000 Add to Strength Ring of Strength
+43 5000 Add to Intelligence Ring of Intelligence
+46 5000 Add to Wisdom Amulet of Wisdom
+46 5000 Add to Dexterity Ring of Dexterity
+42 5000 Add to Constitution Ring of Constitution
+30 5000 Add to Charisma Amulet of Adornment
+32 1000 Sustain Strength Ring of Sustain Strength
+34 1000 Sustain Intelligence Ring of Sustain Intelligence
+28 1000 Sustain Wisdom Ring of Sustain Wisdom
+36 1000 Sustain Dexterity Ring of Sustain Dexterity
+36 1000 Sustain Constitution Ring of Sustain Constitution
+25 1000 Sustain Charisma Ring of Sustain Charisma
+40 50000 Speed Ring of Speed
+38 150000 Extra Attacks Ring of Extra Attacks
+32 5000 Stealthy Left Insole from a Used Soft Boot
+29 2000 Adds to Searching Filthy Rag
+ 6 1000 Helps Infravision Brass Lantern
+30 1000 Lucky Rabbit's Left Forefoot
+25 30000 Aids in digging Pick
+40 50000 Multiplies Life Troll's Heart
+
+~~~~~04
+#####GMisc. (Auras, Light, See Invisibility, etc.)
+lvl xp Power
+20 15000 Invisibility Potion of Invisibility
+20 4000 See Invisible Potion of Invisibility
+20 30000 Free Action Iron Spike
+38 90000 Reflection Large Metal Shield
+20 30000 Aura of Fire Lungs from an Ancient Red Dragon
+25 30000 Aura of Lightning Lungs from an Ancient Blue Dragon
+ 8 1000 Light Everburning Torch
+20 10000 Bright Light Dwarven Lantern
+40 100000 Sunlight Feanorian Lamp
+40 200000 Flight Suit of Dragon Armour (any colour)
+50 10000000 Automatically IDs Morgoth's Testicles
+29 2000 Anti-Teleportation Teleport Inhibiting Amulet
+34 2000 Anti-Magic Magic Inhibiting Amulet
+50 100000 Wraith Form Potion of Invulnerability
+15 1000 Levitation Potion of Berserk Strength
+20 10000 Slow Digestion Lembas Wafer
+32 20000 Regenerate Mushroom of Unhealth
+12 20000 Teleport Mushroom of Confusion
+
+~~~~~05
+#####GWeapon Brands
+lvl xp Power
+30 20000 Extra Critical Hits Whip
+30 30000 Wounds Monsters Blade of Chaos
+26 6000 Vampiric Rod Tip of Drain Life
+16 2000 Slay Animal Dead Animal's Body
+25 2000 Slay Evil Evil Dead Thing's Remains
+30 2000 Slay Undead Remains of Undead Monster
+40 1500 Slay Demon Demon's Corpse
+10 700 Slay Orc Dead Orc
+16 700 Slay Troll Dead Troll
+25 900 Slay Giant Dead Giant
+33 2000 Slay Dragon Dead Dragon (any size will do)
+41 5000 *Slay* Dragon Mature Multi-Hued Dragon's Remains
+41 90000 *Slay* Undead Dead Summoner of Greater Undead
+41 90000 *Slay* Demon Lesser Balrog's Corpse
+36 20000 Vorpal
+40 90000 Earthquakes
+ 3 2000 Poison Brand
+12 2000 Acid Brand
+10 2000 Lightning Brand
+ 6 2000 Fire Brand
+ 8 2000 Frost Brand
+30 3000 Extra Might (Bows Only)
+35 3000 Extra Shots (Bows Only)
+
+~~~~~06
+#####GResistances and Immunities
+lvl xp Power
+49 500000 Immune to Acid Ancient Black Dragon's Foreskin
+50 500000 Immune to Lightning Ancient Blue Dragon's Foreskin
+49 500000 Immune to Fire Ancient Red Dragon's Foreskin
+50 500000 Immune to Cold Ancient White Dragon's Foreskin
+30 30000 Hold Life Amulet of the Magi
+12 10000 Resist Acid Ring of Acid
+15 10000 Resist Lightning Ring of Lightning
+13 10000 Resist Fire Potion of Resist Heat
+14 10000 Resist Cold Potion of Resist Cold
+25 30000 Resist Poison Potion of Cure Poison
+26 10000 Resist Fear Ring of Fear Resistance
+31 60000 Resist Light Ring of Light and Darkness Resistance
+31 60000 Resist Darkness Ring of Light and Darkness Resistance
+30 30000 Resist Blindness Ring of Blindness Resistance
+30 30000 Resist Confusion Ring of Confusion Resistance
+30 60000 Resist Sound Ring of Sound Resistance
+30 60000 Resist Shards Ring of Shard Resistance
+30 60000 Resist Nether Ring of Nether Resistance
+30 60000 Resist Nexus Ring of Nexus Resistance
+30 60000 Resist Chaos Ring of Chaos Resistance
+30 60000 Resist Disenchantment Ring of Disenchantment Resistance
+
+~~~~~07
+#####GESP and Curses
+lvl xp Power
+50 -100000 Temporary Item Corpse, any corpse
+10 -2000 Self-Cursing Filthy Rag
+45 -10000 Causes the Black Breath Sprig of Athelas
+40 -5000 Ancient Curse Scroll of *Remove Curse*
+40 -5000 Drains your Experience
+30 -5000 Aggravates Monsters
+30 -500 Curse Scroll of Remove Curse
+50 -5000 Permanently Cursed
+35 -2000 Can't be Dropped
+45 -5000 Drains your Hit Points
+20 -50000 Wielder Can't Move
+40 20000 Telepathy Formerly Floating Eye
+25 3000 Sense Orcs
+25 3000 Sense Trolls
+25 5000 Sense Dragons
+25 5000 Sense Giants
+25 5000 Sense Demons
+25 5000 Sense Undead
+25 5000 Sense Evil
+25 5000 Sense Animals
+25 5000 Sense Thunderlords
+25 5000 Sense Good
+25 5000 Sense Nonliving
+25 5000 Sense Unique Monsters
+25 2000 Sense Spiders
+
+~~~~~08
+#####GArtifact Activations
+lvl xp Power
+40 40000 Sunlight Brass Lantern
+20 4000 Magic Missile (1)
+30 300000 Magic Missile (2)
+40 400000 Ball of Missiles
+30 300000 Bolt of Lightning
+30 300000 Ball of Lightning
+35 350000 Ball of Lightning(2)
+40 400000 Ball of Lightning(3)
+40 400000 Ball of Lightning(4)
+45 450000 Breath Lightning
+50 40000 Fire a Rocket
diff --git a/lib/mods/theme/help/experien.hlp b/lib/mods/theme/help/experien.hlp
new file mode 100644
index 00000000..5e0bb9eb
--- /dev/null
+++ b/lib/mods/theme/help/experien.hlp
@@ -0,0 +1,28 @@
+|||||oy
+~~~~~01|Experience
+#####RGaining experience
+#####R==============================================
+
+The principle way for your character to gain experience (XP) is to kill
+monsters. There are a few other ways too, like lockpicking, but these only
+give small rewards.
+
+Once your character has gained enough experience to go up a level, then she
+will be given skill points to spend as you see fit. These points can be
+spent on either
+
+ *****/askills.txt*0[(a) Skills] which improve more for each point you put into them,
+or
+ *****/bability.txt*0[(b) Abilities] which are one-off purchases and grant your character new,
+ non-improvable powers
+
+Certain monsters can "drain" your experience, and thus your level. Although you
+do not lose the skill points you've already gained, you also will not gain
+further points until you reach a character level you have not already
+achieved. Luckily, you can restore drained experience through magical means,
+or by simply regaining the experience all over again.
+
+ *****/ynewbie.hlp*0[(y) New player help menu]
+ *****/zhelp.hlp*0[(z) Main menu]
+
+
diff --git a/lib/mods/theme/help/explore.hlp b/lib/mods/theme/help/explore.hlp
new file mode 100644
index 00000000..0c302ab8
--- /dev/null
+++ b/lib/mods/theme/help/explore.hlp
@@ -0,0 +1,16 @@
+|||||oy
+~~~~~01|Help|Exploring menu
+~~~~~02|Exploring menu
+#####RWelcome to the ToME Help System.
+#####R==============================================
+
+Please choose one of the following online help files:
+
+ *****/acommand.txt*0[(a) Available commands] How to control your character
+ *****/battack.txt*0[(b) Attacking monsters] How to attack, elemental attacks and resistances etc
+ *****/cdungeon.txt*0[(c) Exploring the dungeons] Symbols on your map, mining, pets, objects + more
+
+ *****/ynewbie.hlp*0[(y) New player help menu]
+ *****/zhelp.hlp*0[(z) Main menu]
+
+ \ No newline at end of file
diff --git a/lib/mods/theme/help/fatespoi.txt b/lib/mods/theme/help/fatespoi.txt
new file mode 100644
index 00000000..2815129e
--- /dev/null
+++ b/lib/mods/theme/help/fatespoi.txt
@@ -0,0 +1,28 @@
+|||||oy
+~~~~~01|Spoilers|Fates
+~~~~~02|Fates (spoiler)
+#####R Fate Spoiler
+#####R Accurate for PernAngband 5.x.x
+#####R by Dustin Ragan
+
+Numerous spirits inhabit the land of Arda, from the murderous barrow wights to
+the enigmatic Tom Bombadil. These spirits usually are bound to a specific
+geographic region, but there are exceptions to this rule. Sometimes one of
+these spirits will take interest in an adventurer. This can either be very,
+very good or very, very bad. These spirits will "rig" reality to ensure that
+something happens--or doesn't happen.
+
+In order to attract the attention of a spirit, the adventurer must be somewhat
+experienced, having attained at least the 11th level of experience. Every 10
+game turns, which corresponds to 1 normal speed player turn, there is a
+1 in 50,000 chance of gaining a fate. When this fate is chosen, there is a
+7/18 chance of being fated to find a specific mundane item on a specific
+dungeon level. A more belligerent spirit will, 7/18 of the time, summon a
+malicious monster to do battle on a specific dungeon level. There is a 1/9
+chance to be destined to find an artifact on a given level. There is also
+a 1/18 chance that you will meet your demise on a given level. Finally, there
+is a 1/18 chance of becoming invulnerable to attacks from mortals.
+
+Whenever a level is being chosen for a fate, it is always chosen within 20
+levels of your current recall depth. Items, monsters, and artifacts are all
+generated up to 10 levels out of depth for your current recall depth.
diff --git a/lib/mods/theme/help/foot.aux b/lib/mods/theme/help/foot.aux
new file mode 100644
index 00000000..47328799
--- /dev/null
+++ b/lib/mods/theme/help/foot.aux
@@ -0,0 +1,4 @@
+</TT></PRE>
+</FONT>
+</body>
+</html>
diff --git a/lib/mods/theme/help/g_aule.txt b/lib/mods/theme/help/g_aule.txt
new file mode 100644
index 00000000..89399179
--- /dev/null
+++ b/lib/mods/theme/help/g_aule.txt
@@ -0,0 +1,61 @@
+|||||oy
+~~~~~01|Gods|Aule
+~~~~~02|Aule
+#####R === Aule the Smith ===
+
+Aule the Smith is the inventor and smith of the Valar.
+His most faithful followers are those of the class *****c_stonewr.txt*0[Stonewright].
+
+#####GThe benefits of worshipping Aule the Smith
+1. As you increase your piety, Aule will grant you a boost to your accuracy
+ and damage to a maximum of +5.
+2. As your piety increases, he will grant you resistance to fire.
+3. If you are praying to him at the time, there is a chance that he will
+ cast Stone Skin on you.
+4. Aule likes Dwarves, Petty-dwarves, Gnomes, and Dark Elves.
+4. Your piety will increase slightly more if you are wielding an axe or a hammer.
+
+#####GThe disadvantages of worshipping Aule the Smith
+1. He doesn't like it if you kill dwarves of any kind.
+2. Your piety will decrease over time unless you are a Dwarf, Petty-dwarf,
+ Gnome, or Dark-Elf.
+3. He will completely abandon you if you wear The One Ring.
+~~~~~~03|Aule|Prayers
+#####GAule's Magic
+Worshipping Aule the Smith gives the adventurer access to a set of special
+spells that come directly from the hands of Aule. These spells use your piety
+to cast rather than your spellpoints, and the level of spells that Aule will
+permit you to use is determined by your Prayer skill - how skillful you are
+in asking for his help without offending him!
+
+There is a special book - called the "The Earth Tome of Aule" which
+contains instructions for the procedure for each of the prayers Eru will
+grant. There are four prayers all told, which are:
+1. [[[[[BFirebrand] (Level 1)
+ Imbues your melee weapon with fire to deal more damage.
+ At level 15 it spreads over a 1 radius zone around your target.
+ At level 30 it deals holy fire damage.
+2. [[[[[BEnchant Weapon] (Level 10)
+ Tries to enchant a weapon to-hit.
+ At level 5 it also enchants to-dam.
+ At level 45 it enhances the special powers of magical weapons.
+ The might of the enchantment increases with level.
+3. [[[[[BEnchant Armour] (Level 15)
+ Tries to enchant a piece of armour.
+ At level 20 it also enchants to-hit and to-dam.
+ At level 40 it enhances the special powers of magical armour
+ The might of the enchantment increases with level.
+4. [[[[[BChild of Aule] (Level 20)
+ Summons a levelled Dwarven warrior to help you battle the forces
+ of Morgoth.
+
+Each of these spells can be increased in level both by improving your Prayer
+skill, and by improving your Spell-power skill.
+
+In addition to his specific magic, Aule will also assist with your ability to
+use some magic from the "standard" schools, in relation to how skilled you
+are at Prayer. These schools are as follows:
+
+ *****m_earth.txt*0[Earth School] at 1/3 the Prayer skill level.
+ *****m_fire.txt*0[Fire School] at 3/5 the Prayer skill level.
+The spells from these schools are all cast using your normal spellpoints.
diff --git a/lib/mods/theme/help/g_eru.txt b/lib/mods/theme/help/g_eru.txt
new file mode 100644
index 00000000..113875b3
--- /dev/null
+++ b/lib/mods/theme/help/g_eru.txt
@@ -0,0 +1,65 @@
+|||||oy
+~~~~~01|Gods|Eru
+~~~~~02|Eru
+#####R === Eru Iluvatar ===
+
+Eru Iluvatar is the father of the Valar. His most faithful followers are those
+of the class *****c_pr_eru.txt*0[Priest(Eru)].
+
+#####GThe benefits of Worshipping Eru Iluvatar
+1. As you increase your piety, Eru will grant you a boost to your wisdom.
+ Eventually he will also start increasing your ability to handle magical
+ power, resulting in a boost to your spellpoints.
+2. If you are praying to him at the time, there is a chance that he will
+ deflect some blows from evil monsters (that increases with your level of
+ piety).
+3. If you are praying to him at the time, there is a chance that he will
+ resurrect you from the dead (provided you are very pious!).
+4. Your piety automatically increases over time if you are:
+ a) Not praying, and
+ b) Actively doing something (i.e. not resting or in the Wilderness map).
+
+#####GThe disadvantages of Worshipping Eru Iluvatar
+1. He doesn't like it if you destroy blessed weapons.
+2. You can only wield blunt or blessed weapons without penalty.
+3. He doesn't like it if you kill monsters that are aligned with good.
+4. He will completely abandon you if you wear The One Ring.
+~~~~~~03|Eru|Prayers
+#####GEru Iluvatar's Magic
+Worshipping Eru Iluvatar gives the adventurer access to a set of special
+spells that come directly from the hands of Eru. These spells use your piety
+to cast rather than your spellpoints, and the level of spells that Eru will
+permit you to use is determined by your Prayer skill - how skillful you are
+in asking for his help without offending him!
+
+There is a special book called the "Holy Tome of Eru Iluvatar" which
+contains instructions for the procedure for each of the prayers Eru will
+grant. There are four prayers all told, which are:
+1. [[[[[BSee the Music] (Level 1)
+ Allows you to 'see' the Great Music from which the world originates,
+ allowing you to see unseen things, and can be cast while blind.
+ At spell level 10 it allows you to see your surroundings.
+ At spell level 20 it allows you to cure blindness.
+ At spell level 30 it allows you to fully see all the level.
+2. [[[[[BListen to the Music] (Level 7)
+ Allows you to listen to the Great Music from which the world originates,
+ allowing you to understand the meaning of things.
+ At spell level 14 it allows you to identify all your pack.
+ At spell level 30 it allows you to identify all items on the level.
+3. [[[[[BKnow the Music] (Level 30)
+ Allows you to understand the Great Music from which the world originates,
+ allowing you to know the full abilities of things.
+ At spell level 10 it allows you to *identify* all your pack.
+4. [[[[[BLay of Protection] (Level 35)
+ Creates a circle of safety around you.
+
+Each of these spells can be increased in level both by improving your Prayer
+skill, and by improving your Spell-power skill.
+
+In addition to his specific magic, Eru will also assist with your ability to
+use some magic from the "standard" schools, in relation to how skilled you
+are at Prayer. These schools are as follows:
+ *****m_mana.txt*0[Mana School] at 1/2 the Prayer skill level.
+ *****m_divin.txt*0[Divination School] at 2/3 the Prayer skill level.
+ *****m_mind.txt*0[Mind School] at 1/3 the Prayer skill level.
+The spells from these schools are all cast using your normal spellpoints.
diff --git a/lib/mods/theme/help/g_mandos.txt b/lib/mods/theme/help/g_mandos.txt
new file mode 100644
index 00000000..5e21553c
--- /dev/null
+++ b/lib/mods/theme/help/g_mandos.txt
@@ -0,0 +1,56 @@
+|||||oy
+~~~~~01|Gods|Mandos
+~~~~~02|Mandos
+#####R === Mandos ===
+
+Mandos is the Doomsman of the Valar, rarely seen but much revered. His most faithful
+followers are those of the class *****c_pr_mand.txt*0[Priest(Mandos)].
+
+#####GThe benefits of worshipping Mandos
+1. His followers are granted resistance to nether forces.
+2. If your piety is sufficiently high, and you are praying to him, Mandos will prevent
+ the space-time continuum from being disrupted around you.
+3. If you are very pious and praying, Mandos will grant you immunity to nether.
+4. He likes it if you kill vampires.
+5. He adores it if you kill vampire elves.
+6. Your piety will slowly increase over time if you are not praying.
+7. Mandos likes High Elves and Lost Souls.
+
+#####GThe disadvantages of worshipping Mandos
+1. Mandos doesn't like Vampires and Demons.
+2. He hates being disturbed, so praying will make you lose piety very quickly.
+3. He hates it if you kill living elves of any kind.
+4. He *hates* it if you kill elves who are friendly to you.
+5. He absolutely detests it if you kill friendly spirits.
+6. He will completely abandon you if you wear The One Ring.
+~~~~~~03|Mandos|Prayers
+#####GMandos' Magic
+Worshipping Mandos gives the adventurer access to a set of special spells that come
+directly from the hands of Mandos. These spells use your piety to cast rather than
+your spellpoints, and the level of spells that Mandos will permit you to use is
+determined by your Prayer skill - how skillful you are in asking for his help
+without offending him!
+
+There is a special book - called the "Holy Tome of Mandos" which
+contains instructions for the procedure for each of the prayers Mandos will
+grant. There are four prayers all told, which are:
+1. [[[[[BTears of Luthien] (Level 5)
+ Calls upon the spirit of Luthien to ask Mandos for healing and succour.
+2. [[[[[BFeanturi] (Level 10)
+ Channels the power of Mandos to cure fear and confusion.
+ At level 20 it restores lost INT and WIS
+ At level 30 it cures hallucinations and restores a percentage of lost sanity.
+3. [[[[[BTale of Doom] (Level 25)
+ Allows you to predict the future for a short time.
+4. [[[[[BCall to the Halls] (Level 30)
+ Summons a leveled spirit from the Halls of Mandos to fight for you.
+
+Each of these spells can be increased in level both by improving your Prayer
+skill, and by improving your Spell-power skill.
+
+In addition to his specific magic, Mandos will also assist with your ability to
+use some magic from the "standard" schools, in relation to how skilled you
+are at Prayer. These schools are as follows:
+ *****m_divin.txt*0[Divination School] at 1/3 the Prayer skill level.
+ *****m_tempo.txt*0[Temporal School] at 1/4 the Prayer skill level.
+The spells from these schools are all cast using your normal spellpoints.
diff --git a/lib/mods/theme/help/g_manwe.txt b/lib/mods/theme/help/g_manwe.txt
new file mode 100644
index 00000000..4bbc85fd
--- /dev/null
+++ b/lib/mods/theme/help/g_manwe.txt
@@ -0,0 +1,62 @@
+|||||oy
+~~~~~01|Gods|Manwe
+~~~~~02|Manwe
+#####R === Manwe Sulimo ===
+
+Manwe is the strongest of the Valar, next to Morgoth. His most faithful
+followers are those of the class *****c_pr_man.txt*0[Priest(Manwe)].
+
+#####GThe benefits of Worshipping Manwe Sulimo
+1. As you increase your piety, Manwe will grant boosts to your speed (up to
+ a maximum boost of +7 speed).
+2. If you are praying, Manwe likes it when you kill monsters that are aligned
+ with evil.
+3. As your piety increases, Manwe will grant you the following abilities (in
+ order):
+ a) Levitation
+ b) Free Action (while praying)
+ c) Flying (while praying)
+4. Manwe likes elves.
+
+#####GThe disadvantages of Worshipping Manwe Sulimo
+1. Your piety slowly decreases with time, whether you are praying or not.
+2. He doesn't like it if you kill monsters that are aligned with good.
+3. He will completely abandon you if you wear The One Ring.
+~~~~~03|Manwe|Prayers
+#####GManwe Sulimo's Magic
+Worshipping Manwe Sulimo gives the adventurer access to a set of special
+spells that come directly from the hands of Manwe. These spells use your piety
+to cast rather than your spellpoints, and the level of spells that Manwe will
+permit you to use is determined by your Prayer skill - how skillful you are
+in asking for his help without offending him!
+
+There is a special book called the "Holy Tome of Manwe Sulimo" which
+contains instructions for the procedure for each of the prayers Manwe will
+grant. There are four prayers all told, which are:
+1. [[[[[BManwe's Blessing] (Level 1)
+ Manwe's Blessing removes your fears, blesses you and surrounds you with holy
+ light.
+ At spell level 10 it also grants heroism.
+ At spell level 20 it also grants super heroism.
+ At spell level 30 it also grants holy luck and life protection.
+2. [[[[[BWind Shield] (Level 10)
+ It surrounds you with a shield of wind that deflects blows from evil
+ monsters.
+ At level 10 it increases your armour rating.
+ At level 20 it retaliates against monsters that melee you.
+3. [[[[[BManwe's Call] (Level 20)
+ Manwe's Call summons a Great Eagle to help you battle the forces of
+ Morgoth.
+4. [[[[[BAvatar] (Level 35)
+ It turns you into a full grown Maia.
+
+Each of these spells can be increased in level both by improving your Prayer
+skill, and by improving your Spell-power skill.
+
+In addition to his specific magic, Manwe will also assist with your ability to
+use some magic from the "standard" schools, in relation to how skilled you
+are at Prayer. These schools are as follows:
+ *****m_air.txt*0[Air School] at 2/3 the Prayer skill level.
+ *****m_convey.txt*0[Conveyance School] at 1/2 the Prayer skill level.
+ *****m_meta.txt*0[Meta School] at 1/3 the Prayer skill level.
+The spells from these schools are all cast using your normal spellpoints.
diff --git a/lib/mods/theme/help/g_melkor.txt b/lib/mods/theme/help/g_melkor.txt
new file mode 100644
index 00000000..d6033e72
--- /dev/null
+++ b/lib/mods/theme/help/g_melkor.txt
@@ -0,0 +1,65 @@
+|||||oy
+~~~~~01|Melkor
+~~~~~02|Gods|Melkor
+#####R === Melkor Bauglir ===
+
+Melkor Bauglir is Morgoth, the Dark Enemy. He once was the most powerful
+of the Valar. His most faithful followers are those of the class *****c_pr_drk.txt*0[Dark Priest].
+
+#####GThe benefits of Worshipping Melkor Bauglir
+ 1. As you increase your piety, Melkor will grant boosts to your strength,
+ constitution and charisma and will decrease intelligence and wisdom.
+ 2. As a follower of Melkor you are resistant to fire.
+ 3. If you are praying, Melkor may make you invisible and immune to fire.
+ 4. If you are praying, Melkor may cast Curse on your foes when you melee them.
+ 5. If you are praying, Melkor likes it when you kill monsters.
+ 6. If you are praying, Melkor *likes* it when you kill monsters that are
+ aligned with good.
+ 7. Melkor likes it if you quaff Potions of Corruption.
+ 8. Melkor likes the sacrifice of corpses and books at his altars.
+ 9. Melkor likes the permanent sacrifice of your own health at his altars.
+10. Melkor hates elves.
+11. Melkor grants access to the *****m_udun.txt*0[Udun] school of magic.
+121. Melkor can summon undead and demons to help you when your life goes down.
+
+#####GThe disadvantages of Worshipping Melkor Bauglir
+1. Your piety decreases with time.
+2. Your piety decreases with time even more if you are praying.
+3. He will completely abandon you if you destroy The One Ring.
+~~~~~03|Melkor|Prayers
+#####GMelkor Bauglir's Magic
+Worshipping Melkor Bauglir gives the adventurer access to a set of special
+spells that come directly from the hands of Melkor. These spells use your piety
+to cast rather than your spellpoints, and the level of spells that Melkor will
+permit you to use is determined by your Prayer skill - how skillful you are
+in asking for his help without offending him!
+
+There is a special book called the "Corrupted Tome of Melkor" which
+contains instructions for the procedure for each of the prayers Melkor will
+grant. There are three prayers all told, which are:
+1. [[[[[BCurse] (Level 1)
+ It curses a monster, reducing its melee power
+ At level 5 it can be auto-casted (with no piety cost) while fighting
+ if your piety is over 5000.
+ At level 15 it also reduces armor
+ At level 25 it also reduces speed
+ At level 35 it also reduces max life (but it is never fatal)
+2. [[[[[BCorpse Explosion] (Level 10)
+ It makes corpses in an area around you explode for a percent of their hit
+ points as damage
+3. [[[[[BMind Steal] (Level 20)
+ It allows your spirit to temporarily leave your own body, which will
+ be vulnerable, to control one of your enemies body
+
+Each of these spells can be increased in level both by improving your Prayer
+skill, and by improving your Spell-power skill.
+
+In addition to his specific magic, Melkor will also assist with your ability to
+use some magic from the "standard" schools, in relation to how skilled you
+are at Prayer. This school is as follows:
+ *****m_mind.txt*0[Mind School] at 1/3 the Prayer skill level.
+
+Melkor also grants all of his followers access to the *****m_udun.txt*0[Udun] school of magic,
+but only powerful mages are able to cast all of its spells.
+
+The spells from these schools are all cast using your normal spellpoints.
diff --git a/lib/mods/theme/help/g_tulkas.txt b/lib/mods/theme/help/g_tulkas.txt
new file mode 100644
index 00000000..2c05292a
--- /dev/null
+++ b/lib/mods/theme/help/g_tulkas.txt
@@ -0,0 +1,45 @@
+|||||oy
+~~~~~01|Tulkas
+~~~~~02|Gods|Tulkas
+#####R === Tulkas ===
+
+Another of the Valar. His most faithful followers are *****c_palad.txt*0[Paladins].
+
+#####GThe benefits of Worshipping Tulkas
+1. As you increase your piety, Tulkas will grant boosts to your constitution
+ and your strength (up to a maximum of +3 each).
+2. He likes it when you kill monsters that are aligned with evil.
+3. He loves it when you kill evil monsters while praying.
+4. He *adores* it when you kill demons while praying.
+5. If you are praying, Tulkas may increase the damage you do in melee combat.
+
+#####GThe disadvantages of Worshipping Tulkas
+1. When you are praying, your piety slowly decreases with time.
+2. He will completely abandon you if you wear The One Ring.
+~~~~~03|Tulkas|Prayers
+#####GTulkas's Magic
+Worshipping Tulkas gives the adventurer access to a set of special spells
+that come directly from the hands of Tulkas. These spells use your piety to
+cast rather than your spellpoints, and the level of spells that Tulkas will
+permit you to use is determined by your Prayer skill - how skillful you are
+in asking for his help without offending him!
+
+There is a special book called the "War Tome of Tulkas" which contains
+instructions for the procedure for each of the prayers Tulkas will grant.
+There are three prayers all told, which are:
+1. [[[[[BDivine Aim] (Level 1)
+ It makes you more accurate in combat.
+ At spell level 20 all your blows are critical hits.
+2. [[[[[BWhirlwind] (Level 10)
+ It allows you to spin around and hit all monsters nearby.
+3. [[[[[BWave of Power] (Level 20)
+ It allows you to project a number of melee blows across a distance.
+
+Each of these spells can be increased in level both by improving your Prayer
+skill, and by improving your Spell-power skill.
+
+In addition to his specific magic, Tulkas will also assist with your ability to
+use some magic from one of the "standard" schools, in relation to how skilled
+you are at Prayer. This school is as follows:
+ *****m_earth.txt*0[Earth School] at 4/5 the Prayer skill level.
+The spells from this school are all cast using your normal spellpoints.
diff --git a/lib/mods/theme/help/g_ulmo.txt b/lib/mods/theme/help/g_ulmo.txt
new file mode 100644
index 00000000..59c3d6e9
--- /dev/null
+++ b/lib/mods/theme/help/g_ulmo.txt
@@ -0,0 +1,58 @@
+|||||oy
+~~~~~01|Gods|Ulmo
+~~~~~02|Ulmo
+#####R === Ulmo ===
+
+Ulmo is the Lord of Waters, he controls all the lakes, rivers, seas, and oceans
+on Arda. His most faithful followers are those of the class *****c_pr_ulmo.txt*0[Priest(Ulmo)].
+
+#####GThe benefits of worshipping Ulmo
+1. Ulmo's followers can breathe underwater.
+2. If your piety is sufficiently high and you are praying, Ulmo will grant
+ you resistance to poison.
+3. If you are very pious and praying, Ulmo will grant you the ability
+ to breathe without air.
+4. Ulmo likes it if you wield or carry tridents.
+5. If you are not praying, your piety will increase automatically over time.
+6. Ulmo likes the Edain, Dunedain, Druedain, and Rohirrim.
+
+#####GThe disadvantages of worshipping Ulmo
+1. He doesn't like it if you kill aquatic creatures.
+2. He hates it if you kill good, friendly, or unique aquatic creatures.
+3. He doesn't like it if you use magic involving any kind of fire.
+4. Ulmo hates Easterlings, Orcs, and Demons.
+5. He will completely abandon you if you wear The One Ring.
+~~~~~~03|Ulmo|Prayers
+#####GUlmo's Magic
+Worshipping Ulmo gives the adventurer access to a set of special spells that come
+directly from the hands of Ulmo. These spells use your piety to cast rather than
+your spellpoints, and the level of spells that Ulmo will permit you to use is
+determined by your Prayer skill - how skillful you are in asking for his help
+without offending him!
+
+There is a special book - called the "Water Tome of Ulmo" which
+contains instructions for the procedure for each of the prayers Ulmo will
+grant. There are four prayers all told, which are:
+1. [[[[[BSong of Belegaer] (Level 1)
+ Channels the power of the Great Sea into your fingertips.
+ Sometimes it can blast through its first target.
+2. [[[[[BDraught of Ulmonan] (Level 15)
+ Fills you with a draught with powerful curing effects, prepared by Ulmo himself.
+ At spell level 1 it cures blindness, poison, cuts and stunning
+ At spell level 10 it restores drained STR, DEX and CON
+ At spell level 20 it removes parasites and unwanted mimicry
+3. [[[[[BCall of the Ulumuri] (Level 20)
+ Summons a leveled water spirit or elemental to fight for you.
+4. [[[[[BWrath of Ulmo] (Level 30)
+ Conjures up a sea storm.
+ At spell level 30 it turns into a more forceful storm.
+
+Each of these spells can be increased in level both by improving your Prayer
+skill, and by improving your Spell-power skill.
+
+In addition to his specific magic, Ulmo will also assist with your ability to
+use some magic from the "standard" schools, in relation to how skilled you
+are at Prayer. These schools are as follows:
+ *****m_water.txt*0[Water School] at 3/5 the Prayer skill level.
+ *****m_nature.txt*0[Nature School] at 1/2 the Prayer skill level.
+The spells from these schools are all cast using your normal spellpoints. \ No newline at end of file
diff --git a/lib/mods/theme/help/g_varda.txt b/lib/mods/theme/help/g_varda.txt
new file mode 100644
index 00000000..a5d28475
--- /dev/null
+++ b/lib/mods/theme/help/g_varda.txt
@@ -0,0 +1,54 @@
+|||||oy
+~~~~~01|Gods|Varda
+~~~~~02|Varda
+#####R === Varda Elentari ===
+
+Varda Elentari is the greatest Queen of the Valar. Her most faithful followers
+are those of the class *****c_pr_varda.txt*0[Priest(Varda)].
+
+#####GThe benefits of worshipping Varda Elentari
+1. She grants her followers permanent light of radius 1.
+2. As you increase your piety, Varda will grant you resistance to light
+ while praying.
+3. Your piety will increase while you are in lit areas.
+4. Varda loves when you use spells involving light.
+
+#####GThe disadvantages of worshipping Varda Elentari
+1. Your piety will decrease while you are in dark places.
+2. Varda dislikes evil races (Orcs, Trolls, Dragons, and Demons).
+3. Your piety will slowly decrease while praying.
+4. She will completely abandon you if you wear The One Ring.
+~~~~~~03|Varda|Prayers
+#####GVarda Elentari's Magic
+Worshipping Varda Elentari gives the adventurer access to a set of special
+spells that come directly from the hands of Varda. These spells use your piety
+to cast rather than your spellpoints, and the level of spells that Varda will
+permit you to use is determined by your Prayer skill - how skillful you are
+in asking for her help without offending her!
+
+There is a special book - called the "Shining Tome of Varda" which
+contains instructions for the procedure for each of the prayers Varda will
+grant. There are four prayers all told, which are:
+1. [[[[[BLight of Valinor] (Level 1)
+ Lights up a room.
+ At spell level 3 it starts damaging monsters.
+ At spell level 15 it starts creating a more powerful kind of light.
+2. [[[[[BCall of Almaren] (Level 10)
+ Banishes evil beings.
+ At spell level 20 it dispels evil beings.
+3. [[[[[BEvenstar] (Level 30)
+ Maps and lights the whole level.
+ At spell level 40 it maps and lights the whole level, in addition to
+ letting you know yourself better and identifying your whole pack.
+4. [[[[[BStar Kindler] (Level 35)
+ Does multiple bursts of light damage. The power increases with level.
+
+Each of these spells can be increased in level both by improving your Prayer
+skill, and by improving your Spell-power skill.
+
+In addition to her specific magic, Varda will also assist with your ability to
+use some magic from the "standard" schools, in relation to how skilled you
+are at Prayer. These schools are as follows:
+ *****m_mana.txt*0[Mana School] at 1/4 the Prayer skill level.
+ *****m_meta.txt*0[Meta School] at 1/3 the Prayer skill level.
+The spells from these schools are all cast using your normal spellpoints.
diff --git a/lib/mods/theme/help/g_yavann.txt b/lib/mods/theme/help/g_yavann.txt
new file mode 100644
index 00000000..6e6937ca
--- /dev/null
+++ b/lib/mods/theme/help/g_yavann.txt
@@ -0,0 +1,62 @@
+|||||oy
+~~~~~01|Yavanna
+~~~~~02|Gods|Yavanna
+#####R === Yavanna Kementari===
+
+Yavanna, the Giver of Fruits, created all plants and animals and awakened the
+Ents to protect the forests of Arda. Kementari, Queen of the Earth, is her
+surname. Her most faithful followers are the *****c_druid.txt*0[Druids].
+
+#####GThe benefits of Worshipping Yavanna
+1. As you increase your piety, Yavanna will grant you the ability to pass
+ trees while praying.
+2. She makes you regenerate faster while praying on grass.
+3. She likes it when you kill nonliving creatures, undead or demons.
+4. She likes it if you charm animals (except evil ones).
+5. Yavanna likes Ents.
+
+#####GThe disadvantages of Worshipping Yavanna
+1. Your piety slowly decreases with time, whether you are praying or not.
+2. She doesn't like it if you kill monsters while praying.
+3. She hates it if you kill animals while praying.
+4. She hates it if you hurt your animal pets.
+5. She hates it if you burn or destroy trees with magic or allow monsters to
+ do so.
+6. She will completely abandon you if you wear The One Ring.
+~~~~~03|Yavanna|Prayers
+#####GYavanna's Magic
+Worshipping Yavanna gives the adventurer access to a set of special spells
+that come directly from the hands of Yavanna. These spells use your piety to
+cast rather than your spellpoints, and the level of spells that Yavanna will
+permit you to use is determined by your Prayer skill - how skillful you are
+in asking for her help without offending her!
+
+There is a special book called the "Forest Tome of Yavanna" which contains
+instructions for the procedure for each of the prayers Yavanna will grant.
+There are five prayers all told, which are:
+1. [[[[[BCharm Animal] (Level 1)
+ Tries to tame animals in a zone around your target.
+2. [[[[[BGrow Grass] (Level 10)
+ Creates a floor of grass around you. While on grass and praying,
+ a worshipper of Yavanna will know a greater regeneration rate.
+3. [[[[[BTree Roots] (Level 15)
+ Creates roots deep in the floor from your feet, making you more stable and
+ able to do better attacks, but preventing any movement (even teleportation).
+ It also makes you recover from stunning almost immediately.
+4. [[[[[BWater Bite] (Level 20)
+ Imbues your melee weapon with a natural stream of water.
+ At level 25, it spreads over a 1 radius zone around your target.
+5. [[[[[BUproot] (Level 35)
+ Awakes a tree to help you battle the forces of Morgoth.
+
+Each of these spells can be increased in level both by improving your Prayer
+skill, and by improving your Spell-power skill.
+
+In addition to her specific magic, Yavanna will also assist with your ability
+to use some magic from the "standard" schools, in relation to how skilled you
+are at Prayer. These schools are as follows:
+ *****m_earth.txt*0[Earth School] at 1/2 the Prayer skill level.
+ *****m_nature.txt*0[Nature School] at 1/2 the Prayer skill level.
+ *****m_water.txt*0[Water School] at 1/2 the Prayer skill level.
+ *****m_tempo.txt*0[Temporal School] at 1/6 the Prayer skill level.
+The spells from these schools are all cast using your normal spellpoints.
diff --git a/lib/mods/theme/help/gambling.txt b/lib/mods/theme/help/gambling.txt
new file mode 100644
index 00000000..62352600
--- /dev/null
+++ b/lib/mods/theme/help/gambling.txt
@@ -0,0 +1,29 @@
+|||||oy
+~~~~~01|Gambling
+#####R=== Gambling Rules ===
+
+#####GBetween :
+ Three 12-sided dice rolled; 2 black, 1 red. The red
+ die must be between both black to win. If the red die
+ matches a black die, you lose. Pays 3 to 1
+#####GCraps:
+ Two 6-sided dice are rolled. On first roll, a 7 or 11
+ wins. A 2, 3 or 12 loses. Otherwise roll until the first
+ roll is matched (win) or a 7 is rolled (loss). Pays 2 to 1
+#####GWheel:
+ Pick a number from 0-9. If the number shows on wheel
+ after it stops spinning, you win. Pays 10 to 1
+
+#####GSlots:
+ Three dice rolled. Matches win gold.
+ Numbers are:
+ 1=Lemon, 2=Orange, 3=Sword, 4=Shield, 5=Plum, 6=Cherry
+ Payoffs are as follows:
+ Cherry Cherry Lemon 2-1 Cherry Cherry Orange 3-1
+ Cherry Cherry Sword 4-1 Cherry Cherry Shield 5-1
+ Cherry Cherry Plum 6-1
+ Lemon Lemon Lemon 4-1 Orange Orange Orange 16-1
+ Sword Sword Sword 6-1 Shield Shield Shield 25-1
+ Plum Plum Plum 9-1 Cherry Cherry Cherry 36-1
+
+
diff --git a/lib/mods/theme/help/general.txt b/lib/mods/theme/help/general.txt
new file mode 100644
index 00000000..17dc187c
--- /dev/null
+++ b/lib/mods/theme/help/general.txt
@@ -0,0 +1,39 @@
+|||||oy
+~~~~~01|Help
+#####R=== Using the Online Help ===
+
+This help system has been designed to be read whilst in-game. Printing it off
+will make it look clumsy and a little difficult to read.
+
+Any text in orange/yellow colour is likely to be a hyperlink, and pressing
+<enter> while the link is active (yellow) will take you to the relevant page.
+Navigate between viewable links by using the left-right keys. Some links also
+have bracketed letters included in the links. Pressing these letters on your
+keyboard will activate the link even if it is orange.
+
+The help files total over 850 kb, so there is a lot of information. They have
+been designed to be browsed, but you may be looking for specific information,
+in which case you should try looking at the alphabetical *****index.txt*0[index].
+
+Here are all the relevant keypresses for navigating the help system.
+
+#####GKey | Action
+-------------------------------------------------------------------
+Escape | Leave the Online Help
+Backspace | Return to previous Help File
+Space | Advance 1 page (screen)
+2, down arrow | Advance 1 line
+8, up arrow | Back up 1 line
+- | Back up 1 page (screen)
+6, right arrow | Advance 1 link
+4, left arrow | Back up 1 link
+Return | Activate the selected link
+# | Go to a specific line (defaults to line 0)
+% | Go to a specific help file (defaults to help.hlp)
+= | Highlight lines containing a string (e.g. "word")
+/ | Search for a string (e.g. "word")
+-------------------------------------------------------------------
+
+There are other sources for help playing ToME. Try http://forum.t-o-m-e.net
+and http://wiki.t-o-m-e.net . We also have an IRC channel #tome on the
+worldirc and freenode networks (they are linked) which is fairly low traffic.
diff --git a/lib/mods/theme/help/gods.txt b/lib/mods/theme/help/gods.txt
new file mode 100644
index 00000000..60427e7e
--- /dev/null
+++ b/lib/mods/theme/help/gods.txt
@@ -0,0 +1,42 @@
+|||||oy
+~~~~~01|Gods
+#####RThe Guide to the Gods.
+
+#####G1. Introduction
+ Everybody likes to have a little helping hand now and then. What
+could be better than having a god on your side? But it's not quite that easy.
+The gods won't help just any mortal who calls for help. You have to give them
+a little something too.
+
+#####G2. How Do I Get in on This?
+ When you start a character, you get a choice of whether or not you
+wish to begin worshipping a God (unless you're something like a priest - they
+*must* start with a God to worship). If you do choose to be a follower of one
+of the Gods, you will gain certain abilities provided you do not do things
+that displease them. The measure of how happy your God is with you is your
+Piety - the Pt stat is your measure of Piety. Different actions will allow you
+to gain or lose Piety over time. You can change your mind about whom (if
+anyone) to worship during the game by finding an *****tome_faq.txt*04[altar] of that God.
+
+#####G3. What about spells?
+God-granted spells are also known as prayers, and are cast using Piety instead
+of Mana. God-spells can be increased in level by improving either your Prayer
+or Spell-power skill. The chance of successfully invoking a prayer depends
+on the Prayer skill and your wisdom.
+
+Each God also grants access to standard magical spell schools; which school(s)
+vary depending on the Gods' individual preferences. Spells from these schools
+are cast using Mana, not Piety; and success depends on your intelligence, not
+your wisdom.
+
+#####G4. So, Who Are These Gods?
+ In Theme, there are nine Gods you may choose to worship, being:
+1. *****g_eru.txt*0[Eru Iluvatar] - the father of the Valar.
+2. *****g_manwe.txt*0[Manwe Sulimo] - the greatest of the Valar, watching from atop Taniquetil.
+3. *****g_ulmo.txt*0[Ulmo] - the second mightiest of the Valar, lord of all waters on Arda.
+4 *****g_varda.txt*0[Varda Elentari] - Manwe's spouse, the most beloved by the Elves.
+5. *****g_yavann.txt*0[Yavanna Kementari] - the Earth Queen who created plants and animals.
+6. *****g_aule.txt*0[Aule the Smith] - the builder and inventor of the Valar.
+7. *****g_tulkas.txt*0[Tulkas] - another of the Valar, Tulkas values strength and courage.
+8. *****g_mandos.txt*0[Mandos] - the Doomsman of the Valar, wise and powerful.
+9. *****g_melkor.txt*0[Melkor Bauglir] - the Dark Enemy himself, once the most powerful of the Valar.
diff --git a/lib/mods/theme/help/head.aux b/lib/mods/theme/help/head.aux
new file mode 100644
index 00000000..92e979d3
--- /dev/null
+++ b/lib/mods/theme/help/head.aux
@@ -0,0 +1,10 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+ <title>T.o.M.E. Documentation</title>
+ <meta name="description" content="ToME and TomeNET homepage. ToME is a roguelike dungeon exploration game, based on Angband.">
+ <meta name="keywords" content="angband, tome, tomenet, library, angband, official, roguelike">
+</head>
+<body bgcolor="#000000" text="#FFFFFF" link="#CC0000" alink="#FF9900" vlink="#FFCC66">
+<FONT text="#CCCCCC">
+<PRE><TT>
diff --git a/lib/mods/theme/help/help.hlp b/lib/mods/theme/help/help.hlp
new file mode 100644
index 00000000..7c4b431f
--- /dev/null
+++ b/lib/mods/theme/help/help.hlp
@@ -0,0 +1,33 @@
+|||||oy
+~~~~~01|Help|Main Menu
+~~~~~02|Main Menu
+#####RWelcome to the ToME Online Help System.
+#####R==============================================
+
+Please choose one of the following online help files:
+
+ *****/ageneral.txt*0[(a) About this help system]
+ *****/bnewbie.hlp*0[(b) Help for new players] Skills, magic, races, classes + more
+ *****/cadvanced.hlp*0[(c) Help for more experienced players] Options, Macros, Automatizer etc
+ *****/dtome_faq.txt*0[(d) ToME FAQ] Common questions
+
+ *****/sspoiler.hlp*0[(s) Spoiler menu] Dungeons, fates, luck, corruptions and stuff
+
+
+ *****/xindex.txt*0[(x) Alphabetical index] Trouble finding something? Try here
+
+#####GBasic keys:
+Space | Advance 1 page (screen)
+2, down arrow | Advance 1 line
+8, up arrow | Back up 1 line
+- | Back up 1 page (screen)
+6, right arrow | Advance 1 link
+4, left arrow | Back up 1 link
+Return | Activate the selected link
+Escape | Leave the Online Help
+Backspace, ? | Return to previous Help File
+# | Go to a specific line (defaults to line 0)
+% | Go to a specific help file (defaults to help.hlp)
+= | Highlight lines containing a string (e.g. "word")
+/ | Search for a string (e.g. "word")
+
diff --git a/lib/mods/theme/help/index.txt b/lib/mods/theme/help/index.txt
new file mode 100644
index 00000000..c89a70b3
--- /dev/null
+++ b/lib/mods/theme/help/index.txt
@@ -0,0 +1,636 @@
+|||||oy
+#####R /----------------------------------------\
+#####R < Help Index >
+#####R \----------------------------------------/
+
+This is the index of everything in the T.o.M.E. documentation.
+
+#####BHit a letter key to jump to the entries for that letter.
+
+Some entries in the index link to the same place as other entries. This is
+intentional, so that the information you want is easy to find.
+
+Don't forget you can browse the help from the *****help.hlp*02[Main menu].
+
+#####sSpotted a problem with the help files, or some content thats missing?
+#####sContact fearoffours@t-o-m-e.net .
+
+~~~~~65
+*****/Aindex.txt*65[A]
+ *****birth.txt*81[Abbreviations]
+ *****birth.txt*20[AC]
+ *****birth.txt*17[AU]
+ *****tome_faq.txt*25[FF]
+ *****birth.txt*21[HP]
+ *****birth.txt*29[Pt]
+ *****birth.txt*24[SN]
+ *****birth.txt*26[SP]
+ *****ability.txt*01[Abilities]
+ *****ability.txt*07[Ammo creation]
+ *****ability.txt*05[Extra Max Blow 1]
+ *****ability.txt*06[Extra Max Blow 2]
+ *****ability.txt*10[Far reaching attack]
+ *****ability.txt*04[Perfect casting]
+ *****ability.txt*02[Spread blows]
+ *****ability.txt*08[Touch of death]
+ *****ability.txt*11[Trapping]
+ *****ability.txt*03[Tree walking]
+ *****ability.txt*12[Undead Form]
+ *****m_air.txt*02[Air Magic]
+ *****tome_faq.txt*03[Altars]
+ *****tome_faq.txt*37[Anti-magic Amulets and the Anti-magic shell]
+ *****c_unbel.txt*04[Antimagic]
+ *****c_archer.txt*01[Archer]
+ *****attack.txt*03[Armor]
+ *****birth.txt*19[Armor Class]
+ *****attack.txt*05[Resistances]
+ *****tome_faq.txt*18[Artifacts that activate but I cannot wear or wield]
+ *****c_ascet.txt*02[Ascetic]
+ *****c_assass.txt*01[Assassin]
+ *****attack.txt*01[Attacking Monsters]
+ *****attack.txt*06[Damage Effect type ]
+ *****attack.txt*04[Resistances]
+ *****birth.txt*48[Fighting ability]
+ *****birth.txt*50[Shooting]
+ *****g_aule.txt*02[Aule]
+ *****automat.txt*03[Auto destroy]
+ *****automat.txt*02[Auto pick-up]
+ *****automat.txt*01[Automatizer]
+ *****defines.txt*82[Defines]
+ *****automat.txt*04[Autosquelch]
+ *****c_axemas.txt*01[Axemaster]
+~~~~~66
+*****/Bindex.txt*66[B]
+ *****rm_barb.txt*01[Barbarian]
+ *****c_bard.txt*01[Bard]
+ *****tome_faq.txt*36[Beginner strategy]
+ *****r_beorn.txt*01[Beorning]
+ *****birth.txt*84[Birth]
+ *****dungeon.txt*21[Buildings]
+~~~~~67
+*****/Cindex.txt*67[C]
+ *****birth.txt*11[Character]
+ *****birth.txt*46[Abilities]
+ *****birth.txt*10[Ability tables]
+ *****birth.txt*23[Armor Class]
+ *****birth.txt*02[Characteristics]
+ *****birth.txt*01[Creating a Character]
+ *****birth.txt*22[Hit Points]
+ *****birth.txt*28[Mana]
+ *****birth.txt*31[Piety]
+ *****birth.txt*08[Race and Class Combinations]
+ *****birth.txt*25[Sanity Points]
+ *****birth.txt*09[Stat Bonus Table]
+ *****birth.txt*13[Stats 1]
+ *****birth.txt*39[Stats 2]
+ *****tome_faq.txt*34[Character choice is too confusing]
+ *****birth.txt*45[Charisma]
+ *****birth.txt*05[Classes]
+ *****c_archer.txt*02[Archer]
+ *****c_ascet.txt*02[Ascetic]
+ *****c_assass.txt*02[Assassin]
+ *****c_axemas.txt*02[Axemaster]
+ *****c_bard.txt*02[Bard]
+ *****c_clairv.txt*02[Clairvoyant]
+ *****birth.txt*68[Combinations with Race]
+ *****c_pr_drk.txt*02[Dark Priest]
+ *****c_demono.txt*02[Demonologist]
+ *****c_druid.txt*02[Druid]
+ *****c_geoman.txt*02[Geomancer]
+ *****c_hafted.txt*02[Haftedmaster]
+ *****c_lorema.txt*02[Loremaster]
+ *****c_mage.txt*02[Mage]
+ *****c_mercen.txt*02[Mercenary]
+ *****c_mimic.txt*02[Mimic]
+ *****c_mindcr.txt*02[Mindcrafter]
+ *****c_monk.txt*02[Monk]
+ *****c_necro.txt*02[Necromancer]
+ *****c_pacif.txt*02[Pacifist]
+ *****c_palad.txt*02[Paladin]
+ *****c_peacemag.txt*02[Peace-mage]
+ *****c_polear.txt*02[Polearmmaster]
+ *****c_posses.txt*02[Possessor]
+ *****c_pr_eru.txt*02[Priest - Eru]
+ *****c_pr_mand.txt*02[Priest - Mandos]
+ *****c_pr_man.txt*02[Priest - Manwe]
+ *****c_pr_ulmo.txt*02[Priest - Ulmo]
+ *****c_pr_varda.txt*02[Priest - Varda]
+ *****c_ranger.txt*02[Ranger]
+ *****c_rogue.txt*02[Rogue]
+ *****c_runecr.txt*02[Runecrafter]
+ *****c_sorcer.txt*02[Sorceror]
+ *****c_sniper.txt*02[Sniper]
+ *****birth.txt*77[Stat Bonuses]
+ *****c_stonewr.txt*02[Stonewright]
+ *****c_summon.txt*02[Summoners]
+ *****c_swordm.txt*02[Swordmasters]
+ *****c_symbia.txt*02[Symbiant]
+ *****c_trapper.txt*02[Trapper]
+ *****c_thaum.txt*02[Thaumaturgist]
+ *****c_unbel.txt*02[Unbeliever]
+ *****c_wainrid.txt*02[Wainrider]
+ *****c_warper.txt*02[Warper]
+ *****c_warrio.txt*02[Warrior]
+ *****rm_class.txt*01[Classical]
+ *****command.txt*99[Commands]
+ *****command.txt*116[Alteration commands]
+ *****command.txt*103[Command counts]
+ *****command.txt*111[Command descriptions ]
+ *****command.txt*129[Extras]
+ *****command.txt*123[Game status]
+ *****command.txt*128[Help]
+ *****command.txt*112[Inventory]
+ *****command.txt*121[Looking ]
+ *****command.txt*122[Messages]
+ *****command.txt*113[Movement]
+ *****command.txt*119[Object manipulation]
+ *****command.txt*100[Original keyset]
+ *****command.txt*126[Pref files]
+ *****command.txt*104[Repeating a command]
+ *****command.txt*114[Resting]
+ *****command.txt*101[Roguelike keyset]
+ *****command.txt*124[Saving and Exiting]
+ *****command.txt*115[Searching]
+ *****command.txt*102[Special keys]
+ *****command.txt*118[Spells and prayers]
+ *****command.txt*117[Terrain interaction]
+ *****command.txt*120[Throwing and missile weapons]
+ *****dungeon.txt*19[Companions]
+ *****birth.txt*43[Constitution]
+ *****m_convey.txt*02[Conveyance Magic]
+ *****corspoil.txt*01[Corruptions ]
+ *****c_clairv.txt*02[Clairvoyant]
+ *****c_archer.txt*03[Creating Ammo]
+ *****birth.txt*12[Creating a Character]
+ *****dungeon.txt*10[Cursed Objects]
+~~~~~68
+*****/Dindex.txt*68[D]
+ *****attack.txt*09[Damage Effects]
+ *****r_drkelf.txt*01[Dark Elf]
+ *****c_pr_drk.txt*01[Dark Priest]
+ *****tome_faq.txt*29[Dark grey things are difficult to see]
+ *****debug.txt*99[Debug]
+ *****debug.txt*100[Command List]
+ *****debug.txt*111[Command descriptions ]
+ *****debug.txt*112[General]
+ *****defines.txt*81[Defines]
+ *****defines.txt*84[Svals]
+ *****defines.txt*85[Tvals]
+ *****r_demon.txt*01[Demon]
+ *****rm_adanrog.txt*01[Adanrog]
+ *****rm_aewrog.txt*01[Aewrog]
+ *****rm_cabrog.txt*01[Caborrog]
+ *****rm_drarog.txt*01[Draugrog]
+ *****rm_hurog.txt*01[Hurog]
+ *****rm_limrog.txt*01[Limrog]
+ *****rm_lygrog.txt*01[Lygrog]
+ *****rm_narrog.txt*01[Narrog]
+ *****rm_rawrog.txt*01[Rawrog]
+ *****rm_sarnrog.txt*01[Sarnrog]
+ *****c_demono.txt*01[Demonologist]
+ *****m_demono.txt*02[Demonology Magic]
+ *****version.txt*01[Development history]
+ *****birth.txt*41[Dexterity]
+ *****birth.txt*56[Disarming traps]
+ *****birth.txt*37[Display]
+ *****m_divin.txt*02[Divination Magic]
+ *****r_dragon.txt*01[Dragon]
+ *****rm_black.txt*01[Black]
+ *****rm_blue.txt*01[Blue]
+ *****rm_ether.txt*01[Ethereal]
+ *****rm_green.txt*01[Green]
+ *****rm_red.txt*01[Red]
+ *****rm_white.txt*01[White]
+ *****r_druadan.txt*01[Druadan]
+ *****c_druid.txt*01[Druid]
+ *****r_dunad.txt*01[Dunedain]
+ *****dungeon.txt*02[Dungeons]
+ *****dungeon.txt*12[Doors]
+ *****dungeon.txt*06[In the dungeon]
+ *****dungeon.txt*11[Mining]
+ *****dunspoil.txt*01[Spoilers]
+ *****r_dwarf.txt*01[Dwarf]
+ *****dungeon.txt*15[Dying]
+~~~~~69
+*****/Eindex.txt*69[E]
+ *****r_eagle.txt*01[Eagle]
+ *****m_earth.txt*02[Earth Magic]
+ *****r_easterl.txt*01[Easterling]
+ *****r_elf.txt*01[Elf]
+ *****r_ent.txt*01[Ent]
+ *****spoil_faq.txt*24[Erebor spoiler]
+ *****g_eru.txt*02[Eru]
+ *****g_eru.txt*03[Prayers]
+ *****c_pr_eru.txt*03[Priest - Eru]
+ *****experien.hlp*01[Experience]
+ *****explore.hlp*02[Exploring menu]
+~~~~~70
+*****/Findex.txt*70[F]
+ *****tome_faq.txt*02[FAQ - Spoiler free]
+ *****spoil_faq.txt*02[FAQ - contains spoilers]
+ *****tome_faq.txt*13[Prophets]
+ *****fatespoi.txt*02[Fates ]
+ *****m_fire.txt*02[Fire Magic]
+ *****inscrip.txt*01[Floor Inscriptions ]
+ *****tome_faq.txt*28[Floor tiles displaying incorrectly]
+ *****tome_faq.txt*05[Fountains]
+ *****tome_faq.txt*24[Fumblefingers quests]
+~~~~~71
+*****/Gindex.txt*71[G]
+ *****gambling.txt*01[Gambling]
+ *****tome_faq.txt*30[Game ]
+ *****c_geoman.txt*01[Geomancer]
+ *****m_geoman.txt*02[Geomancy spells]
+ *****r_gnome.txt*01[Gnome]
+ *****gods.txt*01[Gods]
+ *****tome_faq.txt*04[Altars]
+ *****g_aule.txt*01[Aule]
+ *****g_eru.txt*01[Eru]
+ *****g_mandos.txt*01[Mandos]
+ *****g_manwe.txt*01[Manwe]
+ *****g_melkor.txt*01[Melkor]
+ *****birth.txt*30[Piety]
+ *****tome_faq.txt*23[Quest - Spoilers]
+ *****g_tulkas.txt*01[Tulkas]
+ *****g_ulmo.txt*01[Ulmo]
+ *****g_varda.txt*01[Varda]
+ *****g_yavann.txt*01[Yavanna]
+ *****birth.txt*16[Gold]
+~~~~~72
+*****/Hindex.txt*72[H]
+ *****c_hafted.txt*01[Haftedmaster]
+ *****r_hafelf.txt*01[Half-Elf]
+ *****r_hafogr.txt*01[Half-Ogre]
+ *****general.txt*01[Help]
+ *****explore.hlp*01[Exploring menu]
+ *****tome_faq.txt*01[FAQ - Spoiler free]
+ *****magic.hlp*02[Magic]
+ *****help.hlp*01[Main Menu]
+ *****newbie.hlp*01[New players]
+ *****spoil_faq.txt*01[Spoiled FAQ]
+ *****rm_herm.txt*01[Hermit]
+ *****r_hielf.txt*01[High-Elf]
+ *****r_hobbit.txt*01[Hobbit]
+ *****tome_faq.txt*12[Homes]
+ *****r_human.txt*01[Human]
+~~~~~73
+*****/Iindex.txt*73[I]
+ *****tome_faq.txt*35[I STILL keep dying]
+ *****tome_faq.txt*31[I keep dying]
+ *****dungeon.txt*04[Identifying features]
+ *****birth.txt*66[Infra-vision]
+ *****birth.txt*35[Intelligence]
+ *****birth.txt*85[Inventory - starting info]
+ *****tome_faq.txt*32[Invisible character]
+~~~~~75
+*****/Kindex.txt*75[K]
+ *****macrofaq.txt*44[Keymaps]
+ *****macrofaq.txt*46[Macro recorder]
+
+~~~~~76
+*****/Lindex.txt*76[L]
+ *****dungeon.txt*23[Light]
+ *****dungeon.txt*17[Loading old characters]
+ *****c_lorema.txt*01[Loremaster]
+ *****rm_lsoul.txt*01[Lost Soul]
+ *****luckspoi.txt*01[Luck ]
+~~~~~77
+*****/Mindex.txt*77[M]
+ *****macrofaq.txt*43[Macros]
+ *****macrofaq.txt*45[Macro recorder]
+ *****c_mage.txt*01[Mage]
+ *****magic.txt*03[Magic]
+ *****m_air.txt*01[Air School]
+ *****m_convey.txt*01[Conveyance School]
+ *****m_demono.txt*01[Demonology School]
+ *****m_divin.txt*01[Divination School]
+ *****m_earth.txt*01[Earth School]
+ *****m_fire.txt*01[Fire School]
+ *****m_geoman.txt*01[Geomancy]
+ *****magic.hlp*01[Index]
+ *****birth.txt*27[Mana]
+ *****m_mana.txt*01[Mana School]
+ *****m_meta.txt*01[Meta School]
+ *****m_mimic.txt*01[Mimicry]
+ *****m_mind.txt*01[Mind School]
+ *****m_mindcr.txt*01[Mindcraft]
+ *****m_music.txt*01[Music]
+ *****m_nature.txt*01[Nature School]
+ *****m_necrom.txt*01[Necromancy]
+ *****magic.txt*01[Schools]
+ *****m_symbio.txt*01[Symbiosis]
+ *****m_tempo.txt*01[Temporal School]
+ *****m_thaum.txt*01[Thaumaturgy]
+ *****m_udun.txt*01[Udun School]
+ *****magic.txt*04[Wands and Staves]
+ *****m_water.txt*01[Water School]
+ *****birth.txt*58[Magical Devices]
+ *****r_maia.txt*01[Maia]
+ *****help.hlp*02[Main Menu]
+ *****m_mana.txt*02[Mana Magic]
+ *****g_mandos.txt*02[Mandos]
+ *****g_manwe.txt*02[Manwe]
+ *****g_manwe.txt*03[Prayers]
+ *****c_pr_man.txt*03[Priest - Manwe]
+ *****tome_faq.txt*14[Mathilde]
+ *****g_melkor.txt*01[Melkor]
+ *****c_pr_drk.txt*03[Dark Priests]
+ *****g_melkor.txt*03[Prayers]
+ *****c_mercen.txt*02[Mercenary]
+ *****m_meta.txt*02[Meta Magic]
+ *****c_mimic.txt*01[Mimic]
+ *****m_mimic.txt*02[Mimicry powers]
+ *****m_mind.txt*02[Mind Magic]
+ *****c_mindcr.txt*01[Mindcrafter]
+ *****m_mindcr.txt*02[Mindcraft powers]
+ *****dungeon.txt*13[Mining]
+ *****birth.txt*18[Money]
+ *****c_monk.txt*01[Monk]
+ *****c_monk.txt*03[Monk attacks]
+ *****dungeon.txt*05[Monsters]
+ *****attack.txt*02[Attacking]
+ *****attack.txt*07[Monster Memory]
+ *****dungeon.txt*20[Pets]
+ *****tome_faq.txt*08[They are talking to me]
+ *****m_music.txt*02[Music]
+~~~~~78
+*****/Nindex.txt*78[N]
+ *****m_nature.txt*02[Nature Magic]
+ *****c_necro.txt*01[Necromancer]
+ *****m_necrom.txt*02[Necromancy Magic]
+~~~~~79
+*****/Oindex.txt*79[O]
+ *****dungeon.txt*14[Objectives]
+ *****dungeon.txt*08[Objects]
+ *****dungeon.txt*21[Colour of inventory slot letter]
+ *****dungeon.txt*09[Cursed Objects]
+ *****tome_faq.txt*33[Piles]
+ *****option.txt*05[Options]
+ *****option.txt*16[Automatizer]
+ *****option.txt*15[Autosave]
+ *****option.txt*13[Base Delay Factor]
+ *****option.txt*18[Cheating]
+ *****option.txt*09[Disturbance]
+ *****option.txt*19[Dump]
+ *****option.txt*11[Efficiency]
+ *****option.txt*10[Game-play]
+ *****option.txt*14[Hitpoint Warning]
+ *****option.txt*07[Ingame]
+ *****option.txt*08[Interface]
+ *****option.txt*06[Startup]
+ *****option.txt*12[ToME Options]
+ *****option.txt*17[Window Flags]
+ *****r_orc.txt*01[Orc]
+~~~~~80
+*****/Pindex.txt*80[P]
+ *****c_pacif.txt*02[Pacifist]
+ *****c_palad.txt*01[Paladin]
+ *****c_peacemag.txt*02[Peace-mage]
+ *****birth.txt*62[Perception]
+ *****dungeon.txt*18[Pets]
+ *****r_pettyd.txt*01[Petty Dwarf]
+ *****c_polear.txt*01[Polearmmaster]
+ *****c_posses.txt*01[Possessor]
+ *****c_posses.txt*03[Possessor powers ]
+ *****command.txt*105[Pref files]
+ *****command.txt*109[Colors]
+ *****command.txt*127[Commands]
+ *****command.txt*107[Keymaps]
+ *****command.txt*106[Macros]
+ *****command.txt*110[Options]
+ *****command.txt*108[Visuals]
+ *****c_pr_eru.txt*01[Priest - Eru]
+ *****c_pr_mandos.txt*0[Priest(Mandos)]
+ *****c_pr_man.txt*01[Priest - Manwe]
+ *****c_pr_ulmo.txt*0[Priest(Ulmo)]
+ *****c_pr_varda.txt*0[Priest(Varda)]
+ *****c_priest.txt*01[Priests]
+~~~~~82
+*****/Rindex.txt*82[R]
+ *****birth.txt*04[Race Modifiers]
+ *****birth.txt*79[Ability table]
+ *****rm_barb.txt*02[Barbarian]
+ *****rm_class.txt*02[Classical]
+ *****rm_herm.txt*02[Hermit]
+ *****rm_lsoul.txt*02[Lost Soul]
+ *****rm_skel.txt*02[Skeleton]
+ *****rm_spec.txt*02[Spectre]
+ *****birth.txt*76[Stat Bonuses]
+ *****rm_vamp.txt*02[Vampire]
+ *****rm_zomb.txt*02[Zombie]
+ *****birth.txt*03[Races]
+ *****birth.txt*78[Ability table]
+ *****r_beorn.txt*02[Beorning]
+ *****birth.txt*67[Combinations with class]
+ *****r_drkelf.txt*02[Dark Elf]
+ *****r_demon.txt*02[Demon]
+ *****r_dragon.txt*02[Dragon]
+ *****r_dunad.txt*02[Dunadan]
+ *****r_dwarf.txt*02[Dwarf]
+ *****r_eagle.txt*02[Eagle]
+ *****r_easterl.txt*02[Easterling]
+ *****r_elf.txt*02[Elf]
+ *****r_ent.txt*02[Ent]
+ *****r_gnome.txt*02[Gnome]
+ *****r_hafelf.txt*02[Half-Elf]
+ *****r_hafogr.txt*02[Half-Ogre]
+ *****r_hielf.txt*02[High-Elf]
+ *****r_hobbit.txt*02[Hobbit]
+ *****r_human.txt*02[Human]
+ *****r_druadan.txt*02[Druadan]
+ *****r_maia.txt*02[Maia]
+ *****r_orc.txt*02[Orc]
+ *****r_pettyd.txt*02[Petty Dwarf]
+ *****r_rohank.txt*02[RohanKnight]
+ *****birth.txt*75[Stat Bonuses]
+ *****r_troll.txt*02[Troll]
+ *****r_wodelf.txt*02[Wood Elf]
+ *****r_yeek.txt*02[Yeek]
+ *****tome_faq.txt*26[Random quests are not working]
+ *****tome_faq.txt*36[Random quests strategy]
+ *****c_ranger.txt*01[Ranger]
+ *****c_rogue.txt*01[Rogue]
+ *****r_rohank.txt*01[RohanKnight]
+ *****c_runecr.txt*01[Runecrafter]
+ *****c_runecr.txt*03[Runecrafter powers]
+ *****tome_faq.txt*11[Runes]
+~~~~~83
+*****/Sindex.txt*83[S]
+ *****command.txt*125[Saving and Exiting]
+ *****birth.txt*52[Saving throw]
+ *****birth.txt*60[Searching]
+ *****birth.txt*63[Searching Ability]
+ *****birth.txt*61[Searching Frequency - Perception]
+ *****spoil_faq.txt*23[Secret Valley]
+ *****tome_faq.txt*09[Sentient weapons]
+ *****rm_skel.txt*01[Skeleton]
+ *****skills.txt*55[Skills]
+ *****skills.txt*27[Air]
+ *****m_air.txt*03[Air - Spell Info]
+ *****skills.txt*50[Antimagic]
+ *****c_unbel.txt*05[Antimagic powers]
+ *****skills.txt*08[Archery]
+ *****skills.txt*05[Axe-mastery]
+ *****skills.txt*18[Backstab]
+ *****skills.txt*13[Barehand-combat]
+ *****skills.txt*61[Bearform-combat]
+ *****skills.txt*12[Boomerang-mastery]
+ *****skills.txt*58[Boulder-throwing]
+ *****skills.txt*10[Bow-mastery]
+ *****skills.txt*01[Combat]
+ *****skills.txt*30[Conveyance]
+ *****m_convey.txt*03[Conveyance - Spell Info]
+ *****skills.txt*44[Corpse-preservation]
+ *****skills.txt*04[Critical-Hits]
+ *****skills.txt*11[Crossbow-mastery]
+ *****skills.txt*52[Demonology]
+ *****m_demono.txt*03[Demonology - Spell Info]
+ *****skills.txt*16[Disarming]
+ *****skills.txt*31[Divination]
+ *****m_divin.txt*03[Divination - Spell Info]
+ *****skills.txt*20[Dodging]
+ *****skills.txt*28[Earth]
+ *****m_earth.txt*03[Earth - Spell Info]
+ *****skills.txt*25[Fire]
+ *****m_fire.txt*03[Fire - Spell Info]
+ *****skills.txt*60[Geomancy]
+ *****m_geoman.txt*03[Geomancy - Spell Info]
+ *****skills.txt*06[Hafted-mastery]
+ *****skills.txt*57[List of skills]
+ *****skills.txt*21[Magic]
+ *****skills.txt*54[Magic-device]
+ *****skills.txt*24[Mana]
+ *****m_mana.txt*03[Mana - Spell Info]
+ *****skills.txt*29[Meta]
+ *****m_meta.txt*03[Meta - Spell Info]
+ *****skills.txt*47[Mimicry]
+ *****m_mimic.txt*03[Mimicry - mimicry powers]
+ *****skills.txt*33[Mind]
+ *****m_mind.txt*03[Mind - Spell Info]
+ *****skills.txt*41[Mindcraft]
+ *****m_mindcr.txt*03[Mindcraft - Spell Info]
+ *****skills.txt*42[Monster-lore]
+ *****skills.txt*59[Music]
+ *****m_music.txt*03[Music - Song Info]
+ *****skills.txt*34[Nature]
+ *****m_nature.txt*03[Nature - Spell Info]
+ *****skills.txt*35[Necromancy]
+ *****m_necrom.txt*03[Necromancy - Spell Info]
+ *****skills.txt*07[Polearm-mastery]
+ *****skills.txt*45[Possession]
+ *****c_posses.txt*04[Possession - Possessor powers ]
+ *****skills.txt*39[Prayer]
+ *****skills.txt*36[Runecraft]
+ *****c_runecr.txt*04[Runecrafting - Runecrafter powers]
+ *****skills.txt*56[Screen]
+ *****skills.txt*09[Sling-mastery]
+ *****skills.txt*14[Sneakiness]
+ *****skills.txt*23[Sorcery]
+ *****skills.txt*22[Spell-power]
+ *****skills.txt*38[Spirituality]
+ *****skills.txt*19[Stealing]
+ *****skills.txt*15[Stealth]
+ *****skills.txt*53[Stunning-blows]
+ *****skills.txt*43[Summoning]
+ *****c_summon.txt*04[Summoning - Summoning powers]
+ *****skills.txt*03[Sword-mastery]
+ *****skills.txt*46[Symbiosis]
+ *****m_symbio.txt*03[Symbiosis - Symbiotic Powers]
+ *****skills.txt*32[Temporal]
+ *****m_tempo.txt*03[Temporal - Spell Info]
+ *****skills.txt*37[Thaumaturgy]
+ *****m_thaum.txt*03[Thaumaturgy - Spell Info]
+ *****skills.txt*48[Udun]
+ *****m_udun.txt*03[Udun - Spell Info]
+ *****skills.txt*26[Water]
+ *****m_water.txt*03[Water - Spell Info]
+ *****skills.txt*02[Weaponmastery]
+ *****c_sniper.txt*02[Sniper]
+ *****c_sorcer.txt*01[Sorceror]
+ *****rm_spec.txt*01[Spectre]
+ *****spoiler.hlp*01[Spoilers]
+ *****corspoil.txt*02[Corruptions]
+ *****dunspoil.txt*02[Dungeons]
+ *****fatespoi.txt*01[Fates]
+ *****inscrip.txt*02[Floor Inscriptions]
+ *****spoil_faq.txt*20[God Quest - directions]
+ *****spoil_faq.txt*22[God Quest - how many]
+ *****spoil_faq.txt*21[God Quest - relic]
+ *****spoil_faq.txt*07[Lothlorien Poisoned water quest]
+ *****luckspoi.txt*02[Luck]
+ *****wishing.txt*01[Wishing]
+ *****birth.txt*82[Stats]
+ *****birth.txt*71[Bonus table]
+ *****birth.txt*44[Charisma]
+ *****birth.txt*42[Constitution]
+ *****birth.txt*40[Dexterity]
+ *****birth.txt*14[Display]
+ *****birth.txt*06[Individual explanations]
+ *****birth.txt*33[Intelligence]
+ *****birth.txt*32[Strength]
+ *****birth.txt*36[Wisdom]
+ *****magic.txt*05[Staves]
+ *****birth.txt*54[Stealth]
+ *****c_stonewr.txt*0[Stonewright]
+ *****tome_faq.txt*17[Strange items]
+ *****birth.txt*34[Strength]
+ *****c_summon.txt*01[Summoners]
+ *****c_summon.txt*03[Summoning]
+ *****defines.txt*12[Svals]
+ *****c_swordm.txt*01[Swordmasters]
+ *****c_symbia.txt*01[Symbiant]
+ *****c_symbia.txt*03[Naming your symbiote]
+ *****m_symbio.txt*02[Symbiosis Magic]
+ *****dungeon.txt*03[Symbols]
+~~~~~84
+*****/Tindex.txt*84[T]
+ *****birth.txt*69[Tables]
+ *****birth.txt*74[Ability Tables]
+ *****birth.txt*70[Combinations of Race and Class]
+ *****c_monk.txt*04[Monk attacks]
+ *****birth.txt*72[Stat bonuses]
+ *****m_tempo.txt*02[Temporal Magic]
+ *****m_thaum.txt*02[Thaumaturgical Magic]
+ *****c_thaum.txt*01[Thaumaturgist]
+ *****whattome.txt*01[ToME - a General Description]
+ *****dungeon.txt*07[Town]
+ *****c_trapper.txt*02[Trapper]
+ *****r_troll.txt*01[Troll]
+ *****g_tulkas.txt*01[Tulkas]
+ *****c_palad.txt*03[Paladin]
+ *****g_tulkas.txt*03[Prayers]
+ *****defines.txt*83[Tvals]
+~~~~~85
+*****/Uindex.txt*85[U]
+ *****m_udun.txt*02[Udun Magic]
+ *****g_ulmo.txt*02[Ulmo]
+ *****c_unbel.txt*01[Unbeliever]
+ *****c_unbel.txt*03[Antimagic]
+~~~~~86
+*****/Vindex.txt*86[V]
+ *****rm_vamp.txt*01[Vampire]
+ *****g_varda.txt*02[Varda]
+ *****tome_faq.txt*16[Void jumpgates]
+ *****dungeon.txt*23[Void jumpgates]
+~~~~~87
+*****/Windex.txt*87[W]
+ *****magic.txt*02[Wands]
+ *****c_wainrid.txt*02[Wainrider]
+ *****c_warper.txt*01[Warper]
+ *****c_warrio.txt*01[Warrior]
+ *****m_water.txt*02[Water Magic]
+ *****birth.txt*86[Weapons - starting info]
+ *****tome_faq.txt*27[Weird display]
+ *****dungeon.txt*1[Wilderness]
+ *****birth.txt*38[Wisdom]
+ *****r_wodelf.txt*01[Wood Elf]
+ *****tome_faq.txt*15[Wrists hurting]
+~~~~~89
+*****/Yindex.txt*89[Y]
+ *****g_yavann.txt*01[Yavanna]
+ *****c_druid.txt*03[Druid]
+ *****g_yavann.txt*03[Prayers]
+ *****r_yeek.txt*01[Yeek]
+~~~~~90
+*****/Zindex.txt*90[Z]
+ *****rm_zomb.txt*01[Zombie]
diff --git a/lib/mods/theme/help/inscrip.txt b/lib/mods/theme/help/inscrip.txt
new file mode 100644
index 00000000..517c81c2
--- /dev/null
+++ b/lib/mods/theme/help/inscrip.txt
@@ -0,0 +1,65 @@
+~~~~~01|Floor Inscriptions (spoiler)
+~~~~~02|Spoilers|Floor Inscriptions
+#####R=== Floor Inscriptions ===
+
+It is possible to inscribe words on the floor in ToME. If you happen
+to be lucky and inscribe a spell formula from another language, the inscription
+will use the floor's mana to cast that spell when either you walk over it, a
+monster walks over it, or both walk over it. Not all inscriptions are triggered
+by monsters, and not all can be triggered by the player.
+
+In order to write an inscription in another language, you must first have found
+and read a parchment with some of that language's words upon it. So, just
+copying the inscriptions here won't work unless you have read the words on a
+parchment first ;-).
+
+#####GLight up the Room
+Inscription: 'ure nimir' (sun shine)
+Parchment: Numenorean for Beginners (I)
+Triggered by: Player, Monster.
+Grid Mana Needed: 30
+Effect: Lights up the current room
+
+#####GDarkness in Room
+Inscription: 'lomi gimli' (night stars)
+Parchment: Numenorean for Beginners (II)
+Triggered by: Player, Monster.
+Grid Mana Needed: 10
+Effect: Casts the room into darkness
+
+#####GStorm
+Inscription: 'dulgi bawiba' (black winds)
+Parchment: Advanced Lessons of Numenorean
+Triggered by: Player, Monster.
+Grid Mana Needed: 40
+Effect: Electrical Ball of energy released around the inscription
+
+#####GProtection
+Inscription: 'pedo mellon a minno' (say friend and enter)
+Parchment: Advanced Lessons of Sindarin
+Triggered by: Monster.
+Grid Mana Needed: 8
+Effect: Prevents a monster from stepping on the affected square
+
+#####GDwarven summoning
+Inscription: 'Baruk Khazad! Khazad aimenu!' (Axes of the Dwarves, the Dwarves
+ are upon you!)
+Parchment: Khuzdul - The Hidden Tongue of the Dwarves
+Triggered by: Player.
+Grid Mana Needed: 100
+Effect: Generates friendly Dwarven Warriors to help your cause
+
+#####GOpen Chasm
+Inscription: 'dunna hrassa' (black precipice)
+Parchment: Nandorin for Dummies
+Triggered by: Monster.
+Grid Mana Needed: 50
+Effect: Creates a bottomless hole in the floor that monsters (and potentially
+ objects) fall down
+
+#####GBlast of Black Fire
+Inscription: 'burz ghash ronk' (black fire pool)
+Parchment: Advanced Lessons of Orcish
+Triggered by: Player, Monster.
+Grid Mana Needed: 60
+Effect: Releases a ball of Hellfire around the inscription
diff --git a/lib/mods/theme/help/lua.hlp b/lib/mods/theme/help/lua.hlp
new file mode 100644
index 00000000..ba61676a
--- /dev/null
+++ b/lib/mods/theme/help/lua.hlp
@@ -0,0 +1,34 @@
+|||||oy
+~~~~~01|Help|Lua scripting for ToME
+#####R Welcome to the ToME Lua Help System.
+#####R=============================================
+
+Please choose one of the following help files:
+
+ *****/alua_intr.txt*0[(a) An Introduction to scripting]
+ *****/blua_pow.txt*0[(b) Adding a racial power (the 'U' menu)]
+ *****/clua_skil.txt*0[(c) Adding new skills (the 'm' menu)]
+ *****/dlua_ques.txt*0[(d) Adding a quest]
+
+
+ *****/elua_mon.txt*0[(e) Useful functions in monster.pkg]
+ *****/flua_play.txt*0[(f) Useful functions in player.pkg]
+ *****/glua_spel.txt*0[(g) Useful functions in spell.pkg]
+ *****/hlua_util.txt*0[(h) Useful functions in util.pkg]
+
+ *****/ilua_gf.txt*0[(g) A list of GF_FOO flags]
+
+
+ *****/zhelp.hlp*0[(z) Main Help menu]
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/lib/mods/theme/help/lua_gf.txt b/lib/mods/theme/help/lua_gf.txt
new file mode 100644
index 00000000..000f4af5
--- /dev/null
+++ b/lib/mods/theme/help/lua_gf.txt
@@ -0,0 +1,45 @@
+|||||oy
+#####R /--------------------------\
+#####R< A partial list of GF_FLAGS >
+#####R \--------------------------/
+
+GF_ARROW: arrows
+GF_MISSILE: magic missiles
+GF_MANA: mana
+GF_LITE_WEAK: light
+GF_DARK_WEAK: dark
+GF_WATER: water
+GF_PLASMA: plasma
+GF_METEOR: meteors
+GF_ICE: ice
+GF_GRAVITY: gravity
+GF_INERTIA: inertia
+GF_FORCE: force
+GF_TIME: pure time
+GF_ACID: acid
+GF_ELEC: lightning
+GF_FIRE: flames
+GF_COLD: cold
+GF_POIS: poison
+GF_LITE: pure light
+GF_DARK: pure dark
+GF_CONFUSION: confusion
+GF_SOUND: sound
+GF_SHARDS: shards
+GF_NEXUS: nexus
+GF_NETHER: nether
+GF_CHAOS: chaos
+GF_DISENCHANT: disenchantment
+GF_KILL_WALL: wall destruction
+GF_KILL_DOOR: door destruction
+GF_KILL_TRAP: trap destruction
+GF_STONE_WALL: wall creation
+GF_MAKE_DOOR: door creation
+GF_MAKE_TRAP: trap creation
+GF_DESTRUCTION: destruction
+
+Back to the *****lua.hlp*0[lua help index] .
+
+ [[[[[gThis file by fearoffours (fearoffours@moppy.co.uk)]
+
+
diff --git a/lib/mods/theme/help/lua_intr.txt b/lib/mods/theme/help/lua_intr.txt
new file mode 100644
index 00000000..ccb87067
--- /dev/null
+++ b/lib/mods/theme/help/lua_intr.txt
@@ -0,0 +1,133 @@
+|||||oy
+#####R /----------------------------------------\
+#####R < Scripting for ToME with lua >
+#####R \----------------------------------------/
+
+So, you want to patch ToME eh? Maybe you've had a look at how the edit files
+work, maybe even added your own race/class, but want to go further and add
+new racial (U) or magic (m) powers. Well these help files will show a little
+bit of how to do that.
+
+I am not a master at this kind of thing. I wrote a small script, with much
+help from DarkGod, and he subsequently asked me to write these help files. I
+was looking forward to when the lua help files came out so that I could look
+at them myself. Little did I know I'd be asked to write them. Therefore I
+apologise for any inaccuracies or errors that you find, and if you care to let
+me know of any improvements which could be made (especially if you're an
+experienced programmer/scripter), I'd love to know. Email me at
+[[[[[gfearoffours@moppy.co.uk].
+
+#####R=== The example scripts ===
+
+These help files take the form of a tutorial, adding a line at a time to a
+script, and explaining important concepts along the way. To see it all in
+action, I strongly suggest that you download my example script pack from
+[[[[[Ghttp://www.moppy.co.uk/angband.htm]. As well as including all the
+scripts covered in these help files, they also include the addition of my
+"hina" race which has a Lua scripted racial power which you might like to look
+at. There's also a quest which I will be including documentation for as a
+tutorial soon. Plus there's all the other lua scripts in the lib\scpt
+directory to look at. Most of what you see in these files has been learned from
+those files anyway!
+
+The source code is invaluable as well. There's a searchable and browsable
+version of the latest ToME source code available online at
+[[[[[Ghttp://www.t-o-m-e.net/cvs.php]. Use it!
+
+If you don't want to download and install the example scripts, then just
+follow the tutorials with a text editor open! But I'll say it again, it's a lot
+easier if you download and install the example scripts.
+
+This file goes on to explain the concepts of scripting, programming,
+variables and functions. If you're familiar with these concepts, you might
+as well take a look at how to add a power to the U menu in the
+*****lua_pow.txt*0[Scripting a racial power] file.
+
+
+#####R=== Defining some basic stuff ===
+
+Computers don't do anything that they're not told to do. When we script, or
+program, we must assume they know nothing. We have to tell them each little
+bit of information from the ground up.
+
+A program, or a script (we'll talk about exact differences later) is like a
+set of instructions. Let's imagine that people responded to programs, and
+that we had a program called "Housework". Its series of instructions might
+look something like this:
+
+#####BDo the Washing up.
+#####BClean the kitchen.
+#####BDust the shelves.
+#####BHoover the lounge.
+
+Each step above could be called a function, as they are all actions that
+need to be carried out. Now to you and me, we'd understand that program just
+fine, but if someone didn't know HOW to wash, or what hoovering was, they'd
+soon run into problems. For those people we'd need to define each function
+clearly. Thus "do the washing up" might be -
+
+#####BRun hot water into bowl.
+#####BAdd washing up liquid.
+#####BPut dirty plates into bowl
+#####BScrub plates till clean
+#####BPlace clean plates on rack to dry,
+
+There's still plenty of problems here though. We've not said to turn the tap
+off, or what the bowl is, or to wash any dirty cutlery, mugs, saucepans, etc.,
+etc. Whilst this might seem fairly obvious to a person, this is how we need
+to think when writing programs for computers.
+
+Lets look now at some of the terms we're going to be using, in the rest of
+these help files, and what they mean...
+
+#####R=== Variables and Constants ===
+A variable is a way to store information in a computer. Just as you store
+things in your own memory, you can store things in the computer's memory. And
+just as things change in your memory, so things can change in the computer's
+memory. This factor of change is why they're called "variables" and not
+"statics".
+
+For instance, you may have a friend's email address committed to memory, but
+things change over time, they get a new ISP or domain, and so their email
+address changes. You commit this new address to memory, and eventually
+forget the old one. The thing you have stored in your memory is the same
+(your friend's address) but the value (property) of what you have stored has
+changed (from friend@old-address.com to friend@new-address.com).
+
+Variables are the building blocks out of which you will create your patch.
+
+A variable which will *never* change its value is called a constant.
+
+#####R===Functions===
+
+A function is a series of steps or statements, grouped together and given
+one name. When you want to carry out those steps, you simply ask the
+computer to carry out that function. To go back to our original example,
+rather than saying, "I'd like you to run some hot water into a bowl, add the
+washing up liquid, put the dirty plates into it, and then scrub them till
+they're clean", we just say "do the washing up".
+
+This is where we come to the difference between scripting and programming.
+With scripting we can use the functions and variables that exist in the
+ToME code. Maintainers like DarkGod have already made sure that the
+computer knows how to "do the washing up", including turning the tap off and
+what the bowl is. All we need to do in our script is say "do the washing
+up". Or to look at it in a more relevant way, the game has been coded so
+that when a magic missile is fired, a bolt or beam spell with a black line
+of asterisks will be drawn in the direction indicated by the player, the
+mana of that spell will be used up, the monster will take the appropriate
+amount of damage, and so on. All we need to do in our script is say "fire a
+magic missile".
+
+As you script, you will still be designing your own functions, and
+variables, but the hardest parts have been done for you!
+
+Not every function and global variable in the source-code has been exported to
+use in your scripting. But the ones that have are easily identifiable by
+looking in any source files with the extension .pkg . Chris Hadgis has written
+some excellent documentation which outline the use of the most important
+functions in some of these files. They outline the functions from the
+
+OK, the first tutorial proper is on *****lua_pow.txt*0[adding a racial power] .
+
+ [[[[[gThis file by fearoffours (fearoffours@moppy.co.uk)]
diff --git a/lib/mods/theme/help/lua_mon.txt b/lib/mods/theme/help/lua_mon.txt
new file mode 100644
index 00000000..9bb363c0
--- /dev/null
+++ b/lib/mods/theme/help/lua_mon.txt
@@ -0,0 +1,535 @@
+|||||oy
+
+#####R /----------------------------------------\
+#####R < monster.pkg functions helper file >
+#####R \----------------------------------------/
+
+
+----------------------------------------------------------------------
+
+#####R=== race_info_idx ===
+
+#####GDeclaration
+ extern monster_race* race_info_idx(int r_idx, int ego);
+
+#####GFile
+ monster2.c
+
+#####GComment
+/*
+ * Return a (monster_race*) with the combinations of the monster
+ * properties and the ego type
+ */
+
+#####GDescription
+Get monster info and ego info for monster with monster index "r_idx"
+and monster ego "ego". The ego information is applied to the monster
+information and the new monster information is returned.
+
+For example, race_info_idx(141,7) will create a brown yeek (monster)
+shaman (ego).
+
+#####GParameters
+> "r_idx" is an entry from the "r_info.txt" file. Beware: there is no
+ range checking.
+> "ego" is an entry from the "re_info.txt". Beware: there is no range
+ checking.
+
+----------------------------------------------------------------------
+
+#####R=== delete_monster_idx ===
+
+#####GDeclaration
+ extern void delete_monster_idx(int i);
+
+#####GFile
+ monster2.c
+
+#####GComment
+/*
+ * Delete a monster by index.
+ *
+ * When a monster is deleted, all of its objects are deleted.
+ */
+
+#####GDescription
+Delete monster "i" from the monster array.
+
+#####GParameters
+> "i" is the index for the monster list (m_list[]). Beware: there is
+ no range checking.
+
+----------------------------------------------------------------------
+
+#####R=== m_pop ===
+
+#####GDeclaration
+ extern s16b m_pop(void);
+
+#####GFile
+ monsters2.c
+
+#####GComment
+/*
+ * Acquires and returns the index of a "free" monster.
+ *
+ * This routine should almost never fail, but it *can* happen.
+ */
+
+#####GDescription
+Get an empty slot in the monster list (m_list[]). If there are no
+empty slots, a slot will be reclaimed from a "dead" monster. If all
+slots are full, 0 is returned, which means the function has failed
+("Too many monsters!").
+
+----------------------------------------------------------------------
+
+#####R=== get_mon_num_prep ===
+
+#####GDeclaration
+ extern errr get_mon_num_prep(void);
+
+#####GFile
+ monster2.c
+
+#####GComment
+/*
+ * Apply a "monster restriction function" to the "monster allocation table"
+ */
+
+#####GDescription
+There are no parameters, but there are some other variables which will
+need to be set. They are get_mon_num_hook and get_mon_num2_hook. They
+are pointers to functions.
+
+For example, get_mon_num_hook = monster_volcano means when
+get_mon_num_hook is called (*get_mon_num_hook)(index), the actual
+function called is monster_volcano(index). This particular function
+returns TRUE if the monster indicated by "index" has the
+RF8_WILD_VOLCANO flag set.
+
+It is a good idea to store the old value of get_mon_num_hook before
+setting a new one, and restoring it when your function is finished.
+
+Following is a list of functions which can be assigned to
+get_mon_num_hook:
+
+create_molds_hook
+create_townpeople_hook
+mon_hook_bounty
+monster_dungeon
+monster_grass
+monster_mountain
+monster_ocean
+monster_quest
+monster_shore
+monster_town
+monster_volcano
+monster_waste
+monster_wood
+mutate_monster_okay
+place_monster_okay
+summon_specific_okay
+vault_aux_animal
+vault_aux_chapel
+vault_aux_clone
+vault_aux_demon
+vault_aux_dragon
+vault_aux_giant
+vault_aux_jelly
+vault_aux_kennel
+vault_aux_orc
+vault_aux_symbol
+vault_aux_treasure
+vault_aux_troll
+vault_aux_undead
+
+Or you can write your own. The function must take an integer (index)
+as a parameter and return boolean (TRUE if the monster is selected,
+or FALSE if it is not).
+
+----------------------------------------------------------------------
+
+#####R=== get_mon_num ===
+
+#####GDeclaration
+ extern s16b get_mon_num(int level);
+
+#####GFile
+ monster2.c
+
+#####GComment
+/*
+ * Choose a monster race that seems "appropriate" to the given level
+ *
+ * This function uses the "prob2" field of the "monster allocation table",
+ * and various local information, to calculate the "prob3" field of the
+ * same table, which is then used to choose an "appropriate" monster, in
+ * a relatively efficient manner.
+ *
+ * Note that "town" monsters will *only* be created in the town, and
+ * "normal" monsters will *never* be created in the town, unless the
+ * "level" is "modified", for example, by polymorph or summoning.
+ *
+ * There is a small chance (1/50) of "boosting" the given depth by
+ * a small amount (up to four levels), except in the town.
+ *
+ * It is (slightly) more likely to acquire a monster of the given level
+ * than one of a lower level. This is done by choosing several monsters
+ * appropriate to the given level and keeping the "hardest" one.
+ *
+ * Note that if no monsters are "appropriate", then this function will
+ * fail, and return zero, but this should *almost* never happen.
+ */
+
+Description:
+For the given level "level", return the index of an appropriate
+monster race.
+
+#####GParameters
+> "level" is a dungeon level
+
+----------------------------------------------------------------------
+
+#####R=== monster_desc ===
+
+#####GDeclaration
+ extern void monster_desc(char *desc, monster_type *m_ptr,
+ int mode);
+
+#####GFile
+ monster2.c
+
+#####GComment
+/*
+ * Build a string describing a monster in some way.
+ *
+ * We can correctly describe monsters based on their visibility.
+ * We can force all monsters to be treated as visible or invisible.
+ * We can build nominatives, objectives, possessives, or reflexives.
+ * We can selectively pronominalize hidden, visible, or all monsters.
+ * We can use definite or indefinite descriptions for hidden monsters.
+ * We can use definite or indefinite descriptions for visible monsters.
+ *
+ * Pronominalization involves the gender whenever possible and allowed,
+ * so that by cleverly requesting pronominalization / visibility, you
+ * can get messages like "You hit someone. She screams in agony!".
+ *
+ * Reflexives are acquired by requesting Objective plus Possessive.
+ *
+ * If no m_ptr arg is given (?), the monster is assumed to be hidden,
+ * unless the "Assume Visible" mode is requested.
+ *
+ * If no r_ptr arg is given, it is extracted from m_ptr and r_info
+ * If neither m_ptr nor r_ptr is given, the monster is assumed to
+ * be neuter, singular, and hidden (unless "Assume Visible" is set),
+ * in which case you may be in trouble... :-)
+ *
+ * I am assuming that no monster name is more than 70 characters long,
+ * so that "char desc[80];" is sufficiently large for any result.
+ *
+ * Mode Flags:
+ * 0x01 --> Objective (or Reflexive)
+ * 0x02 --> Possessive (or Reflexive)
+ * 0x04 --> Use indefinites for hidden monsters ("something")
+ * 0x08 --> Use indefinites for visible monsters ("a kobold")
+ * 0x10 --> Pronominalize hidden monsters
+ * 0x20 --> Pronominalize visible monsters
+ * 0x40 --> Assume the monster is hidden
+ * 0x80 --> Assume the monster is visible
+ *
+ * Useful Modes:
+ * 0x00 --> Full nominative name ("the kobold") or "it"
+ * 0x04 --> Full nominative name ("the kobold") or "something"
+ * 0x80 --> Genocide resistance name ("the kobold")
+ * 0x88 --> Killing name ("a kobold")
+ * 0x22 --> Possessive, genderized if visible ("his") or "its"
+ * 0x23 --> Reflexive, genderized if visible ("himself") or "itself"
+ */
+
+#####GDescription
+Return a monster description "desc" for monster "monster_type" using
+flag "mode". The modes are described above.
+
+#####GParameters
+> "desc" is the returned description.
+> "monster type" is the monster (monster pointer).
+> "mode" is one of the modes described in the comments.
+
+----------------------------------------------------------------------
+
+#####R=== monster_race_desc ===
+
+#####GDeclaration
+ extern void monster_race_desc(char *desc, int r_idx,
+ int ego);
+
+#####GFile
+ monster2.c
+
+#####GComment
+(none)
+
+#####GDescription
+Return the monster description "desc" for monster with monster index
+"r_idx" and monster ego "ego". The monster description is made up of
+the ego name (if any) and monster name, or the unique name.
+
+#####GParameters
+> "desc" is the returned description.
+> "r_idx" is an entry from the "r_info.txt" file. Beware: there is no
+ range checking.
+> "ego" is an entry from the "re_info.txt". Beware: there is no range
+ checking.
+
+----------------------------------------------------------------------
+
+#####R=== place_monster_aux ===
+
+#####GDeclaration
+ extern bool place_monster_aux(int y, int x, int r_idx,
+ bool slp, bool grp, int status);
+
+#####GFile
+ monster2.c
+
+#####GComment
+/*
+ * Attempt to place a monster of the given race at the given location
+ *
+ * Note that certain monsters are now marked as requiring "friends".
+ * These monsters, if successfully placed, and if the "grp" parameter
+ * is TRUE, will be surrounded by a "group" of identical monsters.
+ *
+ * Note that certain monsters are now marked as requiring an "escort",
+ * which is a collection of monsters with similar "race" but lower
+ * level.
+ *
+ * Some monsters induce a fake "group" flag on their escorts.
+ *
+ * Note the "bizarre" use of non-recursion to prevent annoying output
+ * when running a code profiler.
+ *
+ * Note the use of the new "monster allocation table" code to restrict
+ * the "get_mon_num()" function to "legal" escort types.
+ */
+
+#####GDescription
+Attempt to place a monster at grid "y", "x". The monster has monster
+index "m_idx". The monster may be asleep ("slp"). The monster may be
+surrounded by a group of identical monsters ("grp"). The monster has
+a status of "status" (see below). The function returns TRUE if the
+monster is placed successfully, otherwise FALSE.
+
+#####GParameters
+> "y" is the y co-ordinate of the target grid.
+> "x" is the x co-ordinate of the target grid.
+> "r_idx" is an entry from the "r_info.txt" file. Beware: there is no
+ range checking.
+> "slp" is TRUE if the monster is asleep, otherwise FALSE.
+> "grp" is TRUE if the monster is surrounded by a group, otherwise
+ FALSE.
+> "status" is the status of the monster
+ *****fields.txt*0[status]
+
+----------------------------------------------------------------------
+
+#####R=== place_monster ===
+
+#####GDeclaration
+ extern bool place_monster(int y, int x, bool slp,
+ bool grp);
+
+#####GFile
+ monster2.c
+
+#####GComment
+/*
+ * Hack -- attempt to place a monster at the given location
+ *
+ * Attempt to find a monster appropriate to the "monster_level"
+ */
+
+#####GDescription
+Attempt to place a monster at grid "y", "x". The monster may be asleep
+("slp"). The monster may be surrounded by a group of identical
+monsters ("grp"). The monster is of the appropriate monster level. The
+function returns TRUE if the monster is placed successfully, otherwise
+FALSE.
+
+#####GParameters
+> "y" is the y co-ordinate of the target grid.
+> "x" is the x co-ordinate of the target grid.
+> "slp" is TRUE if the monster is asleep, otherwise FALSE.
+> "grp" is TRUE if the monster is surrounded by a group, otherwise
+ FALSE.
+
+----------------------------------------------------------------------
+
+#####R=== place_monster_one ===
+
+#####GDeclaration
+ extern s16b place_monster_one(int y, int x, int r_idx,
+ int ego, bool slp, int status);
+
+#####GFile
+ monster2.c
+
+#####GComment
+/*
+ * Attempt to place a monster of the given race at the given location.
+ *
+ * To give the player a sporting chance, any monster that appears in
+ * line-of-sight and is extremely dangerous can be marked as
+ * "FORCE_SLEEP", which will cause them to be placed with low energy,
+ * which often (but not always) lets the player move before they do.
+ *
+ * This routine refuses to place out-of-depth "FORCE_DEPTH" monsters.
+ *
+ * XXX XXX XXX Use special "here" and "dead" flags for unique monsters,
+ * remove old "cur_num" and "max_num" fields.
+ *
+ * XXX XXX XXX Actually, do something similar for artifacts, to simplify
+ * the "preserve" mode, and to make the "what artifacts" flag more useful.
+ *
+ * This is the only function which may place a monster in the dungeon,
+ * except for the savefile loading code.
+ */
+
+#####GDescription
+Attempt to place a monster at grid "y", "x". The monster has monster
+index "m_idx". The monster may be asleep ("slp"). The monster may have
+an ego type ("ego"). The monster has a status of "status" (see below).
+The function returns TRUE if the monster is placed successfully,
+otherwise FALSE.
+
+#####GParameters
+> "y" is the y co-ordinate of the target grid.
+> "x" is the x co-ordinate of the target grid.
+> "r_idx" is an entry from the "r_info.txt" file. Beware: there is no
+ range checking.
+> "slp" is TRUE if the monster is asleep, otherwise FALSE.
+> "ego" is an entry from the "re_info.txt". Beware: there is no range
+ checking.
+> "status" is the status of the monster
+ *****fields.txt*0[status]
+
+----------------------------------------------------------------------
+
+#####R=== is_friend ===
+
+#####GDeclaration
+ extern int is_friend(monster_type *m_ptr);
+
+#####GFile
+ monster3.c
+
+#####GComment
+/*
+ * Is the monster in friendly state(pet, friend, ..)
+ * -1 = enemy, 0 = neutral, 1 = friend
+ */
+
+#####GDescription
+Return a value to indicate the status of monster "m_ptr".
+ *****fields.txt*0[status]
+
+#####GParameters
+> "m_ptr" is a pointer to a monster.
+
+----------------------------------------------------------------------
+
+#####R=== is_enemy ===
+
+#####GDeclaration
+ extern bool is_enemy(monster_type *m_ptr,
+ monster_type *t_ptr);
+
+#####GFile
+ monster3.c
+
+#####GComment
+/* Should they attack each others */
+
+#####GDescription
+Return TRUE if monster "m_ptr" should attack monster "t_ptr". If
+"m_ptr" is stupid and "r_ptr" is a different type of monster then the
+function will return TRUE. If "m_ptr" is not neutral and "r_ptr" is a
+breeder, and "r_ptr" is a different type of monster then the function
+will return TRUE (and vice versa). If both monsters are not neutral
+and one is friendly and the other isn't then the function will return
+TRUE. Otherwise the function returns FALSE.
+
+#####GParameters
+> "m_ptr" is a pointer to a monster.
+> "t_ptr" is a pointer to a monster (target).
+
+----------------------------------------------------------------------
+
+#####R=== change_side ===
+
+#####GDeclaration
+ extern bool change_side(monster_type *m_ptr);
+
+#####GFile
+ monster3.c
+
+#####GComment
+(none)
+
+#####GDescription
+Change the status of monster "m_ptr" from friendly to unfriendly and
+vice versa. Friends and pets become enemies. Neutral Ms become
+neutral Ps and vice versa. Companions are unaffected. The
+function returns TRUE if the status changed, otherwise FALSE.
+
+#####GParameters
+> "m_ptr" is a pointer to a monster.
+
+----------------------------------------------------------------------
+
+#####R=== find_position ===
+
+#####GDeclaration
+ extern void find_position(int y, int x, int *yy = 0,
+ int *xx = 0);
+
+#####GFile
+ lua_bind.c
+
+#####GComment
+(none)
+
+#####GDescription
+Find a new grid "yy", "xx" within 6 grids of target grid "y", "x".
+The new grid must be within line-of-sight of the target grid. A
+maximum of 5000 attempts is made.
+
+#####GParameters
+> "y" is the y co-ordinate of the target grid.
+> "x" is the x co-ordinate of the target grid.
+> "yy" is the y co-ordinate of the new grid.
+> "xx" is the x co-ordinate of the new grid.
+
+----------------------------------------------------------------------
+
+#####R=== can_create_companion ===
+
+#####GDeclaration
+ extern bool can_create_companion();
+
+#####GFile
+ monster3.c
+
+#####GComment
+/* Returns if a new companion is allowed */
+
+#####GDescription
+Return TRUE if a companion can be created, otherwise FALSE.
+
+----------------------------------------------------------------------
+
+Back to the *****lua.hlp*0[lua help index] .
+
+
+ [[[[[gThis file by Chris Hadgis]
diff --git a/lib/mods/theme/help/lua_play.txt b/lib/mods/theme/help/lua_play.txt
new file mode 100644
index 00000000..6ab64ddb
--- /dev/null
+++ b/lib/mods/theme/help/lua_play.txt
@@ -0,0 +1,1225 @@
+|||||oy
+
+#####R /----------------------------------------\
+#####R < player.pkg functions helper file >
+#####R \----------------------------------------/
+
+----------------------------------------------------------------------
+
+#####RFunction: set_parasite
+
+#####GDeclaration: bool set_parasite(int v, int r);
+
+#####GFile: xtra2.c
+
+#####GComment:
+/*
+* Set "p_ptr->parasite" and "p_ptr->parasite_r_idx"
+* notice observable changes
+*/
+
+#####GDescription:
+Set time "v" until parasite with monster index "r" is created. The
+player gets the message "You feel something growing in you" if "v"
+is > 0. Otherwise the player gets the message "Your body convulse
+and spawn <monster name>" if the monster is created (80% chance) or
+"The hideous thing growing in you seems to die" if the monster dies.
+
+#####GParameters:
+>v is the time until the parasite gestates (must be between 0 and
+ 10000).
+>r is the monster index of parasite to be created.
+
+----------------------------------------------------------------------
+
+#####RFunction: set_disrupt_shield
+
+#####GDeclaration: bool set_disrupt_shield(int v);
+
+#####GFile: xtra2.c
+
+#####GComment:
+/*
+* Set "p_ptr->disrupt_shield"
+* notice observable changes
+*/
+
+#####GDescription:
+Set time "v" until shield of invulnerability expires. The player gets
+the message "You feel invulnerable" if "v" is > 0. Otherwise the
+player gets the message "You are more vulnerable".
+
+#####GParameters:
+>v is the time until the shield expires (must be between 0 and
+ 10000).
+
+----------------------------------------------------------------------
+
+#####RFunction: set_prob_travel
+
+#####GDeclaration: bool set_prob_travel(int v);
+
+#####GFile: xtra2.c
+
+#####GComment:
+/*
+* Set "p_ptr->prob_travel"
+* notice observable changes
+*/
+
+#####GDescription:
+Set time "v" until random teleportation expires. The player gets
+the message "You feel instable" if "v" is > 0. Otherwise the
+player gets the message "You are more stable".
+
+#####GParameters:
+>v is the time until random teleportation expires (must be between 0
+ and 10000).
+
+----------------------------------------------------------------------
+
+#####RFunction: set_tim_deadly
+
+#####GDeclaration: bool set_tim_deadly(int v);
+
+#####GFile: xtra2.c
+
+#####GComment:
+/*
+* Set "p_ptr->tim_deadly"
+*/
+
+#####GDescription:
+Set time "v" until deadly accuracy expires. The player gets the
+message "You feel extremely accurate" if "v" is > 0. Otherwise the
+player gets the message "You are suddenly much less accurate".
+
+#####GParameters:
+>v is the time until deadly accuracy expires (must be between 0 and
+ 10000).
+
+----------------------------------------------------------------------
+
+#####RFunction: set_tim_res_time
+
+#####GDeclaration: bool set_tim_res_time(int v);
+
+#####GFile: xtra2.c
+
+#####GComment:
+/*
+* Set "p_ptr->tim_res_time"
+*/
+
+#####GDescription:
+Set time "v" until space-time distortions expire. The player gets the
+message "You are now protected against the space-time distortions" if
+"v" is > 0. Otherwise the player gets the message "You are no longer
+protected against the space-time distortions".
+
+#####GParameters:
+>v is the time until space-time distortions expire (must be between
+ 0 and 10000).
+
+----------------------------------------------------------------------
+
+#####RFunction: set_tim_reflect
+
+#####GDeclaration: bool set_tim_reflect(int v);
+
+#####GFile: xtra2.c
+
+#####GComment:
+/*
+* Set "p_ptr->tim_reflect"
+*/
+
+#####GDescription:
+Set time "v" until reflection expire. The player gets the message
+"You start reflecting the world around you" if "v" is > 0. Otherwise
+the player gets the message "You stop reflecting".
+
+#####GParameters:
+>v is the time until reflection expires (must be between 0 and
+ 10000).
+
+----------------------------------------------------------------------
+
+#####RFunction: set_meditation
+
+#####GDeclaration: bool set_meditation(int v);
+
+#####GFile: xtra2.c
+
+#####GComment:
+/*
+* Set "p_ptr->meditation"
+*/
+
+#####GDescription:
+Set time "v" until meditation expire. The player gets the message
+"You start meditating on yourself" if "v" is > 0. Otherwise the
+player gets the message "You stop your self meditation".
+
+#####GParameters:
+>v is the time until meditation expires (must be between 0 and
+ 10000).
+
+----------------------------------------------------------------------
+
+#####RFunction: set_strike
+
+#####GDeclaration: bool set_strike(int v);
+
+#####GFile: xtra2.c
+
+#####GComment:
+/*
+* Set "p_ptr->strike"
+*/
+
+#####GDescription:
+Set time "v" until accurate strikes expire. The player gets the
+message "You feel very accurate" if "v" is > 0. Otherwise the player
+gets the message "You are no longer very accurate".
+
+#####GParameters:
+>v is the time until accurate strikes expire (must be between 0 and
+ 10000).
+
+----------------------------------------------------------------------
+
+#####RFunction: set_walk_water
+
+#####GDeclaration: bool set_walk_water(int v);
+
+#####GFile: xtra2.c
+
+#####GComment:
+/*
+* Set "p_ptr->walk_water", notice observable changes
+*/
+
+#####GDescription:
+Set time "v" until walking on water expires. The player gets the
+message "You feel strangely insubmersible" if "v" is > 0. Otherwise
+the player gets the message "You are no longer insubmersible".
+
+#####GParameters:
+>v is the time until walking on water expires (must be between 0 and
+ 10000).
+
+----------------------------------------------------------------------
+
+#####RFunction: set_tim_ffall
+
+#####GDeclaration: bool set_tim_ffall(int v);
+
+#####GFile: xtra2.c
+
+#####GComment:
+/*
+* Set "p_ptr->tim_ffall"
+*/
+
+#####GDescription:
+Set time "v" until feather-fall expires. The player gets the message
+"You feel very light" if "v" is > 0. Otherwise the player gets the
+message "You are suddenly heavier".
+
+#####GParameters:
+>v is the time until feather-fall expires (must be between 0 and
+ 10000).
+
+----------------------------------------------------------------------
+
+#####RFunction: set_tim_fire_aura
+
+#####GDeclaration: bool set_tim_fire_aura(int v);
+
+#####GFile: xtra2.c
+
+#####GComment:
+/*
+* Set "p_ptr->tim_fire_aura"
+*/
+
+#####GDescription:
+Set time "v" until fiery aura expires. The player gets the message
+"You are enveloped in flames" if "v" is > 0. Otherwise the player
+gets the message "You are no longer enveloped in flames".
+
+#####GParameters:
+>v is the time until fiery aura expires (must be between 0 and
+ 10000).
+
+----------------------------------------------------------------------
+
+#####RFunction: set_holy
+
+#####GDeclaration: bool set_holy(int v);
+
+#####GFile: xtra2.c
+
+#####GComment:
+/*
+* Set "p_ptr->holy", notice observable changes
+*/
+
+#####GDescription:
+Set time "v" until holiness expires. The player gets the message
+"You feel a holy aura around you" if "v" is > 0. Otherwise the
+player gets the message "The holy aura vanishes".
+
+#####GParameters:
+>v is the time until holiness expires (must be between 0 and 10000).
+
+----------------------------------------------------------------------
+
+#####RFunction: set_grace
+
+#####GDeclaration: void set_grace(s32b v);
+
+#####GFile: xtra2.c
+
+#####GComment:
+/*
+* Set "p_ptr->grace", notice observable changes
+*/
+
+#####GDescription:
+Set grace to value "v". Don't allow grace to fall below -30000 or
+rise above 30000.
+
+#####GParameters:
+>v is the value of grace.
+
+----------------------------------------------------------------------
+
+#####RFunction: set_mimic
+
+#####GDeclaration: bool set_mimic(int v, int p);
+
+#####GFile: xtra2.c
+
+#####GComment:
+/*
+* Set "p_ptr->tim_mimic", and "p_ptr->mimic_form",
+* notice observable changes
+*/
+
+#####GDescription:
+Set time "v" until morph into monster with monster index "p" expires.
+The player gets the message "You feel your body change" if "v" is > 0.
+Otherwise the player gets the message "You are no longer transformed".
+
+#####GParameters:
+>v is the time until transformation expires (must be between 0 and
+ 10000).
+>p is the monster index of the monster the player wants to mimic.
+
+----------------------------------------------------------------------
+
+#####RFunction: set_no_breeders
+
+#####GDeclaration: bool set_no_breeders(int v);
+
+#####GFile: xtra2.c
+
+#####GComment:
+/*
+* Set "no_breeds"
+*/
+
+#####GDescription:
+Set time "v" until breeders can breed again. The player gets the
+message "You feel an anti-sexual aura" if "v" is > 0. Otherwise the
+player gets the message "You no longer feel an anti-sexual aura".
+Okay...
+
+#####GParameters:
+>v is the time until breeders can breed again (must be between 0 and
+ 10000).
+
+----------------------------------------------------------------------
+
+#####RFunction: set_invis
+
+#####GDeclaration: bool set_invis(int v,int p);
+
+#####GFile: xtra2.c
+
+#####GComment:
+/*
+* Set "p_ptr->tim_invis", and "p_ptr->tim_inv_pow",
+* notice observable changes
+*/
+
+#####GDescription:
+Set time "v" until invisibility expires. The player gets the message
+"You feel your body fade away" if "v" is > 0. Otherwise the player
+gets the message "You are no longer invisible".
+
+#####GParameters:
+>v is the time until invisibility expires (must be between 0 and
+ 10000).
+>p is the power of timed invisibility.
+
+----------------------------------------------------------------------
+
+#####RFunction: set_lite
+
+#####GDeclaration: bool set_lite(int v);
+
+#####GFile: xtra2.c
+
+#####GComment:
+/*
+* Set "p_ptr->tim_lite", notice observable changes
+*
+* Note the use of "PU_VIEW", which is needed to
+* memorise any terrain features which suddenly become "visible".
+* Note that blindness is currently the only thing which can affect
+* "player_can_see_bold()".
+*/
+
+#####GDescription:
+Set time "v" until brightness expires. The player gets the message
+"You suddenly seem brighter" if "v" is > 0. Otherwise the player
+gets the message "You are no longer bright".
+
+#####GParameters:
+>v is the time until brightness expires (must be between 0 and
+ 10000).
+
+----------------------------------------------------------------------
+
+#####RFunction: set_blind
+
+#####GDeclaration: bool set_blind(int v);
+
+#####GFile: xtra2.c
+
+#####GComment:
+/*
+* Set "p_ptr->blind", notice observable changes
+*
+* Note the use of "PU_UN_VIEW", which is needed to memorise any terrain
+* features which suddenly become "visible".
+* Note that blindness is currently the only thing which can affect
+* "player_can_see_bold()".
+*/
+
+#####GDescription:
+Set time "v" until blindness expires. The player gets the message "You
+are blind" if "v" is > 0. Otherwise the player gets the message "You
+can see again".
+
+#####GParameters:
+>v is the time until blindness expires (must be between 0 and
+ 10000).
+
+----------------------------------------------------------------------
+
+#####RFunction: set_confused
+
+#####GDeclaration: bool set_confused(int v);
+
+#####GFile: xtra2.c
+
+#####GComment:
+/*
+* Set "p_ptr->confused", notice observable changes
+*/
+
+#####GDescription:
+Set time "v" until confusion expires. The player gets the message "You
+are confused" if "v" is > 0. Otherwise the player gets the message
+"You feel less confused now".
+
+#####GParameters:
+>v is the time until confusion expires (must be between 0 and
+ 10000).
+
+----------------------------------------------------------------------
+
+#####RFunction: set_poisoned
+
+#####GDeclaration: bool set_poisoned(int v);
+
+#####GFile: xtra2.c
+
+#####GComment:
+/*
+* Set "p_ptr->poisoned", notice observable changes
+*/
+
+#####GDescription:
+Set time "v" until poison expires. The player gets the message "You
+are poisoned" if "v" is > 0. Otherwise the player gets the message
+"You are no longer poisoned".
+
+#####GParameters:
+>v is the time until poison expires (must be between 0 and 10000).
+
+----------------------------------------------------------------------
+
+#####RFunction: set_afraid
+
+#####GDeclaration: bool set_afraid(int v);
+
+#####GFile: xtra2.c
+
+#####GComment:
+/*
+* Set "p_ptr->afraid", notice observable changes
+*/
+
+#####GDescription:
+Set time "v" until fear expires. The player gets the message "You are
+terrified" if "v" is > 0. Otherwise the player gets the message "You
+feel bolder now".
+
+#####GParameters:
+>v is the time until fear expires (must be between 0 and 10000).
+
+----------------------------------------------------------------------
+
+#####RFunction: set_paralyzed
+
+#####GDeclaration: bool set_paralyzed(int v);
+
+#####GFile: xtra2.c
+
+#####GComment:
+/*
+* Set "p_ptr->paralyzed", notice observable changes
+*/
+
+#####GDescription:
+Set time "v" until paralysis expires. The player gets the message "You
+are paralyzed" if "v" is > 0. Otherwise the player gets the message
+"You can move again".
+
+#####GParameters:
+>v is the time until paralysis expires (must be between 0 and
+ 10000).
+
+----------------------------------------------------------------------
+
+#####RFunction: set_image
+
+#####GDeclaration: bool set_image(int v);
+
+#####GFile: xtra2.c
+
+#####GComment:
+/*
+* Set "p_ptr->image", notice observable changes
+*
+* Note that we must redraw the map when hallucination changes.
+*/
+
+#####GDescription:
+Set time "v" until hallucination expires. The player gets the message
+"Oh, wow! Everything looks so cosmic now" if "v" is > 0. Otherwise
+the player gets the message "You can see clearly again".
+
+#####GParameters:
+>v is the time until hallucination expires (must be between 0 and
+ 10000).
+
+----------------------------------------------------------------------
+
+#####RFunction: set_fast
+
+#####GDeclaration: bool set_fast(int v, int p);
+
+#####GFile: xtra2.c
+
+#####GComment:
+(none)
+
+#####GDescription:
+Set time "v" until speed of speed factor "p" expires. The player gets
+the message "You feel yourself moving faster" if "v" is > 0. Otherwise
+the player gets the message "You feel yourself slow down".
+
+#####GParameters:
+>v is the time until speed expires (must be between 0 and 10000).
+>p is the speed factor.
+
+----------------------------------------------------------------------
+
+#####RFunction: set_light_speed
+
+#####GDeclaration: bool set_light_speed(int v);
+
+#####GFile: xtra2.c
+
+#####GComment:
+/*
+* Set "p_ptr->lightspeed", notice observable changes
+*/
+
+#####GDescription:
+Set time "v" until light-speed expires. The player gets the message
+"You feel as if time has stopped" if "v" is > 0. Otherwise the player
+gets the message "You feel time returning to its normal rate".
+
+#####GParameters:
+>v is the time until light-speed expires (must be between 0 and
+ 10000).
+
+----------------------------------------------------------------------
+
+#####RFunction: set_slow
+
+#####GDeclaration: bool set_slow(int v);
+
+#####GFile: xtra2.c
+
+#####GComment:
+/*
+* Set "p_ptr->slow", notice observable changes
+*/
+
+#####GDescription:
+Set time "v" until slowness expires. The player gets the message "You
+feel yourself moving slower" if "v" is > 0. Otherwise the player gets
+the message "You feel yourself speed up".
+
+#####GParameters:
+>v is the time until slowness expires (must be between 0 and 10000).
+
+----------------------------------------------------------------------
+
+#####RFunction: set_shield
+
+#####GDeclaration: bool set_shield(int v, int p, s16b o, s16b d1, s16b d2);
+
+#####GFile: xtra2.c
+
+#####GComment:
+/*
+* Set "p_ptr->shield", notice observable changes
+*/
+
+#####GDescription:
+Set time "v" until stone-shield expires. The player gets the message
+"Your skin turns to stone" if "v" is > 0. Otherwise the player gets
+the message "Your skin returns to normal". Stone-shield has spell
+power "p", spell option "o", and power options "d1" and "d2".
+
+#####GParameters:
+>v is the time until stone-shield expires (must be between 0 and
+ 10000).
+>p is the power of the stone-shield spell.
+>o is the option of the stone-shield spell.
+>d1 is the power for option 1 of the stone-shield spell.
+>d2 is the power for option 2 of the stone-shield spell.
+
+----------------------------------------------------------------------
+
+#####RFunction: set_blessed
+
+#####GDeclaration: bool set_blessed(int v);
+
+#####GFile: xtra2.c
+
+#####GComment:
+/*
+* Set "p_ptr->blessed", notice observable changes
+*/
+
+#####GDescription:
+Set time "v" until blessing expires. The player gets the message "You
+feel righteous" if "v" is > 0. Otherwise the player gets the message
+"The prayer has expired".
+
+#####GParameters:
+>v is the time until blessing expires (must be between 0 and 10000).
+
+----------------------------------------------------------------------
+
+#####RFunction: set_hero
+
+#####GDeclaration: bool set_hero(int v);
+
+#####GFile: xtra2.c
+
+#####GComment:
+/*
+* Set "p_ptr->hero", notice observable changes
+*/
+
+#####GDescription:
+Set time "v" until heroism expires. The player gets the message "You
+feel like a hero" if "v" is > 0. Otherwise the player gets the
+message "The heroism wears off".
+
+#####GParameters:
+>v is the time until heroism expires (must be between 0 and
+ 10000).
+
+----------------------------------------------------------------------
+
+#####RFunction: set_shero
+
+#####GDeclaration: bool set_shero(int v);
+
+#####GFile: xtra2.c
+
+#####GComment:
+/*
+* Set "p_ptr->shero", notice observable changes
+*/
+
+#####GDescription:
+Set time "v" until berserk expires. The player gets the message "You
+feel like a killing machine" if "v" is > 0. Otherwise the player gets
+the message "You feel less Berserk".
+
+#####GParameters:
+>v is the time until berserk expires (must be between 0 and 10000).
+
+----------------------------------------------------------------------
+
+#####RFunction: set_protevil
+
+#####GDeclaration: bool set_protevil(int v);
+
+#####GFile: xtra2.c
+
+#####GComment:
+/*
+* Set "p_ptr->protevil", notice observable changes
+*/
+
+#####GDescription:
+Set time "v" until protection from evil expires. The player gets the
+message "You feel safe from evil" if "v" is > 0. Otherwise the player
+gets the message "You no longer feel safe from evil".
+
+#####GParameters:
+>v is the time until protection from evil expires (must be between 0
+ and 10000).
+
+----------------------------------------------------------------------
+
+#####RFunction: set_protgood
+
+#####GDeclaration: bool set_protgood(int v);
+
+#####GFile: xtra2.c
+
+#####GComment:
+/*
+* Set "p_ptr->protgood", notice observable changes
+*/
+
+#####GDescription:
+Set time "v" until protection from good expires. The player gets the
+message "You feel safe from good" if "v" is > 0. Otherwise the player
+gets the message "You no longer feel safe from good".
+
+#####GParameters:
+>v is the time until protection from evil expires (must be between 0
+ and 10000).
+
+----------------------------------------------------------------------
+
+#####RFunction: set_protundead
+
+#####GDeclaration: bool set_protundead(int v);
+
+#####GFile: xtra2.c
+
+#####GComment:
+/*
+* Set "p_ptr->protundead", notice observable changes
+*/
+
+#####GDescription:
+Set time "v" until protection from undead expires. The player gets the
+message "You feel safe from undead" if "v" is > 0. Otherwise the
+player gets the message "You no longer feel safe from undead".
+
+#####GParameters:
+>v is the time until protection from undead expires (must be between
+ 0 and 10000).
+
+----------------------------------------------------------------------
+
+#####RFunction: set_invuln
+
+#####GDeclaration: bool set_invuln(int v);
+
+#####GFile: xtra2.c
+
+#####GComment:
+/*
+* Set "p_ptr->invuln", notice observable changes
+*/
+
+#####GDescription:
+Set time "v" until invulnerability expires. The player gets the
+message "Invulnerability" if "v" is > 0. Otherwise the player gets
+the message "The invulnerability wears off".
+
+#####GParameters:
+>v is the time until invulnerability expires (must be between 0 and
+ 10000).
+
+----------------------------------------------------------------------
+
+#####RFunction: set_tim_invis
+
+#####GDeclaration: bool set_tim_invis(int v);
+
+#####GFile: xtra2.c
+
+#####GComment:
+/*
+* Set "p_ptr->tim_invis", notice observable changes
+*/
+
+#####GDescription:
+Set time "v" until see invisible expires. The player gets the message
+"Your eyes feel very sensitive" if "v" is > 0. Otherwise the player
+gets the message "Your eyes feel less sensitive".
+
+#####GParameters:
+>v is the time until see invisible expires (must be between 0 and
+ 10000).
+
+----------------------------------------------------------------------
+
+#####RFunction: set_tim_infra
+
+#####GDeclaration: bool set_tim_infra(int v);
+
+#####GFile: xtra2.c
+
+#####GComment:
+/*
+* Set "p_ptr->tim_infra", notice observable changes
+*/
+
+#####GDescription:
+Set time "v" until infravision expires. The player gets the message
+"Your eyes begin to tingle" if "v" is > 0. Otherwise the player gets
+the message "Your eyes stop tingling".
+
+#####GParameters:
+>v is the time until infravision expires (must be between 0 and
+ 10000).
+
+----------------------------------------------------------------------
+
+#####RFunction: set_mental_barrier
+
+#####GDeclaration: bool set_mental_barrier(int v);
+
+#####GFile: xtra2.c
+
+#####GComment:
+/*
+* Set "p_ptr->tim_mental_barrier", notice observable changes
+*/
+
+#####GDescription:
+Set time "v" until mental barrier expires. The player gets the message
+"Your mind grows stronger" if "v" is > 0. Otherwise the player gets
+the message "Your mind is no longer especially strong".
+
+#####GParameters:
+>v is the time until mental barrier expires (must be between 0 and
+ 10000).
+
+----------------------------------------------------------------------
+
+#####RFunction: set_oppose_acid
+
+#####GDeclaration: bool set_oppose_acid(int v);
+
+#####GFile: xtra2.c
+
+#####GComment:
+
+#####GDescription:
+Set time "v" until feather-fall expires. The player gets the message
+"You feel very light" if "v" is > 0. Otherwise the player gets the
+message "You are suddenly heavier".
+
+#####GParameters:
+>v is the time until feather-fall expires (must be between 0 and
+ 10000).
+>v is the time until feather-fall expires (must be between 0 and
+ 10000).
+
+----------------------------------------------------------------------
+
+#####RFunction: set_oppose_elec
+
+#####GDeclaration: bool set_oppose_elec(int v);
+
+#####GFile: xtra2.c
+
+#####GComment:
+/*
+* Set "p_ptr->oppose_elec", notice observable changes
+*/
+
+#####GDescription:
+Set time "v" until electricity resistance expires. The player gets
+the message "You feel resistant to electricity" if "v" is > 0.
+Otherwise the player gets the message "You feel less resistant to
+electricity".
+
+#####GParameters:
+>v is the time until electricity resistance expires (must be between
+ 0 and 10000).
+
+----------------------------------------------------------------------
+
+#####RFunction: set_oppose_fire
+
+#####GDeclaration: bool set_oppose_fire(int v);
+
+#####GFile: xtra2.c
+
+#####GComment:
+/*
+* Set "p_ptr->oppose_fire", notice observable changes
+*/
+
+#####GDescription:
+Set time "v" until fire resistance expires. The player gets the
+message "You feel resistant to fire" if "v" is > 0. Otherwise the
+player gets the message "You feel less resistant to fire".
+
+#####GParameters:
+>v is the time until fire resistance expires (must be between 0 and
+ 10000).
+
+----------------------------------------------------------------------
+
+#####RFunction: set_oppose_cold
+
+#####GDeclaration: bool set_oppose_cold(int v);
+
+#####GFile: xtra2.c
+
+#####GComment:
+/*
+* Set "p_ptr->oppose_cold", notice observable changes
+*/
+
+#####GDescription:
+Set time "v" until cold resistance expires. The player gets the
+message "You feel resistant to cold" if "v" is > 0. Otherwise the
+player gets the message "You feel less resistant to cold".
+
+#####GParameters:
+>v is the time until cold resistance expires (must be between 0 and
+ 10000).
+
+----------------------------------------------------------------------
+
+#####RFunction: set_oppose_pois
+
+#####GDeclaration: bool set_oppose_pois(int v);
+
+#####GFile: xtra2.c
+
+#####GComment:
+/*
+* Set "p_ptr->oppose_pois", notice observable changes
+*/
+
+#####GDescription:
+Set time "v" until poison resistance expires. The player gets the
+message "You feel resistant to poison" if "v" is > 0. Otherwise the
+player gets the message "You feel less resistant to poison".
+
+#####GParameters:
+>v is the time until poison resistance expires (must be between 0 and
+ 10000).
+
+----------------------------------------------------------------------
+
+#####RFunction: set_oppose_ld
+
+#####GDeclaration: bool set_oppose_ld(int v);
+
+#####GFile: xtra2.c
+
+#####GComment:
+/*
+* Set "p_ptr->oppose_ld"
+*/
+
+#####GDescription:
+Set time "v" until light and dark resistance expires. The player gets
+the message "You feel protected against the light's fluctuation" if
+"v" is > 0. Otherwise the player gets the message "You are no longer
+protected against the light's fluctuation".
+
+#####GParameters:
+>v is the time until light and dark resistance expires (must be
+ between 0 and 10000).
+
+----------------------------------------------------------------------
+
+#####RFunction: set_oppose_cc
+
+#####GDeclaration: bool set_oppose_cc(int v);
+
+#####GFile: xtra2.c
+/*
+* Set "p_ptr->oppose_cc"
+*/
+
+#####GComment:
+
+#####GDescription:
+Set time "v" until chaos resistance expires. The player gets the
+message "You feel protected against raw chaos" if "v" is > 0.
+Otherwise the player gets the message "You are no longer protected
+against chaos".
+
+#####GParameters:
+>v is the time until chaos resistance expires (must be between 0 and
+ 10000).
+
+----------------------------------------------------------------------
+
+#####RFunction: set_oppose_ss
+
+#####GDeclaration: bool set_oppose_ss(int v);
+
+#####GFile: xtra2.c
+
+#####GComment:
+/*
+* Set "p_ptr->oppose_ss"
+*/
+
+#####GDescription:
+Set time "v" until sound and shard resistance expires. The player gets
+the message "You feel protected against the ravages of sound and
+shards" if "v" is > 0. Otherwise the player gets the message "You are
+no longer protected against the ravages of sound and shards".
+
+#####GParameters:
+>v is the time until sound and shard resistance expires (must be
+ between 0 and 10000).
+
+----------------------------------------------------------------------
+
+#####RFunction: set_oppose_nex
+
+#####GDeclaration: bool set_oppose_nex(int v);
+
+#####GFile: xtra2.c
+
+#####GComment:
+/*
+* Set "p_ptr->oppose_nex"
+*/
+
+#####GDescription:
+Set time "v" until nexus resistance expires. The player gets the
+message "You feel protected against the strange forces of nexus" if
+"v" is > 0. Otherwise the player gets the message "You are no longer
+protected against the strange forces of nexus".
+
+#####GParameters:
+>v is the time until nexus resistance expires (must be between 0 and
+ 10000).
+
+----------------------------------------------------------------------
+
+#####RFunction: set_stun
+
+#####GDeclaration: bool set_stun(int v);
+
+#####GFile: xtra2.c
+
+#####GComment:
+/*
+* Set "p_ptr->stun", notice observable changes
+*
+* Note the special code to only notice "range" changes.
+*/
+
+#####GDescription:
+Set stun level "v". If the player race can't be stunned then the level
+is forced to 0. A value > 100 means the player is knocked out. A value
+>50 is a heavy stun. A value > 0 is a stun. If the stun level has
+increased, a message is printed. There is a small chance of stun level
+in 1000, or a 1 in 16 chance of a vicious blow which decreases
+intelligence and/or wisdom for a while.
+
+#####GParameters:
+>v is the stun level.
+
+----------------------------------------------------------------------
+
+#####RFunction: set_cut
+
+#####GDeclaration: bool set_cut(int v);
+
+#####GFile: xtra2.c
+
+#####GComment:
+/*
+* Set "p_ptr->cut", notice observable changes
+*
+* Note the special code to only notice "range" changes.
+*/
+
+#####GDescription:
+Set cut level "v". If the player race can't be cut then the time is
+forced to 0. A value > 1000 is a mortal wound. A value > 200 is a deep
+gash. A value > 100 is a severe cut. A value > 50 is a nasty cut. A
+value > 25 is a bad cut. A value > 10 is a light cut. A value > 0 is a
+graze. If the cut level has increased, a message is printed. There is
+a small chance of stun level in 1000, or a 1 in 16 chance of scarring
+which decreases charisma for a while.
+
+#####GParameters:
+>v is the cut level.
+
+----------------------------------------------------------------------
+
+#####RFunction: set_food
+
+#####GDeclaration: bool set_food(int v);
+
+#####GFile: xtra2.c
+
+#####GComment:
+/*
+* Set "p_ptr->food", notice observable changes
+*
+* The "p_ptr->food" variable can get as large as 20000, allowing the
+* addition of the most "filling" item, Elvish Waybread, which adds
+* 7500 food units, without overflowing the 32767 maximum limit.
+*
+* Perhaps we should disturb the player with various messages,
+* especially messages about hunger status changes. XXX XXX XXX
+*
+* Digestion of food is handled in "dungeon.c", in which, normally,
+* the player digests about 20 food units per 100 game turns, more
+* when "fast", more when "regenerating", less with "slow digestion",
+* but when the player is "gorged", he digests 100 food units per 10
+* game turns, or a full 1000 food units per 100 game turns.
+*
+* Note that the player's speed is reduced by 10 units while gorged,
+* so if the player eats a single food ration (5000 food units) when
+* full (15000 food units), he will be gorged for (5000/100)*10 = 500
+* game turns, or 500/(100/5) = 25 player turns (if nothing else is
+* affecting the player speed).
+*/
+
+#####GDescription:
+Set hunger level "v". A value < 500 is fainting. A value < 1000 is
+weak. A value < 2000 is weak. A value < 10000 is full. A value
+< 15000 is bloated. A value < 20000 is gorged. If one of these
+levels is crossed a message is printed.
+
+#####GParameters:
+>v is the hunger level (must be between 0 and 20000).
+
+----------------------------------------------------------------------
+
+#####RFunction: check_experience
+
+#####GDeclaration: void check_experience(void);
+
+#####GFile: xtra2.c
+
+#####GComment:
+/*
+* Advance experience levels and print experience
+*/
+
+#####GDescription:
+Check if player experience level has changed. If a player has achieved
+a level for the first time, give reward or corruption (1 chance in 3)
+if they apply, and increase skill points.
+
+----------------------------------------------------------------------
+
+#####RFunction: check_experience_obj
+
+#####GDeclaration: void check_experience_obj(object_type *o_ptr);
+
+#####GFile: xtra2.c
+
+#####GComment:
+/*
+* Advance experience levels and print experience
+*/
+
+#####GDescription:
+Check if object "o_ptr" experience level has changed. If an object has
+achieved a level for the first time, apply gains.
+
+#####GParameters:
+>o_ptr is the pointer to the object gaining experience.
+
+----------------------------------------------------------------------
+
+#####RFunction: gain_exp
+
+#####GDeclaration: void gain_exp(s32b amount);
+
+#####GFile: xtra2.c
+
+#####GComment:
+/*
+* Gain experience (share it to objects if needed)
+*/
+
+#####GDescription:
+Gain "amount" of experience. Count the number of objects which will
+gain experience. The objects share equally 2/3 of "amount". Give
+corruption if it applies. Gain experience. If experience is less
+than maximum, then increase maximum experience by 20% of "amount".
+Check for level change and print experience (check_experience).
+
+#####GParameters:
+>amount is the amount of experience to share.
+
+----------------------------------------------------------------------
+
+#####RFunction: lose_exp
+
+#####GDeclaration: void lose_exp(s32b amount);
+
+#####GFile: xtra2.c
+
+#####GComment:
+/*
+* Lose experience
+*/
+
+#####GDescription:
+Decrease experience by "amount". Experience can not fall below zero.
+Check for level change and print experience (check_experience).
+
+#####GParameters:
+>amount is the amount of experience to lose.
+
+----------------------------------------------------------------------
+
+
+Back to the *****lua.hlp*0[lua help index] .
+
+
+ [[[[[gThis file by Chris Hadgis]
+
+
diff --git a/lib/mods/theme/help/lua_pow.txt b/lib/mods/theme/help/lua_pow.txt
new file mode 100644
index 00000000..c221a664
--- /dev/null
+++ b/lib/mods/theme/help/lua_pow.txt
@@ -0,0 +1,266 @@
+|||||oy
+#####R /----------------------------------------\
+#####R < Adding new racial powers >
+#####R \----------------------------------------/
+
+#####R=== Introduction ===
+
+You *must* download and install my lua example files from
+[[[[[Ghttp://www.moppy.co.uk/angband.htm]. And also you should read the
+*****lua_intr.txt*0[scripting introduction] file if you haven't already done
+so.
+
+The (commented) accompanying script file for this tutorial is
+lib\scpt\pheonix.lua. Open it in your text editor!
+
+#####R=== The Racial Power ===
+
+Let's start with something simple. Let's say you wanted your new race (let's
+call it "Pheonix") to be able to cast fire balls as their racial power.
+
+#####R=== Starting off ===
+
+If you have a look at pheonix.lua you'll note the first lines are comments.
+I'll talk a bit more about comments later, but it's worth pointing out that any
+lines of text preceded by a double hyphen ([[[[[B--]) will be ignored by the
+scripting engine, and are therefore comments.
+After the comments, the first 10 lines of code are as follows:
+
+#####BPHEONIX_POWER = add_power
+#####B{
+#####B ["name"] = "Fire Breath",
+#####B ["desc"] = "You are able to cast fireballs",
+#####B ["desc_get"] = "Your beak glows red",
+#####B ["desc_lose"] = "Your beak goes cold again",
+#####B ["level"] = 10,
+#####B ["cost"] = 11,
+#####B ["stat"] = A_INT,
+#####B ["fail"] = 14,
+
+So, [[[[[BPHEONIX_POWER = add_power] is registering our power. We're giving it
+a name (PHEONIX_POWER) and saying that it is defined by calling the special
+function [[[[[Badd_power]. This special function is only used to define lua-
+scripted
+powers, and has attributes which are identified by their inclusion in square
+brackets.
+Note the following:
+- Lua is case sensitive. The name of our power is a constant, will never change
+so that's been named with capitals. variables and functions are named all in
+lower case. Technically speaking, Lua does not support constants, but we can
+emulate them by variables in this way. They don't have to be capitalised, but
+if you capitalise all your constants, it makes things easier to read, and
+you'll be following normal programming protocol.
+- There are no spaces in the name of the power. Use an underscore for spaces
+if you need to improve legibility.
+
+[[[[[B"name" = "Fire Breath",] This is the name of the power as it is
+displayed in the
+U menu, and as you will define it in p_info.txt (more about that later).
+
+[[[[[B"desc" = "You are able to cast fireballs",] This is what would
+appear in the
+information display list if you drank a potion of self knowledge or
+similar.
+
+[[[[[B"desc_get" = "Your beak glows red",] This is the information displayed
+when you
+gain this power.
+
+[[[[[B"desc_lose" = "Your beak goes cold again",] This is the information
+displayed when
+you lose this power. Eg After a mutation/corruption.
+
+[[[[[B"level" = 10,] Character level which must be gained in order to use
+power,
+
+[[[[[B"cost" = 11,] Amount of mana to cast this power.
+
+[[[[[B"stat" = A_INT,] stat which will define whether it works or not,
+
+[[[[[B"fail" = 14,] how high that stat must be.
+
+So our Pheonix will be able to cast PHEONIX_POWER from clvl 10, at a cost of
+11 mana, providing that the player's intelligence is 14 and upwards.
+
+#####R=== The function ===
+
+The next section is a lot longer, so we'll look at it line by line. I'll
+strip the comments for the purpose of this helpfile.
+
+#####B["power"] = function()
+#####B local ret, dir, damage
+#####B ret, dir = get_aim_dir();
+#####B if (ret == FALSE) then
+#####B return
+#####B end
+#####B damage = player.lev*3
+#####B msg_print("You breathe fire.")
+#####B fire_ball(GF_FIRE, dir, damage, 3)
+#####Bend,
+
+The [[[[[B"power"] bit is what actually happens when the player accesses this
+power
+from their 'U' menu. Every function must start with the word [[[[[Bfunction].
+Normally, we'd also declare its name at this point, but as this is contained
+within the [[[[[Badd_power] function, we just use the word [[[[[Bfunction] The
+empty
+brackets after this denote that no arguments are passed to the function.
+Lets look at the next line.
+
+#####B local ret, dir, damage
+
+The [[[[[Blocal] bit is saying that we're going to declare some local
+variables. That
+is, that there will be three variables used in this function , that apply
+exclusively to this function, and to no others. Global variables are
+variables that apply to the whole script, in multiple functions. The three
+variables will be called [[[[[Bret] (return), [[[[[Bdir] (direction), and
+[[[[[Bdamage]. They will be used to determine the direction the ball
+will fire in, and how much damage it will do. We'll see them in use when we add
+the third line:
+
+#####B ret, dir = get_aim_dir();
+
+here we're saying that the variables will take their value from the result
+of a function. The program performs the function [[[[[Bget_aim_dir] which
+essentially asks the player to choose a direction or pick a target.
+[[[[[Bget_aim_dir]
+assigns the value [[[[[Bret] to either TRUE (if the player correctly selected a
+direction) or FALSE (if the player failed to do so (maybe they changed their
+mind, or hit the wrong key!)). The value [[[[[Bdir] is the direction which was
+selected (or the path to the target if a target was selected). OK so let's add
+the next line:
+
+#####B if (ret == FALSE) then return end
+
+This introduces another fundamental scripting concept - [[[[[Bif] statements.
+They work just as you would expect them too. You say "if a certain condition is
+met, then do the following things."
+So in this function we're saying, "if the value of [[[[[Bret] is FALSE then
+[[[[[Breturn]."
+As I mentioned above, [[[[[Bret] is false if the player aborted (either
+deliberately or accidentally) the spell casting whilst choosing a direction
+for the spell. The double equals sign are used to mean "is equal to" as a
+single equals sign is used for defining variables remember? A single equals
+sign is more of a "let x be equal to y" thing.
+[[[[[Breturn] means stop the current function. And [[[[[Bend] signifies the
+close of the [[[[[Bif]
+statement. Every [[[[[Bif] statement must begin with an [[[[[Bif] and finish
+with an [[[[[Bend].
+So, what our [[[[[Bif] statement is saying is; "if the player failed to specify
+a direction or target for the spell, stop the function here."
+If the player has correctly specified a direction/target, the function
+continues to the next line:
+
+#####B damage = player.lev*3
+
+Here we're saying that the variable [[[[[Bdamage] has a value equal to the
+players current character level, multiplied by 3.
+
+#####B msg_print("You breathe fire.")
+
+Fairly easy to see what this does - displays the message "You breathe fire."
+I could have put anything there obviously, like [[[[[Bmsg_print("You open]
+[[[[[Byour mouth and everyone falls over with the smell of hot curry")] or
+some other such rubbish. But note that the message is enclosed within double
+quotes. The quotes aren't displayed in the message on screen, but signify the
+start and end of the message.
+
+#####B fire_ball(GF_FIRE, dir, damage, 3)
+
+This is the line that casts the spell. it says execute the function
+[[[[[Bfire_ball]. Now, this doesn't mean a fireball, it means fire a ball.
+There's an important distinction there! All it knows it is doing is firing a
+ball, it doesn't know what kind of ball, or where, or how big, or how much
+damage.
+The [[[[[BGF_FIRE,] bit is what tell us it is a fire ball. If it was
+[[[[[BGF_COLD,]
+ we'd have a cold ball, or [[[[[BGF_CHAOS,] it would be a chaos ball and
+so on and so on. A full list of those types can be found in *****lua_gf.txt*0[lua_gf.txt].
+[[[[[B dir,] is the direction, from the [[[[[Bget_aim_dir()] bit.
+[[[[[B damage,] is the damage. As we've already said, this will be clvl*3.
+[[[[[B 3)] is the radius.
+and finally...
+
+#####B end,
+#####B}
+
+[[[[[Bend,] tells it the function has ended. Every function must finish with
+[[[[[Bend].
+You should have spotted that after the end of each attribute is a comma. Make
+sure you include this, and don't forget the braces at the very very end to
+close the [[[[[Badd_power] function.
+
+#####R=== Finishing the LUA file ===
+
+Save this as a text file 'pheonix.lua' Put it into the lib\scrpt directory
+of ToME, and open the init.lua file which you'll find in the same
+directory.
+
+Add the following line and resave the init.lua file.
+
+#####Btome_dofile("pheonix.lua")
+
+This ensures that ToME loads your file on start-up. Because you've installed
+the example scripts, this has all been done for you.
+
+#####R=== A quick word about comments ===
+
+One of the reasons Angband has so many variants is because the source code is
+clearly commented. Almost every line of code has an accompanying comment,
+explaining what that line does. It's good practice to add comments to any code
+or script you write. It's helpful to others who are learning, anyone who takes
+over your project, and also to yourself when you come back in a month's time
+and can't remember what you did! So comment your code clearly, and well!
+
+You can also add multi line comments which should be enclosed by [[[[[B--[[]
+and
+#####B]]
+
+#####R=== Tying it all together ===
+
+You'll now need to link this 'U' power to the pheonix race via the
+p_info.txt file. Simply add a line within the class definition file that has
+the format [[[[[BR:Z:<name>]the name of the power as it appears in the
+[[[[[B"name"]
+section we did right at the beginning, remember? Seeing as there is no pheonix
+race, I've gone ahead and made one up as a demonstration. If you've downloaded
+and installed the example files from [[[[[Ghttp://www.moppy.co.uk/angband.htm/]
+then
+you'll notice you already have the pheonix race available. Printed below is
+the p_info.txt entry for it.
+
+
+#####BR:N:23:Pheonix
+#####BR:D:Born from flame, these powerful bird like creatures gain fire related
+#####BR:D:abilities as they grow.
+#####BR:S:1:0:2:1:-3:2:-5
+#####BR:K:-8:15:20:-10:5:-1:-5:-5
+#####BR:P:8:130:5:210
+#####BR:M:255:70:2:1:20:5:2:1:18:3
+#####BR:E:1:1:1:2:1:1
+#####BR:C:Warrior | Mage | Priest | Rogue | Ranger | Paladin | Blade |
+#####BR:C:Warlock | Chaos-Warrior | Monk | Mindcrafter | High-Mage |
+#####BR:C:BeastMaster | Alchemist | Power-Mage | Runecrafter |
+#####BR:C:Sorceror | Archer | Illusionist | Druid | Necromancer | Black-Knight
+|
+#####BR:C:Daemonologist | Weaponmaster | Summoner |
+#####BR:Z:Fire Ball
+#####BR:R:1:0
+#####BR:F:RES_FIRE | FEATHER |
+
+Note the [[[[[BR:Z:] line.
+
+If all is well, you should be able to start ToME now and breathe fire! Once
+you get to lvl 10 anyhow. Don't forget, this is the kind of thing wizard mode
+was invented for! Ctrl-A and confirm at the prompt, and then 'e' will allow
+you to alter stats, including experience. Approx 1000 exp should do to get you
+to clvl 10.
+
+Ready for more? How about adding a new *****lua_skil.txt*0[skill] ?
+
+ [[[[[gThis file by fearoffours (fearoffours@moppy.co.uk)]
+
+
+
+
diff --git a/lib/mods/theme/help/lua_ques.txt b/lib/mods/theme/help/lua_ques.txt
new file mode 100644
index 00000000..1d4b9c65
--- /dev/null
+++ b/lib/mods/theme/help/lua_ques.txt
@@ -0,0 +1,299 @@
+|||||oy
+#####R /----------------------------------------\
+#####R < Adding a new quest >
+#####R \----------------------------------------/
+
+#####R=== Introduction ===
+
+Adding a quest involves a bit more work, and there is, in some ways, rather
+more potential for things to go wrong! But it's a great way of showing just
+WHAT can be done with lua scripting. It proves just how much a lua patch can
+change the overall feel of the game. And it will give you a much better idea of
+how lua interfaces with the game source. You should have read the
+*****lua_intr.txt*0[scripting introduction], *****lua_pow.txt*0[racial power tutorial]
+and *****lua_skil.txt*0[adding new skills tutorial] before going much
+further. All of the above files contain some fairly fundamental information
+which you will find necessary for full understanding of this file.
+
+The script we're looking at is going to create a quest entrance in the middle
+of Bree. Entering the quest you see a little girl who has had her necklace
+stolen. Your job is to travel down a corridor, killing some monsters on the
+way, pick up the amulet and return it to the girl. Once done, she'll reveal the
+stairs back to Bree, and give you a (randomly generated) ring. If you feel the
+monsters are too hard, the only thing to do is talk to the little girl who will
+reveal the stairs again, failing the quest for you, and also block off the
+entrance to the amulet so that you can't cheat and make off with the amulet!
+
+#####R=== Getting started ===
+
+Open amulet.lua (you have downloaded the example scripts from
+[[[[[Ghttp://www.moppy.co.uk/angband.htm], haven't you?). The first thing you
+should see is that yet again we're calling a function that takes its arguments
+from a table, making it easy to read what's going on in the script.
+
+This time our function is add_quest and we have the following keys and values:
+
+#####B["global"] = "AMULET_QUEST",
+#####B["name"] = "Hannahs lost amulet",
+#####B["desc"] = {
+#####B "Retrieve an amulet for Hannah Cooke. It's guarded!"
+#####B },
+#####B["level"] = 5,
+#####B["hooks"] = {
+
+[[[[[B"global" = ] is a constant that we set when we refer to this quest in
+various places...
+[[[[[B"name" = ] Obviously a long name for the quest. This will appear in the
+quest screen (Ctrl-Q) and we may use in some map files too.
+[[[[[B"desc" = ] This is a long description for the quest. Again this is what
+will appear in the quest screen, and each line should be not more than 80
+characters.
+[[[[[B"level" = ] This is a rough indicator of how hard the quest is, and again,
+appears in the quest screen
+[[[[[B"hooks" = ] This is the real 'meat' of the quest. Like the [[[[[B"spell_list"] key
+in the [[[[[Badd_magic] function, this is another sub-table.
+
+To understand fully the structure of the "hooks" key it's worth taking a bit of
+a detour at this point and discussing how the scripting interface works in
+general.
+
+#####R=== How the scripts work (ish) ===
+
+Essentially there's a list of events that happen in the game. As each of these
+events happen they run a check to see if there's any functions that they need
+to run at that event. When we ran the add_mkey part of adding a new skill
+power, we essentially said "when the 'm' key is pressed in the game, perform
+the [[[[[Bexecute_magic(constructor_powers)] function". Likewise we did a similar
+thing with adding the racial power, only we hooked onto the pressing of the
+'U' key.
+
+All of this was partly hidden because of the way that the [[[[[Badd_magic] and
+[[[[[Badd_power] functions work. But here in the [[[[[Badd_quest] function it's a bit more
+specific. We are going to specify what events we're going to hook onto, and
+what functions we want to trigger at that event.
+
+A full list of hooks can be found in the source-file util.pkg.
+
+#####R=== The hooks ===
+
+#####B[HOOK_BIRTH_OBJECTS] = function()
+#####B quest(AMULET_QUEST).status = QUEST_STATUS_TAKEN
+#####Bend,
+
+So here we are with our first hook. We've declared that we're adding it to the
+birth of your character. That is, the function will be called when you create
+your character. And what we're doing here is automatically declaring the quest
+as being taken, like the Dol Guldur quest is. Each quest has 7 different
+statuses:
+
+[[[[[BQUEST_STATUS_IGNORED -1 ] This is unused, but the quest is
+ignored (will not be taken and has not been taken).
+[[[[[BQUEST_STATUS_UNTAKEN 0 ] The quest has not been accepted yet
+[[[[[BQUEST_STATUS_TAKEN 1 ] You have accepted the quest
+[[[[[BQUEST_STATUS_COMPLETED 2 ] You have completed the quest
+successfully but not been rewarded for it
+[[[[[BQUEST_STATUS_REWARDED 3 ] You've completed and rewarded the quest
+[[[[[BQUEST_STATUS_FAILED 4 ] You've failed the quest
+[[[[[BQUEST_STATUS_FINISHED 5 ] The quest is completely finished
+successfully.
+[[[[[BQUEST_STATUS_FAILED_DONE 6 ] The quest is completely finished
+unsuccessfully.
+
+You see that we've used the constant we defined in the "global" section is
+passed as an argument to [[[[[Bquest.status].
+
+Next hook then:
+
+#####B[HOOK_GEN_QUEST] = function()
+#####B if (player.inside_quest ~= AMULET_QUEST) then
+#####B return FALSE
+#####B else
+#####B load_map("amulet.map", 2, 2)
+#####B return TRUE
+#####B end
+#####Bend,
+
+Ok, we're hooking onto the generation of the quest here. This is specifically
+triggered in this instance by going down the quest entrance stairs in Bree.
+Once you've gone down the stairs, you are technically inside the quest, which
+means we can say if the person is not inside the amulet quest, then ignore this
+function, otherwise load the file 'amulet.map' at co-ordinates x=2 y=2. You'll
+find the amulet.map file in the edit directory, make sure you check it out. The
+syntax for map files is fairly simple, though I might get round to writing a
+tutorial on them some day! In the mean time holler for me at the usual email
+address if you're unsure.
+
+#####B[HOOK_FEELING] = function()
+#####B if (player.inside_quest ~= AMULET_QUEST) then
+#####B return FALSE
+#####B else
+#####B cmsg_print(TERM_L_BLUE, "Hannah speaks to you:")
+#####B cmsg_print(TERM_YELLOW, "'Some nasty monsters stole my
+#####B favourite necklace.'")
+#####B cmsg_print(TERM_YELLOW, "'It's hidden at the back of that
+#####B corridor! Please fetch it for me'")
+#####B return TRUE
+#####B end
+#####Bend,
+
+We're moving into some rather more obvious territory here, and getting into the
+meat of the quest. The [[[[[BHOOK_FEELING] is triggered at the point when the level
+feeling appears. It's important that this is run only if the player is inside
+the amulet quest, as otherwise it will trigger EVERY time a level feeling
+occurs, when you go down a level in the barrow-downs, whenever! Returning TRUE
+will replace the level feeling with what's above, returning FALSE will still
+perform the function but will amend the normal level feeling - so here if we'd
+returned false we'd still get our custom messages, but they'd follow with
+'looks like a typical quest level'. Of course returning false may cause you
+other problems (see end of this file!) depending on what else you have in your
+function.
+
+#####B[HOOK_GIVE] = function(m_idx, item)
+
+#####B m_ptr = monster(m_idx)
+#####B o_ptr = get_object(item)
+
+#####B if (m_ptr.r_idx == test_monster_name("Hannah Cooke, a little girl"))
+#####B and (o_ptr.tval == TV_AMULET) and (o_ptr.sval == 2) then
+
+#####B cmsg_print(TERM_YELLOW, "'Thank-you!'")
+
+#####B inven_item_increase(item, -1)
+#####B inven_item_optimize(item)
+
+#####B quest(AMULET_QUEST).status = QUEST_STATUS_COMPLETED
+
+#####B cave_set_feat(7, 6, 6)
+
+#####B cmsg_print(TERM_YELLOW, "'Here, take this pretty ring I found
+#####B as a token of gratitude!'")
+#####B random_type = randint(57)
+#####B reward = create_object(TV_RING, random_type)
+#####B drop_near(reward, -1, py, px)
+#####B quest(AMULET_QUEST).status = QUEST_STATUS_REWARDED
+#####B return TRUE
+#####B else
+#####B return FALSE
+#####B end
+#####Bend,
+
+This is a fairly long function, but don't be intimidated. It's not really
+difficult to understand. As you can see we're hooking into the giving of an
+object to a monster (the 'y' key). Because of this, the function takes two
+arguments - [[[[[Bm_idx] (the monster that you're giving to) and [[[[[Bitem] (the item that
+you're giving).
+
+We then make it possible to work with the monster and item variables by
+referencing them to two functions which identify them from the edit files:
+[[[[[Bmonster()] and [[[[[Bget_object()]. This enables us to now say, 'if the name of the
+monster is "Hannah Cooke, a little girl" and the type of item is an amulet and
+that amulet is an amulet of adornment, then carry out the following commands'.
+
+We then say call the function [[[[[Binven_item_increase()] which places an object in
+the inventory. It takes two arguments, the first being what object to put in
+the inventory and the second being how many of that type of objects to put in
+the inventory. You can see that by placing -1 as the second argument it fairly
+obviously subtracts that item from the inventory. The [[[[[Binven_item_optimize()]
+function checks that there are no empty inventory slots, and if there are,
+erases them.
+
+The quest is then completed, and the stairs are revealed using the
+[[[[[Bcave_set_feat()] function. This function takes three arguments, the first is the
+x co-ordinate of the cave square you wish to change (counted from top left) the
+second is the y co-ordinate, and the third is the index number of the feature
+you wish the square to become as defined in f_info.txt.
+
+We then set about rewarding the player. As you can see we call [[[[[Bcreate_object()]
+which takes two variables: the first is the type of object (these are all
+listed in object.pkg) and the second is the sub-type of that object. I searched
+k_info.txt to see how many different types of ring there were (57) and used a
+randomly selected number with a maximum value of 57 as that specific sub-type.
+
+We then drop the object (although it's been created, it has only been created
+in the game's memory, it's nowhere that the player can interact with it until
+we drop it). The [[[[[Bdrop_near()] function takes 3 variables, the first being the
+object that you wish to drop, the second being the chance that it disappears
+(like an arrow, or mimicked creature) on drop. If you set it to -1, it won't
+ever disappear. The last two are the co-ordinates at which the object will be
+dropped. py and px are the global variables defined by where the player is
+standing, so in this case it will drop under the player. You could do
+[[[[[Binven_item_increase(reward, 1)] if you wanted, but I wanted to show a variety of
+ways of handling objects.
+
+OK, let's take a look at the next hook:
+
+#####B[HOOK_CHAT] = function(m_idx)
+#####B m_ptr = monster(m_idx)
+#####B if (m_ptr.r_idx == test_monster_name("Hannah Cooke, a little girl")) then
+#####B if (quest(AMULET_QUEST).status == QUEST_STATUS_REWARDED) then
+#####B cmsg_print(TERM_YELLOW, "'Bye!'")
+#####B else
+#####B cmsg_print(TERM_YELLOW, "'Are the monsters too tough?
+#####B Do you want to leave?'")
+#####B if (get_check("Really leave and fail the quest?") ==
+#####B FALSE)
+#####B then
+#####B cmsg_print(TERM_YELLOW, "'Go and get my
+#####B amulet then!'")
+#####B else
+#####B cmsg_print(TERM_YELLOW, "'Awww. Never
+#####B mind. It was only a bit of rabbits foot'")
+#####B quest(AMULET_QUEST).status =
+#####B QUEST_STATUS_FAILED
+#####B cave_set_feat(7, 6, 6)
+#####B cave_set_feat(12, 5, 60)
+#####B end
+#####B end
+#####B return TRUE
+#####B end
+#####B return FALSE
+#####Bend,
+
+This only looks complicated because of the nested 'if' statements. It's easy to
+lose your way when doing this kind of thing, always make sure you close all the
+statements and put the returns in the right place. [[[[[BHOOK_CHAT] functions have one
+argument - the monster you are chatting to. As you can see, we perform a check
+to make sure it's the right monster and then away we go.... If the player wants
+to leave the quest without completion they talk to Hannah, who gives them a
+chance to change their mind! If the player asks to leave the entrance to the
+corridor is blocked off (the second cave_set_feat()) so that the user can't
+then go and get the amulet. Gumband or Zangband players may at this point think
+they've lost out on the rabbits foot of burglary! (they haven't though as it
+doesn't exist in ToME).
+
+#####B[HOOK_CHAR_DUMP] = function()
+#####B if (quest(AMULET_QUEST).status == QUEST_STATUS_FAILED) then
+#####B print_hook("\n You chickened out of rescuing a necklace and
+#####B made a little girl sad. ")
+#####B elseif (quest(AMULET_QUEST).status == QUEST_STATUS_COMPLETED) or
+#####B (quest(AMULET_QUEST).status == QUEST_STATUS_REWARDED) or
+#####B (quest(AMULET_QUEST).status == QUEST_STATUS_FINISHED) then
+#####B print_hook("\n You rescued little Hannah Cooke's necklace from
+#####B the nasty monsters ")
+#####B end
+#####B return FALSE
+#####Bend,
+
+This quite simply and obviously prints an appropriate line in the character
+dump based on the status of the quest. The [[[[[B\n] bit ensures the text goes on a
+new line, so make sure you include it! Also you should return FALSE as
+returning TRUE will stop executing all the other character dump lines (and you
+may get other quests not having their lines printed).
+
+=== A word about returning TRUE and FALSE ===
+
+As I mentioned above, you need to be careful what you return when dealing with
+HOOKS as you can mess up the game a bit. Bear in mind that if you add a
+function to [[[[[BHOOK_GEN_QUEST], every time a quest is generated, that function will
+run. If you return TRUE, then no further functions attached to that hook will
+run. If you return FALSE, it continues processing functions on that hook.
+
+That is pretty much it. Do take a look at the other included scripts that I
+haven't gone into any detail about in the files, as you'll pick up some useful
+techniques there too. Especially worthy of note is the hina.lua file which uses
+hooks outside of the quest structure and also global variables and variables in
+a table. If you have any questions, let me know at the email addy below.
+
+Back to the *****lua.hlp*0[lua help index] .
+
+ [[[[[gThis file by fearoffours (fearoffours@moppy.co.uk)]
diff --git a/lib/mods/theme/help/lua_skil.txt b/lib/mods/theme/help/lua_skil.txt
new file mode 100644
index 00000000..87385e5d
--- /dev/null
+++ b/lib/mods/theme/help/lua_skil.txt
@@ -0,0 +1,342 @@
+|||||oy
+#####R /----------------------------------------\
+#####R < Adding new skill-based powers >
+#####R \----------------------------------------/
+
+#####R=== Introduction ===
+
+This is very much in the same vein as adding a racial/extra power, but has to
+be tied into skills, and we're defining more than one spell at once. You should
+have read the *****lua_intr.txt*0[scripting introduction] and
+*****lua_pow.txt*0[racial power tutorial] before going much further. Both of the above files
+contain some fairly fundamental information which you will find necessary for
+full understanding of this file.
+
+#####R=== Getting started ===
+
+Open construc.lua (you have downloaded the example scripts from
+[[[[[Ghttp://www.moppy.co.uk/angband.htm], haven't you?). The idea behind this
+script is that it adds a skill which affects you ability to build/knock down
+stuff. It treats the equivalent of stone-to-mud and trap-door destruction
+spells as if they were "building skills". It also adds quite a few high-level
+'spells' which do funky things like carving out corridors and chambers in a
+single turn, and building doors and stuff. Just think of it as if the person
+who has plenty of skills in this area would be a builder-type with lots of
+strength and constitution...
+
+In order to add these powers we're going to edit the s_info.txt file which
+lives in the edit folder, and add a new skill, underneath the 'misc' tree,
+called construction. The powers will then be accessed through the 'm' menu, in
+a similar way to mindcraft or alchemy skills or such. (That is, no books are
+needed to cast them, as we're treating them as a craft that has been learnt,
+rather than spells.) Our fist line of the script file reads:
+
+#####BSKILL_CONSTRUCT = 57
+
+This merely links the skill index that we'll be defining in s_info.txt to this
+file. We'll come back to this at the end of the tutorial.
+
+#####Bconstructor_powers = add_magic
+
+In a similar way to the [[[[[Badd_power] function we called when we added the
+Phoenix racial ability, this line calls a special function which we use to
+define new skills. It follows a very specific, but easy to understand form. It
+starts with a brace, which indicates the add_magic function will be storing
+these values in a table. Don't worry about this too much, but understand that a
+table starts and ends with braces [[[[[B{] and [[[[[B}] respectively. Each key
+(or field name) takes the format [[[[[B"key" = value,] (the comma is
+important!).
+
+#####B ["fail"] = function()
+#####B msg_print("You decide now is a good time for a cuppa")
+#####B end,
+#####B ["stat"] = A_STR,
+#####B ["get_level"] = function()
+#####B return get_skill_scale(SKILL_CONSTRUCT, 50)
+#####B end,
+#####B ["spell_list"] =
+
+[[[[[B"fail"] is a function that is called whenever you ##fail to cast the
+spells##. Here it does nothing spectacular.
+[[[[[B"stat"] defines the stat used to cast the spells. Here it is strength.
+Any other stat can be used, prefix it with [[[[[BA_].
+[[[[[B"get_level"] is used to determine the level of the spell. It's associated
+with spells that increase in power the more points that are invested in the
+associated skill. I know that's not terribly clear, I'll come back to it in a
+moment.
+[[[[[B"spell_list"] is just that, a list of all the spells.
+Each of these four properties within the table must end with a comma. If a
+function is defined in the property itself then we add the comma after the
+closing [[[[[Bend]. Again compare with construct.lua to see it. Any line NOT
+ending with a comma will cause a lua error on startup, probably of the type
+[[[[[V'}' expected to close '{' at line <whatever>.]
+
+#####R=== The spell list ===
+
+Each spell, within the [[[[[B"spell_list"] key has its own set of properties
+that we need to define from a sub-table so we open another set of braces to
+start the spell list, and then a third set of braces to start the first spell.
+So with all this, our first spell looks like:
+
+#####B ["spell_list"] =
+#####B {
+#####B {
+#####B ["name"] =
+#####B ["desc"] =
+#####B ["mana"] =
+#####B ["level"] =
+#####B ["fail"] =
+#####B ["spell"] =
+#####B ["info"] =
+#####B },
+
+[[[[[B"name"] is, as you would expect, the name of the spell, as you want it to
+appear in the spell list when choosing a spell. The maximum number of
+characters for this is 29.
+[[[[[B"desc"] is the description received when you hit the capital letter of
+that spell in the menu. (i.e., press 'a' to cast the first spell, but press 'A'
+to receive info about the first spell.
+[[[[[B"mana"] is the amount of mana required to cast the spell.
+[[[[[B"level"] is the level required to use that spell (that's level of the (in
+this case construction) skill, not character level!).
+[[[[[B"fail"] is base fail rate.
+[[[[[B"spell"] is the function that is executed when the spell is cast. Note
+that it MUST take the form [[[[[Bfunction() blah end] even if you're calling
+a C function directly. If you have a look at the end of the file, you'll see
+the "rebuild dungeon" spell which is identical to the "alter_reality" spell.
+However, rather than reading [[[[[B"spell" = alter_reality()], it reads:
+
+#####B["spell"] = function()
+#####B alter_reality()
+#####Bend,
+
+which appears to be a long way round to do the same thing, but this is how it
+must be done.
+
+In a similar way, the [[[[[B"info"] key must begin with a [[[[[Bfunction()]
+and return the value of what is to be displayed alongside the spell name,
+level and mana in the spell list. The maximum number of characters that can be
+displayed here is dependent on the width of the user's screen, but try to keep
+it under 12 if you can, as this will fit in a standard 80x24 terminal screen.
+The first character will need to be a space otherwise you'll have the info line
+squashed right up against the fail rate and it will look odd. If you wish to
+have this part blank in the spell list, you still need to return a value, so
+just a single space will do : [[[[[Breturn " "]
+
+All of these keys are repeated for each spell, with each spell in its own
+table (therefore, it's own set of braces). Again, check the lua file for
+clarification.
+
+When entering the spells in the "spell_list", you must take care to specify
+them in the order which they are gained, otherwise they display incorrectly in
+the spell list.
+
+You should by now be experienced enough to understand most of what's going on
+in the actual spell functions (especially if you dig around in the source a
+bit, and check out Chris Hadgis' excellent *****lua_spel.txt*0[spell.pkg] helper
+files. I'm not going to go through the whole file line by line, as this is
+something you should do yourself, figuring out what's going on. I'm going to
+examine a few of the things we haven't covered before though, so pay attention.
+
+#####R=== The get_level() function ===
+
+Probably one of the most important functions that you see reappearing in the
+file is the [[[[[Bget_level()] function. All this does is return the numerical
+value of the power that is given as the first argument. So [[[[[Bget_level]
+[[[[[B(constructor_power)] will return the current level of the constructor power.
+Given that the level of this is taken directly from the construction skill, (we
+defined that in the [[[[[B"get_level"] key, by saying [[[[[Bget_skill_scale]
+[[[[[B(SKILL_CONSTRUCT, 50)] ) it will return the value of your construction skill.
+[[[[[Bconstructor_power] is the name of the whole power, we named it thus on
+the second line of the script!
+
+[[[[[Bget_level] takes the following arguments: [[[[[Bget_level(power, max, ]
+[[[[[Bmin)]. The power is obviously which power we're taking the value from, and the
+max and min allow you to define boundaries for the spell. For instance the
+current maximum value that [[[[[Bget_level(constructor_power)] can return is
+50, as that is the maximum number of skill points you can have in that skill.
+If you were using this as the basis for the damage of a low-level bolt spell,
+you might decide that having a damage of 50 would be too much (unlikely, but
+still possible). You could therefore define a maximum value of 20 so that when
+the value of the construction skill was over 50, the maximum value for
+damage of that spell would be 20. To achieve this you'd have:
+[[[[[Bget_level(constructor_power, 20)]. In a similar way, you can force the
+minimum value of the spell to be higher than the actual construction skill
+level, with a [[[[[Bget_level(constructor_power, 50, 15)]. This would be useful
+say for spells that you wanted to be available when the construction skill
+level reaches 10, but for whom you wanted a (for example) base damage of 15
+right from the word go. These re-scale values rather than capping them!
+
+You can leave out the minimum value as I have done above. You can also leave
+the maximum value out (it will default to 50). If you want to specify a minimum
+value though, you MUST specify a maximum value as well.
+
+As you have hopefully been able to tell, the [[[[[Bget_level()] function
+enables us to have spells that increase in usefulness as you gain levels. Let's
+take the "Dismantle" spell. The function in the [[[[[B"spell"] key is as
+follows:
+
+#####Bfunction()
+#####B local ret, dir, dam
+
+#####B if (get_level(constructor_powers, 50) >= 11) then
+#####B ret, dir = get_aim_dir();
+#####B if (ret == FALSE) then return end
+#####B fire_beam(GF_KILL_TRAP, dir, 1)
+#####B else
+#####B fire_ball(GF_KILL_TRAP, 0, 1, 1)
+#####B end
+#####Bend,
+
+The [[[[[Bif] statement is obviously what really interests us here. You'll
+notice that this has the amendment of an [[[[[Belse] clause, which the [[[[[Bif]
+statement we used in the previous tutorial did not. As you would expect, if the
+condition on the first line of this statement is met, then the instructions
+immediately below it are carried out. If the condition is not met, then the
+statements that follow the [[[[[Belse] are executed.
+
+Coming back to the [[[[[Bget_level] function, we learnt from above, that the
+[[[[[Bget_level] part of this function translates as, "if the value of the
+construction_power level (which happens to be identical to the construction
+skill level) is greater than or equal to 11, cast a beam of trap disarming in
+the specified direction. (The first part of this is all straightforward,
+getting a direction, and cancelling correctly if the player presses 'ESC'.)
+Otherwise, cast a ball of trap disarming with a radius of one, centred on the
+player."
+
+In the same way, as you look at the construc.lua file, you will see that
+[[[[[Bget_level()] is used many times in this way, to increase the power of
+detection spells, to change bolt spells to ball spells, to keep a constantly
+increasing damage going, and so on.
+
+#####R=== Elseif's and things ===
+
+If you want to provide more than one alternative condition, in an
+[[[[[Bif-then-else] statement, you can use [[[[[Belseif]s which do what you
+might expect. Take a look at the first spell, "Survey area", for an example of
+this:
+
+#####Bif (get_level(constructor_powers, 50) >= 28) then
+#####B wiz_lite()
+#####Belseif (get_level(constructor_powers, 50) >= 15) then
+#####B map_area()
+#####B detect_traps(DEFAULT_RADIUS)
+#####Belseif (get_level(constructor_powers, 50) >= 5) then
+#####B detect_traps(DEFAULT_RADIUS)
+#####B detect_stairs(DEFAULT_RADIUS)
+#####B detect_doors(DEFAULT_RADIUS)
+#####Belse
+#####B detect_stairs(DEFAULT_RADIUS)
+#####B detect_doors(DEFAULT_RADIUS)
+#####Bend
+
+If the level of constructor powers is greater or equal to 28, then the function
+[[[[[Bwiz_lite()] is performed, and no other part of the if statement is
+executed. [[[[[Bwiz_lite()] is just the enlightenment spell. If it is less than
+28, the next condition is examined: that if the level of constructor powers is
+greater than or equal to 15, then [[[[[Bmap_area()](Magic mapping) and detect
+traps are called. If the level of constructor power is less than 15, it moves
+onto the next condition, which says that if the level of constructor power is
+greater than 5, then detect stairs, traps and doors. If none of these
+conditions are met,(that is, if the level of construction skill is less than 5)
+then we just detect doors and stairs.
+
+You'll note that each of the detection spells includes a DEFAULT_RADIUS
+constant. You could change this to a numerical value, or a variable defined
+somewhere else in your script. eg [[[[[Bdetect_traps(2)] would detect traps
+with a radius of 2 centred on the player.
+
+#####R=== Registering the skill type ===
+
+This is what we do at the end of the file, and is what ties the powers we've
+defined to the action of pressing the 'm' key in game. Once more we're calling
+a special function [[[[[Badd_mkey()] which takes its arguments for a table.
+There are only two keys in this table though which keeps things simple.
+
+#####Badd_mkey
+#####B{
+#####B ["mkey"] = MKEY_CONSTRUCT_POWERS,
+#####B ["fct"] = function()
+#####B execute_magic(constructor_powers)
+#####B energy_use = energy_use + 100;
+#####B end
+#####B}
+
+[[[[[B"mkey"] must be a UNIQUE value > 1000 . Here I've defined it as a
+constant, [[[[[BMKEY_CONSTRUCT_POWERS], which has the value 1004. This value
+we'll call again in the s_info.txt file.
+[[[[[B"fct"] is the function that's called when the user presses the key in the
+'m' menu. So here, it calls the [[[[[Bexecute_magic] function which actually
+displays a list of powers for the user to choose from. The argument it takes is
+the powers it will use (alchemy, mindcraft, etc., or in this case constructor),
+and then the [[[[[Benergy_use] line tells the game to take one game turn to do
+the action.
+
+#####R=== Adding the skill in s_info.txt ===
+
+Take a look in the s_info.txt file, under the Misc section. You'll see,
+
+#####BN:57:Construction
+#####BD:Ability to use constructor powers
+#####BD:Construction powers use strength
+#####BA:1004:Build or knock down stuff
+#####BI:1000
+
+The first line is the index of the skill; again this must be unique. The second
+property is the name of the skill. The [[[[[BD] lines are the lines displayed
+when the skill is highlighted in the skill screen.
+The first entry on the [[[[[BA] line is the value of the [[[[[B"mkey"] we
+defined in the [[[[[Badd_mkey] function in our script. The second entry is the
+display for selecting the construction power in the 'm' menu.
+The [[[[[BI] line is currently unused, but add a 1000 there anyway. That's what
+all the others have so when it's introduced, at least it will affect your
+powers identically to how it affects all the other powers.
+
+If you scroll to the very bottom of the file now, you'll see I've placed the
+skill at the bottom of the Misc branch of the skills tree. I then made a new
+class, constructor, which you can see in p_info.txt.
+
+That is all that is NEEDED when writing a script to add a skill - defining an
+mkey using add_mkey, and defining any powers that are called in the
+[[[[[B"fct"] (generally using [[[[[Badd_magic] ).
+
+And I've added the line
+
+#####Btome_dofile("construc.lua")
+
+in init.lua so the script is loaded on start-up!
+
+Below I'm going to talk in depth about a few other functions that you may find
+useful in your scripting.
+
+#####R=== fire_bolt() and fire_beam() ===
+
+In the last help file we looked at the routine for firing a ball -
+[[[[[Bfire_ball()]. Here's a quick note about beams and bolts...
+[[[[[Bfire_beam()] and [[[[[Bfire_bolt()] take 2 arguments:
+[[[[[B(type, direction, damage)]. So in the dismantle spell we have the
+direction passed from [[[[[Bget_aim_dir()] (the function that asks the player
+for a direction), the type of damage is [[[[[BGF_KILL_TRAP], which as you might
+expect disarms traps. And the damage is only 1 because it's not going to hurt
+monsters, just dismantle traps.
+
+#####R=== set_oppose_elec() ===
+
+OK here's another thing. Wander on down to the sparky_skills spell. After the
+appropriate bolt/ball is fired, we have the line:
+
+#####Bif player.oppose_elec == 0 then
+#####B set_oppose_elec(randint(10) + 20 + get_level(constructor_powers, 20)*3)
+#####Bend
+
+This is the bit that grants temporary resist electricity. We've called the
+function [[[[[Bset_oppose_elec(turns)], which sets the player's resist
+electricity to "on" for the time specified in the argument "turns". We're only
+calling this if the player is not already granted temporary resist electricity,
+and we've linked the number of turns it is active to the level of the
+construction skill. I've limited the maximum value of get_level to 20 in this
+instance. A similar idea can be used for temporarily granting levitation,
+extended infravision, protection against evil, resist fire, stuns, cuts and so
+on and so on. Have a look in player.pkg in the source for a full list....
+
+ [[[[[gThis file by fearoffours (fearoffours@moppy.co.uk)]
diff --git a/lib/mods/theme/help/lua_spel.txt b/lib/mods/theme/help/lua_spel.txt
new file mode 100644
index 00000000..aa4a532b
--- /dev/null
+++ b/lib/mods/theme/help/lua_spel.txt
@@ -0,0 +1,2150 @@
+|||||oy
+
+#####R /----------------------------------------\
+#####R < spell.pkg functions helper file >
+#####R \----------------------------------------/
+
+----------------------------------------------------------------------
+
+#####R=== teleport_player_directed ===
+
+#####GDeclaration
+ extern void teleport_player_directed(int rad, int dir);
+
+#####GFile
+ spells1.c
+
+#####GComment
+/*
+ * Teleport player, using a distance and a direction as a rough guide.
+ *
+ * This function is not at all obsessive about correctness.
+ * This function allows teleporting into vaults (!)
+ */
+
+#####GDescription
+Teleport a player up to "rad" grids away roughly in "dir" direction.
+
+#####GParameters
+> "rad" must not exceed 200. The distance teleported is a minimum of a
+ quarter of "rad".
+> "dir" must be from 0 to 9.
+ *****fields.txt*0[direction]
+
+----------------------------------------------------------------------
+
+#####R=== teleport_away ===
+
+#####GDeclaration
+ extern void teleport_away(int m_idx, int dis);
+
+#####GFile
+ spells1.c
+
+#####GComment
+/*
+ * Teleport a monster, normally up to "dis" grids away.
+ *
+ * Attempt to move the monster at least "dis/2" grids away.
+ *
+ * But allow variation to prevent infinite loops.
+ */
+
+#####GDescription
+Teleport monster indicated by "m_idx" up to "dis" grids away.
+
+#####GParameters
+> "m_idx" is the index of the monster in m_list[].
+> "dis" must not exceed 200. The distance teleported is a minimum of a
+ quarter of "dis".
+
+----------------------------------------------------------------------
+
+#####R=== teleport_player ===
+
+#####GDeclaration
+ extern void teleport_player(int dis);
+
+#####GFile
+ spells1.c
+
+#####GComment
+/*
+ * Teleport the player to a location up to "dis" grids away.
+ *
+ * If no such spaces are readily available, the distance may increase.
+ * Try very hard to move the player at least a quarter that distance.
+ */
+
+#####GDescription
+Teleport player up to "dis" grids away.
+
+#####GParameters
+> "dis" must not exceed 200. The distance teleported is a minimum of a
+ quarter of "dis".
+
+----------------------------------------------------------------------
+
+#####R=== teleport_player_to ===
+
+#####GDeclaration
+ extern void teleport_player_to(int ny, int nx);
+
+#####GFile
+ spells1.c
+
+#####GComment
+/*
+ * Teleport player to a grid near the given location
+ *
+ * This function is slightly obsessive about correctness.
+ * This function allows teleporting into vaults (!)
+ */
+
+#####GDescription
+Teleport player to a grid near the given location ("ny", "nx"). If
+the location is empty, the player goes there, otherwise they go to
+a grid as close as possible to the location.
+
+#####GParameters
+> "ny" is the y co-ordinate of the location.
+> "nx" is the x co-ordinate of the location.
+
+----------------------------------------------------------------------
+
+#####R=== teleport_monster_to ===
+
+#####GDeclaration
+ extern void teleport_monster_to(int m_idx, int ny,
+ int nx);
+
+#####GFile
+ spells1.c
+
+#####GComment
+/*
+ * Teleport a monster to a grid near the given location
+ *
+ * This function is slightly obsessive about correctness.
+ */
+
+#####GDescription
+Teleport monster indicated by "m_idx" to a grid near the given
+location ("ny", "nx"). If the location is empty, the monster goes
+there, otherwise they go to a grid as close as possible to the
+location.
+
+#####GParameters
+> "m_idx" is the index of the monster in m_list[].
+> "ny" is the y co-ordinate of the location.
+> "nx" is the x co-ordinate of the location.
+
+----------------------------------------------------------------------
+
+#####R=== teleport_player_level ===
+
+#####GDeclaration
+ extern void teleport_player_level(void);
+
+#####GFile
+ spells1.c
+
+#####GComment
+/*
+ * Teleport the player one level up or down (random when legal)
+ */
+
+#####GDescription
+Teleport the player one level up or down at random.
+
+----------------------------------------------------------------------
+
+#####R=== recall_player ===
+
+#####GDeclaration
+ extern void recall_player(void);
+
+#####GFile
+ spells1.c
+
+#####GComment
+/*
+ * Recall the player to town or dungeon
+ */
+
+#####GDescription
+Recall the player to town (if in dungeon) or dungeon (if in town).
+
+----------------------------------------------------------------------
+
+#####R=== take_hit ===
+
+#####GDeclaration
+ extern void take_hit(int damage, cptr kb_str);
+
+#####GFile
+ spells1.c
+
+#####GComment
+/*
+ * Decreases players hit points and sets death flag if necessary
+ *
+ * XXX XXX XXX Invulnerability needs to be changed into a "shield"
+ *
+ * XXX XXX XXX Hack -- this function allows the user to save (or quit)
+ * the game when he dies, since the "You die." message is shown before
+ * setting the player to "dead".
+ */
+
+#####GDescription
+Reduce the player's current hit points by "damage" points. If the
+player dies, "kb_str" is used to record what the player was killed by
+(see high-score table).
+
+#####GParameters
+> "damage" is the amount of damage.
+> "kb_str" is a string describing what killed the player.
+
+----------------------------------------------------------------------
+
+#####R=== take_sanity_hit ===
+
+#####GDeclaration
+ extern void take_sanity_hit(int damage, cptr hit_from);
+
+#####GFile
+ spells1.c
+
+#####GComment
+/* Decrease player's sanity. This is a copy of the function above. */
+
+#####GDescription
+Reduce the player's current sanity points by "damage" points. If the
+player dies, "hit_from" is used to record what the player was killed
+by (see high-score table).
+
+#####GParameters
+> "damage" is the amount of damage.
+> "hit_from" is a string describing what killed the player.
+
+----------------------------------------------------------------------
+
+#####R=== project ===
+
+#####GDeclaration
+ extern bool project(int who, int rad, int y, int x,
+ int dam, int typ, int flg);
+
+#####GFile
+ spells1.c
+
+#####GComment
+/*
+ * Generic "beam"/"bolt"/"ball" projection routine.
+ *
+ * Input:
+ * who: Index of "source" monster (negative for "player")
+ * jk -- -2 for traps, only used with project_jump
+ * rad: Radius of explosion (0 = beam/bolt, 1 to 9 = ball)
+ * y,x: Target location (or location to travel "towards")
+ * dam: Base damage roll to apply to affected monsters (or player)
+ * typ: Type of damage to apply to monsters (and objects)
+ * flg: Extra bit flags (see PROJECT_xxxx in "defines.h")
+ *
+ * Return:
+ * TRUE if any "effects" of the projection were observed, else FALSE
+ *
+ * Allows a monster (or player) to project a beam/bolt/ball of a given kind
+ * towards a given location (optionally passing over the heads of interposing
+ * monsters), and have it do a given amount of damage to the monsters (and
+ * optionally objects) within the given radius of the final location.
+ *
+ * A "bolt" travels from source to target and affects only the target grid.
+ * A "beam" travels from source to target, affecting all grids passed through.
+ * A "ball" travels from source to the target, exploding at the target, and
+ * affecting everything within the given radius of the target location.
+ *
+ * Traditionally, a "bolt" does not affect anything on the ground, and does
+ * not pass over the heads of interposing monsters, much like a traditional
+ * missile, and will "stop" abruptly at the "target" even if no monster is
+ * positioned there, while a "ball", on the other hand, passes over the heads
+ * of monsters between the source and target, and affects everything except
+ * the source monster which lies within the final radius, while a "beam"
+ * affects every monster between the source and target, except for the casting
+ * monster (or player), and rarely affects things on the ground.
+ *
+ * Two special flags allow us to use this function in special ways, the
+ * "PROJECT_HIDE" flag allows us to perform "invisible" projections, while
+ * the "PROJECT_JUMP" flag allows us to affect a specific grid, without
+ * actually projecting from the source monster (or player).
+ *
+ * The player will only get "experience" for monsters killed by himself
+ * Unique monsters can only be destroyed by attacks from the player
+ *
+ * Only 256 grids can be affected per projection, limiting the effective
+ * "radius" of standard ball attacks to nine units (diameter nineteen).
+ *
+ * One can project in a given "direction" by combining PROJECT_THRU with small
+ * offsets to the initial location (see "line_spell()"), or by calculating
+ * "virtual targets" far away from the player.
+ *
+ * One can also use PROJECT_THRU to send a beam/bolt along an angled path,
+ * continuing until it actually hits something (useful for "stone to mud").
+ *
+ * Bolts and Beams explode INSIDE walls, so that they can destroy doors.
+ *
+ * Balls must explode BEFORE hitting walls, or they would affect monsters
+ * on both sides of a wall. Some bug reports indicate that this is still
+ * happening in 2.7.8 for Windows, though it appears to be impossible.
+ *
+ * We "pre-calculate" the blast area only in part for efficiency.
+ * More importantly, this lets us do "explosions" from the "inside" out.
+ * This results in a more logical distribution of "blast" treasure.
+ * It also produces a better (in my opinion) animation of the explosion.
+ * It could be (but is not) used to have the treasure dropped by monsters
+ * in the middle of the explosion fall "outwards", and then be damaged by
+ * the blast as it spreads outwards towards the treasure drop location.
+ *
+ * Walls and doors are included in the blast area, so that they can be
+ * "burned" or "melted" in later versions.
+ *
+ * This algorithm is intended to maximise simplicity, not necessarily
+ * efficiency, since this function is not a bottleneck in the code.
+ *
+ * We apply the blast effect from ground zero outwards, in several passes,
+ * first affecting features, then objects, then monsters, then the player.
+ * This allows walls to be removed before checking the object or monster
+ * in the wall, and protects objects which are dropped by monsters killed
+ * in the blast, and allows the player to see all affects before he is
+ * killed or teleported away. The semantics of this method are open to
+ * various interpretations, but they seem to work well in practice.
+ *
+ * We process the blast area from ground-zero outwards to allow for better
+ * distribution of treasure dropped by monsters, and because it provides a
+ * pleasing visual effect at low cost.
+ *
+ * Note that the damage done by "ball" explosions decreases with distance.
+ * This decrease is rapid, grids at radius "dist" take "1/dist" damage.
+ *
+ * Notice the "napalm" effect of "beam" weapons. First they "project" to
+ * the target, and then the damage "flows" along this beam of destruction.
+ * The damage at every grid is the same as at the "centre" of a "ball"
+ * explosion, since the "beam" grids are treated as if they ARE at the
+ * centre of a "ball" explosion.
+ *
+ * Currently, specifying "beam" plus "ball" means that locations which are
+ * covered by the initial "beam", and also covered by the final "ball", except
+ * for the final grid (the epicentre of the ball), will be "hit twice", once
+ * by the initial beam, and once by the exploding ball. For the grid right
+ * next to the epicentre, this results in 150% damage being done. The centre
+ * does not have this problem, for the same reason the final grid in a "beam"
+ * plus "bolt" does not -- it is explicitly removed. Simply removing "beam"
+ * grids which are covered by the "ball" will NOT work, as then they will
+ * receive LESS damage than they should. Do not combine "beam" with "ball".
+ *
+ * The array "gy[],gx[]" with current size "grids" is used to hold the
+ * collected locations of all grids in the "blast area" plus "beam path".
+ *
+ * Note the rather complex usage of the "gm[]" array. First, gm[0] is always
+ * zero. Second, for N>1, gm[N] is always the index (in gy[],gx[]) of the
+ * first blast grid (see above) with radius "N" from the blast centre. Note
+ * that only the first gm[1] grids in the blast area thus take full damage.
+ * Also, note that gm[rad+1] is always equal to "grids", which is the total
+ * number of blast grids.
+ *
+ * Note that once the projection is complete, (y2,x2) holds the final location
+ * of bolts/beams, and the "epicentre" of balls.
+ *
+ * Note also that "rad" specifies the "inclusive" radius of projection blast,
+ * so that a "rad" of "one" actually covers 5 or 9 grids, depending on the
+ * implementation of the "distance" function. Also, a bolt can be properly
+ * viewed as a "ball" with a "rad" of "zero".
+ *
+ * Note that if no "target" is reached before the beam/bolt/ball travels the
+ * maximum distance allowed (MAX_RANGE), no "blast" will be induced. This
+ * may be relevant even for bolts, since they have a "1x1" mini-blast.
+ *
+ * Note that for consistency, we "pretend" that the bolt actually takes "time"
+ * to move from point A to point B, even if the player cannot see part of the
+ * projection path. Note that in general, the player will *always* see part
+ * of the path, since it either starts at the player or ends on the player.
+ *
+ * Hack -- we assume that every "projection" is "self-illuminating".
+ *
+ * Hack -- when only a single monster is affected, we automatically track
+ * (and recall) that monster, unless "PROJECT_JUMP" is used.
+ *
+ * Note that all projections now "explode" at their final destination, even
+ * if they were being projected at a more distant destination. This means
+ * that "ball" spells will *always* explode.
+ *
+ * Note that we must call "handle_stuff()" after affecting terrain features
+ * in the blast radius, in case the "illumination" of the grid was changed,
+ * and "update_view()" and "update_monsters()" need to be called.
+ */
+
+#####GDescription
+Generate a beam/bolt/ball starting from "who" with a radius of "rad"
+at target grid "y,x" for "damage" points of "typ" damage. The beam/
+bolt/ball can have various properties as denoted by "flg".
+
+#####GParameters
+> "who" is > 0 (index of monster in m_list[]), < 0 and
+ not -100 or -101 (player), -100 or -101 (trap).
+> "rad" is 0 for a beam/bolt and 1-9 for a ball.
+> "y" is the y co-ordinate of the target grid.
+> "x" is the x co-ordinate of the target grid.
+> "dam" is the number of points of damage.
+> "typ" is the type of damage
+ *****fields.txt*0[GF_fields]
+> "flg" is the projection effect
+ *****fields.txt*0[PROJECT_fields]
+
+----------------------------------------------------------------------
+
+#####R=== corrupt_player ===
+
+#####GDeclaration
+ extern void corrupt_player(void);
+
+#####GFile
+ spells1.c
+
+#####GComment
+(none)
+
+#####GDescription
+Swap two of the players stats at random.
+
+----------------------------------------------------------------------
+
+#####R=== grow_trees ===
+
+#####GDeclaration
+ extern void grow_trees(int rad);
+
+#####GFile
+ spells2.c
+
+#####GComment
+/*
+ * Grow trees
+ */
+
+#####GDescription
+Grow up to (("rad" x "rad") + 11) trees around the player.
+
+#####GParameters
+> "rad" is the radius of the area where trees may grow.
+
+----------------------------------------------------------------------
+
+#####R=== hp_player ===
+
+#####GDeclaration
+ extern bool hp_player(int num);
+
+#####GFile
+ spells2.c
+
+#####GComment
+/*
+ * Increase players hit points, notice effects
+ */
+
+#####GDescription
+Add "num" points to the player's current hit points. The total can
+not exceed the maximum.
+
+#####GParameters
+> "num" is the number of points to add.
+
+----------------------------------------------------------------------
+
+#####R=== heal_insanity ===
+
+#####GDeclaration
+ extern bool heal_insanity(int val);
+
+#####GFile
+ spells2.c
+
+#####GComment
+/* Heal insanity. */
+
+#####GDescription
+Add "val" points to the player's current sanity points. The total can
+not exceed the maximum.
+
+#####GParameters
+> "val" is the number of points to add.
+
+----------------------------------------------------------------------
+
+#####R=== warding_glyph ===
+
+#####GDeclaration
+ extern void warding_glyph(void);
+
+#####GFile
+ spells2.c
+
+#####GComment
+/*
+ * Leave a "glyph of warding" which prevents monster movement
+ */
+
+#####GDescription
+Place a glyph at the player's location. The location must be bare.
+
+----------------------------------------------------------------------
+
+#####R=== explosive_rune ===
+
+#####GDeclaration
+ extern void explosive_rune(void);
+
+#####GFile
+ spells2.c
+
+#####GComment
+(none)
+
+#####GDescription
+Place a minor glyph (explosive rune) at the player's location. The
+location must be bare.
+
+----------------------------------------------------------------------
+
+#####R=== do_dec_stat ===
+
+#####GDeclaration
+ extern bool do_dec_stat(int stat, int mode);
+
+#####GFile
+ spells2.c
+
+#####GComment
+/*
+ * Lose a "point"
+ */
+
+#####GDescription
+Attempt to reduce the player's "stat" statistic by a point.
+
+#####GParameters
+> "stat" is the statistic
+ *****fields.txt*0[A_fields]
+> "mode" is the type of decrease: temporary, normal, or permanent
+ *****fields.txt*0[STAT_DEC_fields]
+
+----------------------------------------------------------------------
+
+#####R=== do_res_stat ===
+
+#####GDeclaration
+ extern bool do_res_stat(int stat);
+
+#####GFile
+ spells2.c
+
+#####GComment
+/*
+ * Restore lost "points" in a stat
+ */
+
+#####GDescription
+Restore the player's "stat" statistic.
+
+#####GParameters
+> "stat" is the statistic
+ *****fields.txt*0[A_fields]
+
+----------------------------------------------------------------------
+
+#####R=== do_inc_stat ===
+
+#####GDeclaration
+ extern bool do_inc_stat(int stat);
+
+#####GFile
+ spells2.c
+
+#####GComment
+/*
+ * Gain a "point" in a stat
+ */
+
+#####GDescription
+Increase the player's "stat" statistic by a point.
+
+#####GParameters
+> "stat" is the statistic
+ *****fields.txt*0[A_fields]
+
+----------------------------------------------------------------------
+
+#####R=== identify_pack ===
+
+#####GDeclaration
+ extern void identify_pack(void);
+
+#####GFile
+ spells2.c
+
+#####GComment
+/*
+ * Identify everything being carried.
+ * Done by a potion of "self knowledge".
+ */
+
+#####GDescription
+Identify all items in the inventory.
+
+----------------------------------------------------------------------
+
+#####R=== remove_curse ===
+
+#####GDeclaration
+ extern bool remove_curse(void);
+
+#####GFile
+ spells2.c
+
+#####GComment
+/*
+ * Remove most curses
+ */
+
+#####GDescription
+Remove all curses except for heavy curses.
+
+----------------------------------------------------------------------
+
+#####R=== remove_all_curse ===
+
+#####GDeclaration
+ extern bool remove_all_curse(void);
+
+#####GFile
+ spells2.c
+
+#####GComment
+/*
+ * Remove all curses
+ */
+
+#####GDescription
+Remove all curses including heavy curses.
+
+----------------------------------------------------------------------
+
+#####R=== restore_level ===
+
+#####GDeclaration
+ extern bool restore_level(void);
+
+#####GFile
+ spells2.c
+
+#####GComment
+/*
+ * Restores any drained experience
+ */
+
+#####GDescription
+Restore all drained experience points (if any).
+
+----------------------------------------------------------------------
+
+#####R=== self_knowledge ===
+
+#####GDeclaration
+ extern void self_knowledge(FILE *fff);
+
+#####GFile
+ spells2.c
+
+#####GComment
+/*
+ * self-knowledge... idea from nethack. Useful for determining powers and
+ * resistances of items. It saves the screen, clears it, then starts listing
+ * attributes, a screenful at a time. (There are a LOT of attributes to
+ * list. It will probably take 2 or 3 screens for a powerful character whose
+ * using several artifacts...) -CFT
+ *
+ * It is now a lot more efficient. -BEN-
+ *
+ * See also "identify_fully()".
+ *
+ * XXX XXX XXX Use the "show_file()" method, perhaps.
+ */
+
+#####GDescription
+Show all attributes including racial powers, mutations, and equipment
+effects.
+
+#####GParameters
+> "*ffff" points to a file (write info to file) or is NULL (write info
+ to screen).
+
+----------------------------------------------------------------------
+
+#####R=== lose_all_info ===
+
+#####GDeclaration
+ extern bool lose_all_info(void);
+
+#####GFile
+ spells2.c
+
+#####GComment
+/*
+ * Forget everything
+ */
+
+#####GDescription
+Forget about objects and the map.
+
+----------------------------------------------------------------------
+
+#####R=== detect_traps ===
+
+#####GDeclaration
+ extern bool detect_traps(void);
+
+#####GFile
+ spells2.c
+
+#####GComment
+/*
+ * Detect all traps on current panel
+ */
+
+#####GDescription
+Detect all traps on current panel.
+
+----------------------------------------------------------------------
+
+#####R=== detect_doors ===
+
+#####GDeclaration
+ extern bool detect_doors(void);
+
+#####GFile
+ spells2.c
+
+#####GComment
+/*
+ * Detect all doors on current panel
+ */
+
+#####GDescription
+Detect all doors on current panel.
+
+----------------------------------------------------------------------
+
+#####R=== detect_stairs ===
+
+#####GDeclaration
+ extern bool detect_stairs(void);
+
+#####GFile
+ spells2.c
+
+#####GComment
+/*
+ * Detect all stairs on current panel
+ */
+
+#####GDescription
+Detect all stairs on current panel.
+
+----------------------------------------------------------------------
+
+#####R=== detect_treasure ===
+
+#####GDeclaration
+ extern bool detect_treasure(void);
+
+#####GFile
+ spells2.c
+
+#####GComment
+/*
+ * Detect any treasure on the current panel
+ */
+
+#####GDescription
+Detect any treasure on the current panel.
+
+----------------------------------------------------------------------
+
+Field: hack_no_detect_message
+Value: FALSE
+
+----------------------------------------------------------------------
+
+#####R=== detect_objects_gold ===
+
+#####GDeclaration
+ extern bool detect_objects_gold(void);
+
+#####GFile
+ spells2.c
+
+#####GComment
+/*
+ * Detect all "gold" objects on the current panel
+ */
+
+#####GDescription
+Detect all objects with the TV_GOLD flag.
+
+----------------------------------------------------------------------
+
+#####R=== detect_objects_normal ===
+
+#####GDeclaration
+ extern bool detect_objects_normal(void);
+
+#####GFile
+ spells2.c
+
+#####GComment
+/*
+ * Detect all "normal" objects on the current panel
+ */
+
+#####GDescription
+Detect all objects without the TV_GOLD flag.
+
+----------------------------------------------------------------------
+
+#####R=== detect_objects_magic ===
+
+#####GDeclaration
+ extern bool detect_objects_magic(void);
+
+#####GFile
+ spells2.c
+
+#####GComment
+/*
+ * Detect all "magic" objects on the current panel.
+ *
+ * This will light up all spaces with "magic" items, including artifacts,
+ * ego-items, potions, scrolls, books, rods, wands, staves, amulets, rings,
+ * and "enchanted" items of the "good" variety.
+ *
+ * It can probably be argued that this function is now too powerful.
+ */
+
+#####GDescription
+Detect all "magic" objects which are artefacts, ego items, or have one
+of the following flags - TV_AMULET, TV_RING, TV_BATERIE, TV_STAFF,
+TV_WAND, TV_ROD, TV_ROD_MAIN, TV_SCROLL, TV_POTION, TV_POTION2,
+TV_VALARIN_BOOK, TV_MAGERY_BOOK, TV_SHADOW_BOOK, TV_CHAOS_BOOK,
+TV_SPIRIT_BOOK, TV_NETHER_BOOK, TV_DAEMON_BOOK, TV_CRUSADE_BOOK,
+TV_SIGALDRY_BOOK, TV_SYMBIOTIC_BOOK, TV_MUSIC_BOOK.
+
+----------------------------------------------------------------------
+
+#####R=== detect_monsters_normal ===
+
+#####GDeclaration
+ extern bool detect_monsters_normal(void);
+
+#####GFile
+ spells2.c
+
+#####GComment
+/*
+ * Detect all "normal" monsters on the current panel
+ */
+
+#####GDescription
+Detect all non-invisible monsters (without RF2_INVISIBLE).
+
+----------------------------------------------------------------------
+
+#####R=== detect_monsters_invis ===
+
+#####GDeclaration
+ extern bool detect_monsters_invis(void);
+
+#####GFile
+ spells2.c
+
+#####GComment
+/*
+ * Detect all "invisible" monsters on current panel
+ */
+
+#####GDescription
+Detect all invisible monsters (with RF2_INVISIBLE).
+
+----------------------------------------------------------------------
+
+#####R=== detect_monsters_evil ===
+
+#####GDeclaration
+ extern bool detect_monsters_evil(void);
+
+#####GFile
+ spells2.c
+
+#####GComment
+/*
+ * Detect all "evil" monsters on current panel
+ */
+
+#####GDescription
+Detect all evil monsters (with RF3_EVIL).
+
+----------------------------------------------------------------------
+
+#####R=== detect_monsters_good ===
+
+#####GDeclaration
+ extern bool detect_monsters_good(void);
+
+#####GFile
+ spells2.c
+
+#####GComment
+/* Detect good monsters */
+
+#####GDescription
+Detect all good monsters (with RF3_GOOD).
+
+----------------------------------------------------------------------
+
+#####R=== detect_monsters_xxx ===
+
+#####GDeclaration
+ extern bool detect_monsters_xxx(u32b match_flag);
+
+#####GFile
+ spells2.c
+
+#####GComment
+/*
+ * A "generic" detect monsters routine, tagged to flags3
+ */
+
+#####GDescription
+Detect all monsters with "match_flag" flag.
+
+#####GParameters
+> "match_flag" can be any RF3_ flag (see defines.h) but only
+ RF3_DEMON, RF3_UNDEAD, RF3_GOOD work.
+
+----------------------------------------------------------------------
+
+#####R=== detect_monsters_string ===
+
+#####GDeclaration
+ extern bool detect_monsters_string(cptr);
+
+#####GFile
+ spells2.c
+
+#####GComment
+/*
+ * Detect all (string) monsters on current panel
+ */
+
+#####GDescription
+Detect all monsters whose default monster character matches a
+character pointed to by "cptr".
+
+#####GParameters
+> "cptr" is a pointer to a single character, eg 'Z' for hounds. For
+ available characters, see the "symbol" field of the graphics (G)
+ line of r_info.txt.
+
+----------------------------------------------------------------------
+
+#####R=== detect_monsters_nonliving ===
+
+#####GDeclaration
+ extern bool detect_monsters_nonliving(void);
+
+#####GFile
+ spells2.c
+
+#####GComment
+/*
+ * Detect all "nonliving", "undead" or "demonic" monsters on current panel
+ */
+
+#####GDescription
+Detect all non-living monsters (with RF3_NONLIVING, RF3_UNDEAD, or
+RF3_DEMON).
+
+----------------------------------------------------------------------
+
+#####R=== detect_all ===
+
+#####GDeclaration
+ extern bool detect_all(void);
+
+#####GFile
+ spells2.c
+
+#####GComment
+/*
+ * Detect everything
+ */
+
+#####GDescription
+Detects traps, doors, stairs, treasure, gold objects, normal objects,
+invisible monsters, normal (visible) monsters.
+
+----------------------------------------------------------------------
+
+#####R=== stair_creation ===
+
+#####GDeclaration
+ extern void stair_creation(void);
+
+#####GFile
+ spells2.c
+
+#####GComment
+/*
+ * Create stairs at the player location
+ */
+
+#####GDescription
+Create stairs at the player location. This is not allowed if the grid
+is not empty, the player is not in a dungeon, the player is on a
+special level, the player is in an arena or quest. If the player is
+in the town or wilderness the stairs will go down. If the player is
+on a quest level or at the bottom of a dungeon, the stairs will go up.
+Otherwise there is an even chance the stairs will go up or down.
+
+----------------------------------------------------------------------
+
+#####R=== wall_stone ===
+
+#####GDeclaration
+ extern bool wall_stone(void);
+
+#####GFile
+ spells2.c
+
+#####GComment
+(none)
+
+#####GDescription
+Create a stone wall on the player's grid. This function uses the
+project() function to create the stone wall. Apparently zero can be
+used as the "who" parameter for the player. See details for the
+project() function elsewhere in this document.
+
+----------------------------------------------------------------------
+
+#####R=== create_artifact ===
+
+#####GDeclaration
+ extern bool create_artifact(object_type *o_ptr,
+ bool a_scroll, bool get_name);
+
+#####GFile
+ randart.c
+
+#####GComment
+(none)
+
+#####GDescription
+Create an artifact from object "*optr".
+
+#####GParameters
+> "*optr* is a pointer to an object
+> "a_scroll" is true if the artifact is created by reading a scroll
+> "get_name" is true if the artifact is to be named by the player (if
+ a_scroll is true) or created randomly (a_scroll is false), or false
+ if an inscription is used.
+
+----------------------------------------------------------------------
+
+#####R=== ident_spell ===
+
+#####GDeclaration
+ extern bool ident_spell(void);
+
+#####GFile
+ spells2.c
+
+#####GComment
+/*
+ * Identify an object in the inventory (or on the floor)
+ * This routine does *not* automatically combine objects.
+ * Returns TRUE if something was identified, else FALSE.
+ */
+
+#####GDescription
+Identify an object in the inventory (or on the floor).
+
+----------------------------------------------------------------------
+
+#####R=== identify_fully ===
+
+#####GDeclaration
+ extern bool identify_fully(void);
+
+#####GFile
+ spells2.c
+
+#####GComment
+/*
+ * Fully "identify" an object in the inventory -BEN-
+ * This routine returns TRUE if an item was identified.
+ */
+
+#####GDescription
+Fully "identify" an object in the inventory (or on the floor).
+
+----------------------------------------------------------------------
+
+#####R=== recharge ===
+
+#####GDeclaration
+ extern bool recharge(int num);
+
+#####GFile
+ spells2.c
+
+#####GComment
+/*
+ * Recharge a wand/staff/rod from the pack or on the floor.
+ * This function has been rewritten in Oangband. -LM-
+ *
+ * Mage -- Recharge I --> recharge(90)
+ * Mage -- Recharge II --> recharge(150)
+ * Mage -- Recharge III --> recharge(220)
+ *
+ * Priest or Necromancer -- Recharge --> recharge(140)
+ *
+ * Scroll of recharging --> recharge(130)
+ * Scroll of *recharging* --> recharge(200)
+ *
+ * It is harder to recharge high level, and highly charged wands,
+ * staffs, and rods. The more wands in a stack, the more easily and
+ * strongly they recharge. Staffs, however, each get fewer charges if
+ * stacked.
+ *
+ * XXX XXX XXX Beware of "sliding index errors".
+ */
+
+#####GDescription
+Recharge an object in the inventory (or on the floor) with "num"
+power.
+
+#####GParameters
+> "num" is the power used in recharging. It is compared to the
+ object's level to determine whether the item is recharged
+ successfully or destroyed. If it is recharged, it also determines
+ how many charges are added, or how much recharge time is reduced.
+
+----------------------------------------------------------------------
+
+#####R=== aggravate_monsters ===
+
+#####GDeclaration
+ extern void aggravate_monsters(int who);
+
+#####GFile
+ spells2.c
+
+#####GComment
+/*
+ * Wake up all monsters, and speed up "los" monsters.
+ */
+
+#####GDescription
+Aggravate monsters, originating from "who".
+
+#####GParameters
+> "who" is the index of monster in m_list[] (1 if it is the player)
+ which triggers the aggravation;
+
+----------------------------------------------------------------------
+
+#####R=== genocide ===
+
+#####GDeclaration
+ extern bool genocide(bool player_cast);
+
+#####GFile
+ spells2.c
+
+#####GComment
+(none)
+
+#####GDescription
+Genocide a monster race.
+
+#####GParameters
+> "player_cast" is true if the player cast the spell so the player can
+ take damage.
+
+----------------------------------------------------------------------
+
+#####R=== mass_genocide ===
+
+#####GDeclaration
+ extern bool mass_genocide(bool player_cast);
+
+#####GFile
+ spells2.c
+
+#####GComment
+/*
+ * Delete all nearby (non-unique) monsters
+ */
+
+#####GDescription
+Delete all nearby (non-unique) monsters.
+
+#####GParameters
+> "player_cast" is true if the player cast the spell so the player can
+ take damage.
+
+----------------------------------------------------------------------
+
+#####R=== probing ===
+
+#####GDeclaration
+ extern bool probing(void);
+
+#####GFile
+ spells2.c
+
+#####GComment
+/*
+ * Probe nearby monsters
+ */
+
+#####GDescription
+Probe all nearby monsters.
+
+----------------------------------------------------------------------
+
+#####R=== banish_evil ===
+
+#####GDeclaration
+ extern bool banish_evil(int dist);
+
+#####GFile
+ spells2.c
+
+#####GComment
+/*
+ * Banish evil monsters
+ */
+
+#####GDescription
+Banish nearby evil monsters doing "dist" points of GF_AWAY_EVIL
+damage.
+
+#####GParameters
+> "dist" is the amount of damage done to each monster.
+
+----------------------------------------------------------------------
+
+#####R=== dispel_evil ===
+
+#####GDeclaration
+ extern bool dispel_evil(int dam);
+
+#####GFile
+ spells2.c
+
+#####GComment
+/*
+ * Dispel evil monsters
+ */
+
+#####GDescription
+Dispel nearby evil monsters doing "dam" points of GF_DISP_EVIL
+damage.
+
+#####GParameters
+> "dam" is the number of points of damage.
+
+----------------------------------------------------------------------
+
+#####R=== dispel_good ===
+
+#####GDeclaration
+ extern bool dispel_good(int dam);
+
+#####GFile
+ spells2.c
+
+#####GComment
+/*
+ * Dispel good monsters
+ */
+
+#####GDescription
+Dispel nearby good monsters doing "dam" points of GF_DISP_GOOD
+damage.
+
+#####GParameters
+> "dam" is the number of points of damage.
+
+----------------------------------------------------------------------
+
+#####R=== dispel_undead ===
+
+#####GDeclaration
+ extern bool dispel_undead(int dam);
+
+#####GFile
+ spells2.c
+
+#####GComment
+/*
+ * Dispel undead monsters
+ */
+
+#####GDescription
+Dispel nearby undead monsters doing "dam" points of GF_DISP_UNDEAD
+damage.
+
+#####GParameters
+> "dam" is the number of points of damage.
+
+----------------------------------------------------------------------
+
+#####R=== dispel_monsters ===
+
+#####GDeclaration
+ extern bool dispel_monsters(int dam);
+
+#####GFile
+ spells2.c
+
+#####GComment
+/*
+ * Dispel all monsters
+ */
+
+#####GDescription
+Dispel all nearby monsters doing "dam" points of GF_DISP_ALL
+damage.
+
+#####GParameters
+> "dam" is the number of points of damage.
+
+----------------------------------------------------------------------
+
+#####R=== dispel_living ===
+
+#####GDeclaration
+ extern bool dispel_living(int dam);
+
+#####GFile
+ spells2.c
+
+#####GComment
+/*
+ * Dispel 'living' monsters
+ */
+
+#####GDescription
+Dispel nearby living monsters doing "dam" points of GF_DISP_LIVING
+damage.
+
+#####GParameters
+> "dam" is the number of points of damage.
+
+----------------------------------------------------------------------
+
+#####R=== dispel_demons ===
+
+#####GDeclaration
+ extern bool dispel_demons(int dam);
+
+#####GFile
+ spells2.c
+
+#####GComment
+/*
+ * Dispel demons
+ */
+
+#####GDescription
+Dispel nearby demon monsters doing "dam" points of GF_DISP_DEMON
+damage.
+
+#####GParameters
+> "dam" is the number of points of damage.
+
+----------------------------------------------------------------------
+
+#####R=== turn_undead ===
+
+#####GDeclaration
+ extern bool turn_undead(void);
+
+#####GFile
+ spells2.c
+
+#####GComment
+/*
+ * Turn undead
+ */
+
+#####GDescription
+Turn nearby undead monsters doing a point of GF_TURN_UNDEAD damage for
+each player level.
+
+----------------------------------------------------------------------
+
+#####R=== wipe ===
+
+#####GDeclaration
+ extern void wipe(int y1, int x1, int r);
+
+#####GFile
+ spells2.c
+
+#####GComment
+/*
+ * Wipe -- Empties a part of the dungeon
+ */
+
+#####GDescription
+Delete monsters and objects from an area of the dungeon centred at
+grid "y1,x1" for a radius "r". This does not work on special levels or
+quests. The player may be blinded. The player forgets the affected
+area and it becomes dark. All grids become floor.
+
+#####GParameters
+> "y1" is the y-coordinate of the wipe's origin.
+> "x1" is the x-coordinate of the wipe's origin.
+> "r" is the radius of the wipe.
+
+----------------------------------------------------------------------
+
+#####R=== destroy_area ===
+
+#####GDeclaration
+ extern void destroy_area(int y1, int x1, int r,
+ bool full);
+
+#####GFile
+ spells2.c
+
+#####GComment
+/*
+ * The spell of destruction
+ *
+ * This spell "deletes" monsters (instead of "killing" them).
+ *
+ * Later we may use one function for both "destruction" and
+ * "earthquake" by using the "full" to select "destruction".
+ */
+
+#####GDescription
+Delete monsters and objects from an area of the dungeon centred at
+grid "y1,x1" for a radius "r". This does not work on special levels or
+quests. The epicentre is NOT affected. The player may be blinded. The
+player forgets the affected area and it becomes dark. The grids can
+become granite, quartz, magma, or floor.
+
+#####GParameters
+> "y1" is the y-coordinate of the destruction's origin.
+> "x1" is the x-coordinate of the destruction's origin.
+> "r" is the radius of the destruction.
+> "full" is currently unused.
+
+----------------------------------------------------------------------
+
+#####R=== earthquake ===
+
+#####GDeclaration
+ extern void earthquake(int cy, int cx, int r);
+
+#####GFile
+ spells2.c
+
+#####GComment
+/*
+ * Induce an "earthquake" of the given radius at the given location.
+ *
+ * This will turn some walls into floors and some floors into walls.
+ *
+ * The player will take damage and "jump" into a safe grid if possible,
+ * otherwise, he will "tunnel" through the rubble instantaneously.
+ *
+ * Monsters will take damage, and "jump" into a safe grid if possible,
+ * otherwise they will be "buried" in the rubble, disappearing from
+ * the level in the same way that they do when genocided.
+ *
+ * Note that thus the player and monsters (except eaters of walls and
+ * passers through walls) will never occupy the same grid as a wall.
+ * Note that as of now (2.7.8) no monster may occupy a "wall" grid, even
+ * for a single turn, unless that monster can pass_walls or kill_walls.
+ * This has allowed massive simplification of the "monster" code.
+ */
+
+#####GDescription
+Create an earthquake centred on grid "cy,cx" with a radius of "r".
+This does not work on quest levels. The epicentre is NOT affected.
+Only about 15% of the grids are affected. The player takes 300 points
+of damage if they can't be moved to a safe grid, otherwise damage is
+from 10 to 40 points. The player forgets the affected area and it
+becomes dark. The grids can become granite, quartz, magma, or floor.
+
+#####GParameters
+Parameters:
+> "cy" is the y-coordinate of the earthquake origin.
+> "cx" is the x-coordinate of the earthquake origin.
+> "r" is the radius of the earthquake.
+
+----------------------------------------------------------------------
+
+#####R=== map_area ===
+
+#####GDeclaration
+ extern void map_area(void);
+
+#####GFile
+ cave.c
+
+#####GComment
+/*
+ * Hack -- map the current panel (plus some) ala "magic mapping"
+ */
+
+#####GDescription
+Map the current panel plus up to 10 grids up and down, and up to 20
+grids left and right.
+
+----------------------------------------------------------------------
+
+#####R=== wiz_lite ===
+
+#####GDeclaration
+ extern void wiz_lite(void);
+
+#####GFile
+ cave.c
+
+#####GComment
+/*
+ * Light up the dungeon using "clairvoyance"
+ *
+ * This function "illuminates" every grid in the dungeon, memorises all
+ * "objects", memorises all grids as with magic mapping, and, under the
+ * standard option settings (view_perma_grids but not view_torch_grids)
+ * memorises all floor grids too.
+ *
+ * Note that if "view_perma_grids" is not set, we do not memorise floor
+ * grids, since this would defeat the purpose of "view_perma_grids", not
+ * that anyone seems to play without this option.
+ *
+ * Note that if "view_torch_grids" is set, we do not memorise floor grids,
+ * since this would prevent the use of "view_torch_grids" as a method to
+ * keep track of what grids have been observed directly.
+ */
+
+#####GDescription
+Light up the entire dungeon and show all monsters and objects.
+
+----------------------------------------------------------------------
+
+#####R=== wiz_lite_extra ===
+
+#####GDeclaration
+ extern void wiz_lite_extra(void);
+
+#####GFile
+ cave.c
+
+#####GComment
+(none)
+
+#####GDescription
+Light up the entire dungeon and show all monsters and objects. All
+squares are lit and remembered.
+
+----------------------------------------------------------------------
+
+#####R=== wiz_dark ===
+
+#####GDeclaration
+ extern void wiz_dark(void);
+
+#####GFile
+ cave.c
+
+#####GComment
+/*
+ * Forget the dungeon map (ala "Thinking of Maud...").
+ */
+
+#####GDescription
+Forget all grids and objects. All grids become dark.
+
+----------------------------------------------------------------------
+
+#####R=== lite_room ===
+
+#####GDeclaration
+ extern void lite_room(int y1, int x1);
+
+#####GFile
+ spells2.c
+
+#####GComment
+/*
+ * Illuminate any room containing the given location.
+ */
+
+#####GDescription
+Light up the room (if any) of grid "y1,x1".
+
+#####GParameters
+> "y1" is the y-coordinate of the grid.
+> "x1" is the x-coordinate of the grid.
+
+----------------------------------------------------------------------
+
+#####R=== unlite_room ===
+
+#####GDeclaration
+ extern void unlite_room(int y1, int x1);
+
+#####GFile
+ spells2.c
+
+#####GComment
+/*
+ * Darken all rooms containing the given location
+ */
+
+#####GDescription
+Darken all rooms (if any) of grid "y1,x1".
+
+#####GParameters
+> "y1" is the y-coordinate of the grid.
+> "x1" is the x-coordinate of the grid.
+
+----------------------------------------------------------------------
+
+#####R=== lite_area ===
+
+#####GDeclaration
+ extern bool lite_area(int dam, int rad);
+
+#####GFile
+ spells2.c
+
+#####GComment
+/*
+ * Hack -- call light around the player
+ * Affect all monsters in the projection radius
+ */
+
+#####GDescription
+Light up the room (if any) of the player's grid. Monsters take "dam"
+points of GF_LITE_WEAK damage if they are within "r" grids of the
+player.
+
+#####GParameters
+> "dam" is the number of points of damage.
+> "rad" is the radius of the effect of the damage.
+
+----------------------------------------------------------------------
+
+#####R=== unlite_area ===
+
+#####GDeclaration
+ extern bool unlite_area(int dam, int rad);
+
+#####GFile
+ spells2.c
+
+#####GComment
+/*
+ * Hack -- call darkness around the player
+ * Affect all monsters in the projection radius
+ */
+
+#####GDescription
+Darken the room (if any) of the player's grid. Monsters take "dam"
+points of GF_DARK_WEAK damage if they are within "r" grids of the
+player.
+
+#####GParameters
+> "dam" is the number of points of damage.
+> "rad" is the radius of the effect of the damage.
+
+----------------------------------------------------------------------
+
+#####R=== fire_ball_beam ===
+
+#####GDeclaration
+ extern bool fire_ball_beam(int typ, int dir, int dam,
+ int rad);
+
+#####GFile
+ spells2.c
+
+#####GComment
+/*
+ * Cast a ball-beamed spell
+ * Stop if we hit a monster, act as a "ball"
+ * Allow "target" mode to pass over monsters
+ * Affect grids, objects, and monsters
+ */
+
+#####GDescription
+Cast a ball-beamed spell of type "typ" in direction "dir" for damage
+"dam" points with a radius of "rad" grids.
+
+#####GParameters
+> "typ" is the type of damage
+ *****fields.txt*0[GF_fields]
+> "dir" must be from 0 to 9.
+ *****fields.txt*0[direction]
+> "dam" is the number of points of damage.
+> "rad" is the radius of the effect of the damage (must be <= 16).
+
+----------------------------------------------------------------------
+
+#####R=== fire_ball ===
+
+#####GDeclaration
+ extern bool fire_ball(int typ, int dir, int dam, int rad);
+
+#####GFile
+ spells2.c
+
+#####GComment
+/*
+ * Cast a ball spell
+ * Stop if we hit a monster, act as a "ball"
+ * Allow "target" mode to pass over monsters
+ * Affect grids, objects, and monsters
+ */
+
+#####GDescription
+Cast a ball spell of type "typ" in direction "dir" for "dam" points of
+damage. The ball has a radius of "rad" grids.
+
+#####GParameters
+> "typ" is the type of damage
+ *****fields.txt*0[GF_fields]
+> "dir" must be from 0 to 9.
+ *****fields.txt*0[direction]
+> "dam" is the number of points of damage.
+> "rad" is the radius of the effect of the damage (must be <= 16).
+
+----------------------------------------------------------------------
+
+#####R=== fire_bolt ===
+
+#####GDeclaration
+ extern bool fire_bolt(int typ, int dir, int dam);
+
+#####GFile
+ spells2.c
+
+#####GComment
+/*
+ * Cast a bolt spell
+ * Stop if we hit a monster, as a "bolt"
+ * Affect monsters (not grids or objects)
+ */
+
+#####GDescription
+Cast a bolt spell of type "typ" in direction "dir" for "dam" points of
+damage.
+
+#####GParameters
+> "typ" is the type of damage
+ *****fields.txt*0[GF_fields]
+> "dir" must be from 0 to 9
+ *****fields.txt*0[direction]
+> "dam" is the number of points of damage.
+
+----------------------------------------------------------------------
+
+#####R=== fire_beam ===
+
+#####GDeclaration
+ extern bool fire_beam(int typ, int dir, int dam);
+
+#####GFile
+ spells2.c
+
+#####GComment
+/*
+ * Cast a beam spell
+ * Pass through monsters, as a "beam"
+ * Affect monsters (not grids or objects)
+ */
+
+#####GDescription
+Cast a beam spell of type "typ" in direction "dir" for "dam" points of
+damage.
+
+#####GParameters
+> "typ" is the type of damage
+ *****fields.txt*0[GF_fields]
+> "dir" must be from 0 to 9.
+ *****fields.txt*0[direction]
+> "dam" is the number of points of damage.
+
+----------------------------------------------------------------------
+
+#####R=== fire_druid_ball ===
+
+#####GDeclaration
+ extern bool fire_druid_ball(int typ, int dir, int dam,
+ int rad);
+
+#####GFile
+ spells2.c
+
+#####GComment
+/*
+ * Cast a druidic ball spell
+ * Stop if we hit a monster, act as a "ball"
+ * Allow "target" mode to pass over monsters
+ * Affect grids, objects, and monsters
+ */
+
+#####GDescription
+Cast a ball spell of type "typ" in direction "dir" for "dam" points of
+damage. The ball has a radius of "rad" grids. The spell follows a mana
+path.
+
+#####GParameters
+> "typ" is the type of damage
+ *****fields.txt*0[GF_fields]
+> "dir" must be from 0 to 9.
+ *****fields.txt*0[direction]
+> "dam" is the number of points of damage.
+> "rad" is the radius of the effect of the damage (must be <= 16).
+
+----------------------------------------------------------------------
+
+#####R=== fire_druid_bolt ===
+
+#####GDeclaration
+ extern bool fire_druid_bolt(int typ, int dir, int dam);
+
+#####GFile
+ spells2.c
+
+#####GComment
+/*
+ * Cast a druidic bolt spell
+ * Stop if we hit a monster, as a "bolt"
+ * Affect monsters (not grids or objects)
+ */
+
+#####GDescription
+Cast a bolt spell of type "typ" in direction "dir" for "dam" points of
+damage. The spell follows a mana path.
+
+#####GParameters
+> "typ" is the type of damage
+ *****fields.txt*0[GF_fields]
+> "dir" must be from 0 to 9.
+ *****fields.txt*0[direction]
+> "dam" is the number of points of damage.
+
+----------------------------------------------------------------------
+
+#####R=== fire_druid_beam ===
+
+#####GDeclaration
+ extern bool fire_druid_beam(int typ, int dir, int dam);
+
+#####GFile
+ spells2.c
+
+#####GComment
+/*
+ * Cast a druidistic beam spell
+ * Pass through monsters, as a "beam"
+ * Affect monsters (not grids or objects)
+ */
+
+#####GDescription
+Cast a beam spell of type "typ" in direction "dir" for "dam" points of
+damage. The spell follows a mana path.
+
+#####GParameters
+> "typ" is the type of damage
+ *****fields.txt*0[GF_fields]
+> "dir" must be from 0 to 9.
+ *****fields.txt*0[direction]
+> "dam" is the number of points of damage.
+
+----------------------------------------------------------------------
+
+#####R=== fire_bolt_or_beam ===
+
+#####GDeclaration
+ extern bool fire_bolt_or_beam(int prob, int typ, int dir,
+ int dam);
+
+#####GFile
+ spells2.c
+
+#####GComment
+/*
+ * Cast a bolt spell, or rarely, a beam spell
+ */
+
+#####GDescription
+Cast a beam (chance of "prob" in 100) or bolt spell of type "typ" in
+direction "dir" for "dam" points of damage.
+
+#####GParameters
+> "prob" is the number of times out of 100 that the bolt will actually
+ be a beam. Obviously this value should range from 1 to 99 (0 will
+ always give a beam, 100 or higher will always give a beam. There are
+ separate functions for these cases).
+> "typ" is the type of damage
+ *****fields.txt*0[GF_fields]
+> "dir" must be from 0 to 9.
+ *****fields.txt*0[direction]
+> "dam" is the number of points of damage.
+
+----------------------------------------------------------------------
+
+#####R=== alchemy ===
+
+#####GDeclaration
+ extern bool alchemy(void);
+
+#####GFile
+ spells2.c
+
+#####GComment
+/* Turns an object into gold, gain some of its value in a shop */
+
+#####GDescription
+The player selects an object (and quantity if it applies) from the
+inventory or the floor and attempts to turn it into gold. If the
+price of the item is < 0 then the player gains nothing (fool's gold),
+otherwise the player gets a third of the price in gold. Artifacts are
+not affected.
+
+----------------------------------------------------------------------
+
+#####R=== alter_reality ===
+
+#####GDeclaration
+ extern void alter_reality(void);
+
+#####GFile
+ spells2.c
+
+#####GComment
+(none)
+
+#####GDescription
+The player leaves the level immediately.
+
+----------------------------------------------------------------------
+
+#####R=== teleport_swap ===
+
+#####GDeclaration
+ extern void teleport_swap(int dir);
+
+#####GFile
+ spells2.c
+
+#####GComment
+(none)
+
+#####GDescription
+Player swaps places with target in direction "dir". The target must be
+a monster. It will not work if the space-time continuum can not be
+disrupted or if the monster resists teleportation.
+
+----------------------------------------------------------------------
+
+#####R=== project_meteor ===
+
+#####GDeclaration
+ extern void project_meteor(int radius, int typ, int dam,
+ u32b flg);
+
+#####GFile
+ spells2.c
+
+#####GComment
+/*
+ * Apply a "project()" a la meteor shower
+ */
+
+#####GDescription
+Generate between "rad" and "rad" x 2 ball spells of type "typ" for
+"dam" points of damage. The ball can have various properties as
+denoted by "flg".
+
+#####GParameters
+> "rad" is the minimum number of balls created. "rad" + randint("rad")
+ balls are created. Each ball has a radius of 2 grids. Each target
+ grid is within 5 grids of the player.
+> "typ" is the type of damage
+ *****fields.txt*0[GF_fields]
+> "dam" is the number of points of damage.
+> "flg" is the projection effect
+ *****fields.txt*0[PROJECT_fields]
+
+----------------------------------------------------------------------
+
+#####R=== passwall ===
+
+#####GDeclaration
+ extern bool passwall(int dir, bool safe);
+
+#####GFile
+ spells2.c
+
+#####GComment
+/*
+ * Send the player shooting through walls in the given direction until
+ * they reach a non-wall space, or a monster, or a permanent wall.
+ */
+
+#####GDescription
+Move the player through walls in direction "dir". if "safe" then the
+player can not end up in a wall - if they do, the wall is replaced by
+a floor. This does not work in the wilderness, on quest levels, or if
+teleport is not allowed. Stopping on monsters or inside vaults is not
+allowed.
+
+#####GParameters
+> "dir" must be from 0 to 9. It can not be 5.
+ *****fields.txt*0[direction]
+> "safe" must be true if the player is not to be trapped in a wall
+ when the movement is finished.
+
+----------------------------------------------------------------------
+
+#####R=== project_hook ===
+
+#####GDeclaration
+ extern bool project_hook(int typ, int dir, int dam,
+ int flg);
+
+#####GFile
+ spells2.c
+
+#####GComment
+/*
+ * Hack -- apply a "projection()" in a direction (or at the target)
+ */
+
+#####GDescription
+Generate a beam/bolt of type "typ" in direction "dir" (or at a target)
+for "dam" points of damage. The beam/bolt can have various properties
+as denoted by "flg".
+
+#####GParameters
+> "typ" is the type of damage
+ *****fields.txt*0[GF_fields]
+> "dir" must be from 0 to 9. 5 means use the current target.
+ *****fields.txt*0[direction]
+> "dam" is the number of points of damage.
+> "flg" is the projection effect
+ *****fields.txt*0[PROJECT_fields]
+
+----------------------------------------------------------------------
+
+#####R=== reset_recall ===
+
+#####GDeclaration
+ extern bool reset_recall(void);
+
+#####GFile
+ spells2.c
+
+#####GComment
+(none)
+
+#####GDescription
+Ask the player for a dungeon and appropriate level within the dungeon.
+The player can not specify a dungeon they have not gone to yet. If the
+player chooses levels 99 or 100, the level is set to 98.
+
+----------------------------------------------------------------------
+
+#####R=== get_aim_dir ===
+
+#####GDeclaration
+ extern bool get_aim_dir(int *dp = 0);
+
+#####GFile
+ xtra2.c
+
+#####GComment
+/*
+ * Get an "aiming direction" from the user.
+ *
+ * The "dir" is loaded with 1,2,3,4,6,7,8,9 for "actual direction", and
+ * "0" for "current target", and "-1" for "entry aborted".
+ *
+ * Note that "Force Target", if set, will pre-empt user interaction,
+ * if there is a usable target already set.
+ *
+ * Note that confusion over-rides any (explicit?) user choice.
+ */
+
+#####GDescription
+Get an aiming direction from the user and store it in "dp". A target
+can be selected. If the player is confused, the direction will be
+random.
+
+#####GParameters
+> "dp" = player direction.
+
+----------------------------------------------------------------------
+
+#####R=== project_hack ===
+
+#####GDeclaration
+ extern bool project_hack(int typ, int dam);
+
+#####GFile
+ spells2.c
+
+#####GComment
+/*
+ * Apply a "project()" directly to all viewable monsters
+ *
+ * Note that affected monsters are NOT auto-tracked by this usage.
+ */
+
+#####GDescription
+Generate beam/bolt spells of type "typ" for "dam" points of damage to
+all viewable monsters in line of site.
+
+#####GParameters
+> "typ" is the type of damage
+ *****fields.txt*0[GF_fields]
+> "dam" is the number of points of damage.
+
+----------------------------------------------------------------------
+
+
+Back to the *****lua.hlp*0[lua help index] .
+
+ [[[[[gThis file by Chris Hadgis]
diff --git a/lib/mods/theme/help/lua_util.txt b/lib/mods/theme/help/lua_util.txt
new file mode 100644
index 00000000..8886a2b4
--- /dev/null
+++ b/lib/mods/theme/help/lua_util.txt
@@ -0,0 +1,898 @@
+|||||oy
+
+#####R /----------------------------------------\
+#####R < util.pkg functions helper file >
+#####R \----------------------------------------/
+
+----------------------------------------------------------------------
+
+#####R=== bst ===
+
+#####GDeclaration
+ s32b bst(s32b what, s32b t);
+
+#####GFile
+ util.c
+
+#####GComment
+/*
+ * Break scalar time
+ */
+
+#####GDescription
+Return the minute, hour, day, or year for turn "t". One turn takes 7.5
+seconds.
+
+#####GParameters
+> "what" is the unit to be returned and must be one of
+ MINUTE (number of turns per minute, which is 8)
+ HOUR (number of turns per hour, which is 480)
+ DAY (number of turns per day, which is 11,520)
+ YEAR (number of turns per year, which is 4,204,800)
+> "t" is the number of turns.
+
+----------------------------------------------------------------------
+
+#####R=== path_build ===
+
+#####GDeclaration
+ errr path_build(char *buf, int max, cptr path, cptr file);
+
+#####GFile
+ util.c
+
+#####GComment
+/*
+* Create a new path by appending a file (or directory) to a path
+*
+* This requires no special processing on simple machines, except
+* for verifying the size of the filename, but note the ability to
+* bypass the given "path" with certain special file-names.
+*
+* Note that the "file" may actually be a "sub-path", including
+* a path and a file.
+*
+* Note that this function yields a path which must be "parsed"
+* using the "parse" function above.
+*/
+
+#####GDescription
+Append file "file" to path "path" and return the result in "buf". The
+length of "buf" is a maximum of "max" characters. If "file" starts
+with '~' then return "file". If "file" starts with the path separator
+and the path separator is not blank then return "file". If there is no
+path then return "file". Otherwise return "path" + path separator +
+"file". The path separator is defined in "H-config.h".
+
+#####GParameters
+> "buf" contains the new path.
+> "max" is the maximum number of characters allowed in "buf".
+> "path" is the original path.
+> "file" is the original file.
+
+----------------------------------------------------------------------
+
+#####R=== move_cursor ===
+
+#####GDeclaration
+ void move_cursor(int row, int col);
+
+#####GFile
+ util.c
+
+#####GComment
+/*
+* Move the cursor
+*/
+
+#####GDescription
+Move the cursor to row "row" and column "col".
+
+#####GParameters
+> "row" is the row the cursor is to be moved to.
+> "col" is the column the cursor is to be moved to.
+
+----------------------------------------------------------------------
+
+#####R=== inkey ===
+
+#####GDeclaration
+ char inkey(void);
+
+#####GFile
+ util.c
+
+#####GComment
+/*
+* Get a keypress from the user.
+*
+* This function recognises a few "global parameters". These are variables
+* which, if set to TRUE before calling this function, will have an effect
+* on this function, and which are always reset to FALSE by this function
+* before this function returns. Thus they function just like normal
+* parameters, except that most calls to this function can ignore them.
+*
+* If "inkey_xtra" is TRUE, then all pending keypresses will be flushed,
+* and any macro processing in progress will be aborted. This flag is
+* set by the "flush()" function, which does not actually flush anything
+* itself, but rather, triggers delayed input flushing via "inkey_xtra".
+*
+* If "inkey_scan" is TRUE, then we will immediately return "zero" if no
+* keypress is available, instead of waiting for a keypress.
+*
+* If "inkey_base" is TRUE, then all macro processing will be bypassed.
+* If "inkey_base" and "inkey_scan" are both TRUE, then this function will
+* not return immediately, but will wait for a keypress for as long as the
+* normal macro matching code would, allowing the direct entry of macro
+* triggers. The "inkey_base" flag is extremely dangerous!
+*
+* If "inkey_flag" is TRUE, then we will assume that we are waiting for a
+* normal command, and we will only show the cursor if "hilite_player" is
+* TRUE (or if the player is in a store), instead of always showing the
+* cursor. The various "main-xxx.c" files should avoid saving the game
+* in response to a "menu item" request unless "inkey_flag" is TRUE, to
+* prevent savefile corruption.
+*
+* If we are waiting for a keypress, and no keypress is ready, then we will
+* refresh (once) the window which was active when this function was called.
+*
+* Note that "back-quote" is automatically converted into "escape" for
+* convenience on machines with no "escape" key. This is done after the
+* macro matching, so the user can still make a macro for "backquote".
+*
+* Note the special handling of "ascii 30" (ctrl-caret, aka ctrl-shift-six)
+* and "ascii 31" (ctrl-underscore, aka ctrl-shift-minus), which are used to
+* provide support for simple keyboard "macros". These keys are so strange
+* that their loss as normal keys will probably be noticed by nobody. The
+* "ascii 30" key is used to indicate the "end" of a macro action, which
+* allows recursive macros to be avoided. The "ascii 31" key is used by
+* some of the "main-xxx.c" files to introduce macro trigger sequences.
+*
+* Hack -- we use "ascii 29" (ctrl-right-bracket) as a special "magic" key,
+* which can be used to give a variety of "sub-commands" which can be used
+* any time. These sub-commands could include commands to take a picture of
+* the current screen, to start/stop recording a macro action, etc.
+*
+* If "angband_term[0]" is not active, we will make it active during this
+* function, so that the various "main-xxx.c" files can assume that input
+* is only requested (via "Term_inkey()") when "angband_term[0]" is active.
+*
+* Mega-Hack -- This function is used as the entry point for clearing the
+* "signal_count" variable, and of the "character_saved" variable.
+*
+* Hack -- Note the use of "inkey_next" to allow "keymaps" to be processed.
+*
+* Mega-Hack -- Note the use of "inkey_hack" to allow the "Borg" to steal
+* control of the keyboard from the user.
+*/
+
+#####GDescription
+Get a keypress from the user.
+
+----------------------------------------------------------------------
+
+#####R=== cmsg_print ===
+
+#####GDeclaration
+ void cmsg_print(byte color, cptr msg);
+
+#####GFile
+ util.c
+
+#####GComment
+/*
+* Output a message to the top line of the screen.
+*
+* Break long messages into multiple pieces (40-72 chars).
+*
+* Allow multiple short messages to "share" the top line.
+*
+* Prompt the user to make sure he has a chance to read them.
+*
+* These messages are memorised for later reference (see above).
+*
+* We could do "Term_fresh()" to provide "flicker" if needed.
+*
+* The global "msg_flag" variable can be cleared to tell us to
+* "erase" any "pending" messages still on the screen.
+*
+* XXX XXX XXX Note that we must be very careful about using the
+* "msg_print()" functions without explicitly calling the special
+* "msg_print(NULL)" function, since this may result in the loss
+* of information if the screen is cleared, or if anything is
+* displayed on the top line.
+*
+* XXX XXX XXX Note that "msg_print(NULL)" will clear the top line
+* even if no messages are pending. This is probably a hack.
+*/
+
+#####GDescription
+In color "color", output message "msg" to the top line of the screen.
+If the message is blank or has more than 1000 characters, nothing is
+printed. Long messages are split after the 40th character and before
+the 72nd character.
+
+#####GParameters
+> "color" is the color of the message.
+ *****fields.txt*0[colors]
+> "msg" is the message.
+
+----------------------------------------------------------------------
+
+#####R=== msg_print ===
+
+#####GDeclaration
+ void msg_print(cptr msg);
+
+#####GFile
+ util.c
+
+#####GComment
+/* Hack -- for compatibility and easy sake */
+
+#####GDescription
+Print message "msg" in white (see cmsg_print() above).
+
+#####GParameters
+> "msg" is the message.
+
+----------------------------------------------------------------------
+
+#####R=== screen_save ===
+
+#####GDeclaration
+ void screen_save(void);
+
+#####GFile
+ util.c
+
+#####GComment
+/*
+ * Save the screen, and increase the "icky" depth.
+ *
+ * This function must match exactly one call to "screen_load()".
+ */
+
+#####GDescription
+Save a screen shot.
+
+----------------------------------------------------------------------
+
+#####R=== screen_load ===
+
+#####GDeclaration
+ void screen_load(void);
+
+#####GFile
+ util.c
+
+#####GComment
+/*
+ * Load the screen, and decrease the "icky" depth.
+ *
+ * This function must match exactly one call to "screen_save()".
+ */
+
+#####GDescription
+Load a previously saved screen shot.
+
+----------------------------------------------------------------------
+
+#####R=== c_put_str ===
+
+#####GDeclaration
+ void c_put_str(byte attr, cptr str, int row, int col);
+
+#####GFile
+ util.c
+
+#####GComment
+/*
+* Display a string on the screen using an attribute.
+*
+* At the given location, using the given attribute, if allowed,
+* add the given string. Do not clear the line.
+*/
+
+#####GDescription
+Put string "str" at row "row" and column "col" with attribute "attr".
+
+#####GParameters
+> "attr" is the color of the message.
+ *****fields.txt*0[colors]
+> "msg" is the message.
+> "row" is the row the message is to be printed at.
+> "col" is the column the message is to be printed at.
+
+----------------------------------------------------------------------
+
+#####R=== c_prt ===
+
+#####GDeclaration
+ void c_prt(byte attr, cptr str, int row, int col);
+
+#####GFile
+ util.c
+
+#####GComment
+/*
+* Display a string on the screen using an attribute, and clear
+* to the end of the line.
+*/
+
+#####GDescription
+Clear row "row" from column "col". Put string "str" at "row", "col"
+with attribute "attr".
+
+#####GParameters
+> "attr" is the color of the message.
+ *****fields.txt*0[colors]
+> "msg" is the message.
+> "row" is the row the message is to be printed at.
+> "col" is the column the message is to be printed at.
+
+----------------------------------------------------------------------
+
+#####R=== clear_from ===
+
+#####GDeclaration
+ void clear_from(int row);
+
+#####GFile
+ util.c
+
+#####GComment
+/*
+* Clear part of the screen
+*/
+
+#####GDescription
+Clear the screen from row "row" onwards.
+
+#####GParameters
+> "row" is the first row of the screen to be cleared.
+
+----------------------------------------------------------------------
+
+#####R=== askfor_aux ===
+
+#####GDeclaration
+ bool askfor_aux(char *buf, int len);
+
+#####GFile
+ util.c
+
+#####GComment
+/*
+* Get some input at the cursor location.
+* Assume the buffer is initialized to a default string.
+* Note that this string is often "empty" (see below).
+* The default buffer is displayed in yellow until cleared.
+* Pressing RETURN right away accepts the default entry.
+* Normal chars clear the default and append the char.
+* Backspace clears the default or deletes the final char.
+* ESCAPE clears the buffer and the window and returns FALSE.
+* RETURN accepts the current buffer contents and returns TRUE.
+*/
+
+#####GDescription
+Get string "buf" from the screen. "buf" is to be no more than "len"
+bytes. The string starts at the current cursor position. The length
+can not exceed the number of bytes from the cursor to the end of the
+line. Accept user input until the escape or return key is pressed.
+
+#####GParameters
+> "buf" is the string returned from the screen.
+> "len" is the length of the string. If it is <1 it is forced to 1.
+
+----------------------------------------------------------------------
+
+#####R=== get_string ===
+
+#####GDeclaration
+ bool get_string(cptr prompt, char *buf, int len);
+
+#####GFile
+ util.c
+
+#####GComment
+/*
+* Get a string from the user
+*
+* The "prompt" should take the form "Prompt: "
+*
+* Note that the initial contents of the string is used as
+* the default response, so be sure to "clear" it if needed.
+*
+* We clear the input, and return FALSE, on "ESCAPE".
+*/
+
+#####GDescription
+Print prompt "prompt" at the top-left corner of the screen and return
+response "buf" which will have a maximum length "length". If ESCAPE
+is entered, the function returns FALSE, otherwise it returns TRUE.
+
+#####GParameters
+> "prompt" is the prompt for input.
+> "buf" is the returned response.
+> "len" is the maximum length of the string.
+
+----------------------------------------------------------------------
+
+#####R=== get_check ===
+
+#####GDeclaration
+ bool get_check(cptr prompt);
+
+#####GFile
+ util.c
+
+#####GComment
+/*
+* Verify something with the user
+*
+* The "prompt" should take the form "Query? "
+*
+* Note that "[y/n]" is appended to the prompt.
+*/
+
+#####GDescription
+Ask the user question "prompt" which requires a yes/no answer. The
+prompt appears in the top-left corner of the screen. A response of
+'Y' (either case) returns TRUE. A response of 'N' (either case) or
+ESCAPE returns FALSE.
+
+#####GParameters
+> "prompt" is the question asked. It has a maximum length of 70
+ characters.
+
+----------------------------------------------------------------------
+
+#####R=== get_com_lua ===
+
+#####GDeclaration
+ bool get_com_lua @ get_com(cptr promtp, int *com);
+
+#####GFile
+ util.c
+
+#####GComment
+/*
+* Prompts for a keypress
+*
+* The "prompt" should take the form "Command: "
+*
+* Returns TRUE unless the character is "Escape"
+*/
+
+#####GDescription
+Ask the user for command "prompt" and return the key press "com". A
+response of ESCAPE returns FALSE. All other responses return TRUE.
+
+#####GParameters
+> "prompt" is the prompt for the key press.
+> "com" is the returned key press.
+
+----------------------------------------------------------------------
+
+#####R=== get_quantity ===
+
+#####GDeclaration
+ s32b get_quantity(cptr prompt, s32b max);
+
+#####GFile
+ util.c
+
+#####GComment
+/*
+* Request a "quantity" from the user
+*
+* Hack -- allow "command_arg" to specify a quantity
+*/
+
+#####GDescription
+Ask the user for quantity "prompt" of maximum value "max" and return
+a quantity. If the user quantity is higher than the maximum then the
+maximum is returned. If the response is a letter then the maximum is
+returned. If the user quantity is negative then zero is returned.
+
+#####GParameters
+> "prompt" is the prompt for a quantity.
+> "max" is the maximum value allowed.
+
+----------------------------------------------------------------------
+
+#####R=== test_monster_name ===
+
+#####GDeclaration
+ int test_monster_name(cptr name);
+
+#####GFile
+ util.c
+
+#####GComment
+/*
+ * Given monster name as string, return the index in r_info array. Name
+ * must exactly match (look out for commas and the like!), or else 0 is
+ * returned. Case doesn't matter. -GSN-
+ */
+
+#####GDescription
+Return the monster index for monster with name "name". If no match is
+found then zero is returned.
+
+#####GParameters
+> "name" is the monster name.
+
+----------------------------------------------------------------------
+
+#####R=== test_item_name ===
+
+#####GDeclaration
+ int test_item_name(cptr name);
+
+#####GFile
+ util.c
+
+#####GComment
+/*
+ * Given item name as string, return the index in k_info array. Name
+ * must exactly match (look out for commas and the like!), or else 0 is
+ * returned. Case doesn't matter. -DG-
+ */
+
+#####GDescription
+Return the item index for item with name "name". If no match is found
+then zero is returned.
+
+#####GParameters
+> "name" is the item name.
+
+----------------------------------------------------------------------
+
+#####R=== luck ===
+
+#####GDeclaration
+ int luck(int min, int max);
+
+#####GFile
+ xtra1.c
+
+#####GComment
+/*
+ * Return a luck number between a certain range
+ */
+
+#####GDescription
+Return a number for luck between minimum "min" and maximum "max". The
+value begins with the player's current luck. The value is forced to
+be between -30 and +30. 30 is added to give a value between 0 and 60.
+The value is multiplied by the range (maximum - minimum) and divided
+by 60. The value is increased by the minimum. The value is returned.
+
+For example, if the player's current luck is 15, the minimum is -10,
+and the maximum is 10 (range 20), then the value returned is
+(45 * 20) / 60 which is 900 / 60 which is 15 + the minimum -10 gives
+a returned value of 5.
+
+#####GParameters
+> "min" is the minimum luck.
+> "max" is the maximum luck. Beware: this should be greater than the
+ minimum but it is not checked!
+
+----------------------------------------------------------------------
+
+#####R=== get_player_race_name ===
+
+#####GDeclaration
+ cptr get_player_race_name(int pr, int ps);
+
+#####GFile
+ util.c
+
+#####GComment
+(none)
+
+#####GDescription
+Return the name for player race "pr" and player sub-race "ps".
+
+#####GParameters
+> "pr" is the index for player race.
+> "ps" is the index for player sub-race.
+
+----------------------------------------------------------------------
+
+#####R=== quit ===
+
+#####GDeclaration
+ void quit(cptr str);
+
+#####GFile
+ z-util.c
+
+#####GComment
+/*
+ * Exit (ala "exit()"). If 'str' is NULL, do "exit(0)".
+ * If 'str' begins with "+" or "-", do "exit(atoi(str))".
+ * Otherwise, plog() 'str' and exit with an error code of -1.
+ * But always use 'quit_aux', if set, before anything else.
+ */
+
+#####GDescription
+Quit the game. If "str" is a string then write the string to the
+error file or screen. If "str" is a number then exit with the
+number as the exit code.
+
+#####GParameters
+> "str" is an error message or exit code.
+
+----------------------------------------------------------------------
+
+#####R=== dump_hooks ===
+
+#####GDeclaration
+ void dump_hooks();
+
+#####GFile
+ plots.c
+
+#####GComment
+(none)
+
+#####GDescription
+Print the name and type (C or Lua) of hooks in the hook list.
+
+----------------------------------------------------------------------
+
+#####R=== add_hook_script ===
+
+#####GDeclaration
+ void add_hook_script(int h_idx, char *script, cptr name);
+
+#####GFile
+ plots.c
+
+#####GComment
+(none)
+
+#####GDescription
+To hook list with index "h_idx", add a script with script file
+"script" and name "name" as a Lua hook if a hook with that name
+does not already exist.
+
+#####GParameters
+> "h_idx" is the index of the hook list in the array of hook lists.
+> "script" is the name of the script file.
+> "name" is the name of the hook to be added.
+
+----------------------------------------------------------------------
+
+#####R=== del_hook_name ===
+
+#####GDeclaration
+ void del_hook_name(int h_idx, cptr name);
+
+#####GFile
+ plots.c
+
+#####GComment
+(none)
+
+#####GDescription
+Search hook list with index "h_idx" and remove the hook with name
+"name".
+
+#####GParameters
+> "h_idx" is the index of the hook list in the array of hook lists.
+> "name" is the name of the hook to be removed.
+
+----------------------------------------------------------------------
+
+#####R=== pern_dofile ===
+
+#####GDeclaration
+ bool pern_dofile(char *file);
+
+#####GFile
+ script.c
+
+#####GComment
+(none)
+
+#####GDescription
+Parse the Lua script file "file".
+
+#####GParameters
+> "file" is the Lua script file to be parsed.
+
+----------------------------------------------------------------------
+
+#####R=== intMod ===
+
+#####GDeclaration
+ s32b intMod(s32b a, s32b b);
+
+#####GFile
+ script.c
+
+#####GComment
+(none)
+
+#####GDescription
+Return the result of operation "a" mod "b" (a % b).
+
+#####GParameters
+> "a" is a number.
+> "b" is a number.
+
+----------------------------------------------------------------------
+
+#####R=== intAnd ===
+
+#####GDeclaration
+ s32b intAnd(s32b a, s32b b);
+
+#####GFile
+ script.c
+
+#####GComment
+(none)
+
+#####GDescription
+Return the result of bitwise operation "a" AND "b" (a & b).
+
+#####GParameters
+> "a" is a number.
+> "b" is a number.
+
+----------------------------------------------------------------------
+
+#####R=== intOr ===
+
+#####GDeclaration
+ s32b intOr(s32b a, s32b b);
+
+#####GFile
+ script.c
+
+#####GComment
+(none)
+
+#####GDescription
+Return the result of bitwise operation "a" OR "b" (a | b).
+
+#####GParameters
+> "a" is a number.
+> "b" is a number.
+
+----------------------------------------------------------------------
+
+#####R=== intXor ===
+
+#####GDeclaration
+ s32b intXor(s32b a, s32b b);
+
+#####GFile
+ script.c
+
+#####GComment
+(none)
+
+#####GDescription
+Return the result of bitwise operation "a" XOR "b" (a ^ b).
+
+#####GParameters
+> "a" is a number.
+> "b" is a number.
+
+----------------------------------------------------------------------
+
+#####R=== intShiftl ===
+
+#####GDeclaration
+ s32b intShiftl(s32b a, s32b b);
+
+#####GFile
+ script.c
+
+#####GComment
+(none)
+
+#####GDescription
+Return the result of bitwise operation "a" << "b".
+
+#####GParameters
+> "a" is a number.
+> "b" is a number.
+
+----------------------------------------------------------------------
+
+#####R=== intShiftr ===
+
+#####GDeclaration
+ s32b intShiftr(s32b a, s32b b);
+
+#####GFile
+ script.c
+
+#####GComment
+(none)
+
+#####GDescription
+Return the result of bitwise operation "a" >> "b".
+
+#####GParameters
+> "a" is a number.
+> "b" is a number.
+
+----------------------------------------------------------------------
+
+#####R=== intBitNot ===
+
+#####GDeclaration
+ s32b intBitNot(s32b b);
+
+#####GFile
+ script.c
+
+#####GComment
+(none)
+
+#####GDescription
+Return the result of bitwise operation NOT "b" (~ b).
+
+#####GParameters
+> "b" is a number.
+
+----------------------------------------------------------------------
+
+#####R=== register_savefile ===
+
+#####GDeclaration
+ void register_savefile(int num);
+
+#####GFile
+ loadsave.c
+
+#####GComment
+/*
+ * Add num slots to the savefile
+ */
+
+#####GDescription
+Add "num" slots to the save file.
+
+#####GParameters
+> "num" is the number of slots to add to the savefile. If num is <0
+ then "num" is forced to zero.
+
+----------------------------------------------------------------------
+
+#####R=== save_number_key ===
+
+#####GDeclaration
+ void save_number_key(char *key, s32b val);
+
+#####GFile
+ util.c
+
+#####GComment
+(none)
+
+#####GDescription
+Save the length of key "key", the key itself, and the value "val" as
+bytes in the savefile.
+
+#####GParameters
+> "key" is the key string for the value.
+> "val" is the value to be saved.
+
+----------------------------------------------------------------------
+
+
+
+Back to the *****lua.hlp*0[lua help index] .
+
+
+ [[[[[gThis file by Chris Hadgis]
+
diff --git a/lib/mods/theme/help/luckspoi.txt b/lib/mods/theme/help/luckspoi.txt
new file mode 100644
index 00000000..4b4007c2
--- /dev/null
+++ b/lib/mods/theme/help/luckspoi.txt
@@ -0,0 +1,129 @@
+|||||oy
+~~~~~01|Luck (spoiler)
+~~~~~02|Spoilers|Luck
+#####RLuck
+
+"You've got to ask yourself one question: do I feel lucky? Well do ya
+punk?"
+ --Clint Eastwood (Dirty Harry)
+
+#####G1. Starting luck
+Most races start with no luck points. Those that start with luck are listed
+below from most luck to least luck.
+
+Hobbit (+5);
+Maia (+4);
+Gnome, Dunadan (+2);
+Beorning (+1);
+Half-Ogre, Dark Elf, Ent (-2);
+Orc (-3);
+Troll (-4);
+Petty Dwarf, Yeek (-5).
+
+Most subraces start with no luck points. Those that start with luck are listed
+below from most luck to least luck.
+
+Barbarian (+1);
+Spectre, Skeleton (-3);
+Zombie (-4).
+
+So, a Hobbit starts with 5 luck points, a Beorning Barbarian starts with 2 luck
+points, while a Yeek Zombie starts with -9 luck points.
+
+#####G2. Descriptions
+Drinking a potion of self-knowledge will tell you how lucky or unlucky your
+character is.
+
+DESCRIPTION VALUE
+incredibly unlucky less than -27
+extremely unlucky less than -18
+very unlucky less than -9
+unlucky less than 0
+normal luck 0
+lucky more than 0
+very lucky more than 9
+extremely lucky more than 18
+incredibly lucky more than 27
+
+Luck < -30 is treated as -30 and luck > 30 is treated as +30.
+
+#####G3. Items affecting luck
+Elven cloaks give a bonus to luck.
+
+All Morgul items have -10 luck.
+Weapons of Telchar give a bonus to luck.
+Weapons of the Glamhoth are unlucky.
+Lucky amulets give a bonus to luck.
+Unlucky amulets are, well, unlucky.
+
+Artifacts can affect your luck. Beware: not all artifacts give you good luck.
+Listed below are the artifacts which affect your luck.
+
+The Phial of Galadriel (+4)
+The Arkenstone of Thrain (+3)
+The Ring of Power 'Narya' (+1)
+The Ring of Power 'Nenya' (+2)
+The Ring of Power 'Vilya' (+3)
+The Metal Cap of Thengel (+3)
+The Shadow Cloak of Luthien (+2)
+The Set of Cesti of Fingolfin (+4)
+The Broken Dagger 'Angrist' (+5)
+The Long Sword 'Anduril' (+4)
+The Long Sword of Dernhelm (+5)
+The Long Bow of Bard (+2)
+The Mage Staff of Manwe (+12)
+The Golden Harp of Thorin (+2)
+The Harp of Maglor (+3)
+The Drum of the Sky (+2)
+The Harp of Daeron (+1)
+The Long Sword of Tulkas (+10)
+The Robe of Great Luck (+60)
+The Heavy Crossbow of Orome (+5)
+The Iron Helm of Knowledge (-6)
+The Shield of Deflection of Gil-galad (+5)
+The Set of Gauntlets of Eol (+3)
+The Demonblade of Gothmog (-20)
+The Elven Cloak of Peregrin Took (+3)
+The Ring 'Fuin' (+15)
+The Blue Stone 'Coimir' (+2)
+The Elven Cloak of Mellyrn (+4)
+The Set of Cesti 'Skycleaver' (+1)
+The Robe of Belegaer (+5)
+The Harp of Tom Bombadil (+4)
+The Horn 'Valaroma' (+4)
+The Sceptre of Numenor (-3)
+The Rod of Annuminas (+4)
+The Lucerne Hammer of the Eruchin (+10)
+The Trident of Ulmo (+10)
+The Broad Axe of Aule (+10)
+The Rapier of Vaire (+10)
+The Long Bow of Irmo (+5)
+The Sling of Nessa (+5)
+The Boomerang of Varda (+5)
+The Ring of Power of the Blacklocks (+3)
+
+#####G4. What does it affect.
+It affects your chance to-hit in ranged combat and melee combat.
+
+It affects your chance of critical hits in ranged combat and melee combat.
+
+It affects your chance of being missed by a monster attack. This effectively
+changes armour class by -13 (incredibly unlucky) to +13 (incredibly lucky).
+
+It affects the rarity of special objects, artifacts, and ego items.
+
+It affects the number of wishes on a staff of wishing.
+
+It affects the base level for applying magic to an item.
+
+It affects the chance of an item being good or great.
+
+It affects the chance of creating a special object.
+
+It prevents the death fate if you are lucky.
+
+It affects the number of skill points you receive when quaffing the Potion of
+Learning.
+
+
+ Written for ToME 2.0 by Chris Hadgis
diff --git a/lib/mods/theme/help/m_air.txt b/lib/mods/theme/help/m_air.txt
new file mode 100644
index 00000000..ee9fa8d0
--- /dev/null
+++ b/lib/mods/theme/help/m_air.txt
@@ -0,0 +1,42 @@
+|||||oy
+~~~~~01|Magic|Air School
+~~~~~02|Air Magic
+~~~~~03|Skills|Air - Spell Info
+#####R === ToME Magic - Air School ===
+
+The air school of magic contains spells where the element of air is used
+to create the final spell effect. There are rumours of a "Tome of the Blowing
+Wind" which contains all the air school spells within its bindings.
+
+Worshipping the God Manwe Sulimo also gives the ability to cast spells from
+the air school at a level of 2/3 of your prayer level. E.g. if the skill
+"Spirituality: Prayer" is at level 12, you can cast up to level 8 air school
+spells.
+
+#####BAir Spells
+There are six spells available for the air school. These spells are:
+1. [[[[[BNoxious Cloud] (school level 3)
+ Creates a cloud of poison.
+ The cloud will persist for some turns, damaging all monsters passing by.
+ At spell level 30 it turns into a thick gas attacking all living beings.
+2. [[[[[BPoison Blood] (school level 12)
+ Grants resist poison.
+ At spell level 15 it provides poison branding to the wielded weapon.
+3. [[[[[BInvisibility] (school level 16)
+ Grants invisibility.
+4. [[[[[BSterilize] (school level 20)
+ Prevents explosive breeding for a while.
+5. [[[[[BWings of Winds] (dual school level 22)
+ Grants the power of levitation.
+ At spell level 16 it grants the power of controlled flight.
+#####v Your Air and Conveyance skills must have reached a combined average level
+#####v of 22 in order to cast this spell.
+6. [[[[[BThunderstorm] (dual school level 25)
+ Charges up the air around you with electricity.
+ Each turn it will throw a bolt of thunder at a random monster in sight.
+ This thunder does 3 types of damage:
+ one third of lightning
+ one third of sound
+ and one third of light.
+#####v Your Air and Nature skills must have reached a combined average level
+#####v of 25 in order to cast this spell.
diff --git a/lib/mods/theme/help/m_convey.txt b/lib/mods/theme/help/m_convey.txt
new file mode 100644
index 00000000..91ed8556
--- /dev/null
+++ b/lib/mods/theme/help/m_convey.txt
@@ -0,0 +1,71 @@
+|||||oy
+~~~~~01|Magic|Conveyance School
+~~~~~02|Conveyance Magic
+~~~~~03|Skills|Conveyance - Spell Info
+#####R === ToME Magic - Conveyance School ===
+
+The conveyance school of magic contains spells where the forces of space are
+manipulated by the spell. There are rumours of a "Tome of of Translocation"
+which contains all the conveyance school spells within its bindings.
+
+Worshipping the God Manwe Sulimo also gives the ability to cast spells from
+the conveyance school at a level of 1/2 of your prayer level. E.g. if the
+skill "Spirituality: Prayer" is at level 10, you can cast up to level 5
+conveyance school spells.
+
+#####sConveyance Spells
+There are six spells available for the conveyance school. These Spells are:
+1. [[[[[sPhase Door] (school level 1)
+ Teleports you on a small scale range.
+ At spell level 30 it creates void jumpgates.
+2. [[[[[sDisarm] (school level 3)
+ Destroys doors and disarms traps in adjacent tiles.
+ At spell level 10 it unlocks doors and disarms traps.
+3. [[[[[sTeleportation] (school level 10)
+ Teleports you around the level.
+ The casting time decreases with level.
+4. [[[[[sTeleport Away] (school level 23)
+ Teleports a line of monsters away.
+ At spell level 10 it turns into a ball.
+ At spell level 20 it teleports all monsters in sight.
+5. [[[[[sRecall] (school level 30)
+ Cast on yourself, it will recall you to the surface/dungeon.
+ Cast at a monster, it will make you swap positions with the monster.
+ Cast at an object, it will fetch the object to you (note that you must have
+ an empty space under your feet for the object to fall onto).
+6. [[[[[sProbability Travel] (school level 35)
+ Renders you unstable. When you hit a wall you travel through it and
+ instantly appear on the other side of it. You can also float up and down
+ at will.
+
+#####GAir spells that can be cast with Conveyance skill
+
+1. [[[[[BWings of Winds] (dual school level 22)
+ Grants the power of levitation.
+ At spell level 16 it grants the power of controlled flight.
+#####v Your Air and Conveyance skills must have reached a combined average level
+#####v of 22 in order to cast this spell.
+
+#####GTemporal spells that can be cast with Conveyance skill
+
+1. [[[[[sBanishment] (dual school level 30)
+ Disrupts the space/time continuum in your area and teleports all monsters
+ away.
+ At spell level 15 it also may lock them in a time bubble for some turns.
+#####v Your Temporal and Conveyance skills must have reached a combined average level
+#####v of 30 in order to cast this spell.
+
+#####GMeta spells that can be cast with Conveyance skill
+
+1. [[[[[sTracker] (dual school level 30)
+ Tracks down the last teleportation that happened on the level and teleports
+ you to it.
+#####v Your Meta and Conveyance skills must have reached a combined average level
+#####v of 30 in order to cast this spell.
+
+#####GUdun spells that can be cast with Conveyance skill
+
+1. [[[[[DWraithform] (dual school level 30)
+ Turns you temporarily into an immaterial being.
+#####v Your Udun and Conveyance skills must have reached a combined average level
+#####v of 30 in order to cast this spell.
diff --git a/lib/mods/theme/help/m_demono.txt b/lib/mods/theme/help/m_demono.txt
new file mode 100644
index 00000000..cb32d360
--- /dev/null
+++ b/lib/mods/theme/help/m_demono.txt
@@ -0,0 +1,44 @@
+|||||oy
+~~~~~01|Magic|Demonology School
+~~~~~02|Demonology Magic
+~~~~~03|Skills|Demonology - Spell Info
+#####R === ToME Magic - Demonology ===
+
+Available only to Demonologists, or those sufficiently corrupted with
+demon-like powers, this school contains spells where demonic energies
+are used to create mainly devastating effects.
+
+#####oDemonic equipment
+Unlike other magic schools, the spells of a Demonologist are not written
+in spell books, but are contained within items of demonic origin known as
+Demonblades, Demonshields, and Demonhorns (helms), which when wielded allow
+the Demonologist to cast spells; each piece of equipment holds three spells.
+
+#####oDemonblade spells
+1. [[[[[oDemon Blade] (school level 1)
+ Imbues your blade with fire to deal more damage.
+ At level 30 it deals hell fire damage.
+ At level 45 it spreads over a 1 radius zone around your target.
+2. [[[[[oDemon Madness] (school level 10)
+ Fire 2 balls in opposite directions of randomly chaos, confusion or charm.
+3. [[[[[oDemon Field] (school level 20)
+ Fires a lingering cloud of deadly nexus over a radius of 7.
+
+#####oDemonshield spells
+1. [[[[[oDoom Shield] (school level 1)
+ Raises a mirror of pain around you, doing very high damage to your foes
+ that dare hit you, but greatly reduces your armour class.
+2. [[[[[oDemon Cloak] (school level 20)
+ Raises a mirror that can reflect bolts and arrows for a time.
+3. [[[[[oUnholy Word] (school level 25)
+ Kills a pet to heal you. There is a chance that the pet won't die but will
+ turn against you. This chance will decrease with higher spell levels.
+
+#####oDemonhorn spells
+1. [[[[[oSummon Demon] (school level 5)
+ Summons a leveled demon to your side.
+ At level 35 it summons a high demon.
+2. [[[[[oDischarge Minion] (school level 10)
+ The targeted pet will explode in a burst of gravity.
+3. [[[[[oControl Demon] (school level 25)
+ Attempts to control a demon.
diff --git a/lib/mods/theme/help/m_divin.txt b/lib/mods/theme/help/m_divin.txt
new file mode 100644
index 00000000..df92c11b
--- /dev/null
+++ b/lib/mods/theme/help/m_divin.txt
@@ -0,0 +1,38 @@
+|||||oy
+~~~~~01|Magic|Divination School
+~~~~~02|Divination Magic
+~~~~~03|Skills|Divination - Spell Info
+#####R === ToME Magic - Divination School ===
+
+The divination school of magic contains spells where magic is used to
+psychically gain information about things. There are rumours of a "Tome of
+Knowledge" which contains all the divination school spells within its bindings.
+
+Worshipping Eru Iluvatar or Mandos also gives the ability to cast spells from
+the divination school at a level of 2/3 and 1/3, respectively, of your prayer
+level. E.g. if the skill "Spirituality: Prayer" is at level 12, a worshipper
+of Eru can cast up to level 8 divination school spells, whereas a worshipper
+of Mandos can cast up to level 4 divination school spells.
+
+#####sDivination Spells
+There are six spells available for the divination school. These Spells are:
+1. [[[[[sSense Monsters] (school level 1)
+ Detects all monsters near you.
+ At spell level 30 it allows you to sense monster minds for a while.
+2. [[[[[sSense Hidden] (school level 5)
+ Detects the traps in a certain radius around you.
+ At spell level 15 it allows you to sense invisible monsters for a while.
+3. [[[[[sIdentify] (school level 8)
+ Asks for an object and identifies it.
+ At spell level 17 it identifies all objects in the inventory.
+ At spell level 27 it identifies all objects in the inventory and in a
+ radius on the floor, as well as probing monsters in that radius.
+4. [[[[[sReveal Ways] (school level 9)
+ Detects the doors/stairs/ways in a certain radius around you.
+5. [[[[[sVision] (school level 15)
+ Detects the layout of the surrounding area.
+ At spell level 25 it maps and lights the whole level.
+6. [[[[[sGreater Identify] (school level 35)
+ Asks for an object and fully identifies it, providing the full list of
+ powers (as with a scroll of *Identify*).
+ Cast at yourself, it will reveal your powers (Self Knowledge).
diff --git a/lib/mods/theme/help/m_earth.txt b/lib/mods/theme/help/m_earth.txt
new file mode 100644
index 00000000..2f2bd9c2
--- /dev/null
+++ b/lib/mods/theme/help/m_earth.txt
@@ -0,0 +1,35 @@
+|||||oy
+~~~~~01|Magic|Earth School
+~~~~~02|Earth Magic
+~~~~~03|Skills|Earth - Spell Info
+#####R === ToME Magic - Earth School ===
+
+The earth school of magic contains spells where the element of earth is used
+to create the final spell effect. There are rumours of a "Tome of the
+Impenetrable Earth" which contains all the earth school spells within its
+bindings.
+
+Worshipping Tulkas, Yavanna Kementari or Aule also gives the ability to cast
+spells from the earth school, at a level of 4/5, 1/2, or 1/3, respectively,
+of your prayer level. E.g. if the skill "Spirituality: Prayer" is at level
+10, a worshipper of Tulkas can cast up to level 8 earth school spells,
+whereas a worshipper of Yavanna can cast up to level 5 earth school spells
+and a worshipper of Aule can cast up to level 3 earth school spells.
+
+#####uEarth Spells
+There are five spells available for the earth school. These Spells are:
+1. [[[[[uStone Skin] (school level 1)
+ Creates a shield of earth around you to protect you.
+ At spell level 25 it starts dealing damage to attackers.
+2. [[[[[uDig] (school level 12)
+ Digs a hole in a wall much faster than any shovels.
+3. [[[[[uStone Prison] (school level 25)
+ Creates a prison of walls around you.
+ At spell level 10 it allows you to target a monster.
+4. [[[[[uShake] (school level 27)
+ Creates a localised earthquake.
+ At spell level 10 it can be targeted at any location.
+5. [[[[[uStrike] (school level 30)
+ Creates a micro-ball of force that will push monsters backwards.
+ If the monster is caught near a wall, it'll be crushed against it.
+ At spell level 12 it turns into a ball of radius 1.
diff --git a/lib/mods/theme/help/m_fire.txt b/lib/mods/theme/help/m_fire.txt
new file mode 100644
index 00000000..826a1d9a
--- /dev/null
+++ b/lib/mods/theme/help/m_fire.txt
@@ -0,0 +1,53 @@
+|||||oy
+~~~~~01|Magic|Fire School
+~~~~~02|Fire Magic
+~~~~~03|Skills|Fire - Spell Info
+#####R === ToME Magic - Fire School ===
+
+The fire school of magic contains spells where the element of fire is used
+to create the final spell effect. There are rumours of a "Tome of the Eternal
+Flame" which contains all the fire school spells within its bindings.
+
+Worshipping Aule also gives the ability to cast spells from the fire school
+at a level of 3/5 of your prayer level. E.g. if the skill "Spirituality:
+Prayer" is at level 15, you can cast up to level 9 fire school spells.
+
+#####RFire Spells
+There are five spells available for the fire school. These spells are:
+1. [[[[[RGlobe of Light] (school level 1)
+ Creates a globe of pure light.
+ At spell level 3 it starts damaging monsters.
+ At spell level 15 it starts creating a more powerful kind of light.
+2. [[[[[RFire Golem] (dual school level 7)
+ Creates a fiery golem and controls it.
+ During the control the available keylist is:
+ Movement keys: move the golem (depending on its speed it can move more
+ than one square).
+ , : pickup all items on the floor
+ d : drop all carried items
+ i : list all carried items
+ m : end the possession/use golem powers
+ Most of the other keys are disabled; you cannot interact with your
+ real body while controlling the golem.
+ But to cast the spell you will need a lantern or a wooden torch to create
+ the golem.
+#####v Your Fire and Mind skills must have reached a combined average level
+#####v of 7 in order to cast this spell.
+3. [[[[[RFireflash] (school level 10)
+ Conjures a ball of fire to burn your foes to ashes.
+ At spell level 20 it turns into a ball of holy fire.
+4. [[[[[RFirewall] (school level 15)
+ Creates a fiery wall to incinerate monsters stupid enough to attack you.
+ At spell level 6 it turns into a wall of hell fire.
+5. [[[[[RFiery Shield] (school level 20)
+ Creates a shield of fierce flames around you.
+ At spell level 8 it turns into a greater kind of flame that cannot be
+ resisted by your foes.
+
+
+#####GUdun spells that can be cast with Fire skill
+
+1. [[[[[DFlame of Udun] (dual school level 35)
+ Turns you temporarily into a powerful Balrog.
+#####v Your Fire and Udun skills must have reached a combined average level
+#####v of 35 in order to cast this spell.
diff --git a/lib/mods/theme/help/m_geoman.txt b/lib/mods/theme/help/m_geoman.txt
new file mode 100644
index 00000000..97c1ac1a
--- /dev/null
+++ b/lib/mods/theme/help/m_geoman.txt
@@ -0,0 +1,75 @@
+|||||oy
+~~~~~01|Magic|Geomancy
+~~~~~02|Geomancer|Geomancy spells
+~~~~~03|Skills|Geomancy - Spell Info
+#####R === ToME Magic - Geomancy ===
+Geomancy harnesses the power of nature to awesome effect. Therefore neither
+books nor light are necessary, and as the geomancers's skill increases, so do
+his powers over the elements of nature.
+
+Because Geomancy relies so heavily on the environment, you will need
+sufficient knowledge of the elemental skills (Earth, Air, Fire and Water) in
+order to cast some of the spells, and the exact effects of a spell often
+depend upon your levels in the elemental skills and your current surroundings.
+
+The powers are accessed using the 'm' key and then selecting 'Use Geomancy';
+they are cast with spell points, like normal spells, which can be increased
+as usual through the *****skills.txt*21[Magic] skill.
+
+1. [[[[[RCall] [[[[[GThe] [[[[[BElements] (Level 1) Cost:2
+ Randomly creates various elements around you.
+ The chance for each type of element is controlled by your level in the
+ corresponding skill.
+ At level 17 it can be targeted.
+
+2. [[[[[UChannel] [[[[[GElements] (Level 3) Cost:3
+ Draws on the caster's immediate environs to form an attack or other effect.
+ Grass/Flower heals.
+ Water creates water bolt attacks.
+ Ice creates ice bolt attacks.
+ Sand creates a wall of burning sand around you, but the wall is thick and
+ blinds you.
+ Lava creates fire bolt attacks.
+ Deep lava creates fire ball attacks.
+ Chasm creates darkness bolt attacks.
+ At Earth level 18, darkness becomes nether.
+ At Water level 8, water attacks become beams with a striking effect.
+ At Water level 12, ice attacks become balls of ice shards.
+ At Water level 18, water attacks push monsters back.
+ At Fire level 15, fire becomes hellfire.
+
+3. [[[[[RElemental] [[[[[BWave] (Level 15) Cost:15
+ Draws on an adjacent special square to project a slow-moving wave of that
+ element in that direction.
+ Abyss squares cannot be channeled into a wave.
+
+4. [[[[[UElemental] [[[[[RMinion] (Level 20) Cost:40
+ Summons a minion from a nearby element.
+ Walls can summon Earth elmentals, Xorns and Xarens.
+ Dark Pits can summon Air elementals, Ancient blue dragons, Great Storm Wyrms
+ and Sky Drakes.
+ Sandwalls and lava can summon Fire elementals and Ancient red dragons.
+ Icewalls and water can summon Water elementals, Water trolls and Water
+ demons.
+
+5. [[[[[GVaporize] (Level 4) Cost:3
+ Draws upon your immediate environs to form a cloud of damaging vapors.
+#####v You must have reached at least level 4 in the Air skill to cast this
+#####v spell.
+
+6. [[[[[UGeolysis] (Level 7) Cost:15
+ Burrows deeply and slightly at random into a wall, leaving behind tailings
+ of various different sorts of walls in the passage.
+#####v You must have reached at least level 7 in the Earth skill to cast this
+#####v spell.
+
+7. [[[[[BDripping Tread] (Level 10) Cost:15
+ Causes you to leave random elemental forms behind as you walk.
+#####v You must have reached at least level 10 in the Water skill to cast this
+#####v spell.
+
+8. [[[[[UGrow Barrier] (Level 12) Cost:30
+ Creates impassable terrain (walls, trees, etc.) around you.
+ At air level 20 it can be projected around another area.
+#####v You must have reached at least level 12 in the Earth skill to cast this
+#####v spell.
diff --git a/lib/mods/theme/help/m_mana.txt b/lib/mods/theme/help/m_mana.txt
new file mode 100644
index 00000000..23d8e680
--- /dev/null
+++ b/lib/mods/theme/help/m_mana.txt
@@ -0,0 +1,40 @@
+|||||oy
+~~~~~01|Magic|Mana School
+~~~~~02|Mana Magic
+~~~~~03|Skills|Mana - Spell Info
+#####R === ToME Magic - Mana School ===
+
+The mana school of magic contains spells where the raw force of magic is used
+to create the final spell effect. There are rumours of a "Tome of Magical
+Energy" which contains all the mana school spells within its bindings.
+
+Worshipping Eru Iluvatar or Varda Elentari also gives the ability to cast spells
+from the mana school at a level of 1/2 or 1/4, respectively, of your prayer level.
+E.g. if the skill "Spirituality: Prayer" is at level 10, Eru worshippers can cast
+up to level 5 mana school spells whereas Varda worshippers can cast up to level 3
+mana school spells.
+
+#####sMana Spells
+There are four spells available for the mana school. These spells are:
+1. [[[[[sManathrust] (school level 1)
+ Conjures up mana into a powerful bolt.
+ The damage is irresistible and will increase with spell level.
+2. [[[[[sRemove Curses] (school level 10)
+ Removes curses of worn objects.
+ At spell level 20, removes heavy curses.
+3. [[[[[sElemental Shield] (school level 20)
+ Provides resistance to the four basic elements.
+4. [[[[[sDisruption Shield] (school level 45)
+ Uses mana instead of hitpoints to take damage.
+ At spell level 5 switches to Globe of Invulnerability.
+ The spell breaks as soon as a melee, shooting, throwing or magical skill
+ action is attempted, and lasts only a short time otherwise.
+
+
+#####GUdun spells that can be cast with Mana skill
+
+1. [[[[[DDrain] (dual school level 1)
+ Drains the mana contained in wands, staves and rods to increase yours.
+#####v Your Mana and Udun skills must have reached a combined average level
+#####v of 1 in order to cast this spell.
+
diff --git a/lib/mods/theme/help/m_meta.txt b/lib/mods/theme/help/m_meta.txt
new file mode 100644
index 00000000..7bf1471b
--- /dev/null
+++ b/lib/mods/theme/help/m_meta.txt
@@ -0,0 +1,75 @@
+|||||oy
+~~~~~01|Magic|Meta School
+~~~~~02|Meta Magic
+~~~~~03|Skills|Meta - Spell Info
+#####R === ToME Magic - Meta School ===
+
+The meta school of magic contains spells where the raw forces of magic are
+manipulated by the spell. There are rumours of a "Tome of Meta Spells" which
+contains all the meta school spells within its bindings.
+
+Worshipping Manwe Sulimo or Varda Elentari also gives the ability to cast
+spells from the meta school at a level of 1/3 of your prayer level. E.g. if
+the skill "Spirituality: Prayer" is at level 15, Manwe and Varda worshippers
+alike can cast up to level 5 meta school spells.
+
+#####sMeta Spells
+There are five spells available for the meta school. These spells are:
+1. [[[[[sRecharge] (school level 5)
+ Taps the ambient mana to recharge an object's power (charges or mana).
+2. [[[[[sDisperse Magic] (school level 15)
+ Dispels a lot of magic that can affect you, be it good or bad:
+ Spell Level 1: blindness and light.
+ Spell Level 5: confusion and hallucination.
+ Spell Level 10: speed (either bad or good) and light speed.
+ Spell Level 15: stunning, meditation and cuts.
+ Spell Level 20: heroism, super heroism, blessing, shields, fear, parasites
+ and mimicry.
+3. [[[[[sSpellbinder] (school level 20)
+ Stores spells in a trigger.
+ When the condition is met all spells fire off at the same time. This spell
+ takes a long time to cast so you are advised to prepare it in a safe area.
+ Also it will use the mana for the Spellbinder and the mana for the selected
+ spells.
+4. [[[[[sTracker] (dual school level 30)
+ Tracks down the last teleportation that happened on the level and teleports
+ you to it.
+#####v Your Meta and Conveyance skills must have reached a combined average level
+#####v of 30 in order to cast this spell.
+5. [[[[[sInertia Control] (school level 37)
+ Changes the energy flow of a spell to be continuously recasted at a given
+ interval. The inertia-controlled spell reduces your maximum mana by four
+ times its cost.
+
+#####R=== List of Controllable Spells ===
+ Armor of Fear
+ Banishment
+ Disperse Magic
+ Disruption Shield
+ Elemental Shield
+ Ent's Potion
+ Essence of Speed
+ Fiery Shield
+ Flame of Udun
+ Globe of Light
+ Grow Trees
+ Ice Storm
+ Invisibility
+ Phase Door
+ Poison Blood
+ Probability Travel
+ Recovery
+ Regeneration
+ Remove Curses
+ Reveal Ways
+ Sense Hidden
+ Sense Monsters
+ Shake
+ Stone Skin
+ Teleportation
+ Thunderstorm
+ Tidal Wave
+ Vapor
+ Vision
+ Wings of Winds
+ Wraithform
diff --git a/lib/mods/theme/help/m_mimic.txt b/lib/mods/theme/help/m_mimic.txt
new file mode 100644
index 00000000..79d39521
--- /dev/null
+++ b/lib/mods/theme/help/m_mimic.txt
@@ -0,0 +1,33 @@
+|||||oy
+~~~~~01|Magic|Mimicry
+~~~~~02|Mimic|Mimicry powers
+~~~~~03|Skills|Mimicry - mimicry powers
+#####R === ToME Magic - Mimicry ===
+Mimics can alter their form using special cloaks called cloaks of mimicry.
+Even though this ability can give them access to increased stats, regeneration,
+speed and resistances, there is always the risk of the shape-change going
+horribly wrong, turning the character into an abomination for some time.
+Also, you should keep in mind that any racial power or stat modifier is
+overridden during the shape-shift.
+
+As your mimicry skill increases, your character is less likely to spoil
+the transformation attempt and may even gain other powers, such as making
+his colouration match his surroundings (becoming in all respects invisible)
+or even stranger abilities... rumours abound about Tarka the Chameleon and
+her two pairs of boots of speed.
+
+The powers are accessed using the 'm' key and then selecting 'Use Mimicry';
+they are cast with spell points, like normal spells, which can be increased
+as usual through the *****skills.txt*21[Magic] skill.
+
+1. [[[[[sMimic] (Level 1) Cost:2
+ Allows you to mimic the creature whose cloak you are wearing for a time.
+2. [[[[[sInvisibility] (Level 10) Cost:6
+ Turns you invisible for a time.
+3. [[[[[sLegs Mimicry] (Level 25) Cost:20
+ Gives you an additional set of legs for a time.
+4. [[[[[sWall Mimicry] (Level 30) Cost:40
+ Allows you to move within walls, and [[[[[Bonly] walls, for a time.
+[[[[[v Be careful you don't get stuck in a wall when it runs out.]
+5. [[[[[sArms Mimicry] (Level 35) Cost:100
+ Gives you an additional set of arms for a time.
diff --git a/lib/mods/theme/help/m_mind.txt b/lib/mods/theme/help/m_mind.txt
new file mode 100644
index 00000000..b6c1196f
--- /dev/null
+++ b/lib/mods/theme/help/m_mind.txt
@@ -0,0 +1,49 @@
+|||||oy
+~~~~~01|Magic|Mind School
+~~~~~02|Mind Magic
+~~~~~03|Skills|Mind - Spell Info
+#####R === ToME Magic - Mind School ===
+
+The mind school of magic contains spells which alter the mind. There are
+rumours of a "Tome of the Mind" which contains all the mind school spells
+within its bindings.
+
+Worshipping the God Eru Iluvatar or the God Melkor Bauglir also gives the
+ability to cast spells from the mind school at a level of 1/3 of your prayer
+level. E.g. if the skill "Spirituality: Prayer" is at level 12, you can cast
+up to level 4 mind school spells.
+
+#####sMind Spells
+There are four spells available for the mind school. These spells are:
+1. [[[[[sCharm] (school level 1)
+ Tries to manipulate the mind of a monster to make it friendly.
+ At spell level 15 it turns into a ball.
+ At spell level 35 it affects all monsters in sight.
+2. [[[[[sConfuse] (school level 5)
+ Tries to manipulate the mind of a monster to confuse it.
+ At spell level 15 it turns into a ball.
+ At spell level 35 it affects all monsters in sight.
+3. [[[[[sArmor of Fear] (school level 10)
+ Creates a shield of pure fear around you. Any monster attempting to hit
+ you must save or flee.
+4. [[[[[sStun] (school level 15)
+ Tries to manipulate the mind of a monster to stun it.
+ At spell level 20 it turns into a ball.
+
+#####GFire spells that can be cast with Mind skill
+
+1. [[[[[RFire Golem] (school level 7)
+ Creates a fiery golem and controls it.
+ During the control the available keylist is:
+ Movement keys: move the golem (depending on its speed it can move more
+ than one square).
+ , : pickup all items on the floor
+ d : drop all carried items
+ i : list all carried items
+ m : end the possession/use golem powers
+ Most of the other keys are disabled; you cannot interact with your
+ real body while controlling the golem.
+ But to cast the spell you will need a lantern or a wooden torch to create
+ the golem.
+#####v Your Fire and Mind skills must have reached a combined average level
+#####v of 7 in order to cast this spell.
diff --git a/lib/mods/theme/help/m_mindcr.txt b/lib/mods/theme/help/m_mindcr.txt
new file mode 100644
index 00000000..4f420656
--- /dev/null
+++ b/lib/mods/theme/help/m_mindcr.txt
@@ -0,0 +1,54 @@
+|||||oy
+~~~~~01|Magic|Mindcraft
+~~~~~02|Mindcrafter|Mindcraft powers
+~~~~~03|Skills|Mindcraft - Spell Info
+#####R === ToME Magic - Mindcraft ===
+Mindcrafting uses the power of the mind to cast its spells. Therefore neither
+books nor light are necessary, and as the mindcrafter's skill increases, so do
+the powers of his mind.
+
+The powers are accessed using the 'm' key and then selecting 'Use Mindcraft';
+they are cast with spell points, like normal spells, which can be increased
+as usual through the *****skills.txt*21[Magic] skill.
+
+1. [[[[[sPrecognition] (Level 1) Cost:1
+ Detects monster minds around you.
+ At level 5 it also detects traps.
+ At level 15 it also allows you to see invisible monsters for a time.
+ At level 20 it maps out the surrounding area.
+ At level 25 it gives you ESP for a time.
+ At level 30 it also detects objects and treasure.
+ At level 45 it fully shows the entire level.
+2. [[[[[sNeural blast] (Level 2) Cost:1
+ Fires a bolt or beam, to stun and damage monsters.
+3. [[[[[sMinor Displacement] (Level 3) Cost:2
+ Teleports you a short distance.
+ At level 25 it grants the ability to create void jumpgates.
+4. [[[[[sMajor Displacement] (Level 7) Cost:6
+ Teleports you a good distance.
+ At level 30 it also banishes the monsters around you.
+5. [[[[[sDomination] (Level 9) Cost:7
+ Attempts to dominate the minds of your foes, scaring them.
+ At level 30 it attempts to charm monsters.
+6. [[[[[sPulverise] (Level 11) Cost:7
+ Fires pure sound at your opponents, crushing their bodies.
+7. [[[[[sCharacter Armour] (Level 13) Cost:12
+ Raises a physical shield around your body.
+ At level 15 it also grants resistance to acid.
+ At level 20 it also grants resistance to fire.
+ At level 25 it also grants resistance to cold.
+ At level 30 it also grants resistance to electricity.
+ At level 35 it also grants resistance to poison.
+8. [[[[[sPsychometry] (Level 15) Cost:12
+ Senses the quality of an item.
+ At level 40 it identifies an item.
+9. [[[[[sMindwave] (Level 18) Cost:10
+ Blasts the minds of monsters close to you.
+ At level 25 it affect all monsters in line of sight.
+10.[[[[[sAdrenaline Channeling] (Level 23) Cost:15
+ Heals you, hastes you and cures you.
+11.[[[[[sPsychic Drain] (Level 25) Cost:10
+ Drains the life of your foes into your mana reserves.
+12.[[[[[sTelekinesis] (Level 28) Cost:20
+ Projects a wave of pure telekinetic force from your body, damaging and maybe
+ banishing monsters.
diff --git a/lib/mods/theme/help/m_music.txt b/lib/mods/theme/help/m_music.txt
new file mode 100644
index 00000000..0f84f08f
--- /dev/null
+++ b/lib/mods/theme/help/m_music.txt
@@ -0,0 +1,77 @@
+|||||oy
+~~~~~01|Magic|Music
+~~~~~02|Music
+~~~~~03|Skills|Music - Song Info
+#####R === ToME Spells - Music ===
+
+Musical songs can have powerful effects for those who have the ability to
+play instruments, chiefly *****c_bard.txt*0[Bards].
+
+In order to continue playing a song, mana is consumed each turn, until
+either the 'Stop Singing' song is sung, or the player's mana runs out.
+
+Each song, as well as having a school level like any other magic spell, also
+has a roman numeral following its name. The higher this number, the greater the
+craftmanship of the instrument required to play it.
+
+Each musical instrument has a value assigned to it as well, between 1 and 4. The
+higher the number, the better the craftmanship; hence it will be possible
+for the bard to play higher level songs only with more powerful instruments.
+E.g. a Harp(+1) will allow you to cast "Stop Singing(I)" and "Song of the
+Sun(I)". A Harp(+2) would allow you to sing those songs, as well as "Flow of
+Life(II)".
+
+There are 3 different types of instruments: Harps, Drums and Horns. Each type
+of instrument contains a different family of musical songs:
+
+
+#####vMusical Songs
+
+#####GAll Instruments
+1. [[[[[vStop Singing(I)] (school level 1)
+ Stops the current song, if any.
+
+#####GDrums
+1. [[[[[vHolding Pattern(I)] (school level 1)
+ Slows down all monsters listening the song.
+ Consumes mana each turn.
+2. [[[[[vIllusion Pattern(II)] (school level 5)
+ Tries to confuse all monsters listening the song.
+ Consumes mana each turn.
+3. [[[[[vStun Pattern(IV)] (school level 10)
+ Stuns all monsters listening to the song.
+ Consumes mana each turn.
+
+#####GHarps
+1. [[[[[vSong of the Sun(I)] (School level 1)
+ Provides light as long as you sing.
+ Consumes mana each turn.
+2. [[[[[vFlow of Life(II)] (School level 5)
+ Heals you as long as you sing.
+ Consumes mana each turn.
+3. [[[[[vHeroic Ballad(II)] (School level 10)
+ Increases melee accuracy.
+ At level 10 it increases it even more and reduces armour a bit.
+ At level 20 it increases it still more.
+ At level 25 it grants protection against chaos and confusion.
+ Consumes mana each turn.
+4. [[[[[vHobbit Melodies(III)] (School level 20)
+ Greatly increases your reflexes allowing you to block more melee blows.
+ At level 15 it also makes you faster.
+ Consumes mana each turn.
+5. [[[[[vClairaudience(IV)] (School level 25)
+ Allows you to sense monster minds as long as you sing.
+ At level 10 it identifies all objects in a radius on the floor,
+ as well as probing monsters in that radius.
+ Consumes mana each turn.
+
+#####GHorns
+1. [[[[[vBlow(I)] (School level 4)
+ Produces a powerful, blowing sound all around you.
+2. [[[[[vGush of Wind (II)] (School level 14)
+ Produces a outgoing gush of wind that sends monsters away.
+3. [[[[[vHorns of Ylmir(III)] (School level 20)
+ Produces an earth-shaking sound.
+4. [[[[[vAmbarkanta(IV)] (School level 25)
+ Produces a reality-shaking sound that transports you to a nearly
+ identical reality.
diff --git a/lib/mods/theme/help/m_nature.txt b/lib/mods/theme/help/m_nature.txt
new file mode 100644
index 00000000..e57c5704
--- /dev/null
+++ b/lib/mods/theme/help/m_nature.txt
@@ -0,0 +1,54 @@
+|||||oy
+~~~~~01|Magic|Nature School
+~~~~~02|Nature Magic
+~~~~~03|Skills|Nature - Spell Info
+#####R === ToME Magic - Nature School ===
+
+The nature school of magic contains spells that interact with nature. There
+are rumours of a "Tome of the Tree" which contains all the nature school
+spells within its bindings.
+
+Worshipping Yavanna Kementari or Ulmo also gives the ability to cast spells
+from the nature school at a level of 1/2 of your prayer level. E.g. if the skill
+"Spirituality: Prayer" is at level 10, Yavanna and Ulmo worshippers alike can
+cast up to level 5 nature school spells.
+
+#####GNature Spells
+There are five spells available for the nature school. These spells are:
+1. [[[[[GGrow Trees] (dual school level 6)
+ Makes trees grow extremely quickly around you.
+#####v Your Nature and Temporal skills must have reached a combined average level
+#####v of 6 in order to cast this spell.
+2. [[[[[GHealing] (school level 10)
+ Heals a portion of your hitpoints.
+3. [[[[[GRecovery] (school level 15)
+ Reduces the length of time that you are poisoned.
+ At spell level 5 it cures poison and cuts.
+ At spell level 10 it restores drained stats.
+ At spell level 15 it restores lost experience.
+4. [[[[[GRegeneration] (school level 20)
+ Increases your body's regeneration rate.
+5. [[[[[GSummon Animal] (school level 25)
+ Summons a leveled animal to your aid.
+6. [[[[[GGrow Athelas] (school level 30)
+ Cures the Black Breath
+
+#####GAir spells that can be cast with Nature skill
+
+1. [[[[[BThunderstorm] (dual school level 25)
+ Charges up the air around you with electricity.
+ Each turn it will throw a bolt of thunder at a random monster in sight.
+ This thunder does 3 types of damage:
+ one third of lightning
+ one third of sound
+ and one third of light.
+#####v Your Nature and Air skills must have reached a combined average level
+#####v of 25 in order to cast this spell.
+
+#####GUdun spells that can be cast with Nature skill
+
+1. [[[[[DGenocide] (dual school level 25)
+ Genocides all monsters of a specified race on the level.
+ At level 10 it can genocide all monsters near you.
+#####v Your Nature and Udun skills must have reached a combined average level
+#####v of 25 in order to cast this spell.
diff --git a/lib/mods/theme/help/m_necrom.txt b/lib/mods/theme/help/m_necrom.txt
new file mode 100644
index 00000000..8de4fd37
--- /dev/null
+++ b/lib/mods/theme/help/m_necrom.txt
@@ -0,0 +1,35 @@
+|||||oy
+~~~~~01|Magic|Necromancy
+~~~~~02|Necromancy Magic
+~~~~~03|Skills|Necromancy - Spell Info
+#####R === ToME Magic - Necromancy ===
+The art of Necromancy is the foul practice of manipulating the life
+force of creatures.
+
+Necromancy powers are accessed using the 'm' key and then selecting
+'Use Necromancy'; they are cast with Spell Points, like normal spells,
+and do not need light to be performed.
+
+1. [[[[[DHorrify] (Level 1) Cost:2
+ Calls upon the dark forces and opens a channel into the mind of a
+ monster, stunning and scaring it.
+ At level 21 it affects all monsters in a beam.
+ At level 36 it affects all monsters in a ball.
+ At level 46 it affects all monsters in sight.
+2. [[[[[DRaise Dead] (Level 5) Cost:6
+ This power makes corpses in a small radius around the caster rise as
+ undead ego monsters at the service of the caster. The loyalty of those
+ monsters is not guaranteed, though. It also heals all monsters within the
+ same radius.
+3. [[[[[DNecromantic Teeth] (Level 12) Cost:20
+ This conjures up a temporary vampiric weapon.
+4. [[[[[DAbsorb Soul] (Level 20) Cost:10
+ This heals you by a substantial amount every time you kill a monster within
+ its duration. It is especially useful when your character is in
+ *****ability.txt*12[Undead Form].
+5. [[[[[DVampirism] (Level 30) Cost:15
+ Drains part of the life-force from a nearby monster and gives it to you.
+6. [[[[[DDeath] (Level 35) Cost:100
+ Yes, the name is not nice. Neither are the effects: the target dies
+ immediately, but so does your character (note that death is not such a great
+ annoyance for necromancers).
diff --git a/lib/mods/theme/help/m_symbio.txt b/lib/mods/theme/help/m_symbio.txt
new file mode 100644
index 00000000..b7e04632
--- /dev/null
+++ b/lib/mods/theme/help/m_symbio.txt
@@ -0,0 +1,50 @@
+|||||oy
+~~~~~01|Magic|Symbiosis
+~~~~~02|Symbiosis Magic
+~~~~~03|Skills|Symbiosis - Symbiotic Powers
+#####R === ToME Magic - Symbiosis ===
+
+Symbiosis is the art of joining body, fate and sometimes even mind with
+creatures not capable of moving on their own.
+
+While a humble student of the Craft of Slime (as it's sometimes called)
+has very few options apart from asking the symbiote to help him in combat,
+master practitioners have access to an incredible array of tricks.
+
+Once hypnotised, the monster is placed onto the body, or "worn", in order to
+initiate the symbiotic relationship.
+
+#####uSymbiotic Powers
+There are nine powers a symbiant can develop. They are:
+1. [[[[[uHypnotize] (level 1) Cost:1
+ The very basis of symbiosis itself, this asks a monster to lower its
+ natural defences so that it can be safely "worn".
+2. [[[[[uRelease] (level 1) Cost:1
+ Sometimes even life-long friends part. This power allows you to revert
+ a monster on the floor to its primal state, even though the shock of waking
+ up will lower it to 0 HP.
+3. [[[[[uCharm never-moving] (level 3) Cost:2
+ A symbiant soon learns to communicate with molds and slimes.
+ This power allows him to gain the "friendship" of such a creature.
+4. [[[[[uLife share] (level 5) Cost:5
+ The cells of the symbiant and the symbiote intermingle, spreading damage
+ evenly among the two organisms.
+5. [[[[[uUse minor powers] (level 10) Cost:10
+ Allows you to tap into minor magic abilities provided by your symbiote
+ such as Blink or Slow.
+6. [[[[[uHeal symbiote] (level 15) Cost:14
+ Consciously altering the metabolism of your symbiote, you can urge its
+ bodily structure to repair itself almost instantaneously.
+7. [[[[[uUse major powers] (level 25) Cost:30
+ Highly intelligent slimes such as Quylthulgs may be more than willing to
+ employ their summoning or teleporting powers on your behalf; this power
+ can also call upon the abilities normally invoked by "Use minor powers"
+ (but this would be a waste of mana).
+8. [[[[[uSummon never-moving pet] (level 30) Cost:35
+ By releasing certain chemicals in the air, a symbiant can attract the
+ attention of slimes and mold; the better specimens are found in deeper
+ dungeons, of course.
+9. [[[[[uForce symbiosis] (level 40) Cost:60
+ An expert symbiant has such control over the cells of primitive
+ life-forms that he can temporarily "charm" part of them, thus forcing
+ their powers to manifest at his own advantage.
diff --git a/lib/mods/theme/help/m_tempo.txt b/lib/mods/theme/help/m_tempo.txt
new file mode 100644
index 00000000..64340ee5
--- /dev/null
+++ b/lib/mods/theme/help/m_tempo.txt
@@ -0,0 +1,42 @@
+|||||oy
+~~~~~01|Magic|Temporal School
+~~~~~02|Temporal Magic
+~~~~~03|Skills|Temporal - Spell Info
+#####R === ToME Magic - Temporal School ===
+
+The temporal school of magic contains spells where magic is used to meddle
+in the relationship between time and space. There are rumours of a "Tome of
+the Time" which contains all the temporal school spells within its bindings.
+
+Worshipping Yavanna Kementari or Mandos also gives the ability to cast spells
+from the temporal school at a level of 1/6 or 1/4, respectively, of your prayer
+level. E.g. if the skill "Spirituality: Prayer" is at level 12, a worshipper
+of Yavanna can cast up to level 2 temporal school spells, whereas a worshipper
+of Mandos can cast up to level 3 temporal school spells.
+
+
+#####sTemporal Spells
+There are four spells available for the temporal school. These Spells are:
+1. [[[[[sMagelock] (school level 1)
+ Magically locks a door.
+ At spell level 30 it creates a glyph of warding.
+ At spell level 40 the glyph can be placed anywhere in the field of vision.
+2. [[[[[sSlow Monster] (school level 10)
+ Magically slows down the passing of time around a monster.
+ At level 20 it affects a zone.
+3. [[[[[sEssence of Speed] (school level 15)
+ Magically decreases the passing of time around you, allowing you to move
+ and act more quickly with respect to the rest of the universe.
+4. [[[[[sBanishment] (school level 30)
+ Disrupts the space/time continuum in your area and teleports all monsters
+ away.
+ At spell level 15 it also may lock them in a time bubble for some turns.
+#####v Your Temporal and Conveyance skills must have reached a combined average level
+#####v of 30 in order to cast this spell.
+
+#####GNature spells that can be cast with Temporal skill
+
+1. [[[[[GGrow Trees] (dual school level 6)
+ Makes trees grow extremely quickly around you.
+#####v Your Nature and Temporal skills must have reached a combined average level
+#####v of 6 in order to cast this spell.
diff --git a/lib/mods/theme/help/m_thaum.txt b/lib/mods/theme/help/m_thaum.txt
new file mode 100644
index 00000000..253d52be
--- /dev/null
+++ b/lib/mods/theme/help/m_thaum.txt
@@ -0,0 +1,31 @@
+|||||oy
+~~~~~01|Magic|Thaumaturgy
+~~~~~02|Thaumaturgical Magic
+~~~~~03|Skills|Thaumaturgy - Spell Info
+#####R === ToME Magic - Thaumaturgy ===
+
+Thaumaturgy is a different type of magic where the spells learnt are not
+restricted to one school, nor are they read out of spellbooks. Each time an
+adventurer increases her thaumaturgy skill, she gains access to a few
+[[[[[Rrandom] attack spells, each one automatically "learnt" at a specific
+casting level. Since she doesn't need spellbooks, she does not end up with
+inventory slots being filled up so quickly by the necessary items for safe
+exploration of the dungeon, and can therefore collect more loot.
+
+The downside of this is that she has no ability to choose what spells she
+learns, and no ability to improve the power of a learnt spell. So, a bolt
+spell with damage 1d5 will remain at 1d5 damage for the whole game. And the
+spells learnt are *all* attack spells of some sort (remembering that things
+like light and stone-to-mud can damage some monsters) - so no teleporting, no
+identify, no healing spells are learnt. At most, some wall creation may be
+employed.
+
+Thaumaturgist use their magic through the 'm' key. They then select a general
+group of spells, followed by a specific spell.
+
+Thaumaturgy spells can take the form of:
+- a bolt, targeted at a single location;
+- a beam, which hits all monsters in a line;
+- a ball (either centred on the caster or targetable);
+- an meteor strike (multiple balls in the vicinity of the caster);
+- a spell that affects all monsters in line of sight.
diff --git a/lib/mods/theme/help/m_udun.txt b/lib/mods/theme/help/m_udun.txt
new file mode 100644
index 00000000..a903d9f9
--- /dev/null
+++ b/lib/mods/theme/help/m_udun.txt
@@ -0,0 +1,35 @@
+|||||oy
+~~~~~01|Magic|Udun School
+~~~~~02|Udun Magic
+~~~~~03|Skills|Udun - Spell Info
+#####R === ToME Magic - Udun School ===
+
+The Udun school of magic contains spells where the corrupted forces of Melkor
+Bauglir are used to create the final spell effect. There are rumours of an
+"Unholy Tome of the Hellflame" which contains all the Udun school spells within
+its bindings.
+
+The Udun school is available only to worshippers of *****g_melkor.txt*0[Melkor Bauglir]. They will also
+need some proficiency in the magic schools of Mana, Nature, Conveyance, and Fire
+(or alternatively Sorcery) to cast the Udun spells. On the other hand, the spell
+power of Udun spells is greatly increased by the level of the caster.
+
+#####DUdun Spells
+There are four spells available for the Udun school. These spells are:
+1. [[[[[DDrain] (dual school level 1)
+ Drains the mana contained in wands, staves and rods to increase yours.
+#####v Your Udun and Mana skills must have reached a combined average level
+#####v of 1 in order to cast this spell.
+2. [[[[[DGenocide] (dual school level 25)
+ Genocides all monsters of a specified race on the level.
+ At level 10 it can genocide all monsters near you.
+#####v Your Udun and Nature skills must have reached a combined average level
+#####v of 25 in order to cast this spell.
+3. [[[[[DWraithform] (dual school level 30)
+ Turns you temporarily into an immaterial being.
+#####v Your Udun and Conveyance skills must have reached a combined average level
+#####v of 30 in order to cast this spell.
+4. [[[[[DFlame of Udun] (dual school level 35)
+ Turns you temporarily into a powerful Balrog.
+#####v Your Udun and Fire skills must have reached a combined average level
+#####v of 35 in order to cast this spell.
diff --git a/lib/mods/theme/help/m_water.txt b/lib/mods/theme/help/m_water.txt
new file mode 100644
index 00000000..2eb4cc5a
--- /dev/null
+++ b/lib/mods/theme/help/m_water.txt
@@ -0,0 +1,34 @@
+|||||oy
+~~~~~01|Magic|Water School
+~~~~~02|Water Magic
+~~~~~03|Skills|Water - Spell Info
+#####R === ToME Magic - Water School ===
+
+The water school of magic contains spells where the element of water is
+used to create the final spell effect. There are rumours of a "Tome of the
+Everrunning Wave" which contains all the water school spells within its
+bindings.
+
+Worshipping Yavanna Kementari or Ulmo also gives the ability to cast spells
+from the water school at a level of 1/2 or 3/5, respectively, of your prayer
+level. E.g. if the skill "Spirituality: Prayer" is at level 10, a Yavanna
+worshipper can cast up to level 5 water school spells, whereas an Ulmo
+worshipper can cast up to level 6 water school spells.
+
+#####bWater Spells
+There are four spells available for the water school. These Spells are:
+1. [[[[[bGeyser] (school level 1)
+ Shoots a geyser of water from your fingertips.
+ Sometimes it can blast through its first target.
+2. [[[[[bVapor] (school level 2)
+ Fills the air with toxic moisture to wash away annoying creatures.
+3. [[[[[bEnt's Potion] (school level 6)
+ Fills up your stomach (i.e. satisfy hunger).
+ At spell level 5 it emboldens your heart (boldness).
+ At level 12 it make you heroic.
+4. [[[[[bTidal Wave] (school level 16)
+ Summons a monstrous tidal wave that will expand and crush monsters under
+ its mighty waves.
+5. [[[[[bIce Storm] (school level 22)
+ Engulfs you in a storm of roaring cold that strikes your foes.
+ At spell level 10 it turns into shards of ice.
diff --git a/lib/mods/theme/help/macrofaq.txt b/lib/mods/theme/help/macrofaq.txt
new file mode 100644
index 00000000..97fad944
--- /dev/null
+++ b/lib/mods/theme/help/macrofaq.txt
@@ -0,0 +1,2360 @@
+|||||oy
+~~~~~43|Macros
+~~~~~44|Keymaps
+#####R======================================================================
+#####B ToME Macro FAQ
+
+ Original Angband Macro FAQ by Jim Lyon
+ (jplyon@attglobal.net)
+ 09-Dec-2000
+ Compiled from usenet postings to r.g.r.a
+ and Angband source & documentation
+
+#####B Edited by Dawnmist (angband@dawnmist.8m.com)
+#####B for PernAngband 5.x.x on 03-Aug-2001
+#####B with permission from Jim Lyon
+~~~~~30
+#####R======================================================================
+#####R1. Introduction
+#####R======================================================================
+
+#####G----------------------------------------------------------------------
+#####G1.1 About this FAQ
+#####G----------------------------------------------------------------------
+
+This FAQ is mean to be a companion to the standard ToME help files
+for using inscriptions, macros, and keymaps. The ToME help files
+which also describe them are listed in the "References" section.
+
+This documentation is for ToME, version 4.2.x.
+
+#####B==================================
+#####B SPOILER ALERT
+#####B==================================
+
+This document gives some information on how the game does or doesn't
+work that might be considered spoiling.
+(Most players advanced enough to use macros probably won't notice.)
+
+#####G----------------------------------------------------------------------
+#####G1.2 Table of contents
+#####G----------------------------------------------------------------------
+
+ *****macrofaq.txt*30[1. Introduction]
+ *****macrofaq.txt*5[2. Quick start tutorial]
+ *****macrofaq.txt*32[3. Overview]
+ *****macrofaq.txt*33[4. Common macros and techniques]
+ *****macrofaq.txt*34[5. Common questions]
+ *****macrofaq.txt*35[6. Common problems]
+ *****macrofaq.txt*36[7. Inscriptions added by the game]
+ *****macrofaq.txt*37[8. Keys and commands]
+ *****macrofaq.txt*38[9. Pref files]
+*****macrofaq.txt*39[10. Macro editing commands]
+*****macrofaq.txt*20[11. Advanced macro techniques]
+*****macrofaq.txt*41[12. Problems]
+*****macrofaq.txt*42[13. Miscellaneous]
+
+#####G----------------------------------------------------------------------
+#####G1.3 Notation
+#####G----------------------------------------------------------------------
+
+#####BSingle Quotes (')
+These are generally used to delimit a single character to be typed in.
+These shouldn't by typed in themselves.
+
+#####BDouble Quotes (")
+These are generally used to delimit a sequence of characters to be
+typed in. These shouldn't by typed in themselves.
+
+#####BParentheses ( )
+These are generally used for single-key Angband commands.
+
+#####BBraces { }
+These are used to enclose inscriptions. These aren't typed in as part
+of inscribing an item. They are added by the interface.
+
+#####G= Special Keys =
+#####G-----------------------------------
+The following abbreviations are used in this document. These keys may
+be named differently or missing on some keyboards. Some keys may be
+duplicated. These abbreviations shouldn't be typed in literally. For
+example, when F1 is encountered in a string of keys to press it means
+to press the F1 function key, not 'F','1', unless otherwise stated.
+Additional special keys may be listed later.
+
+Alt Alt
+Ctrl Control
+Del Delete
+Esc Escape
+Enter Enter / Return
+F1 Function key F1, ...
+Shift Shift
+
+#####G= System abbreviations =
+#####G-----------------------------------
+Each system that ToME compiles on has a semi-standard 3-letter
+abbreviation. These are commonly referred to in the source and docs
+using "xxx" as a "wildcard" standing for any one of them. In this
+document "***" is used instead because there are actual generic files
+not associated with any specific system that use "xxx". Sometimes this
+refers to a feature instead of a specific system: "xxx" is used for a
+generic / default file, and "new" is used for Adam Bolt's tiles.
+
+~~~~~5
+#####R======================================================================
+#####R2. Quick Start Tutorial
+#####R======================================================================
+
+This section is designed to get you quickly using the most common
+keymaps and macros. Later sections explain the techniques used in more
+detail. These examples may not be the "best" ones to use in real play.
+
+#####G----------------------------------------------------------------------
+#####G2.0 Definitions
+#####G----------------------------------------------------------------------
+
+First, you should know some fundamental terms:
+
+Actions are sequences of keypresses that the game can recognise. They
+can't be recorded by the game, but must be input manually.
+
+Macros and keymaps map a keypress to an action. They can be used to
+customise the keyboard, reduce typing, and speed up game play. Macros
+must be used when the trigger key doesn't have a system-independent
+representation. Keymap actions can only contain underlying commands.
+[[[[[BMost customisation should be done with keymaps instead of macros when]
+[[[[[Bthere is a choice.]
+
+Inscriptions are "markings" which you can put on any game item. One
+use is to label items in a way that doesn't depend on inventory
+position. Another allows verifying the selection of an item. Under the
+right conditions they can save your life.
+
+#####G----------------------------------------------------------------------
+#####G2.1 Swap weapons
+#####G----------------------------------------------------------------------
+
+First inscribe your main weapon:
+(Press the following keys in sequence)
+
+1) { Inscribe an object
+2) * Show inventory list
+3) / Switch to equipment list
+4) a Main weapon slot
+5) @w0 Wield when object 0 is chosen
+6) (Hit Enter)
+
+Now inscribe the second weapon:
+
+1) { Inscribe an object
+2) * Show inventory list
+3) (Choose letter of second weapon)
+4) @w0 Wield when object 0 is chosen
+5) (Hit Enter)
+
+Finally, ToME (unlike standard 'Vanilla' Angband) does
+not have an automatic trigger key to swap items, so it must be
+created. Select a key that is not being used for any other commands
+('X' in the normal keyset is free - see *****command.txt*0[command.txt]), and create
+the following keymap:
+
+1) @ Interact with macros
+2) 8 Create a keymap
+3) X The trigger key for the keymap
+4) w0 Wield object 0
+5) (Hit Enter)
+6) (Hit Esc to exit the editor)
+
+Now to swap weapons, just press the trigger key 'X' which is bound to
+the default keymap "w0". You may also press "w0" directly to swap.
+~~~~~45|Macros|Macro recorder
+~~~~~46|Keymaps|Macro recorder
+#####G----------------------------------------------------------------------
+#####G2.2 Using the macro-recorder
+#####G----------------------------------------------------------------------
+
+You may find all the key-presses involved in ToME a long and time-consuming way
+to play the game. There are ways to speed up repeated commands by assigning
+them to a trigger key which can help. These are called macros or keymaps.
+
+The most obvious use for these in ToME is for mage-types, especially sorcerors,
+who rely on their spells for just about everything. Typing mbaa*t in order to
+fire a Manathrust is fine if you only have to do it once or twice, but can
+quickly get annoying when you're doing it every move. Far easier to assign that
+sequence of keypresses to a single trigger key which you can then press as many
+times as you need. (Until your SP run out of course!)
+
+The easiest way to assign a macro is to use the macro-recorder. Start this by
+hitting the '$' key. You'll then receive a message telling you that the macro
+recorder has now started and you will need to press the '$' key a second time
+to stop the recorder. Preparation is all important here. It is best to be in a
+situation where you really NEED to cast the spell before recording the macro,
+so you use all the correct casting techniques and the game behaves as it would
+in a real (combat) situation (if the spell is to be generally cast in combat).
+
+So assuming we're going to create a macro for manathrust. We've walked into a
+room and there's a nasty small kobold. What do we do?
+
+1) $ Start macro recorder
+2) *t target monster (or player if no monster in Line of sight)
+3) m open skills menu
+4) @ enters verbose mode
+5) Cast a Spell selects skill to use - CASE SENSITIVE
+6) @ enters verbose mode
+7) Manathrust casts spell from any book/spell container - CASE SENSITIVE
+8) $ end macro recorder
+9) y confirms macro keystrokes[[[[[B*]
+10) (choose trigger key)
+11) @ opens macro saving/loading screen
+12) 2 appends macros to a file
+13) (choose a name for the file, e.g. sorceror.prf)
+14) (Hit Enter)
+15) (Hit Esc to exit the editor)
+
+This will search for the spell in all your books and equipment. If it is found,
+in either a book or a wielded item that contains a spell, then the spell is
+cast at the targetted monster.
+
+This technique can be used for all the other skills as well (Use Mindcraft,
+Forge Ammo) etc.
+
+[[[[[B*]If you answer no the recorder continues recording keypresses. If
+you know you have made a mistake, you need to answer yes, and then not
+save the macro!
+
+~~~~~12
+#####G----------------------------------------------------------------------
+#####G2.3 Prevent unwanted use of an item
+#####G----------------------------------------------------------------------
+
+#####BPrevent "losing" an item by "accident":
+
+1) { Inscribe an object
+2) * Show inventory list
+3) (Choose an item)
+4) !d!k!v
+ !d - don't drop (d)
+ !k - don't destroy (k)
+ !v - don't throw (v)
+5) (Hit Enter)
+
+This prevents dropping, destroying, or throwing the item. You will be
+asked if you really want to do so. This is one of the most common
+inscriptions used, and one of the most useful.
+
+#####BPrevent "using" an item at all:
+
+1) { Inscribe an object
+2) * Show inventory list
+3) (Choose an item)
+4) !* Don't do anything with this item without verifying
+5) (Hit Enter)
+
+This inscription is commonly used on Scrolls of Word of Recall...
+~~~~~8
+#####G----------------------------------------------------------------------
+#####G2.4 Saving these macros and keymaps for reuse
+#####G----------------------------------------------------------------------
+
+Save the macros and keymaps for reuse by the current character:
+
+1) @ Interact with macros
+2) 2 Append macros to a file
+ (optionally enter a filename: e.g. dump.prf or dump.txt)
+ (Hit Enter to save the file with the filename shown)
+3) 6 Append keymaps to a file
+ (Hit Enter to save the file with the filename shown)
+4) (Hit Esc to exit the editor)
+
+This pref file will be automatically loaded any time a character with
+a name, race, or class matching the filename is loaded.
+
+The "Append macros/keymaps to a file" commands will append ALL current
+macros/keymaps to the given file. They will not overwrite the file.
+
+You should edit the file to remove macros that weren't added by you,
+to reduce clutter and prevent errors. Unfortunately the best way to do
+this is still "by hand". Open up the pref file in a text editor and
+remove the duplicate macros and keymaps added. These will be added
+after the headers "# Automatic macro dump" and "# Automatic keymap
+dump". The ones you added will be the very last ones in the list. The
+others are the entire set of keymaps and macros from all other prefs
+loaded. (This step isn't necessary, but is very helpful.)
+
+~~~~~32
+#####R======================================================================
+#####R3. Overview
+#####R======================================================================
+
+#####G----------------------------------------------------------------------
+#####G3.1 Inscriptions
+#####G----------------------------------------------------------------------
+
+Inscriptions are "markings" which you can inscribe on any game item.
+
+One common use is recording where you got one of your favorite items.
+Example: The Broad Sword 'Glamdring' (2d5) (+10,+15) {icky thing, 50'!}
+
+Another is to note important resists or activations on an item to make
+figuring out resist combinations easier.
+Example: The Nice Shiny Armor (-3) [35,+25] {resDk,resDis,A:Geno}
+
+Inscriptions can "number" an item so that you don't have to know where
+it is in your inventory.
+Example: inscribing your scrolls {@r1} lets you use '1' at the prompt
+for which scroll to read, instead of having to use the inventory letter,
+which can change unnoticed.
+
+Number inscriptions work together with macros to allow reproducible
+labeling of items independent of inventory position.
+
+Note that the game produces "fake" inscriptions, which look like real
+inscriptions, but are really just displayed the same way (e.g. "cursed").
+
+Finally, if you are in symbiosis with another creature, you can name it by
+inscribing it with "#named SomeName" (the word "#named" must be entered
+literally at the start of the inscription). This will tell the game that
+your symbiotic partner should be referred to by its name, rather than simply
+"Your white jelly". This has no effect on game play other than the aesthetic.
+
+#####G----------------------------------------------------------------------
+#####G3.2 Macros
+#####G----------------------------------------------------------------------
+
+Macros are mappings from a single "logical" keypress to a sequence of
+keypresses, allowing you to use special keys on the keyboard, such as
+function keys or keypad keys, possibly in conjunction with modifier
+keys, to "automate" repetitive multi-key commands that you use a lot.
+
+[[[[[BFor keys which don't have a system-independent representation, such as]
+[[[[[Bfunction keys, this is the only way to change their behavior.]
+
+#####G----------------------------------------------------------------------
+#####G3.3 Keymaps
+#####G----------------------------------------------------------------------
+
+Keymaps are vaguely related to macros. A keymap maps a single keypress
+to a series of keypresses, which bypass both other keymaps and any
+macros. Angband uses keymaps to map the original and the roguelike
+keysets to the underlying command set, and allows the user to modify or
+add keymaps of their own. All keymap actions must be specified using
+underlying commands. Keymaps and macros aren't expanded. The original
+keyset is almost identical to the underlying keyset, except that
+"numbers" are mapped to ";" plus a direction, "5" is mapped to ",",
+and a few control-keys are mapped to various things. See *****command.txt*0[command.txt]
+for the full set of underlying commands. Keymaps also allow the
+"disabling" of a command by mapping it to "\x00".
+
+#####G----------------------------------------------------------------------
+#####G3.4 Pref files
+#####G----------------------------------------------------------------------
+
+Preference files save commands such as macros and keymaps which are
+used to customise the game. They are used to implement the "original"
+and "roguelike" keysets. They provide default appearances for items.
+
+They also implement the default behaviors which make Angband look and
+play the same (for the most part) on different systems.
+
+Pref files can be saved with the name of a player name, class, and
+race, and anytime a player with a matching characteristic is loaded,
+the appropriate pref file is loaded. This makes some customisations
+transparent and automatic.
+
+Pref files let you do some things that could otherwise only reasonably
+be done by changing the info files or source, such as changing the
+appearance of a given terrain feature, or the symbol used for the
+player.
+
+Pref files let you set up and save your favorite game options, and
+have them available for new characters without having to redo them.
+
+~~~~~33
+#####R======================================================================
+#####R4. Common macros and techniques
+#####R======================================================================
+~~~~~13
+#####G----------------------------------------------------------------------
+#####G4.1 Clearing the command buffer
+#####G----------------------------------------------------------------------
+
+[[[[[v++++++++++ This is one of the most important techniques! ++++++++++]
+
+Almost all action strings should begin with a sequence to clear the
+buffer of existing commands and messages. These sequences are often
+omitted in usenet postings and in this FAQ because they clutter the
+description, but they should almost always be used.
+
+If an unfinished command is still waiting for input when you press the
+trigger key of a macro or keymap, the characters of its action string
+will be taken as input for the command. The command will ignore keys
+it doesn't know how to handle until it finds one that it does. This
+often leads to something completely unexpected, with embarrassing
+results such as your death, or losing a really nifty item.
+
+If there are still messages waiting, the first characters in the
+action will instead just clear the waiting messages. How this happens
+depends on whether the *****option.txt*1[option (quick_messages)] is set. Then the action
+will start executing in the middle of its action string, with equally
+dangerous results as in the above case. Note that some messages caused
+by a command are quite rare, and others could be produced by a game
+state change like becoming hungry that has nothing to do with the command.
+
+These types of problems are more common when using an action such as
+auto-firing where a trigger key is repeatedly pressed.
+
+[[[[[B"\e\e\e"]
+Multiple escapes are used to clear the command buffer. Escape cancels
+any command/input still being processed, and also clears a [single]
+message whether/not the (quick_messages) option is set. This string
+should be used to begin all action strings. It is also wise to put it
+between actions in multi-action macros. Note that this technique can
+also be dangerous, hiding warnings or important information.
+Example: an action like "*tf1" would be changed to "\e\e\e*tf1".
+
+There are a few situations in which you do not want to use escapes.
+For example, after the spell Detect Monsters, an escape will clear the
+detection. Or if the action is part of a multi-part action or is meant
+to wait for user input such as the firing action "f1" which will wait
+for targeting information.
+
+[[[[[B"\s\s\s"]
+Spaces are useful for clearing messages, but won't cancel a command
+that is waiting for an item choice. Sometimes it is useful to split
+an action into two parts and bind them to two separate trigger keys.
+Prefixing spaces before the 2nd action will discard any remaining
+messages without canceling unfinished commands from the 1st one. Some
+players create a macro consisting of a large number of spaces to be
+used to clear a flood of messages.
+
+See sections:
+- *****macrofaq.txt*1["Messages and Questions"] for how to deal with them.
+- *****macrofaq.txt*2["My macro outputs "e - Floating Eye"..."] for an example of a common
+ mistake using escape sequences.
+- *****macrofaq.txt*3["My macro drops/takes off my main weapon!"] for an example of the
+ kind of thing that can go wrong when you fail to use them.
+- *****macrofaq.txt*4["What just killed me?"] for an example of skipping over messages
+ *too* fast.
+
+#####G----------------------------------------------------------------------
+#####G4.2 Swap weapons
+#####G----------------------------------------------------------------------
+
+If you followed the *****macrofaq.txt*5[Quick-Start Tutorial] in Section 2.1, the 'X' key has
+the keymapping "w0", which will wield the first item inscribed as "@0"
+or "@w0". This will swap between 2 weapons which are both inscribed with
+{@0} or {@w0}. If there is more than one item in the inventory inscribed
+as 0, it will use the first one.
+
+This will also work for other wieldable items. For example, if you
+have a helm which gives telepathy, which can be a real pain when you
+need to rest, it can be used to swap it with another helm.
+
+Inscribing weapons with {@w1@w0}, {@w2@w0} allows directly wielding a
+specific one. If you don't want that ability, you can just inscribe
+both with {@w0}. These can also be inscribed as just {@1@0} and {@2@0}
+if you don't inscribe any other items with numbers, although this is
+not recommended.
+
+
+#####G----------------------------------------------------------------------
+#####G4.3 Resting
+#####G----------------------------------------------------------------------
+
+#####B= Rest as needed =
+"R&\r"
+R - rest
+& - until 100% healthy
+\r - return.
+
+Note that this isn't particularly dangerous, because the game will
+break out of the resting command if you are disturbed by hunger,
+sensing a monster, ...
+
+#####B= Rest for a specific duration =
+"R100\r"
+R - rest
+100 - turn count
+\r - return
+
+This version is useful if you are already healed up. For fighter
+pseudo-id, for example. Also useful for recovering a fixed amount of
+mana before/after a spell, waiting for a Recall spell to kick in,...
+
+Note that this is one of the few times when you can directly enter the
+count after the command. Usually you need to enter the count before
+the command, using the (0) count command.
+
+#####B= Maximum Rest =
+"R9999\r"
+
+The maximum number of turns you can use as an argument. This can be
+useful when waiting for shop inventory to change, etc. Be sure to take
+off any non-permanent light source, and have plenty of food when you
+rest for long periods of time.
+
+#####G----------------------------------------------------------------------
+#####G4.4 Activate the phial
+#####G----------------------------------------------------------------------
+
+"Am\s\s"
+A - Activate
+m - light source (the phial).
+\s - skip message
+\s - skip message
+
+"Am\s\sR50\r"
+Activate the phial and rest for 50 turns.
+
+This can be bound to 'F' key since you won't need to refuel lanterns
+much after you have the phial :).
+
+#####G----------------------------------------------------------------------
+#####G4.5 Kill item(s) on floor
+#####G----------------------------------------------------------------------
+
+The need to destroy large numbers of items arises as one reaches
+deeper levels of the dungeon. The auto-squelch feature only partially
+reduces the need for this. The behavior of these actions is affected
+by the option (quick_messages), and the possible presence of a pile of
+items on the floor.
+
+*****option.txt*1[(quick_messages)] allows any key to cancel a message.
+
+In ToME, multiple items on the floor are displayed in a list.
+This allows the player to select an item from the floor by entering an
+item index when there is a pile (more than one item). This generally
+complicates writing these macros.
+
+Note that space '\s' is used to clear messages in the action strings,
+but one could use escape '\e' just as well.
+
+Note: you cannot destroy artifacts, so these macros are safer and more
+useful than they might first appear. The (k) Destroy item command will
+fail when trying to destroy an artifact, leaving any following
+characters in the action string, which may be interpreted differently
+than anticipated.
+
+[[[[[B"k-yy"]
+k - Kill item
+- - Select item from floor
+y - "yes" to query "Really destroy a <item>?"
+y - skip the "you destroy the <item>" message.
+
+This version only works when (quick_messages) option is on. Here the
+last 'y' key gets rid of the last message, since any key will. This
+won't work for piles. The 'y' will be ignored as an invalid item choice.
+
+[[[[[B"k-y\s"]
+k - Kill item
+- - Select item from floor
+y - "yes" to query "Really destroy a <item>?"
+\s - skip the "you destroy the <item>" message.
+
+This version works as above, but also when (quick_messages) is off.
+
+[[[[[B"0k-y\s"]
+0 - enter count (causes to skip prompt for how many to destroy)
+k - Kill item
+- - Select item from floor
+\s - skip the "you destroy the <item>" message.
+
+Destroy a single item on floor below you. Doesn't prompt for a count.
+This won't work for piles, which will prompt you for the item. Works
+correctly when (quick_messages) is off, because there is no prompt
+for how many to destroy.
+
+[[[[[B"0k-ay\e"]
+0 - enter count (causes to skip prompt for how many to destroy)
+k - Kill item
+- - Select item from floor
+a - either item 'a', or ignored
+\e - escape (ignored), or cancel message
+
+Destroy a single item on floor below you. Doesn't ask to confirm.
+[[[[[vWARNING:] This action can destroy the first item in your inventory if
+there aren't any items on the floor below you!
+
+The leading '0' causes a prompt for a count to be skipped. If there is
+a pile, the 'a' key will select the top item in the pile. If not, the
+'a' will aim a wand, the following 'y' will be ignored, and the final
+escape will cancel the aiming.
+
+[[[[[B"0k-yay\e"]
+0 - enter count (causes to skip prompt for how many to destroy)
+k - Kill item
+- - Select item from floor
+y - "yes" to query "Really destroy a <item>?", or ignored.
+a - top item (a) in a pile, or activate wand.
+y - "yes" to query "Really destroy a <item>?" (for piles).
+\e - skip the "you destroy the <item>" message.
+
+The above action will work in most cases. This version works correctly
+for piles. If there is a pile, the 'y' is ignored and the 'a' selects
+the top item. If there isn't a pile, then the 'y' will correctly answer
+the yes/no question "Really destroy a <item>?", and the following "ay"
+will aim a rod, and then ignore the 'y' key press, and the final escape
+will cancel the aiming. Works correctly when (quick_messages) is off.
+When (quick_messages) is on, and there is no pile, the 'a' will cancel
+the message, and the following 'y' will be passed through as an
+unimplemented command, and the space will cancel the error message.
+
+Backslashes "\\" may be required to keep the 'y's from being
+interpreted as keymaps in case 'y' has been assigned one.
+
+#####G----------------------------------------------------------------------
+#####G4.6 Fire missile at nearest target
+#####G----------------------------------------------------------------------
+
+Each of these needs "\e\e\e\e" afterwards to cancel up to 4 possible
+messages. The first message will always occur. Note that adding too
+many escapes can cause you to miss the messages in which the monster
+fights back.
+- "You have NN <ammo> left. -more-"
+- "The <ammo> hits the <monster>. -more-"
+- "It was a <adj> hit! The monster ... -more-"
+- "The <monster> dies/grunts with pain/..."
+
+[[[[[B"f*t"]
+f - fire ammo from quiver slot
+* - target
+t - select first target
+
+Note that targeting is affected by the option (*****option.txt*4[use_old_target]). If
+this action is used with the (use_old_target) option set, the "f"
+part will fire the missile before the targeting part "*t" is reached.
+See section *****macrofaq.txt*6["My auto-firing macro shoots the wrong target!"].
+
+[[[[[B"*tf"]
+*t - select first target
+f - fire ammo from quiver slot
+
+If (use_old_target) is on, this works correctly, by selecting the
+target before firing. If the option is off, it will still prompt you
+to select a target, even though you just selected one.
+
+[[[[[B"*tf*t"]
+*t - select first target
+f - fire ammo from quiver slot
+*t - select first target
+
+This works correctly for (use_old_target) either on/off. If the option
+is on, this works by selecting the target before firing. If the option
+is off, the first target selection will be ignored, and firing will
+wait on the second target selection.
+
+Note that if there are no valid targets, "*t" will select the player's
+current position. Also, it is fairly easy to make safe assumptions
+about the (use_old_target) option, since a player doesn't tend to
+change back and forth. It is generally easier to make one set of
+actions that work for (use_old_target) on, and another for it off.
+
+Note also that the swapping weapon macro can be very useful for swapping
+the type of ammo in the quiver slot when you have two different sets of
+ammo you use - your standard "fire at everyone normal" ammo (usually
+not enchanted), and your big damage "Uniques and nasty monster"
+enchanted ammo.
+
+#####G----------------------------------------------------------------------
+#####G4.7 Preventing actions
+#####G----------------------------------------------------------------------
+
+#####B= Prevent selling =
+{!d}
+Prevent selling - use on main weapon, artifacts.
+
+#####B= Prevent going up/down =
+{^<}
+Verify before going up stairs.
+{^>}
+Inscribe boots to make confirm before going down stairs.
+This can also be useful on Charisma boosting items that you wear
+around town but don't want to take into the dungeon.
+{^>^r^z^m^p}
+Prevent leaving town with this item. Need to catch stairs, scrolls and
+rods of Recall, and Mage and Priest Word of Recall spells.
+
+#####G----------------------------------------------------------------------
+#####G4.8 Warrior macros and inscriptions
+#####G----------------------------------------------------------------------
+
+#####B= Identify with list =
+Inscribe Identify scrolls {@r0}.
+Then action "r0*" will cast Identify and bring up the inventory list.
+
+#####B= Identify floor =
+"r0-" will Identify without showing the inventory.
+
+#####G----------------------------------------------------------------------
+#####G4.9 Verification techniques
+#####G----------------------------------------------------------------------
+
+#####B= Verify All =
+{!*}
+verify any attempt to use this item. Useful for some things such as
+Scrolls/rods of Recall that you don't want to lose or use by accident.
+
+#####B= Verify drop, destroy, throw =
+{!d!k!v}
+don't drop, destroy, or throw this item. Prevents dropping your
+favorite weapon,... This is one of the most useful inscriptions, as it
+prevents the kind of typing accidents that can get you killed.
+
+#####B= Verify selling =
+{!d}
+Prevents selling as well as dropping.
+
+#####B= Multiple verification =
+These inscriptions can be repeated. So {!*!*} will make you confirm
+twice for any action using that item.
+
+#####G----------------------------------------------------------------------
+#####G4.10 Canceling targeting
+#####G----------------------------------------------------------------------
+
+[[[[[B"*\e\s"]
+* - start targeting
+\e - cancel targeting.
+\s - skip message "Target Aborted."
+
+OR
+
+[[[[[B"*q\r"]
+* - start targeting
+q - cancels targeting.
+\r - skip message "Target Aborted."
+
+This is useful before casting Stone to Mud, or a ball spell. For ball
+spells you usually want to target the middle of a pack, or sometimes
+to "miss" the creature in order to get the ball to detonate on a
+nearby wall.
+
+Using a targeted action after this will cause the user to be prompted
+for a target.
+
+Canceling targeting is made necessary by the existence of the option
+(use_last_target), which causes an action which requires a target to
+use the last target without prompting. See section
+*****macrofaq.txt*6["My auto-firing macro shoots the wrong target!"] for more on this.
+~~~~~15
+#####G----------------------------------------------------------------------
+#####G4.11 Automatically loading pref files
+#####G----------------------------------------------------------------------
+
+Angband automatically loads pref files when a character is loaded or
+born. Among the last ones loaded are: "<$RACE>.prf", "<$CLASS>.prf",
+and "<$PLAYER>.prf", in that order. These are the best ones to use to
+customise the game for individuals. The order is important because
+pref files which load later will overwrite options and macros/keymaps
+from previous ones.
+
+Here <$RACE> is the name of the character's race, <$CLASS> is the name
+of its class, and <$PLAYER> is the character's name. Both <$RACE> and
+<$CLASS> have a fixed number of choices. These are listed for ToME
+in section *****macrofaq.txt*7["Pref file loading order"].
+
+Your character's name is the one that appears during game play in the
+upper left hand corner of the screen. If it isn't visible there, you
+can use the (C) Character description command. Note that this name may
+be different than the filename of the character's save file.
+
+Filenames for the save and pref files are built from a "base name",
+which is the player name with all non-alphanumeric characters changed
+to underscores (_). On Windows and DOS systems the base name will also
+be truncated to 8 characters. This could lead to different characters
+having the same (default) pref files.
+Example: "Grog the Elder" and "Grog the Younger" would both try to
+load the same pref file "Grog_the.prf".
+
+In recent versions of ToME "<$PLAYER>.prf" is the default filename
+when saving your macros and keymaps from the (@) Interact with macros
+screen. Just hit Enter to accept that name.
+
+On some systems you may encounter problems automatically loading this
+file if your name is more than 8 characters, or if it contains spaces
+or special characters.
+
+See section *****macrofaq.txt*8["Saving these macros and keymaps for reuse"] for how to
+save your character's preferences.
+
+See section *****macrofaq.txt*7["Pref file loading order"] for the full list of pref files
+loaded and their order.
+
+Note: for pref files to load automatically they must end in the file
+extension "prf", which is the default when saving pref files. But it
+is possible to save and load pref files with any or no file extension,
+from the macros and visuals editor screens.
+
+#####G----------------------------------------------------------------------
+#####G4.12 Multiple macros bound to one trigger key
+#####G----------------------------------------------------------------------
+
+Angband supports using modifier keys on trigger keys. One thing this
+lets you do is easily choose between variants of an action. Another is
+to minimise the amount of moving your hands have to do, speeding up
+play and reducing stress on your wrists.
+
+[[[[[BYou can bind multiple versions of the same macro to the same trigger]
+[[[[[Bkey, using Alt, Control, Shift in different combinations] to choose
+among the different versions.
+Example: use <Alt> for targeted, and <Shift> for non-targeted.
+
+Another use is to heavily use modifiers on numeric keypad keys. The
+standard version already comes with Shift-<digit> bound to running in
+that direction. But by using various combinations of modifier keys, it
+is possibly to play with the right hand almost always on the numeric
+keypad, and the left on the modifier keys.
+
+#####G----------------------------------------------------------------------
+#####G4.13 Multi-part actions
+#####G----------------------------------------------------------------------
+
+Better to only do this when spells have ~0% failure.
+Be careful of the order of commands. Commands that leave useful info
+on the screen shouldn't be followed by ones that will clear it.
+Be careful of commands that set or clear targets.
+Use "\e\e\e\e" in-between commands to be safe.
+
+#####G----------------------------------------------------------------------
+#####G4.14 Easy running
+#####G----------------------------------------------------------------------
+
+Bind Shift+<keypad dir> to running for each of the directions.
+For example, running "North":
+
+1) @ Interact with macros
+2) 4 Create a macro
+3) Shift+8 (Trigger key for the macro)
+4) \\. Run
+ 8 "North"
+5) (Hit Enter)
+6) (Hit Esc to exit the editor)
+
+Macros for the other directions are added similarly. Remember that the
+original and roguelike keysets differ, but using the backslashes makes
+sure that the "underlying" keyset gets used:
+ 7 8 9
+ 4 6
+ 1 2 3
+
+These macros are already in the "pref-***.prf" files that ship with
+the standard Angband distribution for some systems, but not all.
+Systems "mac", "win", "x11" have them. If you aren't sure if you have
+them, just try moving in any direction with the shift key down.
+
+[[[[[BThese do have to be macros instead of keymaps], because they rely on
+keypad keys having different scan codes than the top-row number keys.
+
+There are also default macros for Ctrl+<dir> which applies the command
+(+) Alter to that direction.
+
+#####G----------------------------------------------------------------------
+#####G4.15 Farming techniques
+#####G----------------------------------------------------------------------
+
+#####v+++ NOTE: This is considered scumming! (cheating) +++
+
+Farming is the practice of automatically "harvesting" large numbers of
+weaker monsters for their experience value. This is usually done to
+advance a lower level character. There are apparently several methods
+that the "old timers" used to use. I don't know that farming is that
+popular any more. Even then it was sort of a lark.
+
+Apparently a golf ball is just the right size and weight for many
+keyboards to hold a key down and get it to auto repeat. Then you walk
+away, and the next morning you have gained several levels. Ballpoint
+pen caps are also supposed to be good at wedging a key down.
+
+Using a farming macro for long periods of time like this requires a
+way of getting food, so it really needs to be employed by a magic user
+who can create their own food.
+
+Use turn counts with attack (move) commands to move around the room,
+mowing down creatures as you move. Periodically rest enough to
+regenerate to full mana. This may not be necessary if it takes long
+enough to kill the monsters as you move.
+
+This requires an effective macro and a room full of breeders which
+can't attack for enough damage to kill you. Farming for short periods
+of time with a fighter class is quite feasible. The limitation for
+fighters is food. The limitation for spell casters is probably hit
+points. You may also need to insert action sequences for healing if
+the farmed monsters are capable of significantly damaging you.
+
+Note that red and green worm masses can knock down the doors of the
+room you're in. Blues can destroy potions and flasks, so you will need
+to stash your potions outside somewhere before farming.
+~~~~~10
+#####G----------------------------------------------------------------------
+#####G4.16 Macros can contain their own trigger key
+#####G----------------------------------------------------------------------
+
+It is permissible to make a macro or keymap which contains its own key
+in its action. It won't cause recursion, but there are a few wrinkles.
+
+Example: you can bind "*tf1" to the 'f' key, to cause it to auto-fire
+at the nearest target. You can still use the 'f' key for Fire in other
+macros or keymaps.
+
+If you bound 'f' as a keymap you will need to use "\\f" for Fire when
+it is used in a macro action string. You don't need to do anything
+special to use it in a keymap in its usual sense. Keymap and macro
+expansion isn't done inside keymap action strings.
+
+If you bound 'f' as a macro, the problem will be in entering the new
+macro or keymap in the editor. When you try to press an 'f' key for
+the action, it will expand to "*tf1", even when you don't want it to.
+You will first have to remove the macro bound to 'f', then add the
+macro or keymap that uses 'f' in its action, and then reenter the 'f'
+macro. You can also create the macro in a pref file and load it using
+the "Load pref file" command in the (@) Interact with macros screen.
+
+#####G----------------------------------------------------------------------
+#####G4.17 Changing the player's color and character (ASCII text display)
+#####G----------------------------------------------------------------------
+
+#####B= Using the Visuals Editor =
+1) % Interact with visuals.
+2) 6 Change monster attr/chars
+3) a (repeatedly) cycle thru colors (A moves backwards)
+4) c (repeatedly) cycle thru characters (C moves backwards)
+5) Esc accept changes
+6) Esc exit the editor
+
+#####B= Using the Enter User Pref command =
+1) " Enter user pref line
+2) "R:0:<attr>:<char>"
+ The user pref line.
+ <attr> - the attr (color) specified as an integer index.
+ <char> - the (ASCII) character specified as an integer.
+3) (Hit Enter)
+
+You can't directly use the Angband attr letters to specify colors, but
+must instead use their index. Eg 4 is Red. These indexes can be found
+from within the game using the (&) Interact with colors command. That
+editor also allows you to change the colors used by the game.
+
+The <char> integer is generally the index of an (ASCII) character.
+Non-ASCII characters may be available on some systems. Available
+characters can found using the (%) Interact with visuals command.
+
+These integers can be specified in decimal, hexadecimal, or octal
+notation. Decimal is the default, hexadecimal numbers are prefixed
+with "0x", and octal numbers are prefixed with 0 (zero). Example: the
+standard character for the player is '@'. This may be entered as "64",
+"0x40", or "0100". Yellow may be entered as "11", "0x0B", or "013".
+
+This pref line can be added to any pref file to save the change for
+future reuse. Changes made using the internal colors editor screen can
+be dumped from that screen. Note that colors and characters saved in
+pref dumps are in hexadecimal.
+
+After making a change, you must move the character or otherwise cause
+a screen redraw for the change to be visible.
+
+If you make a mistake, you can use the (0) command in the editor to
+reset the visuals to their original colors and characters.
+
+#####B= Changing Using the Monster Info file =
+#####B----------------------------------------
+
+This may also be done by changing the entry for the player in the info
+file "r_info.txt". The player data starts with line "N:0:Player". In
+the following line G:<c>:<a> the character <c> is entered directly,
+and the attr (color) is specified by letter. See the section "Message
+color lines" for the list of standard colors. In many versions you
+will have to delete the file "lib\data\r_info.raw" and restart the
+game for this change to take effect. Note that that char/attr pair is
+entered in the opposite order as for an R: user pref line.
+
+#####B= Options which Change Player appearance =
+#####B------------------------------------------
+
+These are accessible through the (=) Set options command.
+
+*****option.txt*2[(hilite_player)] -- causes the player's symbol to be drawn with the
+"cursor" on it. It will be drawn with the same color as the character.
+
+*****option.txt*3[(player_symbols)] -- for graphics mode only, and only works when option
+(use_graphics) is also on. This apparently varies the player graphic
+and its color based on class, race, and sex.
+
+#####G----------------------------------------------------------------------
+#####G4.18 Recharging a rod using a Recharge Item spell
+#####G----------------------------------------------------------------------
+
+(You can also recharge staffs and wands with this technique.)
+
+Inscribe the rod with {@m<d>}, where <d> is any decimal digit not
+already used as a label.
+
+The trick is that we want to use a digit to label the rod so we can
+refer to it using its label instead of its inventory letter, but we
+have usually used up many of the digits for spell books. If we were to
+label the rod with {@m1} and the first spellbook was also labeled with
+{@m1}, then the spellbook will sort first in the inventory so it will
+be found first when looking for item '1' to use with the (m) command.
+So that would try to recharge the spellbook, which will fail. Angband
+doesn't restrict itself to "appropriate" items when looking for a
+labeled item. It simply finds the first one whose command letter and
+digit match.
+
+You can't get around this by omitting the letter 'm', or using 'z'
+instead. Using no command letter means it will still match. And if you
+use a command letter it has to be 'm', because that is the built-in
+trigger for the current command.
+
+Note that the digits used with different command triggers can be
+different, so inscribing {@z1@m0} is perfectly legal. Use digit 1
+when zapping the rod, and 0 when referring to it during the casting
+of a [mage] spell.
+
+You can also use this technique with scrolls. In that case you need to
+use the inscription {@r<d>} since the item is being referred to while
+processing the (r) Read scroll command.
+
+#####G----------------------------------------------------------------------
+#####G4.19 Disabling a built-in command
+#####G----------------------------------------------------------------------
+
+At times it may be useful to disable an underlying Angband command.
+For example, a dangerous key may be too easy to press by accident.
+The macro editor commands for removing macros and keymaps can't be
+used in this situation. [[[[[BInstead bind the trigger key to the action]
+[[[[[Bstring "\x00"]. This special 'command' takes no "energy" and won't
+generate an error message. It truly does "nothing". This will work for
+both macros and keymaps. If possible you should use a keymap instead
+of a macro to disable the key. A keymap will catch occurrences of the
+key both in macros and by typing, and will still allow you to use the
+key when it isn't being interpreted as a command.
+
+If you use the "Query a macro/keymap" on a trigger key bound to this
+action, it will report having found it, but no action string will be
+printed.
+
+Another technique is to use the action "\e\e\e". This is used in some
+of the standard pref files.
+
+[[[[[BIf you need to use the built-in command again you can use the '\' key]
+[[[[[Bat any prompt to bypass its macro/keymap.]
+
+#####G----------------------------------------------------------------------
+#####G4.20 "Naming" an item (patch)
+#####G----------------------------------------------------------------------
+
+#####B= 'Fake artifact' name =
+# "Name" an item
+This isn't an actual command in the interface, but a flag character
+that alters the way an item description is generated. This isn't part
+of standard Angband. It's added by Tom Morton's 'fake artifact' patch.
+
+Example: inscription {#Thumper} will cause a Club (+8,+8) to display
+as Club 'Thumper' (+8,+8) in your inventory and messages.
+
+~~~~~34
+#####R======================================================================
+#####R5. Common Questions
+#####R======================================================================
+
+#####G----------------------------------------------------------------------
+#####G5.1 Why can't I add a keymap for a function key?
+#####G----------------------------------------------------------------------
+
+Because keymaps can only be created for keys with system-independent
+representations. This leaves out function keys, and several other
+special keys. The "Create a keymap" command will continue waiting for
+a keypress until you press a valid keymap trigger. You can, however,
+create a macro for a function key.
+
+#####G----------------------------------------------------------------------
+#####G5.2 How can I automatically inscribe items when I pick them up?
+#####G----------------------------------------------------------------------
+
+You need to turn on the "Merge inscriptions when stacking" option.
+If you are already carrying the same item with an inscription, a new
+one will be added to the stack. Note that this WON'T merge discounts.
+Although discounts display like inscriptions, they are different.
+
+1) = Options
+2) 1 User interface options
+3) "Merge inscriptions when stacking" (stack_force_notes)
+ move down to this line and change to "yes".
+
+#####G----------------------------------------------------------------------
+#####G5.3 Can I use macros inside other macros?
+#####G----------------------------------------------------------------------
+
+No. Macros don't expand macro triggers they contain in their actions,
+in order to avoid recursion and other problems. However, keymap
+substitution is done, so you can use keymaps to alter the behavior of
+macros. This keymap expansion can be bypassed by preceding a trigger
+with "\\" in the action.
+
+Keymaps don't expand macro or keymap triggers in their actions.
+
+Also see section *****macrofaq.txt*9["Can I create an infinite loop using a macro?"].
+
+#####G----------------------------------------------------------------------
+#####G5.4 How do I find out what the standard commands are?
+#####G----------------------------------------------------------------------
+
+1) ? Angband help
+2) 6 *****command.txt*0[Command Descriptions (command.txt)]
+
+Space - moves you down by a page
+Minus - moves up by a page
+2 - moves down by a line
+8 - moves you up by a line
+
+Note that the original and roguelike command sets differ, and both are
+different from the "underlying" command set.
+
+#####G----------------------------------------------------------------------
+#####G5.5 How can I tell if a key has a keymap/macro?
+#####G----------------------------------------------------------------------
+
+#####B= Query Macro/Keymap =
+
+In ToME this is easy:
+1) @ Interact with macros
+2) 3 Query a macro
+OR 7 Query a keymap
+3) (Press the trigger key to test)
+4) Esc (Exit macro editor when done)
+
+It will report "Found no macro" or "Found a macro" at the top of the
+screen. The action it is bound to will be displayed at the bottom of
+the screen, under the "Current action..." line. You must test for both
+macros and keymaps, and keymaps will only show for the current "mode",
+i.e. original/roguelike.
+
+#####B= Notes =
+
+Note: on some machines, there are duplicate keys such as left and right
+Shift keys. These will generally produce different key codes and can
+have different macros and keymaps.
+
+Note: just because a key doesn't have a macro doesn't mean there isn't
+a command that uses that key.
+
+#####G----------------------------------------------------------------------
+#####G5.6 How can I tell if a key has a built-in command bound to it?
+#####G----------------------------------------------------------------------
+
+Er ... try pressing the key. If there is a command bound to that key
+it should usually generate a message of some kind. If there isn't one,
+it may respond: "Type '?' for help.". Some keys may not generate any
+message at all. Function keys are a good example.
+
+In ToME, the game will also generate "silly" error messages
+which may not look like error messages at first. After a few repeated
+key presses it uses the standard "Type '?' for help." message.
+
+Failing that, look in *****command.txt*0["command.txt"], which lists all
+commands, and is up-to-date. There is no specific method for checking if
+a key has a command bound to it from within the game.
+
+#####G----------------------------------------------------------------------
+#####G5.7 Can I inscribe multiple items with the same number?
+#####G----------------------------------------------------------------------
+
+You can, but it can cause problems if you aren't careful. Use the
+command letter in the inscriptions to minimise problems. For example,
+it is safe to inscribe both rods with {@z1} and a spell book with
+{@m1} because the command letter allows distinguishing the two.
+
+When the game looks for an item to use with a command, it tries the
+first one it finds that matches. If the command fails on that item, it
+doesn't continue looking. The search for a matching item also doesn't
+know how to only check the right kind of item, so if you have a Spellbook
+inscribed {@1} and scrolls inscribed {@1} or {@r1}, when you read a
+scroll it will find the spellbook first, even though it doesn't make
+sense to read it, and the command will fail.
+
+#####G----------------------------------------------------------------------
+#####G5.8 How do I convert a macro to a keymap?
+#####G----------------------------------------------------------------------
+
+You can simply remove it and re-add it "by hand", but for more complex
+actions there are faster, safer ways.
+
+#####B= Directly modifying the pref file =
+
+A macro with the following form in the pref file:
+ A:<action string>
+ P:<trigger>\r
+Should be converted to the keymap form:
+ A:<action string>
+ C:0:<trigger>
+The "\r" needs to be removed, and the 0 (zero) means standard keyset.
+Use 1 for roguelike keyset. To make a keymap for both keysets:
+ A:<action string>
+ C:0:<trigger>
+ C:1:<trigger>
+
+#####G= Using the "Interact with Macros" editor =
+
+1) @ Interact with Macros
+2) 3 Query a macro
+ <k> The trigger key for the macro
+ (its action string will now become the current action)
+3) 5 Remove a macro
+ <k> The trigger key for the macro
+4) 8 Create a keymap
+ <k> The trigger key for the keymap
+5) (Hit Enter to accept the current action)
+ (Hit Esc to clear the message "Added a keymap")
+
+This technique can also be used to move or copy actions between macros
+or keymaps of the same kind. [[[[[BAnd old macro MUST be removed from a key]
+[[[[[Bbefore it can be used as the trigger key for a keymap], otherwise the
+macro action will expand when you press the trigger key in the editor.
+Converting a keymap to a macro doesn't require removing the keymap
+first.
+
+Note that not all macros can be converted to keymaps. Keymaps don't do
+macro or keymap expansion on their action strings, so macros that rely
+on this will no longer work. Also, keymaps can only be bound to a
+trigger key with a printable internal representation. For example, a
+function key can't be a trigger for a keymap.
+~~~~~9
+#####G----------------------------------------------------------------------
+#####G5.9 Can I create an infinite loop using a macro?
+#####G----------------------------------------------------------------------
+
+No. Well, okay, you can, but only if you work *really* hard at it and
+abuse bugs in the macro handling code. This isn't something that will
+happen by accident just by using the trigger key inside its action.
+
+You also can't create recursion. So don't worry about this. See the
+section *****macrofaq.txt*10["Macros can contain their own trigger key"] for more info.
+~~~~~4
+#####G----------------------------------------------------------------------
+#####G5.10 What just killed me?
+#####G----------------------------------------------------------------------
+
+When you are using lots of escapes and spaces in your macros to skip
+over messages, you can miss important things happening. One of these
+is dying. Usually when something goes wrong, you can just use the (^P)
+Previous Messages command to see what happened. But if you died the
+escapes can take you past the tombstone screen, your last chance to
+examine the previous messages list. This also happens without macros.
+
+To examine your recall, load the savefile and start a new character.
+You will then be able to use the message recall command to see the
+last messages of that character's previous incarnation.
+
+~~~~~35
+#####R======================================================================
+#####R6. Common Problems
+#####R======================================================================
+
+#####G----------------------------------------------------------------------
+#####G6.1 My macro works all the time when I press its key!
+#####G----------------------------------------------------------------------
+
+Macros *do* work all the time. Every time you press a key, macro
+expansion is done on it, and then keymap expansion. So if you use 'y'
+as a trigger key for a macro, and then you try and answer a yes/no
+prompt with 'y', instead you will get the macro's action string.
+
+The answer to this is to change your macro to a keymap. These can be
+bound to keys which have a system-independent representation in the
+game, which includes all keys that you would use when interacting with
+the game interface.
+
+If you don't want to change it to a keymap, try changing the trigger
+key to a "special" key, such as a function key.
+~~~~~6
+#####G----------------------------------------------------------------------
+#####G6.2 My auto-firing macro shoots the wrong target!
+#####G----------------------------------------------------------------------
+
+Your macro is probably firing at the previous target. This will happen
+if the option (*****option.txt*4[use_old_target]) is set. Then a macro will like "f1*t"
+or "m1a*t" will execute as:
+
+f Fire
+1 Ammo inscribed 1
+ (it will now fire at the last [wrong] target)
+* Choose a [new] target
+t Accept first target
+
+If there are no valid targets, the (t) targeting command will centre
+on your position. If you move, the target will still be your old
+square. The first time you use the "f1*t" macro it will fire at that
+square, even if there is now a valid target (monster) nearby.
+
+One fix is to turn off the (use_old_taret) option, since the action
+doesn't require it. This is done with the (=) Set Options command.
+
+Another is to change the action to choose the target before it fires.
+Example: "*tf1".
+
+[[[[[BNote:] just because you can "see" a monster doesn't mean you can target
+it. The code used for vision (line of sight) and firing (projection)
+is slightly different. So when shooting near corners or pillars it may
+happen that you can "see" a monster but not target it. If your action
+kills messages at the end, you could keep hitting your auto-fire macro
+and the only thing happening would be a large pile of missiles quietly
+accumulating underneath you.
+
+#####G----------------------------------------------------------------------
+#####G6.3 I used to have items inscribed, and now they aren't!
+#####G----------------------------------------------------------------------
+
+The game only knows about inscriptions that you are carrying. There is
+no way to "store" them independently of a character's save file. So if
+you lose all of an item that was inscribed, picking up another of that
+kind won't automatically inscribe it.
+
+Normal inscriptions aren't affected by your player's "memory".
+
+Note that some items, when fully identified, could have their
+descriptions grow so long that no inscription will show. In that case
+you can use the (I) Identify command. It will display the full
+description, even if nothing special is known about that item.
+
+#####G----------------------------------------------------------------------
+#####G6.4 I changed some macros in a pref file and nothing happened!
+#####G----------------------------------------------------------------------
+
+Settings loaded in later pref files will overwrite earlier ones. So if
+you add macros for the same trigger key to files "<$CLASS>.prf" and
+"<$PLAYER>.prf", the second one will get used because its file loads
+later. This affects macros, keymaps, actions, attrs/colors, and other
+info. See section *****macrofaq.txt*11["Pref lines summary"] for all the types of settings
+that can be loaded. Also see section *****macrofaq.txt*7["Pref file loading order"].
+
+#####G----------------------------------------------------------------------
+#####G6.5 It moves me when I try to use my bow/rod/wand!
+#####G----------------------------------------------------------------------
+
+Example: you type "f1" and it moves you in direction 1 (South West).
+What is happening is that the 'f' key isn't being handled correctly.
+It may be remapped to a bogus command, or one which doesn't take an
+argument. So the 'f' command is skipped/dealt with, and the '1' key is
+then treated as a direction. You can examine what is going on with the
+'f' key using the (@) Interact with macros screen to check for any
+macros or keymaps bound to that key. Use the appropriate "Remove ..."
+command to restore the built-in Angband command.
+~~~~~3
+#####G----------------------------------------------------------------------
+#####G6.6 My macro drops/takes off my main weapon!
+#####G----------------------------------------------------------------------
+
+This is probably caused by an auto-fire macro like "*tm1a" for magic
+missile. If you hold down the trigger key to repeatedly use it, and
+some game event (possibly caused by the macro) creates a message, then
+the action will be interpreted as:
+* (cancel message)
+t Take off item
+m (ignored as invalid)
+1 (ignored as invalid)
+a Item a (main weapon)
+
+If there is room in your inventory, it will be put there. If not, your
+inventory will overflow and it will be dropped on the ground. If this
+happens during combat this is a very good way to die. This is just
+another good reason to have {!d!k!v} on your main weapon. See the
+section *****macrofaq.txt*12["Prevent unwanted use of an item"].
+
+This can be fixed by using the escape sequence "\e\e\e" before and
+after the action string to cancel any pending messages or commands.
+See the section *****macrofaq.txt*13["Clearing the command buffer"].
+~~~~~2
+#####G----------------------------------------------------------------------
+#####G6.7 My macro outputs "e - Floating Eye" on the message line!
+#####G----------------------------------------------------------------------
+
+It is wise to add an escape sequence "\e\e\e" to the beginning and end
+of all macros for which this doesn't destroy useful information. See
+section *****macrofaq.txt*13["Clearing the command buffer"] for more information on this.
+
+But many players play on flavors of unix, which uses '/' as the path
+separator for files, and automatically type a forward slash when they
+mean to type a backslash. So many actions in macros/keymaps in usenet
+posts have the wrong type of slash. Angband "gurus" are perhaps more
+vulnerable to this than novices.
+
+The game sees this as:
+/ Identify a character
+e Character to be identified
+And outputs "e - Floating Eye" on the message line.
+
+If this sequence gets expanded when you are trying to select an item,
+it will lead to different behaviors.
+Example:
+/ Switch between inventory and equipment
+e Select item e.
+Or:
+/ Switch between inventory and equipment
+e (ignored because invalid) Select item e.
+/ Switch between inventory and equipment
+e Select item e.
+
+~~~~~36
+#####R======================================================================
+#####R7. Inscriptions added by the game
+#####R======================================================================
+
+Some inscriptions are added by the game itself. These can overwrite
+your inscriptions. There are also "fake" and "special" inscriptions,
+which "look" like real inscriptions to the player.
+
+#####G----------------------------------------------------------------------
+#####G7.1 Fake inscriptions
+#####G----------------------------------------------------------------------
+
+These "fake" inscriptions are "covered up" by real inscriptions, but
+will reappear if the real inscription is removed.
+
+"fake" inscriptions are unaffected by the uninscribe command (}).
+
+{cursed} - cursed item
+{empty} - item out of charges
+{tried} - a "flavored" item which the character
+ has used, but whose effects are unknown.
+{N% off} - item bought on sale
+{quest} - this item is a quest item. It may need to be taken to someone.
+
+#####G----------------------------------------------------------------------
+#####G7.2 Auto-inscriptions
+#####G----------------------------------------------------------------------
+
+These added when your character gets a "feeling" about an item.
+In ToME these are "special" inscriptions, like "fake" inscriptions
+above, which don't overwrite user inscriptions. They just hide user
+inscriptions, which are still there.
+
+{terrible} - cursed or broken artifact
+{broken} - broken item
+{cursed} - cursed item
+{uncursed} - previously cursed item
+{average}
+{good} - good (magical) item
+{excellent} - ego item
+{special} - unique item
+{on sale} - displayed only in the store
+
+~~~~~37
+#####R======================================================================
+#####R8. Keys and commands
+#####R======================================================================
+
+This section gives short descriptions of keys and commands used in
+actions and trigger key representations. They are only listed in this
+section if they aren't fully described elsewhere in this FAQ. Not all
+of these keys are actually for "commands". See the normal Angband help
+for a fuller description of these commands. The commands and keysets
+are documented in *****command.txt*0["command.txt"].
+
+#####G----------------------------------------------------------------------
+#####G8.1 Keysets
+#####G----------------------------------------------------------------------
+
+ToME supports two "keysets", which are fully customisable sets of
+keymaps. The "original" command set is close to the built-in commands,
+with some additions for ease of use such as number keys moving you in
+that direction. The "roguelike" command set allows easy movement on a
+keyboard without a numeric keypad. As a consequence its letter keys
+are almost completely "full". These used to be hard-coded by the game,
+but are now fully customisable. The default keymaps are in "pref.prf".
+
+#####G----------------------------------------------------------------------
+#####G8.2 Item selection
+#####G----------------------------------------------------------------------
+
+(*) - gives list of choices
+(-) - selects item on the floor
+(/) - toggles between the inventory and equipment lists.
+
+(space) - shows list of choices. Pressing (space) again hides the list.
+(lower) - selects the inventory item with that letter.
+(upper) - selects the inventory item with that letter, and requires
+ confirmation.
+(digit) - selects first item inscribed with "@#" or "@x#" where 'x' is
+ the command, and '#' is the digit. Only legal items are allowed.
+
+#####G----------------------------------------------------------------------
+#####G8.3 Directions and Movement
+#####G----------------------------------------------------------------------
+
+Original keyset directions
+7 8 9
+4 5 6
+1 2 3
+
+Roguelike keyset directions
+y k u
+h 5 l
+b j n
+
+#####B= Underlying command keys =
+
+;<dir> - walk (with pickup)
++<dir> - alter
+.<dir> - run
+
+Digits AREN'T built-in movement commands in ToME. They are actually
+keymaps found in the standard pref file "pref.prf". The digits are
+direction arguments to the (;) Walk command.
+
+#####G----------------------------------------------------------------------
+#####G8.4 Escape sequences
+#####G----------------------------------------------------------------------
+
+Many [non-printable] characters have a standard printable encoding
+which uses an "escape" character to change the meaning of the
+following character. The backslash character is used as in the C
+language for many keys. The caret '^' is used for control keys.
+
+#####B= Escape sequences =
+\b backspace
+\e escape
+\n newline
+\r return
+\s space
+\t tab
+\xNN hex ASCII char
+\\ (literal) backslash
+\^ (literal) caret
+
+#####B= Backslash =
+In a macro, "\\" followed by a character uses the "underlying" command
+for that character without translation. This is useful in macros to
+avoid keymaps changing the behavior of the macro. In particular this
+can be used to make macros which work for both original and roguelike
+keysets. Keymaps don't have this problem.
+
+#####B= Newline and Return =
+These two characters can be used interchangeably.
+
+#####B= ASCII chars =
+Any ASCII character can be encoded in this way. So many keys will have
+more than one representation. For example, [Enter] can be "\r", "^M",
+and "\x09". The backslash representations are case sensitive, so "\t"
+is [Tab], but "\T" will just be interpreted as "T". The hexadecimal
+number must be exactly 2 digits.
+
+#####B= Escape and Space =
+See section *****macrofaq.txt*13["Clearing the command buffer"] for their main uses.
+
+#####G----------------------------------------------------------------------
+#####G8.5 Repeats and Counts
+#####G----------------------------------------------------------------------
+
+#####B= Auto repeat =
+Some commands will automatically repeat. These are:
+(T) Tunnel
+(B) Bash
+(D) Disarm
+(o) Open
+(c) Close
+(+) Alter
+
+#####B= Number keys =
+
+0 - starts a repeat count. Some commands take a repeat count argument.
+They can be entered as "0<count><cmmd>". If the command is movement,
+it can (must) be preceded by space(s) to separate the direction
+(command) number from the count number.
+~~~~~1
+#####G----------------------------------------------------------------------
+#####G8.6 Messages and Questions
+#####G----------------------------------------------------------------------
+
+#####B= Yes/No queries =
+Yes/No questions can be answered with 'y', 'n', or Esc. These are not
+case sensitive. Only 'y' or 'Y' will respond Yes. 'n', 'N', and Esc
+are No. If the option (quick_messages) is on, any other keypress is
+also No. When the option is off, it will keep waiting for a valid key.
+
+#####B= "-more-" message prompts =
+These may be cleared by Esc(\e), Space(\s), Enter(\r), or Newline(\n).
+If the (quick_messages) option is on, they can be cleared by any key.
+
+#####G----------------------------------------------------------------------
+#####G8.7 Special keys
+#####G----------------------------------------------------------------------
+
+#####B= Function keys =
+Function keys are free for reassignment, but only as macros. [[[[[BFunction]
+[[[[[Bkeys can be modified by Alt, Ctrl, Shift like other keys.]
+
+#####B= Alt keys =
+Alt-modified keys are generally free for reassignment as either macros
+or keymaps.
+
+#####B= Control keys =
+Control keys can be entered in as "^x" where 'x' is the key. Note
+that the case of 'x' is unimportant. This also allows typing control
+keys which would be intercepted by the operating system, such as ^C.
+You must type the caret '^' and the following key separately. Note
+that some have special meanings, such as ^M for Return, and ^H for
+backspace. Some also have special Operating System meanings, such as
+"^Z" in un*x, and "^C" in DOS. Control keys can be trigger keys for
+both macros and keymaps.
+
+#####B= Interrupting the game =
+(^C) This will kill your character and quit the game, after verifying.
+
+#####G----------------------------------------------------------------------
+#####G8.8 Keys used in inscriptions
+#####G----------------------------------------------------------------------
+
+#####B= Confirm command =
+^ Confirm the following command.
+This isn't an actual command, but a character with a special meaning
+inside command strings. {^*} will confirm all actions for the item.
+
+#####B{=g}
+This inscription will cause an item of the same kind to be picked up
+from the floor without prompting.
+
+~~~~~38
+#####R======================================================================
+#####R9. Pref files
+#####R======================================================================
+
+All pref files are loaded from and saved to folder "\lib\user". The
+folder "\lib\pref" is unused at this time! The location and name of
+this folder can be configured.
+
+Warning: the directory "\lib\pref" is unused by the game. Pref files
+moved there will never get used (unless the user has redirected the
+folder locations).
+
+Integers can be in hex "0x10", decimal "16", or octal "020" formats.
+These are converted using the C library fn strtol(), and are case
+insensitive.
+
+Decimal numbers start with '1'-'9'.
+Octal numbers must start with '0' (zero).
+Hex numbers start with '0x' or '0X'.
+
+#####G----------------------------------------------------------------------
+#####G9.1 Standard Pref files
+#####G----------------------------------------------------------------------
+
+Below "***" stands for the 3-letter system abbreviations, such as
+"acn", "mac", "win", "x11", ...
+
+"font.prf"
+Includes "font-***.prf" files.
+This file defines special attr/char mappings for "text" mode.
+
+"graf.prf"
+Includes "graf-***.prf" files.
+This file defines special attr/char mappings for "graphics" mode.
+
+"pref.prf"
+Includes "pref-***.prf" files.
+This file defines "default" actions of various kinds. This includes
+mapping the original and roguelike keysets to the underlying keyset.
+
+"user.prf"
+Includes "user-***.prf" files.
+This file defines "override" actions of various kinds. It includes the
+pref files based on system, race, and class.
+
+"xtra-***.prf"
+This file defines special attr/char mappings for "graphics" mode.
+Currently this just maps the player icon based on race and class.
+"new" refers to Adam Bolt's tiles.
+
+[[[[[vWarning:] you shouldn't edit the base pref files without a good reason,
+and understanding what you are doing. Breaking these files can make
+your game unusable. They are, however, the place to make changes that
+should affect all users.
+~~~~~7
+#####G----------------------------------------------------------------------
+#####G9.2 Pref file loading order
+#####G----------------------------------------------------------------------
+
+This loading order follows from the order of includes in "pref.prf".
+Files which are "hard-coded" in the source are preceded with an index.
+The rest are included by the other files. Files which come later will
+overwrite settings from earlier files.
+
+(1) "pref.prf"
+ "message.prf"
+ "pref-***.prf"
+
+(2) "graf.prf"
+ "font-xxx.prf"
+ "graf-***.prf"
+
+(3) "font.prf"
+ "font-xxx.prf"
+ "font-***.prf"
+
+(4) "user.prf"
+ "user-***.prf"
+ "<$RACE>.prf"
+ "<$CLASS>.prf"
+
+(5) "<$PLAYER>.prf"
+
+(6) ".angband.prf"
+
+
+= $RACE =
+Can be one of any of the races in ToME.
+
+= $CLASS =
+Can be one of any of the classes in ToME.
+
+= $PLAYER =
+The name of the current player being loaded or born. See section
+*****macrofaq.txt*15["Automatically loading pref files"] for more information.
+
+#####B= Specific pref files =
+#####B-----------------------------------
+
+"user-mac.prf"
+This is the only user pref file with example macros that ships with
+ToME. A good set of examples.
+
+"pref-win.prf"
+This is the same as (missing) "pref-dos.prf" and "pref-ibm.prf".
+
+"colours.prf"
+Amiga only. Contains Amiga palette.
+
+".angband.prf"
+Only on multi-user systems. This doesn't ship with the source. This
+file must be located in the directory contained in environ variable
+"HOME".
+~~~~~11
+#####G----------------------------------------------------------------------
+#####G9.3 Pref lines summary
+#####G----------------------------------------------------------------------
+
+Comment lines start with a '#' and extend to end of line.
+
+Note: integer values can be specified as decimal, as hexadecimal by
+preceding with an "x", or as octal by using a leading "0" (zero).
+
+E:<tv>:<a> - attr/char values for inventory objects by index
+F:<num>:<a>:<c> - attr/char values for features by index
+K:<num>:<a>:<c> - attr/char values for objects by index
+R:<num>:<a>:<c> - attr/char values for monsters by index
+S:<num>:<a>:<c> - attr/char values for special things by index
+
+A:<str> - action line
+ An action line should be followed by a keymap trigger "C:" line
+ or a macro trigger "P:" line. There can be intervening comments
+ and lines. The same action will be [re]used by all keymap and
+ command lines which follow it until there is another action line.
+P:<str> - macro line
+ <str> a macro encoding of a keypress. (system dependent)
+C:<mode>:<str> - keymap line
+ <mode> 0 = "original, 1 = "roguelike".
+ <str> logical keypress, including backslash codes such as "\e" and
+ control codes such as "^K". (system independent)
+ Note that there are 2 independent sets of keymaps now. Changing a
+ keymap in one doesn't affect the other.
+
+V:<num>:<kv>:<rv>:<gv>:<bv> - specify visual information
+ <num> is the color index (0-255, only 0-15 used)
+ <kv> black (?) value -- unused
+ <rv> red value (0-255)
+ <gv> green value (0-255)
+ <bv> blue value (0-255)
+W:<win>:<flag>:<value> - turn a window flag on/off.
+ <win> window number (1-7)
+ <flag> (0-31)
+ <value> 0 = off, 1 = on
+
+X:<str> - turn option off
+Y:<str> - turn option on
+ <str> the name of an option in option_text[].
+ These are the names displayed in the options screen (=).
+
+?: - conditional expression
+%: - include another pref file
+
+#####G----------------------------------------------------------------------
+#####G9.4 Option lines "X:" and "Y:"
+#####G----------------------------------------------------------------------
+
+Options and their descriptions are listed in help file *****option.txt*0["option.txt"].
+These options are set within the game using the (=) Options command,
+and the option names are the ones displayed within parentheses in the
+options screen.
+
+#####B= Common options =
+rogue_like_commands
+use_old_target
+always_pickup
+depth_in_feet
+alert_hitpoint
+auto_haggle
+auto_scum
+
+#####G----------------------------------------------------------------------
+#####G9.5 Conditional expression lines "?:"
+#####G----------------------------------------------------------------------
+
+expressions are lisp-like prefix notation.
+names (class, race, ...) aren't placed in quotes.
+AND - logical AND
+IOR - inclusive OR
+EQU - (string) equals
+NOT - logical negation
+LEQ - (string) less than or equal to
+GEQ - (string) greater than or equal to
+[,] - group expressions
+$CLASS - current class
+$GRAF - 3-letter graphics abbr in "graf-***.prf" (old, new)
+$PLAYER - current player name
+$RACE - current race
+$SYS - 3-letter system abbr in "pref-***.prf" (ami, mac, win,...)
+
+0 - false
+1 - true (can't just be non-zero)
+
+If the conditional expression is false all pref file commands
+encountered until the next conditional pref line are skipped.
+
+This isn't an actual command. It only works in pref files.
+
+The variables $CLASS, $GRAF, $PLAYER, $RACE, $PLAYER, $SYS and the
+string values they take on are case sensitive. The values also can't
+contain spaces. These constraints on the values hold when they are
+used in a pref file, but might not when used as pref filenames.
+
+This can be "turned back on" using the pref line "?:1", which is
+generally the last line in a file which contains conditional macros,
+to make sure that any files loaded after it don't get ignored as well.
+
+#####G----------------------------------------------------------------------
+#####G9.6 Macro trigger lines "P:"
+#####G----------------------------------------------------------------------
+
+All "special" keys are translated by "main-***.c" into encoded "macro
+triggers". These macro triggers have the encoded form "^_MMMxSS\r",
+where the "modifier" flags are stored in "MMM", and the two digit
+hexadecimal scan code of the keypress is stored in "SS". See source
+file "main-ibm.c" and others for more info. Note that because these
+scan codes are system-dependent, macro trigger encodings are as well.
+Keymaps are used for system independent mapping of triggers to actions.
+
+#####BModifier flags
+
+A - Alt
+C - Control
+S - Shift
+O - Option key (Mac)
+
+#####BIBM Scan codes
+
+x47 - keypad 7
+x48 - keypad 8
+x49 - keypad 9
+x4A - keypad -
+x4B - keypad 4
+x4C - keypad 5
+x4D - keypad 6
+x4E - keypad +
+x4F - keypad 1
+x50 - keypad 2
+x51 - keypad 3
+x52 - keypad Ins / .
+x53 - keypad Del / Enter
+x45 - Pause
+
+Others can be found using the "Query a macro" feature.
+
+Note that scan codes can't be assumed to be "in order", even for keys
+like function keys which "logically" should be!
+
+Note that you can't always just add a modifier to a known scan code
+because that combination might not be recognised by the hardware or
+the translation code in "main-***.c".
+
+Example: a Windows system will recognise function key F1, Shift-F1,
+and Ctrl-F1, but not Ctrl-Shift-F1. Similarly Pause and Alt-Pause are
+recognised, but not Ctrl-Pause, and Shift-Pause gives the same
+encoding as Pause alone.
+
+#####G----------------------------------------------------------------------
+#####G9.7 Saving to a pref file
+#####G----------------------------------------------------------------------
+
+Commands "Append macros to file" and "Append keymaps to file" don't
+erase the previous macros or keymaps. Instead they are appended. Note
+that this can produce *large* files after a while. Newer versions
+append to "<$PLAYER>.prf" by default, whereas older versions appended
+to "user.prf". The appended sections are preceded by headers of the
+form "Automatic macro/keymap dump". Using a distinctive comment line
+such as ###... after your entries can make editing the appended ones
+easier.
+
+[[[[[BNote: macros and keymaps aren't saved in the character file, so they]
+[[[[[Bmust be saved separately. All macros and keymaps entered by the user]
+[[[[[Bare lost when Angband terminates.]
+
+Note: keeping macros in the <$PLAYER>.prf files allows several users
+to share the same installation without interfering with each other.
+You can easily reuse or share preferences by moving them into a pref
+file "<my-name>.prf" and using the pref line "%:<my-name>.prf" to
+include them in "user.prf" for single user installations, or
+<$PLAYER>.prf for multi-user installations.
+
+#####G----------------------------------------------------------------------
+#####G9.8 Editing pref files
+#####G----------------------------------------------------------------------
+
+This is still most easily done in a text editor.
+
+~~~~~39
+#####R======================================================================
+#####R10. Macro editing commands
+#####R======================================================================
+
+#####G----------------------------------------------------------------------
+#####G10.1 (") Enter a User Pref Command
+#####G----------------------------------------------------------------------
+
+This allows entering a single pref line.
+Example: "X:auto_scum" turns auto-scum off.
+
+Example "A:<str>" sets the current action string. If you open the
+"Interact with macros" screen this action will be the default used.
+Then using the (") command again with "P:<key>" will create a macro
+for the action <str> previously entered.
+
+Not all pref commands can be used here, or are meaningful.
+The "pseudo" pref commands (?), (%) cannot be used here.
+
+See section *****macrofaq.txt*20["Advanced macro techniques"] for ways to [ab]use this.
+
+#####G----------------------------------------------------------------------
+#####G10.2 (@) Interact with macros
+#####G----------------------------------------------------------------------
+
+#####B= Vanilla command set = (2.8.3 - 2.9.1)
+#####B-----------------------------------
+Load a user pref file
+Append macros to a file
+Query a macro action
+Create a macro
+Remove a macro
+Append keymaps to a file
+Query a keymap
+Create a keymap
+Remove a keymap
+Enter a new action
+
+#####B= Load a user pref file =
+#####B-----------------------------------
+Loads a user pref file from "lib\user". Defaults to the name of the
+current character. Macros/keymaps loaded will replace existing ones.
+
+#####B= Append macros to a file =
+#####B-----------------------------------
+Macros are dumped in macro list order. Newer ones are at the end.
+Macros are *appended* to the file. The old one isn't overwritten. This
+prevents you from accidentally wiping out your old pref file. However,
+the file can grow very long without your noticing it. Placing a line
+of ###'s at the end of your macros can help sort out what is what.
+Macros are labeled with comment "# Macro 'NNN' ". These numbers are the
+internal macro list numbers, and have no relation to key scan codes.
+The filename must end in ".prf". It will save correctly without this
+extension, or with a different one, but if you save as "<$NAME>"
+instead of "<$NAME>.prf", it won't be automatically loaded when you
+load the character with that name.
+
+#####B= Query a macro =
+#####B-----------------------------------
+Press the trigger key to test at the prompt.
+This will show "Found a macro" on the message line if it found one,
+and the line "Trigger: <trigger>". This will show "Found no macro"
+on the message line if it didn't find a macro. Some keys such as
+function keys won't be recognised by the prompt. It will wait until
+you hit a key it recognises.
+
+This command doesn't alter any settings. It will return to the main
+menu after you hit any key it recognises.
+
+#####B= Create a macro =
+#####B-----------------------------------
+After choosing this command, press the trigger key for the macro.
+The internal form will be shown after the "Trigger: " prompt.
+Note that some keys may not be recognised for remapping, such as the
+new Windows keys, as well as modifier keys such as Alt, Control, Shift
+pressed by themselves. In this case it will continue to wait for a
+valid trigger key.
+
+The current action (if any) will be shown *below* the "Trigger: "
+prompt line. On the prompt line ("Action: ") will be shown the last
+macro sequence entered. This is the action in the "action buffer".
+This isn't necessarily the macro sequence currently bound to this key.
+This is the action that will be bound to the current trigger key if
+you hit Enter.
+
+You may type in an action string to replace the one after the prompt.
+Hit Enter when you are finished.
+
+For ToME you can quit the command assignment by hitting
+Esc. The new action entered won't be assigned, and the previous one
+will remain unaltered.
+
+#####B= Remove a macro =
+#####B-----------------------------------
+Removes the macro from the trigger key by creating an identity macro
+on that key for itself. So the macro isn't completely removed, just
+overwritten. The new identity macro will be saved when the macros are
+appended to a file. This is different from the "Remove a keymap"
+command, which completely removes the keymap.
+
+#####B----------------------------------------------------------------------
+The following "keymap" commands only apply to the current "mode"
+(original/roguelike). Keymaps for the other mode will be unaffected.
+Because keymaps can only be bound to trigger keys which have a system
+independent representation, some key presses won't be recognised by
+these editing commands. They will instead wait until you press a valid
+trigger key.
+#####B----------------------------------------------------------------------
+
+#####B= Append keymaps to a file =
+#####B-----------------------------------
+Works just like "Append macros to a file". These are appended after a
+header comment "# Automatic keymap dump".
+
+#####B= Query a keymap =
+#####B-----------------------------------
+Works just like "Query a macro". This will show "Found a keymap" on
+the message line if it found one, and will display "Keypress: <map>".
+This will show "Found no keymap" on the message line if it didn't
+find a keymap. This command doesn't alter any settings. It will return
+to the main menu after you hit any key it recognises.
+
+#####B= Create a keymap =
+#####B-----------------------------------
+Works just like the "Create a macro" command. Keymaps can only be
+assigned to keys which have a system independent representation. Note
+that creating a keymap will cause the behavior of any macro whose
+action string contains that key to change.
+
+#####B= Remove a keymap =
+#####B-----------------------------------
+Removes the keymap completely from the trigger key. If the key had a
+built-in command it can now be used again. Note that removing a keymap
+will cause the behavior of any macro whose action string contained
+that key to change. This behaves differently from the "Remove a macro"
+command, which creates an identity macro.
+
+If the original "command" was itself a keymap, removing a user-entered
+keymap won't restore it. Example: the key (n) is bound to the built-in
+command "Repeat last action" in file "pref.prf" via a keymap. If you
+add a keymap for (n) and then remove it, the "Repeat last command"
+functionality won't be restored. You will have to add it back by hand,
+or reload a pref file that contains that stored keymap. [[[[[BIn particular]
+[[[[[Balmost all roguelike commands are now implemented as keymaps.]
+
+#####B= Enter a new action =
+#####B-----------------------------------
+Allows entering a new action. Actions are entered into a static buffer
+which is shared by both macros and keymaps. The action string entered
+will become the default action for creating a keymap or action, and
+will only change when a keymap or macro is created with a different
+action string, or when one is queried. Note that the same action can
+be bound to multiple trigger keys by hitting Enter when using the
+commands to create a keymap/macro.
+
+~~~~~20
+#####R======================================================================
+#####R11. Advanced Macro Techniques
+#####R======================================================================
+
+This section outlines advanced techniques not really required for game
+play. But macros become addictive after a while ...
+
+Action strings in this section are enclosed in braces {} because many
+use a double quote (") inside the action string. These are not
+inscriptions.
+
+#####G----------------------------------------------------------------------
+#####G11.1 Set current action using (@) command in an action
+#####G----------------------------------------------------------------------
+
+{"@0<str>\r\e}
+@ - Interact with macros
+0 - Enter a new action
+<str>- (action string)
+\r - Enter the action
+\e - Exit the macro editor
+
+This will work when bound to a macro.
+
+#####G----------------------------------------------------------------------
+#####G11.2 Set current action using (") command in an action
+#####G----------------------------------------------------------------------
+
+{"A:<action>\r} - sets the current action.
+" - Enter pref line
+A: - Action line
+<str>- (action string)
+\r - Enter the action
+
+This works in either a macro or keymap.
+
+#####G----------------------------------------------------------------------
+#####G11.3 Create a new keymap using (") command in an action
+#####G----------------------------------------------------------------------
+
+{"A:<act>\r"C:0:<key>\r}
+Here <act> can't contain an '\r' or '\e'.
+
+Example {"A:z0\r"C:0:J\r} binds action "z0" to (standard) keymap 'J'.
+
+#####G----------------------------------------------------------------------
+#####G11.4 Create a new macro using (") command in an action
+#####G----------------------------------------------------------------------
+
+{"A:<act>\r"P:<key>\r}
+Here <act> can't contain an '\r' or '\e'.
+Here <key> is a standard key. (not a "special" one like F1, \b, or ^A)
+
+Example
+{"A:<action1>\r"P:j\r} binds action <action1> to trigger 'j'.
+{"A:<action2>\r"P:j\r} binds action <action2> to trigger 'j'.
+If we bind these 2 macros to different trigger keys, the action that
+is on key (j) can be swapped back and forth.
+
+#####G----------------------------------------------------------------------
+#####G11.5 Turning an option on/off in an action
+#####G----------------------------------------------------------------------
+
+Turn an option on:
+{"Y:<option_name>\r}
+
+Turn an option of:
+{"Y:<option_name>\r}
+
+Example: Turn (quick_messages) on, do an action, and turn it back off:
+{"Y:quick_messages\r<action>"X:quick_messages\r}
+
+This will work in either a macro or keymap. <option_name> is the name
+of the option as it appears in the option editor accessed through the
+(=) command. These are also listed in the help file *****option.txt*0["option.txt"]. Note
+that option names contain underscores instead of spaces.
+
+#####G----------------------------------------------------------------------
+#####G11.6 Inscribe/Uninscribe an item in an action
+#####G----------------------------------------------------------------------
+
+(These action strings are enclosed in double quotes)
+
+Inscribe an item:
+"{<item>\s<inscr>\r"
+
+Uninscribe an item:
+"}<item>\r"
+
+<item> must be the inventory letter of the item, possibly preceded by
+a '/' to switch to the equipment list. You can't use digit labels for
+items with inscriptions that contain the command triggers '{' or '}',
+but you can use "@<digit>".
+
+This will work in either a macro or keymap.
+
+~~~~~41
+#####R======================================================================
+#####R12. Problems
+#####R======================================================================
+
+#####G----------------------------------------------------------------------
+#####G12.1 Keys to avoid remapping
+#####G----------------------------------------------------------------------
+
+These don't really *need* to be avoided, but all carry dangers of one
+kind or another. You should think through potential problems before
+deciding to use them. You have been warned.
+
+#####B= Navigation keys =
+Enter, Esc, Backspace, ...
+These aren't a good choice unless you *really* need them. If you do it
+is far better to use keymaps. If you bind a macro to the Enter key,
+you will lose the ability to enter line-based commands like Inscribe.
+
+#####B= Commands generated internally =
+(_) Enter store
+This command is generated internally by the game when the player moves
+onto the door of a store. In some versions, if this key has a keymap
+bound to it, that will fire when you try to enter a store.
+
+#####B= Keys with important Operating System meanings =
+^Z (un*x) Suspends the game and returns to the command shell. This
+ is an operating system command, not an Angband command.
+ Command "fg" returns to Angband.
+^\, ^D, ^S
+ These are keys that shouldn't be bound to macros or have their
+ behavior altered.
+
+#####B= Keys with dangerous ToME meanings =
+(Q) Quit (commit suicide), (k) destroy item, (^A) Enter Debug mode...
+Using these as triggers is dangerous in case, for some reason, you
+wind up in a situation where the macro hasn't loaded or is disabled.
+You also don't want to get into a habit of typing these too fast.
+
+#####B= Selection keys =
+(e) Equipment, (i) Inventory, (-) Floor item, (/) Switch inventory
+lists. You should avoid binding these as macro triggers, to prevent
+making inventory and choice management next to impossible. But even as
+keymaps they hold some dangers.
+Example: you bind keymap on '-' to destroy item on the floor. Now if
+you try to do an action on a floor item, and it fails (such as using
+rod to identify), then the '-' can be taken from the input stream and
+used as a keymap, which would destroy the item you tried to identify.
+
+#####B= Response keys =
+(y) yes, (n) no, (Esc) cancel, (Space) skip message,...
+Binding macros to these is a [[[[[vVery Bad Idea.] Macro expansion will then
+be done when you answer a question like "Are you sure you want to quit
+the game without saving?". The expanded macro action string will be
+used as the input, and may not lead to the answer you were trying for.
+Keymaps don't have this problem. As a rule you should never use a
+macro instead of a keymap unless necessary.
+
+#####G----------------------------------------------------------------------
+#####G12.2 Num lock
+#####G----------------------------------------------------------------------
+
+Whether/not NumLock is on can make a difference for some macros.
+For example, if NumLock is on under X11 the 'X' macro won't work.
+
+#####G----------------------------------------------------------------------
+#####G12.3 Recovering
+#####G----------------------------------------------------------------------
+
+Restarting ToME clears all macros entered during the last session.
+
+You can use "Load a pref file" in the "Interact with macros" screen to
+reload a good set of prefs, overwriting bad ones being used. This will
+not "erase" a macro/keymap which doesn't have a corresponding saved
+one in the pref file. So if you add a macro/keymap to a trigger key
+which didn't have anything bound to it, reloading the pref file won't
+restore the key to its original state.
+
+If you still have problems, restore or edit any modified *.prf files
+that might be loaded.
+
+Try saving your macros, and examine them to see what went wrong.
+
+[[[[[BYou can use the backspace '\' key at the command prompt to use the]
+[[[[[Boriginal "underlying" command bound to that key. For example, if you]
+[[[[[Bbound the key '@' to a macro, you wouldn't be able to enter the macro]
+[[[[[Beditor to rebind it to itself.] Pressing '\' first, then '@' causes the
+command handler to use the built-in command, which allows you to enter
+the command editor. Note: when you use the backspace inside an action
+string, you have to double it as "\\". Do not use just a single back-
+slash, or it will be ignored, and possibly alter the meaning of the
+character that follows it.
+
+You can remove a macro/keymap from an essential key (such as the Esc
+key). Use the (@) "Interact with macros" command to access the remove
+commands.
+
+#####G----------------------------------------------------------------------
+#####G12.4 Unrecognised keys
+#####G----------------------------------------------------------------------
+
+#####B= Un*x =
+
+Function keys may not be recognised on some Un*x systems.
+
+#####B= PC/Dos/Windows =
+Doesn't recognise the WINDOWS key (start menu) or the APPLICATION key
+(context menu).
+
+On some systems, doesn't recognise modifier keys (Alt, Ctrl, Shift) on
+keypad keys when NumLock is on.
+
+See special_key_list[] in "main-win.c" for list of "special" keys that
+are recognised.
+
+#####G----------------------------------------------------------------------
+#####G12.5 Nonexistent commands
+#####G----------------------------------------------------------------------
+
+Macros and keymaps can only be bound to keypresses. The game state
+changing isn't a keypress, so you can't trigger an action when you
+become hungry, blind, confused, slowed, pseudo-id an item, pick up an
+item, gain a level, have a rod recharge, or any other event that isn't
+directly triggered by a keypress.
+
+"Attacking" also isn't a command, but you can use commands (+) Alter
+grid, (;) Walk, and (.) Run.
+
+So you don't really _attack_ Morgoth, you just _alter_ him. First he's
+alive, then he's not. :)
+
+#####G----------------------------------------------------------------------
+#####G12.6 File permissions
+#####G----------------------------------------------------------------------
+
+If you lack write permission to the pref file currently loaded by the
+game, try saving to a file with a new name. The macros can be copied
+over "by hand" later.
+
+~~~~~42
+#####R======================================================================
+#####R13. Miscellaneous
+#####R======================================================================
+
+#####G----------------------------------------------------------------------
+#####G13.1 References
+#####G----------------------------------------------------------------------
+
+*****command.txt*0["COMMAND.TXT"]
+- lists standard and roguelike keys and commands. full descriptions.
+- long description of command behavior.
+- intro to macros and user pref files.
+
+*****dungeon.txt*8["DUNGEON.TXT"]
+- look under "Objects Found in the Dungeon".
+
+*****option.txt*0["OPTION.TXT"]
+- list of options and their descriptions.
+
+"INSCRIPTIONS.HTML"
+- short intro by Julian Lighton. Available from
+"http://www.fragment.com/~jl8e/angband/inscriptions.html".
+
+#####G----------------------------------------------------------------------
+#####G13.2 Contributors
+#####G----------------------------------------------------------------------
+
+This FAQ was largely compiled from newsgroup postings to "r.g.r.a".
+So thanks to the generous contributors to the newsgroup! Email
+addresses have been removed to foil spam-bots.
+
+Ben Harrison -- maintainer: Angband 2.7.1 - 2.8.5, =Ben= in source.
+Robert Ruehlman -- maintainer: Angband 2.9.0 - present.
+DarkGod -- maintainer: PernAngband 2.9.9a - present
+
+Scott Bigham, DamonShawX, Jonathan Ellis, George W. Harris, Roger
+Hoyle, Graham S. Johnson, Chris Kern, Matthias Kurzke, Steve Lamb,
+Julian Lighton, Art Mruczek, Daniel Nash, Timo Pietilä, Jack Wise,
+Greg Wooledge, and others.
+
+#####G----------------------------------------------------------------------
+#####G13.3 Legalese
+#####G----------------------------------------------------------------------
+
+Copyright 2000 Jim Lyon and others. Redistribution of unaltered copies
+of this document is permitted without restriction. Distribution of
+altered copies is permitted without restriction as long as the
+alteration does not significantly alter the content. (For example,
+translation and conversion to another format is permitted.)
+Distribution of all other altered copies is permitted as long as credit
+for previous authors is maintained, the contact information is
+replaced with that of the alterer, and redistribution is not further
+restricted.
+
+Edited for PernAngband V5.x.x by Dawnmist with permission from Jim Lyon
+August 2001. All comments to angband@dawnmist.8m.com
diff --git a/lib/mods/theme/help/magic.hlp b/lib/mods/theme/help/magic.hlp
new file mode 100644
index 00000000..382451c3
--- /dev/null
+++ b/lib/mods/theme/help/magic.hlp
@@ -0,0 +1,41 @@
+|||||oy
+~~~~~01|Magic|Index
+~~~~~02|Help|Magic
+#####RWelcome to the ToME Magic Help System.
+#####R=============================================
+
+Please choose one of the following help files:
+
+General Info
+
+ *****/amagic.txt*0[(a) The ToME magic system]
+ *****/bmagic.txt*02[(b) Wands and Staves]
+
+Magic schools
+
+ *****/cm_air.txt*0[(c) The Air School]
+ *****/dm_convey.txt*0[(d) The Conveyance School]
+ *****/em_demono.txt*0[(e) The Demonology School]
+ *****/fm_divin.txt*0[(f) The Divination School]
+ *****/gm_earth.txt*0[(g) The Earth School]
+ *****/hm_fire.txt*0[(h) The Fire School]
+ *****/im_geoman.txt*0[(i) The Geomancy School]
+ *****/jm_mana.txt*0[(j) The Mana School]
+ *****/km_meta.txt*0[(k) The Meta School]
+ *****/lm_mind.txt*0[(l) The Mind School]
+ *****/mm_nature.txt*0[(m) The Nature School]
+ *****/nm_necrom.txt*0[(n) The Necromancy School]
+ *****/om_tempo.txt*0[(o) The Temporal School]
+ *****/pm_udun.txt*0[(p) The Udun School]
+ *****/qm_water.txt*0[(q) The Water School]
+
+Other powers accessed by the 'm' menu
+
+ *****/rm_mimic.txt*0[(r) Mimicry Powers]
+ *****/sm_mindcr.txt*0[(s) Mindcrafting Powers]
+ *****/tm_music.txt*0[(t) Musical Songs]
+ *****/um_symbio.txt*0[(u) Symbiotic Powers]
+ *****/vm_thaum.txt*0[(v) Thaumaturgical Spells]
+
+ *****/zhelp.hlp*0[(z) Main Help menu]
+ \ No newline at end of file
diff --git a/lib/mods/theme/help/magic.txt b/lib/mods/theme/help/magic.txt
new file mode 100644
index 00000000..93486f0b
--- /dev/null
+++ b/lib/mods/theme/help/magic.txt
@@ -0,0 +1,143 @@
+|||||oy
+~~~~~03|Magic
+#####R === ToME Magic system ===
+
+*****magic.txt*02[Wands and Staves]
+
+For the basics of how to use skills, please see *****skills.txt*0[Using Skills].
+
+In ToME you have a basic *****skills.txt*21[Magic] skill. This skill is one of the most
+important ones for a spellcaster, since it is responsible for how much mana you
+have. You can never have too much of it. If you like magical devices, the
+Magical Device skill is also important, since it controls the Magical
+Device ability of your character. This ability again dictates the fail rates
+of use of wands/rods/staffs and activation of random-artifacts/artifacts, and
+it will also increase the power of these items.
+~~~~~01|Magic|Schools
+ToME uses skills to define the various schools of magic. There are 11 primary
+schools:
+ *****m_mana.txt*0[Mana] *****m_fire.txt*0[Fire] *****m_water.txt*0[Water]
+ *****m_air.txt*0[Air] *****m_earth.txt*0[Earth] *****m_meta.txt*0[Meta]
+ *****m_convey.txt*0[Conveyance] *****m_divin.txt*0[Divination] *****m_tempo.txt*0[Temporal]
+ *****m_mind.txt*0[Mind] *****m_nature.txt*0[Nature]
+
+Other magical skills, generally being used primarily by characters of a
+specific class, are:
+ *****m_demono.txt*0[Demonology] *****m_necrom.txt*0[Necromancy] *****skills.txt*36[Runecraft]
+ *****m_thaum.txt*0[Thaumaturgy] *****skills.txt*49[Alchemy] *****m_geoman.txt*0[Geomancy]
+
+The *****m_demono.txt*0[Demonology] skill is primarily used by *****c_demono.txt*0[Demonologists] for their special
+spells, whereas the *****m_necrom.txt*0[Necromancy] skill is used by *****c_necro.txt*0[Necromancers] for their own set
+of special spells.
+The same goes for *****skills.txt*36[Runecraft], which is used by *****c_runecr.txt*0[Runecrafters] to allow use of more
+difficult runes or rune-combinations. *****m_thaum.txt*0[Thaumaturgy] gives you randomly chosen
+attack spells, and as such each game with it will be different. *****c_geoman.txt*0[Geomancers]
+harness the powers of the elements using *****m_geoman.txt*0[Geomancy]. Lastly we have
+*****skills.txt*49[Alchemy], which is used by *****c_alchem.txt*0[Alchemists].
+
+In addition to the schools of magic, you can get access to special sets of
+spells if you worship a God. There are currently four good Gods,
+*****g_eru.txt*0[Eru Iluvatar], *****g_manwe.txt*0[Manwe Sulimo], *****g_yavann.txt*0[Yavanna Kementari] and *****g_tulkas.txt*0[Tulkas]. There is also an evil
+god, *****g_melkor.txt*0[Melkor]. Each of them gives you access to different types of spells.
+
+*****c_pr_drk.txt*0[Worshippers of Melkor] also have access to the special *****m_udun.txt*0[Udun] school of magic,
+whereas other *****c_priest.txt*0[Priests] and *****c_mindcr.txt*0[Mindcrafters] can use *****m_mindcr.txt*0[Mindcrafting Powers].
+
+*****c_symbia.txt*0[Symbiants] have access to their own special brand of *****m_symbio.txt*0[magic powers], and *****c_bard.txt*0[Bards] have
+access to *****m_music.txt*0[Songs], which affect creatures in ways that can appear to be magical.
+
+The 11 different primary schools give you access to different spells of
+variable usefulness. The way they work is that adding skill points to a
+specific school will enable you to get higher level spells for that specific
+school. By level requirements for a specific spell you could actually say skill
+requirement, since they correlate exactly. Let's take a simple example:
+If you have the *****m_mana.txt*0[Mana] school skill at level 24.000, it means you can use any
+spell in the mana school up to and including those requiring level 24. [[[[[BThere are]
+[[[[[Balso some spells requiring a certain skill level in two schools, and there is a]
+[[[[[Bpossibility of spells requiring three or more. For this kind of spells the ]
+[[[[[Bspell level is determined by taking an average of the necessary skills. ]
+When calculating spell level for spells which require more than one school,
+sorcery (or god-granted access) can be used in place of the primary schools in
+the normal way. Once the average has been calculated, any bonus from the
+spell-power skill can also be applied as normal. If one of the schools required
+is the Udun school, then the appropriate bonus from character level will be
+applied. Lastly, if you look at a spell, and the spell level reads -2 or some
+other negative value while it's also grayed out, that means you need to
+increase the corresponding school's skill level by 3, since only 2 will have
+it end up on spell level 0, where it still is unusable. If it reads n/a, you
+currently have no skill points in that school.
+
+Another thing that should be explained about the skills and schools of magic
+right now, is that the skill doesn't stop being useful only for gaining spells.
+The higher the skill level, the higher the spell level will be, and the more
+powerful your spells will be. For instance, say you have the *****m_mana.txt*0[Mana] skill at
+level 24. Now, the Manathrust spell is one of the spells for that school
+that only requires skill level 1, but since you've got skill at level 24, the
+power of the spell is increased as well. For comparison, a level 1
+Manathrust costs 1 mana and does 4d2 damage, while at level 24 it costs 12
+mana and does a whopping 27d10 damage.
+
+The *****skills.txt*23[Sorcery] skill is a nice skill, since it gives you
+access to all the 11 primary schools of magic, just as if you'd spent an equal
+amount of skill points in all the skills. It's available to any mage character,
+but only a *****c_sorcer.txt*0[Sorceror] will be able to be proficient in it. Also, having this
+skill at level 1 will give you a hitpoint-penalty of 1%, all the way up to
+skill level 50, with a hitpoint-penalty of 50%. There are also ToHit and ToDam
+penalties for sorcery, so don't choose sorcery if you plan to do much fighting.
+
+There is also the *****skills.txt*22[Spell Power] skill. This skill is rather nice, since it
+will augment the power of spells you already know. The distinction between this
+and the others, is that it will not grant you new spells, but instead increases
+the levels of spells. At level 50 it grants 20 extra spell levels. [[[[[BThis skill ]
+[[[[[Bonly affects the 11 primary schools] (Mana, Earth, Air, Fire, Water, Meta,
+Mind, Temporal, Conveyance, Divination and Nature) as well as Geomancy and the
+spells granted by the Gods.
+
+There is also the Magic-Device skill which affects your ability to use wands,
+staves, rods and to activate special objects. It also affects the spell-levels
+of the staff and wand spells, as explained below.
+~~~~~02|Wands
+~~~~~04|Magic|Wands and Staves
+~~~~~05|Staves
+#####GWands and Staves
+
+Wands and staves (sticks) operate in a similar fashion, and in fact most of
+them use the same spells with the same effects. When you pick up a stick, you'll
+see it has two numbers in the format [x|y] in addition to the number of charges
+it holds. By increasing your magic-device skill you can increase the level (and
+hence the power) of the spell in that stick. The x value are skill level
+bonuses which the staff itself holds, and these are added onto your existing
+magic-device skill for the purpose of using the staff. The y value is the
+maximum possible skill level for that stick. Things are balanced by the use of a
+"minimum magic-device skill level required to raise spell level". Here's an
+example:
+A Staff of Sense Hidden [1|10]. Your magic device skill is at 6. If you were to
+identify the staff and then 'I'nspect it, you would see the following
+information:
+
+&&&&&w wSwpwewlwlw wdwewswcwrwiwbwtwiwownw:w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w
+&&&&&w wDwewtwewcwtwsw wtwhwew wtwrwawpwsw wiwnw waw wcwewrwtwawiwnw wrwawdwiwuwsw wawrwowuwnwdw wywowuw w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w
+&&&&&w wAwtw wlwewvwewlw w1w5w wiwtw wawlwlwowwwsw wywowuw wtwow wswewnwswew wiwnwvwiwswiwbwlwew wfwowrw waw wwwhwiwlwew w w w w w w w w w w w w w w w w w w w w w w
+&&&&&w wSwpwewlwlw wlwewvwewlw:w B3w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w
+&&&&&w wMwiwnwiwmwuwnw wMwawgwiwcw wDwewvwiwcwew wlwewvwewlw wtwow wiwnwcwrwewawswew wswpwewlwlw wlwewvwewlw:w B5w w w w w w w w w w w w w w w w w w w w w w w w w w
+&&&&&w wSwpwewlwlw wfwawiwlw:w g2g3w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w
+&&&&&w wSwpwewlwlw wiwnwfwow:w yryaydy y1y3w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w
+
+The Spell level is the level at which the spell will actually be cast.
+Spell fail is the spell fail percentage. The spell info may contain the radius
+of effect, amount of damage, or duration the spell might last.
+The Minimum Magic Device level to increase your spell level is just that. If
+your magic device skill was less than this level, then the staff would be
+casting the spell at level one. Our magic device skill is 6. Therefore we are
+casting at level 2 (at skill level 5, we should be casting the spell at level
+1). Then we add the bonus from the staff of 1, which gives us our spell level
+of 3. If our magic device in this example had been 14, this would have given us
+a spell level of 1 + (14 - 5 + 1) = 11. This is calculated from the formula:
+spell level = staff bonus + (magic device - minimum magic device + 1)).
+However given that the maximum spell level with this staff is 10, you'll be
+casting with a spell level of 10.
+As you get deeper into the dungeons, you will find sticks with higher bonuses
+and maximum spell levels.
+
+ Written by: vrak AKA Per-Arne Holtmon Akoe
+ Wands and Staves section added by fearoffours
diff --git a/lib/mods/theme/help/newbie.hlp b/lib/mods/theme/help/newbie.hlp
new file mode 100644
index 00000000..2dda8dbc
--- /dev/null
+++ b/lib/mods/theme/help/newbie.hlp
@@ -0,0 +1,16 @@
+|||||oy
+~~~~~01|Help|New players
+#####RWelcome to the ToME New Players Help System.
+#####R=============================================
+
+Please choose one of the following help files:
+
+ *****/awhattome.txt*0[(a) What is ToME?]
+ *****/bbirth.txt*0[(b) Creating a character] Race, class, gods, stats + more
+ *****/cexplore.hlp*0[(c) Exploring the town and dungeon] Dungeons, commands, features
+ *****/dexperien.hlp*0[(d) Gaining experience] Skills and abilities
+ *****/emagic.hlp*0[(e) Using magic and magical items] Magic schools, the 'm' menu, wands etc
+ *****/fTANG.txt*0[(f) The ToME newbie guide]
+
+ *****/zhelp.hlp*0[(z) Main Help menu]
+
diff --git a/lib/mods/theme/help/option.txt b/lib/mods/theme/help/option.txt
new file mode 100644
index 00000000..34a2fe6b
--- /dev/null
+++ b/lib/mods/theme/help/option.txt
@@ -0,0 +1,697 @@
+|||||oy
+~~~~~05|Options
+#####R=== Options and Effects (ToME 2.1.x) ===
+
+Most of the options are accessible through the '=' command, which provides
+an interface to the various sets of options available to the player.
+
+In the descriptions below, each option is listed as the textual summary
+which is shown on the options screen, plus the internal name of the
+option in brackets, followed by a textual description of the option.
+
+Note that the internal name of the option can be used in user pref files
+to force the option to a given setting; see *****command.txt*105["command.txt"] for more info.
+
+Various concepts are mentioned in the descriptions below, including "disturb"
+(cancel any running, resting, or repeated commands, which are in progress),
+"flush" (forget any keypresses waiting in the keypress queue, including any
+macros in progress), and "fresh" (dump any pending output to the screen).
+
+~~~~~06|Options|Startup
+#####R=== Birth/Startup Options ===
+
+The birth or startup options are only able to be changed during character
+creation, and can be accessed by typing '=' during the creation process. They
+can also be viewed from the option menu while playing, but not changed then.
+
+#####GMaximise stats [maximize]
+ Maximise causes the race and class stat bonuses to be applied like
+ equipment bonuses. This usually makes the character harder at the
+ beginning of the game, but easier later on, since the stats are no longer
+ limited to a "natural" value of 28 (18/100).
+
+#####GPreserve artifacts [preserve]
+ Preserve artifacts cancels all level feelings of the "special" variety,
+ but allows missed artifacts to be "saved" by wandering monsters and
+ found again at a later time. This only works for non-identified artifacts.
+
+#####GSpecify 'minimal' stats [autoroll]
+ Uses the standard autoroller for character creation. This allows the player
+ to specify a set of minimum values for the stats, and the game will keep
+ rerolling until it achieves them (or 1 million rolls, whichever comes
+ first). Be warned, however, that there is a maximum total power permitted
+ for a starting character. Setting one stat to near maximum is easily
+ achievable; 2 is reasonable; but 3 would require the remaining 3 stats to
+ be near their minimum values.
+
+#####GGenerate character using a point system [point_based]
+ Allows the player to distribute a certain number of points among her stats.
+ It results in the player being able to get one or two really high stats, at
+ the expense of other not-so-important stats; or to have a well-rounded
+ character who is above average (but not great) in all stats. Unused points
+ convert into starting gold for the player.
+
+#####GAlways generate very unusual rooms [ironman_rooms]
+ Tries to place a special room or vault on every dungeon level. Very fun,
+ but extremely deadly - imagine that Greater Checkerboard Vault with Lokkak
+ on dungeon level 1!
+
+#####GAllow notes to be written to a file [take_notes]
+ Allows any player-written notes (with the "|" command) to be written to
+ a file and kept (instead of being put in the message list).
+
+#####GAutomatically note important events [auto_notes]
+ Used in conjunction with the take_notes option, this option makes a note
+ each time you gain a level, kill a unique, find an artifact, etc.
+
+#####GFast autoroller (NOT on multiuser systems) [fast_autoroller]
+ The normal autoroller has a built-in delay that helps prevent it from
+ overloading a system. This option reduces that delay, allowing characters
+ to be rolled in a much shorter time, but should not be used on multiuser
+ systems.
+
+#####GAllow use of some 'joke' monsters [joke_monsters]
+ Allows monsters flagged as being some of DarkGod's jokes to be generated.
+
+#####GAlways make small levels [always_small_level]
+ Overrides the in-game option of small_levels, generating smaller levels
+ whenever possible.
+
+#####GYou can receive fates, good or bad [fate_option]
+ Allows the player to turn off ToME's *****fatespoi.txt*0[fates] for that character.
+
+~~~~~07|Options|Ingame
+#####RIN GAME OPTIONS
+#####R===============
+
+These options are available from within the game, and can be toggled on and
+off at will during the course of the game.
+
+~~~~~08|Options|Interface
+#####R=== Option Set 1 -- User Interface ===
+
+#####GRogue-like commands [rogue_like_commands]
+ Selects the "roguelike" command set (see *****command.txt*0["command.txt"] for info).
+~~~~~1
+#####GActivate quick messages [quick_messages]
+ Allows the use of any keypress as a response to the "-more-" prompt
+ (useful for monster farming). Allows most keys to mean "no" to any
+ "[y/n]" prompt.
+
+#####GPrompt for various information [other_query_flag]
+ No longer used.
+
+#####GPrompt before picking things up [carry_query_flag]
+ Forces the game to ask you for confirmation when you do something that
+ would normally cause an item to be picked up.
+~~~~~4
+#####GUse old target by default [use_old_target]
+ Forces all commands which normally ask for a direction to use the
+ current target if there is one. If the current target is a monster, it
+ becomes unset when that monster dies. Use of this option can be dangerous
+ if you target locations on the ground, unless you clear them when done.
+
+#####GPick things up by default [always_pickup]
+ Tells the game that walking onto an item should attempt to pick it up.
+ Otherwise, you must use the "g" command, or the "-" command while walking.
+ Combined with "carry_query_flag" (Prompt before picking things up), allows
+ you to selectively pick up all items which you step on.
+
+#####GPrompt before picking up heavy objects [prompt_pickup_heavy]
+ Generates a prompt whenever the character tries to pick up an item that
+ would slow him down.
+
+#####GRepeat obvious commands [always_repeat]
+ Tells the game that when you attempt to open a door or chest, bash
+ a door, tunnel through walls, or disarm traps or chests, that you
+ wish to repeat the command 99 times (see *****command.txt*0["command.txt"]).
+
+#####GShow dungeon level in feet [depth_in_feet]
+ Display the dungeon depth in "feet" instead of as a level number (one
+ level is equivalent to 50'). This also affects the monster memory display.
+
+#####GMerge inscriptions when stacking [stack_force_notes]
+ Force otherwise identical objects to merge, even if one has an empty
+ inscription and the other does not. The resulting stack keeps the
+ non-empty inscription.
+
+#####GMerge discounts when stacking [stack_force_costs]
+ Force otherwise identical objects to merge, even if they have different
+ discounts. The resulting stack keeps the largest discount. This option
+ may cause you to lose "value", but will give you optimal pack usage.
+
+#####GShow labels in object lists [show_labels]
+ Display the "labels" for objects in the equipment list, and in any
+ special window which is displaying the equipment. These labels
+ indicate what the player is using the object for, such as "wielding"
+ or "wearing" (in a given location). After you have played for a while,
+ this information is no longer useful, and can be annoying.
+ Note that in ToME this option no longer controls the "plain
+ flavoured object descriptions": a separate option for them has been added
+ under "ToME Options".
+
+#####GShow weights in object lists [show_weights]
+ Display the weight of objects in the inventory and equipment lists,
+ and in stores, and in any special window which is displaying any of
+ these lists.
+
+#####GShow graphics in inventory list [show_inven_graph]
+ Display the graphics of objects in the inventory list, and in any special
+ window which is displaying the inventory list.
+
+#####GShow graphics in equipment list [show_equip_graph]
+ Display the graphics of objects in the equipment list, and in any special
+ window which is displaying the equipment list.
+
+#####GShow graphics in stores [show_store_graph]
+ Display the graphics of objects in the store list.
+
+#####GShow choices in certain sub-windows [show_choices]
+ Indicate legal choices in special windows which display lists.
+
+#####GShow details in certain sub-windows [show_details]
+ Indicate extra details in special windows, currently used to activate
+ the display of death counts and monster descriptions when recalling
+ details about a monster.
+
+#####GAudible bell (on errors, etc) [ring_bell]
+ Attempt to make a "bell" noise when various errors occur.
+
+~~~~~09|Options|Disturbance
+#####R=== Option Set 2 -- Disturbance ===
+
+#####GRun past stairs [find_ignore_stairs]
+ Ignore stairs when running.
+
+#####GRun through open doors [find_ignore_doors]
+ Ignore open doors when running.
+
+#####GRun past known corners [find_cut]
+ Cut sharply around known corners when running. This will result in
+ faster running, but may cause you to run into a lurking monster.
+
+#####GRun into potential corners [find_examine]
+ Fully explore potential corners in hallways. This is strongly
+ recommended if your light source has a small radius (e.g. a torch).
+
+#####GDisturb whenever any monster moves [disturb_move]
+ Disturb the player when any monster moves, appears, or disappears.
+ This includes monsters which are only visible due to telepathy, so
+ you should probably turn this option off if you want to "rest" near
+ such monsters.
+
+#####GDisturb whenever viewable monster moves [disturb_near]
+ Disturb the player when any viewable monster moves, whenever any
+ monster becomes viewable for the first time, and also whenever any
+ viewable monster becomes no longer viewable. This option ignores
+ the existence of telepathy for the purpose of determining whether
+ a monster is viewable. See also the "view_reduce_view" option.
+
+#####GDisturb whenever map panel changes [disturb_panel]
+ This option causes you to be disturbed (stop running) when the screen
+ scrolls, as it does when you get close to the edge of the visible screen.
+
+#####GDisturb whenever leaving trap-detected area [disturb_detect]
+ This option causes you to be disturbed whenever you are leaving
+ a trap-detected area. This option is strongly recommended.
+
+#####GDisturb whenever player state changes [disturb_state]
+ This option causes you to be disturbed whenever the player state
+ changes, including changes in hunger, resistance, confusion, etc.
+
+#####GDisturb whenever boring things happen [disturb_minor]
+ This option causes you to be disturbed by various boring things,
+ including monsters bashing down doors, inventory feelings, and
+ beginning to run out of light-source fuel.
+
+#####GDisturb whenever random things happen [disturb_other]
+ In ToME, uncursed teleporting items may teleport you around sometimes,
+ asking for your confirmation (and possibly disturbing your rest). If you
+ unset this option, they will stop asking you and teleporting you randomly.
+ Cursed items will neither ask for confirmation nor stop teleporting you
+ even if this option is unset. (You may also inscribe an item with {.}
+ to suppress its random-teleportation power, unless it is cursed.)
+
+#####GAlert user to critical hitpoints [alert_hitpoint]
+ Produce a "bell" noise, and flushes all pending input, when your hitpoints
+ reach the warning point chosen elsewhere, preventing stupid deaths.
+
+#####GAlert user to various failures [alert_failure]
+ Produce a "bell" noise, and flushes all pending input, when various
+ failures occur, as described above.
+
+#####GGet last words when the character dies [last_words]
+ Display a random line from the "death.txt" file when your character
+ dies. If this option is not selected, the "You die." message is displayed
+ instead.
+
+#####GAllow shopkeepers and uniques to speak [speak_unique]
+ If this option is in use, shopkeepers may sometimes whisper rumours to
+ you. Also certain monsters start boasting as they attack you, and when
+ they die, they say their "last words".
+
+#####GNo query to destroy known worthless items [auto_destroy]
+ It can sometimes be annoying that the Destroy command asks for confirmation
+ when you are attempting to destroy a Broken sword {cursed}. If this option
+ is set, no confirmation will be asked if you attempt to destroy an object
+ which you know to be worthless. Of course, cursed artifacts cannot be
+ destroyed even if this option is set.
+
+#####GConfirm to wear/wield known cursed items [confirm_wear]
+ Some players may occasionally, due to a typing mistake, find themselves
+ wearing an item which they knew was cursed. If this option is set, you
+ should be safe from such typing mistakes: you will be prompted if you
+ attempt to wear or wield an item if your character knows it is cursed.
+
+#####GPrompt before exiting a dungeon level [confirm_stairs]
+ Some players (such as myself) often accidentally press the '<' key
+ and exit a Special feeling level. If this option is set, the program
+ asks for confirmation before you go up or down the stairs. Others may
+ find the prompt annoying; they should of course not set this option. :-)
+
+#####GDisturb when visible pets move [disturb_pets]
+ The player may wish that some of the disturbance options do not apply
+ to pets: for example, it can be annoying if your rest is always disturbed
+ by a pet dog who pops in every now and then. By default, pets do not
+ disturb you even if full monster disturbance options are set. If you
+ want your pets to disturb you like normal monsters, set this option.
+
+#####GAutomatically open doors [easy_open]
+ Opens (and unlocks) doors by walking into them. Also, if you are adjacent
+ to only one known door, using the "o"pen command will not prompt you for
+ a direction.
+
+#####GAutomatically disarm traps [easy_disarm]
+ Attempts to disarm traps by walking into/over them. Also, if you are
+ adjacent to only one known trap, using the "D"isarm command will not
+ prompt you for a direction. If your disarming ability is particularly
+ low, you should probably not enable this option, because you will often
+ fail to disarm the traps, and sometimes trigger them.
+
+#####GAutomatically tunnel walls [easy_tunnel]
+ Automatically tunnels into walls by walking into them.
+
+~~~~~10|Options|Game-play
+#####R=== Option Set 3 -- Game-play ===
+
+#####GAuto-haggle in stores [auto_haggle]
+ Disable haggling in stores, resulting in a ten percent sales tax
+ on items which you would have otherwise been forced to haggle for.
+ When this option is on, all prices listed in stores will be the
+ actual price that you pay for an item, as opposed to the price
+ that the shop-keeper will suggest.
+
+#####GAuto-scum for good levels [auto_scum]
+ This is a hack but allows you to force the generation of "good" levels
+ in the dungeon. This option may be extremely slow on some machines,
+ especially deep in the dungeon. The minimum "goodness" of the level
+ is based on the dungeon level, so the deeper you go, the better the
+ level will be.
+
+#####GAllow weapons and armor to stack [stack_allow_items]
+ Allow identical weapons and armor to be combined into a stack. This
+ also allows unidentified, but identical, ammo to be combined, which
+ may result in the auto-identification of some of the ammo, but which
+ makes it a lot easier to actually use unidentified ammo.
+
+#####GAllow wands/staffs/rods to stack [stack_allow_wands]
+ Allow identical wands/staffs/rods to be combined into a stack. This
+ may force the items to be unstacked to use them, which may result
+ in overflow of the pack. Also, the entire stack can be recharged
+ (and possibly destroyed) at the same time.
+
+#####GExpand the power of the look command [expand_look]
+ Expand the "l"ook command to allow the user to look at grids which
+ are not actually in view of the player, allowing the examination of
+ objects/monsters which have only been detected by spells, or sensed
+ via telepathy.
+
+#####GExpand the power of the list commands [expand_list]
+ Expand the "listing" commands so that they wrap at the edges of
+ the appropriate list. This allows the "l"ook and "t"arget commands
+ to cycle through all appropriate grids forever, and the "identify
+ symbol" to browse through all of the monsters of a given type.
+
+#####GMap remembers all perma-lit grids [view_perma_grids]
+ Memorise all perma-lit floor grids which are seen by the player.
+ This option allows you to keep track of which explored floor grids
+ were perma-lit, but does not distinguish between dark floor grids,
+ unexplored floor grids, and unknown grids. Turning off this option
+ allows the player to always know which lit floor grids are in line
+ of sight, but this is better accomplished by the "view_bright_lite"
+ option. Note that any non-floor grids which is seen by the player
+ are always memorised, and any object which is seen by the player is
+ memorised independently from the memorisation of the grid itself.
+
+#####GMap remembers all torch-lit grids [view_torch_grids]
+ Memorise all (torch-lit) floor grids which are seen by the player.
+ This option not only allows you to keep track of which floor grids
+ have been explored, but also which ones are dark, because the use
+ of this option activates a special color scheme for the display of
+ floor grids, in which dark grids are drawn in dark grey, lit grids
+ are drawn in white, and (if the "view_bright_lite" option is set)
+ lit grids which are also in line of sight are drawn in orange. Note
+ that grids which are currently torch-lit are considered to be "lit",
+ and are thus drawn in white, unless the "view_yellow_lite" option is
+ set, in which case they are drawn in yellow.
+
+#####GAllow some monsters to carry light [monster_lite]
+ This option allows some monsters to carry light sources around with them,
+ lighting up the space around them. It can also allow you to see when some
+ monsters are heading your way before they reach the bend in the corridor
+ where you are hiding in ambush....
+
+#####GGenerate dungeons with aligned rooms [dungeon_align]
+ Force all rooms to be aligned with the "panel" divisions. This results
+ in a much prettier dungeon, but may result in fewer greater vaults.
+
+#####GGenerate dungeons with connected stairs [dungeon_stair]
+ Always generate a staircase back to the level whence you came, if you used
+ a staircase to get to the level. This is more "realistic", and safer,
+ but less of a challenge for some people.
+
+#####GMonsters chase current location (v.slow) [flow_by_sound]
+ Allow monsters to make paths to the player when they are nearby. This
+ option is extremely slow, but can produce viciously smart monsters.
+~~~~~3
+#####GUse special symbols for the player char [player_symbols]
+ If this option has been compiled in, it allows you to display your
+ character using race / class / sex dependent colours and graphical
+ symbols. Note that the support for this option may not have been
+ compiled in on all platforms.
+
+#####GPlain object descriptions [plain_descriptions]
+ In ToME, this option disables "full" names for identified flavoured
+ objects; in other words, if this option is not in use, an identified
+ Potion of Speed could be listed (for example) as a Blue Potion of Speed.
+ If you prefer simpler, less verbose descriptions, set this option.
+
+#####GMonsters learn from their mistakes [smart_learn]
+ Allow monsters to learn what spell attacks you are resistant to,
+ and to use this information to choose the best attacks.
+
+#####GMonsters exploit players weaknesses [smart_cheat]
+ Allow monsters to know what spell attacks you are resistant to, without
+ first having to observe such an attack upon you, and to use this
+ information to choose the best attacks.
+
+#####GMonsters behave stupidly [stupid_monsters]
+ ToME incorporates Keldon Jones' improved monster Artificial
+ Intelligence patch. While this patch most certainly makes monsters
+ behave more realistically, they will also be more deadly with the
+ improved AI. If you are a sissy, set this option to get the old,
+ really stupid monster AI.
+ Note that the new AI is a bit processing power expensive. If you have
+ an old computer (386sx) and ToME is running too slowly, you could
+ try turning stupid_monsters on. Or dumpster-dive for a Pentium so you can
+ run ToME. :-)
+
+#####GAllow unusually small dungeon levels [small_levels]
+ This option enables the creation of levels of varying sizes. Levels
+ that are as small as one "screen" (80x24) are possible, and they can be
+ quite dangerous, especially for a low level character, because they have
+ as many monsters and traps as their full-sized counterparts.
+ Note that this option has the side effect of enabling / disabling
+ 'destroyed' levels (they are enabled if small levels are).
+
+#####GAllow empty 'arena' levels [empty_levels]
+ Normal dungeon levels consist mostly of rock. If this option is in
+ use, levels which have empty floor instead of solid rock may also
+ be created (somewhat reminiscent of Nethack's "big-room" levels).
+ These levels can be extremely deadly, especially with breathing
+ monsters (since there are few obstructions to shield you). Arena levels
+ may have vaults, nests and pits in them like normal levels. Some
+ arena levels are dark when they are created, but most are lit.
+
+~~~~~11|Options|Efficiency
+#####R=== Option Set 4 -- Efficiency ===
+
+#####GReduce lite-radius when running [view_reduce_lite]
+ Reduce the radius of the player's light to that of a torch (radius 1)
+ when the player is running, which makes running more efficient (CPU-wise),
+ but is extremely annoying. Certain older versions of Angband used
+ this behavior always, so "purists" should turn it on.
+
+#####GReduce view-radius in town [view_reduce_view]
+ No longer in use.
+
+#####GAvoid checking for user abort [avoid_abort]
+ Avoid checking to see if the user has pressed a key during resting
+ or running or repeated commands. This not only makes the game much
+ more efficient (on many systems), but also allows the use of certain
+ obscure macro sequences, such as turning this option on, resting until
+ done, turning this option off, and casting a spell. Note that the use
+ of this option may be dangerous on certain "graphic" machines. Resting
+ for long periods of time with this option set is dangerous since the
+ resting may not stop until the user takes damage from starvation.
+
+#####GAvoid processing special colors [avoid_other]
+ Avoid processing the "multi-hued" or "clear" attributes of monsters.
+ This will cause all multi-hued monsters to appear violet and all
+ clear monsters to appear white, and will cause trappers and lurkers to
+ be visible on some machines, but it may greatly increase efficiency
+ especially when telepathy is active. Certain systems may choose to set
+ this option if they are unable to support the special color processing,
+ but if they handle graphics "correctly", by using attr/char pairs with
+ the "high bits" set, then not only will the game correctly avoid using
+ any "dangerous" color processing, but it will allow such processing to
+ occur when it is not dangerous. So if you are using graphics, and you
+ use a normal attr/char for the floor grids, then you can use the
+ "special lighting effects" for floors.
+
+#####GFlush input on various failures [flush_failure]
+ This option forces the game to flush all pending input whenever various
+ "failures" occur, such as failure to cast a spell, failure to use a wand,
+ etc. This is very useful if you use macros which include "directional"
+ components with commands that can fail, since it will prevent you from
+ walking towards monsters when your spells fail.
+
+#####GFlush input whenever disturbed [flush_disturb]
+ This option forces the game to flush all pending input whenever the
+ character is "disturbed". This is useful if you use macros which take
+ time, since it will prevent you from continuing your macro while being
+ attacked by a monster.
+
+#####GFlush input before every command [flush_command]
+ This option forces the game to flush all pending input before every
+ command. This option is silly, unless you are very paranoid.
+
+#####GFlush output before every command [fresh_before]
+ This option forces the game to flush all output before every command.
+ This will give you maximal information, but may slow down the game
+ somewhat. Note that this option is only useful when using macros,
+ resting, running, or repeating commands, since the output is always
+ flushed when the game is waiting for a keypress from the user.
+
+#####GFlush output after every command [fresh_after]
+ This option forces the game to flush all output after not only every
+ player command, but also after every round of processing monsters and
+ objects, which will give you maximal information, but may slow down
+ the game a lot, especially on slower machines; and on faster machines
+ you normally do not have a chance to see the results anyway.
+
+#####GFlush output after every message [fresh_message]
+ This option forces the game to flush all output after every message
+ displayed by the game. This will give you maximal information, but
+ may slow down the game somewhat.
+~~~~~2
+#####GHilite the player with the cursor [hilite_player]
+ Place the visible cursor on the player. This looks fine on some Unix
+ machines, but horrible on most graphics machines. Note that only some
+ machines are able to *not* show the cursor, but on those machines, hiding
+ the cursor often speeds up the game and looks better.
+
+#####GUse special colors for torch-lit grids [view_yellow_lite]
+ This option causes special colors to be used for "torch-lit" grids in
+ certain situations (see "view_granite_lite" and "view_special_lite").
+ Turning this option off will slightly improve game speed.
+
+#####GUse special colors for 'viewable' grids [view_bright_lite]
+ This option causes special colors to be used for non "viewable" grids
+ in certain situations (see "view_granite_lite" and "view_special_lite").
+ When this option is set, floor grids which are normally drawn in white
+ but which are not currently viewable by the player are instead drawn
+ in dark grey. This makes the viewable grids appear brighter than the
+ others, allowing the player to easily determine which floor grids are
+ in line of sight. Turning this option off will probably increase the
+ speed of the game.
+
+#####GUse special colors for wall grids (slow) [view_granite_lite]
+ This option activates a special color scheme for all wall grids which
+ are normally drawn in white (as walls and rubble normally are). When
+ the player is blind, we use dark grey, else if the grid is torch-lit,
+ we use yellow (or white, depending on the "view_yellow_lite" option),
+ else if the "view_bright_lite" option is set, and the grid is not in line
+ of sight, or the grid is dark, or the grid is only "partially" lit, then
+ we use grey, otherwise we use the normal white. Turning this option
+ off will probably increase the speed of the game.
+
+#####GUse special colors for floor grids (slow) [view_special_lite]
+ This option activates a special color scheme for all floor grids which
+ are normally drawn in white (as they normally are). When the player is
+ blind, we use dark grey, else if the grid is torch-lit, we use yellow
+ (or white, depending on the "view_yellow_lite" option), else if the grid
+ is dark, we use dark grey, else if the "view_bright_lite" option is
+ set, and the grid is not in line of sight, we use grey, otherwise we
+ use the normal white. Turning this option off will probably increase
+ the speed of the game.
+
+#####GCentre the view on the player (very slow) [center_player]
+ Keeps the player's character in the centre of the screen, and moves the
+ dungeon around the player. Can be useful to prevent off-screen breaths.
+
+~~~~~12|Options|ToME Options
+#####R=== ToME Options ===
+
+Features which are unique to ToME are collected in this menu.
+
+#####GIngame contextual help [ingame_help]
+ Setting this option allows the game to trigger a help message the first
+ time you come across an item or some other trigger. This is very useful
+ for new players. More experienced players may wish to switch this option
+ off.
+
+#####GShow the experience needed for the next level [exp_need]
+ Setting this option alters the display of experience on the left of
+ the main screen to the experience needed to reach the next character level,
+ instead of the character's current total experience.
+
+#####GUse the old(Z) coloring scheme(reload the game) [old_colors]
+ Setting this option toggles the ASCII game colour display from the
+ standard Angband monster colours to the Zangband-based monster colours.
+ Since this alters the display and monster memory display, you need to
+ reload the game when you alter this setting before it will display the
+ new colours.
+
+#####GAutomatically clear '-more-' prompts [auto_more]
+ Setting this option automatically clears any messages from the top
+ of the window. Be warned that this could be dangerous, as you don't
+ actually get to see the messages unless you use ^P.
+
+#####GPlayer char represent his/her health [player_char_health]
+ Setting this option only affects the game when playing without tiles.
+ As the player becomes injured, his icon changes to a figure representing
+ the percentage of health remaining; for example if he is down to 68% of
+ his maximum hitpoints, his character will be a '6' instead of an '@'.
+ The character used only starts changing once the player has lost at
+ least 30% of his maximum hitpoints.
+
+#####GStats are represented in a linear way [linear_stats]
+ Setting this option alters the display of character stats. The default
+ is 3 to 40 (linear), but the older 3 to 18/220 (Moria/Angband style) is
+ retained for players who prefer it.
+
+#####GIn option windows, just omit the select char [inventory_no_move]
+ If this option is set, the equipment/inventory windows don't move items
+ around when a prompt asks for an item.
+
+
+#####R=== Stacking Options ===
+
+In ToME items are allowed to stack on floors and monsters are allowed to
+maintain inventories. These features are enabled by default, and aren't
+accessible through the option menu, but can still be disabled through
+user pref files (see *****command.txt*105["command.txt"]).
+
+#####GAllow objects to stack on the floor [testing_stack]
+ Allows a cave grid to hold more than one object (or one kind of
+ object).
+
+#####GAllow monsters to carry objects [testing_carry]
+ If this option is set, monsters which "pick up" objects will drop
+ the objects they were carrying when you kill them. Note that monsters
+ which "crush" objects are not affected by this option.
+
+~~~~~13|Options|Base Delay Factor
+#####R=== Base Delay Factor ===
+
+The "delay_factor" value, if non-zero, is used to slow down the game, which is
+useful to allow you to observe the temporal effects of bolt, beam, and ball
+attacks. The actual delay is equal to "delay_factor" cubed, in milliseconds.
+Frequently used factors are 2 or 3.
+
+~~~~~14|Options|Hitpoint Warning
+#####R=== Hitpoint Warning ===
+
+The "hitpoint_warn" value, if non-zero, is the percentage of maximal hitpoints
+at which the player is warned that he may die. It is also used as the cut-off
+for using red to display hitpoints, mana and sanity. It is entered as a value
+between 0 and 9 (0% and 90%).
+
+~~~~~15|Options|Autosave
+#####R=== Autosave Options ===
+
+Ideally, the game should be so stable that these options are not needed
+at all. However, even if the game were 100% reliable (which, to be frank, it
+probably is not), the user might forget to save, and his hardware could fail
+him. For all of these reasons, you may want to use these options:
+
+#####GAutosave when entering new levels [autosave_l]
+ If this option is set, the program will attempt to save your
+ character every time before creating a new dungeon level. Useful
+ if you experience any game or computer crashes (or your dog enjoys
+ kicking your power cords out of the wall like mine does!).
+
+#####GTimed autosave [autosave_t]
+ If this option is set, the program will attempt to save your
+ character every n game turns, where n is the "frequency". To set
+ frequency, press n: it will increase the frequency to the next
+ category, these being every 50, 100, 250, 500, 1000, 2500, 5000,
+ 10000 or 25000 turns. (After 25000, pressing n again will cycle back
+ to 0.) Note that the frequency must be higher than 0 and the
+ "Timed autosave" set to "yes" for timed autosaves to take place.
+
+~~~~~16|Options|Automatizer
+#####R=== The Automatizer ===
+
+Allows you to set options for the game to automatically destroy or pick up
+objects when you identify them, for example skeletons, essences, cursed
+daggers, etc. Useful for reducing the clutter in the dungeon, and reducing the
+amount of loot to have to sort through. This *****automat.txt*0[Tutorial] may help you.
+
+~~~~~17|Options|Window Flags
+#####R=== Window Flags ===
+
+Selects what kind of information is displayed in which window, on platforms
+which use multiple windows.
+
+You can select a window to be able to toggle between 2 different
+sets of information (e.g. Basic Character stats and monster recall)
+by pressing the "y" key over the second display option.
+
+~~~~~18|Options|Cheating
+#####R=== Cheating Options ===
+
+#####GPeek into object creation [cheat_peek]
+ Cheaters never win. But they can peek at object creation.
+
+#####GPeek into monster creation [cheat_hear]
+ Cheaters never win. But they can peek at monster creation.
+
+#####GPeek into dungeon creation [cheat_room]
+ Cheaters never win. But they can peek at room creation.
+
+#####GPeek into something else [cheat_xtra]
+ Cheaters never win. But they can see debugging messages.
+
+#####GKnow complete monster info [cheat_know]
+ Cheaters never win. But they can know all about monsters.
+
+#####GAllow player to avoid death [cheat_live]
+ Cheaters never win. But they can cheat death.
+
+~~~~~19|Options|Dump/Load Options
+#####R=== Dump Options ===
+
+Allows the player to save the options to a file (defaults to charname.prf)
+so that they can be reloaded into other character files.
+
+
+#####R=== Load Options ===
+
+Allows you to load a preference file saved through the "Dump Options"
+command in another character file, hence saving all the initial time of having
+to reset all the options every time you wish to play.
+
+
++++ Ben +++ (Updated by Dark God and Dawnmist et al. for ToME)
diff --git a/lib/mods/theme/help/r_beorn.txt b/lib/mods/theme/help/r_beorn.txt
new file mode 100644
index 00000000..b000403f
--- /dev/null
+++ b/lib/mods/theme/help/r_beorn.txt
@@ -0,0 +1,33 @@
+~~~~~01|Beorning
+~~~~~02|Races|Beorning
+#####R=== Beornings ===
+
+#####GDescription
+Beornings are the descendants of Beorn, a powerful shapeshifter who
+dwells near Mirkwood. They have all inherited his shapeshifting abilities
+and can turn into powerful bears at will.
+
+#####GStat Modifiers
+Strength +4
+Intelligence -2
+Wisdom -2
+Dexterity -1
+Constitution +3
+Charisma -5
+Hit Dice Sides 12
+Exp Penalty +50%
+
+#####GSkill Bonuses (supplementary to existing skills)
+
+#####GRacial Skill Modifiers:
+#####BSkill Start Mod Skill Point Gains Mod
+Combat
+ Weaponmastery 2.500 [0.000]
+ Archery 0.500 [0.000]
+ Bearform-combat 1.000 [1.000]
+Sneakiness -0.100 [0.000]
+ Stealth -2.000 [0.000]
+ Disarming -0.600 [0.000]
+Magic
+ Magic-Device -0.800 [0.000]
+Spirituality -3.000 [0.000]
diff --git a/lib/mods/theme/help/r_demon.txt b/lib/mods/theme/help/r_demon.txt
new file mode 100644
index 00000000..7d54d187
--- /dev/null
+++ b/lib/mods/theme/help/r_demon.txt
@@ -0,0 +1,31 @@
+~~~~~01|Demon
+~~~~~02|Races|Demon
+#####R=== Demons ===
+
+#####GDescription
+Demons are minor servants of the Dark. They are natural creatures
+that have been corrupted and twisted by Melkor to serve his ends.
+All demons have an intrinsic understanding of the forces of Dark,
+they resist darkness and fear, and have a firm hold on their life
+forces. Most of a demon's ability depends on their subrace, of
+which there are ten. As a corrupted race, demons will gain and
+lose corruptions randomly as they gain experience.
+
+#####GStat Modifiers
+Strength 0
+Intelligence 0
+Wisdom 0
+Dexterity 0
+Constitution 0
+Charisma -1
+Hit Dice Sides 10
+Exp Penalty +70%
+
+#####GRacial Skill Modifiers:
+#####BSkill Start Mod Skill Point Gains Mod
+Sneakiness 0.000 [0.000]
+ Stealth 0.000 [0.000]
+ Disarming +0.500 [0.000]
+Magic
+ Magic-Device +0.050 [0.000]
+Spirituality -5.000 [0.000] \ No newline at end of file
diff --git a/lib/mods/theme/help/r_dragon.txt b/lib/mods/theme/help/r_dragon.txt
new file mode 100644
index 00000000..097d6462
--- /dev/null
+++ b/lib/mods/theme/help/r_dragon.txt
@@ -0,0 +1,33 @@
+~~~~~01|Dragons
+~~~~~02|Races|Dragons
+#####R=== Dragons ===
+
+#####GDescription
+Dragons are majestic creatures of power traditionally aligned with
+the forces of evil. However, some may choose to become adventurers.
+They may not wield any weapons, bows, or play musical instruments.
+However, they are able to fly from birth, and gain resistances to
+some of the elements (depending on their subrace). Dragons have to
+choose a subrace specific to their race. Dragons make very good
+Mages, but they cannot become Geomancers, because they are unable
+to wield mage staves. As winged beings, Dragons may not wear cloaks.
+
+#####GStat Modifiers
+Strength +3
+Intelligence +2
+Wisdom +2
+Dexterity -2
+Constitution +2
+Charisma -5
+Hit Dice Sides 9
+Exp Penalty +150%
+
+#####GRacial Skills
+Combat 0.000 [0.000]
+ Barehand-combat 0.000 [0.400]
+Sneakiness 0.000 [0.000]
+ Stealth -10.000 [0.000]
+ Disarming 1.000 [0.000]
+Magic 0.000 [0.000]
+ Magic-Device 0.500 [0.000]
+Spirituality -4.000 [0.000] \ No newline at end of file
diff --git a/lib/mods/theme/help/r_drkelf.txt b/lib/mods/theme/help/r_drkelf.txt
new file mode 100644
index 00000000..3f0758e5
--- /dev/null
+++ b/lib/mods/theme/help/r_drkelf.txt
@@ -0,0 +1,33 @@
+~~~~~01|Dark Elf
+~~~~~02|Races|Dark Elf
+#####R=== Dark Elves ===
+
+#####GDescription
+Another dark, cave-dwelling race, likewise unhampered by darkness attacks,
+the Dark Elves have a long tradition and knowledge of magic. With their
+intelligence and wisdom they can become superb mages or priests, and they
+have an inherent magic missile attack available to them at a low level. With
+their keen sight, they also learn to see invisible things as their relatives
+the High-Elves do, but at a higher level.
+
+#####GStat Modifiers
+Strength -1
+Intelligence +3
+Wisdom +2
+Dexterity +2
+Constitution -2
+Charisma +1
+Hit Dice Sides 9
+Exp Penalty +50%
+
+#####GRacial Skill Modifiers:
+#####BSkill Start Mod Skill Point Gains Mod
+Combat
+ Weaponmastery -0.500 [0.000]
+ Archery 1.000 [0.000]
+Sneakiness 0.800 [0.000]
+ Stealth 3.000 [0.000]
+ Disarming 0.500 [0.000]
+Magic 0.000 [0.200]
+ Magic-Device 1.500 [0.000]
+Spirituality 10.000 [0.000]
diff --git a/lib/mods/theme/help/r_druadan.txt b/lib/mods/theme/help/r_druadan.txt
new file mode 100644
index 00000000..bf063956
--- /dev/null
+++ b/lib/mods/theme/help/r_druadan.txt
@@ -0,0 +1,32 @@
+~~~~~01|Druedain
+~~~~~02|Races|Druadan
+#####R=== Druedain ===
+
+#####GDescription
+An ancient branch of the race of Men, they are somewhat weaker, but wiser
+and better at disguise. They can learn to throw poisoned darts (of which
+they carry an unlimited supply). They are also inherently resistant to
+poison, and can become adequate fighters.
+
+#####GStat Modifiers
+Strength -2
+Intelligence -3
+Wisdom 2
+Dexterity 3
+Constitution -2
+Charisma -2
+Hit Dice Sides 9
+Exp Penalty +15%
+
+#####GRacial Skill Modifiers:
+#####BSkill Start Mod Skill Point Gains Mod
+Combat 0.000 [0.000]
+ Weaponmastery 1.000 [0.000]
+ Archery 0.800 [0.000]
+ Boomerang-mastery 0.000 [0.250]
+Sneakiness 0.100 [0.000]
+ Stealth 1.000 [0.000]
+ Disarming -0.200 [0.000]
+Magic 0.000 [0.000]
+ Magic-Device -0.300 [0.000]
+Spirituality -1.000 [0.000] \ No newline at end of file
diff --git a/lib/mods/theme/help/r_dunad.txt b/lib/mods/theme/help/r_dunad.txt
new file mode 100644
index 00000000..79b85049
--- /dev/null
+++ b/lib/mods/theme/help/r_dunad.txt
@@ -0,0 +1,32 @@
+~~~~~01|Dunedain
+~~~~~02|Races|Dunedain
+#####R=== Dunedain ===
+
+#####GDescription
+Dunedain are a race of hardy men from the West. This elder race surpasses
+human abilities in every field, especially constitution. However, being
+men of the world, very little is new to them, and levels are very hard for
+them to gain. They can play all classes. Their constitution cannot be
+reduced and they regain hit points quickly.
+
+#####GStat Modifiers
+Strength +1
+Intelligence +2
+Wisdom +2
+Dexterity +2
+Constitution +3
+Charisma +2
+Hit Dice Sides 10
+Exp Penalty +80%
+
+#####GRacial Skill Modifiers:
+#####BSkill Start Mod Skill Point Gains Mod
+Combat
+ Weaponmastery 1.500 [0.000]
+ Archery 1.000 [0.000]
+Sneakiness 0.800 [0.000]
+ Stealth 2.000 [0.000]
+ Disarming 0.400 [0.000]
+Magic
+ Magic-Device 0.500 [0.000]
+Spirituality 2.500 [0.000]
diff --git a/lib/mods/theme/help/r_dwarf.txt b/lib/mods/theme/help/r_dwarf.txt
new file mode 100644
index 00000000..6c5a9b80
--- /dev/null
+++ b/lib/mods/theme/help/r_dwarf.txt
@@ -0,0 +1,39 @@
+~~~~~01|Dwarf
+~~~~~02|Races|Dwarf
+#####R=== Dwarves ===
+
+#####GDescription
+Dwarves are the headstrong miners and fighters of legend. Since dungeons
+are the natural home of a dwarf, they are excellent choices for a warrior
+or priest. Dwarves tend to be stronger and tougher but less agile and
+intelligent than humans. Because they are so headstrong and are somewhat
+wise, they resist spells which are cast on them. Dwarves also have very
+good infra-vision because they live underground. They do have one big
+drawback, though: dwarves are loud-mouthed and proud, singing in boisterous
+voices, arguing with themselves for no good reason, and screaming out
+challenges at nearby foes. In other words, dwarves have miserable
+stealth. They can never be blinded, and they can also open secret tunnels
+through rock.
+
+#####GStat Modifiers
+Strength +2
+Intelligence -2
+Wisdom +2
+Dexterity -2
+Constitution +2
+Charisma -3
+Hit Dice Sides 11
+Exp Penalty +25%
+
+#####GRacial Skill Modifiers:
+#####BSkill Start Mod Skill Point Gains Mod
+Combat
+ Weaponmastery 1.500 [0.000]
+ Axe-mastery 0.000 [0.200]
+ Archery 0.500 [0.000]
+Sneakiness 0.700 [0.000]
+ Stealth -1.000 [0.000]
+ Disarming 0.200 [0.000]
+Magic
+ Magic-Device 0.900 [0.000]
+Spirituality 5.000 [0.000]
diff --git a/lib/mods/theme/help/r_eagle.txt b/lib/mods/theme/help/r_eagle.txt
new file mode 100644
index 00000000..cd59aaaf
--- /dev/null
+++ b/lib/mods/theme/help/r_eagle.txt
@@ -0,0 +1,32 @@
+~~~~~01|Eagle
+~~~~~02|Races|Eagle
+#####R=== Eagles ===
+
+#####GDescription
+"The Eagles are coming! The Eagles are coming!" Ever has this cry signified
+the Great Eagles of Manwe coming to a battlefield or a dire emergency to aid
+the forces of good. Majestic magical birds ever faithful to Manwe Sulimo,
+though they may choose to worship other Valar during their time on Arda. They
+have been given many gifts by Manwe, not the least important of which is the
+ability to resist the elements as they mature. They cannot wield weapons,
+bows, or play musical instruments, however. The Eagles' greatest enemies are
+the dragons, and they learn to detect the presence of dragons fairly early.
+As winged creatures, Eagles may not wear cloaks.
+
+#####GStat Modifiers
+Strength +6
+Intelligence +2
+Wisdom +1
+Dexterity -2
+Constitution +3
+Charisma +6
+Hit Dice Sides 12
+Exp Penalty +200%
+
+#####GRacial Skills
+Combat 0.000 [0.000]
+ Barehand-combat 1.000 [0.300]
+Sneakiness 3.000 [0.000]
+ Stealth -16.000 [0.000]
+ Disarming 6.000 [0.000]
+Spirituality 5.000 [0.000] \ No newline at end of file
diff --git a/lib/mods/theme/help/r_easterl.txt b/lib/mods/theme/help/r_easterl.txt
new file mode 100644
index 00000000..2370d260
--- /dev/null
+++ b/lib/mods/theme/help/r_easterl.txt
@@ -0,0 +1,34 @@
+~~~~~01|Easterling
+~~~~~02|Races|Easterling
+#####R=== Easterlings ===
+
+#####GDescription
+From the time of the Dagor Bragollach, the Easterlings have stood as
+the treacherous race of men. Swarthy and stout, these humans cannot
+be stunned, get a penchant for landing on their feet, and are not
+confused easily, once they have gained some experience. They are equally
+good at all kinds of weapons, being trained in combat from an early age.
+They do not trust magic, however, and have little skill in it.
+
+#####GStat Modifiers
+Strength +2
+Intelligence -2
+Wisdom -2
+Dexterity -2
+Constitution +2
+Charisma -1
+Hit Dice Sides 10
+Exp Penalty +40%
+
+#####GSkill bonuses (supplementary to existing skills)
+Combat 1.000 [0.100]
+ Weaponmastery 0.500 [0.100]
+ Sword-mastery 0.000 [0.100]
+ Axe-mastery 0.000 [0.100]
+ Hafted-mastery 0.000 [0.100]
+ Polearm-mastery 0.000 [0.100]
+ Archery 2.000 [0.200]
+Sneakiness 1.000 [0.300]
+ Stealth 1.000 [0.200]
+ Disarming 1.000 [0.200]
+Spirituality 2.500 [0.300] \ No newline at end of file
diff --git a/lib/mods/theme/help/r_elf.txt b/lib/mods/theme/help/r_elf.txt
new file mode 100644
index 00000000..6b4ceb3b
--- /dev/null
+++ b/lib/mods/theme/help/r_elf.txt
@@ -0,0 +1,32 @@
+~~~~~01|Elf
+~~~~~02|Races|Elf
+#####R=== Elves ===
+
+#####GDescription
+Elves are better magicians than humans, but not as good at fighting. They
+tend to be smarter and faster than either humans or half-elves and also
+have better wisdom. Elves are better at searching, disarming, perception,
+stealth, bows, and magic, but they are not as good at hand weapons.
+They resist light effects intrinsically.
+
+#####GStat Modifiers
+Strength -1
+Intelligence +2
+Wisdom +2
+Dexterity +1
+Constitution -2
+Charisma +2
+Hit Dice Sides 8
+Exp Penalty +20%
+
+#####GRacial Skill Modifiers:
+#####BSkill Start Mod Skill Point Gains Mod
+Combat
+ Weaponmastery -5.000 [0.000]
+ Archery 1.500 [0.000]
+Sneakiness 0.800 [0.000]
+ Stealth 2.000 [0.000]
+ Disarming 0.500 [0.000]
+Magic
+ Magic-Device 0.600 [0.000]
+Spirituality 3.000 [0.000]
diff --git a/lib/mods/theme/help/r_ent.txt b/lib/mods/theme/help/r_ent.txt
new file mode 100644
index 00000000..1b3e047e
--- /dev/null
+++ b/lib/mods/theme/help/r_ent.txt
@@ -0,0 +1,39 @@
+~~~~~01|Ent
+~~~~~02|Races|Ent
+#####R=== Ents ===
+
+#####GDescription
+The Ents are a powerful race dating back to the beginning of the world and
+are the eldest of all animals or plants that inhabit Arda. Spirits of the land,
+they were summoned to guard the forests of Middle-earth. Being much like
+trees they are very slow but strong, and very susceptible to fire. They cannot
+be poisoned, however, and their bark is very tough. As the Shepherds of the Trees,
+they have the innate ability to cause trees to rise about them for protection.
+
+#####GStat Modifiers
+Strength +10
+Intelligence -3
+Wisdom +2
+Dexterity -5
+Constitution +11
+Charisma -3
+Hit Dice Sides 14
+Exp Penalty +110%
+
+#####GRacial Skill Modifiers:
+#####BSkill Start Mod Skill Point Gains Mod
+Combat
+ Weaponmastery -0.300 [0.000]
+ Archery -0.200 [0.000]
+ Barehand-combat 0.000 [0.200]
+ Boulder-throwing 0.000 [0.600]
+Sneakiness 0.500 [0.000]
+ Stealth -6.000 [0.000]
+ Disarming 0.500 [0.000]
+Magic
+ Magic-Device 0.500 [0.000]
+Spirituality 10.000 [0.000]
+
+#####GInnate Abilities:
+#####BAbility Character level
+Tree-walking 1
diff --git a/lib/mods/theme/help/r_gnome.txt b/lib/mods/theme/help/r_gnome.txt
new file mode 100644
index 00000000..8272e8a5
--- /dev/null
+++ b/lib/mods/theme/help/r_gnome.txt
@@ -0,0 +1,36 @@
+~~~~~01|Gnome
+~~~~~02|Races|Gnome
+#####R=== Gnomes ===
+
+#####GDescription
+Gnomes are smaller than dwarves but larger than halflings. Like the hobbits,
+they live in the earth in burrow-like homes. Gnomes make excellent magi,
+and have very good saving throws. They are good at searching, disarming,
+perception, and stealth. They have lower strength than humans and they are
+not very good at fighting with hand weapons, but have developed a fondness
+for the crossbow. Gnomes have fair infra-vision, so they can detect
+warm-blooded creatures at a distance. Gnomes are intrinsically protected
+against paralysis and some slowing effects. At higher levels, gnomes learn
+to teleport at will.
+
+#####GStat Modifiers
+Strength -1
+Intelligence +2
+Wisdom 0
+Dexterity +2
+Constitution +1
+Charisma -2
+Hit Dice Sides 8
+Exp Penalty +35%
+
+#####GRacial Skill Modifiers:
+#####BSkill Start Mod Skill Point Gains Mod
+Combat
+ Weaponmastery -0.800 [0.000]
+ Archery 1.200 [0.000]
+Sneakiness 0.600 [0.000]
+ Stealth 3.000 [0.000]
+ Disarming 1.000 [0.000]
+Magic
+ Magic-Device 1.200 [0.000]
+Spirituality 6.000 [0.000]
diff --git a/lib/mods/theme/help/r_hafelf.txt b/lib/mods/theme/help/r_hafelf.txt
new file mode 100644
index 00000000..ea748440
--- /dev/null
+++ b/lib/mods/theme/help/r_hafelf.txt
@@ -0,0 +1,31 @@
+~~~~~01|Half-Elf
+~~~~~02|Races|Half-Elf
+#####R=== Half-Elves ===
+
+#####GDescription
+Half-elves tend to be smarter and more agile than humans, but not as tough.
+Half-elves are slightly better at searching, disarming, saving throws,
+stealth, bows, and magic, but they are not as good at hand weapons. Half-
+elves may choose any class and do not receive any intrinsic abilities.
+
+#####GStat Modifiers
+Strength 0
+Intelligence +1
+Wisdom +1
+Dexterity +1
+Constitution -1
+Charisma +1
+Hit Dice Sides 9
+Exp Penalty +10%
+
+#####GRacial Skill Modifiers:
+#####BSkill Start Mod Skill Point Gains Mod
+Combat
+ Weaponmastery -1.000 [0.000]
+ Archery 0.500 [0.000]
+Sneakiness 0.600 [0.000]
+ Stealth 1.000 [0.000]
+ Disarming 0.200 [0.000]
+Magic
+ Magic-Device 0.300 [0.000]
+Spirituality 1.500 [0.000]
diff --git a/lib/mods/theme/help/r_hafogr.txt b/lib/mods/theme/help/r_hafogr.txt
new file mode 100644
index 00000000..2a173e98
--- /dev/null
+++ b/lib/mods/theme/help/r_hafogr.txt
@@ -0,0 +1,31 @@
+~~~~~01|Half-Ogre
+~~~~~02|Races|Half-Ogre
+#####R=== Half-Ogres ===
+
+#####GDescription
+Half-Ogres are a crossbreed between a human and an ogre. They are big, bad, and
+stupid. For warriors, they have all the necessary attributes, and they can even
+become priests: after all, they are related to Ogre Magi, from whom they have
+learned the skill of setting trapped runes once their level is high enough. Like
+orcs, they resist darkness, and like trolls, they have their strength sustained.
+
+#####GStat Modifiers
+Strength +3
+Intelligence -1
+Wisdom -1
+Dexterity -1
+Constitution +3
+Charisma -3
+Hit Dice Sides 12
+Exp Penalty +30%
+
+#####GRacial Skill Modifiers:
+#####BSkill Start Mod Skill Point Gains Mod
+Combat
+ Weaponmastery 2.000 [0.000]
+Sneakiness -0.100 [0.000]
+ Stealth -2.000 [0.000]
+ Disarming -0.300 [0.000]
+Magic
+ Magic-Device -0.500 [0.000]
+Spirituality -2.500 [0.000]
diff --git a/lib/mods/theme/help/r_hielf.txt b/lib/mods/theme/help/r_hielf.txt
new file mode 100644
index 00000000..3317a67b
--- /dev/null
+++ b/lib/mods/theme/help/r_hielf.txt
@@ -0,0 +1,34 @@
+~~~~~01|High-Elf
+~~~~~02|Races|High-Elf
+#####R=== High-Elves ===
+
+#####GDescription
+High-elves are a race of immortal beings dating from the beginning of
+time. They are masters of all skills, and are strong and intelligent.
+They can play all classes except rogues, and very well at that.
+High-elves begin their lives able to see the unseen, and resist light
+effects just like regular elves. However, there are few things that
+they have not seen already, and experience is very hard for them to
+gain.
+
+#####GStat Modifiers
+Strength +1
+Intelligence +3
+Wisdom +2
+Dexterity +3
+Constitution +1
+Charisma +5
+Hit Dice Sides 10
+Exp Penalty +100%
+
+#####GRacial Skill Modifiers:
+#####BSkill Start Mod Skill Point Gains Mod
+Combat
+ Weaponmastery 1.000 [0.000]
+ Archery 2.500 [0.000]
+Sneakiness 0.300 [0.000]
+ Stealth 4.000 [0.000]
+ Disarming 0.400 [0.000]
+Magic
+ Magic-Device 2.000 [0.000]
+Spirituality 10.000 [0.000]
diff --git a/lib/mods/theme/help/r_hobbit.txt b/lib/mods/theme/help/r_hobbit.txt
new file mode 100644
index 00000000..d9fafb08
--- /dev/null
+++ b/lib/mods/theme/help/r_hobbit.txt
@@ -0,0 +1,39 @@
+~~~~~01|Hobbit
+~~~~~02|Races|Hobbit
+#####R=== Hobbits ===
+
+#####GDescription
+Hobbits, or Halflings, are very good at ranged combat (especially with slings),
+throwing, and have good saving throws. They also are very good at searching,
+disarming, perception and stealth; so they make excellent rogues, but prefer
+to be called burglars. They are much weaker than humans, and no good at melee
+fighting. Halflings have fair infra-vision, so they can detect warm creatures
+at a distance. Hobbits have their dexterity sustained and in time they learn
+to cook a delicious meal from available ingredients. Their sturdy constitutions
+also allow them to resist the insidious poison of the ring-wraiths. They do not
+wear shoes, as their feet grow naturally thick, leathery soles which make shoes
+a chore to put on and take off.
+
+#####GStat Modifiers
+Strength -2
+Intelligence +2
+Wisdom +1
+Dexterity +3
+Constitution +2
+Charisma +1
+Hit Dice Sides 7
+Exp Penalty +10%
+
+#####GRacial Skill Modifiers:
+#####BSkill Start Mod Skill Point Gains Mod
+Combat
+ Weaponmastery -1.000 [0.000]
+ Archery 2.000 [0.000]
+ Sling-Mastery 0.000 [0.300]
+Sneakiness 1.200 [0.000]
+ Stealth 5.000 [0.000]
+ Disarming 1.500 [0.000]
+Magic
+ Magic-Device 1.800 [0.000]
+Spirituality 9.000 [0.000]
+
diff --git a/lib/mods/theme/help/r_human.txt b/lib/mods/theme/help/r_human.txt
new file mode 100644
index 00000000..57606764
--- /dev/null
+++ b/lib/mods/theme/help/r_human.txt
@@ -0,0 +1,23 @@
+~~~~~01|Human
+~~~~~02|Races|Human
+#####R=== Humans ===
+
+#####GDescription
+Humans act as a baseline race -- all other races are compared to them.
+Humans can choose any class and are average at everything. Humans tend to
+go up levels faster than most other races because of their shorter life
+spans. No racial adjustments or intrinsics occur to characters choosing
+the human race.
+
+#####GStat Modifiers
+Strength 0
+Intelligence 0
+Wisdom 0
+Dexterity 0
+Constitution 0
+Charisma 0
+Hit Dice Sides 10
+Exp Penalty 0%
+
+#####GRacial Skill Modifiers:
+None. Humans are the baseline race.
diff --git a/lib/mods/theme/help/r_maia.txt b/lib/mods/theme/help/r_maia.txt
new file mode 100644
index 00000000..d4a6c635
--- /dev/null
+++ b/lib/mods/theme/help/r_maia.txt
@@ -0,0 +1,20 @@
+~~~~~01|Maia
+~~~~~02|Races|Maia
+#####R=== Maia ===
+
+#####GDescription
+An old race, dating from before the creation of Arda, the Maiar were created by
+Eru to help the Valar in their task. However, they can not worship a God, nor
+is experience easy to remember for them. When they do finally manage to remember
+their encounters, they will find that their abilities will increase as they gain
+in knowledge.
+
+#####GStat Modifiers
+Strength 0
+Intelligence 0
+Wisdom 0
+Dexterity 0
+Constitution 0
+Charisma 0
+Hit Dice Sides 10
+Exp Penalty +0%
diff --git a/lib/mods/theme/help/r_orc.txt b/lib/mods/theme/help/r_orc.txt
new file mode 100644
index 00000000..c4bcf691
--- /dev/null
+++ b/lib/mods/theme/help/r_orc.txt
@@ -0,0 +1,35 @@
+~~~~~01|Orc
+~~~~~02|Races|Orc
+#####R=== Orcs ===
+
+#####GDescription
+Orcs make excellent warriors and decent priests, but are terrible at magic.
+They are as bad as dwarves at stealth, and horrible at searching, disarming,
+and perception. Orcs are quite ugly, and tend to pay more for goods in town.
+Orcs do make good warriors and rogues, for the simple reason that Orcs tend
+to have great constitutions and lots of hit points. Because of their
+preference for living underground rather than on the surface, orcs resist
+darkness attacks. Upon reaching experience level 3, an orc learns to dispel
+any fear that may be upon him.
+
+#####GStat Modifiers
+Strength +2
+Intelligence -1
+Wisdom 0
+Dexterity +1
+Constitution +1
+Charisma -4
+Hit Dice Sides 10
+Exp Penalty +10%
+
+#####GRacial Skill Modifiers:
+#####BSkill Start Mod Skill Point Gains Mod
+Combat
+ Weaponmastery 1.200 [0.000]
+ Archery -0.500 [0.000]
+Sneakiness
+ Stealth -1.000 [0.000]
+ Disarming -0.300 [0.000]
+Magic
+ Magic-Device -0.300 [0.000]
+Spirituality -1.000 [0.000]
diff --git a/lib/mods/theme/help/r_pettyd.txt b/lib/mods/theme/help/r_pettyd.txt
new file mode 100644
index 00000000..c8b8eba3
--- /dev/null
+++ b/lib/mods/theme/help/r_pettyd.txt
@@ -0,0 +1,30 @@
+~~~~~01|Petty Dwarf
+~~~~~02|Races|Petty Dwarf
+#####R=== Petty Dwarves ===
+
+#####GDescription
+A hated and persecuted race of nocturnal dwarves, these cave-dwellers are not
+bothered much by darkness. Their natural inclination to magically augmented
+items has made them immune to effects which could drain away magical
+enchantments, and, like ordinary dwarves, they can examine the dungeon to
+discover traps and secret doors. They are quite proficient as priests,
+warriors or rogues.
+
+#####GStat Modifiers
+Strength +1
+Intelligence -1
+Wisdom +2
+Dexterity 0
+Constitution +2
+Charisma -4
+Hit Dice Sides 11
+Exp Penalty +35%
+
+#####GRacial Skill Modifiers:
+#####BSkill Start Mod Skill Point Gains Mod
+Sneakiness 0.500 [0.000]
+ Stealth 1.000 [0.000]
+ Disarming 0.300 [0.000]
+Magic
+ Magic-Device 0.500 [0.000]
+Spirituality 5.000 [0.000]
diff --git a/lib/mods/theme/help/r_rohank.txt b/lib/mods/theme/help/r_rohank.txt
new file mode 100644
index 00000000..03391d4b
--- /dev/null
+++ b/lib/mods/theme/help/r_rohank.txt
@@ -0,0 +1,33 @@
+~~~~~01|RohanKnight
+~~~~~02|Races|RohanKnight
+#####R=== RohanKnights ===
+
+#####GDescription
+Knights of the Riddermark, these warriors are mounted upon swift steeds.
+Thus they receive a bonus to speed from the beginning and gain in speed
+as they become more experienced in riding. Wise through their prolonged
+contact with the Dunedain, their wrath may be seen in auras of war that
+drive their foes to confusion, and in a ray of light when jumping at light
+speed.
+
+#####GStat Modifiers
+Strength +4
+Intelligence -2
+Wisdom +3
+Dexterity +1
+Constitution +4
+Charisma +2
+Hit Dice Sides 10
+Exp Penalty +120%
+
+#####GRacial Skill Modifiers:
+#####BSkill Start Mod Skill Point Gains Mod
+Combat
+ Weaponmastery 0.100 [0.200]
+ Archery 0.500 [0.000]
+Sneakiness 0.100 [0.000]
+ Stealth -8.000 [0.000]
+ Disarming 1.000 [0.000]
+Magic
+ Magic-Device 0.500 [0.000]
+Spirituality 2.500 [0.000]
diff --git a/lib/mods/theme/help/r_troll.txt b/lib/mods/theme/help/r_troll.txt
new file mode 100644
index 00000000..f35e5aa6
--- /dev/null
+++ b/lib/mods/theme/help/r_troll.txt
@@ -0,0 +1,34 @@
+~~~~~01|Troll
+~~~~~02|Races|Troll
+#####R=== Trolls ===
+
+#####GDescription
+Trolls are incredibly strong, and have more hit points than most other
+character races, so they make great warriors, and marginal priests. They
+are also very stupid and clumsy. They are bad at searching, disarming,
+perception, and stealth. They are so ugly that an orc grimaces in their
+presence. They also happen to be fun to play.... Trolls always have
+their strength sustained. At higher levels, trolls learn to enter a
+berserk fury, and regenerate from their wounds automatically.
+
+#####GStat Modifiers
+Strength +4
+Intelligence -4
+Wisdom -2
+Dexterity -4
+Constitution +3
+Charisma -6
+Hit Dice Sides 12
+Exp Penalty +37%
+
+#####GRacial Skill Modifiers:
+#####BSkill Start Mod Skill Point Gains Mod
+Combat
+ Weaponmastery 2.000 [0.000]
+ Archery -1.000 [0.000]
+Sneakiness -0.100 [0.000]
+ Stealth -2.000 [0.000]
+ Disarming -0.500 [0.000]
+Magic
+ Magic-Device -0.800 [0.000]
+Spirituality -4.000 [0.000]
diff --git a/lib/mods/theme/help/r_wodelf.txt b/lib/mods/theme/help/r_wodelf.txt
new file mode 100644
index 00000000..1cb4bb55
--- /dev/null
+++ b/lib/mods/theme/help/r_wodelf.txt
@@ -0,0 +1,37 @@
+~~~~~01|Wood Elf
+~~~~~02|Races|Wood Elf
+#####R=== Wood Elves ===
+
+#####GDescription
+The first love of Wood Elves is hunting. As such, their skill with the bow
+is unparalleled. They train tirelessly with their bows, to the point of
+neglecting even melee skills. They resist light as with other elves, and
+do extra damage with a ranged weapon. They are almost custom made for the
+archer class, but also make interesting warriors. Even Wood Elf Mages
+are feasible, using the bow to attack and saving their magic for defence.
+They are more dangerous but less wise than High-Elves.
+
+#####GStat Modifiers
+Strength +2
+Intelligence +2
+Wisdom -3
+Dexterity +5
+Constitution 0
+Charisma +1
+Hit Dice Sides 7
+Exp Penalty +30%
+
+#####GRacial Skills
+Combat 0.000 [0.000]
+ Archery 4.000 [0.000]
+ Weaponmastery 1.000 [0.200]
+Sneakiness 0.800 [0.000]
+ Stealth 5.000 [0.000]
+ Disarming 0.500 [0.000]
+Magic 0.000 [0.000]
+ Magic-Device 0.600 [0.000]
+Spirituality 3.000 [0.000]
+
+#####GInnate Abilities:
+#####BAbility Character level
+Tree-walking 1
diff --git a/lib/mods/theme/help/r_yeek.txt b/lib/mods/theme/help/r_yeek.txt
new file mode 100644
index 00000000..bdc7dcc5
--- /dev/null
+++ b/lib/mods/theme/help/r_yeek.txt
@@ -0,0 +1,30 @@
+~~~~~01|Yeek
+~~~~~02|Races|Yeek
+#####R=== Yeeks ===
+
+#####GDescription
+Yeeks are the least powerful of all the races. They suffer disadvantages
+in nearly all skills and attributes but to compensate they learn (and thus
+gain levels) extremely quickly.
+
+#####GStat Modifiers
+Strength -5
+Intelligence -5
+Wisdom -5
+Dexterity -5
+Constitution -5
+Charisma -5
+Hit Dice Sides 6
+Exp Penalty -75%
+
+#####GRacial Skill Modifiers:
+#####BSkill Start Mod Skill Point Gains Mod
+Combat
+ Weaponmastery -0.500 [0.000]
+ Archery -0.500 [0.000]
+Sneakiness -0.500 [0.000]
+ Stealth -5.000 [0.000]
+ Disarming -0.500 [0.000]
+Magic
+ Magic-Device -0.500 [0.000]
+Spirituality -2.500 [0.000]
diff --git a/lib/mods/theme/help/rm_adanrog.txt b/lib/mods/theme/help/rm_adanrog.txt
new file mode 100644
index 00000000..5e4a46b9
--- /dev/null
+++ b/lib/mods/theme/help/rm_adanrog.txt
@@ -0,0 +1,31 @@
+~~~~~01|Adanrog
+~~~~~02|Race Modifiers|Adanrog
+#####R=== Adanroeg (Man-demons) ===
+
+#####GDescription
+The greatest of all the lesser demons, these are humanoid
+figures wreathed in living flame. Their most obvious
+advantage is that they are completely immune to fire from
+birth, because they are born in fire and all carry a small
+part of the Flame of Udun inside them. They are equally
+good at magic and combat. With time, they learn to channel
+the forces of darkness to temporarily assume Balrog form.
+
+#####GStat Modifiers
+Strength +1
+Intelligence +1
+Wisdom +1
+Dexterity +1
+Constitution +1
+Charisma +1
+Hit Dice +3 sides
+Exp Penalty +50%
+
+#####GSkill Bonuses (supplementary to existing skills)
+Combat 0.000 [0.300]
+Magic 0.000 [0.300]
+
+#####GStarting Equipment
+An Adanrog character begins the game with:
+ Some rations
+ Some torches \ No newline at end of file
diff --git a/lib/mods/theme/help/rm_aewrog.txt b/lib/mods/theme/help/rm_aewrog.txt
new file mode 100644
index 00000000..28d8013f
--- /dev/null
+++ b/lib/mods/theme/help/rm_aewrog.txt
@@ -0,0 +1,35 @@
+~~~~~01|Aewrog
+~~~~~02|Race Modifiers|Aewrog
+#####R=== Aewroeg (Bird Demons) ===
+
+#####GDescription
+The Aewroeg are birds corrupted by Morgoth into foul
+birdlike beings with dazzling wings. They are somewhat
+physically weak, but expert at befuddling enemies so
+that they believe they'd never seen anything so fair.
+They can fly, and their charisma is naturally sustained.
+With experience, they learn to resist fire and to
+prevent holding magics. They also have an innate ability
+to flap their wings to create mesmerising illusions.
+Good magic users, they are particularly skilled at the
+Mind school.
+
+#####GStat Modifiers
+Strength -2
+Intelligence 0
+Wisdom 0
+Dexterity 0
+Constitution 0
+Charisma +3
+Hit Dice +1 sides
+Exp Penalty +0%
+
+#####GSkill Bonuses (supplementary to existing skills)
+Magic 0.000 [0.200]
+Mind 1.000 [0.300]
+
+#####GStarting Equipment
+An Aewrog character begins the game with:
+ Some rations
+ Some torches
+ A spellbook of Charm \ No newline at end of file
diff --git a/lib/mods/theme/help/rm_barb.txt b/lib/mods/theme/help/rm_barb.txt
new file mode 100644
index 00000000..57d793ff
--- /dev/null
+++ b/lib/mods/theme/help/rm_barb.txt
@@ -0,0 +1,38 @@
+~~~~~01|Barbarian
+~~~~~02|Race Modifiers|Barbarian
+#####R=== Barbarian Race ===
+
+#####GDescription
+Barbarians are hardy members of their race. They are fierce in combat, and
+their wrath is feared throughout the world. Combat is their life: they learn
+to feel no fear. Barbarians are, however, suspicious of magic, which makes
+magic devices fairly hard for them to use, and also makes it impossible for
+them to play Mages.
+
+#####GStat Modifiers
+Strength +2
+Intelligence -3
+Wisdom -2
+Dexterity +1
+Constitution +1
+Charisma -3
+Hit Dice +1 side
+Spell Points -50%
+Exp Penalty +25%
+
+#####GRacial Skill Modifiers:
+#####BSkill Start Mod Skill Point Gains Mod
+Combat
+ Weaponmastery 1.200 [0.000]
+ Archery 0.500 [0.000]
+Sneakiness
+ Stealth -2.000 [0.000]
+ Disarming -0.200 [0.000]
+Magic
+ Magic-Device -1.000 [0.000]
+Spirituality 0.200 [0.000]
+
+#####GStarting Equipment
+A barbarian character begins the game with:
+ Some rations
+ Some torches
diff --git a/lib/mods/theme/help/rm_black.txt b/lib/mods/theme/help/rm_black.txt
new file mode 100644
index 00000000..1570389c
--- /dev/null
+++ b/lib/mods/theme/help/rm_black.txt
@@ -0,0 +1,31 @@
+~~~~~01|Black
+~~~~~02|Race Modifiers|Black
+#####R=== Black Dragons ===
+
+#####GDescription
+These dragons are utterly in command of the element of acid. They
+resist acid very well and learn to become impervious to it with
+experience. Their glistening coats are so beautiful that those who
+look upon them cannot help but marvel at their majesty. The more
+experience they gain, the more charismatic they become. They have
+an innate ability to spit acid collected at the bottom of their
+stomach, and they have access to the Water school of magic.
+
+#####GStat Modifiers
+Strength 0
+Intelligence 0
+Wisdom 0
+Dexterity 0
+Constitution 0
+Charisma +3
+Hit Dice +0 sides
+Exp Penalty +0%
+
+#####GSkill Bonuses (supplementary to existing skills)
+Water 1.000 [0.600]
+
+#####GStarting Equipment
+A Black dragon character begins the game with:
+ Some rations
+ Some torches
+ A spellbook of Geyser \ No newline at end of file
diff --git a/lib/mods/theme/help/rm_blue.txt b/lib/mods/theme/help/rm_blue.txt
new file mode 100644
index 00000000..d6d0bbeb
--- /dev/null
+++ b/lib/mods/theme/help/rm_blue.txt
@@ -0,0 +1,31 @@
+~~~~~01|Blue
+~~~~~02|Race Modifiers|Blue
+#####R=== Blue Dragons ===
+
+#####GDescription
+These dragons are utterly in command of the element of Earth.
+As such, they have an innate resistance to electricity, which
+with time becomes full immunity, as they can use the power of
+the Earth to neutralize electrical discharges. They have access
+to the Earth school of magic and can conjure up showers of
+blazing sparks to dazzle their opponents. They are especially
+agile and lithe, and their dexterity will increase with experience.
+
+#####GStat Modifiers
+Strength 0
+Intelligence 0
+Wisdom 0
+Dexterity +3
+Constitution 0
+Charisma 0
+Hit Dice +0 sides
+Exp Penalty +0%
+
+#####GSkill Bonuses (supplementary to existing skills)
+Earth 1.000 [0.600]
+
+#####GStarting Equipment
+A Blue dragon character begins the game with:
+ Some rations
+ Some torches
+ A spellbook of Stone Skin
diff --git a/lib/mods/theme/help/rm_cabrog.txt b/lib/mods/theme/help/rm_cabrog.txt
new file mode 100644
index 00000000..eee1dada
--- /dev/null
+++ b/lib/mods/theme/help/rm_cabrog.txt
@@ -0,0 +1,35 @@
+~~~~~01|Caborrog
+~~~~~02|Race Modifiers|Caborrog
+#####R=== Caborroeg (Frog Demons) ===
+
+#####GDescription
+These demons are frogs that have been corrupted by Melkor.
+Small humanoids with quick, darting eyes and a penchant
+for emitting loud croaks. As such, they are not very
+strong or stealthy - however, they are quite fast and
+smart. With experience, they learn to develop a special
+protective layer around themselves and do not even need
+to wear armour. Expert magic users, their intelligence
+increases with experience, and they have access to the
+Conveyance and Temporal schools of magic.
+
+#####GStat Modifiers
+Strength -1
+Intelligence +2
+Wisdom +1
+Dexterity 0
+Constitution 0
+Charisma -3
+Hit Dice +2 sides
+Exp Penalty +10%
+
+#####GSkill Bonuses (supplementary to existing skills)
+Dodging 1.000 [0.400]
+Magic 0.000 [0.200]
+Conveyance 0.000 [0.300]
+Temporal 0.000 [0.300]
+
+#####GStarting Equipment
+A Caborrog character begins the game with:
+ Some rations
+ Some torches \ No newline at end of file
diff --git a/lib/mods/theme/help/rm_class.txt b/lib/mods/theme/help/rm_class.txt
new file mode 100644
index 00000000..81f72d87
--- /dev/null
+++ b/lib/mods/theme/help/rm_class.txt
@@ -0,0 +1,14 @@
+~~~~~01|Classical
+~~~~~02|Race Modifiers|Classical
+#####R=== Classical Race ===
+
+#####GDescription
+This is the normal, classical character of your chosen race.
+
+#####GStat Modifiers
+No changes to stats.
+
+#####GStarting Equipment
+A classical character begins the game with:
+ Some rations
+ Some torches
diff --git a/lib/mods/theme/help/rm_drarog.txt b/lib/mods/theme/help/rm_drarog.txt
new file mode 100644
index 00000000..7794f2cd
--- /dev/null
+++ b/lib/mods/theme/help/rm_drarog.txt
@@ -0,0 +1,34 @@
+~~~~~01|Draugrog
+~~~~~02|Race Modifiers|Draugrog
+#####R=== Draugroeg (Wolf Demons) ===
+
+#####GDescription
+Humanoids with long, snoutlike faces and shaggy fur around
+the ears. They learn more quickly and have more magical
+powes than their Hurog cousins. They have a tendency to
+snarl, however, which makes them quite unstealthy. They too
+learn to detect living and non-living beings around them as
+they gain experience, but they can also learn to detect the
+presence of powerful objects and beings before they even get
+near them. Good with magic, they have the ability to harness
+the power of their mind.
+
+#####GStat Modifiers
+Strength +1
+Intelligence +1
+Wisdom +1
+Dexterity +1
+Constitution +1
+Charisma -1
+Hit Dice +0 sides
+Exp Penalty -20%
+
+#####GSkill Bonuses (supplementary to existing skills)
+Magic 0.000 [0.200]
+Spirituality 0.000 [0.200]
+Mindcraft 1.000 [0.500]
+
+#####GStarting Equipment
+A Draugrog character begins the game with:
+ Some rations
+ Some torches \ No newline at end of file
diff --git a/lib/mods/theme/help/rm_ether.txt b/lib/mods/theme/help/rm_ether.txt
new file mode 100644
index 00000000..ee49f002
--- /dev/null
+++ b/lib/mods/theme/help/rm_ether.txt
@@ -0,0 +1,32 @@
+~~~~~01|Ethereal
+~~~~~02|Race Modifiers|Ethereal
+#####R=== Ethereal Dragons ===
+
+#####GDescription
+These dragons are powerful undead creatures, able to both fly and
+pass through solid objects with ease. Because of their previous
+experiences, they are much wiser than other dragons, and being
+undead, they know very well how to keep hold of their life force.
+As undead, they have access to the realm of chaos in the nether
+world, and can learn to breathe chaos at their enemies. Their
+wisdom increases with time, granting them access to the complex
+Meta school of magic.
+
+#####GStat Modifiers
+Strength 0
+Intelligence 0
+Wisdom +3
+Dexterity 0
+Constitution 0
+Charisma 0
+Hit Dice +0 sides
+Exp Penalty +0%
+
+#####GSkill Bonuses (supplementary to existing skills)
+Meta 1.000 [0.600]
+
+#####GStarting Equipment
+An Ethereal dragon character begins the game with:
+ Some rations
+ Some torches
+ A spellbook of Recharge
diff --git a/lib/mods/theme/help/rm_green.txt b/lib/mods/theme/help/rm_green.txt
new file mode 100644
index 00000000..0e07d6aa
--- /dev/null
+++ b/lib/mods/theme/help/rm_green.txt
@@ -0,0 +1,30 @@
+~~~~~01|Green
+~~~~~02|Race Modifiers|Green
+#####R=== Green Dragons ===
+
+#####GDescription
+Sickly greenish vapours rise from the scales and skin of these
+dragons. They have utter mastery of environmental poisons and
+air, and so are much healthier than other dragons, and do not
+succumb to constitution-draining attacks. They have ability to
+instantly forge poison darts from the upper layer of their scales,
+and they have access to the Air school of magic.
+
+#####GStat Modifiers
+Strength 0
+Intelligence 0
+Wisdom 0
+Dexterity 0
+Constitution +3
+Charisma 0
+Hit Dice +0 sides
+Exp Penalty +0%
+
+#####GSkill Bonuses (supplementary to existing skills)
+Air 1.000 [0.600]
+
+#####GStarting Equipment
+A Green dragon character begins the game with:
+ Some rations
+ Some torches
+ A spellbook of Noxious Cloud
diff --git a/lib/mods/theme/help/rm_herm.txt b/lib/mods/theme/help/rm_herm.txt
new file mode 100644
index 00000000..4787b8ae
--- /dev/null
+++ b/lib/mods/theme/help/rm_herm.txt
@@ -0,0 +1,36 @@
+~~~~~01|Hermit
+~~~~~02|Race Modifiers|Hermit
+#####R=== Hermit Race ===
+
+#####GDescription
+Hermits live retired from the world. Spending long hours studying, they
+weaken their physical side while they strengthen their spiritual powers.
+Thus they get higher mana reserves but are much worse at physical combat.
+
+#####GStat Modifiers
+Strength -3
+Intelligence +1
+Wisdom +1
+Dexterity -3
+Constitution -3
+Charisma +1
+Hit Dice -3 sides
+Spell Points +20%
+Exp Penalty +20%
+
+#####GRacial Skill Modifiers:
+#####BSkill Start Mod Skill Point Gains Mod
+Combat
+ Weaponmastery -0.500 [0.000]
+ Archery -0.500 [0.000]
+Sneakiness 0.400 [0.000]
+ Stealth 3.000 [0.000]
+ Disarming 0.500 [0.000]
+Magic
+ Magic-Device 1.000 [0.000]
+Spirituality 0.500 [0.000]
+
+#####GStarting Equipment
+A hermit begins the game with:
+ Some rations
+ Some torches
diff --git a/lib/mods/theme/help/rm_hurog.txt b/lib/mods/theme/help/rm_hurog.txt
new file mode 100644
index 00000000..10b6b922
--- /dev/null
+++ b/lib/mods/theme/help/rm_hurog.txt
@@ -0,0 +1,27 @@
+~~~~~01|Hurog
+~~~~~02|Race Modifiers|Hurog
+#####R=== Huroeg (Dog Demons) ===
+
+#####GDescription
+The Huroeg are dogs that have been corrupted by Melkor -
+Humanoid creatures with doglike snouts and elongated ears.
+One of the lowest form of demons, they have an uncanny
+sense of smell which increase with experience, so that
+these creatures learn to detect every living thing around
+them. They are very good at detecting treasure, and will
+become expert at searching for hidden passageways and traps.
+
+#####GStat Modifiers
+Strength -1
+Intelligence 0
+Wisdom 0
+Dexterity 0
+Constitution -1
+Charisma 0
+Hit Dice +0 sides
+Exp Penalty -10%
+
+#####GStarting Equipment
+A Hurog character begins the game with:
+ Some rations
+ Some torches \ No newline at end of file
diff --git a/lib/mods/theme/help/rm_limrog.txt b/lib/mods/theme/help/rm_limrog.txt
new file mode 100644
index 00000000..bf43a87b
--- /dev/null
+++ b/lib/mods/theme/help/rm_limrog.txt
@@ -0,0 +1,33 @@
+~~~~~01|Limrog
+~~~~~02|Race Modifiers|Limrog
+#####R=== Limroeg (Fish Demons) ===
+
+#####GDescription
+Humanoid creatures with gill slits at the necks. They can
+survive underwater for extended periods of time, and with
+sufficient experience, they'll learn to breathe without any
+air at all. Somewhat weak and sickly, they are highly agile
+and masters of the Conveyance, Temporal, and Meta schools of
+magic. They also have several special abilities that enable
+them to disappear and reappear at will.
+
+#####GStat Modifiers
+Strength -2
+Intelligence +1
+Wisdom +1
+Dexterity +3
+Constitution -1
+Charisma -1
+Hit Dice +1 sides
+Exp Penalty +50%
+
+#####GSkill Bonuses (supplementary to existing skills)
+Magic 0.000 [0.200]
+Conveyance 0.000 [0.500]
+Temporal 0.000 [0.500]
+Meta 0.000 [0.500]
+
+#####GStarting Equipment
+A Limrog character begins the game with:
+ Some rations
+ Some torches \ No newline at end of file
diff --git a/lib/mods/theme/help/rm_lsoul.txt b/lib/mods/theme/help/rm_lsoul.txt
new file mode 100644
index 00000000..2f5e6e2c
--- /dev/null
+++ b/lib/mods/theme/help/rm_lsoul.txt
@@ -0,0 +1,26 @@
+~~~~~01|Lost Soul
+~~~~~02|Race Modifiers|Lost Soul
+#####R=== LostSoul ===
+
+#####GDescription
+
+#####RThis is a difficult modifier. Your character will almost always die quickly.
+#####RIt's probably best only to play it after you have some experience with normal
+#####Rcharacters.
+
+There are haunting whispers of souls that have come back from the Halls of
+Waiting, for purposes unknown. These are called Lost Souls, for it is presumed
+that their real body died off long ago, leaving only a soul to wander forever...
+or until killed again.
+Lost Souls start at level 98 of the Halls of Waiting. Very few ever make it out
+again. Those that do can continue as a fairly normal character, but with the
+advantage of any treasure and experience gained.
+
+#####GStat Modifiers
+No changes to stats.
+
+#####GStarting Equipment
+A Lost Soul starts the game with:
+ Some torches.
+ Over thirty scrolls of Identify.
+ Over twenty scrolls of Satisfy Hunger.
diff --git a/lib/mods/theme/help/rm_lygrog.txt b/lib/mods/theme/help/rm_lygrog.txt
new file mode 100644
index 00000000..80b6fa45
--- /dev/null
+++ b/lib/mods/theme/help/rm_lygrog.txt
@@ -0,0 +1,27 @@
+~~~~~01|Lygrog
+~~~~~02|Race Modifiers|Lygrog
+#####R=== Lygroeg (Snake Demons) ===
+
+#####GDescription
+These slithering snakelike demons lack many physical
+advantages of their humanoid cousins, but they have
+access to lost and forgotten realms of magic that
+enable them to overcome their physical handicaps, if
+they can survive long enough to reap the benefits of
+their experience, that is. As highly magical creatures,
+they are no good at anything else.
+
+#####GStat Modifiers
+Strength -3
+Intelligence +5
+Wisdom +5
+Dexterity +5
+Constitution -1
+Charisma -6
+Hit Dice +2 sides
+Exp Penalty +40%
+
+#####GStarting Equipment
+A Lygrog character begins the game with:
+ Some rations
+ Some torches \ No newline at end of file
diff --git a/lib/mods/theme/help/rm_narrog.txt b/lib/mods/theme/help/rm_narrog.txt
new file mode 100644
index 00000000..2f0ed5f9
--- /dev/null
+++ b/lib/mods/theme/help/rm_narrog.txt
@@ -0,0 +1,34 @@
+~~~~~01|Narrog
+~~~~~02|Race Modifiers|Narrog
+#####R=== Narroeg (Rat Demons) ===
+
+#####GDescription
+These ratlike demons have fangs that drip with venom.
+Their quick, scurrying feet enable them to gain speed
+as they gain experience. They learn to use the winglike
+appendages on their slick, black backs in order to fly.
+They are somewhat weak and sickly (though resistant to
+poison), but sly, cunning and agile. Good with magic,
+they can forge poison darts to throw at their opponents,
+and can become masters of disguise and disappearance.
+
+#####GStat Modifiers
+Strength -1
+Intelligence +1
+Wisdom +1
+Dexterity +1
+Constitution -1
+Charisma -2
+Hit Dice +1 sides
+Exp Penalty +20%
+
+#####GSkill Bonuses (supplementary to existing skills)
+Stealth 1.000 [0.500]
+Magic 0.000 [0.200]
+Conveyance 1.000 [0.300]
+
+#####GStarting Equipment
+A Narrog character begins the game with:
+ Some rations
+ Some torches
+ A spellbook of Phase Door \ No newline at end of file
diff --git a/lib/mods/theme/help/rm_rawrog.txt b/lib/mods/theme/help/rm_rawrog.txt
new file mode 100644
index 00000000..830a8dc3
--- /dev/null
+++ b/lib/mods/theme/help/rm_rawrog.txt
@@ -0,0 +1,30 @@
+~~~~~01|Rawrog
+~~~~~02|Race Modifiers|Rawrog
+#####R=== Rawroeg (Lion Demons) ===
+
+#####GDescription
+Tall humanoids with glorious red-gold hair and decidedly
+catlike faces, the Rawroeg are corrupted lions. Strong,
+healthy, intelligent and wise, they fear very little and
+can emit roars that instill fear into the very souls of
+their enemies. They learn to resist the elements fairly
+well as they gain experience. They make good warriors.
+
+#####GStat Modifiers
+Strength +2
+Intelligence +1
+Wisdom +1
+Dexterity -1
+Constitution +2
+Charisma +1
+Hit Dice +2 sides
+Exp Penalty +30%
+
+#####GSkill Bonuses (supplementary to existing skills)
+Combat 0.000 [0.100]
+Weaponmastery 0.000 [0.100]
+
+#####GStarting Equipment
+A Rawrog character begins the game with:
+ Some rations
+ Some torches \ No newline at end of file
diff --git a/lib/mods/theme/help/rm_red.txt b/lib/mods/theme/help/rm_red.txt
new file mode 100644
index 00000000..ac2ef2fc
--- /dev/null
+++ b/lib/mods/theme/help/rm_red.txt
@@ -0,0 +1,30 @@
+~~~~~01|Red
+~~~~~02|Race Modifiers|Red
+#####R=== Red Dragons ===
+
+#####GDescription
+These dragons are utterly in command of the element of fire.
+Not only are they surrounded by a fiery blaze, but they learn
+to withstand the effects of fire entirely as they become more
+experienced. They are also able to draw upon their master
+element to become even stronger as they mature. They can
+breathe fire and they have access to the Fire school of magic.
+
+#####GStat Modifiers
+Strength +3
+Intelligence 0
+Wisdom 0
+Dexterity 0
+Constitution 0
+Charisma 0
+Hit Dice +0 sides
+Exp Penalty +0%
+
+#####GSkill Bonuses (supplementary to existing skills)
+Fire 1.000 [0.600]
+
+#####GStarting Equipment
+A Red dragon character begins the game with:
+ Some rations
+ Some torches
+ A spellbook of Globe of Light
diff --git a/lib/mods/theme/help/rm_sarnrog.txt b/lib/mods/theme/help/rm_sarnrog.txt
new file mode 100644
index 00000000..4b34f0c0
--- /dev/null
+++ b/lib/mods/theme/help/rm_sarnrog.txt
@@ -0,0 +1,30 @@
+~~~~~01|Sarnrog
+~~~~~02|Race Modifiers|Sarnrog
+#####R=== Sarnroeg (Stone Demons ===
+
+#####GDescription
+Medium-sized winged humanoids that look like they are
+made of stone - they are Druedain that have been corrupted
+by Melkor. Though clumsy and dumb, they are strong and stout.
+They learn to resist the basic elements quite well, and they
+can sustain themselves by eating stones and rocks. They have
+the ability to throw boulders at their enemies, and are good
+at digging tunnels.
+
+#####GStat Modifiers
+Strength +2
+Intelligence -1
+Wisdom -2
+Dexterity -2
+Constitution +2
+Charisma -1
+Hit Dice +2 sides
+Exp Penalty +20%
+
+#####GSkill Bonuses (supplementary to existing skills)
+Boulder-throwing 1.000 [0.500]
+
+#####GStarting Equipment
+A Sarnrog character begins the game with:
+ Some rations
+ Some torches \ No newline at end of file
diff --git a/lib/mods/theme/help/rm_skel.txt b/lib/mods/theme/help/rm_skel.txt
new file mode 100644
index 00000000..aff6408d
--- /dev/null
+++ b/lib/mods/theme/help/rm_skel.txt
@@ -0,0 +1,40 @@
+~~~~~01|Skeleton
+~~~~~02|Race Modifiers|Skeleton
+#####R=== Skeletal Race ===
+
+#####GDescription
+As undead beings, skeletons need to worry very little about poison or
+attacks that can drain life. They do not really use eyes for perceiving
+things, and are thus not fooled by invisibility. Their bones are resistant
+to sharp shrapnels (not much to cut there), and they will quickly become
+resistant to cold. It is very hard for skeletons to eat food or drink potions.
+Although the magical effects of these will affect the skeleton even without
+entering the skeleton's (non-existent) belly, the potion / food itself will
+fall through the skeleton's jaws, giving no nutritional benefit.
+
+#####GStat Modifiers
+Strength 0
+Intelligence -2
+Wisdom -2
+Dexterity 0
+Constitution +1
+Charisma -4
+Hit Dice +0 sides
+Spell Points -30%
+Exp Penalty +45%
+
+#####GRacial Skill Modifiers:
+#####BSkill Start Mod Skill Point Gains Mod
+Combat
+ Weaponmastery 0.800 [0.000]
+Sneakiness -0.100 [0.000]
+ Stealth -1.000 [0.000]
+ Disarming -0.500 [0.000]
+Magic
+ Magic-Device -0.500 [0.000]
+Spirituality 0.500 [0.000]
+
+#####GStarting Equipment
+A skeletal character begins the game with:
+ Some scrolls of satisfy hunger
+ Some torches
diff --git a/lib/mods/theme/help/rm_spec.txt b/lib/mods/theme/help/rm_spec.txt
new file mode 100644
index 00000000..01802465
--- /dev/null
+++ b/lib/mods/theme/help/rm_spec.txt
@@ -0,0 +1,44 @@
+~~~~~01|Spectre
+~~~~~02|Race Modifiers|Spectre
+#####R=== Spectral Race ===
+
+#####GDescription
+
+Another powerful undead creature, the spectre is a ghastly apparition,
+surrounded by an unearthly glow. They exist only partially on our
+plane of existence: half-corporeal, they can pass through walls, though
+this requires a sacrifice of some of their life-force. As a result
+they cannot rest whilst passing through a wall.
+
+As undead, they have a firm hold on their life force, can see invisible, and
+resist poison and cold. They also resist nether. Spectres make superb
+spellcasters, but their physical form is very weak. Like Zombies,
+Spectres gain almost no nutrition from ordinary food.
+
+#####GStat Modifiers
+Strength -5
+Intelligence +4
+Wisdom +4
+Dexterity +2
+Constitution -3
+Charisma -6
+Hit Dice -3 sides
+Spell Points +5%
+Exp Penalty +80%
+
+#####GRacial Skill Modifiers:
+#####BSkill Start Mod Skill Point Gains Mod
+Combat
+ Weaponmastery -0.500 [0.000]
+ Archery -0.200 [0.000]
+Sneakiness 0.200 [0.000]
+ Stealth 2.000 [0.000]
+ Disarming 0.200 [0.000]
+Magic
+ Magic-Device 0.800 [0.000]
+Spirituality 0.700 [0.000]
+
+#####GStarting Equipment
+A spectral character begins the game with:
+ Some scrolls of satisfy hunger
+ Some torches
diff --git a/lib/mods/theme/help/rm_vamp.txt b/lib/mods/theme/help/rm_vamp.txt
new file mode 100644
index 00000000..22ae6514
--- /dev/null
+++ b/lib/mods/theme/help/rm_vamp.txt
@@ -0,0 +1,32 @@
+~~~~~01|Vampire
+~~~~~02|Race Modifiers|Vampire
+#####R=== Vampire ===
+
+#####GDescription
+One of the mightier undead creatures, the vampire is an awe-inspiring
+sight. Yet this mighty creature has a serious weakness: the bright rays of
+sun are its bane, and it will need to flee the surface to the deep
+recesses of the earth until the sun finally sets. Darkness, on the other
+hand, only makes the vampire stronger. Being undead, the vampire has a firm
+hold on its life force, and resists nether attacks. The vampire also
+resists cold and poison based attacks. It is, however, susceptible to its
+perpetual hunger for fresh blood, which can only be satiated by sucking
+the blood from a nearby monster, which is the vampire's special power.
+
+It should be noted that the vampires are so sensitive to daylight that even
+certain artifact light items which are filled with daylight will hurt them
+if they try to wield the items. Fortunately, the vampires do not really
+need these items, since they radiate an aura of 'dark light' of their own.
+Light resistance will, in any case, protect the vampire from the adverse
+effects of sunlight.
+
+#####GStat Modifiers
+Strength +3
+Intelligence +2
+Wisdom -3
+Dexterity -2
+Constitution +1
+Charisma -4
+Hit Dice +1 side
+Spell Points +0%
+Exp penalty +100%
diff --git a/lib/mods/theme/help/rm_white.txt b/lib/mods/theme/help/rm_white.txt
new file mode 100644
index 00000000..00f31694
--- /dev/null
+++ b/lib/mods/theme/help/rm_white.txt
@@ -0,0 +1,32 @@
+~~~~~01|White
+~~~~~02|Race Modifiers|White
+#####R=== White Dragons ===
+
+#####GDescription
+White dragons are extremely intelligent and calculating,
+always able to keep a cool head. They can breathe cold
+and freeze time and space long enough to divine what the
+future and present have in store, and to find out the
+abilities of objects. Their intelligence will increase as
+they gain experience. Naturally resistant to cold, they
+will learn to withstand its effects entirely with time.
+They are especially susceptible to fire attacks, however.
+
+#####GStat Modifiers
+Strength 0
+Intelligence +3
+Wisdom 0
+Dexterity 0
+Constitution 0
+Charisma 0
+Hit Dice +0 sides
+Exp Penalty +0%
+
+#####GSkill Bonuses (supplementary to existing skills)
+Divination 1.000 [0.600]
+
+#####GStarting Equipment
+A White dragon character begins the game with:
+ Some rations
+ Some torches
+ A spellbook of Sense Monsters
diff --git a/lib/mods/theme/help/rm_zomb.txt b/lib/mods/theme/help/rm_zomb.txt
new file mode 100644
index 00000000..be89162b
--- /dev/null
+++ b/lib/mods/theme/help/rm_zomb.txt
@@ -0,0 +1,39 @@
+~~~~~01|Zombie
+~~~~~02|Race Modifiers|Zombie
+#####R=== Zombie Race ===
+
+#####GDescription
+Much like Skeletons, zombies too are undead horrors: they are resistant to
+life-draining attacks, they become resistant to cold-based attacks (actually
+earlier than skeletons), resist poison and can see invisible, while being still
+vulnerable to cuts (unlike skeletons). They also gain very little nutrition from
+the food of mortals. However, zombies are, as the name implies, practically
+mindless.
+
+#####GStat Modifiers
+Strength +2
+Intelligence -6
+Wisdom -6
+Dexterity +1
+Constitution +4
+Charisma -5
+Hit Dice +3 sides
+Spell Points -30%
+Exp Penalty +45%
+
+#####GRacial Skill Modifiers:
+#####BSkill Start Mod Skill Point Gains Mod
+Combat
+ Weaponmastery 0.500 [0.000]
+Sneakiness -0.100 [0.000]
+ Stealth -1.000 [0.000]
+ Disarming -0.200 [0.000]
+Magic
+ Magic-Device -0.200 [0.000]
+Spirituality 0.500 [0.000]
+
+#####GStarting Equipment
+A zombie character begins the game with:
+ Some scrolls of satisfy hunger
+ Some torches
+
diff --git a/lib/mods/theme/help/skills.txt b/lib/mods/theme/help/skills.txt
new file mode 100644
index 00000000..c4a02c06
--- /dev/null
+++ b/lib/mods/theme/help/skills.txt
@@ -0,0 +1,539 @@
+|||||oy
+~~~~~55|Skills
+#####R=== ToME Skills System ===
+One of the big differences between standard "Vanilla" Angband and ToME is the
+implementation of a skill system where the player can choose what skills she
+will improve as her character progresses. As such, many abilities such as
+spell casting, fighting and trap disarming *do not* increase automatically -
+the player must choose to use skill points to improve those abilities. This
+gives the player the chance to tailor a character to suit their playing style
+with a lot more flexibility than has existed with a fixed progression system
+in the past. However, not all types of characters are able to gain skills to
+the same degree; while a fighter can learn some magic, he's unlikely to become
+as good at it as a mage can. So the number of skill points required to raise
+a skill to the next level varies according to the starting "type" of character.
+
+You can also spend skill points in "one-off purchase" *****ability.txt*0[Abilities].
+~~~~~56|Skills|Screen
+#####GThe Skills Menu
+Each time you gain a level of experience, you receive 6 skill points to spread
+around as you wish. To use these skill points, you need to access the skills
+menu ("G" for both keysets). This opens up a long list of abilities that can
+be improved. The menu may look something like this:
+
+&&&&&w w w w w w w w w w w w w w w w w w w w w w w w w w w w wTwowMwEw wSwkwiwlwlwsw wSwcwrwewewnw w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w
+&&&&&BEBnBtBeBrW WtWoW WdWeWvWeWlWoWpW WaW WbWrWaWnWcWhW,W BuBpW/BdBoBwBnW WtWoW WmWoWvWeW,W BrBiBgBhBtW/BlBeBfBtW WtWoW WmWoWdWiWfWyW,W B?W WfWoWrW WhWeWlWpw w w w
+&&&&&BSBkBiBlBlB BpBoBiBnBtBsB BlBeBfBtB:B B6w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w
+&&&&&yGyeynyeyryayly yaybyiylyiytyyy ytyoy yfyiygyhyty yaynydy ytyoy ypysyeyuydyoy-yiydy yayrymyoyrysy yaynydy ywyeyaypyoynysy.w w w w w w w w w w w w w w w w w w w
+&&&&&yIyty yaylysyoy yaylylyoywysy ytyoy yuysyey yhyeyayvyiyeyry yayrymyoyuyrysy ywyiytyhyoyuyty ypyeynyaylytyiyeysw w w w w w w w w w w w w w w w w w w w w w w w w
+&&&&&G[G-G]GCGoGmGbGaGtw w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w G0G2G.G0G0G0G G[G0G.G8G0G0G]w w w w w w
+&&&&&w w w w w w-w wWwewawpwownwmwawswtwewrwyw w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w0w1w.w0w0w0w w[w0w.w8w5w0w]w w w w w w
+&&&&&w w w w w w w w o o.o oSowooorodo-omoaosotoeoroyw w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w o0o0o.o0o0o0o o[o0o.o4o0o0o]w w w w w w
+&&&&&w w w w w w w w o o.o oAoxoeo-omoaosotoeoroyw w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w o0o0o.o0o0o0o o[o0o.o4o0o0o]w w w w w w
+&&&&&w w w w w w w w o o.o oHoaofotoeodo-omoaosotoeoroyw w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w o0o0o.o0o0o0o o[o0o.o4o0o0o]w w w w w w
+&&&&&w w w w w w w w o o.o oPoooloeoaoromo-omoaosotoeoroyw w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w o0o0o.o0o0o0o o[o0o.o4o0o0o]w w w w w w
+&&&&&w w w w w w.w wAwrwcwhwewrwyw w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w0w1w.w0w0w0w w[w0w.w6w0w0w]w w w w w w
+&&&&&w w w w o o.o oAonotoiomoaogoiocw w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w o0o0o.o0o0o0o o[o0o.o5o5o0o]w w w w w w
+&&&&&w w+w wSwnwewawkwiwnwewswsw w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w0w1w.w0w0w0w w[w0w.w9w0w0w]w w w w w w
+&&&&&w w+w wMwawgwiwcw w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w0w1w.w0w0w0w w[w0w.w3w0w0w]w w w w w w
+&&&&&w w-w wSwpwiwrwiwtwuwawlwiwtwyw w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w0w1w.w0w0w0w w[w0w.w4w0w0w]w w w w w w
+&&&&&w w w w o o.o oPoroaoyoeorw w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w o0o0o.o0o0o0o o[o0o.o5o0o0o]w w w w w w
+&&&&&o o.o oMooonosotoeoro-oloooroew w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w w o0o0o.o0o0o0o o[o0o.o5o0o0o]w w w w w w
+
+Now, looking at this screen, there are several things to be aware of. The
+first line lets you know if you have any available skill points to spend, and
+how many there are. Following that are 2 description lines for the currently
+selected skill - in this case they are describing the "Combat" skill. When
+looking at the list of skills, there are a few different colours used - the
+light green coloured skill (which also has its starting character in square
+brackets []) is the currently selected one - Combat in the example above.
+Skills that you cannot learn are omitted from the list. Skills that you are
+capable of learning, but as yet have not, are coloured in orange, while skills
+of which you have some knowledge are shown in white.
+
+At the end of each skill is a pair of numbers. The first represents your
+current level of knowledge in the skill, and the second how much an advance
+in this knowledge investing one skill point in this skill would produce. So,
+in the above example, if the player invested one skill point in their Combat
+skill, the skill would increase from 02.000 to 02.800.
+
+In addition, investing in some skills may raise your knowledge in others.
+This improvement is based on the modifier in the related class (the one which
+gets the free points). For example, a skill point put into Weaponmastery
+raises Combat by 0.5 skill points. This is actually multiplied by the skill
+modifier that your character has in the Combat skill. For example, a
+Swordmaster investing a skill point into Weaponmastery would have his Combat
+skill raised by 0.5 * [0.900] while a Runecrafter would have his Combat
+skill raised by 0.5 * [0.200].
+
+As well as this, skills are grouped together in similar types. Looking under
+the Combat skill, there are subtypes of Weaponmastery, Archery and Antimagic.
+An increase of one of these subskills may also increase the main skill by a
+small amount. You can tell which skills have subskills by the + (or -) in front
+of their name. The + indicates that there are more skills within this category.
+To open a skill category up, move the cursor up/down until the skill category
+is green, then hit the "Enter" key. Likewise, the - indicates that the category
+is already opened, and selecting this and hitting the "Enter" key will close it
+up again. Skills which don't have usable subskills start with a ".".
+
+To spend points on a skill (including skill categories), use the left/right
+arrow (right arrow or "6" adds one skill point, left arrow or "4" removes
+one). Spending points on a sub-skill will also marginally improve the parent
+skill (or skill category). When you've finished spending skill points (and any
+unspent points *will* be saved), hit the "Esc" key to finish. This will give
+a confirmation prompt to check that you really do want to spend your points as
+you've assigned them. Saying 'y' saves the changes and allows you to use or
+apply your new skills :).
+
+All skills have a maximum level of 50, and as long as you can learn a skill,
+and have enough skill points to pump into it, it is theoretically possible to
+get it to level 50 no matter what your race, class or how you learned it.
+
+Each skill affects your character differently. It may be worth getting one or
+more of your characters skills to 50, but it may not be worth investing [[[[[Bany]
+skill points in some other skills. As general and personal advice, which may
+not work for you, I'd say concentrate on a few skills, and leave the others
+empty. Just because you [[[[[Bcan] learn a skill, it doesn't mean you have to.
+It often pays to have a plan ("I'm going to make this assassin the
+stealthiest, most able-dodging, backstabber around. I'm not going to bother
+with trapping or thieving ability") which you can stick to for the whole game.
+~~~~~57|Skills|List of skills
+#####GThe Skills Themselves
+So you want to know what each of the skills do so that you can decide how to
+spend you're hard-earned points, huh? Well, each skill affects different
+abilities, and not all of them are intuitive - but they don't take all that
+long to learn :).
+If you don't find this informative enough, and would like more detailed spoilers
+on what each skill does, try [[[[[ghttp://www.killerbunnies.org/angband/skill-220.html]
+for some third party help!
+The skills are:
+
+ *****skills.txt*27[Air] *****skills.txt*49[Alchemy] *****skills.txt*50[Antimagic] *****skills.txt*08[Archery]
+ *****skills.txt*05[Axe-mastery] *****skills.txt*18[Backstab] *****skills.txt*13[Barehand-combat] *****skills.txt*61[Bearform-combat]
+ *****skills.txt*12[Boomerang-mastery] *****skills.txt*58[Boulder-throwing] *****skills.txt*10[Bow-mastery] *****skills.txt*01[Combat]
+ *****skills.txt*30[Conveyance] *****skills.txt*44[Corpse-preservation]*****skills.txt*04[Critical-hits] *****skills.txt*11[Crossbow-mastery]
+ *****skills.txt*52[Demonology] *****skills.txt*16[Disarming] *****skills.txt*31[Divination] *****skills.txt*20[Dodging]
+ *****skills.txt*28[Earth] *****skills.txt*25[Fire] *****skills.txt*60[Geomancy] *****skills.txt*06[Hafted-mastery]
+ *****skills.txt*21[Magic] *****skills.txt*54[Magic-device] *****skills.txt*24[Mana] *****skills.txt*29[Meta]
+ *****skills.txt*47[Mimicry] *****skills.txt*33[Mind] *****skills.txt*41[Mindcraft] *****skills.txt*42[Monster-lore]
+ *****skills.txt*59[Music] *****skills.txt*34[Nature] *****skills.txt*35[Necromancy] *****skills.txt*07[Polearm-mastery]
+ *****skills.txt*45[Possession] *****skills.txt*39[Prayer] *****skills.txt*36[Runecraft] *****skills.txt*09[Sling-mastery]
+ *****skills.txt*14[Sneakiness] *****skills.txt*22[Spell-power] *****skills.txt*38[Spirituality] *****skills.txt*23[Sorcery]
+ *****skills.txt*19[Stealing] *****skills.txt*15[Stealth] *****skills.txt*53[Stunning-blows] *****skills.txt*43[Summoning]
+ *****skills.txt*03[Sword-mastery] *****skills.txt*46[Symbiosis] *****skills.txt*32[Temporal] *****skills.txt*37[Thaumaturgy]
+ *****skills.txt*48[Udun] *****skills.txt*26[Water] *****skills.txt*02[Weaponmastery]
+
+
+~~~~~01|Skills|Combat
+[[[[[BCombat]
+The combat skill is used to determine the maximum combined weight of armour
+you can wear before you become encumbered by it. It also affects your general
+fighting ability, although not to as great an extent as Weaponmastery, and
+determines the speed and strength of pseudo-id of weapons and armour.
+
+Investing in the combat skill? You might be interested in the
+*****ability.txt*05[Extra Max Blow(1)] and *****ability.txt*06[(2)] abilities.
+
+Sub-skills of Combat are Weaponmastery, Archery, Barehand-combat,
+Boulder-throwing and Anti-magic.
+~~~~~02|Skills|Weaponmastery
+[[[[[BWeaponmastery]
+This skill is a sub-skill of the Combat skill. It affects your general
+ability to use melee weapons of all sorts. Spending 1 skill point on
+Weaponmastery adds 0.5 bonus skill points to Combat.
+
+Investing in the weaponmastery skill? You might be interested in the
+*****ability.txt*02[Spread Blows] ability.
+
+Sub-skills of Weaponmastery are Sword-mastery, Axe-mastery, Hafted-mastery
+and Polearm-mastery.
+~~~~~03|Skills|Sword-mastery
+[[[[[BSword-mastery]
+This skill is a sub-skill of the Weaponmastery skill. It affects your ability
+to use bladed weapons (e.g. daggers, swords). Spending 1 skill point on your
+Sword-mastery skill adds 0.25 bonus skill points to your Weaponmastery skill
+and adds 0.07 bonus skill points to your Combat skill.
+
+Critical-hits is a sub-skill of Sword-mastery.
+~~~~~04|Skills|Critical-Hits
+[[[[[BCritical-hits]
+This skill is a sub-skill of the Sword-mastery skill. It affects your ability
+to deal critical hits to monsters using a bladed weapon that weighs less than 5
+pounds. Spending one skill point on your Critical-hits skill also increases
+your Sword-mastery skill by 0.05 skill points.
+~~~~~05|Skills|Axe-mastery
+[[[[[BAxe-mastery]
+This skill is a sub-skill of the Weaponmastery skill. It affects your ability
+to use axes. Spending 1 skill point on your Axe-mastery skill adds 0.25 bonus
+skill points to your Weaponmastery skill and adds 0.07 bonus skill points to
+your Combat skill.
+~~~~~06|Skills|Hafted-mastery
+[[[[[BHafted-mastery]
+This skill is a sub-skill of the Weaponmastery skill. It affects your ability
+to use hafted weapons (e.g. whips & maces). Spending 1 skill point on your
+Hafted-mastery skill adds 0.25 bonus skill points to your Weaponmastery skill
+and adds 0.07 bonus skill points to your Combat skill.
+
+Stunning-blows is a sub-skill of Hafted-mastery.
+~~~~~53|Skills|Stunning-blows
+[[[[[BStunning-blows]
+This skill is a sub-skill of the Hafted-mastery skill. It affects your ability
+to stun opponents when doing critical hits with a hafted weapon that weighs
+more than 5 lbs. Spending one skill point on your Stunning-blows skill also
+increases your Hafted-mastery skill by 0.05 skill points.
+~~~~~07|Skills|Polearm-mastery
+[[[[[BPolearm-mastery]
+This skill is a sub-skill of the Weaponmastery skill. It affects your ability
+to use polearms (e.g. pikes & halberds). Spending 1 skill point on your
+Polearm-mastery skill adds 0.25 bonus skill points to your Weaponmastery skill
+and adds 0.07 bonus skill points to your Combat skill.
+
+Investing in the Polearm-mastery skill? You might be interested in the
+*****ability.txt*10[Far reaching attack] ability.
+~~~~~08|Skills|Archery
+[[[[[BArchery]
+This skill is a sub-skill of the Combat skill. It affects your general
+ability to use ranged weapons of all sorts. Spending one skill point on your
+Archery skill adds 0.5 bonus skill points to your Combat skill.
+
+Investing in the Archery skill? You might be interested in the
+*****ability.txt*07[Ammo creation] ability.
+
+Sub-skills of Archery include Sling-mastery, Bow-mastery, Crossbow-mastery
+and Boomerang-mastery.
+~~~~~09|Skills|Sling-mastery
+[[[[[BSling-mastery]
+This skill is a sub-skill of the Archery skill. It affects your ability to
+use Slings. Spending 1 skill point on your Sling-mastery skill adds 0.25
+bonus skill points to your Archery skill and 0.07 bonus skill points to your
+Combat skill.
+~~~~~10|Skills|Bow-mastery
+[[[[[BBow-mastery]
+This skill is a sub-skill of the Archery skill. It affects your ability to
+use both Long and Short Bows. Spending 1 skill point on your Bow-mastery
+skill adds 0.25 bonus skill points to your Archery skill and 0.07 bonus skill
+points to your Combat skill.
+~~~~~11|Skills|Crossbow-mastery
+[[[[[BCrossbow-mastery]
+This skill is a sub-skill of the Archery skill. It affects your ability
+to use both Heavy and Light Crossbows. Spending 1 skill point on your
+Crossbow-mastery skill adds 0.25 bonus skill points to your Archery skill
+and 0.07 bonus skill points to your Combat skill.
+~~~~~12|Skills|Boomerang-mastery
+[[[[[BBoomerang-mastery]
+This skill is a sub-skill of the Archery skill. It affects your ability to
+use all boomerangs. Spending 1 skill point on your Boomerang-mastery skill
+adds 0.25 bonus skill points to your Archery skill and 0.07 bonus skill
+points to your Combat skill.
+~~~~~13|Skills|Barehand-combat
+[[[[[BBarehand-combat]
+This skill is a sub-skill of the Combat skill. It affects your general ability
+to fight using martial arts. In order to utilise it, you must be capable of
+using a weapon in the first place, but choose not to. Spending 1 skill point
+on your Barehand-combat skill adds 0.5 bonus skill points to your Combat skill.
+Barehand-combat fighters develop stronger and faster attacks, and also gain
+speed bonuses, as they advance in skill. However, they cannot use this skill
+whilst wearing heavy armour.
+~~~~~61|Skills|Bearform-combat
+[[[[[BBearform-combat]
+This skill is a sub-skill of the Combat skill. It affects your ability to fight
+while in the form of a bear. In order to utilise it, you must be in bearform.
+*****r_beorn.txt*0[Beornings] are the adventurers most likely to use this form of skill.
+~~~~~58|Skills|Boulder-throwing
+[[[[[BBoulder-throwing]
+This skill is a sub-skill of the Combat skill. It affects your ability to
+throw boulders and make them from granite walls. Spending 1 skill point on
+your Boulder-throwing skill adds 0.4 bonus skill points to your Combat skill.
+~~~~~50|Skills|Antimagic
+[[[[[BAntimagic]
+This skill is a sub-skill of the Combat skill. It generates a field around
+the character within which magic cannot work. As such, it can be very useful
+to prevent monsters from casting offensive spells against you or from
+teleporting away from you just before you kill them - but it will also prevent
+you from casting spells, or teleporting away when they've almost killed you!
+It also inhibits your ability to do magic, affecting *all* the magic and
+spirituality sub-skills.
+
+This skill does not affect your ability to use scrolls and potions, but other
+items that require [Self]Magic-Device are affected. At higher levels you gain
+the ability to detect traps and disrupt all teleportation.
+~~~~~14|Skills|Sneakiness
+[[[[[BSneakiness]
+The sneakiness skill affects your searching and perception abilities.
+
+Sub-skills of Sneakiness include Stealth, Disarming, Trapping, Backstab,
+Stealing and Dodging.
+~~~~~15|Skills|Stealth
+[[[[[BStealth]
+This skill is a sub-skill of the Sneakiness skill. It affects your ability
+to move around the dungeon quietly so that you are not noticed by its
+inhabitants. Spending 1 skill point on your Stealth skill adds 0.15 bonus
+skill points to your Sneakiness skill.
+~~~~~16|Skills|Disarming
+[[[[[BDisarming]
+This skill is a sub-skill of the Sneakiness skill. It affects your ability
+to safely disarm any traps you find. Spending 1 skill point on your Disarming
+skill adds 0.1 bonus skill points to your Sneakiness skill.
+
+Investing in the Disarming skill? You might be interested in the *****ability.txt*11[Trapping]
+ability.
+~~~~~18|Skills|Backstab
+[[[[[BBackstab]
+This skill is a sub-skill of the Sneakiness skill. It affects your ability
+to sneak up on monsters and do extra damage to them before they wake up.
+It also affects monsters who have turned to flee from you. Spending 1 skill
+point on your Backstab skill adds 0.05 bonus skill points to your Sneakiness
+skill.
+~~~~~19|Skills|Stealing
+[[[[[BStealing]
+This skill is a sub-skill of the Sneakiness skill. It affects your ability
+to steal items from monsters and shops. Be careful when stealing from shops;
+if you're caught, the shopkeeper will close his doors to you and not open
+them again. I have heard that shop keepers do not stay in one shop forever
+though. Spending 1 skill point on your Stealing skill adds 0.15 bonus skill
+points to your Sneakiness skill.
+~~~~~20|Skills|Dodging
+[[[[[BDodging]
+This skill is a sub-skill of the Sneakiness skill. It affects your ability
+to dodge out of the way of monster blows and bolts. The less armour you wear
+and the less you carry, the greater your chance of dodging a blow. Rings and
+amulets do not affect your chance to dodge, but full armour will almost render
+the effect of the skill obsolete. Spending 1 skill point on your Dodging skill
+adds 0.1 bonus skill points to your Sneakiness skill.
+~~~~~21|Skills|Magic
+[[[[[BMagic]
+The Magic skill affects your general use of magic items, the amount of mana
+you can handle, and in general your ability to do magic. It can also affect
+the strength of wands and staffs.
+
+Investing in the Magic skill? You might be interested in the *****ability.txt*04[Perfect Casting]
+ability.
+
+Sub-skills include: Magic-device, Spell-power, Sorcery, Mana, Fire, Water, Air,
+Earth, Meta, Conveyance, Divination, Temporal, Mind, Nature, Udun, Demonology,
+Necromancy, Runecraft, Thaumaturgy, and Alchemy.
+~~~~~54|Skills|Magic-device
+[[[[[BMagic-device]
+This skill is a sub-skill of the Magic skill. It eases the use of magical
+devices, such as wands, staves, and rods, and boosts the casting level of spells
+stored in a wand or a staff. *****magic.txt*02[More on this]. It also helps pseudo-id of magic
+objects. Spending 1 skill point on your Magic-device skill adds 0.07 bonus skill
+points to your Magic skill.
+~~~~~22|Skills|Spell-power
+[[[[[BSpell-power]
+This skill is a sub-skill of the Magic skill. It boosts the casting level of
+most spells you are capable of casting. For example, if you have level one in
+the mana school, you could cast "Manathrust". For every 2.5 skill levels of
+Spell-power, Manathrust becomes more powerful, adding +1 casting level to the
+spell. Note that this is not exactly the same as certain magic items which
+boost spell power. Spending 1 skill point on your Spell-power skill adds 0.2
+bonus skill points to your Magic skill.
+
+[[[[[BThis skill only affects the 11 primary schools] (Mana, Earth, Air, Fire,
+Water, Meta, Mind, Temporal, Conveyance, Divination and Nature), as well as
+Geomancy and the spells granted by the Gods.
+~~~~~23|Skills|Sorcery
+[[[[[BSorcery]
+This skill is a sub-skill of the Magic skill. It allows you to access any
+spell in the 11 schools up to the sorcery skill level. For example, if you
+have a sorcery skill of 1, you could cast "Manathrust", which is a level 1
+mana school spell; and "Phase Door", which is a level 1 conveyance school
+spell. Spending 1 skill point on your Sorcery skill adds 0.2 bonus skill
+points to your Magic skill.
+
+[[[[[BThis skill only affects the 11 primary schools] (Mana, Earth, Air, Fire,
+Water, Meta, Mind, Temporal, Conveyance, Divination and Nature).
+
+However, handling that much magic is hazardous to your health, and as such
+reduces both your hit points and your fighting ability. Any ability in sorcery
+affects your Weaponmastery, Archery, Barehand-combat and gives a negative
+percentage modifier to your total hit points, equal to the level of your
+sorcery skill (i.e. if sorcery is 12.500, hit points get modified by -12.5%).
+~~~~~24|Skills|Mana
+[[[[[BMana]
+This skill is a sub-skill of the Magic skill. It gives access to spells
+within the *****m_mana.txt*0[mana] school, and as it increases so does the casting level of
+spells already attained in the school. For example, if you have level 1 in
+the mana school, you could cast "Manathrust" at a casting level of 1. For
+every skill level you add to Mana, Manathrust will become more powerful,
+adding 1 casting level to the spell. Spending 1 skill point on your Mana
+skill adds 0.1 bonus skill points to your Magic skill.
+~~~~~60|Skills|Geomancy
+[[[[[BGeomancy]
+This skill is a subskill of the Magic skill. It gives access to spells
+within the *****m_geoman.txt*0[Geomancy] school, and as it increases so does the casting level of
+spells already attained in the school. Most spells from this school rely
+on the Fire, Water, Air and Earth skills as well. Spending 1 skill point
+on your Geomancy skill adds 0.45 bonus skill points to your Fire, Water,
+Air and Earth skills.
+~~~~~25|Skills|Fire
+[[[[[BFire]
+This skill is a sub-skill of the Magic skill. It gives access to spells
+within the *****m_fire.txt*0[fire] school, and as it increases so does the casting level of
+spells already attained in the school. Spending 1 skill point on your Fire
+skill adds 0.1 bonus skill points to your Magic skill.
+~~~~~26|Skills|Water
+[[[[[BWater]
+This skill is a sub-skill of the Magic skill. It gives access to spells
+within the *****m_water.txt*0[water] school, and as it increases so does the casting level of
+spells already attained in the school. Spending 1 skill point on your Water
+skill adds 0.1 bonus skill points to your Magic skill.
+~~~~~27|Skills|Air
+[[[[[BAir]
+This skill is a sub-skill of the Magic skill. It gives access to spells
+within the *****m_air.txt*0[air] school, and as it increases so does the casting level of
+spells already attained in the school. Spending 1 skill point on your Air
+skill adds 0.1 bonus skill points to your Magic skill.
+~~~~~28|Skills|Earth
+[[[[[BEarth]
+This skill is a sub-skill of the Magic skill. It gives access to spells
+within the *****m_earth.txt*0[earth] school, and as it increases so does the casting level of
+spells already attained in the school. Spending 1 skill point on your Earth
+skill adds 0.1 bonus skill points to your Magic skill.
+~~~~~29|Skills|Meta
+[[[[[BMeta]
+This skill is a sub-skill of the Magic skill. It gives access to spells
+within the *****m_meta.txt*0[meta] school, and as it increases so does the casting level of
+spells already attained in the school. Spending 1 skill point on your Meta
+skill adds 0.1 bonus skill points to your Magic skill.
+~~~~~30|Skills|Conveyance
+[[[[[BConveyance]
+This skill is a sub-skill of the Magic skill. It gives access to spells
+within the *****m_convey.txt*0[conveyance] school, and as it increases so does the casting level
+of spells already attained in the school. Spending 1 skill point on your
+Conveyance skill adds 0.1 bonus skill points to your Magic skill.
+~~~~~31|Skills|Divination
+[[[[[BDivination]
+This skill is a sub-skill of the Magic skill. It gives access to spells
+within the *****m_divin.txt*0[divination] school, and as it increases so does the casting level
+of spells already attained in the school. Spending 1 skill point on your
+Divination skill adds 0.1 bonus skill points to your Magic skill.
+~~~~~32|Skills|Temporal
+[[[[[BTemporal]
+This skill is a sub-skill of the Magic skill. It gives access to spells
+within the *****m_tempo.txt*0[temporal] school, and as it increases so does the casting level
+of spells already attained in the school. Spending 1 skill point on your
+Temporal skill adds 0.1 bonus skill points to your Magic skill.
+~~~~~33|Skills|Mind
+[[[[[BMind]
+This skill is a sub-skill of the Magic skill. It gives access to spells
+within the *****m_mind.txt*0[mind] school, and as it increases so does the casting level of
+spells already attained in the school. Spending 1 skill point on your Mind
+skill adds 0.1 bonus skill points to your Magic skill.
+~~~~~34|Skills|Nature
+[[[[[BNature]
+This skill is a sub-skill of the Magic skill. It gives access to spells
+within the *****m_nature.txt*0[nature] school, and as it increases so does the casting level of
+spells already attained in the school. Spending 1 skill point on your Nature
+skill adds 0.1 bonus skill points to your Magic skill.
+
+Investing in the Nature skill? You might be interested in the *****ability.txt*03[Tree Walking]
+ability.
+~~~~~48|Skills|Udun
+[[[[[BUdun]
+This skill is a sub-skill of the Magic skill. It gives access to spells
+within the *****m_udun.txt*0[Udun] school, and is available only to worshippers of Melkor.
+As it increases so does the casting level of spells already attained in the
+school. Spending 1 skill point on your Udun skill adds 0.1 bonus skill
+points to your Magic skill.
+~~~~~52|Skills|Demonology
+[[[[[BDemonology]
+This skill is a sub-skill of the Magic skill. *****m_demono.txt*0[Demonology] gives access to spells
+contained within special Demon-blades, -shields and -horns (helms), and as it
+increases so does the casting level of spells already attained in the school.
+This skill is available only to Demonologists, or those sufficiently
+corrupted with demon-like powers. Spending 1 skill point on your Demonology
+skill adds 0.1 bonus skill points to your Magic skill.
+~~~~~35|Skills|Necromancy
+[[[[[BNecromancy]
+This skill is a sub-skill of the Magic skill. It grants access to *****m_necrom.txt*0[necromancy]
+spells. This is the base skill of the Necromancer class. Spending 1 skill
+point on your Necromancy skill adds 0.04 bonus skill points to your Magic skill.
+
+Investing in the Necromancy skill? You might be interested in the
+*****ability.txt*08[Touch of Death] and *****ability.txt*12[Undead Form] abilities.
+~~~~~36|Skills|Runecraft
+[[[[[BRunecraft]
+This skill is a sub-skill of the Magic skill. This is the base skill of the
+Runecrafter class. Spending 1 skill point on your Runecraft skill adds 0.12
+bonus skill points to your Magic skill.
+~~~~~37|Skills|Thaumaturgy
+[[[[[BThaumaturgy]
+This skill is a sub-skill of the Magic skill. Each level of *****m_thaum.txt*0[thaumaturgy] gives
+a few random attack spells that can be cast without the use of spell books of
+any sort. However, once learned these spells do not gain in levels as the
+thaumaturgy skill or the spell-power skills are increased. Spending 1 skill
+point on your Thaumaturgy skill adds 0.06 bonus skill points to your Magic
+skill.
+~~~~~49|Skills|Alchemy
+[[[[[BAlchemy]
+The Alchemy skill affects your ability to extract and use essences to create
+magical items.
+
+Investing in the Alchemy skill? You might be interested in the *****ability.txt*09[Artifact Creation]
+ability.
+~~~~~38|Skills|Spirituality
+[[[[[BSpirituality]
+The spirituality skill influences things which have a "helping hand" from the
+Gods, like your saving throw, and the general spirituality skills.
+
+Sub-skills of Spirituality are Prayer, Mindcraft and Music.
+~~~~~39|Skills|Prayer
+[[[[[BPrayer]
+This skill is a sub-skill of the Spirituality skill. It affects what level of
+your *****gods.txt*0[God's] special magic you can access (and what levels of the additional
+schools that each God also provides). Spending 1 skill point on your Prayer
+skill adds 0.1 bonus skill points to your Spirituality skill and 0.1 bonus
+skill points to your Magic skill.
+~~~~~41|Skills|Mindcraft
+[[[[[BMindcraft]
+This skill is a sub-skill of the Spirituality skill. It affects what level of
+*****m_mindcr.txt*0[Mindcrafter powers] you can access, which is done without books and is
+available under the "m" menu. Spending 1 skill point on your Mindcraft skill
+adds 0.1 bonus skill points to your Spirituality skill and 0.1 bonus skill
+points to your Magic skill.
+~~~~~59|Skills|Music
+[[[[[BMusic]
+This skill is a sub-skill of the Spirituality skill. It affects what level of
+*****m_music.txt*0[Musical songs] you can access through instruments. This power
+is available under the "m" menu. Spending 1 skill point on your Music skill
+adds 0.1 bonus skill points to your Spirituality skill and 0.1 bonus skill
+points to your Magic skill.
+~~~~~42|Skills|Monster-lore
+[[[[[BMonster-lore]
+The monster-lore skill affects your general ability at the monster related
+skills. It determines how much experience you will gain if your *****dungeon.txt*18[pets] kill a
+monster, and how many companions you can have. At skill level 12, it allows
+you to turn a pet into a loyal companion.
+
+Sub-skills of Monster-lore are Summoning, Corpse-preservation, Possession,
+Symbiosis, and Mimicry.
+~~~~~43|Skills|Summoning
+[[[[[BSummoning]
+This skill is a sub-skill of the Monster-lore skill. It affects your ability
+to create "totems" and use them to summon monsters to your aid. Spending 1
+skill point on your Summoning skill adds 0.1 bonus skill points to your
+Monster-lore skill.
+~~~~~44|Skills|Corpse-preservation
+[[[[[BCorpse-preservation]
+This skill is a sub-skill of the Monster-lore skill. It affects your ability
+to kill monsters without destroying their bodies, so the corpses will be
+available to use. Spending 1 skill point on your Corpse-preservation skill
+adds 0.1 bonus skill points to your Monster-lore skill.
+~~~~~45|Skills|Possession
+[[[[[BPossession]
+This skill is a sub-skill of the Monster-lore skill. It affects your ability
+to possess a dead monster's corpse. Spending 1 skill point on your Possession
+skill adds 0.1 bonus skill points to your Monster-lore skill.
+~~~~~46|Skills|Symbiosis
+[[[[[BSymbiosis]
+This skill is a sub-skill of the Monster-lore skill. It affects your ability
+to go into symbiosis with monsters that cannot move, and to cast *****m_symbio.txt*0[Symbiotic]
+spells. Spending 1 skill point on your Symbiosis skill adds 0.1 bonus skill
+points to your Monster-lore skill.
+~~~~~47|Skills|Mimicry
+[[[[[BMimicry]
+This skill is a sub-skill of the Monster-lore skill. It affects your ability
+to use cloaks of mimicry to change form and to cast *****m_mimic.txt*0[Mimicry spells].
+Spending 1 skill point on your Mimicry skill adds 0.1 bonus skill points to
+your Monster-lore skill.
diff --git a/lib/mods/theme/help/spoil_faq.txt b/lib/mods/theme/help/spoil_faq.txt
new file mode 100644
index 00000000..fd3a0f42
--- /dev/null
+++ b/lib/mods/theme/help/spoil_faq.txt
@@ -0,0 +1,63 @@
+|||||oy
+~~~~~01|Help|Spoiled FAQ
+~~~~~02|FAQ - contains spoilers
+#####R ToME Spoiler FAQ
+#####R Updated for version 2.3.x
+
+#####G------------------------------------------------------------------------------
+
+This page contains significant spoilers. Don't browse it unless you want some
+parts of the game ruined, but don't expect the spoilers to spoil you completely!
+
+~~~~~07|Spoilers|Lothlorien Poisoned water quest
+#####G------------------------------------------------------------------------------
+#####GQ: I'm trying to find the Poisoned water quest at Lothlorien, but cannot
+#####G find the quest entrance!
+
+A: This quest is located in the wilderness. To the west of Lothlorien are 4
+water squares in an upside down L shape. One of these squares will contain the
+quest. (Viewed from the Wilderness map). There is no yellow > sign, so don't
+bother looking for one.
+~~~~~20|Spoilers|God Quest - directions
+~~~~~23|Gods|Quest - Spoilers
+#####G------------------------------------------------------------------------------
+#####GQ: I've been given directions to a temple by my God but can't find the
+#####G temple anywhere!
+
+A: It [[[[[BIS] there. However, your god's idea of compass directions that are
+not directly on the 4 main axes are probably slightly less acurate than your
+idea. In other words, if your god says it is South-East, s/he means it is
+somewhere in the quadrant that is between the south and east axes.
+~~~~~21|Spoilers|God Quest - relic
+#####G------------------------------------------------------------------------------
+#####GQ: Where is the relic by god was talking about? I've looked in the lost
+#####G temple and can't find it anywhere!
+
+A: It [[[[[BIS] there. However, when your god told you to look for it VERY
+carefully, s/he meant it. Regardless of your game settings, the relic will only
+be created once in the temple, at a random place. If you have searched the
+whole temple once over, and not located it, then you have missed it, and it is
+lost forever. Each temple has 5 dungeon levels, and the relic might be on
+any of these 5 levels.
+~~~~~22|Spoilers|God Quest - how many?
+#####G------------------------------------------------------------------------------
+#####GQ: Apparently my god has lost another piece of a relic and wants me to go
+#####G find it again. How many of these are there?
+
+A: You can receive up to seven god quests, with the final piece yielding an
+extra reward. However you will only receive extra quests if you have
+sucessfully completed all the previous ones.
+~~~~~23|Spoilers|Secret Valley
+#####G------------------------------------------------------------------------------
+#####GQ: What's this Secret Valley place in the northern part of the wilderness?
+
+This is a stay-over from regular ToME, where that valley is the location of
+Gondolin. In Theme, Gondolin is elsewhere, and the Secret Valley is simply a
+cosmetic change to avoid confusion.
+
+~~~~~24|Spoilers|Erebor
+#####G------------------------------------------------------------------------------
+#####GQ: Why can't I get past the first level of Erebor?
+
+Think back to "The Hobbit". What did Bilbo and his friends use to enter the Lonely
+Mountain? Locating the town of Dale and asking the mayor might prove profitable...
diff --git a/lib/mods/theme/help/spoiler.hlp b/lib/mods/theme/help/spoiler.hlp
new file mode 100644
index 00000000..bc229852
--- /dev/null
+++ b/lib/mods/theme/help/spoiler.hlp
@@ -0,0 +1,18 @@
+|||||oy
+~~~~~01|Spoilers
+#####RWelcome to the Angband Online Spoiler System.
+#####R=============================================
+
+Please choose one of the following online spoiler files:
+
+ *****/acorspoil.txt*0[(a) Corruptions]
+ *****/bdunspoil.txt*0[(b) Dungeons]
+ *****/cessences.txt*0[(c) Essence Spoiler]
+ *****/dinscrip.txt*0[(d) Floor Inscriptions]
+ *****/eluckspoi.txt*0[(e) Luck]
+ *****/ffatespoi.txt*0[(f) Fates]
+ *****/gwishing.txt*0[(g) Wishing]
+ *****/hspoil_faq.txt*0[(h) Spoiled FAQ]
+
+
+ *****/zhelp.hlp*0[(z) Main Help menu]
diff --git a/lib/mods/theme/help/tome_faq.txt b/lib/mods/theme/help/tome_faq.txt
new file mode 100644
index 00000000..756ce639
--- /dev/null
+++ b/lib/mods/theme/help/tome_faq.txt
@@ -0,0 +1,381 @@
+|||||oy
+~~~~~01|Help|FAQ - Spoiler free
+~~~~~02|FAQ - Spoiler free
+#####R ToME FAQ
+#####R Updated for version 2.3.x
+
+#####G------------------------------------------------------------------------------
+
+#####R=== Differences Between ToME and Vanilla Angband ===
+
+The first main difference a new player to ToME will need to be aware of is
+that it has implemented a skills based system. Instead of the adventurer
+automatically improving in his abilities as he becomes more experienced,
+he gets 6 skill points to spend on his skills, allowing the player to
+customise what type of character she will play. See the *****skills.txt*0[skills] help file
+for details.
+
+A second major difference is that the main dungeon from Angband has been split
+into 4 "dungeons", each of which covers a different portion of the Angband
+dungeon's levels. Each of these 4 dungeons is located either in or near one of
+the four main towns so that the character can keep stocked up on supplies. As
+the adventurer advances in ability, he will need to travel overland to the next
+town/dungeon, which is most easily carried out using the wilderness map ("<"
+from town level). As well as these main places, there are a number of
+additional dungeons which the character may or may not choose to enter, which
+can have guardians, contain specific artifacts, or just be used as an
+alternative place to enjoy gaining experience. Note that not all of the places
+are actually "dungeons" - some are caves, forests, etc.
+
+ToME also offers the player the ability to undertake a series of quests.
+Random quests can be specified during start-up, and involve rescuing a princess
+from a group of monsters within the dungeon, or recovering a lost sword from
+(you guessed it...) a group of monsters. If you do not wish to play with
+random quests, simply specify "0" when asked how many you want during character
+generation. Other "fixed" quests are also available from the towns (whether
+random quests are enabled or not), usually given by the town leaders upon the
+request of the adventurer. It is not required for any adventurer to undertake
+the fixed quests, but they can result in some nice rewards.
+
+The third main difference between Vanilla Angband and ToME is the difference
+in character classes and races, as well as a very different magic system.
+See the help files on *****birth.txt*0[Creating a character] and the *****magic.txt*0[magic] system.
+Class abilities (generally referred to as skills) are generally accessed
+through the 'm' command. Most racial abilities, or corruptions, are accessed
+through the "U" command.
+
+To balance the expansion in things like player abilities and customisation, the
+list of both monsters and items has also been expanded. Be warned that items
+which were by default safe in Vanilla are not necessarily safe in ToME (a
+certain early artifact comes to mind here...), and picking on defenceless
+creatures is frowned upon....
+
+Happy adventuring!
+~~~~~03|Altars
+~~~~~04|Gods|Altars
+#####G------------------------------------------------------------------------------
+#####GQ: How do I use the altars (the 'O's) I see in the dungeon?
+
+A: ToME introduces a new system of gods.
+
+You can find altars only in Lothlorien and in the dungeon.
+The ones on the surface are dedicated to the good Valar (Eru, Manwe, Tulkas and
+Yavanna), while altars found in the dungeons are "sacred" for Melkor.
+You can use altars to convert yourself to the service of a specific Vala by
+using the "O" command while standing on them. Beware, this works only if you
+don't already have a God, and as a new convert, your God won't like you that
+much. Melkor also uses his altars as a mean of collecting sacrifices from his
+devotees; this function is likewise accomplished by the "O" command.
+
+Read *****gods.txt*0[gods.txt] for more information about Gods.
+~~~~~05|Fountains
+#####G------------------------------------------------------------------------------
+#####GQ: How do I use the fountains (the '_'s) I see in the dungeon?
+
+A: Fountains in ToME act like potions, but can only be identified by
+drinking from them. Each one can hold between 3 and 12 doses of the potion.
+Quaffing from a fountain can be done by using the 'H' command (in the standard
+keyset) and answering 'Q' at the prompt.
+
+You can also fill empty bottles at a fountain (enabling you to identify the
+potion and hence the type of fountain) by using the 'H' command and answering
+'F' at the prompt. The game will then ask you to choose bottles and how many
+bottles you want to fill. You can find empty bottles on the dungeon and
+drinking pints of fine ale/wine will give you emtpy bottles; if you are
+trained in Alchemy, you can reuse bottles after quaffing potions as well.
+
+#####G------------------------------------------------------------------------------
+#####GQ: I got killed by a Great Wyrm of Power at 50'!!! What happened?
+
+A: You killed a defenceless creature. I told you that it was frowned upon!
+~~~~~18|Artifacts that activate but I cannot wear or wield
+~~~~~17|Strange items
+#####G------------------------------------------------------------------------------
+#####GQ: I've found some strange items like a Red Tome, a Voodoo Doll, ...
+#####G What can I do with them?
+
+A: You've found an unusual artifact that cannot be wielded, but always
+has a sometimes-useful activation. It will not be listed in the known
+artifact list and its activation is chosen randomly. It would probably be
+wise for this kind of artifact be *identified* before use, as the
+activation can be something very nasty....
+
+To activate it, use the normal Activation command, but when prompted for which
+item to activate change to the backpack instead of wielded equipment.
+~~~~~10|Essences
+~~~~~11|Runes
+#####G------------------------------------------------------------------------------
+#####GQ: I keep coming across "essences" and "runes". What are they?
+
+Essences are the *****c_alchem.txt*0[Alchemist's] friend, and you can only use them if you
+have access to the *****skills.txt*49[Alchemy] skill.
+Runes are used to cast and store spells of varying types. *****c_runecr.txt*0[Runecrafters] are the
+class who are most proficient at using these. You can only use them if you
+have access to the *****skills.txt*36[Runecrafting] skill.
+~~~~~12|Homes
+#####G------------------------------------------------------------------------------
+#####GQ: Where can I store all my equipment? Theere's not enough room in my
+#####Ginventory? And what happened to the thieves quest in Bree?
+
+Nor is there supposed to be enough room in your backpack. It's not
+bottomless you know! If you go talk to the Mayor in Bree, he might let you know
+about a slight problem that there's been in town. If you can clear up the
+problem, you may find yourself with somewhere extra to keep your stuff. I've
+heard tell that there are similiar problems in other towns in Middle-Earth.
+~~~~~13|Fates|Prophets
+#####G------------------------------------------------------------------------------
+#####GQ: I spent 500 gp at the Prophet but she said nothing. Is that a bug ?
+
+A: No. Nor is it because Prophets are swindlers. She said nothing
+because you have no fate at this moment. You gain fates while playing, and
+will be warned by a message such as "You feel your fate has changed". A fate
+can be useless like finding a broken skull at level 30, deadly like dying at
+level 56, or really useful like never dying by the hand of a mortal.
+~~~~~14|Mathilde
+#####G------------------------------------------------------------------------------
+#####GQ: Who is Mathilde, the Science Student whom I see every so often in the
+#####G town?
+
+A: Most of the time she laughs and giggles. She has no loot on her, and
+she's never done you any harm. So leave her be - even if she should
+happen to shout "Drop dead, creep!"
+~~~~~15|Wrists hurting
+#####G------------------------------------------------------------------------------
+#####GQ: My wrists hurt a lot when playing the game. Should I take precautions?
+
+A: Yes, you should. Repetitive strain on wrists (which results from a badly
+placed keyboard, for example) can lead to serious injury of the wrist ligaments
+called Carpal Tunnel Syndrome. If you feel your wrists are strained, here is
+an exercise posted by Jason Maskell in rec.games.roguelike.angband which might
+help:
+
+Hold your arms out horizontally, make a fist, and then point the fist towards
+the floor, as much as you can. This will stretch one side's tendons. Hold for
+5 seconds. Then make a flat hand and hold it level with your arm, hold for 5
+seconds. Now splay your fingers and attempt to make your hand point toward the
+ceiling (this one is hard, so don't push it too much). You should feel your
+tendons stretching. Repeat this a few times. Take frequent breaks and do this
+if it starts to hurt a little bit. I was sliding very fast towards CTS and this
+corrected it.
+~~~~~16|Void jumpgates
+#####G------------------------------------------------------------------------------
+#####GQ: When I stand on void jumpgates I'm never teleported away, what's wrong?
+
+A: Void jumpgates are not automatic. You must press '>' while standing
+on one to activate it.
+
+#####G------------------------------------------------------------------------------
+#####GQ: When it panic saves it reloads an old savefile !!
+
+A: Now the panic saves use a different file to save, savefile.pnc.
+This file will be loaded first, if present, when the game is started.
+If it loads successfully, save the game immediately. Otherwise, delete
+the panic save, and your old (non-panic) savefile should be safe.
+
+~~~~~08|Monsters|They are talking to me!
+#####G------------------------------------------------------------------------------
+#####GQ: Farmer Maggot / Melinda Proudfoot keep shouting at me, and I cannot
+#####G kill them.
+
+A: Both these people need to talk to you about something. Have a chat with them
+(check the file *****command.txt*96[command.txt] for how to chat).
+~~~~~09|Sentient weapons
+#####G------------------------------------------------------------------------------
+#####GQ: I have found a sentient weapon, it says it has access to the realms
+#####G of Earth and Fire. How do I use these realms?
+
+A: You don't actually 'use' them as such. If a weapon is sentient it means it
+gains experience itself as it delivers killing blows. As it levels up it has
+the chance to gain pluses to hit and to damage, and also powers from any of the
+available 'realms'. For instance, the realm of fire gives the chance to gain
+resistance to fire, or fire branding on your weapon. The realm of earth has a
+chance to confer extra attacks or the power of causing earthquakes and so on.
+~~~~~24|Fumblefingers quests
+~~~~~25|Abbreviations|FF
+#####G------------------------------------------------------------------------------
+#####GQ: What or who is Fumblefingers? How do I get his quests?
+
+A: FF is short for Fumblefingers, the name that some players give to the
+adventurer who keeps having his sword stolen by monsters and asking you to
+find it for him. So named because he often seems to lose it to molds and
+other creatures you wouldn't expect to be able to pickpocket! During birth
+you'll be asked to specify a number of random quests you would like to
+attempt to complete. Some of these quests will take the form of princess
+quests, others will be fumble-finger quests. If you complete the task he
+sets you sucessfully, he'll offer to join you as a companion. If you do not
+want him to join you, he'll offer to teach you some new skills. Quite handy.
+~~~~~26|Random quests are not working.
+#####G------------------------------------------------------------------------------
+#####GQ: Where has the option gone to set the number of random quests?
+#####G Why aren't there any after the Barrow-downs?
+
+A: Turning on either of the options "Allow permanent dungeon levels" or "Always
+create special rooms" will disable random quests. Random quests can only be
+found in the four main dungeons (Barrowdowns, Mirkwood, Mordor and Angband).
+~~~~~27|Weird display
+~~~~~28|Floor tiles displaying incorrectly
+#####G------------------------------------------------------------------------------
+#####GQ: How do I get the dots to show up on floor tiles in Windows XP? I've tried
+#####G changing the tile character to the brighter dot. Toggling 'Bizarre Display'
+#####G mode helped with the trailing @@@@@@@@@@@@@@@@@ problem. Any suggestions? I
+#####G gave up a long time ago and play with graphics tiles now, but I'd like to be
+#####G able to fix this.
+
+A: In the file ./lib/pref/font_win.prf, either remove or comment out with # the
+lines that end in /0x1F, e.g.
+# open floor
+# F:1:0x01/0x1F
+Another possibility is to manually change the symbols used with the '%'
+command, but the previous solution is faster.
+~~~~~29|Dark grey things are difficult to see
+#####G------------------------------------------------------------------------------
+#####GQ: Many things are written in a dark grey color which is next to impossible to
+#####G read against a black background. Also, some monsters appear in dark grey and
+#####G are easy to miss! What can I do to fix this?
+
+A: Fix the gamma control of your display. If your display software does not
+include such a tool, access the 'Interact with Colors' screen in ToME via
+shift+7, type '4', and modify the gamma correction there.
+~~~~~30|Game 'balance'
+#####G------------------------------------------------------------------------------
+#####GQ: Why don't you make X class less powerful or Y class more powerful?
+
+A: In ToME the player determines how hard the game is. Classes, races, and
+subraces are neither meant nor desired to be equal in game difficulty. So no,
+we won't make Axemasters more powerful just to "balance them out", nor will we
+make Sorcerors weaker.
+~~~~~31|I keep dying!
+#####G------------------------------------------------------------------------------
+#####GQ: Why do I always start in a terribly difficult, very deep dungeon instead of
+#####G a town? Is the game really this hard?
+
+A: You have chosen a "Lost soul" character subrace. That's where Lost souls
+start. They tend to die very quickly, so don't choose them if you're new to
+ToME.
+~~~~~32|Invisible character
+#####G------------------------------------------------------------------------------
+#####GQ: My character is invisible. That's great, but how do I know where she is if
+#####G I can't see her?!
+
+A: You could seek for a way to see invisible things.
+You could also go to game options:
+ 1. Type = (game options)
+ 2. Type 4 (efficiency options)
+ 3. Arrow down to 'hilite the player with the cursor'
+ 4. Type y to toggle the option to 'yes'
+~~~~~33|Objects|Piles
+#####G------------------------------------------------------------------------------
+#####GQ: I'm standing on a pile of items. How do I see what's in the pile without
+#####G picking it all up, moving it, or destroying it all?
+A:
+ 1. Stand on the pile in question
+ 2. Type shift + I (inspect)
+ 3. Type - (examine items on floor)
+ 4. Type * (expand list of items on floor)
+ 5. (as needed) Type letter associated with item to look at it more closely.
+
+#####G------------------------------------------------------------------------------
+#####GQ: If I'm standing on a pile of items. Is there a command to see if there is a
+#####G stairway or jumpgate beneath the pile?
+
+A: Stairs/jumpgates obscured by clutter do still function. You are advised to
+take a good hard look at your surroundings before creating lots of dungeon
+clutter.
+ 1. You can pick up, move, or eliminate the pile.
+ 2. Press l (look), then select the square you wish to inquire about. Press
+<enter>; it will scroll through everything on the ground, and eventually it
+ends with "It is in a Void Jumpgate", or whatever.
+~~~~~34|Character choice is too confusing
+~~~~~36|Beginner strategy
+#####G------------------------------------------------------------------------------
+#####GQ: What is a good starting character?
+
+A: Make sure to read the parchment you start the game with!
+
+If you're new to ToME, understand that your characters are going to die a lot.
+Be prepared for that. In fact, take advantage of it by using the various
+characters you run to experiment and learn the game's various facets.
+
+Try a warrior. A Dunadan Swordmaster is an excellent combination of race and
+class.
+
+Try a priest. A Rohan Knight Paladin gives you some magic to go with strong
+combat, but your terrible stealth will give you a tougher time in some respects.
+
+Try an archer. A Wood-elf Archer will have fewer hitpoints than you're used to,
+but lets you use excellent ranged combat instead. Also note how your higher
+stealth wakes up fewer monsters, letting you fight them more on your own terms.
+
+Try a mage. A Dark-elf Mage lets you keep using weapons, while getting a taste
+of the various magic schools. You have even fewer hitpoints, though, so beware.
+
+Try another mage. A Hobbit Sorceror is a fun character, but the hitpoint
+penalties make you need to be very careful. You get high-powered magic, though,
+to more than make up for it.
+
+I would just add that for those who get frustrated in the early levels and want
+to run a more powerful character that I think the three easiest combinations
+are probably the Zombie Rohan Knight Unbeliever, the Thunderlord (or Vampire
+Half-Ogre) Sorceror, and the High-Elf (or Deathmold if you can figure it out)
+Possessor. Also, you might want to try a priest of Eru or Tulkas. Most of these
+have low stealth, but should be pretty easy to play up to around level 30, and
+they offer an attractive range of experiences for the new player.
+~~~~~35|I STILL keep dying!
+#####G------------------------------------------------------------------------------
+#####GQ: I'm getting killed a lot. Can you recommend some starting options to
+#####G make my chances a little better?
+
+A: Realize that getting killed a lot is to be expected. Having said that, try
+this. At character creation:
+ 1. Turn off "always generate very unusual rooms".
+ 2. Turn off joke monsters.
+ 3. Turn off "always make small levels".
+ 4. Regarding the number of random quests: See the Q/A below.
+ 5. Do not choose a Lost Soul character.
+
+Later, set these options:
+ 1. Turn on "expand the power of the look command".
+ 2. Turn on "allow some monsters to carry light".
+ 3. Turn on "map remembers all perma-lit grids".
+ 4. Turn on "map remembers all torch-lit grids".
+ 5. Turn off "monsters learn from their mistakes".
+ 6. Turn off "monsters exploit player weaknesses".
+ 7. Turn on "monsters behave stupidly".
+ 8. Turn off "allow unusually small dungeon levels".
+ 9. Turn off "allow empty 'arena' levels".
+
+~~~~~36|Random quests strategy
+#####G------------------------------------------------------------------------------
+#####GQ: How many random quests should I choose?
+
+A: One big question a beginner is faced with is: How many (random) optional
+quests to choose?
+
+I think this is another area where the beginner should mix it up. The early
+items from princesses are a great benefit to beginners, but coming to rely on
+those can be a problem when it comes time to enter deep dungeons and the real
+nasty quests begin.
+
+Also high counts, especially 98 quests, can be very frustrating for a beginner
+when it puts an especially difficult quest on dungeon level 1 or 2.
+
+~~~~~37|Anti-magic Amulets and the Anti-magic shell
+#####G------------------------------------------------------------------------------
+#####GQ: Are Amulets of Anti-magic and the Anti-magic skill related?
+
+A: No. The Anti-magic shell of the Amulet of Anti-magic has nothing to do with
+the Anti-magic field given off by the skill and Dark Swords.
+
+~~~~~38|Beornings and Bearform-combat
+#####G------------------------------------------------------------------------------
+#####GQ: My Beorning character doesn't have Bearform-combat! Why?
+
+A: You cannot put points into Bearform-combat unless you are transformed
+into a bear. Use the racial power ('U' in the original keyset, 'O' in
+roguelike) to transform first.
+
+#####G------------------------------------------------------------------------------
+#####GQ: The game is so slow...
+
+A: Yeah :(
+Try disabling the various options marked as (slow)
diff --git a/lib/mods/theme/help/version.txt b/lib/mods/theme/help/version.txt
new file mode 100644
index 00000000..501be7f6
--- /dev/null
+++ b/lib/mods/theme/help/version.txt
@@ -0,0 +1,354 @@
+|||||oy
+~~~~~01|Development history
+*****version.txt*01[The origins of ToME]
+*****version.txt*02[Zangband History and Information]
+*****version.txt*03[Brief Version History (of standard Angband)]
+*****version.txt*04[A Posting from the Original Author (of Moria)]
+*****version.txt*05[Previous Versions (outdated)]
+
+
+#####R====== ToME Brief History =======
+
+When Zangband came to its 2.2.0 version I (DarkGod) was an Angband winner and
+I had been a C programmer for a long time, so I decided to take the sources
+and to try to code my own variant. At this time I was reading the Pern
+novels from Anne McCaffrey and I found them *VERY* good, so I decided to
+include some elements of them into my variant from which it takes the name,
+PernAngband.
+
+One hard thing to decide was on which Angband to base it. Although I didn't
+like Zangband because of the Zelazny universe, which I found to be not very
+Tolkienish, I chose it because of all the good things it had (especially
+the race powers that I wasn't able to code at the time). So I removed
+much of the Zelazny stuff and replaced it with Tolkien and Pernish stuff.
+And so the history of PernAngband began with the version 2.9.9a.
+
+Now, in PernAngband 5.x.x, PernAngband is a thriving Angband variant
+with plenty of unique features.
+
+Then came some legal problems with Anne McCaffrey estate and ubisoft and
+I had to remove the Pern stuff, so the game got renamed to ToME,
+the Troubles of Middle Earth.
+~~~~~02
+#####R=== Zangband History and Information ===
+
+The seeds of Zangband lie in an obsolete and long ago vanished PC variant
+(somewhat misleadingly) dubbed Angband--. The variant was written by a
+hopeless Angband addict (previously Moria veteran and winner) who got
+bored with the standard monsters and wanted to introduce some new
+monsters. Angband-- was based on the PC Angband 1.31 sources, and
+it was set in Roger Zelazny's 'Amber' universe.
+
+Later this individual got a better computer and learned to code, and
+produced the PC Zangband, and most Angband-- monsters survived into
+PC Zangband 1.0. PC Zangband 1.0 was the first PC Angband to introduce
+(simple, font-based) graphics, which were also used in the graphical
+PC Angband 1.40.
+
+Yet this individual was still not cured of his addiction... his almost
+as strong addiction to the Civilization style fantasy strategy game
+'Master of Magic' inspired him to write a new magic system. The current
+version of Zangband (2.*) incorporates this magic system, as well as
+the best features from Angband-- and PC Zangband 1.0. It is based on
+the Angband 2.8.1 sources (by Ben Harrison), and is therefore portable
+to other systems (unlike the earlier versions which were for DOS-PC's
+only).
+
+Incidentally, this person (me, Topi Ylinen) also thought that the
+standard Angband monsters were too easy, which led him to introduce
+such monsters as Death swords, Cyberdemons and Great Wyrms of Power...
+
+Special thanks -- The current version of Zangband might not have come into
+existence without the significant help from these excellent Angband
+programmers:
+
+ Ben Harrison, for obvious reasons.
+
+ Greg Wooledge, who pointed out a bug in the dos compiler,
+ which was preventing my progress with the first 2.* version
+ of Zangband and for various patches.
+
+ Julian Lighton, who must have sent me more ideas, patches, and
+ bug reports than all the others together.
+
+ Robert Ruehlmann, whose nice new main-dos.c enables SVGA
+ graphics and even windows in MS-DOS.
+
+ Paul Sexton, who is responsible for about 50% of the new code
+ in 2.1.0.
+
+ Heino Vander Sanden, who created the quest-code and
+ Dean Anderson, whose patch showed me the quickest way to
+ implement the quests.
+
+ Adam Bolt, who created the new ZAngband tiles.
+
+ Scott Bigham, for the S-Lang patch.
+
+ Jeff Duprey for the new mutations.
+
+ Leigh Silas Hanrihan for the new items.
+
+ Benny S. Hofmann, Aram Harrow, Greg Harvey, Keldon Jones,
+ Graham Murray, Remco Gerlich, Tim Baker and many others
+ for bugreports, patches, bugfixes, and ideas.
+
+
+ZAngband 2.1.0c was Topi's last version, he has got a job and
+doesn't have enough time anymore to continue work on ZAngband.
+He asked for a new maintainer and I was the one to take over the task.
+May I introduce myself, my name is Robert Ruehlmann, I'm the creator
+of the graphical Angband versions for DOS and webmaster of
+"Thangorodrim - The Angband Page" ("http://www.thangorodrim.net").
+~~~~~03
+#####R=== Brief Version History (of standard Angband) ===
+
+First came "VMS Moria", by Robert Alan Koeneke (1985).
+
+Then came "Umoria" (Unix Moria), by James E. Wilson (1989).
+
+In 1990, Alex Cutler and Andy Astrand, with the help of other students
+at the University of Warwick, created Angband 1.0, based on the existing
+code for Umoria 5.2.1. They wanted to expand the game, keeping or even
+strengthening the grounding in Tolkien lore, while adding more monsters
+and items, including unique monsters and artifact items, plus activation,
+pseudo-sensing, level feelings, and special dungeon rooms.
+
+Over time, Sean Marsh, Geoff Hill, Charles Teague, and others, worked on
+the source, releasing a copy known as "Angband 2.4.frog_knows" at some
+point, which ran only on Unix systems, but which was ported by various
+people to various other systems.
+
+Then Charles Swiger (cs4w+@andrew.cmu.edu) attempted to clean up the mess,
+resulting in several versions, starting sometime around November, 1993, with
+Angband 2.5.1 (more or less) and leading up to Angband 2.6.2 in late 1994.
+Several people ported (the primarily Unix/NeXT centered) Angband 2.6.1 to
+other platforms, including Keith Randall, who made a Macintosh port that
+added support for color usage. Some of the changes during this period were
+based on suggestions from the "net", PC Angband 1.40, UMoria 5.5, and some
+of the Angband "variations", such as FAngband.
+
+Finally, I (Ben Harrison) took over in late 1994 when Charles Swiger left.
+Initially my intention was simply to clean up what had become, after ten
+years, a rather unholy mess, but the deeper I delved into the code, the
+more it became apparent that drastic changes were needed, so, starting
+with MacAngband 2.6.1, I began a more or less total rewrite, resulting,
+eventually, in Angband 2.7.0, released around January first, 1995.
+
+Angband 2.7.0 was a very clean (but very buggy) rewrite that, among other
+things, allowed extremely simple porting to multiple platforms, starting
+with Unix and Macintosh, and by the time most of the bugs were cleaned up,
+in Angband 2.7.2, including X11, and various IBM machines. Angband 2.7.4
+was released to the "ftp.cis.ksu.edu" site, and quickly gained acceptance,
+perhaps helped by the OS2 and Windows and Amiga and Linux ports. Angband
+2.7.5 and 2.7.6 added important capabilities such as macros and user pref
+files, and continued to clean up the source. Angband 2.7.8 was designed
+to supply another "stable" version that we can all give to our friends,
+with new "help files" and "spoiler files" for the "online help", plus a
+variety of minor tweaks and some new features. Angband 2.7.9 optimized
+a few things, and tweaked a few other things, and cleaned up a few other
+things, and introduced a few minor semantic changes.
+
+It is very hard to pin down, along the way from 2.6.2 to 2.7.0, and thence
+to 2.7.8, exactly what was added exactly when. Most of these steps involved
+so many changes as to make "diff files" not very useful, since often the diff
+files were as long as the code itself. Most of the changes, with the notable
+exception of the creation of the new "main-xxx.c" files for the various new
+platforms, and a few other exceptions generally noted in the source, were
+written by myself, either spontaneously, or, more commonly, as the result of
+a suggestion or comment by an Angband player. So if you have any problems
+with anything that you do not recognize from older versions, you can blame
+them on me. And if you like the new features and such, you can send me a
+brief little "thank you" email (to benh@phial.com) or something...
+
+The Official Angband Home Page ("http://www.phial.com/")
+was created along with Angband 2.7.9 to serve as an up to date description
+of any bugs found in various versions, and to list all of the people whose
+email addresses I kept having to look up.
+
+~~~~~04
+#####R=== A Posting from the Original Author ===
+
+From: koeneke@ionet.net (Robert Alan Koeneke)
+Newsgroups: rec.games.roguelike.angband,rec.games.roguelike.moria
+Subject: Early history of Moria
+Date: Wed, 21 Feb 1996 04:20:51 GMT
+
+I had some email show up asking about the origin of Moria, and its
+relation to Rogue. So I thought I would just post some text on the
+early days of Moria.
+
+First of all, yes, I really am the Robert Koeneke who wrote the first
+Moria. I had a lot of mail accussing me of pulling their leg and
+such. I just recently connected to Internet (yes, I work for a
+company in the dark ages where Internet is concerned) and
+was real surprised to find Moria in the news groups... Angband was an
+even bigger surprise, since I have never seen it. I probably spoke to
+its originator though... I have given permission to lots of people
+through the years to enhance, modify, or whatever as long as they
+freely distributed the results. I have always been a proponent of
+sharing games, not selling them.
+
+Anyway...
+
+Around 1980 or 81 I was enrolled in engineering courses at the
+University of Oklahoma. The engineering lab ran on a PDP 1170 under
+an early version of UNIX. I was always good at computers, so it was
+natural for me to get to know the system administrators. They invited
+me one night to stay and play some games, an early startrek game, The
+Colossal Cave Adventure (later just 'Adventure'), and late one night,
+a new dungeon game called 'Rogue'.
+
+So yes, I was exposed to Rogue before Moria was even a gleam in my
+eye. In fact, Rogue was directly responsible for millions of hours of
+play time wasted on Moria and its descendents...
+
+Soon after playing Rogue (and man, was I HOOKED), I got a job in a
+different department as a student assistant in computers. I worked on
+one of the early VAX 11/780's running VMS, and no games were available
+for it at that time. The engineering lab got a real geek of an
+administrator who thought the only purpose of a computer was WORK!
+Imagine... Soooo, no more games, and no more rogue!
+
+This was intolerable! So I decided to write my own rogue game, Moria
+Beta 1.0. I had three languages available on my VMS system. Fortran
+IV, PASCAL V1.?, and BASIC. Since most of the game was string
+manipulation, I wrote the first attempt at Moria in VMS BASIC, and it
+looked a LOT like Rogue, at least what I could remember of it. Then I
+began getting ideas of how to improve it, how it should work
+differently, and I pretty much didn't touch it for about a year.
+
+Around 1983, two things happened that caused Moria to be born in its
+recognizable form. I was engaged to be married, and the only cure for
+THAT is to work so hard you can't think about it; and I was enrolled
+for fall to take an operating systems class in PASCAL.
+
+So, I investigated the new version of VMS PASCAL and found out it had
+a new feature. Variable length strings! Wow...
+
+That summer I finished Moria 1.0 in VMS PASCAL. I learned more about
+data structures, optimization, and just plain programming that summer
+then in all of my years in school. I soon drew a crowd of devoted
+Moria players... All at OU.
+
+I asked Jimmey Todd, a good friend of mine, to write a better
+character generator for the game, and so the skills and history were
+born. Jimmey helped out on many of the functions in the game as well.
+This would have been about Moria 2.0
+
+In the following two years, I listened a lot to my players and kept
+making enhancements to the game to fix problems, to challenge them,
+and to keep them going. If anyone managed to win, I immediately found
+out how, and 'enhanced' the game to make it harder. I once vowed it
+was 'unbeatable', and a week later a friend of mine beat it! His
+character, 'Iggy', was placed into the game as 'The Evil Iggy', and
+immortalized... And of course, I went in and plugged up the trick he
+used to win...
+
+Around 1985 I started sending out source to other universities. Just
+before a OU / Texas football clash, I was asked to send a copy to the
+Univeristy of Texas... I couldn't resist... I modified it so that
+the begger on the town level was 'An OU football fan' and they moved
+at maximum rate. They also multiplied at maximum rate... So the
+first step you took and woke one up, it crossed the floor increasing
+to hundreds of them and pounded you into oblivion... I soon received
+a call and provided instructions on how to 'de-enhance' the game!
+
+Around 1986 - 87 I released Moria 4.7, my last official release. I
+was working on a Moria 5.0 when I left OU to go to work for American
+Airlines (and yes, I still work there). Moria 5.0 was a complete
+rewrite, and contained many neat enhancements, features, you name it.
+It had water, streams, lakes, pools, with water monsters. It had
+'mysterious orbs' which could be carried like torches for light but
+also gave off magical aura's (like protection from fire, or aggrivate
+monster...). It had new weapons and treasures... I left it with the
+student assistants at OU to be finished, but I guess it soon died on
+the vine. As far as I know, that source was lost...
+
+I gave permission to anyone who asked to work on the game. Several
+people asked if they could convert it to 'C', and I said fine as long
+as a complete credit history was maintained, and that it could NEVER
+be sold, only given. So I guess one or more of them succeeded in
+their efforts to rewrite it in 'C'.
+
+I have since received thousands of letters from all over the world
+from players telling about their exploits, and from administrators
+cursing the day I was born... I received mail from behind the iron
+curtain (while it was still standing) talking about the game on VAX's
+(which supposedly couldn't be there due to export laws). I used to
+have a map with pins for every letter I received, but I gave up on
+that!
+
+I am very happy to learn my creation keeps on going... I plan to
+download it and Angband and play them... Maybe something has been
+added that will surprise me! That would be nice... I never got to
+play Moria and be surprised...
+
+Robert Alan Koeneke
+koeneke@ionet.net
+
+~~~~~05
+#####R=== Previous Versions (outdated) ===
+
+
+ VMS Moria Version 4.8
+Version 0.1 : 03/25/83
+Version 1.0 : 05/01/84
+Version 2.0 : 07/10/84
+Version 3.0 : 11/20/84
+Version 4.0 : 01/20/85
+
+Modules :
+ V1.0 Dungeon Generator - RAK
+ Character Generator - RAK & JWT
+ Moria Module - RAK
+ Miscellaneous - RAK & JWT
+ V2.0 Town Level & Misc - RAK
+ V3.0 Internal Help & Misc - RAK
+ V4.0 Source Release Version - RAK
+
+Robert Alan Koeneke Jimmey Wayne Todd Jr.
+Student/University of Oklahoma Student/University of Oklahoma
+
+
+ Umoria Version 5.2 (formerly UNIX Moria)
+Version 4.83 : 5/14/87
+Version 4.85 : 10/26/87
+Version 4.87 : 5/27/88
+Version 5.0 : 11/2/89
+Version 5.2 : 5/9/90
+
+James E. Wilson, U.C. Berkeley
+ wilson@ernie.Berkeley.EDU
+ ...!ucbvax!ucbernie!wilson
+
+Other contributors:
+D. G. Kneller - MS-DOS Moria port
+Christopher J. Stuart - recall, options, inventory, and running code
+Curtis McCauley - Macintosh Moria port
+Stephen A. Jacobs - Atari ST Moria port
+William Setzer - object naming code
+David J. Grabiner - numerous bug reports, and consistency checking
+Dan Bernstein - UNIX hangup signal fix, many bug fixes
+and many others...
+
+
+
+
+Copyright (c) 1989 James E. Wilson, Robert A. Keoneke
+ This software may be copied and distributed for educational, research, and
+ not for profit purposes provided that this copyright and statement are
+ included in all such copies.
+
+Umoria Version 5.2, patch level 1
+
+Angband Version 2.0 Alex Cutler, Andy Astrand, Sean Marsh, Geoff Hill,
+ Charles Teague.
+
+Angband Version 2.4 : 5/09/93
+
+Angband Version 2.5 : 12/05/93 Charles Swiger.
+
+Angband Version 2.6 : 9/04/94
+
+Angband Version 2.7 : 1/1/95 Ben Harrison
diff --git a/lib/mods/theme/help/whattome.txt b/lib/mods/theme/help/whattome.txt
new file mode 100644
index 00000000..43ebb2e1
--- /dev/null
+++ b/lib/mods/theme/help/whattome.txt
@@ -0,0 +1,30 @@
+|||||oy
+~~~~~01|ToME - a General Description
+#####R /----------------------------------------\
+#####R < What is ToME? >
+#####R \----------------------------------------/
+
+Tales of Middle Earth (ToME) is a fantasy adventure game, based on the works
+of Tolkien. Focusing on game-play rather than fancy graphics that get boring
+after a week, ToME will keep you playing for years.
+
+Explore dozens of different dungeons including hundreds of randomly generated
+levels filled with multitudes of different items and treasures. Fight off
+hundreds of monsters and uniques from the stories in a complex fighting system.
+Gain experience and learn skills; choose from the dozens of races and classes
+available to the player; cast spells from simple teleportation spells to
+advanced spells that can wipe out a whole army at once. It's the only game where
+you can burn spell books by trudging in lava (unless you have gained immunity
+from some armour), dry up rivers to cast mighty spells, strike at orcs with
+blades attuned to slay them specifically, summon armies from a simple totem,
+and even enter a symbiotic relationship with a mold!
+
+Explore dungeons, gain power, and save Middle-earth!
+
+The player will begin his adventure on the town level where he may acquire
+supplies, weapons, armour, and magical devices by bartering with various shop
+owners. After preparing for his adventure, the player can descend into the
+dungeon near Bree where fantastic adventures await his coming!
+
+Make sure you read the parchment you are given when you start the game, and
+read the in-game documentation.
diff --git a/lib/mods/theme/help/wishing.txt b/lib/mods/theme/help/wishing.txt
new file mode 100644
index 00000000..d16f5ae9
--- /dev/null
+++ b/lib/mods/theme/help/wishing.txt
@@ -0,0 +1,24 @@
+~~~~~01|Spoilers|Wishing
+#####R=== Wishes ===
+
+Some items in ToME will grant the user the ability to "wish" for an
+object that they are interested in. As such, these are generally very rare
+and very powerful objects.
+
+#####GRules for Wishes
+Due to the powerful nature of wishes, there are some rules that govern
+what is able to be wished for. These rules are as follows:
+1. You cannot wish for a wish, or any other item which would grant more
+ wishes.
+2. A wish will always generate *one* object. So, never put a number, "a"
+ or "an" in front of the object you are wishing for.
+3. It is not possible to wish for the magical +'s to the object (i.e. you
+ cannot wish for "gloves of slaying (+10,+10)", but you can wish for
+ "gloves of slaying").
+4. You cannot wish for artifacts, but you *can* wish for excellent (ego)
+ items.
+5. You can wish for monsters and ego monsters (e.g. "cave orc", "rogue cave
+ orc").
+6. You cannot wish for unique monsters.
+7. You can wish the monster to have a specific flag - a pet, or a foe.
+ Possible flags include: enemy, neutral, friendly, pet, companion.
diff --git a/lib/mods/theme/module.lua b/lib/mods/theme/module.lua
new file mode 100644
index 00000000..cc0b6f08
--- /dev/null
+++ b/lib/mods/theme/module.lua
@@ -0,0 +1,48 @@
+add_module
+{
+ ["name"] = "Theme",
+ ["version"] = { 1, 2, 0 },
+ ["author"] = { "furiosity", "furiosity@gmail.com" },
+ ["desc"] = {
+ "A module that goes back to Tolkien roots, though by no means canonical.",
+ "A new wilderness map, new monsters, objects, artifacts, uniques, ego items,",
+ "terrain features, gods, races, subraces, and classes. Have fun. :-)",
+ },
+
+ ["rand_quest"] = TRUE,
+ ["C_quest"] = TRUE,
+
+ ["base_dungeon"] = 4,
+ ["death_dungeon"] = 28,
+
+ ["astral_dungeon"] = 8,
+ ["astral_wild_x"] = 45,
+ ["astral_wild_y"] = 19,
+
+ ["random_artifact_weapon_chance"] = 30,
+ ["random_artifact_armor_chance"] = 30,
+ ["random_artifact_jewelry_chance"] = 30,
+
+ ["max_plev"] = 50,
+ ["max_skill_overage"] = 5,
+
+ ["mod_savefiles"]=
+ {
+ "Theme",
+ },
+ ["layout"] =
+ {
+ ["apex"] = "theme",
+ ["core"] = "theme",
+ ["data"] = "theme",
+ ["dngn"] = "theme",
+ ["edit"] = "theme",
+ ["file"] = "theme",
+ ["help"] = "theme",
+ ["note"] = "theme",
+ ["save"] = "theme",
+ ["scpt"] = "theme",
+ ["user"] = "theme",
+ ["pref"] = "theme",
+ },
+} \ No newline at end of file
diff --git a/lib/mods/theme/note/delete.me b/lib/mods/theme/note/delete.me
new file mode 100644
index 00000000..2e65efe2
--- /dev/null
+++ b/lib/mods/theme/note/delete.me
@@ -0,0 +1 @@
+a \ No newline at end of file
diff --git a/lib/mods/theme/permission.txt b/lib/mods/theme/permission.txt
new file mode 100644
index 00000000..bb850954
--- /dev/null
+++ b/lib/mods/theme/permission.txt
@@ -0,0 +1,3 @@
+Permission hereby granted to use any and all parts of the Theme module in other modules, games, fan fiction, whatever, as long as it's nonprofit. Please give credit where credit is due and don't simply take my work and use it as though it was always yours. Adding something of mine to an *_info file? Include a comment that credits Theme.
+
+furiosity \ No newline at end of file
diff --git a/lib/mods/theme/pref/422color.prf b/lib/mods/theme/pref/422color.prf
new file mode 100644
index 00000000..309c36b0
--- /dev/null
+++ b/lib/mods/theme/pref/422color.prf
@@ -0,0 +1,909 @@
+# Agent of the black market
+R:14:0x08:0x74
+
+# Mean-looking mercenary
+R:17:0x0c:0x74
+
+# Battle-scarred veteran
+R:18:0x04:0x74
+
+# Small kobold
+R:29:0x0d:0x6b
+
+# Kobold
+R:30:0x05:0x6b
+
+# Floating eye
+R:32:0x06:0x65
+
+# Fruit bat
+R:37:0x0a:0x62
+
+# Blubbering icky thing
+R:41:0x05:0x69
+
+# Metallic green centipede
+R:42:0x0d:0x63
+
+# Novice warrior
+R:43:0x0f:0x70
+
+# Novice rogue
+R:44:0x08:0x70
+
+# Novice priest
+R:45:0x0e:0x70
+
+# Novice mage
+R:46:0x0c:0x70
+
+# Smeagol
+R:63:0x07:0x68
+
+# Metallic blue centipede
+R:67:0x0e:0x63
+
+# Metallic red centipede
+R:77:0x0c:0x63
+
+# Novice ranger
+R:83:0x05:0x70
+
+# Snotling
+R:87:0x0d:0x6f
+
+# Skeleton kobold
+R:91:0x01:0x73
+
+# Novice mage
+R:93:0x0c:0x70
+
+# Giant leech
+R:95:0x0a:0x77
+
+# Large kobold
+R:102:0x01:0x6b
+
+# Novice priest
+R:109:0x0e:0x70
+
+# Novice warrior
+R:110:0x0f:0x70
+
+# Novice rogue
+R:116:0x08:0x70
+
+# Snaga
+R:118:0x0d:0x6f
+
+# Giant pink frog
+R:121:0x0c:0x52
+
+# Cave orc
+R:126:0x0f:0x6f
+
+# Manes
+R:128:0x0c:0x75
+
+# Red naga
+R:130:0x0c:0x6e
+
+# Red jelly
+R:131:0x0c:0x6a
+
+# Green icky thing
+R:132:0x0d:0x69
+
+# Lost soul
+R:133:0x07:0x47
+
+# Mughash, the Kobold Lord
+R:135:0x06:0x6b
+
+# Skeleton orc
+R:136:0x01:0x73
+
+# Wormtongue, Agent of Saruman
+R:137:0x08:0x70
+
+# Nurgling
+R:139:0x0f:0x75
+
+# Lagduf, the Snaga
+R:140:0x07:0x6f
+
+# Novice ranger
+R:142:0x05:0x70
+
+# Giant salamander
+R:143:0x04:0x52
+
+# Lemure
+R:148:0x03:0x75
+
+# Hill orc
+R:149:0x02:0x6f
+
+# Bandit
+R:150:0x08:0x70
+
+# Orc shaman
+R:162:0x06:0x6f
+
+# Baby blue dragon
+R:163:0x0e:0x64
+
+# Baby white dragon
+R:164:0x09:0x64
+
+# Baby green dragon
+R:165:0x0d:0x64
+
+# Baby red dragon
+R:167:0x0c:0x64
+
+# Giant red ant
+R:168:0x0c:0x61
+
+# Brodda, the Easterling
+R:169:0x03:0x70
+
+# Giant spider
+R:175:0x02:0x53
+
+# Dark elven mage
+R:178:0x0a:0x68
+
+# Kamikaze yeek
+R:179:0x07:0x79
+
+# Dark elven warrior
+R:182:0x08:0x68
+
+# Sand-dweller
+R:183:0x0f:0x75
+
+# Clear mushroom patch
+R:184:0x01:0x2c
+
+# Grishnakh, the Hill Orc
+R:186:0x07:0x6f
+
+# Hairy mold
+R:190:0x0f:0x6d
+
+# Grizzly bear
+R:191:0x07:0x71
+
+# Pseudo dragon
+R:193:0x0a:0x64
+
+# Giant fruit fly
+R:197:0x0f:0x49
+
+# Golfimbul, the Hill Orc Chief
+R:215:0x07:0x6f
+
+# Swordsman
+R:216:0x0f:0x70
+
+# Priest
+R:225:0x0e:0x70
+
+# Dark elven priest
+R:226:0x06:0x68
+
+# Skeleton human
+R:228:0x01:0x73
+
+# Moaning spirit
+R:231:0x0f:0x47
+
+# Stegocentipede
+R:232:0x06:0x63
+
+# Spotted jelly
+R:233:0x02:0x6a
+
+# Illusionist
+R:240:0x0a:0x70
+
+# Druid
+R:241:0x05:0x70
+
+# Ochre jelly
+R:245:0x0b:0x6a
+
+# Vlasta
+R:249:0x06:0x52
+
+# Snaga sapper
+R:251:0x0d:0x6f
+
+# Flesh golem
+R:256:0x03:0x67
+
+# Dark naga
+R:265:0x08:0x6e
+
+# Giant tarantula
+R:275:0x0d:0x53
+
+# Giant clear centipede
+R:276:0x01:0x63
+
+# Mirkwood spider
+R:277:0x07:0x53
+
+# Umber hulk
+R:283:0x07:0x58
+
+# Orc captain
+R:285:0x05:0x6f
+
+# Gelatinous cube
+R:286:0x0e:0x6a
+
+# Lizard man
+R:290:0x0c:0x68
+
+# Ulfast, Son of Ulfang
+R:291:0x03:0x70
+
+# Quasit
+R:294:0x09:0x75
+
+# Imp
+R:296:0x04:0x75
+
+# Forest troll
+R:297:0x0d:0x54
+
+# Giant red scorpion
+R:304:0x0c:0x53
+
+# Earth spirit
+R:305:0x0f:0x45
+
+# Fire spirit
+R:306:0x0c:0x45
+
+# Cold hound
+R:308:0x09:0x5a
+
+# Energy hound
+R:309:0x0b:0x5a
+
+# Uruk
+R:313:0x01:0x6f
+
+# Shagrat, the Orc Captain
+R:314:0x07:0x6f
+
+# Gorbag, the Orc Captain
+R:315:0x07:0x6f
+
+# Stone giant
+R:321:0x02:0x50
+
+# Giant black dragon fly
+R:322:0x08:0x46
+
+# Stone golem
+R:323:0x02:0x67
+
+# Ghast
+R:327:0x0f:0x7a
+
+# Bolg, Son of Azog
+R:330:0x0c:0x6f
+
+# Lizard king
+R:332:0x0c:0x68
+
+# Wyvern
+R:334:0x0d:0x64
+
+# Air hound
+R:338:0x0e:0x5a
+
+# Quylthulg
+R:342:0x09:0x51
+
+# Dark elven lord
+R:348:0x08:0x68
+
+# Cloud giant
+R:349:0x0e:0x50
+
+# Ugluk, the Uruk
+R:350:0x07:0x6f
+
+# Blue dragon bat
+R:351:0x0e:0x62
+
+# Water vortex
+R:355:0x06:0x76
+
+# Cold vortex
+R:358:0x09:0x76
+
+# Energy vortex
+R:359:0x0b:0x76
+
+# Mummified orc
+R:362:0x07:0x7a
+
+# Serpent man
+R:364:0x05:0x4a
+
+# Killer stag beetle
+R:366:0x02:0x4b
+
+# Iron golem
+R:367:0x09:0x67
+
+# Azog, King of the Uruk-Hai
+R:373:0x04:0x6f
+
+# Master rogue
+R:376:0x08:0x70
+
+# Angamaite of Umbar
+R:380:0x07:0x70
+
+# Forest wight
+R:381:0x0d:0x57
+
+# 4-headed hydra
+R:387:0x0f:0x4d
+
+# Mummified human
+R:390:0x0f:0x7a
+
+# Sangahyando of Umbar
+R:392:0x03:0x70
+
+# Banshee
+R:394:0x09:0x47
+
+# Pukelman
+R:398:0x07:0x67
+
+# Disenchanter beast
+R:399:0x01:0x71
+
+# Stone troll
+R:401:0x08:0x54
+
+# Troll priest
+R:403:0x06:0x54
+
+# Khufu, the Mummified King
+R:409:0x07:0x7a
+
+# Beast of Nurgle
+R:422:0x03:0x71
+
+# Creeping adamantite coins
+R:423:0x0a:0x24
+
+# Algroth
+R:424:0x02:0x54
+
+# Flamer of Tzeentch
+R:425:0x0c:0x2c
+
+# Vibration hound
+R:428:0x0f:0x5a
+
+# Ogre mage
+R:430:0x03:0x4f
+
+# Lokkak, the Ogre Chieftain
+R:431:0x05:0x4f
+
+# Colbran
+R:435:0x06:0x67
+
+# Spirit naga
+R:436:0x0e:0x6e
+
+# Corpser
+R:437:0x05:0x2c
+
+# Black knight
+R:442:0x08:0x70
+
+# Clairvoyant
+R:445:0x0e:0x70
+
+# Basilisk
+R:453:0x08:0x52
+
+# Aklash
+R:463:0x09:0x54
+
+# Skeleton troll
+R:465:0x01:0x73
+
+# Shadow drake
+R:471:0x08:0x64
+
+# Manticore
+R:472:0x03:0x48
+
+# Killer slicer beetle
+R:474:0x03:0x4b
+
+# Gug
+R:476:0x08:0x50
+
+# Death watch beetle
+R:478:0x0e:0x4b
+
+# Doombat
+R:484:0x06:0x62
+
+# Ninja
+R:485:0x08:0x70
+
+# Storm giant
+R:487:0x06:0x50
+
+# Bokrug
+R:489:0x05:0x52
+
+# Half-troll
+R:491:0x03:0x54
+
+# Bert the Stone Troll
+R:493:0x09:0x54
+
+# Bill the Stone Troll
+R:494:0x09:0x54
+
+# Tom the Stone Troll
+R:495:0x09:0x54
+
+# Barrow wight
+R:499:0x09:0x57
+
+# Law drake
+R:502:0x09:0x64
+
+# Balance drake
+R:503:0x02:0x64
+
+# Groo, the Wanderer
+R:505:0x03:0x70
+
+# Spectre
+R:508:0x0d:0x47
+
+# Cherub
+R:511:0x09:0x41
+
+# Master thief
+R:516:0x08:0x70
+
+# Lich
+R:518:0x01:0x4c
+
+# Master vampire
+R:520:0x02:0x56
+
+# Oriental vampire
+R:521:0x05:0x56
+
+# Greater mummy
+R:522:0x09:0x7a
+
+# Eog golem
+R:530:0x08:0x67
+
+# Dagashi
+R:532:0x0b:0x70
+
+# Smoke elemental
+R:537:0x08:0x45
+
+# Olog
+R:538:0x05:0x54
+
+# Gravity hound
+R:540:0x02:0x5a
+
+# Acidic cytoplasm
+R:541:0x0d:0x6a
+
+# Ooze elemental
+R:545:0x0f:0x45
+
+# Young black dragon
+R:546:0x08:0x64
+
+# Xorn
+R:550:0x03:0x58
+
+# Colossus
+R:558:0x0b:0x67
+
+# Bodak
+R:566:0x08:0x75
+
+# Lorgan, Chief of the Easterlings
+R:573:0x0c:0x70
+
+# Chaos spawn
+R:574:0x07:0x65
+
+# Crypt thing
+R:577:0x0e:0x4c
+
+# Will o' the wisp
+R:582:0x0b:0x45
+
+# Crystal drake
+R:591:0x0e:0x64
+
+# Mature black dragon
+R:592:0x08:0x64
+
+# Draebor, the Imp
+R:595:0x05:0x75
+
+# Mother Hydra
+R:596:0x05:0x75
+
+# Death knight
+R:597:0x02:0x70
+
+# Time vortex
+R:599:0x0d:0x76
+
+# Shimmering vortex
+R:600:0x0a:0x76
+
+# Beholder
+R:603:0x05:0x65
+
+# Emperor wight
+R:604:0x0b:0x57
+
+# Vargo, Tyrant of Fire
+R:606:0x0c:0x45
+
+# Nether wraith
+R:612:0x0c:0x57
+
+# Waldern, King of Water
+R:615:0x02:0x45
+
+# Ettin
+R:621:0x0b:0x54
+
+# Night mare
+R:622:0x0a:0x71
+
+# Ancient black dragon
+R:624:0x08:0x44
+
+# Shadowfax, steed of Gandalf
+R:629:0x09:0x71
+
+# Spirit troll
+R:630:0x0a:0x47
+
+# War troll
+R:631:0x05:0x54
+
+# Rotting quylthulg
+R:633:0x0f:0x51
+
+# 9-headed hydra
+R:635:0x03:0x4d
+
+# Enchantress
+R:636:0x0b:0x70
+
+# Sorcerer
+R:638:0x03:0x70
+
+# Xaren
+R:639:0x0b:0x58
+
+# Medusa, the Gorgon
+R:642:0x03:0x6e
+
+# Death drake
+R:643:0x07:0x44
+
+# Great crystal drake
+R:646:0x0e:0x44
+
+# Wyrd sister
+R:647:0x0b:0x70
+
+# Death quasit
+R:649:0x01:0x75
+
+# Fallen angel
+R:652:0x08:0x41
+
+# Judge Fire
+R:654:0x04:0x73
+
+# Master lich
+R:658:0x09:0x4c
+
+# Eol, the Dark Elf
+R:660:0x02:0x68
+
+# Undead beholder
+R:664:0x02:0x65
+
+# Dark young of Shub-Niggurath
+R:677:0x08:0x55
+
+# Dreadmaster
+R:690:0x03:0x47
+
+# Scatha the Worm
+R:692:0x01:0x44
+
+# Zoth-Ommog
+R:695:0x07:0x52
+
+# Grand master thief
+R:696:0x0e:0x70
+
+# Leprechaun fanatic
+R:700:0x08:0x68
+
+# Dracolich
+R:701:0x0e:0x44
+
+# Greater titan
+R:702:0x0a:0x50
+
+# Dracolisk
+R:703:0x04:0x44
+
+# Itangast the Fire Drake
+R:710:0x04:0x44
+
+# Glaurung, Father of the Dragons
+R:715:0x04:0x44
+
+# Behemoth
+R:716:0x05:0x48
+
+# Garm, Guardian of Hel
+R:717:0x07:0x43
+
+# Maulotaur
+R:723:0x07:0x48
+
+# Nether hound
+R:724:0x08:0x5a
+
+# Time hound
+R:725:0x0d:0x5a
+
+# Demonic quylthulg
+R:727:0x0c:0x51
+
+# Ulik the Troll
+R:729:0x03:0x54
+
+# Baphomet the Minotaur Lord
+R:730:0x08:0x48
+
+# Hell knight
+R:731:0x02:0x70
+
+# Old Sorcerer
+R:738:0x0a:0x70
+
+# Keeper of Secrets
+R:746:0x0a:0x48
+
+# Hand druj
+R:748:0x08:0x73
+
+# Eye druj
+R:749:0x08:0x73
+
+# Skull druj
+R:750:0x08:0x73
+
+# Aether vortex
+R:752:0x0e:0x76
+
+# Draconic quylthulg
+R:759:0x0d:0x51
+
+# Fundin Bluecloak
+R:762:0x0d:0x68
+
+# Gabriel, the Messenger
+R:769:0x0a:0x41
+
+# Artsi, the Champion of Chaos
+R:770:0x0d:0x68
+
+# The Cat Lord
+R:777:0x04:0x66
+
+# Vlad Dracula, Prince of Darkness
+R:780:0x06:0x56
+
+# Great Wyrm of Law
+R:784:0x09:0x44
+
+# Great Wyrm of Balance
+R:785:0x02:0x44
+
+# Glaaki
+R:788:0x05:0x7e
+
+# Greater draconic quylthulg
+R:801:0x05:0x51
+
+# Greater rotting quylthulg
+R:802:0x07:0x51
+
+# Omarax the Eye Tyrant
+R:805:0x0b:0x65
+
+# Greater Balrog
+R:807:0x0c:0x55
+
+# Aether hound
+R:811:0x0e:0x5a
+
+# Yig, Father of Serpents
+R:814:0x05:0x4a
+
+# Hela, Queen of the Dead
+R:817:0x05:0x70
+
+# Master quylthulg
+R:821:0x06:0x51
+
+# Qlzqqlzuup, the Lord of Flesh
+R:822:0x0e:0x51
+
+# F'lar, rider of the Bronze Mnementh
+R:824:0x08:0x44
+
+# Cyaegha
+R:826:0x08:0x65
+
+# Pazuzu, Lord of Air
+R:827:0x01:0x55
+
+# Cantoras, the Skeletal Lord
+R:830:0x0e:0x73
+
+# Godzilla
+R:832:0x05:0x52
+
+# Loki, the Trickster
+R:835:0x05:0x50
+
+# Lungorthin, the Balrog of White Fire
+R:839:0x01:0x55
+
+# Draugluin, Sire of All Werewolves
+R:840:0x07:0x43
+
+# Vecna, the Emperor Lich
+R:844:0x0b:0x4c
+
+# Great Wyrm of Power
+R:847:0x0b:0x44
+
+# Nodens, Lord of the Great Abyss
+R:849:0x01:0x50
+
+# Jormungand the Midgard Serpent
+R:854:0x05:0x4a
+
+# The Destroyer
+R:855:0x09:0x67
+
+# Gothmog, the High Captain of Balrogs
+R:856:0x0c:0x55
+
+# Sauron, the Sorcerer
+R:860:0x03:0x70
+
+# Human Warrior
+R:863:0x01:0x70
+
+# Elven archer
+R:864:0x0d:0x68
+
+# Death
+R:875:0x02:0x47
+
+# Famine
+R:876:0x02:0x47
+
+# Pestilence
+R:877:0x02:0x47
+
+# War
+R:878:0x02:0x47
+
+# Giant piranha
+R:884:0x0d:0x7e
+
+# Octopus
+R:891:0x02:0x7e
+
+# Giant octopus
+R:892:0x0a:0x7e
+
+# Drowned soul
+R:895:0x02:0x47
+
+# Devilfish
+R:920:0x0a:0x7e
+
+# Undead devilfish
+R:921:0x0a:0x7e
+
+# Gandalf the Grey
+R:935:0x0a:0x70
+
+# Brown Firelizard
+R:942:0x0f:0x64
+
+# Bronze Firelizard
+R:943:0x01:0x64
+
+# Elder aranea
+R:964:0x04:0x53
+
+# Bullroarer the Hobbit
+R:985:0x06:0x68
+
+# Hezrou
+R:992:0x0a:0x55
+
+# Glabrezu
+R:993:0x03:0x55
+
+# Lesser Balrog
+R:996:0x0c:0x55
+
+# The Rat King
+R:1006:0x07:0x72
+
+# Vort the Kobold Queen
+R:1007:0x06:0x6b
+
+# Fire Phantom
+R:1009:0x0c:0x47
+
+# Bone golem
+R:1013:0x08:0x67
+
+# Snake of Yig
+R:1014:0x04:0x4a
+
+# Cultist
+R:1017:0x0e:0x70
+
+# Cult leader
+R:1018:0x06:0x70
+
+# Green dragon worm
+R:1025:0x05:0x77
+
+# Red dragon worm
+R:1027:0x04:0x77
+
diff --git a/lib/mods/theme/pref/colors.prf b/lib/mods/theme/pref/colors.prf
new file mode 100644
index 00000000..fa4d3f05
--- /dev/null
+++ b/lib/mods/theme/pref/colors.prf
@@ -0,0 +1,53 @@
+
+
+# Color redefinitions
+
+# Color 'White'
+V:1:0x07:0xFF:0xFF:0xFF
+
+# Color 'Slate'
+V:2:0x03:0x8C:0x8C:0x8C
+
+# Color 'Orange'
+V:3:0x0C:0xFF:0x77:0x00
+
+# Color 'Red'
+V:4:0x04:0xC9:0x00:0x00
+
+# Color 'Green'
+V:5:0x02:0x00:0x86:0x45
+
+# Color 'Blue'
+V:6:0x01:0x00:0x00:0xE3
+
+# Color 'Umber'
+V:7:0x06:0x8E:0x45:0x00
+
+# Color 'Light Dark'
+V:8:0x08:0x50:0x50:0x50
+
+# Color 'Light Slate'
+V:9:0x0B:0xD1:0xD1:0xD1
+
+# Color 'Violet'
+V:10:0x05:0xC0:0x00:0xAF
+
+# Color 'Yellow'
+V:11:0x0E:0xFF:0xFF:0x00
+
+# Color 'Light Red'
+V:12:0x0D:0xFF:0x00:0x68
+
+# Color 'Light Green'
+V:13:0x0A:0x00:0xFF:0x00
+
+# Color 'Light Blue'
+V:14:0x09:0x51:0xDD:0xFF
+
+# Color 'Light Umber'
+V:15:0x06:0xD7:0x8E:0x45
+
+
+
+
+
diff --git a/lib/mods/theme/pref/font-ami.prf b/lib/mods/theme/pref/font-ami.prf
new file mode 100644
index 00000000..1c06dbb3
--- /dev/null
+++ b/lib/mods/theme/pref/font-ami.prf
@@ -0,0 +1,28 @@
+# File: font-ami.prf
+
+#
+# This file contains text remapping data
+# currently used in the Amiga version.
+#
+# Lars Haugseth <larshau@ifi.uio.no>
+#
+
+
+# Color palette - Text
+V:0:0x01:0x00:0x00:0x00
+V:1:0x01:0xFF:0xFF:0xFF
+V:2:0x01:0xC7:0xC7:0xC7
+V:3:0x01:0xFF:0x92:0x00
+V:4:0x01:0xFF:0x00:0x00
+V:5:0x01:0x00:0xCD:0x00
+V:6:0x01:0x00:0x00:0xFE
+V:7:0x01:0xC8:0x64:0x00
+V:8:0x01:0x8A:0x8A:0x8A
+V:9:0x01:0xE0:0xE0:0xE0
+V:10:0x01:0xA5:0x00:0xFF
+V:11:0x01:0xFF:0xFD:0x00
+V:12:0x01:0xFF:0x00:0xBC
+V:13:0x01:0x00:0xFF:0x00
+V:14:0x01:0x00:0xC8:0xFF
+V:15:0x01:0xFF:0xCC:0x80
+
diff --git a/lib/mods/theme/pref/font-dos.prf b/lib/mods/theme/pref/font-dos.prf
new file mode 100644
index 00000000..9cf1866f
--- /dev/null
+++ b/lib/mods/theme/pref/font-dos.prf
@@ -0,0 +1,8 @@
+# File: font-dos.prf
+
+#
+# This file is used by Angband (when it was compiled using "main-dos.c")
+# to specify simple attr/char remappings using a standard font, allowing
+# the use of special pseudo-graphic pictures for walls and such.
+#
+
diff --git a/lib/mods/theme/pref/font-ibm.prf b/lib/mods/theme/pref/font-ibm.prf
new file mode 100644
index 00000000..91ca81bb
--- /dev/null
+++ b/lib/mods/theme/pref/font-ibm.prf
@@ -0,0 +1,365 @@
+# File: font-ibm.prf
+
+#
+# This file is used by Angband (when it was compiled using "main-ibm.c")
+# to specify simple attr/char remappings using a standard font, allowing
+# the use of the IBM's built in pseudo-graphic pictures for walls and such.
+#
+
+
+##### Feature attr/char definitions #####
+
+# open floor
+F:1:0x01/0xF9
+
+# fountain
+F:2:0x01/0xF4
+
+# fountain
+F:15:0x08/0xF4
+
+# web
+F:16:0x0B/0xB2
+
+# secret door
+F:48:0x01/0xB1
+
+# magma vein
+F:50:0x02/0xB0
+
+# quartz vein
+F:51:0x01/0xB0
+
+# magma vein
+F:52:0x02/0xB0
+
+# quartz vein
+F:53:0x01/0xB0
+
+# magma vein with treasure
+F:54:0x03/0xB0
+
+# quartz vein with treasure
+F:55:0x03/0xB0
+
+# granite wall
+F:56:0x01/0xB1
+
+# granite wall
+F:57:0x01/0xB1
+
+# granite wall
+F:58:0x01/0xB1
+
+# granite wall
+F:59:0x01/0xB1
+
+# permanent wall
+F:60:0x01/0xB1
+
+# permanent wall
+F:61:0x01/0xB1
+
+# permanent wall
+F:62:0x01/0xB1
+
+# permanent wall
+F:63:0x01/0xB1
+
+# Straight Road startpoint
+F:65:0x01/0xB2
+
+# section of the Straight Road
+F:66:0x0E/0xB2
+
+# section of the Straight Road
+F:67:0x06/0xB2
+
+# section of the Straight Road
+F:68:0x0E/0xB2
+
+# section of the Straight Road
+F:69:0x06/0xB2
+
+# section of the Straight Road
+F:70:0x09/0xB2
+
+# section of the Straight Road (discharged)
+F:71:0x09/0xB2
+
+# Straight Road exit
+F:72:0x01/0xB2
+
+# corrupted section of the Straight Road
+F:73:0x08/0xB2
+
+# permanent wall
+F:75:0x01/0xB1
+
+# permanent wall
+F:76:0x01/0xB1
+
+# permanent wall
+F:77:0x01/0xB1
+
+# permanent wall
+F:78:0x01/0xB1
+
+# stream of shallow water
+F:84:0x0E/0xF7
+
+# pool of deep lava
+F:85:0x0C/0xF7
+
+# stream of shallow lava
+F:86:0x04/0xF7
+
+# dark pit
+F:87:0x08/0xDB
+
+# dirt
+F:88:0x0F/0xF9
+
+# patch of grass
+F:89:0x0D/0xF9
+
+# ice
+F:90:0x09/0xDB
+
+# sand
+F:91:0x0B/0xF9
+
+# dead tree
+F:92:0x08/0x9D
+
+# ash
+F:93:0x02/0xF9
+
+# mud
+F:94:0x07/0xF9
+
+# ice wall
+F:95:0x09/0xB1
+
+# tree
+F:96:0x0D/0x9D
+
+# sandwall
+F:98:0x0B/0xB1
+
+# sandwall
+F:99:0x0B/0xB1
+
+# sandwall with treasure
+F:100:0x03/0xB1
+
+# nether mist
+F:102:0x0A/0xB2
+
+# Void Jumpgate
+F:160:0x0A/0xEF
+
+# Altar of Being
+F:161:0x09/0xD2
+
+# Altar of Winds
+F:162:0x0E/0xD2
+
+# Altar of Force
+F:163:0x0C/0xD2
+
+# Altar of Darkness
+F:164:0x08/0xD2
+
+# floor
+F:172:0x01/0xF9
+
+# Underground Tunnel
+F:173:0x02/0xB0
+
+# stream of tainted water
+F:174:0x07/0xF7
+
+# Void Jumpgate
+F:176:0x0A/0xEF
+
+# lava wall
+F:177:0x0C/0xB1
+
+# Great Fire
+F:178:0x0A/0xF7
+
+# field
+F:181:0x05/0xF9
+
+# Ekkaia, the Encircling Sea
+F:182:0x06/0xF7
+
+# pool of deep water
+F:187:0x06/0xF7
+
+# glass wall
+F:188:0x0E/0xDB
+
+# illusion wall
+F:189:0x01/0xB1
+
+# Grass roof
+F:190:0x0B/0xB1
+
+# grass roof top
+F:191:0x0B/0xB1
+
+# grass roof chimney
+F:192:0x0B/0xB1
+
+# brick roof
+F:193:0x04/0xB1
+
+# brick roof top
+F:194:0x04/0xB1
+
+# brick roof chimney
+F:195:0x04/0xB1
+
+# window
+F:196:0x01/0x4F
+
+# small window
+F:197:0x01/0x6F
+
+# rain barrel
+F:198:0x01/0xB1
+
+# cobblestone road
+F:200:0x01/0xF9
+
+# cobblestone with outlet
+F:201:0x01/0xF9
+
+# small tree
+F:202:0x05/0x9D
+
+# Underground Tunnel
+F:204:0x0F/0xB0
+
+# a blazing fire
+F:205:0x0B/0xF7
+
+# rocky ground
+F:207:0x02/0xF9
+
+# cloud-like vapour
+F:208:0x09/0xB2
+
+# condensing water
+F:209:0x0E/0xF7
+
+# dense mist
+F:210:0x01/0xB2
+
+# hail-stone wall
+F:211:0x09/0xB1
+
+# dark pit
+F:248:0x04:0x27
+
+##### Monster attr/char definitions #####
+
+# Space monster
+R:144:0x00/0xF9
+
+# Old Man Willow
+R:206:0x02/0x9D
+
+# Lurker
+R:247:0x01/0xF9
+
+# Tangleweed
+R:248:0x05/0x9D
+
+# Poison ivy
+R:266:0x05/0x9D
+
+# Giant Venus Flytrap
+R:317:0x05/0x9D
+
+# Stunwall
+R:326:0x09/0xB1
+
+# Huorn
+R:329:0x05/0x9D
+
+# Landmine
+R:333:0x01/0xF9
+
+# Livingstone
+R:336:0x09/0xB1
+
+# Vampiric mist
+R:365:0x08/0xB2
+
+# It
+R:393:0x09/0xF9
+
+# Xiclotlan
+R:396:0x08/0x9D
+
+# Roper
+R:426:0x08/0xB1
+
+# Lesser wall monster
+R:448:0x09/0xB1
+
+# Chaos tile
+R:458:0x0A/0xF9
+
+# Mist giant
+R:552:0x0E/0xB2
+
+# Trapper
+R:565:0x01/0xF9
+
+# Time bomb
+R:567:0x01/0xF9
+
+# Weird fume
+R:625:0x0A/0xB2
+
+# Colour out of space
+R:678:0x0A/0xF9
+
+# Ent
+R:708:0x0D/0x9D
+
+# Quickbeam, the Ent
+R:714:0x0D/0x9D
+
+# Greater wall monster
+R:718:0x09/0xB1
+
+# Ahtu, Avatar of Nyarlathotep
+R:761:0x08/0xB1
+
+# Null, the Living Void
+R:803:0x00/0xF9
+
+# Rocket mine
+R:870:0x0C/0xF9
+
+# Bouncing mine
+R:871:0x0E/0xF9
+
+# Fangorn the Treebeard, Lord of the Ents
+R:934:0x0D/0x9D
+
+# The Glass Golem
+R:1033:0x09/0xB1
+
+# Golgarach, the Living Rock
+R:1035:0x09/0xB1
+
+# Spirit
+R:1053:0x09/0xF9
+
+
diff --git a/lib/mods/theme/pref/font-mac.new b/lib/mods/theme/pref/font-mac.new
new file mode 100644
index 00000000..8b7f937c
--- /dev/null
+++ b/lib/mods/theme/pref/font-mac.new
@@ -0,0 +1,110 @@
+# File: font-mac.prf
+
+#
+# This file is used by Angband (when it was compiled using "main-mac.c")
+# to specify simple attr/char remappings using a standard font, allowing
+# the use of the Macintosh's special characters for some things.
+#
+
+
+##### Feature attr/char definitions #####
+
+# fountain
+F:2:0x01/0xBA
+
+# fountain
+F:15:0x08/0xBA
+
+# stream of shallow water
+F:84:0x0E/0xC5
+
+# pool of deep lava
+F:85:0x0C/0xC5
+
+# stream of shallow lava
+F:86:0x04/0xC5
+
+# dead tree
+F:92:0x08/0xB4
+
+# tree
+F:96:0x0D/0xB4
+
+# mountain chain
+F:97:0x0F/0xC6
+
+# high mountain chain
+F:101:0x09/0xC6
+
+# Void Jumpgate
+F:160:0x0A/0xBD
+
+# Altar of Being
+F:161:0x09/0xB9
+
+# Altar of Winds
+F:162:0x0E/0xB9
+
+# Altar of Force
+F:163:0x0C/0xB9
+
+# Altar of Darkness
+F:164:0x08/0xB9
+
+# stream of tainted water
+F:174:0x07/0xC5
+
+# Void Jumpgate
+F:176:0x0A/0xBD
+
+# Great Fire
+F:178:0x0A/0xC5
+
+# Ekkaia, the Encircling Sea
+F:182:0x06/0xC5
+
+# pool of deep water
+F:187:0x06/0xC5
+
+# small tree
+F:202:0x05/0xB4
+
+# a blazing fire
+F:205:0x0B/0xC5
+
+# condensing water
+F:209:0x0E/0xC5
+
+# dark pit
+F:248:0x04:0x27
+
+##### Monster attr/char definitions #####
+
+# Old Man Willow
+R:206:0x02/0xB4
+
+# Tangleweed
+R:248:0x05/0xB4
+
+# Poison ivy
+R:266:0x05/0xB4
+
+# Giant Venus Flytrap
+R:317:0x05/0xB4
+
+# Huorn
+R:329:0x05/0xB4
+
+# Xiclotlan
+R:396:0x08/0xB4
+
+# Ent
+R:708:0x0D/0xB4
+
+# Quickbeam, the Ent
+R:714:0x0D/0xB4
+
+# Fangorn the Treebeard, Lord of the Ents
+R:934:0x0D/0xB4
+
+
diff --git a/lib/mods/theme/pref/font-mac.prf b/lib/mods/theme/pref/font-mac.prf
new file mode 100644
index 00000000..d15c2e47
--- /dev/null
+++ b/lib/mods/theme/pref/font-mac.prf
@@ -0,0 +1,18 @@
+# File: font.prf
+
+#
+# This file defines special attr/char mappings for use in "text" mode
+#
+# See "lib/help/command.txt" and "src/files.c" for more information.
+#
+
+
+## OPTION: Display "veins" (white "%") as "normal walls" (white "#")
+## This replaces the old method of setting "notice_seams" to false,
+## which no longer works as of Angband 2.7.9, for various reasons.
+#
+#F:50:1/35
+#F:51:1/35
+#F:52:1/35
+#F:53:1/35
+
diff --git a/lib/mods/theme/pref/font-win.prf b/lib/mods/theme/pref/font-win.prf
new file mode 100644
index 00000000..6c54e7e5
--- /dev/null
+++ b/lib/mods/theme/pref/font-win.prf
@@ -0,0 +1,304 @@
+# File: font-win.prf
+
+#
+# This file is used by Angband (when it was compiled using "main-win.c")
+# to specify simple attr/char remappings using a standard font, allowing
+# the use of special pseudo-graphic pictures for walls and such.
+#
+# Note that this file is extremely similar to the file "font-ibm.prf",
+# but it uses different codes, since it uses the special pseudo-graphic
+# symbols defined in the "lib/xtra/font/*.FON" files, and there is only
+# one special wall type, so we have to use special "colors".
+#
+
+
+##### Feature attr/char definitions #####
+
+# open floor
+F:1:0x01/0x1F
+
+# web
+F:16:0x0B/0x7F
+
+# secret door
+F:48:0x01/0x7F
+
+# magma vein
+F:50:0x02/0x7F
+
+# quartz vein
+F:51:0x09/0x7F
+
+# magma vein
+F:52:0x02/0x7F
+
+# quartz vein
+F:53:0x09/0x7F
+
+# granite wall
+F:56:0x01/0x7F
+
+# granite wall
+F:57:0x01/0x7F
+
+# granite wall
+F:58:0x01/0x7F
+
+# granite wall
+F:59:0x01/0x7F
+
+# permanent wall
+F:60:0x01/0x7F
+
+# permanent wall
+F:61:0x01/0x7F
+
+# permanent wall
+F:62:0x01/0x7F
+
+# permanent wall
+F:63:0x01/0x7F
+
+# permanent wall
+F:75:0x01/0x7F
+
+# permanent wall
+F:76:0x01/0x7F
+
+# permanent wall
+F:77:0x01/0x7F
+
+# permanent wall
+F:78:0x01/0x7F
+
+# pool of deep lava
+F:85:0x0C/0x1F
+
+# stream of shallow lava
+F:86:0x04/0x1F
+
+# dark pit
+F:87:0x08/0x7F
+
+# dirt
+F:88:0x0F/0x1F
+
+# patch of grass
+F:89:0x0D/0x1F
+
+# ice
+F:90:0x09/0x1F
+
+# sand
+F:91:0x0B/0x1F
+
+# dead tree
+F:92:0x08/0x7F
+
+# ash
+F:93:0x02/0x1F
+
+# mud
+F:94:0x07/0x1F
+
+# ice wall
+F:95:0x09/0x7F
+
+# tree
+F:96:0x0D/0x7F
+
+# sandwall
+F:98:0x0B/0x7F
+
+# sandwall
+F:99:0x0B/0x7F
+
+# sandwall with treasure
+F:100:0x03/0x7F
+
+# nether mist
+F:102:0x0A/0x7F
+
+# glass wall
+F:103:0x0E/0x1F
+
+# Underground Tunnel
+F:173:0x02/0x7F
+
+# lava wall
+F:177:0x0C/0x7F
+
+# Great Fire
+F:178:0x0A/0x7F
+
+# field
+F:181:0x05/0x1F
+
+# glass wall
+F:188:0x0E/0x1F
+
+# illusion wall
+F:189:0x01/0x7F
+
+# Grass roof
+F:190:0x0B/0x7F
+
+# grass roof top
+F:191:0x0B/0x7F
+
+# grass roof chimney
+F:192:0x0B/0x7F
+
+# brick roof
+F:193:0x04/0x7F
+
+# brick roof top
+F:194:0x04/0x7F
+
+# brick roof chimney
+F:195:0x04/0x7F
+
+# rain barrel
+F:198:0x01/0x7F
+
+# cobblestone road
+F:200:0x01/0x1F
+
+# cobblestone with outlet
+F:201:0x01/0x1F
+
+# small tree
+F:202:0x05/0x7F
+
+# Underground Tunnel
+F:204:0x0F/0x7F
+
+# a blazing fire
+F:205:0x0B/0x7F
+
+# rocky ground
+F:207:0x02/0x1F
+
+# cloud-like vapour
+F:208:0x09/0x1F
+
+# dense mist
+F:210:0x01/0x7F
+
+# hail-stone wall
+F:211:0x09/0x7F
+
+# copper pillar
+F:244:0x07/0x7F
+
+# ethereal wall
+F:245:0x01/0x1F
+
+# glacial wall
+F:246:0x0E/0x7F
+
+# battlement
+F:247:0x01/0x7F
+
+# dark pit
+F:248:0x04:0x27
+
+##### Monster attr/char definitions #####
+
+# Space monster
+R:144:0x00/0x1F
+
+# Old Man Willow
+R:206:0x02/0x7F
+
+# Lurker
+R:247:0x01/0x1F
+
+# Tangleweed
+R:248:0x05/0x7F
+
+# Poison ivy
+R:266:0x05/0x7F
+
+# Giant Venus Flytrap
+R:317:0x05/0x7F
+
+# Stunwall
+R:326:0x09/0x7F
+
+# Huorn
+R:329:0x05/0x7F
+
+# Landmine
+R:333:0x01/0x1F
+
+# Livingstone
+R:336:0x09/0x7F
+
+# Vampiric mist
+R:365:0x08/0x7F
+
+# It
+R:393:0x09/0x1F
+
+# Xiclotlan
+R:396:0x08/0x7F
+
+# Roper
+R:426:0x08/0x7F
+
+# Lesser wall monster
+R:448:0x09/0x7F
+
+# Chaos tile
+R:458:0x0A/0x1F
+
+# Mist giant
+R:552:0x0E/0x7F
+
+# Trapper
+R:565:0x01/0x1F
+
+# Time bomb
+R:567:0x01/0x1F
+
+# Weird fume
+R:625:0x0A/0x7F
+
+# Colour out of space
+R:678:0x0A/0x1F
+
+# Ent
+R:708:0x0D/0x7F
+
+# Quickbeam, the Ent
+R:714:0x0D/0x7F
+
+# Greater wall monster
+R:718:0x09/0x7F
+
+# Ahtu, Avatar of Nyarlathotep
+R:761:0x08/0x7F
+
+# Null, the Living Void
+R:803:0x00/0x1F
+
+# Rocket mine
+R:870:0x0C/0x1F
+
+# Bouncing mine
+R:871:0x0E/0x1F
+
+# Fangorn the Treebeard, Lord of the Ents
+R:934:0x0D/0x7F
+
+# The Glass Golem
+R:1033:0x09/0x7F
+
+# Golgarach, the Living Rock
+R:1035:0x09/0x7F
+
+# Spirit
+R:1053:0x09/0x1F
+
+
diff --git a/lib/mods/theme/pref/font-x11.prf b/lib/mods/theme/pref/font-x11.prf
new file mode 100644
index 00000000..57828a56
--- /dev/null
+++ b/lib/mods/theme/pref/font-x11.prf
@@ -0,0 +1,22 @@
+# File: font-x11.prf
+
+
+# Color palette - Text
+
+V:0:0x01:0x00:0x00:0x00
+V:1:0x01:0xFF:0xFF:0xFF
+V:2:0x01:0xC7:0xC7:0xC7
+V:3:0x01:0xFF:0x92:0x00
+V:4:0x01:0xC0:0x00:0x00
+V:5:0x01:0x00:0xC0:0x00
+V:6:0x01:0x00:0x00:0xFE
+V:7:0x01:0xC8:0x64:0x00
+V:8:0x01:0x8A:0x8A:0x8A
+V:9:0x01:0xE0:0xE0:0xE0
+V:10:0x01:0xA5:0x00:0xFF
+V:11:0x01:0xFF:0xFD:0x00
+V:12:0x01:0xFF:0x40:0x40
+V:13:0x01:0x00:0xFF:0x00
+V:14:0x01:0x00:0xC8:0xFF
+V:15:0x01:0xFF:0xCC:0x80
+
diff --git a/lib/mods/theme/pref/font-xxx.prf b/lib/mods/theme/pref/font-xxx.prf
new file mode 100644
index 00000000..298a8643
--- /dev/null
+++ b/lib/mods/theme/pref/font-xxx.prf
@@ -0,0 +1,472 @@
+# File: font-xxx.prf
+
+#
+# This file defines special attr/char mappings for use in "text" mode
+#
+# See "lib/help/command.txt" and "src/files.c" for more information.
+#
+
+
+##### Special attr/char values #####
+
+
+## # Unused (@)
+## S:0x00:0x00/0x40
+## S:0x01:0x01/0x40
+## S:0x02:0x02/0x40
+## S:0x03:0x03/0x40
+## S:0x04:0x04/0x40
+## S:0x05:0x05/0x40
+## S:0x06:0x06/0x40
+## S:0x07:0x07/0x40
+## S:0x08:0x08/0x40
+## S:0x09:0x09/0x40
+## S:0x0A:0x0A/0x40
+## S:0x0B:0x0B/0x40
+## S:0x0C:0x0C/0x40
+## S:0x0D:0x0D/0x40
+## S:0x0E:0x0E/0x40
+## S:0x0F:0x0F/0x40
+
+## # Unused (@)
+## S:0x10:0x00/0x40
+## S:0x11:0x01/0x40
+## S:0x12:0x02/0x40
+## S:0x13:0x03/0x40
+## S:0x14:0x04/0x40
+## S:0x15:0x05/0x40
+## S:0x16:0x06/0x40
+## S:0x17:0x07/0x40
+## S:0x18:0x08/0x40
+## S:0x19:0x09/0x40
+## S:0x1A:0x0A/0x40
+## S:0x1B:0x0B/0x40
+## S:0x1C:0x0C/0x40
+## S:0x1D:0x0D/0x40
+## S:0x1E:0x0E/0x40
+## S:0x1F:0x0F/0x40
+
+## # Unused (@)
+## S:0x20:0x00/0x40
+## S:0x21:0x01/0x40
+## S:0x22:0x02/0x40
+## S:0x23:0x03/0x40
+## S:0x24:0x04/0x40
+## S:0x25:0x05/0x40
+## S:0x26:0x06/0x40
+## S:0x27:0x07/0x40
+## S:0x28:0x08/0x40
+## S:0x29:0x09/0x40
+## S:0x2A:0x0A/0x40
+## S:0x2B:0x0B/0x40
+## S:0x2C:0x0C/0x40
+## S:0x2D:0x0D/0x40
+## S:0x2E:0x0E/0x40
+## S:0x2F:0x0F/0x40
+
+# Spells (*)
+S:0x30:0x00/0x2A
+S:0x31:0x01/0x2A
+S:0x32:0x02/0x2A
+S:0x33:0x03/0x2A
+S:0x34:0x04/0x2A
+S:0x35:0x05/0x2A
+S:0x36:0x06/0x2A
+S:0x37:0x07/0x2A
+S:0x38:0x08/0x2A
+S:0x39:0x09/0x2A
+S:0x3A:0x0A/0x2A
+S:0x3B:0x0B/0x2A
+S:0x3C:0x0C/0x2A
+S:0x3D:0x0D/0x2A
+S:0x3E:0x0E/0x2A
+S:0x3F:0x0F/0x2A
+
+# Spells (|)
+S:0x40:0x00/0x7C
+S:0x41:0x01/0x7C
+S:0x42:0x02/0x7C
+S:0x43:0x03/0x7C
+S:0x44:0x04/0x7C
+S:0x45:0x05/0x7C
+S:0x46:0x06/0x7C
+S:0x47:0x07/0x7C
+S:0x48:0x08/0x7C
+S:0x49:0x09/0x7C
+S:0x4A:0x0A/0x7C
+S:0x4B:0x0B/0x7C
+S:0x4C:0x0C/0x7C
+S:0x4D:0x0D/0x7C
+S:0x4E:0x0E/0x7C
+S:0x4F:0x0F/0x7C
+
+# Spells (-)
+S:0x50:0x00/0x2D
+S:0x51:0x01/0x2D
+S:0x52:0x02/0x2D
+S:0x53:0x03/0x2D
+S:0x54:0x04/0x2D
+S:0x55:0x05/0x2D
+S:0x56:0x06/0x2D
+S:0x57:0x07/0x2D
+S:0x58:0x08/0x2D
+S:0x59:0x09/0x2D
+S:0x5A:0x0A/0x2D
+S:0x5B:0x0B/0x2D
+S:0x5C:0x0C/0x2D
+S:0x5D:0x0D/0x2D
+S:0x5E:0x0E/0x2D
+S:0x5F:0x0F/0x2D
+
+# Spells (/)
+S:0x60:0x00/0x2F
+S:0x61:0x01/0x2F
+S:0x62:0x02/0x2F
+S:0x63:0x03/0x2F
+S:0x64:0x04/0x2F
+S:0x65:0x05/0x2F
+S:0x66:0x06/0x2F
+S:0x67:0x07/0x2F
+S:0x68:0x08/0x2F
+S:0x69:0x09/0x2F
+S:0x6A:0x0A/0x2F
+S:0x6B:0x0B/0x2F
+S:0x6C:0x0C/0x2F
+S:0x6D:0x0D/0x2F
+S:0x6E:0x0E/0x2F
+S:0x6F:0x0F/0x2F
+
+# Spells (\)
+S:0x70:0x00/0x5C
+S:0x71:0x01/0x5C
+S:0x72:0x02/0x5C
+S:0x73:0x03/0x5C
+S:0x74:0x04/0x5C
+S:0x75:0x05/0x5C
+S:0x76:0x06/0x5C
+S:0x77:0x07/0x5C
+S:0x78:0x08/0x5C
+S:0x79:0x09/0x5C
+S:0x7A:0x0A/0x5C
+S:0x7B:0x0B/0x5C
+S:0x7C:0x0C/0x5C
+S:0x7D:0x0D/0x5C
+S:0x7E:0x0E/0x5C
+S:0x7F:0x0F/0x5C
+
+# Amulets (")
+S:0x80:0x00/0x22
+S:0x81:0x01/0x22
+S:0x82:0x02/0x22
+S:0x83:0x03/0x22
+S:0x84:0x04/0x22
+S:0x85:0x05/0x22
+S:0x86:0x06/0x22
+S:0x87:0x07/0x22
+S:0x88:0x08/0x22
+S:0x89:0x09/0x22
+S:0x8A:0x0A/0x22
+S:0x8B:0x0B/0x22
+S:0x8C:0x0C/0x22
+S:0x8D:0x0D/0x22
+S:0x8E:0x0E/0x22
+S:0x8F:0x0F/0x22
+
+# Rings (=)
+S:0x90:0x00/0x3D
+S:0x91:0x01/0x3D
+S:0x92:0x02/0x3D
+S:0x93:0x03/0x3D
+S:0x94:0x04/0x3D
+S:0x95:0x05/0x3D
+S:0x96:0x06/0x3D
+S:0x97:0x07/0x3D
+S:0x98:0x08/0x3D
+S:0x99:0x09/0x3D
+S:0x9A:0x0A/0x3D
+S:0x9B:0x0B/0x3D
+S:0x9C:0x0C/0x3D
+S:0x9D:0x0D/0x3D
+S:0x9E:0x0E/0x3D
+S:0x9F:0x0F/0x3D
+
+# Staffs (_)
+S:0xA0:0x00/0x5F
+S:0xA1:0x01/0x5F
+S:0xA2:0x02/0x5F
+S:0xA3:0x03/0x5F
+S:0xA4:0x04/0x5F
+S:0xA5:0x05/0x5F
+S:0xA6:0x06/0x5F
+S:0xA7:0x07/0x5F
+S:0xA8:0x08/0x5F
+S:0xA9:0x09/0x5F
+S:0xAA:0x0A/0x5F
+S:0xAB:0x0B/0x5F
+S:0xAC:0x0C/0x5F
+S:0xAD:0x0D/0x5F
+S:0xAE:0x0E/0x5F
+S:0xAF:0x0F/0x5F
+
+# Wands (-)
+S:0xB0:0x00/0x2D
+S:0xB1:0x01/0x2D
+S:0xB2:0x02/0x2D
+S:0xB3:0x03/0x2D
+S:0xB4:0x04/0x2D
+S:0xB5:0x05/0x2D
+S:0xB6:0x06/0x2D
+S:0xB7:0x07/0x2D
+S:0xB8:0x08/0x2D
+S:0xB9:0x09/0x2D
+S:0xBA:0x0A/0x2D
+S:0xBB:0x0B/0x2D
+S:0xBC:0x0C/0x2D
+S:0xBD:0x0D/0x2D
+S:0xBE:0x0E/0x2D
+S:0xBF:0x0F/0x2D
+
+# Rods (-)
+S:0xC0:0x00/0x2D
+S:0xC1:0x01/0x2D
+S:0xC2:0x02/0x2D
+S:0xC3:0x03/0x2D
+S:0xC4:0x04/0x2D
+S:0xC5:0x05/0x2D
+S:0xC6:0x06/0x2D
+S:0xC7:0x07/0x2D
+S:0xC8:0x08/0x2D
+S:0xC9:0x09/0x2D
+S:0xCA:0x0A/0x2D
+S:0xCB:0x0B/0x2D
+S:0xCC:0x0C/0x2D
+S:0xCD:0x0D/0x2D
+S:0xCE:0x0E/0x2D
+S:0xCF:0x0F/0x2D
+
+# Scrolls (?)
+S:0xD0:0x00/0x3F
+S:0xD1:0x01/0x3F
+S:0xD2:0x02/0x3F
+S:0xD3:0x03/0x3F
+S:0xD4:0x04/0x3F
+S:0xD5:0x05/0x3F
+S:0xD6:0x06/0x3F
+S:0xD7:0x07/0x3F
+S:0xD8:0x08/0x3F
+S:0xD9:0x09/0x3F
+S:0xDA:0x0A/0x3F
+S:0xDB:0x0B/0x3F
+S:0xDC:0x0C/0x3F
+S:0xDD:0x0D/0x3F
+S:0xDE:0x0E/0x3F
+S:0xDF:0x0F/0x3F
+
+# Potions (!)
+S:0xE0:0x00/0x21
+S:0xE1:0x01/0x21
+S:0xE2:0x02/0x21
+S:0xE3:0x03/0x21
+S:0xE4:0x04/0x21
+S:0xE5:0x05/0x21
+S:0xE6:0x06/0x21
+S:0xE7:0x07/0x21
+S:0xE8:0x08/0x21
+S:0xE9:0x09/0x21
+S:0xEA:0x0A/0x21
+S:0xEB:0x0B/0x21
+S:0xEC:0x0C/0x21
+S:0xED:0x0D/0x21
+S:0xEE:0x0E/0x21
+S:0xEF:0x0F/0x21
+
+# Food (,)
+S:0xF0:0x00/0x2C
+S:0xF1:0x01/0x2C
+S:0xF2:0x02/0x2C
+S:0xF3:0x03/0x2C
+S:0xF4:0x04/0x2C
+S:0xF5:0x05/0x2C
+S:0xF6:0x06/0x2C
+S:0xF7:0x07/0x2C
+S:0xF8:0x08/0x2C
+S:0xF9:0x09/0x2C
+S:0xFA:0x0A/0x2C
+S:0xFB:0x0B/0x2C
+S:0xFC:0x0C/0x2C
+S:0xFD:0x0D/0x2C
+S:0xFE:0x0E/0x2C
+S:0xFF:0x0F/0x2C
+
+
+
+##### Default inventory object colors #####
+
+
+# SKELETON
+E:1:0x01
+
+# BOTTLE
+E:2:0x01
+
+# FIRESTONE
+E:3:0x01
+
+# SPIKE
+E:5:0x02
+
+# CHEST
+E:7:0x02
+
+# JUNK
+E:11:0x01
+
+# BOOMERANG
+E:15:0x07
+
+# SHOT
+E:16:0x0F
+
+# ARROW
+E:17:0x0F
+
+# BOLT
+E:18:0x0F
+
+# BOW
+E:19:0x07
+
+# DIGGING
+E:20:0x02
+
+# HAFTED
+E:21:0x01
+
+# POLEARM
+E:22:0x01
+
+# SWORD
+E:23:0x01
+
+# AXE
+E:24:0x01
+
+# BOOTS
+E:30:0x0F
+
+# GLOVES
+E:31:0x0F
+
+# HELM
+E:32:0x0F
+
+# CROWN
+E:33:0x0F
+
+# SHIELD
+E:34:0x0F
+
+# CLOAK
+E:35:0x0F
+
+# SOFT_ARMOR
+E:36:0x02
+
+# HARD_ARMOR
+E:37:0x02
+
+# DRAG_ARMOR
+E:38:0x02
+
+# LITE
+E:39:0x0B
+
+# AMULET
+E:40:0x03
+
+# RING
+E:45:0x04
+
+# STAFF
+E:55:0x0F
+
+# WAND
+E:65:0x05
+
+# ROD
+E:66:0x0A
+
+# ROD TIP
+E:67:0x0A
+
+# SCROLL
+E:70:0x01
+
+# POTION
+E:71:0x0E
+
+# POTION2
+E:72:0x0E
+
+# FLASK
+E:77:0x0B
+
+# FOOD
+E:80:0x0F
+
+# BOOK
+E:111:0x0E
+
+# SYMBIOTIC_BOOK
+E:112:0x05
+
+# MUSIC_BOOK
+E:113:0x02
+
+# DRUID_BOOK
+E:114:0x0D
+
+# DAEMON BOOK
+E:115:0x03
+
+# POWER BATERIES
+E:4:0x0D
+
+# MAGE STAFFS
+E:6:0x0E
+
+# PARCHEMENT
+E:8:0x03
+
+# CORPSE
+E:9:0x0F
+
+# HYPNOS
+E:99:0x0F
+
+# RANDOM ARTIFACT
+E:102:0x0D
+
+# MUSICAL INSTRUMENT
+E:14:0x0A
+
+# EGG
+E:10:0x03
+
+# BASE RUNE
+E:104:0x0A
+
+# SECONDARY RUNE
+E:105:0x03
+
+# GOLD
+E:100:0x0B
+
+# TOOL
+E:12:0x0A
+
+# TRAPPING KIT
+E:46:0x08
+
+# TOTEM
+E:54:0x08
diff --git a/lib/mods/theme/pref/font.prf b/lib/mods/theme/pref/font.prf
new file mode 100644
index 00000000..505964bd
--- /dev/null
+++ b/lib/mods/theme/pref/font.prf
@@ -0,0 +1,60 @@
+# File: font.prf
+
+#
+# This file defines special attr/char mappings for use in "text" mode
+#
+# This file includes, if appropriate, various "sub-files"
+#
+# See "lib/help/command.txt" and "src/files.c" for more information.
+#
+
+
+## #
+## # OPTION: Display "veins" (white "%") as "normal walls" (white "#").
+## #
+## F:50:0x01/0x23
+## F:51:0x01/0x23
+## F:52:0x01/0x23
+## F:53:0x01/0x23
+
+
+##### Standard font file #####
+
+%:font-xxx.prf
+
+
+##### System Specific Subfiles #####
+
+?:[IOR [EQU $SYS xaw] [EQU $SYS x11] [EQU $SYS gtk]]
+%:font-x11.prf
+
+?:[EQU $SYS glu]
+%:font-glu.prf
+
+?:[EQU $SYS gcu]
+%:font-gcu.prf
+
+?:[EQU $SYS ami]
+%:font-ami.prf
+
+?:[EQU $SYS mac]
+%:font-mac.prf
+
+?:[EQU $SYS win]
+%:font-win.prf
+
+?:[EQU $SYS dos]
+%:font-dos.prf
+
+?:[EQU $SYS ibm]
+%:font-ibm.prf
+
+?:[EQU $SYS emx]
+%:font-emx.prf
+
+?:[EQU $SYS acn]
+%:font-acn.prf
+
+?:1
+
+
diff --git a/lib/mods/theme/pref/graf-ami.prf b/lib/mods/theme/pref/graf-ami.prf
new file mode 100644
index 00000000..d9b1b356
--- /dev/null
+++ b/lib/mods/theme/pref/graf-ami.prf
@@ -0,0 +1,64 @@
+# File: graf-ami.prf
+
+#
+# This file contains color definitions and
+# graphics remapping for the Amiga version.
+#
+# Lars Haugseth <larshau@ifi.uio.no>
+#
+
+
+# Color palette - Graphics
+V:0:0x01:0x00:0x00:0x00
+V:1:0x01:0xF0:0xE0:0xD0
+V:2:0x01:0x80:0x80:0x80
+V:3:0x01:0x50:0x50:0x50
+V:4:0x01:0xE0:0xB0:0x00
+V:5:0x01:0xC0:0xA0:0x70
+V:6:0x01:0x80:0x60:0x40
+V:7:0x01:0x40:0x30:0x20
+V:8:0x01:0x00:0xA0:0xF0
+V:9:0x01:0x00:0x00:0xF0
+V:10:0x01:0x00:0x00:0x70
+V:11:0x01:0xF0:0x00:0x00
+V:12:0x01:0x80:0x00:0x00
+V:13:0x01:0x90:0x00:0xB0
+V:14:0x01:0x00:0x60:0x10
+V:15:0x01:0x60:0xF0:0x40
+
+
+# Color palette - Text
+V:16:0x01:0x00:0x00:0x00
+V:17:0x01:0xFF:0xFF:0xFF
+V:18:0x01:0xC7:0xC7:0xC7
+V:19:0x01:0xFF:0x92:0x00
+V:20:0x01:0xFF:0x00:0x00
+V:21:0x01:0x00:0xCD:0x00
+V:22:0x01:0x00:0x00:0xFE
+V:23:0x01:0xC8:0x64:0x00
+V:24:0x01:0x8A:0x8A:0x8A
+V:25:0x01:0xE0:0xE0:0xE0
+V:26:0x01:0xA5:0x00:0xFF
+V:27:0x01:0xFF:0xFD:0x00
+V:28:0x01:0xFF:0x00:0xBC
+V:29:0x01:0x00:0xFF:0x00
+V:30:0x01:0x00:0xC8:0xFF
+V:31:0x01:0xFF:0xCC:0x80
+
+
+# Standard file
+%:graf-xxx.prf
+
+
+### Feature attr/char definitions
+
+# nothing
+F:0:0x01/0x20
+
+# open floor
+F:1:0x81/0x8E
+
+# invis trap
+F:2:0x81/0x8E
+
+
diff --git a/lib/mods/theme/pref/graf-dos.prf b/lib/mods/theme/pref/graf-dos.prf
new file mode 100644
index 00000000..41f38c76
--- /dev/null
+++ b/lib/mods/theme/pref/graf-dos.prf
@@ -0,0 +1,15 @@
+# File: graf-win.prf
+
+#
+# This file defines special attr/char mappings for use in "graphics" mode
+#
+# See "lib/help/command.txt" and "src/files.c" for more information.
+#
+
+# Standard file
+?:[EQU $GRAF old]
+%:graf-xxx.prf
+
+# New tiles
+?:[EQU $GRAF new]
+%:graf-new.prf
diff --git a/lib/mods/theme/pref/graf-ibm.prf b/lib/mods/theme/pref/graf-ibm.prf
new file mode 100644
index 00000000..eee54a13
--- /dev/null
+++ b/lib/mods/theme/pref/graf-ibm.prf
@@ -0,0 +1,6237 @@
+# File: graf-ibm.prf
+
+# This file defines special attr/char mappings for use in the pseudo
+# graphics mode using character generator font redefinitions. It can
+# also be used with X11/XAW/GTK ports by generating a bdf (then pcf)
+# file from lib/xtra/angband.fnt. How to do so is beyond the scope of
+# this file.
+#
+# See "lib/help/command.txt" and "src/files.c" for more information.
+#
+
+
+##### Special attr/char values #####
+
+## # Unused
+## S:0x00:0x00/0x40
+## S:0x01:0x01/0x40
+## S:0x02:0x02/0x40
+## S:0x03:0x03/0x40
+## S:0x04:0x04/0x40
+## S:0x05:0x05/0x40
+## S:0x06:0x06/0x40
+## S:0x07:0x07/0x40
+## S:0x08:0x08/0x40
+## S:0x09:0x09/0x40
+## S:0x0A:0x0A/0x40
+## S:0x0B:0x0B/0x40
+## S:0x0C:0x0C/0x40
+## S:0x0D:0x0D/0x40
+## S:0x0E:0x0E/0x40
+## S:0x0F:0x0F/0x40
+
+## # Unused
+## S:0x10:0x00/0x40
+## S:0x11:0x01/0x40
+## S:0x12:0x02/0x40
+## S:0x13:0x03/0x40
+## S:0x14:0x04/0x40
+## S:0x15:0x05/0x40
+## S:0x16:0x06/0x40
+## S:0x17:0x07/0x40
+## S:0x18:0x08/0x40
+## S:0x19:0x09/0x40
+## S:0x1A:0x0A/0x40
+## S:0x1B:0x0B/0x40
+## S:0x1C:0x0C/0x40
+## S:0x1D:0x0D/0x40
+## S:0x1E:0x0E/0x40
+## S:0x1F:0x0F/0x40
+
+## # Unused
+## S:0x20:0x00/0x40
+## S:0x21:0x01/0x40
+## S:0x22:0x02/0x40
+## S:0x23:0x03/0x40
+## S:0x24:0x04/0x40
+## S:0x25:0x05/0x40
+## S:0x26:0x06/0x40
+## S:0x27:0x07/0x40
+## S:0x28:0x08/0x40
+## S:0x29:0x09/0x40
+## S:0x2A:0x0A/0x40
+## S:0x2B:0x0B/0x40
+## S:0x2C:0x0C/0x40
+## S:0x2D:0x0D/0x40
+## S:0x2E:0x0E/0x40
+## S:0x2F:0x0F/0x40
+
+# Spells (*)
+S:0x30:0x00/0x2A
+S:0x31:0x01/0x2A
+S:0x32:0x02/0x2A
+S:0x33:0x03/0x2A
+S:0x34:0x04/0x2A
+S:0x35:0x05/0x2A
+S:0x36:0x06/0x2A
+S:0x37:0x07/0x2A
+S:0x38:0x08/0x2A
+S:0x39:0x09/0x2A
+S:0x3A:0x0A/0x2A
+S:0x3B:0x0B/0x2A
+S:0x3C:0x0C/0x2A
+S:0x3D:0x0D/0x2A
+S:0x3E:0x0E/0x2A
+S:0x3F:0x0F/0x2A
+
+# Spells (|)
+S:0x40:0x00/0x7C
+S:0x41:0x01/0x7C
+S:0x42:0x02/0x7C
+S:0x43:0x03/0x7C
+S:0x44:0x04/0x7C
+S:0x45:0x05/0x7C
+S:0x46:0x06/0x7C
+S:0x47:0x07/0x7C
+S:0x48:0x08/0x7C
+S:0x49:0x09/0x7C
+S:0x4A:0x0A/0x7C
+S:0x4B:0x0B/0x7C
+S:0x4C:0x0C/0x7C
+S:0x4D:0x0D/0x7C
+S:0x4E:0x0E/0x7C
+S:0x4F:0x0F/0x7C
+
+# Spells (-)
+S:0x50:0x00/0x2D
+S:0x51:0x01/0x2D
+S:0x52:0x02/0x2D
+S:0x53:0x03/0x2D
+S:0x54:0x04/0x2D
+S:0x55:0x05/0x2D
+S:0x56:0x06/0x2D
+S:0x57:0x07/0x2D
+S:0x58:0x08/0x2D
+S:0x59:0x09/0x2D
+S:0x5A:0x0A/0x2D
+S:0x5B:0x0B/0x2D
+S:0x5C:0x0C/0x2D
+S:0x5D:0x0D/0x2D
+S:0x5E:0x0E/0x2D
+S:0x5F:0x0F/0x2D
+
+# Spells (/)
+S:0x60:0x00/0x2F
+S:0x61:0x01/0x2F
+S:0x62:0x02/0x2F
+S:0x63:0x03/0x2F
+S:0x64:0x04/0x2F
+S:0x65:0x05/0x2F
+S:0x66:0x06/0x2F
+S:0x67:0x07/0x2F
+S:0x68:0x08/0x2F
+S:0x69:0x09/0x2F
+S:0x6A:0x0A/0x2F
+S:0x6B:0x0B/0x2F
+S:0x6C:0x0C/0x2F
+S:0x6D:0x0D/0x2F
+S:0x6E:0x0E/0x2F
+S:0x6F:0x0F/0x2F
+
+# Spells (\)
+S:0x70:0x00/0x5C
+S:0x71:0x01/0x5C
+S:0x72:0x02/0x5C
+S:0x73:0x03/0x5C
+S:0x74:0x04/0x5C
+S:0x75:0x05/0x5C
+S:0x76:0x06/0x5C
+S:0x77:0x07/0x5C
+S:0x78:0x08/0x5C
+S:0x79:0x09/0x5C
+S:0x7A:0x0A/0x5C
+S:0x7B:0x0B/0x5C
+S:0x7C:0x0C/0x5C
+S:0x7D:0x0D/0x5C
+S:0x7E:0x0E/0x5C
+S:0x7F:0x0F/0x5C
+
+# Amulets
+S:0x80:0x00/0xE7
+S:0x81:0x01/0xE7
+S:0x82:0x02/0xE7
+S:0x83:0x03/0xE7
+S:0x84:0x04/0xE7
+S:0x85:0x05/0xE7
+S:0x86:0x06/0xE7
+S:0x87:0x07/0xE7
+S:0x88:0x08/0xE7
+S:0x89:0x09/0xE7
+S:0x8A:0x0A/0xE7
+S:0x8B:0x0B/0xE7
+S:0x8C:0x0C/0xE7
+S:0x8D:0x0D/0xE7
+S:0x8E:0x0E/0xE7
+S:0x8F:0x0F/0xE7
+
+# Rings
+S:0x90:0x00/0xE8
+S:0x91:0x01/0xE8
+S:0x92:0x02/0xE8
+S:0x93:0x03/0xE8
+S:0x94:0x04/0xE8
+S:0x95:0x05/0xE8
+S:0x96:0x06/0xE8
+S:0x97:0x07/0xE8
+S:0x98:0x08/0xE8
+S:0x99:0x09/0xE8
+S:0x9A:0x0A/0xE8
+S:0x9B:0x0B/0xE8
+S:0x9C:0x0C/0xE8
+S:0x9D:0x0D/0xE8
+S:0x9E:0x0E/0xE8
+S:0x9F:0x0F/0xE8
+
+# Staffs
+S:0xA0:0x00/0xE9
+S:0xA1:0x01/0xE9
+S:0xA2:0x02/0xE9
+S:0xA3:0x03/0xE9
+S:0xA4:0x04/0xE9
+S:0xA5:0x05/0xE9
+S:0xA6:0x06/0xE9
+S:0xA7:0x07/0xE9
+S:0xA8:0x08/0xE9
+S:0xA9:0x09/0xE9
+S:0xAA:0x0A/0xE9
+S:0xAB:0x0B/0xE9
+S:0xAC:0x0C/0xE9
+S:0xAD:0x0D/0xE9
+S:0xAE:0x0E/0xE9
+S:0xAF:0x0F/0xE9
+
+# Wands
+S:0xB0:0x00/0xEA
+S:0xB1:0x01/0xEA
+S:0xB2:0x02/0xEA
+S:0xB3:0x03/0xEA
+S:0xB4:0x04/0xEA
+S:0xB5:0x05/0xEA
+S:0xB6:0x06/0xEA
+S:0xB7:0x07/0xEA
+S:0xB8:0x08/0xEA
+S:0xB9:0x09/0xEA
+S:0xBA:0x0A/0xEA
+S:0xBB:0x0B/0xEA
+S:0xBC:0x0C/0xEA
+S:0xBD:0x0D/0xEA
+S:0xBE:0x0E/0xEA
+S:0xBF:0x0F/0xEA
+
+# Rods
+S:0xC0:0x00/0xEB
+S:0xC1:0x01/0xEB
+S:0xC2:0x02/0xEB
+S:0xC3:0x03/0xEB
+S:0xC4:0x04/0xEB
+S:0xC5:0x05/0xEB
+S:0xC6:0x06/0xEB
+S:0xC7:0x07/0xEB
+S:0xC8:0x08/0xEB
+S:0xC9:0x09/0xEB
+S:0xCA:0x0A/0xEB
+S:0xCB:0x0B/0xEB
+S:0xCC:0x0C/0xEB
+S:0xCD:0x0D/0xEB
+S:0xCE:0x0E/0xEB
+S:0xCF:0x0F/0xEB
+
+# Scrolls
+S:0xD0:0x00/0xEC
+S:0xD1:0x01/0xEC
+S:0xD2:0x02/0xEC
+S:0xD3:0x03/0xEC
+S:0xD4:0x04/0xEC
+S:0xD5:0x05/0xEC
+S:0xD6:0x06/0xEC
+S:0xD7:0x07/0xEC
+S:0xD8:0x08/0xEC
+S:0xD9:0x09/0xEC
+S:0xDA:0x0A/0xEC
+S:0xDB:0x0B/0xEC
+S:0xDC:0x0C/0xEC
+S:0xDD:0x0D/0xEC
+S:0xDE:0x0E/0xEC
+S:0xDF:0x0F/0xEC
+
+# Potions
+S:0xE0:0x00/0xED
+S:0xE1:0x01/0xED
+S:0xE2:0x02/0xED
+S:0xE3:0x03/0xED
+S:0xE4:0x04/0xED
+S:0xE5:0x05/0xED
+S:0xE6:0x06/0xED
+S:0xE7:0x07/0xED
+S:0xE8:0x08/0xED
+S:0xE9:0x09/0xED
+S:0xEA:0x0A/0xED
+S:0xEB:0x0B/0xED
+S:0xEC:0x0C/0xED
+S:0xED:0x0D/0xED
+S:0xEE:0x0E/0xED
+S:0xEF:0x0F/0xED
+
+# Food
+S:0xF0:0x00/0xEE
+S:0xF1:0x01/0xEE
+S:0xF2:0x02/0xEE
+S:0xF3:0x03/0xEE
+S:0xF4:0x04/0xEE
+S:0xF5:0x05/0xEE
+S:0xF6:0x06/0xEE
+S:0xF7:0x07/0xEE
+S:0xF8:0x08/0xEE
+S:0xF9:0x09/0xEE
+S:0xFA:0x0A/0xEE
+S:0xFB:0x0B/0xEE
+S:0xFC:0x0C/0xEE
+S:0xFD:0x0D/0xEE
+S:0xFE:0x0E/0xEE
+S:0xFF:0x0F/0xEE
+
+
+##### Feature attr/char definitions #####
+
+# nothing
+# F:0:0x01/0x20
+
+# open floor
+F:1:0x01/0xB5
+
+# fountain
+F:2:0x0E/0xC8
+
+# glyph of warding
+F:3:0x0B/0xC6
+
+# open door
+F:4:0x0F/0xB9
+
+# broken door
+F:5:0x0F/0xBA
+
+# up staircase
+F:6:0x01/0xB6
+
+# down staircase
+F:7:0x01/0xB7
+
+# quest entrance
+F:8:0x0B/0xB7
+
+# quest exit
+F:9:0x0B/0xB6
+
+# quest down level
+F:10:0x04/0xB7
+
+# quest up level
+F:11:0x04/0xB6
+
+# town exit
+F:12:0x05/0xB7
+
+# shaft down
+F:13:0x0F/0xB7
+
+# shaft up
+F:14:0x0F/0xB6
+
+# fountain
+F:15:0x08/0xC8
+
+# web
+F:16:0x0B/0xCA
+
+# trap
+F:17:0x01/0xC7
+
+# door
+F:32:0x0F/0xB8
+
+# locked door
+F:33:0x0F/0xB8
+
+# locked door
+F:34:0x0F/0xB8
+
+# locked door
+F:35:0x0F/0xB8
+
+# locked door
+F:36:0x0F/0xB8
+
+# locked door
+F:37:0x0F/0xB8
+
+# locked door
+F:38:0x0F/0xB8
+
+# locked door
+F:39:0x0F/0xB8
+
+# jammed door
+F:40:0x0F/0xB8
+
+# jammed door
+F:41:0x0F/0xB8
+
+# jammed door
+F:42:0x0F/0xB8
+
+# jammed door
+F:43:0x0F/0xB8
+
+# jammed door
+F:44:0x0F/0xB8
+
+# jammed door
+F:45:0x0F/0xB8
+
+# jammed door
+F:46:0x0F/0xB8
+
+# jammed door
+F:47:0x0F/0xB8
+
+# secret door
+F:48:0x02/0xBC
+
+# pile of rubble
+F:49:0x02/0xBB
+
+# magma vein
+F:50:0x01/0xBC
+
+# quartz vein
+F:51:0x09/0xBC
+
+# magma vein
+F:52:0x01/0xBC
+
+# quartz vein
+F:53:0x09/0xBC
+
+# magma vein with treasure
+F:54:0x03/0xBC
+
+# quartz vein with treasure
+F:55:0x03/0xBC
+
+# granite wall
+F:56:0x02/0xBC
+
+# granite wall
+F:57:0x02/0xBC
+
+# granite wall
+F:58:0x02/0xBC
+
+# granite wall
+F:59:0x02/0xBC
+
+# permanent wall
+F:60:0x02/0xBC
+
+# permanent wall
+F:61:0x02/0xBC
+
+# permanent wall
+F:62:0x02/0xBC
+
+# permanent wall
+F:63:0x02/0xBC
+
+# explosive rune
+F:64:0x0C/0xC6
+
+# Straight Road startpoint
+F:65:0x01/0xCA
+
+# section of the Straight Road
+F:66:0x0E/0xCA
+
+# section of the Straight Road
+F:67:0x06/0xCA
+
+# section of the Straight Road
+F:68:0x0E/0xCA
+
+# section of the Straight Road
+F:69:0x06/0xCA
+
+# section of the Straight Road
+F:70:0x09/0xCA
+
+# section of the Straight Road (discharged)
+F:71:0x09/0xCA
+
+# Straight Road exit
+F:72:0x01/0xCA
+
+# corrupted section of the Straight Road
+F:73:0x08/0xCA
+
+# Building
+F:74:0x0F/0xC5
+
+# permanent wall
+F:75:0x02/0xBC
+
+# permanent wall
+F:76:0x02/0xBC
+
+# permanent wall
+F:77:0x02/0xBC
+
+# permanent wall
+F:78:0x02/0xBC
+
+# stream of shallow water
+F:84:0x0E/0xCB
+
+# pool of deep lava
+F:85:0x04/0xCB
+
+# stream of shallow lava
+F:86:0x0C/0xCB
+
+# dark pit
+F:87:0x08/0xD0
+
+# dirt
+F:88:0x07/0xB5
+
+# patch of grass
+F:89:0x0D/0xC9
+
+# ice
+F:90:0x01/0xD0
+
+# sand
+F:91:0x0F/0xB5
+
+# dead tree
+F:92:0x08/0xCC
+
+# ash
+F:93:0x02/0xB5
+
+# mud
+F:94:0x07/0xB5
+
+# ice wall
+F:95:0x01/0xCF
+
+# tree
+F:96:0x05/0xCC
+
+# mountain chain
+F:97:0x02/0xCE
+
+# sandwall
+F:98:0x0F/0xCF
+
+# sandwall
+F:99:0x0F/0xCF
+
+# sandwall with treasure
+F:100:0x03/0xCF
+
+# high mountain chain
+F:101:0x01/0xCE
+
+# nether mist
+F:102:0x0A/0xCA
+
+# Void Jumpgate
+F:160:0x0A/0xB9
+
+# Altar of Being
+F:161:0x09/0xD1
+
+# Altar of Winds
+F:162:0x0E/0xD1
+
+# Altar of Force
+F:163:0x0C/0xD1
+
+# Altar of Darkness
+F:164:0x08/0xD1
+
+# Altar of Nature
+# F:165:0x05/0x30
+
+# floor
+F:172:0x01/0xB5
+
+# Underground Tunnel
+F:173:0x02/0xB9
+
+# stream of tainted water
+F:174:0x0A/0xCB
+
+# monster trap
+F:175:0x0A/0xC6
+
+# Void Jumpgate
+F:176:0x0A/0xB9
+
+# lava wall
+F:177:0x0C/0xBC
+
+# Great Fire
+F:178:0x0C/0xCB
+
+# path to the next area
+F:179:0x01/0xB7
+
+# path to the previous area
+F:180:0x01/0xB6
+
+# field
+F:181:0x05/0xB5
+
+# Ekkaia, the Encircling Sea
+F:182:0x06/0xCB
+
+# pool of deep water
+F:187:0x06/0xCB
+
+# glass wall
+F:188:0x0E/0xD0
+
+# illusion wall
+F:189:0x02/0xBC
+
+# Grass roof
+F:190:0x0F/0xCA
+
+# grass roof top
+F:191:0x0F/0xCA
+
+# grass roof chimney
+F:192:0x0F/0xCA
+
+# brick roof
+F:193:0x04/0xCF
+
+# brick roof top
+F:194:0x04/0xCF
+
+# brick roof chimney
+F:195:0x04/0xCF
+
+# window
+F:196:0x01/0x4F
+
+# small window
+F:197:0x01/0x6F
+
+# rain barrel
+F:198:0x02/0xBC
+
+# grass with flowers
+F:199:0x04/0xC9
+
+# cobblestone road
+F:200:0x02/0xB5
+
+# cobblestone with outlet
+F:201:0x02/0xB5
+
+# small tree
+F:202:0x0D/0xCD
+
+# town
+F:203:0x01/0xC5
+
+# Underground Tunnel
+F:204:0x02/0xB9
+
+# a blazing fire
+F:205:0x0C/0xCB
+
+# pile of rubble
+F:206:0x02/0xBB
+
+# rocky ground
+F:207:0x02/0xB5
+
+# cloud-like vapour
+F:208:0x09/0xCA
+
+# condensing water
+F:209:0x0E/0xCB
+
+# dense mist
+F:210:0x01/0xCA
+
+# hail-stone wall
+F:211:0x09/0xBC
+
+
+##### Building attr/char definitions #####
+
+# General Store
+B:0:0x0F/0xBD
+
+# Armoury
+B:1:0x02/0xBE
+
+# Weaponsmith
+B:2:0x01/0xBF
+
+# Temple
+B:3:0x05/0xC0
+
+# Alchemy shop
+B:4:0x06/0xC1
+
+# Magic shop
+B:5:0x04/0xC4
+
+# Black Market
+B:6:0x08/0xC3
+
+# Home
+B:7:0x0B/0xB8
+
+# Book Store
+B:8:0x03/0xC2
+
+# Pet Shop
+B:9:0x06/0xB8
+
+# Mayor's Office
+B:10:0x03/0xB8
+
+# Inn
+B:11:0x01/0xB8
+
+# The Soothsayer
+B:12:0x0E/0xB8
+
+# Library
+B:13:0x0F/0xC2
+
+# Castle
+B:14:0x03/0xB8
+
+# Casino
+B:15:0x02/0xB8
+
+# Beastmaster Shanty
+B:16:0x05/0xB8
+
+# Fighters Hall
+B:17:0x02/0xB8
+
+# Tower of Magery
+B:18:0x06/0xB8
+
+# Inner Temple
+B:19:0x0D/0xC0
+
+# Paladins Guild
+B:20:0x05/0xB8
+
+# Rangers Guild
+B:21:0x07/0xB8
+
+# Thunderlords' Nest
+B:22:0x0F/0xB8
+
+# The Mirror
+B:23:0x0F/0xB8
+
+# Seat of Ruling
+B:24:0x0F/0xCC
+
+# Wizards Spire
+B:25:0x0F/0xB8
+
+# Priests Circle
+B:26:0x03/0xB8
+
+# Tower of the King
+B:27:0x0F/0xB8
+
+# Library
+B:28:0x0F/0xC2
+
+# The White Tree
+B:29:0x01/0xCC
+
+# Craftsmaster
+B:30:0x02/0xB8
+
+# Earth-Dome (Nature)
+B:31:0x0F/0xB8
+
+# Minstrels Haven
+B:32:0x0F/0xB8
+
+# Star-Dome
+B:33:0x0F/0xB8
+
+# Valarin Temple
+B:34:0x0F/0xC0
+
+# Sea-Dome
+B:35:0x0F/0xB8
+
+# The Golden Flower
+B:36:0x0F/0xB8
+
+# The Fountain
+B:37:0x0F/0xC8
+
+# Axe Smith
+B:38:0x01/0xBF
+
+# Hafted Smith
+B:39:0x01/0xBF
+
+# Polearm Smith
+B:40:0x01/0xBF
+
+# Sword Smith
+B:41:0x01/0xBF
+
+# Rare Jewelry Shop
+B:42:0x0A/0xC4
+
+# Jewelry Shop
+B:43:0x0B/0xC4
+
+# Footwear Shop
+B:44:0x04/0xBE
+
+# Rare Footwear Shop
+B:45:0x04/0xBE
+
+# Library
+B:46:0x0B/0xC2
+
+# Forbidden Library
+B:47:0x0A/0xC2
+
+# Expensive Black Market
+B:48:0x0A/0xC3
+
+# Common Shop
+B:49:0x0F/0xBD
+
+# Dragon Hunter
+B:50:0x0A/0xBE
+
+# Speed Ring Market
+B:51:0x0D/0xC4
+
+# Scribe
+B:52:0x0E/0xC1
+
+# Potion Store
+B:53:0x0E/0xC1
+
+# Recaller
+B:54:0x06/0xB8
+
+# Master Archer
+B:55:0x05/0xBF
+
+# Merchants Guild
+B:56:0x05/0xB8
+
+# The Mathom-house
+B:57:0x05/0xB8
+
+# The Prancing Pony
+B:58:0x01/0xB8
+
+# Mining Supply store
+B:59:0x02/0xB8
+
+
+##### Object attr/char definitions #####
+
+# something
+# K:0:0x01/0x26
+
+# Blindness
+K:1:0x00/0xEE
+
+# Paranoia
+K:2:0x00/0xEE
+
+# Confusion
+K:3:0x00/0xEE
+
+# Hallucination
+K:4:0x00/0xEE
+
+# Cure Poison
+K:5:0x00/0xEE
+
+# Cure Blindness
+K:6:0x00/0xEE
+
+# Cure Paranoia
+K:7:0x00/0xEE
+
+# Cure Confusion
+K:8:0x00/0xEE
+
+# Weakness
+K:9:0x00/0xEE
+
+# Unhealth
+K:10:0x00/0xEE
+
+# Restore Constitution
+K:11:0x00/0xEE
+
+# Restoring
+K:12:0x00/0xEE
+
+# Stupidity
+K:13:0x00/0xEE
+
+# Naivety
+K:14:0x00/0xEE
+
+# Poison
+K:15:0x00/0xEE
+
+# Sickness
+K:16:0x00/0xEE
+
+# Paralysis
+K:17:0x00/0xEE
+
+# Restore Strength
+K:18:0x00/0xEE
+
+# Disease
+K:19:0x00/0xEE
+
+# Cure Serious Wounds
+K:20:0x00/0xEE
+
+# & Ration~ of Food
+K:21:0x0F/0xF2
+
+# & Hard Biscuit~
+K:22:0x0F/0xF2
+
+# & Strip~ of Venison
+K:23:0x07/0xF2
+
+# & Slime Mold~
+K:24:0x05/0xF2
+
+# & Lembas~
+K:25:0x0E/0xF2
+
+# & Pint~ of Fine Ale
+K:26:0x0B/0xED
+
+# & Pint~ of Fine Wine
+K:27:0x04/0xED
+
+# & Mattock~
+K:28:0x08/0xD9
+
+# & Blue Stone~
+K:29:0x0E/0xE7
+
+# & Broken Dagger~
+K:30:0x08/0xDC
+
+# & Bastard Sword~
+K:31:0x09/0xDC
+
+# & Scimitar~
+K:32:0x09/0xDC
+
+# & Tulwar~
+K:33:0x09/0xDC
+
+# & Broad Sword~
+K:34:0x09/0xDC
+
+# & Short Sword~
+K:35:0x09/0xDC
+
+# & Blade~ of Chaos
+K:36:0x0A/0xDC
+
+# & Two-Handed Sword~
+K:37:0x09/0xDC
+
+# & Main Gauche~
+K:38:0x09/0xDC
+
+# & Cutlass~
+K:39:0x09/0xDC
+
+# & Executioner's Sword~
+K:40:0x04/0xDC
+
+# & Katana~
+K:41:0x09/0xDC
+
+# & Long Sword~
+K:42:0x09/0xDC
+
+# & Dagger~
+K:43:0x09/0xDC
+
+# & Rapier~
+K:44:0x09/0xDC
+
+# & Sabre~
+K:45:0x09/0xDC
+
+# & Small Sword~
+K:46:0x09/0xDC
+
+# & Broken Sword~
+K:47:0x08/0xDC
+
+# & Ball-and-Chain~
+K:48:0x08/0xDA
+
+# & Whip~
+K:49:0x08/0xDA
+
+# & Flail~
+K:50:0x08/0xDA
+
+# & Two-Handed Flail~
+K:51:0x0B/0xDA
+
+# & Morning Star~
+K:52:0x08/0xDA
+
+# & Mace~
+K:53:0x08/0xDA
+
+# & Quarterstaff~
+K:54:0x0F/0xDA
+
+# & War Hammer~
+K:55:0x08/0xDA
+
+# & Lead-Filled Mace~
+K:56:0x08/0xDA
+
+# & Mace~ of Disruption
+K:57:0x0A/0xDA
+
+# & Lucerne Hammer~
+K:58:0x0E/0xDA
+
+# & Beaked Axe~
+K:59:0x02/0xDB
+
+# & Glaive~
+K:60:0x02/0xDB
+
+# & Halberd~
+K:61:0x02/0xDB
+
+# & Awl-Pike~
+K:62:0x02/0xDB
+
+# & Pike~
+K:63:0x02/0xDB
+
+# & Spear~
+K:64:0x02/0xDB
+
+# & Trident~
+K:65:0x0B/0xDB
+
+# & Lance~
+K:66:0x02/0xDB
+
+# & Great Axe~
+K:67:0x02/0xDB
+
+# & Battle Axe~
+K:68:0x02/0xDB
+
+# & Lochaber Axe~
+K:69:0x08/0xDB
+
+# & Broad Axe~
+K:70:0x02/0xDB
+
+# & Scythe~
+K:71:0x02/0xDB
+
+# & Scythe~ of Slicing
+K:72:0x04/0xDB
+
+# & Short Bow~
+K:73:0x0F/0xD8
+
+# & Long Bow~
+K:74:0x0F/0xD8
+
+# & Light Crossbow~
+K:75:0x02/0xD8
+
+# & Heavy Crossbow~
+K:76:0x02/0xD8
+
+# & Sling~
+K:77:0x07/0xD8
+
+# & Arrow~
+K:78:0x0F/0xD7
+
+# & Seeker Arrow~
+K:79:0x0D/0xD7
+
+# & Bolt~
+K:80:0x02/0xD7
+
+# & Seeker Bolt~
+K:81:0x0E/0xD7
+
+# & Rounded Pebble~
+K:82:0x02/0xD6
+
+# & Iron Shot~
+K:83:0x02/0xD6
+
+# & Shovel~
+K:84:0x02/0xD9
+
+# & Gnomish Shovel~
+K:85:0x0D/0xD9
+
+# & Dwarven Shovel~
+K:86:0x0E/0xD9
+
+# & Pick~
+K:87:0x02/0xD9
+
+# & Orcish Pick~
+K:88:0x05/0xD9
+
+# & Dwarven Pick~
+K:89:0x06/0xD9
+
+# & Elven Cloak~
+K:90:0x0D/0xE2
+
+# & Pair~ of Soft Leather Boots
+K:91:0x0F/0xDD
+
+# & Pair~ of Hard Leather Boots
+K:92:0x0F/0xDD
+
+# & Pair~ of Metal Shod Boots
+K:93:0x02/0xDD
+
+# & Hard Leather Cap~
+K:94:0x07/0xDF
+
+# & Metal Cap~
+K:95:0x02/0xDF
+
+# & Iron Helm~
+K:96:0x02/0xDF
+
+# & Steel Helm~
+K:97:0x09/0xDF
+
+# & Iron Crown~
+K:98:0x02/0xE0
+
+# & Golden Crown~
+K:99:0x0B/0xE0
+
+# & Jewel Encrusted Crown~
+K:100:0x0A/0xE0
+
+# & Robe~
+K:101:0x06/0xE3
+
+# & Filthy Rag~
+K:102:0x08/0xE3
+
+# Soft Leather Armour~
+K:103:0x0F/0xE3
+
+# Soft Studded Leather~
+K:104:0x0F/0xE3
+
+# Hard Leather Armour~
+K:105:0x0F/0xE3
+
+# Hard Studded Leather~
+K:106:0x0F/0xE3
+
+# Leather Scale Mail~
+K:107:0x0F/0xE3
+
+# Metal Scale Mail~
+K:108:0x02/0xE4
+
+# Chain Mail~
+K:109:0x02/0xE4
+
+# Rusty Chain Mail~
+K:110:0x04/0xE4
+
+# Augmented Chain Mail~
+K:111:0x02/0xE4
+
+# Bar Chain Mail~
+K:112:0x02/0xE4
+
+# Metal Brigandine Armour~
+K:113:0x02/0xE4
+
+# Partial Plate Armour~
+K:114:0x09/0xE4
+
+# Metal Lamellar Armour~
+K:115:0x09/0xE4
+
+# Full Plate Armour~
+K:116:0x09/0xE4
+
+# Ribbed Plate Armour~
+K:117:0x09/0xE4
+
+# Adamantite Plate Mail~
+K:118:0x0D/0xE4
+
+# Mithril Plate Mail~
+K:119:0x0E/0xE4
+
+# Mithril Chain Mail~
+K:120:0x0E/0xE4
+
+# Double Chain Mail~
+K:121:0x02/0xE4
+
+# & Shield~ of Deflection
+K:122:0x0E/0xE1
+
+# & Cloak~
+K:123:0x05/0xE2
+
+# & Shadow Cloak~
+K:124:0x08/0xE2
+
+# & Set~ of Leather Gloves
+K:125:0x0F/0xDE
+
+# & Set~ of Gauntlets
+K:126:0x0F/0xDE
+
+# & Set~ of Cesti
+K:127:0x09/0xDE
+
+# & Small Leather Shield~
+K:128:0x0F/0xE1
+
+# & Large Leather Shield~
+K:129:0x0F/0xE1
+
+# & Small Metal Shield~
+K:130:0x02/0xE1
+
+# & Large Metal Shield~
+K:131:0x02/0xE1
+
+# Strength
+K:132:0x00/0xE8
+
+# Dexterity
+K:133:0x00/0xE8
+
+# Constitution
+K:134:0x00/0xE8
+
+# Intelligence
+K:135:0x00/0xE8
+
+# Speed
+K:136:0x00/0xE8
+
+# Searching
+K:137:0x00/0xE8
+
+# Teleportation
+K:138:0x00/0xE8
+
+# Slow Digestion
+K:139:0x00/0xE8
+
+# Fire Resistance
+K:140:0x00/0xE8
+
+# Cold Resistance
+K:141:0x00/0xE8
+
+# Levitation
+K:142:0x00/0xE8
+
+# Poison Resistance
+K:143:0x00/0xE8
+
+# Free Action
+K:144:0x00/0xE8
+
+# Weakness
+K:145:0x00/0xE8
+
+# Flames
+K:146:0x00/0xE8
+
+# Acid
+K:147:0x00/0xE8
+
+# Ice
+K:148:0x00/0xE8
+
+# Woe
+K:149:0x00/0xE8
+
+# Stupidity
+K:150:0x00/0xE8
+
+# Damage
+K:151:0x00/0xE8
+
+# Accuracy
+K:152:0x00/0xE8
+
+# Protection
+K:153:0x00/0xE8
+
+# Aggravate Monster
+K:154:0x00/0xE8
+
+# See Invisible
+K:155:0x00/0xE8
+
+# Sustain Strength
+K:156:0x00/0xE8
+
+# Sustain Intelligence
+K:157:0x00/0xE8
+
+# Sustain Wisdom
+K:158:0x00/0xE8
+
+# Sustain Constitution
+K:159:0x00/0xE8
+
+# Sustain Dexterity
+K:160:0x00/0xE8
+
+# Sustain Charisma
+K:161:0x00/0xE8
+
+# Slaying
+K:162:0x00/0xE8
+
+# Brilliance
+K:163:0x00/0xE7
+
+# Charisma
+K:164:0x00/0xE7
+
+# Searching
+K:165:0x00/0xE7
+
+# Teleportation
+K:166:0x00/0xE7
+
+# Slow Digestion
+K:167:0x00/0xE7
+
+# Acid Resistance
+K:168:0x00/0xE7
+
+# Adornment
+K:169:0x00/0xE7
+
+# Double Ring Mail~
+K:170:0x02/0xE4
+
+# the Magi
+K:171:0x00/0xE7
+
+# Doom
+K:172:0x00/0xE7
+
+# Enchant Weapon To-Hit
+K:173:0x00/0xEC
+
+# Enchant Weapon To-Dam
+K:174:0x00/0xEC
+
+# Enchant Armor
+K:175:0x00/0xEC
+
+# Identify
+K:176:0x00/0xEC
+
+# *Identify*
+K:177:0x00/0xEC
+
+# Rumour
+K:178:0x00/0xEC
+
+# Chaos
+K:179:0x00/0xEC
+
+# Remove Curse
+K:180:0x00/0xEC
+
+# Light
+K:181:0x00/0xEC
+
+# Fire
+K:182:0x00/0xEC
+
+# Ice
+K:183:0x00/0xEC
+
+# Summon Monster
+K:184:0x00/0xEC
+
+# Phase Door
+K:185:0x00/0xEC
+
+# Teleportation
+K:186:0x00/0xEC
+
+# Teleport Level
+K:187:0x00/0xEC
+
+# Monster Confusion
+K:188:0x00/0xEC
+
+# Magic Mapping
+K:189:0x00/0xEC
+
+# Rune of Protection
+K:190:0x00/0xEC
+
+# *Remove Curse*
+K:191:0x00/0xEC
+
+# Treasure Detection
+K:192:0x00/0xEC
+
+# Object Detection
+K:193:0x00/0xEC
+
+# Trap Detection
+K:194:0x00/0xEC
+
+# & Sheaf Arrow~
+K:195:0x03/0xD7
+
+# & Mithril Shot~
+K:196:0x0E/0xD6
+
+# Door/Stair Location
+K:197:0x00/0xEC
+
+# Acquirement
+K:198:0x00/0xEC
+
+# *Acquirement*
+K:199:0x00/0xEC
+
+# Mass Genocide
+K:200:0x00/0xEC
+
+# Detect Invisible
+K:201:0x00/0xEC
+
+# Aggravate Monster
+K:202:0x00/0xEC
+
+# Trap Creation
+K:203:0x00/0xEC
+
+# Trap/Door Destruction
+K:204:0x00/0xEC
+
+# Artifact Creation
+K:205:0x00/0xEC
+
+# Recharging
+K:206:0x00/0xEC
+
+# Genocide
+K:207:0x00/0xEC
+
+# Darkness
+K:208:0x00/0xEC
+
+# Protection from Evil
+K:209:0x00/0xEC
+
+# Satisfy Hunger
+K:210:0x00/0xEC
+
+# Dispel Undead
+K:211:0x00/0xEC
+
+# *Enchant Weapon*
+K:212:0x00/0xEC
+
+# Curse Weapon
+K:213:0x00/0xEC
+
+# *Enchant Armor*
+K:214:0x00/0xEC
+
+# Curse Armor
+K:215:0x00/0xEC
+
+# Summon Undead
+K:216:0x00/0xEC
+
+# Blessing
+K:217:0x00/0xEC
+
+# Holy Chant
+K:218:0x00/0xEC
+
+# Holy Prayer
+K:219:0x00/0xEC
+
+# Word of Recall
+K:220:0x00/0xEC
+
+# *Destruction*
+K:221:0x00/0xEC
+
+# Slime Mold Juice
+K:222:0x00/0xED
+
+# Apple Juice
+K:223:0x00/0xED
+
+# Water
+K:224:0x00/0xED
+
+# Strength
+K:225:0x00/0xED
+
+# Weakness
+K:226:0x00/0xED
+
+# Restore Strength
+K:227:0x00/0xED
+
+# Intelligence
+K:228:0x00/0xED
+
+# Stupidity
+K:229:0x00/0xED
+
+# Restore Intelligence
+K:230:0x00/0xED
+
+# Wisdom
+K:231:0x00/0xED
+
+# Naivety
+K:232:0x00/0xED
+
+# Restore Wisdom
+K:233:0x00/0xED
+
+# Charisma
+K:234:0x00/0xED
+
+# Ugliness
+K:235:0x00/0xED
+
+# Restore Charisma
+K:236:0x00/0xED
+
+# Curing
+K:237:0x00/0xED
+
+# Invulnerability
+K:238:0x00/0xED
+
+# New Life
+K:239:0x00/0xED
+
+# Cure Serious Wounds
+K:240:0x00/0xED
+
+# Cure Critical Wounds
+K:241:0x00/0xED
+
+# Healing
+K:242:0x00/0xED
+
+# Constitution
+K:243:0x00/0xED
+
+# Experience
+K:244:0x00/0xED
+
+# Sleep
+K:245:0x00/0xED
+
+# Blindness
+K:246:0x00/0xED
+
+# Booze
+K:247:0x00/0xED
+
+# Poison
+K:248:0x00/0xED
+
+# Speed
+K:249:0x00/0xED
+
+# Slowness
+K:250:0x00/0xED
+
+# Dexterity
+K:251:0x00/0xED
+
+# Restore Dexterity
+K:252:0x00/0xED
+
+# Restore Constitution
+K:253:0x00/0xED
+
+# Lose Memories
+K:254:0x00/0xED
+
+# Salt Water
+K:255:0x00/0xED
+
+# Enlightenment
+K:256:0x00/0xED
+
+# Heroism
+K:257:0x00/0xED
+
+# Berserk Strength
+K:258:0x00/0xED
+
+# Boldness
+K:259:0x00/0xED
+
+# Restore Life Levels
+K:260:0x00/0xED
+
+# Resist Heat
+K:261:0x00/0xED
+
+# Resist Cold
+K:262:0x00/0xED
+
+# Detect Invisible
+K:263:0x00/0xED
+
+# Slow Poison
+K:264:0x00/0xED
+
+# Neutralise Poison
+K:265:0x00/0xED
+
+# Restore Mana
+K:266:0x00/0xED
+
+# Infra-vision
+K:267:0x00/0xED
+
+# Resistance
+K:268:0x00/0xED
+
+# Spell
+K:269:0x00/0xEA
+
+# Manathrust
+K:270:0x00/0xEA
+
+# Fireflash
+K:271:0x00/0xEA
+
+# Firewall
+K:272:0x00/0xEA
+
+# Tidal Wave
+K:273:0x00/0xEA
+
+# Ice Storm
+K:274:0x00/0xEA
+
+# Noxious Cloud
+K:275:0x00/0xEA
+
+# Poison Blood
+K:276:0x00/0xEA
+
+# Thunderstorm
+K:277:0x00/0xEA
+
+# Dig
+K:278:0x00/0xEA
+
+# Stone Prison
+K:279:0x00/0xEA
+
+# Strike
+K:280:0x00/0xEA
+
+# Teleport Away
+K:281:0x00/0xEA
+
+# Summon Animal
+K:282:0x00/0xEA
+
+# Magelock
+K:283:0x00/0xEA
+
+# Slow Monster
+K:284:0x00/0xEA
+
+# Essence of Speed
+K:285:0x00/0xEA
+
+# Banishment
+K:286:0x00/0xEA
+
+# Disperse Magic
+K:287:0x00/0xEA
+
+# Charm
+K:288:0x00/0xEA
+
+# Confuse
+K:289:0x00/0xEA
+
+# Demon Blade
+K:290:0x00/0xEA
+
+# Heal Monster
+K:291:0x00/0xEA
+
+# Haste Monster
+K:292:0x00/0xEA
+
+# & Flight Arrow~
+K:293:0x0B/0xD7
+
+# Spell
+K:300:0x00/0xE9
+
+# Nothing
+K:301:0x00/0xE9
+
+# Globe of Light
+K:302:0x00/0xE9
+
+# Fiery Shield
+K:303:0x00/0xE9
+
+# Remove Curses
+K:304:0x00/0xE9
+
+# Wings of Winds
+K:305:0x00/0xE9
+
+# Shake
+K:306:0x00/0xE9
+
+# Disarm
+K:307:0x00/0xE9
+
+# Teleportation
+K:308:0x00/0xE9
+
+# Probability Travel
+K:309:0x00/0xE9
+
+# Recovery
+K:310:0x00/0xE9
+
+# Healing
+K:311:0x00/0xE9
+
+# Vision
+K:312:0x00/0xE9
+
+# Identify
+K:313:0x00/0xE9
+
+# Sense Hidden
+K:314:0x00/0xE9
+
+# Reveal Ways
+K:315:0x00/0xE9
+
+# Sense Monsters
+K:316:0x00/0xE9
+
+# Genocide
+K:317:0x00/0xE9
+
+# Summon
+K:318:0x00/0xE9
+
+# Wish
+K:320:0x00/0xE9
+
+# Mana
+K:321:0x00/0xE9
+
+# & Tome~ of Magical Energy
+K:330:0x0E/0xEF
+
+# & Tome~ of the Eternal Flame
+K:331:0x0C/0xEF
+
+# & Tome~ of the Blowing Wind
+K:332:0x06/0xEF
+
+# & Tome~ of the Impenetrable Earth
+K:333:0x0F/0xEF
+
+# & Tome~ of the Everrunning Wave
+K:334:0x0E/0xEF
+
+# & Tome~ of Translocation
+K:335:0x0E/0xEF
+
+# & Tome~ of the Tree
+K:336:0x0D/0xEF
+
+# & Tome~ of Knowledge
+K:337:0x08/0xEF
+
+# & Small wooden chest~
+K:338:0x02/0xD5
+
+# & Large wooden chest~
+K:339:0x02/0xD5
+
+# & Small iron chest~
+K:340:0x02/0xD5
+
+# & Large iron chest~
+K:341:0x02/0xD5
+
+# & Small steel chest~
+K:342:0x02/0xD5
+
+# & Large steel chest~
+K:343:0x02/0xD5
+
+# & Ruined chest~
+K:344:0x02/0xD5
+
+# & Iron Spike~
+K:345:0x09/0xD4
+
+# & Wooden Torch~
+K:346:0x07/0xF1
+
+# & Brass Lantern~
+K:347:0x0F/0xE6
+
+# & Flask~ of oil
+K:348:0x0B/0xED
+
+# & Empty Bottle~
+K:349:0x01/0xED
+
+# Havoc
+K:350:0x00/0xEB
+
+# Door/Stair Location
+K:351:0x00/0xEB
+
+# Trap Location
+K:352:0x00/0xEB
+
+# Probing
+K:353:0x00/0xEB
+
+# Recall
+K:354:0x00/0xEB
+
+# Illumination
+K:355:0x00/0xEB
+
+# Light
+K:356:0x00/0xEB
+
+# Lightning Bolts
+K:357:0x00/0xEB
+
+# Frost Bolts
+K:358:0x00/0xEB
+
+# Fire Bolts
+K:359:0x00/0xEB
+
+# Polymorph
+K:360:0x00/0xEB
+
+# Slow Monster
+K:361:0x00/0xEB
+
+# Sleep Monster
+K:362:0x00/0xEB
+
+# Drain Life
+K:363:0x00/0xEB
+
+# Teleport Other
+K:364:0x00/0xEB
+
+# Disarming
+K:365:0x00/0xEB
+
+# Lightning Balls
+K:366:0x00/0xEB
+
+# Cold Balls
+K:367:0x00/0xEB
+
+# Fire Balls
+K:368:0x00/0xEB
+
+# Acid Balls
+K:369:0x00/0xEB
+
+# Acid Bolts
+K:370:0x00/0xEB
+
+# Enlightenment
+K:371:0x00/0xEB
+
+# Perception
+K:372:0x00/0xEB
+
+# Curing
+K:373:0x00/0xEB
+
+# Healing
+K:374:0x00/0xEB
+
+# Detection
+K:375:0x00/0xEB
+
+# Restoration
+K:376:0x00/0xEB
+
+# Speed
+K:377:0x00/0xEB
+
+# Spell
+K:378:0x00/0xE8
+
+# Spell
+K:379:0x00/0xE7
+
+# & Broken Skull~
+K:391:0x01/0xD3
+
+# & Broken Bone~
+K:392:0x01/0xD3
+
+# & Canine Skeleton~
+K:393:0x01/0xD3
+
+# & Rodent Skeleton~
+K:394:0x01/0xD3
+
+# & Human Skeleton~
+K:395:0x01/0xD3
+
+# & Dwarf Skeleton~
+K:396:0x01/0xD3
+
+# & Elf Skeleton~
+K:397:0x01/0xD3
+
+# & Gnome Skeleton~
+K:398:0x01/0xD3
+
+# & Great Hammer~
+K:399:0x08/0xDA
+
+# Black Dragon Scale Mail~
+K:400:0x02/0xE5
+
+# Blue Dragon Scale Mail~
+K:401:0x06/0xE5
+
+# White Dragon Scale Mail~
+K:402:0x01/0xE5
+
+# Red Dragon Scale Mail~
+K:403:0x04/0xE5
+
+# Green Dragon Scale Mail~
+K:404:0x05/0xE5
+
+# Multi-Hued Dragon Scale Mail~
+K:405:0x0A/0xE5
+
+# Pseudo Dragon Scale Mail~
+K:406:0x0A/0xE5
+
+# Law Dragon Scale Mail~
+K:407:0x0E/0xE5
+
+# Bronze Dragon Scale Mail~
+K:408:0x0F/0xE5
+
+# Gold Dragon Scale Mail~
+K:409:0x0B/0xE5
+
+# Chaos Dragon Scale Mail~
+K:410:0x0A/0xE5
+
+# Balance Dragon Scale Mail~
+K:411:0x0A/0xE5
+
+# Power Dragon Scale Mail~
+K:412:0x0A/0xE5
+
+# & Dragon Helm~
+K:413:0x0D/0xDF
+
+# & Dragon Shield~
+K:414:0x0D/0xE1
+
+# Death
+K:415:0x00/0xED
+
+# Ruination
+K:416:0x00/0xED
+
+# Detonations
+K:417:0x00/0xED
+
+# Augmentation
+K:418:0x00/0xED
+
+# *Healing*
+K:419:0x00/0xED
+
+# Life
+K:420:0x00/0xED
+
+# Self Knowledge
+K:421:0x00/0xED
+
+# *Enlightenment*
+K:422:0x00/0xED
+
+# Fear Resistance
+K:425:0x00/0xE8
+
+# Light and Darkness Resistance
+K:426:0x00/0xE8
+
+# Nether Resistance
+K:427:0x00/0xE8
+
+# Nexus Resistance
+K:428:0x00/0xE8
+
+# Sound Resistance
+K:429:0x00/0xE8
+
+# Confusion Resistance
+K:430:0x00/0xE8
+
+# Shard Resistance
+K:431:0x00/0xE8
+
+# Disenchantment Resistance
+K:432:0x00/0xE8
+
+# Chaos Resistance
+K:433:0x00/0xE8
+
+# Blindness Resistance
+K:434:0x00/0xE8
+
+# Lordly Protection
+K:435:0x00/0xE8
+
+# Extra Attacks
+K:436:0x00/0xE8
+
+# Cure Light Wounds
+K:437:0x00/0xED
+
+# Clumsiness
+K:438:0x00/0xED
+
+# Sickliness
+K:439:0x00/0xED
+
+# Map of Bree
+K:440:0x02/0xEC
+
+# Map of Gondolin
+K:441:0x02/0xEC
+
+# Map of Lothlorien
+K:442:0x02/0xEC
+
+# Map of Minas Anor
+K:443:0x02/0xEC
+
+# & Silver Arrow~
+K:465:0x09/0xD7
+
+# & Silver Bolt~
+K:466:0x01/0xD7
+
+# Lightning Resistance
+K:467:0x00/0xE7
+
+# Wisdom
+K:468:0x00/0xE7
+
+# Regeneration
+K:469:0x00/0xE7
+
+# Infravision
+K:470:0x00/0xE7
+
+# Devotion
+K:471:0x00/0xE7
+
+# Weaponmastery
+K:472:0x00/0xE7
+
+# Trickery
+K:473:0x00/0xE7
+
+# Telepathy
+K:474:0x00/0xE7
+
+# Sustenance
+K:475:0x00/0xE7
+
+# & Palantir~
+K:476:0x0B/0xF0
+
+# & Elfstone~
+K:477:0x05/0xE7
+
+# & Jewel~
+K:478:0x01/0xE7
+
+# & Ring~
+K:479:0x00/0xE8
+
+# copper
+K:480:0x07/0xF3
+
+# copper
+K:481:0x07/0xF3
+
+# copper
+K:482:0x07/0xF3
+
+# silver
+K:483:0x02/0xF3
+
+# silver
+K:484:0x02/0xF3
+
+# silver
+K:485:0x02/0xF3
+
+# garnets
+K:486:0x04/0xF4
+
+# garnets
+K:487:0x04/0xF4
+
+# gold
+K:488:0x0B/0xF3
+
+# gold
+K:489:0x0B/0xF3
+
+# gold
+K:490:0x0B/0xF3
+
+# opals
+K:491:0x09/0xF4
+
+# sapphires
+K:492:0x06/0xF4
+
+# rubies
+K:493:0x04/0xF4
+
+# diamonds
+K:494:0x01/0xF4
+
+# emeralds
+K:495:0x05/0xF4
+
+# mithril
+K:496:0x0E/0xF3
+
+# adamantite
+K:497:0x0D/0xF3
+
+# & Mighty Hammer~
+K:498:0x08/0xDA
+
+# & Massive Iron Crown~
+K:499:0x08/0xE0
+
+# & Phial~
+K:500:0x0B/0xF0
+
+# & Star~
+K:501:0x0E/0xF0
+
+# & Arkenstone~
+K:502:0x0C/0xF0
+
+# & Amulet~
+K:503:0x00/0xE7
+
+# & Amulet~
+K:504:0x00/0xE7
+
+# & Necklace~
+K:505:0x00/0xE7
+
+# & Ring~
+K:506:0x00/0xE8
+
+# & Ring~
+K:507:0x00/0xE8
+
+# & Ring~
+K:508:0x00/0xE8
+
+# & Ring~
+K:509:0x00/0xE8
+
+# & Ring~
+K:510:0x00/0xE8
+
+# & Ring~
+K:511:0x0B/0xE8
+
+# Reflection
+K:520:0x00/0xE7
+
+# Anti-Magic
+K:521:0x00/0xE7
+
+# Anti-Teleportation
+K:522:0x00/0xE7
+
+# Resistance
+K:523:0x00/0xE7
+
+# & Zweihander~
+K:524:0x01/0xDC
+
+# & Dwarven Lantern~
+K:525:0x06/0xE6
+
+# Splint Mail~
+K:526:0x08/0xE4
+
+# & Everburning Torch~
+K:527:0x0C/0xF1
+
+# & Trifurcate Spear~
+K:528:0x03/0xDB
+
+# & Three Piece Rod~
+K:529:0x07/0xDA
+
+# & Feanorian Lamp~
+K:530:0x0E/0xE6
+
+# & Fur Cloak~
+K:531:0x09/0xE2
+
+# Water Curing
+K:532:0x00/0xED
+
+# & Hatchet~
+K:533:0x02/0xDB
+
+# Rhino Hide Armour~
+K:535:0x02/0xE3
+
+# Leather Jacket~
+K:536:0x0F/0xE3
+
+# & Sickle~
+K:537:0x02/0xDB
+
+# & Club~
+K:542:0x07/0xDA
+
+# & Broad Spear~
+K:543:0x01/0xDB
+
+# & Khopesh~
+K:544:0x09/0xDC
+
+# & Flamberge~
+K:545:0x09/0xDC
+
+# & Claymore~
+K:546:0x09/0xDC
+
+# & Espadon~
+K:547:0x09/0xDC
+
+# & Great Scimitar~
+K:548:0x09/0xDC
+
+# Arrow
+K:549:0x04/0xF8
+
+# Bolt
+K:550:0x03/0xF8
+
+# & Fauchard~
+K:551:0x02/0xDB
+
+# & Guisarme~
+K:552:0x02/0xDB
+
+# & Heavy Lance~
+K:553:0x02/0xDB
+
+# & Basillard~
+K:554:0x01/0xDC
+
+# Catapult
+K:555:0x0C/0xF8
+
+# Ring Mail~
+K:556:0x02/0xE4
+
+# Cord Armour~
+K:557:0x0B/0xE3
+
+# Paper Armour~
+K:558:0x01/0xE3
+
+# Padded Armour~
+K:559:0x0B/0xE3
+
+# Fumes
+K:560:0x0D/0xF8
+
+# Stone and Hide Armour~
+K:561:0x0F/0xE3
+
+# Magic
+K:562:0x05/0xF8
+
+# Device
+K:563:0x0A/0xF8
+
+# Nothing
+K:564:0x00/0xEC
+
+# Poison
+K:565:0x0D/0xF6
+
+# Nothing
+K:566:0x00/0xEA
+
+# Nothing
+K:567:0x00/0xE8
+
+# Nothing
+K:568:0x00/0xE9
+
+# Nothing
+K:569:0x00/0xEB
+
+# Explosion
+K:570:0x0D/0xF6
+
+# Teleport
+K:571:0x0D/0xF6
+
+# Nothing
+K:572:0x00/0xE7
+
+# & Blood~ of Life
+K:573:0x00/0xED
+
+# Cold
+K:574:0x0D/0xF6
+
+# Fire
+K:575:0x0D/0xF6
+
+# Acid
+K:576:0x0D/0xF6
+
+# & Mage Staff~
+K:577:0x0E/0xE9
+
+# Lightning
+K:578:0x00/0xE8
+
+# Life
+K:579:0x0D/0xF6
+
+# Confusion
+K:580:0x0D/0xF6
+
+# Light
+K:581:0x0D/0xF6
+
+# & Ring~
+K:582:0x0B/0xE8
+
+# Invisibility
+K:583:0x00/0xED
+
+# Chaos
+K:584:0x0D/0xF6
+
+# Corruption
+K:585:0x00/0xED
+
+# Invisibility
+K:586:0x00/0xE8
+
+# Time
+K:587:0x0D/0xF6
+
+# Deep Thoughts
+K:588:0x03/0xEC
+
+# More Deep Thoughts
+K:589:0x03/0xEC
+
+# Compendium of Deep Thoughts
+K:590:0x03/0xEC
+
+# Artifact Lore Vol. I
+K:591:0x03/0xEC
+
+# Artifact Lore Vol. II
+K:592:0x03/0xEC
+
+# Artifact Lore Vol. III
+K:593:0x03/0xEC
+
+# Monstrous Compendium 1
+K:594:0x03/0xEC
+
+# Monstrous Compendium 2
+K:595:0x03/0xEC
+
+# Monstrous Compendium 3
+K:596:0x03/0xEC
+
+# Monstrous Compendium 4
+K:597:0x03/0xEC
+
+# Monstrous Compendium 5
+K:598:0x03/0xEC
+
+# Monstrous Compendium 6
+K:599:0x03/0xEC
+
+# Monstrous Compendium 7
+K:600:0x03/0xEC
+
+# Monstrous Compendium 8
+K:601:0x03/0xEC
+
+# Monstrous Compendium 9
+K:602:0x03/0xEC
+
+# Monstrous Compendium 10
+K:603:0x03/0xEC
+
+# Monstrous Compendium 11
+K:604:0x03/0xEC
+
+# Abomination
+K:605:0x00/0xED
+
+# Shape of Wolf
+K:606:0x00/0xED
+
+# Shape of Ape
+K:607:0x00/0xED
+
+# Shape of Goat
+K:608:0x00/0xED
+
+# Shape of Insect
+K:609:0x00/0xED
+
+# Shape of Sparrow
+K:610:0x00/0xED
+
+# Shape of Ent
+K:611:0x00/0xED
+
+# Shape of Vampire
+K:612:0x00/0xED
+
+# Shape of Spider
+K:613:0x00/0xED
+
+# Shape of Mana ball
+K:614:0x00/0xED
+
+# Shape of Fire cloud
+K:615:0x00/0xED
+
+# Shape of Cold cloud
+K:616:0x00/0xED
+
+# Shape of Chaos cloud
+K:617:0x00/0xED
+
+# [Wolf]
+K:618:0x0B/0xE2
+
+# [Ape]
+K:619:0x0B/0xE2
+
+# [Goat]
+K:620:0x0B/0xE2
+
+# [Insect]
+K:621:0x0B/0xE2
+
+# [Sparrow]
+K:622:0x0B/0xE2
+
+# [Ent]
+K:623:0x0B/0xE2
+
+# [Vampire]
+K:624:0x0B/0xE2
+
+# [Spider]
+K:625:0x0B/0xE2
+
+# [Mana ball]
+K:626:0x0B/0xE2
+
+# [Fire cloud]
+K:627:0x0B/0xE2
+
+# [Cold cloud]
+K:628:0x0B/0xE2
+
+# [Chaos Cloud]
+K:629:0x0B/0xE2
+
+# [Ghost]
+K:630:0x0B/0xE2
+
+# [Kobold]
+K:631:0x0B/0xE2
+
+# [Dragon]
+K:632:0x0B/0xE2
+
+# [Demon]
+K:633:0x0B/0xE2
+
+# [Hound]
+K:634:0x0B/0xE2
+
+# [Quylthulg]
+K:635:0x0B/0xE2
+
+# [Maia]
+K:636:0x0B/0xE2
+
+# [Serpent]
+K:637:0x0B/0xE2
+
+# [Giant]
+K:638:0x0B/0xE2
+
+# [Vala]
+K:639:0x0B/0xE2
+
+# Magic
+K:640:0x0D/0xF6
+
+# corpse
+K:641:0x0F/0xD2
+
+# skeleton
+K:642:0x0F/0xD2
+
+# head
+K:643:0x0F/0xD2
+
+# skull
+K:644:0x0F/0xD2
+
+# raw meat
+K:645:0x0F/0xD2
+
+# & Thunderlord Coat~
+K:646:0x0B/0xE3
+
+# & Stone~
+K:647:0x05/0xF0
+
+# & Small Wooden Boomerang~
+K:648:0x0B/0xD8
+
+# & Wooden Boomerang~
+K:649:0x0B/0xD8
+
+# & Small Metal Boomerang~
+K:650:0x0B/0xD8
+
+# & metal Boomerang~
+K:651:0x0B/0xD8
+
+# & Anchor~
+K:652:0x0A/0xF0
+
+# & ~
+K:653:0x0B/0xD2
+
+# Summon Never-Moving Pet
+K:654:0x00/0xEC
+
+# Cure Light Insanity
+K:657:0x00/0xED
+
+# Cure Serious Insanity
+K:658:0x00/0xED
+
+# Cure Critical Insanity
+K:659:0x00/0xED
+
+# Cure Insanity
+K:660:0x00/0xED
+
+# & Phial~
+K:661:0x0B/0xF0
+
+# Random Artifact
+K:662:0x03/0xD3
+
+# Craftmanship
+K:663:0x00/0xEC
+
+# The One Ring
+K:664:0x02/0xEC
+
+# & Book~ of the Lays of the Heroes
+K:665:0x0B/0xEF
+
+# & Book~ of Sound Patterns
+K:666:0x0B/0xEF
+
+# & Flute~
+K:669:0x09/0xF7
+
+# & Drum~
+K:670:0x09/0xF7
+
+# & Harp~
+K:671:0x09/0xF7
+
+# & Banjo~
+K:672:0x09/0xF7
+
+# & Lute~
+K:673:0x09/0xF7
+
+# & Mandolin~
+K:674:0x09/0xF7
+
+# & Palantir~
+K:675:0x0B/0xF0
+
+# Egg
+K:676:0x09/0xD6
+
+# Reset Recall
+K:677:0x00/0xEC
+
+# Divination
+K:678:0x00/0xEC
+
+# Self
+K:679:0x06/0xF5
+
+# Ray
+K:680:0x06/0xF5
+
+# Sphere
+K:681:0x06/0xF5
+
+# Knowledge
+K:682:0x06/0xF5
+
+# Life
+K:683:0x08/0xF5
+
+# Fire
+K:684:0x04/0xF5
+
+# Cold
+K:685:0x06/0xF5
+
+# Lightning
+K:686:0x09/0xF5
+
+# Acid
+K:687:0x0E/0xF5
+
+# Element
+K:688:0x05/0xF5
+
+# Chaos
+K:689:0x0A/0xF5
+
+# Mind
+K:690:0x08/0xF5
+
+# Holding
+K:691:0x0E/0xF5
+
+# Arrow
+K:692:0x06/0xF5
+
+# Power Surge
+K:693:0x06/0xF5
+
+# Armageddon
+K:694:0x06/0xF5
+
+# Gravity
+K:695:0x0D/0xF5
+
+# Extra Life
+K:696:0x0D/0xF6
+
+# Undeath
+K:697:0x0D/0xF5
+
+# Protection
+K:698:0x0D/0xF5
+
+# & Horn~
+K:699:0x09/0xF7
+
+# & Ring~ of Precognition
+K:700:0x00/0xE8
+
+# & Sprig~ of Athelas
+K:701:0x05/0xF2
+
+# & Old Scroll~ of Deincarnation
+K:720:0x00/0xEC
+
+# & Dark Sword~
+K:721:0x08/0xDC
+
+# Numenorean for Beginners (I)
+K:722:0x02/0xEC
+
+# Numenorean for Beginners (II)
+K:723:0x02/0xEC
+
+# Advanced lessons of Numenorean
+K:724:0x02/0xEC
+
+# Advanced lessons of Sindarin
+K:725:0x02/0xEC
+
+# & Shard~ of Pottery
+K:726:0x04/0xD3
+
+# & Broken Stick~
+K:727:0x04/0xD3
+
+# & Book~ of Beginner Cantrips
+K:738:0x01/0xEF
+
+# & Book~ of Teleportation
+K:739:0x01/0xEF
+
+# & Book~ of Recall
+K:740:0x01/0xEF
+
+# & Book~ of Summoning
+K:741:0x01/0xEF
+
+# & Book~ of Fireflash
+K:742:0x01/0xEF
+
+# & Potion~ of Learning
+K:743:0x00/0xED
+
+# Spell
+K:749:0x00/0xEC
+
+# Khuzdul - The Hidden Tongue of the Dwarves
+K:751:0x02/0xEC
+
+# Nandorin for Dummies
+K:752:0x02/0xEC
+
+# Advanced Lessons of Orcish
+K:753:0x02/0xEC
+
+# Flying
+K:755:0x00/0xE8
+
+# & Tome~ of the Time
+K:756:0x06/0xEF
+
+# & Spellbook~ of #
+K:757:0x01/0xEF
+
+# & Tome~ of Meta Spells
+K:758:0x0A/0xEF
+
+# & Tome~ of the Mind
+K:759:0x0E/0xEF
+
+# & Holy Tome~ of Eru Iluvatar
+K:760:0x0D/0xEF
+
+# & Holy Tome~ of Manwe Sulimo
+K:761:0x0E/0xEF
+
+# & War Tome~ of Tulkas
+K:762:0x0C/0xEF
+
+# & Unholy Tome~ of the Hellflame
+K:763:0x0A/0xEF
+
+# & Corrupted Tome~ of Melkor
+K:764:0x08/0xEF
+
+# & Forest Tome~ of Yavanna
+K:768:0x0D/0xEF
+
+# & Ring~
+K:770:0x00/0xE8
+
+# [Earth]
+K:771:0x0C/0xEF
+
+# [Fire]
+K:772:0x0C/0xEF
+
+# [Air]
+K:773:0x04/0xEF
+
+# [Water]
+K:774:0x04/0xEF
+
+# [Mana]
+K:775:0x04/0xEF
+
+# Home Summoning
+K:776:0x00/0xEB
+
+# & Shadow Blade~
+K:777:0x08/0xDC
+
+# & Bluesteel Blade~
+K:778:0x06/0xDC
+
+# the Serpents
+K:779:0x0D/0xE7
+
+# Darkness
+K:780:0x0D/0xF6
+
+# Knowledge
+K:781:0x0D/0xF6
+
+# Force
+K:782:0x0D/0xF6
+
+# Lightning
+K:783:0x0D/0xF6
+
+# Mana
+K:784:0x0D/0xF6
+
+# Ring~ of Power
+K:785:0x00/0xE8
+
+# Climbing Set~
+K:786:0x0E/0xF8
+
+# Adventurer's Guide to Middle-earth
+K:787:0x03/0xEC
+
+# & Demonblade~
+K:788:0x0C/0xEF
+
+# & Demonshield~
+K:789:0x0C/0xEF
+
+# & Demonhorn~
+K:790:0x0C/0xEF
+
+# & Wooden Rod~ of#
+K:793:0x07/0xEB
+
+# & Copper Rod~ of#
+K:794:0x02/0xEB
+
+# & Iron Rod~ of#
+K:795:0x08/0xEB
+
+# & Moonstone Rod~ of#
+K:796:0x0F/0xEB
+
+# & Silver Rod~ of#
+K:797:0x02/0xEB
+
+# & Golden Rod~ of#
+K:798:0x0B/0xEB
+
+# & Mithril Rod~ of#
+K:799:0x0E/0xEB
+
+# & Adamantite Rod~ of#
+K:800:0x0A/0xEB
+
+# & Greater Ration~ of Health
+K:801:0x05/0xF2
+
+# & Crumpled Scroll~ of Mass Resurrection
+K:802:0x00/0xEC
+
+# & Cleaver~
+K:803:0x02/0xDB
+
+# & Light War Axe~
+K:804:0x02/0xDB
+
+# & Slaughter Axe~
+K:805:0x0D/0xDB
+
+# & Runestone~
+K:806:0x0A/0xF5
+
+# & Fortune cookie~
+K:807:0x0F/0xF2
+
+# Portable hole
+K:808:0x0E/0xF8
+
+# Critical Hits
+K:809:0x00/0xE8
+
+# & Wand~ of Digging of Thrain
+K:810:0x00/0xEA
+
+# & Gnarled Staff~ of Holy Fire of Mithrandir
+K:811:0x00/0xE9
+
+# Partial Totem
+K:812:0x0A/0xF8
+
+# True Totem
+K:813:0x0A/0xF8
+
+# & Piece~ of the Relic of Eru
+K:814:0x0A/0xD3
+
+# & Piece~ of the Relic of Manwe
+K:815:0x0A/0xD3
+
+# & Piece~ of the Relic of Tulkas
+K:816:0x0A/0xD3
+
+# & Piece~ of the Relic of Melkor
+K:817:0x0A/0xD3
+
+# & Piece~ of the Relic of Yavanna
+K:818:0x0A/0xD3
+
+
+##### Monster attr/char definitions #####
+
+# Player
+R:0:0x01/0x80
+
+# Filthy street urchin
+R:1:0x08/0xAE
+
+# Scrawny cat
+R:2:0x0F/0xA0
+
+# Sparrow
+R:3:0x0F/0x82
+
+# Chaffinch
+R:4:0x04/0x82
+
+# Wild rabbit
+R:5:0x0F/0xAC
+
+# Woodsman
+R:6:0x05/0xAE
+
+# Scruffy little dog
+R:7:0x0F/0x83
+
+# Farmer Maggot
+R:8:0x01/0xA2
+
+# Blubbering idiot
+R:9:0x09/0xAE
+
+# Boil-covered wretch
+R:10:0x05/0xAE
+
+# Village idiot
+R:11:0x0D/0xAE
+
+# Pitiful-looking beggar
+R:12:0x0F/0xAE
+
+# Mangy-looking leper
+R:13:0x07/0xAE
+
+# Agent of the black market
+R:14:0x06/0xAE
+
+# Singing, happy drunk
+R:15:0x0B/0xAE
+
+# Aimless-looking merchant
+R:16:0x03/0xAE
+
+# Mean-looking mercenary
+R:17:0x04/0xAE
+
+# Battle-scarred veteran
+R:18:0x0E/0xAE
+
+# Martti Ihrasaari
+R:19:0x01/0x90
+
+# Grey mold
+R:20:0x02/0xA7
+
+# Large white snake
+R:21:0x01/0x8A
+
+# Grey mushroom patch
+R:22:0x02/0xEE
+
+# Newt
+R:23:0x0B/0x92
+
+# Giant white centipede
+R:24:0x01/0x9D
+
+# White icky thing
+R:25:0x01/0xA3
+
+# Clear icky thing
+R:26:0x0E/0xA3
+
+# Giant white mouse
+R:27:0x01/0xAC
+
+# Large brown snake
+R:28:0x07/0x8A
+
+# Small kobold
+R:29:0x0B/0xA5
+
+# Kobold
+R:30:0x0D/0xA5
+
+# White worm mass
+R:31:0x01/0xB1
+
+# Floating eye
+R:32:0x03/0x9F
+
+# Rock lizard
+R:33:0x0F/0x92
+
+# Grid bug
+R:34:0x0A/0x89
+
+# Jackal
+R:35:0x0F/0x83
+
+# Soldier ant
+R:36:0x07/0x9B
+
+# Fruit bat
+R:37:0x03/0x9C
+
+# Insect swarm
+R:38:0x07/0x89
+
+# The Greater hell-beast
+R:39:0x02/0x95
+
+# Shrieker mushroom patch
+R:40:0x0C/0xEE
+
+# Blubbering icky thing
+R:41:0x09/0xA3
+
+# Metallic green centipede
+R:42:0x05/0x9D
+
+# Novice warrior
+R:43:0x07/0xAA
+
+# Novice rogue
+R:44:0x06/0xAA
+
+# Novice priest
+R:45:0x05/0xAA
+
+# Novice mage
+R:46:0x04/0xAA
+
+# Yellow mushroom patch
+R:47:0x0B/0xEE
+
+# White jelly
+R:48:0x01/0xA4
+
+# Giant black ant
+R:49:0x08/0x9B
+
+# Salamander
+R:50:0x03/0x92
+
+# White harpy
+R:51:0x01/0x88
+
+# Blue yeek
+R:52:0x06/0xB3
+
+# Grip, Farmer Maggot's dog
+R:53:0x01/0x83
+
+# Wolf, Farmer Maggot's dog
+R:54:0x01/0x83
+
+# Fang, Farmer Maggot's dog
+R:55:0x01/0x83
+
+# Giant green frog
+R:56:0x05/0x92
+
+# Freesia
+R:57:0x07/0xA0
+
+# Green worm mass
+R:58:0x05/0xB1
+
+# Large yellow snake
+R:59:0x0B/0x8A
+
+# Cave spider
+R:60:0x08/0x93
+
+# Crow
+R:61:0x02/0x82
+
+# Wild cat
+R:62:0x0F/0xA0
+
+# Smeagol
+R:63:0x0E/0xA2
+
+# Green ooze
+R:64:0x05/0xA4
+
+# Poltergeist
+R:65:0x02/0x87
+
+# Yellow jelly
+R:66:0x0B/0xA4
+
+# Metallic blue centipede
+R:67:0x06/0x9D
+
+# Raven
+R:68:0x08/0x82
+
+# Giant white louse
+R:69:0x01/0x89
+
+# Giant yellow centipede
+R:70:0x0B/0x9D
+
+# Black naga
+R:71:0x08/0xA8
+
+# Spotted mushroom patch
+R:72:0x03/0xEE
+
+# Silver jelly
+R:73:0x09/0xA4
+
+# Scruffy-looking hobbit
+R:74:0x02/0xA2
+
+# Giant white ant
+R:75:0x01/0x9B
+
+# Yellow mold
+R:76:0x0B/0xA7
+
+# Metallic red centipede
+R:77:0x04/0x9D
+
+# Yellow worm mass
+R:78:0x0B/0xB1
+
+# Clear worm mass
+R:79:0x0E/0xB1
+
+# Radiation eye
+R:80:0x0C/0x9F
+
+# Yellow light
+R:81:0x0B/0xF0
+
+# Cave lizard
+R:82:0x07/0x92
+
+# Novice ranger
+R:83:0x09/0xAA
+
+# Blue jelly
+R:84:0x06/0xA4
+
+# Creeping copper coins
+R:85:0x07/0xF3
+
+# Giant white rat
+R:86:0x09/0xAC
+
+# Snotling
+R:87:0x0F/0xA9
+
+# Swordfish
+R:88:0x09/0x7E
+
+# Blue worm mass
+R:89:0x06/0xB1
+
+# Large grey snake
+R:90:0x02/0x8A
+
+# Skeleton kobold
+R:91:0x09/0xAD
+
+# Ewok
+R:92:0x0D/0xA2
+
+# Novice mage
+R:93:0x04/0xAA
+
+# Green naga
+R:94:0x05/0xA8
+
+# Giant leech
+R:95:0x07/0xB1
+
+# Barracuda
+R:96:0x0D/0x7E
+
+# Novice paladin
+R:97:0x01/0xAA
+
+# Zog
+R:98:0x06/0xA2
+
+# Blue ooze
+R:99:0x06/0xA4
+
+# Green glutton ghost
+R:100:0x05/0x87
+
+# Green jelly
+R:101:0x05/0xA4
+
+# Large kobold
+R:102:0x06/0xA5
+
+# Grey icky thing
+R:103:0x02/0xA3
+
+# Disenchanter eye
+R:104:0x0A/0x9F
+
+# Red worm mass
+R:105:0x04/0xB1
+
+# Copperhead snake
+R:106:0x03/0x8A
+
+# Death sword
+R:107:0x09/0xDC
+
+# Purple mushroom patch
+R:108:0x0A/0xEE
+
+# Novice priest
+R:109:0x05/0xAA
+
+# Novice warrior
+R:110:0x07/0xAA
+
+# Nibelung
+R:111:0x08/0xA2
+
+# The disembodied hand that strangled people
+R:112:0x05/0xB4
+
+# Brown mold
+R:113:0x07/0xA7
+
+# Giant brown bat
+R:114:0x07/0x9C
+
+# Rat-thing
+R:115:0x0C/0xAC
+
+# Novice rogue
+R:116:0x06/0xAA
+
+# Creeping silver coins
+R:117:0x02/0xF3
+
+# Snaga
+R:118:0x0F/0xA9
+
+# Rattlesnake
+R:119:0x04/0x8A
+
+# Giant slug
+R:120:0x0F/0xB1
+
+# Giant pink frog
+R:121:0x04/0x92
+
+# Dark elf
+R:122:0x08/0xA2
+
+# Zombified kobold
+R:123:0x02/0xB4
+
+# Crypt creep
+R:124:0x08/0xAD
+
+# Rotting corpse
+R:125:0x0C/0xB4
+
+# Cave orc
+R:126:0x0D/0xA9
+
+# Wood spider
+R:127:0x0F/0x93
+
+# Manes
+R:128:0x04/0xAF
+
+# Bloodshot eye
+R:129:0x04/0x9F
+
+# Red naga
+R:130:0x04/0xA8
+
+# Red jelly
+R:131:0x04/0xA4
+
+# Green icky thing
+R:132:0x05/0xA3
+
+# Lost soul
+R:133:0x09/0x87
+
+# Night lizard
+R:134:0x06/0x92
+
+# Mughash, the Kobold Lord
+R:135:0x0A/0xA5
+
+# Skeleton orc
+R:136:0x09/0xAD
+
+# Wormtongue, Agent of Saruman
+R:137:0x0E/0xAA
+
+# Robin Hood, the Outlaw
+R:138:0x0D/0xAA
+
+# Nurgling
+R:139:0x03/0xAF
+
+# Lagduf, the Snaga
+R:140:0x0B/0xA9
+
+# Brown yeek
+R:141:0x07/0xB3
+
+# Novice ranger
+R:142:0x09/0xAA
+
+# Giant salamander
+R:143:0x0C/0x92
+
+# Space monster
+R:144:0x00/0xB5
+
+# Carnivorous flying monkey
+R:145:0x0C/0x88
+
+# Green mold
+R:146:0x05/0xA7
+
+# Novice paladin
+R:147:0x01/0xAA
+
+# Lemure
+R:148:0x0F/0xAF
+
+# Hill orc
+R:149:0x07/0xA9
+
+# Bandit
+R:150:0x06/0xAA
+
+# Hunting hawk
+R:151:0x07/0x82
+
+# Phantom warrior
+R:152:0x0E/0x87
+
+# Gremlin
+R:153:0x07/0xAF
+
+# Yeti
+R:154:0x01/0x99
+
+# Bloodshot icky thing
+R:155:0x04/0xA3
+
+# Giant grey rat
+R:156:0x02/0xAC
+
+# Black harpy
+R:157:0x08/0x88
+
+# Skaven
+R:158:0x0D/0xAC
+
+# The wounded bear
+R:159:0x04/0xAB
+
+# Cave bear
+R:160:0x07/0xAB
+
+# Rock mole
+R:161:0x02/0xAC
+
+# Mindcrafter
+R:162:0x0B/0xAA
+
+# Baby blue dragon
+R:163:0x06/0x9E
+
+# Baby white dragon
+R:164:0x01/0x9E
+
+# Baby green dragon
+R:165:0x05/0x9E
+
+# Baby black dragon
+R:166:0x02/0x9E
+
+# Baby red dragon
+R:167:0x04/0x9E
+
+# Giant red ant
+R:168:0x04/0x9B
+
+# Brodda, the Easterling
+R:169:0x0F/0xAA
+
+# Bloodfang, the Wolf
+R:170:0x0C/0x83
+
+# King cobra
+R:171:0x05/0x8A
+
+# Eagle
+R:172:0x07/0x82
+
+# War bear
+R:173:0x07/0xAB
+
+# Killer bee
+R:174:0x0B/0x89
+
+# Giant spider
+R:175:0x0A/0x93
+
+# Giant white tick
+R:176:0x01/0x93
+
+# The Borshin
+R:177:0x01/0xA1
+
+# Dark elven mage
+R:178:0x04/0xA2
+
+# Kamikaze yeek
+R:179:0x04/0xB3
+
+# Orfax, Son of Boldor
+R:180:0x0E/0xB3
+
+# Servant of Glaaki
+R:181:0x0D/0xB4
+
+# Dark elven warrior
+R:182:0x07/0xA2
+
+# Sand-dweller
+R:183:0x0B/0xAF
+
+# Clear mushroom patch
+R:184:0x0E/0xEE
+
+# Quiver slot
+R:185:0x0F/0xEE
+
+# Grishnakh, the Hill Orc
+R:186:0x0B/0xA9
+
+# Giant tan bat
+R:187:0x0F/0x9C
+
+# Owlbear
+R:188:0x03/0x88
+
+# Blue horror
+R:189:0x0E/0xAF
+
+# Hairy mold
+R:190:0x03/0xA7
+
+# Grizzly bear
+R:191:0x0F/0xAB
+
+# Disenchanter mold
+R:192:0x0A/0xA7
+
+# Pseudo dragon
+R:193:0x03/0x9E
+
+# Tengu
+R:194:0x06/0xAF
+
+# Creeping gold coins
+R:195:0x0B/0xF3
+
+# Wolf
+R:196:0x07/0x83
+
+# Giant fruit fly
+R:197:0x0D/0x89
+
+# Panther
+R:198:0x08/0xA0
+
+# Brigand
+R:199:0x06/0xAA
+
+# Hobbes the Tiger
+R:200:0x0B/0xA0
+
+# Shadow Creature of Fiona
+R:201:0x02/0xA2
+
+# Undead mass
+R:202:0x07/0xA4
+
+# Chaos shapechanger
+R:203:0x0A/0x88
+
+# Baby multi-hued dragon
+R:204:0x0A/0x9E
+
+# Vorpal bunny
+R:205:0x01/0xAC
+
+# Old Man Willow
+R:206:0x02/0xCC
+
+# Hippocampus
+R:207:0x0E/0x88
+
+# Zombified orc
+R:208:0x02/0xB4
+
+# Hippogriff
+R:209:0x0F/0x88
+
+# Black mamba
+R:210:0x08/0x8A
+
+# White wolf
+R:211:0x01/0x83
+
+# Grape jelly
+R:212:0x0A/0xA4
+
+# Nether worm mass
+R:213:0x08/0xB1
+
+# Abyss worm mass
+R:214:0x08/0xB1
+
+# Golfimbul, the Hill Orc Chief
+R:215:0x0B/0xA9
+
+# Swordsman
+R:216:0x07/0xAA
+
+# Skaven shaman
+R:217:0x05/0xAC
+
+# Baby bronze dragon
+R:218:0x0F/0x9E
+
+# Baby gold dragon
+R:219:0x0B/0x9E
+
+# Evil eye
+R:220:0x08/0x9F
+
+# Mine-dog
+R:221:0x07/0x83
+
+# Hellcat
+R:222:0x0C/0xA0
+
+# Moon beast
+R:223:0x09/0xAB
+
+# Master yeek
+R:224:0x05/0xB3
+
+# Priest
+R:225:0x05/0xAA
+
+# Dark elven priest
+R:226:0x05/0xA2
+
+# Air spirit
+R:227:0x0E/0x85
+
+# Skeleton human
+R:228:0x09/0xAD
+
+# Zombified human
+R:229:0x02/0xB4
+
+# Tiger
+R:230:0x03/0xA0
+
+# Moaning spirit
+R:231:0x07/0x87
+
+# Stegocentipede
+R:232:0x07/0x9D
+
+# Spotted jelly
+R:233:0x03/0xA4
+
+# Drider
+R:234:0x06/0x93
+
+# Mongbat
+R:235:0x0F/0x9C
+
+# Killer brown beetle
+R:236:0x07/0x8B
+
+# Boldor, King of the Yeeks
+R:237:0x0A/0xB3
+
+# Ogre
+R:238:0x0F/0x8F
+
+# Creeping mithril coins
+R:239:0x0E/0xF3
+
+# Illusionist
+R:240:0x0C/0xAA
+
+# Druid
+R:241:0x0D/0xAA
+
+# Pink horror
+R:242:0x0C/0xAF
+
+# Cloaker
+R:243:0x05/0xE2
+
+# Black orc
+R:244:0x08/0xA9
+
+# Ochre jelly
+R:245:0x0F/0xA4
+
+# Software bug
+R:246:0x04/0x89
+
+# Lurker
+R:247:0x01/0xB5
+
+# Tangleweed
+R:248:0x05/0xCC
+
+# Vlasta
+R:249:0x0E/0x92
+
+# Giant white dragon fly
+R:250:0x01/0x86
+
+# Snaga sapper
+R:251:0x0F/0xA9
+
+# Blue icky thing
+R:252:0x06/0xA3
+
+# Gibbering mouther
+R:253:0x03/0xA4
+
+# Wolfhound of Flora
+R:254:0x02/0x83
+
+# Hill giant
+R:255:0x0F/0x90
+
+# Flesh golem
+R:256:0x0C/0xA1
+
+# Warg
+R:257:0x08/0x83
+
+# Cheerful leprechaun
+R:258:0x0D/0xA2
+
+# Giant flea
+R:259:0x02/0x89
+
+# Ufthak of Cirith Ungol
+R:260:0x05/0xA9
+
+# Clay golem
+R:261:0x0F/0xA1
+
+# Black ogre
+R:262:0x08/0x8F
+
+# Dweller on the threshold
+R:263:0x02/0x99
+
+# Half-orc
+R:264:0x02/0xA9
+
+# Dark naga
+R:265:0x02/0xA8
+
+# Poison ivy
+R:266:0x05/0xCC
+
+# Magic mushroom patch
+R:267:0x0E/0xEE
+
+# Plaguebearer of Nurgle
+R:268:0x03/0xB4
+
+# Guardian naga
+R:269:0x0B/0xA8
+
+# Wererat
+R:270:0x08/0xAC
+
+# Light hound
+R:271:0x03/0x9A
+
+# Dark hound
+R:272:0x08/0x9A
+
+# Flying skull
+R:273:0x02/0xAD
+
+# Mi-Go
+R:274:0x0C/0x89
+
+# Giant tarantula
+R:275:0x03/0x93
+
+# Giant clear centipede
+R:276:0x0E/0x9D
+
+# Mirkwood spider
+R:277:0x0D/0x93
+
+# Frost giant
+R:278:0x01/0x90
+
+# Griffon
+R:279:0x07/0x88
+
+# Homunculus
+R:280:0x0B/0xAF
+
+# Gnome mage
+R:281:0x0C/0xA2
+
+# Clear hound
+R:282:0x0E/0x9A
+
+# Umber hulk
+R:283:0x0F/0x98
+
+# Rust monster
+R:284:0x03/0xAB
+
+# Ogrillon
+R:285:0x09/0x8F
+
+# Gelatinous cube
+R:286:0x0D/0xA4
+
+# Giant green dragon fly
+R:287:0x0D/0x86
+
+# Fire giant
+R:288:0x04/0x90
+
+# Hummerhorn
+R:289:0x0B/0x89
+
+# Lizard man
+R:290:0x0D/0xA2
+
+# Ulfast, Son of Ulfang
+R:291:0x0F/0xAA
+
+# Crebain
+R:292:0x08/0x82
+
+# Berserker
+R:293:0x07/0xAA
+
+# Quasit
+R:294:0x03/0xAF
+
+# Sphinx
+R:295:0x03/0x88
+
+# Imp
+R:296:0x05/0xAF
+
+# Forest troll
+R:297:0x05/0x94
+
+# Freezing sphere
+R:298:0x01/0xF0
+
+# Jumping fireball
+R:299:0x04/0xF0
+
+# Ball lightning
+R:300:0x0E/0xF0
+
+# 2-headed hydra
+R:301:0x07/0x8D
+
+# Swamp thing
+R:302:0x05/0x88
+
+# Water spirit
+R:303:0x06/0x85
+
+# Giant red scorpion
+R:304:0x04/0x93
+
+# Earth spirit
+R:305:0x07/0x85
+
+# Fire spirit
+R:306:0x04/0x85
+
+# Fire hound
+R:307:0x04/0x9A
+
+# Cold hound
+R:308:0x01/0x9A
+
+# Energy hound
+R:309:0x06/0x9A
+
+# Lesser Mimic
+R:310:0x0B/0xA7
+
+# Door mimic
+R:311:0x0F/0xB8
+
+# Blink dog
+R:312:0x0E/0x83
+
+# Uruk
+R:313:0x0E/0xA9
+
+# Shagrat, the Orc Captain
+R:314:0x05/0xA9
+
+# Gorbag, the Orc Captain
+R:315:0x05/0xA9
+
+# Shambling mound
+R:316:0x05/0xEE
+
+# Giant Venus Flytrap
+R:317:0x05/0xCC
+
+# Chaos beastman
+R:318:0x07/0x88
+
+# Daemonette of Slaanesh
+R:319:0x0C/0xAF
+
+# Giant bronze dragon fly
+R:320:0x0F/0x86
+
+# Stone giant
+R:321:0x09/0x90
+
+# Giant black dragon fly
+R:322:0x02/0x86
+
+# Stone golem
+R:323:0x09/0xA1
+
+# Red mold
+R:324:0x04/0xA7
+
+# Giant gold dragon fly
+R:325:0x0B/0x86
+
+# Stunwall
+R:326:0x09/0xBC
+
+# Ghast
+R:327:0x07/0xB4
+
+# Neekerbreeker
+R:328:0x08/0x89
+
+# Huorn
+R:329:0x05/0xCC
+
+# Bolg, Son of Azog
+R:330:0x0A/0xA9
+
+# Phase spider
+R:331:0x0E/0x93
+
+# Lizard king
+R:332:0x05/0xA2
+
+# Landmine
+R:333:0x01/0xB5
+
+# Wyvern
+R:334:0x05/0x9E
+
+# Great eagle
+R:335:0x07/0x82
+
+# Livingstone
+R:336:0x09/0xBC
+
+# Earth hound
+R:337:0x07/0x9A
+
+# Air hound
+R:338:0x05/0x9A
+
+# Sabre-tooth tiger
+R:339:0x0B/0xA0
+
+# Acid hound
+R:340:0x02/0x9A
+
+# Chimaera
+R:341:0x04/0x88
+
+# Quylthulg
+R:342:0x0B/0x91
+
+# Sasquatch
+R:343:0x09/0x99
+
+# Weir
+R:344:0x09/0x83
+
+# Ranger
+R:345:0x09/0xAA
+
+# Paladin
+R:346:0x01/0xAA
+
+# Werewolf
+R:347:0x08/0x83
+
+# Dark elven lord
+R:348:0x02/0xA2
+
+# Cloud giant
+R:349:0x06/0x90
+
+# Ugluk, the Uruk
+R:350:0x0A/0xA9
+
+# Blue dragon bat
+R:351:0x06/0x9C
+
+# Mimic
+R:352:0x0B/0xA7
+
+# Ultimate Mimic
+R:353:0x0B/0xA7
+
+# Fire vortex
+R:354:0x04/0xB0
+
+# Acid vortex
+R:355:0x02/0xB0
+
+# Lugdush, the Uruk
+R:356:0x0A/0xA9
+
+# Arch-vile
+R:357:0x09/0xAF
+
+# Cold vortex
+R:358:0x01/0xB0
+
+# Energy vortex
+R:359:0x06/0xB0
+
+# Globefish
+R:360:0x01/0x7E
+
+# Giant firefly
+R:361:0x04/0x89
+
+# Mummified orc
+R:362:0x01/0xB4
+
+# Wolf chieftain
+R:363:0x08/0x83
+
+# Serpent man
+R:364:0x0D/0x8A
+
+# Vampiric mist
+R:365:0x08/0xCA
+
+# Killer stag beetle
+R:366:0x05/0x8B
+
+# Iron golem
+R:367:0x02/0xA1
+
+# Auto-roller
+R:368:0x02/0xA1
+
+# Giant yellow scorpion
+R:369:0x0B/0x93
+
+# Jade monk
+R:370:0x0D/0xAA
+
+# Black ooze
+R:371:0x08/0xA4
+
+# Hardened warrior
+R:372:0x07/0xAA
+
+# Azog, King of the Uruk-Hai
+R:373:0x0A/0xA9
+
+# Fleshhound of Khorne
+R:374:0x0C/0x83
+
+# Dark elven warlock
+R:375:0x0A/0xA2
+
+# Master rogue
+R:376:0x06/0xAA
+
+# Red dragon bat
+R:377:0x04/0x9C
+
+# Killer white beetle
+R:378:0x01/0x8B
+
+# Ice skeleton
+R:379:0x01/0xAD
+
+# Angamaite of Umbar
+R:380:0x0F/0xAA
+
+# Forest wight
+R:381:0x05/0x97
+
+# Khim, Son of Mim
+R:382:0x03/0xA2
+
+# Ibun, Son of Mim
+R:383:0x03/0xA2
+
+# Meneldor the Swift
+R:384:0x07/0x82
+
+# Phantom beast
+R:385:0x0E/0x87
+
+# Giant silver ant
+R:386:0x09/0x9B
+
+# 4-headed hydra
+R:387:0x0B/0x8D
+
+# Lesser hell-beast
+R:388:0x02/0x95
+
+# Tyrannosaur
+R:389:0x05/0x92
+
+# Mummified human
+R:390:0x01/0xB4
+
+# Vampire bat
+R:391:0x08/0x9C
+
+# Sangahyando of Umbar
+R:392:0x0F/0xAA
+
+# It
+R:393:0x09/0xB5
+
+# Banshee
+R:394:0x06/0x87
+
+# Carrion crawler
+R:395:0x03/0x9D
+
+# Xiclotlan
+R:396:0x08/0xCC
+
+# Silent watcher
+R:397:0x02/0xA1
+
+# Pukelman
+R:398:0x08/0xA1
+
+# Disenchanter beast
+R:399:0x0A/0xAB
+
+# Dark elven druid
+R:400:0x0D/0xA2
+
+# Stone troll
+R:401:0x09/0x94
+
+# Black
+R:402:0x00/0xA4
+
+# Hill troll
+R:403:0x02/0x94
+
+# Wereworm
+R:404:0x07/0xB1
+
+# Killer red beetle
+R:405:0x04/0x8B
+
+# Disenchanter bat
+R:406:0x0A/0x9C
+
+# Gnoph-Keh
+R:407:0x02/0xAB
+
+# Giant grey ant
+R:408:0x02/0x9B
+
+# Khufu, the Mummified King
+R:409:0x0A/0xB4
+
+# Gwaihir the Windlord
+R:410:0x07/0x82
+
+# Giant fire tick
+R:411:0x0C/0x93
+
+# Displacer beast
+R:412:0x06/0xA0
+
+# Ulwarth, Son of Ulfang
+R:413:0x0F/0xAA
+
+# Werebear
+R:414:0x08/0xAB
+
+# Cave ogre
+R:415:0x07/0x8F
+
+# White wraith
+R:416:0x01/0x97
+
+# Angel
+R:417:0x03/0x81
+
+# Ghoul
+R:418:0x0F/0xB4
+
+# Mim, Betrayer of Turin
+R:419:0x03/0xA2
+
+# Hellblade
+R:420:0x0A/0xDC
+
+# Killer fire beetle
+R:421:0x0C/0x8B
+
+# Beast of Nurgle
+R:422:0x0B/0xAB
+
+# Creeping adamantite coins
+R:423:0x0D/0xF3
+
+# Algroth
+R:424:0x03/0x94
+
+# Flamer of Tzeentch
+R:425:0x04/0xEE
+
+# Roper
+R:426:0x08/0xBC
+
+# Headless
+R:427:0x07/0x88
+
+# Vibration hound
+R:428:0x0B/0x9A
+
+# Nexus hound
+R:429:0x0A/0x9A
+
+# Half-ogre
+R:430:0x03/0x8F
+
+# Lokkak, the Ogre Chieftain
+R:431:0x0A/0x8F
+
+# Vampire
+R:432:0x09/0x96
+
+# Gorgimaera
+R:433:0x03/0x88
+
+# Shantak
+R:434:0x08/0x88
+
+# Colbran
+R:435:0x0B/0xA1
+
+# Spirit naga
+R:436:0x01/0xA8
+
+# Corpser
+R:437:0x08/0xEE
+
+# Fiend of Slaanesh
+R:438:0x0C/0x93
+
+# Stairway to Hell
+R:439:0x09/0xB7
+
+# 5-headed hydra
+R:440:0x05/0x8D
+
+# Barney the Dinosaur
+R:441:0x0A/0x92
+
+# Black knight
+R:442:0x02/0xAA
+
+# Seahorse
+R:443:0x03/0x7E
+
+# Cyclops
+R:444:0x07/0x90
+
+# Clairvoyant
+R:445:0x0B/0xAA
+
+# Purple worm
+R:446:0x0A/0xB1
+
+# Catoblepas
+R:447:0x05/0xAB
+
+# Lesser wall monster
+R:448:0x09/0xBC
+
+# Mage
+R:449:0x04/0xAA
+
+# Mind flayer
+R:450:0x0A/0xA2
+
+# The Ultimate Dungeon Cleaner
+R:451:0x08/0xA1
+
+# Deep one
+R:452:0x05/0xAF
+
+# Basilisk
+R:453:0x02/0x92
+
+# Ice troll
+R:454:0x01/0x94
+
+# Dhole
+R:455:0x02/0xB1
+
+# Archangel
+R:456:0x0E/0x81
+
+# Greater Mimic
+R:457:0x0B/0xA7
+
+# Chaos tile
+R:458:0x0A/0xB5
+
+# Young blue dragon
+R:459:0x06/0x9E
+
+# Young white dragon
+R:460:0x01/0x9E
+
+# Young green dragon
+R:461:0x05/0x9E
+
+# Young bronze dragon
+R:462:0x0F/0x9E
+
+# Aklash
+R:463:0x0C/0x94
+
+# Mithril golem
+R:464:0x0E/0xA1
+
+# Skeleton troll
+R:465:0x09/0xAD
+
+# Skeletal tyrannosaur
+R:466:0x01/0x92
+
+# Beorn, the Shape-Changer
+R:467:0x08/0xAB
+
+# Thorondor, Lord of Eagles
+R:468:0x07/0x82
+
+# Giant blue ant
+R:469:0x06/0x9B
+
+# Grave wight
+R:470:0x06/0x97
+
+# Shadow drake
+R:471:0x0D/0x9E
+
+# Manticore
+R:472:0x0B/0x88
+
+# Giant army ant
+R:473:0x03/0x9B
+
+# Killer slicer beetle
+R:474:0x0B/0x8B
+
+# Gorgon
+R:475:0x06/0x88
+
+# Gug
+R:476:0x0D/0x90
+
+# Ghost
+R:477:0x01/0x87
+
+# Death watch beetle
+R:478:0x08/0x8B
+
+# Mountain ogre
+R:479:0x02/0x8F
+
+# Nexus quylthulg
+R:480:0x0A/0x91
+
+# Shelob, Spider of Darkness
+R:481:0x08/0x93
+
+# Giant squid
+R:482:0x05/0x7E
+
+# Ghoulking
+R:483:0x08/0xB4
+
+# Doombat
+R:484:0x0C/0x9C
+
+# Ninja
+R:485:0x07/0xAA
+
+# Memory moss
+R:486:0x06/0xEE
+
+# Storm giant
+R:487:0x0E/0x90
+
+# Spectator
+R:488:0x0E/0x9F
+
+# Bokrug
+R:489:0x0A/0x92
+
+# Biclops
+R:490:0x07/0x90
+
+# Half-troll
+R:491:0x0F/0x94
+
+# Ivory monk
+R:492:0x01/0xAA
+
+# Bert the Stone Troll
+R:493:0x09/0x94
+
+# Bill the Stone Troll
+R:494:0x09/0x94
+
+# Tom the Stone Troll
+R:495:0x09/0x94
+
+# Cave troll
+R:496:0x07/0x94
+
+# Anti-paladin
+R:497:0x08/0xAA
+
+# Chaos master
+R:498:0x0A/0xAA
+
+# Barrow wight
+R:499:0x0A/0x97
+
+# Skeleton ettin
+R:500:0x09/0xAD
+
+# Chaos drake
+R:501:0x0A/0x9E
+
+# Law drake
+R:502:0x0E/0x9E
+
+# Balance drake
+R:503:0x0A/0x9E
+
+# Ethereal drake
+R:504:0x03/0x9E
+
+# Groo, the Wanderer
+R:505:0x0F/0xAA
+
+# Fasolt the Giant
+R:506:0x07/0x90
+
+# Shade
+R:507:0x08/0x87
+
+# Spectre
+R:508:0x0F/0x87
+
+# Water troll
+R:509:0x0E/0x94
+
+# Fire elemental
+R:510:0x04/0x85
+
+# Cherub
+R:511:0x0D/0x81
+
+# Water elemental
+R:512:0x06/0x85
+
+# Multi-hued hound
+R:513:0x0A/0x9A
+
+# Invisible stalker
+R:514:0x0B/0x85
+
+# Carrion crawler
+R:515:0x03/0x9D
+
+# Master thief
+R:516:0x06/0xAA
+
+# The Watcher in the Water
+R:517:0x0A/0x7E
+
+# Lich
+R:518:0x03/0x8C
+
+# Gas spore
+R:519:0x05/0x9F
+
+# Master vampire
+R:520:0x05/0x96
+
+# Oriental vampire
+R:521:0x02/0x96
+
+# Greater mummy
+R:522:0x0B/0xB4
+
+# Bloodletter of Khorne
+R:523:0x04/0x95
+
+# Giant grey scorpion
+R:524:0x02/0x93
+
+# Earth elemental
+R:525:0x07/0x85
+
+# Air elemental
+R:526:0x0E/0x85
+
+# Shimmering mold
+R:527:0x06/0xA7
+
+# Gargoyle
+R:528:0x02/0xAF
+
+# Malicious leprechaun
+R:529:0x0A/0xA2
+
+# Eog golem
+R:530:0x07/0xA1
+
+# Little Boy
+R:531:0x08/0xD6
+
+# Dagashi
+R:532:0x07/0xAA
+
+# Headless ghost
+R:533:0x07/0x87
+
+# Dread
+R:534:0x03/0x87
+
+# Leng spider
+R:535:0x0A/0x93
+
+# Gauth
+R:536:0x02/0x9F
+
+# Smoke elemental
+R:537:0x0C/0x85
+
+# Olog
+R:538:0x0B/0x94
+
+# Halfling slinger
+R:539:0x0F/0xA2
+
+# Gravity hound
+R:540:0x09/0x9A
+
+# Acidic cytoplasm
+R:541:0x02/0xA4
+
+# Inertia hound
+R:542:0x09/0x9A
+
+# Impact hound
+R:543:0x07/0x9A
+
+# Shardstorm
+R:544:0x07/0xB0
+
+# Ooze elemental
+R:545:0x05/0x85
+
+# Young black dragon
+R:546:0x02/0x9E
+
+# Mumak
+R:547:0x02/0xAB
+
+# Giant fire ant
+R:548:0x0C/0x9B
+
+# Mature white dragon
+R:549:0x01/0x9E
+
+# Xorn
+R:550:0x07/0x98
+
+# Rogrog the Black Troll
+R:551:0x08/0x94
+
+# Mist giant
+R:552:0x0E/0xCA
+
+# Phantom
+R:553:0x0A/0x87
+
+# Grey wraith
+R:554:0x02/0x97
+
+# Revenant
+R:555:0x07/0x97
+
+# Young multi-hued dragon
+R:556:0x0A/0x9E
+
+# Raal's Tome of Destruction
+R:557:0x04/0xEF
+
+# Colossus
+R:558:0x0D/0xA1
+
+# Young gold dragon
+R:559:0x0B/0x9E
+
+# Mature blue dragon
+R:560:0x06/0x9E
+
+# Mature green dragon
+R:561:0x05/0x9E
+
+# Mature bronze dragon
+R:562:0x0F/0x9E
+
+# Young red dragon
+R:563:0x04/0x9E
+
+# Nightblade
+R:564:0x08/0xA2
+
+# Trapper
+R:565:0x01/0xB5
+
+# Bodak
+R:566:0x04/0xAF
+
+# Time bomb
+R:567:0x01/0xB5
+
+# Mezzodaemon
+R:568:0x03/0xAF
+
+# Elder thing
+R:569:0x0D/0xAF
+
+# Ice elemental
+R:570:0x01/0x85
+
+# Necromancer
+R:571:0x0C/0xAA
+
+# The Greater hell magic mushroom were-quylthulg
+R:572:0x02/0x91
+
+# Lorgan, Chief of the Easterlings
+R:573:0x0A/0xAA
+
+# Chaos spawn
+R:574:0x02/0x9F
+
+# Mummified troll
+R:575:0x01/0xB4
+
+# Storm of Unmagic
+R:576:0x0A/0xB0
+
+# Crypt thing
+R:577:0x0D/0x8C
+
+# Chaos butterfly
+R:578:0x0D/0x89
+
+# Time elemental
+R:579:0x0D/0x85
+
+# Flying polyp
+R:580:0x0C/0x7E
+
+# The Queen Ant
+R:581:0x0A/0x9B
+
+# Will o' the wisp
+R:582:0x09/0x85
+
+# Shan
+R:583:0x0E/0x89
+
+# Magma elemental
+R:584:0x03/0x85
+
+# Black pudding
+R:585:0x08/0xA4
+
+# Killer iridescent beetle
+R:586:0x0A/0x8B
+
+# Nexus vortex
+R:587:0x0A/0xB0
+
+# Plasma vortex
+R:588:0x0C/0xB0
+
+# Mature red dragon
+R:589:0x04/0x9E
+
+# Mature gold dragon
+R:590:0x0B/0x9E
+
+# Crystal drake
+R:591:0x07/0x9E
+
+# Mature black dragon
+R:592:0x02/0x9E
+
+# Mature multi-hued dragon
+R:593:0x0A/0x9E
+
+# Sky whale
+R:594:0x0D/0x7E
+
+# Draebor, the Imp
+R:595:0x0A/0xAF
+
+# Mother Hydra
+R:596:0x0A/0xAF
+
+# Death knight
+R:597:0x08/0xAA
+
+# Castamir the Usurper
+R:598:0x0C/0xAA
+
+# Time vortex
+R:599:0x0E/0xB0
+
+# Shimmering vortex
+R:600:0x03/0xB0
+
+# Ancient blue dragon
+R:601:0x06/0x84
+
+# Ancient bronze dragon
+R:602:0x0F/0x84
+
+# Beholder
+R:603:0x0F/0x9F
+
+# Emperor wight
+R:604:0x04/0x97
+
+# Seraph
+R:605:0x04/0x81
+
+# Vargo, Tyrant of Fire
+R:606:0x04/0x85
+
+# Black wraith
+R:607:0x08/0x97
+
+# Nightgaunt
+R:608:0x08/0x95
+
+# Baron of hell
+R:609:0x0F/0x95
+
+# Scylla
+R:610:0x0E/0x8D
+
+# Monastic lich
+R:611:0x07/0x8C
+
+# Nether wraith
+R:612:0x0D/0x97
+
+# Hellhound
+R:613:0x04/0x83
+
+# 7-headed hydra
+R:614:0x0D/0x8D
+
+# Waldern, King of Water
+R:615:0x06/0x85
+
+# Kavlax the Many-Headed
+R:616:0x0A/0x9E
+
+# Ancient white dragon
+R:617:0x01/0x84
+
+# Ancient green dragon
+R:618:0x05/0x84
+
+# Chthonian
+R:619:0x08/0xB1
+
+# Eldrak
+R:620:0x04/0x94
+
+# Ettin
+R:621:0x06/0x94
+
+# Night mare
+R:622:0x0D/0xAB
+
+# Vampire lord
+R:623:0x06/0x96
+
+# Ancient black dragon
+R:624:0x02/0x84
+
+# Weird fume
+R:625:0x0A/0xCA
+
+# Spawn of Ubbo-Sathla
+R:626:0x0A/0xA4
+
+# Fat Man
+R:627:0x08/0xD6
+
+# Malekith the Accursed
+R:628:0x0A/0xA2
+
+# Shadowfax, steed of Gandalf
+R:629:0x0A/0xAB
+
+# Spirit troll
+R:630:0x0D/0x87
+
+# War troll
+R:631:0x06/0x94
+
+# Disenchanter worm mass
+R:632:0x0A/0xB1
+
+# Rotting quylthulg
+R:633:0x07/0x91
+
+# Lesser titan
+R:634:0x0B/0x90
+
+# 9-headed hydra
+R:635:0x04/0x8D
+
+# Enchantress
+R:636:0x0C/0xAA
+
+# Ranger chieftain
+R:637:0x09/0xAA
+
+# Sorcerer
+R:638:0x0C/0xAA
+
+# Xaren
+R:639:0x02/0x98
+
+# Giant roc
+R:640:0x07/0x82
+
+# Minotaur
+R:641:0x0F/0x88
+
+# Medusa, the Gorgon
+R:642:0x0A/0xA8
+
+# Death drake
+R:643:0x0D/0x84
+
+# Ancient red dragon
+R:644:0x04/0x84
+
+# Ancient gold dragon
+R:645:0x0B/0x84
+
+# Great crystal drake
+R:646:0x0F/0x84
+
+# Wyrd sister
+R:647:0x0A/0xAA
+
+# Vrock
+R:648:0x02/0x95
+
+# Death quasit
+R:649:0x08/0xAF
+
+# Giganto, the Gargantuan
+R:650:0x02/0x7E
+
+# Strygalldwir
+R:651:0x09/0x95
+
+# Fallen angel
+R:652:0x02/0x81
+
+# Giant headless
+R:653:0x07/0x88
+
+# Judge Fire
+R:654:0x0C/0xAD
+
+# Ubbo-Sathla, the Unbegotten Source
+R:655:0x09/0xA4
+
+# Judge Mortis
+R:656:0x0D/0xB4
+
+# Dark elven sorcerer
+R:657:0x0C/0xA2
+
+# Master lich
+R:658:0x04/0x8C
+
+# Byakhee
+R:659:0x08/0x95
+
+# Eol, the Dark Elf
+R:660:0x08/0xA2
+
+# Archon
+R:661:0x0B/0x81
+
+# Formless spawn of Tsathoggua
+R:662:0x08/0x95
+
+# Hunting horror
+R:663:0x08/0x95
+
+# Undead beholder
+R:664:0x07/0x9F
+
+# Shadow
+R:665:0x08/0x87
+
+# Iron lich
+R:666:0x02/0x8C
+
+# Dread
+R:667:0x03/0x87
+
+# Greater basilisk
+R:668:0x08/0x92
+
+# Charybdis
+R:669:0x04/0x7E
+
+# Jack of Shadows
+R:670:0x02/0xAA
+
+# Zephyr Lord
+R:671:0x0A/0x97
+
+# Juggernaut of Khorne
+R:672:0x08/0xA1
+
+# Mumak
+R:673:0x02/0xAB
+
+# Judge Fear
+R:674:0x08/0x97
+
+# Ancient multi-hued dragon
+R:675:0x0A/0x84
+
+# Ethereal dragon
+R:676:0x03/0x84
+
+# Dark young of Shub-Niggurath
+R:677:0x05/0x95
+
+# Colour out of space
+R:678:0x0A/0xB5
+
+# Quaker, Master of Earth
+R:679:0x07/0x85
+
+# Death leprechaun
+R:680:0x08/0xA2
+
+# Chaugnar Faugn, Horror from the Hills
+R:681:0x08/0xAB
+
+# Lloigor
+R:682:0x0E/0xB0
+
+# Utgard-Loke
+R:683:0x0A/0x90
+
+# Quachil Uttaus, Treader of the Dust
+R:684:0x08/0xB4
+
+# Shoggoth
+R:685:0x08/0xA4
+
+# Judge Death
+R:686:0x08/0x97
+
+# Ariel, Queen of Air
+R:687:0x0E/0x85
+
+# 11-headed hydra
+R:688:0x0C/0x8D
+
+# Patriarch
+R:689:0x0D/0xAA
+
+# Dreadmaster
+R:690:0x0B/0x87
+
+# Drolem
+R:691:0x05/0xA1
+
+# Scatha the Worm
+R:692:0x09/0x84
+
+# Warrior of the Dawn
+R:693:0x0C/0xAA
+
+# Lesser black reaver
+R:694:0x08/0x8C
+
+# Zoth-Ommog
+R:695:0x0A/0x92
+
+# Grand master thief
+R:696:0x06/0xAA
+
+# Smaug the Golden
+R:697:0x0C/0x84
+
+# The Stormbringer
+R:698:0x08/0xDC
+
+# Knight Templar
+R:699:0x01/0xAA
+
+# Leprechaun fanatic
+R:700:0x04/0xA2
+
+# Dracolich
+R:701:0x0D/0x84
+
+# Greater titan
+R:702:0x03/0x90
+
+# Dracolisk
+R:703:0x0C/0x84
+
+# Winged Horror
+R:704:0x08/0x82
+
+# Spectral tyrannosaur
+R:705:0x0D/0x92
+
+# Yibb-Tstll, the Patient One
+R:706:0x08/0x90
+
+# Ghatanothoa
+R:707:0x08/0xB0
+
+# Ent
+R:708:0x0D/0xCC
+
+# Hru
+R:709:0x02/0x90
+
+# Itangast the Fire Drake
+R:710:0x0C/0x84
+
+# Death mold
+R:711:0x08/0xA7
+
+# Fafner the Dragon
+R:712:0x0D/0x84
+
+# Charon, Boatman of the Styx
+R:713:0x0E/0x97
+
+# Quickbeam, the Ent
+R:714:0x0D/0xCC
+
+# Glaurung, Father of the Dragons
+R:715:0x0C/0x84
+
+# Behemoth
+R:716:0x0E/0x88
+
+# Garm, Guardian of Hel
+R:717:0x06/0x83
+
+# Greater wall monster
+R:718:0x09/0xBC
+
+# Nycadaemon
+R:719:0x03/0x95
+
+# Barbazu
+R:720:0x0D/0x95
+
+# Goat of Mendes
+R:721:0x08/0xAB
+
+# Nightwing
+R:722:0x08/0x97
+
+# Maulotaur
+R:723:0x02/0x88
+
+# Nether hound
+R:724:0x0D/0x9A
+
+# Time hound
+R:725:0x0E/0x9A
+
+# Plasma hound
+R:726:0x0C/0x9A
+
+# Demonic quylthulg
+R:727:0x04/0x91
+
+# Great Storm Wyrm
+R:728:0x06/0x84
+
+# Ulik the Troll
+R:729:0x0A/0x94
+
+# Baphomet the Minotaur Lord
+R:730:0x0A/0x88
+
+# Hell knight
+R:731:0x08/0xAA
+
+# Bull Gates
+R:732:0x08/0xAA
+
+# Santa Claus
+R:733:0x04/0xA2
+
+# Eihort, the Thing in the Labyrinth
+R:734:0x0C/0xA4
+
+# The King in Yellow
+R:735:0x0B/0x8C
+
+# Great unclean one
+R:736:0x05/0x95
+
+# Lord of Chaos
+R:737:0x0A/0xAA
+
+# Old Sorcerer
+R:738:0x0C/0xAA
+
+# Ethereal hound
+R:739:0x0D/0x9A
+
+# Lesser kraken
+R:740:0x0D/0x7E
+
+# Great Ice Wyrm
+R:741:0x01/0x84
+
+# Demilich
+R:742:0x0F/0x8C
+
+# The Phoenix
+R:743:0x04/0x82
+
+# Nightcrawler
+R:744:0x08/0x97
+
+# Lord of Change
+R:745:0x0A/0x95
+
+# Keeper of Secrets
+R:746:0x0D/0x88
+
+# Shudde M'ell
+R:747:0x02/0xB1
+
+# Hand druj
+R:748:0x0B/0xAD
+
+# Eye druj
+R:749:0x04/0xAD
+
+# Skull druj
+R:750:0x03/0xAD
+
+# Chaos vortex
+R:751:0x0A/0xB0
+
+# Aether vortex
+R:752:0x0A/0xB0
+
+# Nidhogg, the Hel-Drake
+R:753:0x08/0x84
+
+# The Lernaean Hydra
+R:754:0x0A/0x8D
+
+# Thuringwethil, the Vampire Messenger
+R:755:0x0A/0x96
+
+# Great Hell Wyrm
+R:756:0x04/0x84
+
+# Hastur the Unspeakable
+R:757:0x06/0x88
+
+# Bloodthirster
+R:758:0x04/0x95
+
+# Draconic quylthulg
+R:759:0x05/0x91
+
+# Nyogtha, the Thing that Should not Be
+R:760:0x08/0xA4
+
+# Ahtu, Avatar of Nyarlathotep
+R:761:0x08/0xBC
+
+# Fundin Bluecloak
+R:762:0x0E/0xA2
+
+# Bile Demon
+R:763:0x0C/0x95
+
+# Uriel, Angel of Fire
+R:764:0x0C/0x81
+
+# Azriel, Angel of Death
+R:765:0x08/0x81
+
+# Ancalagon the Black
+R:766:0x08/0x84
+
+# Daoloth, the Render of the Veils
+R:767:0x02/0x95
+
+# Nightwalker
+R:768:0x08/0x97
+
+# Gabriel, the Messenger
+R:769:0x01/0x81
+
+# Artsi, the Champion of Chaos
+R:770:0x0A/0xA2
+
+# Saruman of Many Colours
+R:771:0x0A/0xAA
+
+# Harowen the Black Hand
+R:772:0x0E/0xAA
+
+# Osyluth
+R:773:0x09/0x95
+
+# Dreadlord
+R:774:0x04/0x87
+
+# Greater kraken
+R:775:0x0D/0x7E
+
+# Archlich
+R:776:0x0E/0x8C
+
+# The Cat Lord
+R:777:0x0A/0xA0
+
+# Jabberwock
+R:778:0x0A/0x88
+
+# Chaos hound
+R:779:0x0A/0x9A
+
+# Vlad Dracula, Prince of Darkness
+R:780:0x08/0x96
+
+# Beholder hive-mother
+R:781:0x0B/0x9F
+
+# Leviathan
+R:782:0x0A/0x7E
+
+# Great Wyrm of Chaos
+R:783:0x0A/0x84
+
+# Great Wyrm of Law
+R:784:0x0E/0x84
+
+# Great Wyrm of Balance
+R:785:0x0A/0x84
+
+# Shambler
+R:786:0x09/0x85
+
+# Gelugon
+R:787:0x01/0x95
+
+# Glaaki
+R:788:0x0A/0x7E
+
+# Trone, the Rebel Thunderlord
+R:789:0x08/0x82
+
+# Great Wyrm of Many Colours
+R:790:0x0A/0x84
+
+# Marda, rider of gold Laronth
+R:791:0x0B/0x82
+
+# Tselakus, the Dreadlord
+R:792:0x0C/0x87
+
+# Sky Drake
+R:793:0x0E/0x84
+
+# Eilinel the Entrapped
+R:794:0x08/0xAA
+
+# Horned Reaper
+R:795:0x0E/0x95
+
+# The Norsa
+R:796:0x0E/0x88
+
+# Rhan-Tegoth
+R:797:0x06/0x93
+
+# Black reaver
+R:798:0x08/0x8C
+
+# Master mindcrafter
+R:799:0x0B/0xAA
+
+# Greater demonic quylthulg
+R:800:0x0C/0x91
+
+# Greater draconic quylthulg
+R:801:0x0D/0x91
+
+# Greater rotting quylthulg
+R:802:0x0F/0x91
+
+# Null, the Living Void
+R:803:0x00/0xB5
+
+# Feagwath, the Undead Sorcerer
+R:804:0x0B/0x8C
+
+# Omarax the Eye Tyrant
+R:805:0x0A/0x9F
+
+# Tsathoggua, the Sleeper of N'kai
+R:806:0x08/0x92
+
+# Greater Balrog
+R:807:0x0A/0x95
+
+# Ungoliant, the Unlight
+R:808:0x08/0x93
+
+# Atlach-Nacha, the Spider God
+R:809:0x08/0x93
+
+# Y'golonac
+R:810:0x0C/0x88
+
+# Aether hound
+R:811:0x0A/0x9A
+
+# Pit Fiend
+R:812:0x03/0x95
+
+# The Serpent of Chaos
+R:813:0x0A/0x8A
+
+# Yig, Father of Serpents
+R:814:0x06/0x8A
+
+# Unmaker
+R:815:0x0A/0x85
+
+# Cyberdemon
+R:816:0x07/0x95
+
+# Hela, Queen of the Dead
+R:817:0x0D/0xAA
+
+# The Mouth of Sauron
+R:818:0x0A/0xAA
+
+# The Necromancer of Dol Guldur
+R:819:0x0A/0xAA
+
+# Lisa, rider of gold Romth
+R:820:0x0B/0x82
+
+# Master quylthulg
+R:821:0x0E/0x91
+
+# Qlzqqlzuup, the Lord of Flesh
+R:822:0x0A/0x91
+
+# Cthugha, the Living Flame
+R:823:0x0C/0x85
+
+# Flare, rider of bronze Moonth
+R:824:0x0F/0x82
+
+# Maeglin, the Traitor of Gondolin
+R:825:0x08/0xA2
+
+# Cyaegha
+R:826:0x0D/0x9F
+
+# Pazuzu, Lord of Air
+R:827:0x06/0x95
+
+# Ithaqua the Windwalker
+R:828:0x0E/0x99
+
+# Greater Hellhound
+R:829:0x04/0x83
+
+# Cantoras, the Skeletal Lord
+R:830:0x0A/0xAD
+
+# Mephistopheles, Lord of Hell
+R:831:0x04/0x95
+
+# Godzilla
+R:832:0x0A/0x92
+
+# Abhoth, Source of Uncleanness
+R:833:0x0D/0xA4
+
+# Ymir, the Ice Giant
+R:834:0x01/0x90
+
+# Loki, the Trickster
+R:835:0x08/0x90
+
+# Star-spawn of Cthulhu
+R:836:0x0D/0x95
+
+# Surtur, the Fire Giant
+R:837:0x04/0x90
+
+# The Tarrasque
+R:838:0x0A/0x92
+
+# Lungorthin, the Balrog of White Fire
+R:839:0x0A/0x95
+
+# Draugluin, Sire of All Werewolves
+R:840:0x0A/0x83
+
+# Shuma-Gorath
+R:841:0x0D/0x9F
+
+# Tulzscha, the Green Flame
+R:842:0x0D/0x85
+
+# Oremorj, the Cyberdemon Lord
+R:843:0x07/0x95
+
+# Vecna, the Emperor Lich
+R:844:0x0A/0x8C
+
+# Yog-Sothoth, the All-in-One
+R:845:0x0A/0xA4
+
+# Fenris Wolf
+R:846:0x08/0x83
+
+# Great Wyrm of Power
+R:847:0x0A/0x84
+
+# Shub-Niggurath, Black Goat of the Woods
+R:848:0x08/0x95
+
+# Nodens, Lord of the Great Abyss
+R:849:0x09/0x90
+
+# Carcharoth, the Jaws of Thirst
+R:850:0x08/0x83
+
+# Nyarlathotep, the Crawling Chaos
+R:851:0x04/0x95
+
+# Azathoth, the Daemon Sultan
+R:852:0x0E/0x85
+
+# Huan, Wolfhound of the Valar
+R:853:0x09/0x83
+
+# Jormungand the Midgard Serpent
+R:854:0x0A/0x8A
+
+# The Destroyer
+R:855:0x0A/0xA1
+
+# Gothmog, the High Captain of Balrogs
+R:856:0x0A/0x95
+
+# Great Cthulhu
+R:857:0x05/0x95
+
+# Sarko, rider of gold Foronth
+R:858:0x0B/0x82
+
+# The Unicorn of Order
+R:859:0x01/0xAB
+
+# Sauron, the Sorcerer
+R:860:0x0A/0xAA
+
+# DarkGod, the Mighty Coder of Hell
+R:861:0x0E/0x90
+
+# Morgoth, Lord of Darkness
+R:862:0x08/0x90
+
+# Human Warrior
+R:863:0x07/0xAA
+
+# Elven archer
+R:864:0x09/0xA2
+
+# Dwarven warrior
+R:865:0x0F/0xA2
+
+# Elite uruk
+R:866:0x01/0xA9
+
+# The Philosophy Teacher
+R:867:0x04/0xAA
+
+# The Variant Maintainer
+R:868:0x0E/0xAA
+
+# Random Number Generator
+R:869:0x06/0x89
+
+# Rocket mine
+R:870:0x0C/0xB5
+
+# Bouncing mine
+R:871:0x0E/0xB5
+
+# Durin's Bane
+R:872:0x0A/0x95
+
+# The Icky Queen
+R:873:0x0A/0xA3
+
+# Rot jelly
+R:874:0x07/0xA4
+
+# Death
+R:875:0x08/0x87
+
+# Famine
+R:876:0x0F/0x87
+
+# Pestilence
+R:877:0x0D/0x87
+
+# War
+R:878:0x04/0x87
+
+# Pike
+R:879:0x02/0x7E
+
+# Electric eel
+R:880:0x0E/0x8A
+
+# Giant crayfish
+R:881:0x0C/0x7E
+
+# Mermaid
+R:882:0x0D/0xA2
+
+# Box jellyfish
+R:883:0x0E/0x7E
+
+# Giant piranha
+R:884:0x05/0x7E
+
+# Piranha
+R:885:0x05/0x7E
+
+# Bullywug
+R:886:0x05/0xA2
+
+# Bullywug warrior
+R:887:0x05/0xA2
+
+# Bullywug shaman
+R:888:0x05/0xA2
+
+# Whale
+R:889:0x0D/0x7E
+
+# Sand mite
+R:890:0x0E/0x7E
+
+# Octopus
+R:891:0x05/0x7E
+
+# Giant octopus
+R:892:0x05/0x7E
+
+# Eye of the deep
+R:893:0x06/0x9F
+
+# Murk dweller
+R:894:0x02/0x93
+
+# Drowned soul
+R:895:0x0E/0x87
+
+# Tiger shark
+R:896:0x05/0x7E
+
+# Hammerhead shark
+R:897:0x05/0x7E
+
+# Great white shark
+R:898:0x01/0x7E
+
+# Aquatic golem
+R:899:0x06/0xA1
+
+# Aquatic kobold
+R:900:0x0E/0xA5
+
+# White shark
+R:901:0x09/0x7E
+
+# Scrag
+R:902:0x0E/0x94
+
+# Jaws
+R:903:0x01/0x7E
+
+# Aquatic elf
+R:904:0x06/0xA2
+
+# Aquatic elven warrior
+R:905:0x06/0xA2
+
+# Aquatic elven shaman
+R:906:0x06/0xA2
+
+# Stargazer
+R:907:0x0B/0x7E
+
+# Elder stargazer
+R:908:0x0B/0x7E
+
+# Flounder
+R:909:0x02/0x7E
+
+# Giant turtle
+R:910:0x0D/0x92
+
+# Baby dragon turtle
+R:911:0x09/0x9E
+
+# Young dragon turtle
+R:912:0x09/0x9E
+
+# Mature dragon turtle
+R:913:0x09/0x9E
+
+# Ancient dragon turtle
+R:914:0x09/0x84
+
+# Fastitocalon
+R:915:0x05/0x84
+
+# Undead stargazer
+R:916:0x0B/0x7E
+
+# Killer whale
+R:917:0x01/0x7E
+
+# Merrow
+R:918:0x0E/0x8F
+
+# Water naga
+R:919:0x0E/0xA8
+
+# Devilfish
+R:920:0x02/0x7E
+
+# Undead devilfish
+R:921:0x08/0x7E
+
+# Moby Dick, the White Whale
+R:922:0x01/0x7E
+
+# Aquatic hound
+R:923:0x0E/0x9A
+
+# Water demon
+R:924:0x0E/0x95
+
+# Ixitxachitl
+R:925:0x02/0x7E
+
+# Ixitxachitl priest
+R:926:0x02/0x7E
+
+# Vampiric ixitxachitl
+R:927:0x08/0x7E
+
+# Mathilde, the Science Student
+R:928:0x0B/0xA2
+
+# Child spirit
+R:929:0x09/0x87
+
+# Young spirit
+R:930:0x09/0x87
+
+# Mature spirit
+R:931:0x09/0x87
+
+# Experienced spirit
+R:932:0x09/0x87
+
+# Wise spirit
+R:933:0x09/0x87
+
+# Fangorn the Treebeard, Lord of the Ents
+R:934:0x0D/0xCC
+
+# Gandalf the Grey
+R:935:0x02/0xAA
+
+# Nar, the Dwarf
+R:936:0x0B/0xA2
+
+# Novice mindcrafter
+R:937:0x0B/0xAA
+
+# Great Swamp Wyrm
+R:938:0x05/0x84
+
+# Great Bile Wyrm
+R:939:0x02/0x84
+
+# Blue Firebird
+R:940:0x0E/0x82
+
+# Green Firebird
+R:941:0x0D/0x82
+
+# Brown Firebird
+R:942:0x07/0x82
+
+# Bronze Firebird
+R:943:0x0F/0x82
+
+# Gold Firebird
+R:944:0x0B/0x82
+
+# High-elven ranger
+R:945:0x0D/0xA2
+
+# Uvatha the Horseman
+R:946:0x08/0x97
+
+# Adunaphel the Quiet
+R:947:0x08/0x97
+
+# Akhorahil the Blind
+R:948:0x08/0x97
+
+# Ren the Unclean
+R:949:0x08/0x97
+
+# Ji Indur Dawndeath
+R:950:0x08/0x97
+
+# Dwar, Dog Lord of Waw
+R:951:0x08/0x97
+
+# Hoarmurath of Dir
+R:952:0x08/0x97
+
+# Khamul, the Black Easterling
+R:953:0x08/0x97
+
+# The Witch-King of Angmar
+R:954:0x08/0x97
+
+# Green Thunderlord
+R:955:0x05/0x82
+
+# Blue Thunderlord
+R:956:0x06/0x82
+
+# Brown Thunderlord
+R:957:0x07/0x82
+
+# Bronze Thunderlord
+R:958:0x0F/0x82
+
+# Gold Thunderlord
+R:959:0x0B/0x82
+
+# Blood Sprout
+R:960:0x05/0xEE
+
+# Gorlim, Betrayer of Barahir
+R:961:0x02/0xAA
+
+# The Blubbering idiot, agent of black market, Simon the weak
+R:962:0x09/0xAE
+
+# Aranea
+R:963:0x04/0x93
+
+# Elder aranea
+R:964:0x0A/0x93
+
+# Giant brown tick
+R:965:0x07/0x93
+
+# Wavelord
+R:966:0x06/0xAA
+
+# Novice possessor (soul)
+R:967:0x08/0x87
+
+# Bat of Gorgoroth
+R:968:0x05/0x9C
+
+# The Princess
+R:969:0x0B/0xAA
+
+# Merton Proudfoot, the lost hobbit
+R:970:0x0A/0xA2
+
+# The Wight-King of the Barrow-downs
+R:971:0x0A/0x97
+
+# Adventurer
+R:972:0x0F/0x80
+
+# Experienced possessor (soul)
+R:973:0x08/0x87
+
+# Old possessor (soul)
+R:974:0x08/0x87
+
+# Death orb
+R:975:0x08/0x85
+
+# Bronze dragon worm
+R:976:0x0F/0xB1
+
+# Gold dragon worm
+R:977:0x0B/0xB1
+
+# Moldoux, the Defenceless Mold
+R:978:0x0A/0xA7
+
+# The Physics Teacher
+R:979:0x01/0xAA
+
+# Ar-Pharazon the Golden
+R:980:0x0B/0xAA
+
+# Doppelganger
+R:981:0x01/0x80
+
+# Marylene, Heartbreakeress of the Netherworld
+R:982:0x09/0x90
+
+# The Greater Lag Monster
+R:983:0x0A/0x95
+
+# Hrungnir, the Stone Giant
+R:984:0x09/0x90
+
+# Bullroarer the Hobbit
+R:985:0x0F/0xA2
+
+# 3-headed hydra
+R:986:0x03/0x8D
+
+# Uldor the Accursed
+R:987:0x0F/0xAA
+
+# Mystic
+R:988:0x03/0xAA
+
+# Elder vampire
+R:989:0x04/0x96
+
+# Ulfang the Black
+R:990:0x0F/0xAA
+
+# Demonologist
+R:991:0x0C/0xAA
+
+# Hezrou
+R:992:0x05/0x95
+
+# Glabrezu
+R:993:0x0F/0x95
+
+# Nalfeshnee
+R:994:0x04/0x95
+
+# Marilith
+R:995:0x0B/0x95
+
+# Lesser Balrog
+R:996:0x0A/0x95
+
+# Master mystic
+R:997:0x03/0xAA
+
+# Grand master mystic
+R:998:0x03/0xAA
+
+# Erinyes
+R:999:0x07/0x95
+
+# Novice mindcrafter
+R:1000:0x0B/0xAA
+
+# Polyphemus, the Blind Cyclops
+R:1001:0x05/0x90
+
+# Great Wyrm of Perplexity
+R:1002:0x0F/0x84
+
+# Hound of Tindalos
+R:1003:0x02/0x9A
+
+# Great Wyrm of Thunder
+R:1004:0x0B/0x84
+
+# Silver mouse
+R:1005:0x09/0xAC
+
+# The Rat King
+R:1006:0x0A/0xAC
+
+# Vort the Kobold Queen
+R:1007:0x0A/0xA5
+
+# Giant black louse
+R:1008:0x08/0x89
+
+# Fire Phantom
+R:1009:0x04/0x87
+
+# The Insane Player
+R:1010:0x0A/0xAA
+
+# Glaryssa, Succubus Queen
+R:1011:0x09/0x95
+
+# Vermicious Knid
+R:1012:0x02/0xA4
+
+# Bone golem
+R:1013:0x01/0xA1
+
+# Snake of Yig
+R:1014:0x06/0x8A
+
+# Bronze golem
+R:1015:0x03/0xA1
+
+# Dimensional shambler
+R:1016:0x0E/0xA2
+
+# Cultist
+R:1017:0x0D/0xAA
+
+# Cult leader
+R:1018:0x0D/0xAA
+
+# Servitor of the outer gods
+R:1019:0x0B/0x88
+
+# Avatar of Nyarlathotep
+R:1020:0x0C/0xAA
+
+# Thiazi, the Storm Giant
+R:1021:0x0E/0x90
+
+# Hypnos, Lord of Sleep
+R:1022:0x0D/0xAA
+
+# Blue dragon worm
+R:1023:0x0E/0xB1
+
+# White dragon worm
+R:1024:0x09/0xB1
+
+# Green dragon worm
+R:1025:0x0D/0xB1
+
+# Black dragon worm
+R:1026:0x02/0xB1
+
+# Red dragon worm
+R:1027:0x0C/0xB1
+
+# Multi-hued dragon worm
+R:1028:0x0A/0xB1
+
+# The Minotaur of the Labyrinth
+R:1029:0x02/0x88
+
+# The Sandworm Queen
+R:1030:0x0A/0xB1
+
+# Sandworm
+R:1031:0x0B/0xB1
+
+# Tik'srvzllat
+R:1032:0x0A/0x87
+
+# The Glass Golem
+R:1033:0x09/0xBC
+
+# The White Balrog
+R:1034:0x09/0x95
+
+# Golgarach, the Living Rock
+R:1035:0x09/0xBC
+
+# Atlas, the Titan
+R:1036:0x02/0x90
+
+# Kronos, Lord of the Titans
+R:1037:0x0A/0x90
+
+# Water hound
+R:1038:0x04/0x9A
+
+# Improv, the mighty MoLD
+R:1039:0x0A/0xA7
+
+# Emperor Mimic
+R:1040:0x0B/0xA7
+
+# Melinda Proudfoot
+R:1041:0x0A/0xA2
+
+# Thrain, the King Under the Mountain
+R:1042:0x0E/0xA2
+
+# Fire golem
+R:1043:0x04/0xA1
+
+# Melkor, Lord of Darkness
+R:1044:0x0A/0x87
+
+# Spirit
+R:1045:0x0A/0x87
+
+# Spirit
+R:1046:0x0E/0x87
+
+# Spirit
+R:1047:0x0E/0x87
+
+# Spirit
+R:1048:0x0A/0x87
+
+# Spirit
+R:1049:0x0F/0x87
+
+# Spirit
+R:1050:0x0A/0x87
+
+# Spirit
+R:1051:0x05/0x87
+
+# Spirit
+R:1052:0x0A/0x87
+
+# Spirit
+R:1053:0x09/0xB5
+
+# Spirit
+R:1054:0x05/0x87
+
+# Spirit
+R:1055:0x09/0x87
+
+# Spirit
+R:1056:0x00/0x87
+
+# Spirit
+R:1057:0x07/0x87
+
+# Spirit
+R:1058:0x04/0x87
+
+# Spirit
+R:1059:0x0D/0x87
+
+# Spirit
+R:1060:0x09/0x87
+
+# Spirit
+R:1061:0x02/0x87
+
+# Spirit
+R:1062:0x06/0x87
+
+# Spirit
+R:1063:0x04/0x87
+
+# Spirit
+R:1064:0x01/0x87
+
+# Spirit
+R:1065:0x02/0x87
+
+# Spirit
+R:1066:0x06/0x87
+
+# Spirit
+R:1067:0x0A/0x87
+
+# Spirit
+R:1068:0x00/0x87
+
+# Spirit
+R:1069:0x09/0x87
+
+# Spirit
+R:1070:0x0A/0x87
+
+# Spirit
+R:1071:0x0D/0x87
+
+# Spirit
+R:1072:0x0B/0x87
+
+# Spirit
+R:1073:0x08/0x87
+
+# Spirit
+R:1074:0x03/0x87
+
+# Spirit
+R:1075:0x0A/0x87
+
+
diff --git a/lib/mods/theme/pref/graf-iso.prf b/lib/mods/theme/pref/graf-iso.prf
new file mode 100644
index 00000000..eaf26901
--- /dev/null
+++ b/lib/mods/theme/pref/graf-iso.prf
@@ -0,0 +1,5963 @@
+# File: graf-iso.prf
+
+#
+# This file defines special attr/char mappings for use in "graphics" mode
+# with the isometric view.
+#
+# By Hansjoerg Malthaner < hansjoerg.malthaner@gmx.de >
+#
+# See "lib/help/command.txt" and "src/files.c" for more information.
+#
+
+
+# Scrolls (?)
+S:0xD0:0x80/0xBF
+S:0xD1:0x80/0xBF
+S:0xD2:0x80/0xBF
+S:0xD3:0x80/0xBF
+S:0xD4:0x80/0xBF
+S:0xD5:0x80/0xBF
+S:0xD6:0x80/0xBF
+S:0xD7:0x80/0xBF
+S:0xD8:0x80/0xBF
+S:0xD9:0x80/0xBF
+S:0xDA:0x80/0xBF
+S:0xDB:0x80/0xBF
+S:0xDC:0x80/0xBF
+S:0xDD:0x80/0xBF
+S:0xDE:0x80/0xBF
+S:0xDF:0x80/0xBF
+
+# Potions (!)
+S:0xE0:0x81/0x68
+S:0xE1:0x81/0x69
+S:0xE2:0x81/0x6A
+S:0xE3:0x81/0x6B
+S:0xE4:0x81/0x6C
+S:0xE5:0x81/0x6D
+S:0xE6:0x81/0x6E
+S:0xE7:0x81/0x6F
+S:0xE8:0x81/0x68
+S:0xE9:0x81/0x69
+S:0xEA:0x81/0x6A
+S:0xEB:0x81/0x6B
+S:0xEC:0x81/0x6C
+S:0xED:0x81/0x6D
+S:0xEE:0x81/0x6E
+S:0xEF:0x81/0x6F
+
+
+# Food (,)
+S:0xF0:0x90/0x92
+S:0xF1:0x90/0x92
+S:0xF2:0x90/0x92
+S:0xF3:0x90/0x92
+S:0xF4:0x90/0x92
+S:0xF5:0x90/0x92
+S:0xF6:0x90/0x92
+S:0xF7:0x90/0x92
+S:0xF8:0x90/0x92
+S:0xF9:0x90/0x92
+S:0xFA:0x90/0x92
+S:0xFB:0x90/0x92
+S:0xFC:0x90/0x92
+S:0xFD:0x90/0x92
+S:0xFE:0x90/0x92
+S:0xFF:0x90/0x92
+
+
+# Spells (*)
+S:48:0x82/0x60
+S:49:0x82/0x61
+S:50:0x82/0x62
+S:51:0x82/0x63
+S:52:0x82/0x64
+S:53:0x82/0x65
+S:54:0x82/0x66
+S:55:0x82/0x67
+S:56:0x82/0x60
+S:57:0x82/0x61
+S:58:0x82/0x62
+S:59:0x82/0x63
+S:60:0x82/0x64
+S:61:0x82/0x65
+S:62:0x82/0x66
+S:63:0x82/0x67
+
+# Spells (|)
+S:64:0x82/0x40
+S:65:0x82/0x44
+S:66:0x82/0x48
+S:67:0x82/0x4C
+S:68:0x82/0x50
+S:69:0x82/0x54
+S:70:0x82/0x58
+S:71:0x82/0x5C
+S:72:0x82/0x40
+S:73:0x82/0x44
+S:74:0x82/0x48
+S:75:0x82/0x4C
+S:76:0x82/0x50
+S:77:0x82/0x54
+S:78:0x82/0x58
+S:79:0x82/0x5C
+
+# Spells (-)
+S:80:0x82/0x41
+S:81:0x82/0x45
+S:82:0x82/0x49
+S:83:0x82/0x4D
+S:84:0x82/0x51
+S:85:0x82/0x55
+S:86:0x82/0x59
+S:87:0x82/0x5D
+S:88:0x82/0x41
+S:89:0x82/0x45
+S:90:0x82/0x49
+S:91:0x82/0x4D
+S:92:0x82/0x51
+S:93:0x82/0x55
+S:94:0x82/0x59
+S:95:0x82/0x5D
+
+# Spells (/)
+S:96:0x82/0x42
+S:97:0x82/0x46
+S:98:0x82/0x4A
+S:99:0x82/0x4E
+S:100:0x82/0x52
+S:101:0x82/0x56
+S:102:0x82/0x5A
+S:103:0x82/0x5D
+S:104:0x82/0x42
+S:105:0x82/0x46
+S:106:0x82/0x4A
+S:107:0x82/0x4D
+S:108:0x82/0x52
+S:109:0x82/0x56
+S:110:0x82/0x5A
+S:111:0x82/0x5D
+
+# Spells (\)
+S:112:0x82/0x43
+S:113:0x82/0x47
+S:114:0x82/0x4B
+S:115:0x82/0x4F
+S:116:0x82/0x53
+S:117:0x82/0x57
+S:118:0x82/0x5B
+S:119:0x82/0x5F
+S:120:0x82/0x43
+S:121:0x82/0x47
+S:122:0x82/0x4B
+S:123:0x82/0x4F
+S:124:0x82/0x53
+S:125:0x82/0x57
+S:126:0x82/0x5B
+S:127:0x82/0x5F
+
+
+# Feature attr/char definitions
+
+# nothing
+F:0:0x80:0xA0
+
+# open floor
+F:1:0x82:0xBC
+
+# fountain
+F:2:0x81:0x8D
+
+# glyph of warding
+F:3:0x80:0xBB
+
+# open door
+F:4:0x80:0xA7
+
+# broken door
+F:5:0x80:0xA7
+
+# up staircase
+F:6:0x80:0xBC
+
+# down staircase
+F:7:0x80:0xBE
+
+# quest entrance
+F:8:0x80:0xBE
+
+# quest exit
+F:9:0x80:0xBC
+
+# quest down level
+F:10:0x80:0xBE
+
+# quest up level
+F:11:0x80:0xBC
+
+# town exit
+F:12:0x80:0xBE
+
+# shaft down
+F:13:0x80:0xBE
+
+# shaft up
+F:14:0x80:0xBC
+
+# fountain
+F:15:0x81:0x8D
+
+# door
+F:32:0x80:0xAB
+
+# locked door
+F:33:0x80:0xAB
+
+# locked door
+F:34:0x80:0xAB
+
+# locked door
+F:35:0x80:0xAB
+
+# locked door
+F:36:0x80:0xAB
+
+# locked door
+F:37:0x80:0xAB
+
+# locked door
+F:38:0x80:0xAB
+
+# locked door
+F:39:0x80:0xAB
+
+# jammed door
+F:40:0x80:0xAB
+
+# jammed door
+F:41:0x80:0xAB
+
+# jammed door
+F:42:0x80:0xAB
+
+# jammed door
+F:43:0x80:0xAB
+
+# jammed door
+F:44:0x80:0xAB
+
+# jammed door
+F:45:0x80:0xAB
+
+# jammed door
+F:46:0x80:0xAB
+
+# jammed door
+F:47:0x80:0xAB
+
+# secret door
+F:48:0x80:0xA3
+
+# pile of rubble
+F:49:0x80:0xBA
+
+# magma vein
+F:50:0x80:0xA5
+
+# quartz vein
+F:51:0x81:0xF3
+
+# magma vein
+F:52:0x81:0xF3
+
+# quartz vein
+F:53:0x81:0xF3
+
+# magma vein with treasure
+F:54:0x80:0xAA
+
+# quartz vein with treasure
+F:55:0x80:0xAA
+
+# granite wall
+F:56:0x81:0xF0
+
+# granite wall
+F:57:0x81:0xF0
+
+# granite wall
+F:58:0x81:0xF0
+
+# granite wall
+F:59:0x81:0xF0
+
+# permanent wall
+F:60:0x81:0xF3
+
+# permanent wall
+F:61:0x81:0xF3
+
+# permanent wall
+F:62:0x81:0xF3
+
+# permanent wall
+F:63:0x81:0xF3
+
+# explosive rune
+F:64:0x80:0xAA
+
+# Straight Road startpoint
+F:65:0x80:0xAA
+
+# section of the Straight Road
+F:66:0x80:0xAA
+
+# section of the Straight Road
+F:67:0x80:0xAA
+
+# section of the Straight Road
+F:68:0x80:0xAA
+
+# section of the Straight Road
+F:69:0x80:0xAA
+
+# section of the Straight Road
+F:70:0x80:0xAA
+
+# section of the Straight Road (discharged)
+F:71:0x80:0xAA
+
+# Straight Road exit
+F:72:0x80:0xAA
+
+# corrupted section of the Straight Road
+F:73:0x80:0xAA
+
+# General Store
+B:0:0x80:0xB0
+
+# Armoury
+B:1:0x80:0xB1
+
+# Weapon Smiths
+B:2:0x80:0xB2
+
+# Temple
+B:3:0x80:0xB3
+
+# Alchemy Shop
+B:4:0x80:0xB4
+
+# Magic Shop
+B:5:0x80:0xB5
+
+# Black Market
+B:6:0x80:0xB6
+
+# Home
+B:7:0x80:0xB7
+
+# Bookstore
+B:8:0x80:0xB8
+
+# Pet shop
+B:9:0x80:0xAB
+
+# Mayors office
+B:10:0x80:0xAB
+
+# Inn
+B:11:0x80:0xAB
+
+# The Soothsayer
+B:12:0x80:0xAB
+
+# The library
+B:13:0x80:0xAB
+
+B:14:0x80:0xAB
+B:15:0x80:0xAB
+B:16:0x80:0xAB
+B:17:0x80:0xAB
+B:18:0x80:0xAB
+B:19:0x80:0xAB
+B:20:0x80:0xAB
+B:21:0x80:0xAB
+B:22:0x80:0xAB
+B:23:0x80:0xAB
+B:24:0x80:0xAB
+B:25:0x80:0xAB
+B:26:0x80:0xAB
+B:27:0x80:0xAB
+B:28:0x80:0xAB
+B:29:0x80:0xAB
+B:30:0x80:0xAB
+B:31:0x80:0xAB
+B:32:0x80:0xAB
+B:33:0x80:0xAB
+B:34:0x80:0xAB
+B:35:0x80:0xAB
+B:36:0x80:0xAB
+B:37:0x80:0xAB
+
+# Building
+F:74:0x80:0xB1
+
+# permanent wall
+F:75:0x80:0xA3
+
+# permanent wall
+F:76:0x80:0xA3
+
+# permanent wall
+F:77:0x80:0xA3
+
+# permanent wall
+F:78:0x80:0xA3
+
+# Deep water
+F:83:0xCB:0x81
+
+# stream of shallow water
+F:84:0x82:0xEB
+
+# pool of deep lava
+F:85:0x80:0xA3
+
+# stream of shallow lava
+F:86:0x80:0xA3
+
+# dark pit
+F:87:0x83:0x8B
+
+# dirt
+F:88:0x82:0xF3
+
+# patch of grass
+F:89:0x82:0xE8
+
+# ice
+F:90:0x80:0xAE
+
+# sand
+F:91:0x80:0xAE
+
+# dead tree
+F:92:0x80:0xA3
+
+# ash
+F:93:0x80:0xAE
+
+# mud
+F:94:0x80:0xAE
+
+# ice wall
+F:95:0x80:0x80
+
+# tree
+F:96:0x83:0x88
+
+# mountain chain
+F:97:0x81:0x9D
+
+# sandwall
+F:98:0x80:0xA3
+
+# sandwall
+F:99:0x80:0xA5
+
+# sandwall with treasure
+F:100:0x80:0xAA
+
+# high mountain chain
+F:101:0x80:0xDE
+
+# nether mist
+F:102:0x80:0x80
+
+# molten glass wall
+F:103:0x80:0xAE
+
+# Between gate
+F:160:0x81:0x8C
+
+# Altar of Forests
+F:161:0x81:0x94
+
+# Altar of Water
+F:162:0x81:0x94
+
+# Altar of Earth
+F:163:0x81:0x94
+
+# Altar of Darkness
+F:164:0x81:0x94
+
+# Altar of Moon
+F:165:0x81:0x94
+
+# Altar of Sun
+F:166:0x81:0x94
+
+# Altar of Rage
+F:167:0x81:0x94
+
+# Altar of Winds
+F:168:0x81:0x94
+
+# Altar of Stars
+F:169:0x81:0x94
+
+# Altar of Being
+F:170:0x81:0x94
+
+# Altar of Randomness
+F:171:0x81:0x94
+
+# pool of deep water
+F:187:0x82:0xF0
+
+# glass wall
+F:188:0x80:0xAE
+
+# illusion wall
+F:189:0x80:0xA3
+
+# Grass roof
+F:190:0x82:0xF6
+
+# grass roof top
+F:191:0x82:0xFE
+
+# grass roof chimney
+F:192:0x82:0xF7
+
+# brick roof
+F:193:0x82:0xEE
+
+# brick roof top
+F:194:0x82:0xEF
+
+# brick roof chimney
+F:195:0x80:0xA3
+
+# window
+F:196:0x80:0xA3
+
+# small window
+F:197:0x80:0xA3
+
+# rain barrel
+F:198:0x80:0xA3
+
+# grass with flowers
+F:199:0x82:0xF8
+
+# cobblestone road
+F:200:0x83:0x83
+
+# cobblestone with outlet
+F:201:0x80:0xAE
+
+# small tree
+F:202:0x80:0xA3
+
+# town
+F:203:0x80:0xAA
+
+
+
+
+
+
+
+# Object attr/char definitions
+
+# something
+K:0:0x80:0xA6
+
+# Blindness
+K:1:0x80:0xAC
+
+# Paranoia
+K:2:0x80:0xAC
+
+# Confusion
+K:3:0x80:0xAC
+
+# Hallucination
+K:4:0x80:0xAC
+
+# Cure Poison
+K:5:0x80:0xAC
+
+# Cure Blindness
+K:6:0x80:0xAC
+
+# Cure Paranoia
+K:7:0x80:0xAC
+
+# Cure Confusion
+K:8:0x80:0xAC
+
+# Weakness
+K:9:0x80:0xAC
+
+# Unhealth
+K:10:0x80:0xAC
+
+# Restore Constitution
+K:11:0x80:0xAC
+
+# Restoring
+K:12:0x80:0xAC
+
+# Stupidity
+K:13:0x80:0xAC
+
+# Naivety
+K:14:0x80:0xAC
+
+# Poison
+K:15:0x80:0xAC
+
+# Sickness
+K:16:0x80:0xAC
+
+# Paralysis
+K:17:0x80:0xAC
+
+# Restore Strength
+K:18:0x80:0xAC
+
+# Disease
+K:19:0x80:0xAC
+
+# Cure Serious Wounds
+K:20:0x80:0xAC
+
+# & Ration~ of Food
+K:21:0x80:0xAC
+
+# & Hard Biscuit~
+K:22:0x80:0xAC
+
+# & Strip~ of Venison
+K:23:0x80:0xAC
+
+# & Slime Mold~
+K:24:0x80:0xAC
+
+# & Piece~ of Elvish Waybread
+K:25:0x80:0xAC
+
+# & Pint~ of Fine Ale
+K:26:0x80:0xAC
+
+# & Pint~ of Fine Wine
+K:27:0x80:0xAC
+
+# & Mattock~
+K:28:0x80:0xDC
+
+# & No-dachi~
+K:29:0x80:0xFC
+
+# & Broken Dagger~
+K:30:0x80:0xFC
+
+# & Bastard Sword~
+K:31:0x80:0xFC
+
+# & Scimitar~
+K:32:0x80:0xFC
+
+# & Tulwar~
+K:33:0x80:0xFC
+
+# & Broad Sword~
+K:34:0x80:0xFC
+
+# & Short Sword~
+K:35:0x80:0xFC
+
+# & Blade~ of Chaos
+K:36:0x80:0xFC
+
+# & Two-Handed Sword~
+K:37:0x80:0xFC
+
+# & Main Gauche~
+K:38:0x80:0xFC
+
+# & Cutlass~
+K:39:0x80:0xFC
+
+# & Executioner's Sword~
+K:40:0x80:0xFC
+
+# & Katana~
+K:41:0x80:0xFC
+
+# & Long Sword~
+K:42:0x80:0xFC
+
+# & Dagger~
+K:43:0x80:0xFC
+
+# & Rapier~
+K:44:0x80:0xFC
+
+# & Sabre~
+K:45:0x80:0xFC
+
+# & Small Sword~
+K:46:0x80:0xFC
+
+# & Broken Sword~
+K:47:0x80:0xFC
+
+# & Ball-and-Chain~
+K:48:0x80:0xDC
+
+# & Whip~
+K:49:0x80:0xDC
+
+# & Flail~
+K:50:0x80:0xDC
+
+# & Two-Handed Flail~
+K:51:0x80:0xDC
+
+# & Morning Star~
+K:52:0x80:0xDC
+
+# & Mace~
+K:53:0x80:0xDC
+
+# & Quarterstaff~
+K:54:0x80:0xDC
+
+# & War Hammer~
+K:55:0x80:0xDC
+
+# & Lead-Filled Mace~
+K:56:0x80:0xDC
+
+# & Mace~ of Disruption
+K:57:0x80:0xDC
+
+# & Lucerne Hammer~
+K:58:0x80:0xDC
+
+# & Beaked Axe~
+K:59:0x80:0xAF
+
+# & Glaive~
+K:60:0x80:0xAF
+
+# & Halberd~
+K:61:0x80:0xAF
+
+# & Awl-Pike~
+K:62:0x80:0xAF
+
+# & Pike~
+K:63:0x80:0xAF
+
+# & Spear~
+K:64:0x80:0xAF
+
+# & Trident~
+K:65:0x80:0xAF
+
+# & Lance~
+K:66:0x80:0xAF
+
+# & Great Axe~
+K:67:0x80:0xAF
+
+# & Battle Axe~
+K:68:0x80:0xAF
+
+# & Lochaber Axe~
+K:69:0x80:0xAF
+
+# & Broad Axe~
+K:70:0x80:0xAF
+
+# & Scythe~
+K:71:0x80:0xAF
+
+# & Scythe~ of Slicing
+K:72:0x80:0xAF
+
+# & Short Bow~
+K:73:0x80:0xFD
+
+# & Long Bow~
+K:74:0x80:0xFD
+
+# & Light Crossbow~
+K:75:0x80:0xFD
+
+# & Heavy Crossbow~
+K:76:0x80:0xFD
+
+# & Sling~
+K:77:0x80:0xFD
+
+# & Arrow~
+K:78:0x80:0xFB
+
+# & Seeker Arrow~
+K:79:0x80:0xFB
+
+# & Bolt~
+K:80:0x80:0xFB
+
+# & Seeker Bolt~
+K:81:0x80:0xFB
+
+# & Rounded Pebble~
+K:82:0x81:0x93
+
+# & Iron Shot~
+K:83:0x80:0xFB
+
+# & Shovel~
+K:84:0x80:0xDC
+
+# & Gnomish Shovel~
+K:85:0x80:0xDC
+
+# & Dwarven Shovel~
+K:86:0x80:0xDC
+
+# & Pick~
+K:87:0x80:0xDC
+
+# & Orcish Pick~
+K:88:0x80:0xDC
+
+# & Dwarven Pick~
+K:89:0x80:0xDC
+
+# & Elven Cloak~
+K:90:0x80:0xA8
+
+# & Pair~ of Soft Leather Boots
+K:91:0x80:0xDD
+
+# & Pair~ of Hard Leather Boots
+K:92:0x80:0xDD
+
+# & Pair~ of Metal Shod Boots
+K:93:0x80:0xDD
+
+# & Hard Leather Cap~
+K:94:0x80:0xDD
+
+# & Metal Cap~
+K:95:0x80:0xDD
+
+# & Iron Helm~
+K:96:0x80:0xDD
+
+# & Steel Helm~
+K:97:0x80:0xDD
+
+# & Iron Crown~
+K:98:0x80:0xDD
+
+# & Golden Crown~
+K:99:0x80:0xDD
+
+# & Jewel Encrusted Crown~
+K:100:0x80:0xDD
+
+# & Robe~
+K:101:0x80:0xA8
+
+# & Filthy Rag~
+K:102:0x80:0xA8
+
+# Soft Leather Armour~
+K:103:0x80:0xA8
+
+# Soft Studded Leather~
+K:104:0x80:0xA8
+
+# Hard Leather Armour~
+K:105:0x80:0xA8
+
+# Hard Studded Leather~
+K:106:0x80:0xA8
+
+# Leather Scale Mail~
+K:107:0x80:0xA8
+
+# Metal Scale Mail~
+K:108:0x80:0xDB
+
+# Chain Mail~
+K:109:0x80:0xDB
+
+# Rusty Chain Mail~
+K:110:0x80:0xDB
+
+# Augmented Chain Mail~
+K:111:0x80:0xDB
+
+# Bar Chain Mail~
+K:112:0x80:0xDB
+
+# Metal Brigandine Armour~
+K:113:0x80:0xDB
+
+# Partial Plate Armour~
+K:114:0x80:0xDB
+
+# Metal Lamellar Armour~
+K:115:0x80:0xDB
+
+# Full Plate Armour~
+K:116:0x80:0xDB
+
+# Ribbed Plate Armour~
+K:117:0x80:0xDB
+
+# Adamantite Plate Mail~
+K:118:0x80:0xDB
+
+# Mithril Plate Mail~
+K:119:0x80:0xDB
+
+# Mithril Chain Mail~
+K:120:0x80:0xDB
+
+# Double Chain Mail~
+K:121:0x80:0xDB
+
+# & Shield~ of Deflection
+K:122:0x80:0xDB
+
+# & Cloak~
+K:123:0x80:0xA8
+
+# & Shadow Cloak~
+K:124:0x80:0xA8
+
+# & Set~ of Leather Gloves
+K:125:0x80:0xDD
+
+# & Set~ of Gauntlets
+K:126:0x80:0xDD
+
+# & Set~ of Cesti
+K:127:0x80:0xDD
+
+# & Small Leather Shield~
+K:128:0x80:0xA9
+
+# & Large Leather Shield~
+K:129:0x80:0xA9
+
+# & Small Metal Shield~
+K:130:0x80:0xA9
+
+# & Large Metal Shield~
+K:131:0x80:0xA9
+
+# Strength
+K:132:0x80:0xBD
+
+# Dexterity
+K:133:0x80:0xBD
+
+# Constitution
+K:134:0x80:0xBD
+
+# Intelligence
+K:135:0x80:0xBD
+
+# Speed
+K:136:0x80:0xBD
+
+# Searching
+K:137:0x80:0xBD
+
+# Teleportation
+K:138:0x80:0xBD
+
+# Slow Digestion
+K:139:0x80:0xBD
+
+# Resist Fire
+K:140:0x80:0xBD
+
+# Resist Cold
+K:141:0x80:0xBD
+
+# Levitation
+K:142:0x80:0xBD
+
+# Poison Resistance
+K:143:0x80:0xBD
+
+# Free Action
+K:144:0x80:0xBD
+
+# Weakness
+K:145:0x80:0xBD
+
+# Flames
+K:146:0x80:0xBD
+
+# Acid
+K:147:0x80:0xBD
+
+# Ice
+K:148:0x80:0xBD
+
+# Woe
+K:149:0x80:0xBD
+
+# Stupidity
+K:150:0x80:0xBD
+
+# Damage
+K:151:0x80:0xBD
+
+# Accuracy
+K:152:0x80:0xBD
+
+# Protection
+K:153:0x80:0xBD
+
+# Aggravate Monster
+K:154:0x80:0xBD
+
+# See Invisible
+K:155:0x80:0xBD
+
+# Sustain Strength
+K:156:0x80:0xBD
+
+# Sustain Intelligence
+K:157:0x80:0xBD
+
+# Sustain Wisdom
+K:158:0x80:0xBD
+
+# Sustain Constitution
+K:159:0x80:0xBD
+
+# Sustain Dexterity
+K:160:0x80:0xBD
+
+# Sustain Charisma
+K:161:0x80:0xBD
+
+# Slaying
+K:162:0x80:0xBD
+
+# Brilliance
+K:163:0x80:0xA2
+
+# Charisma
+K:164:0x80:0xA2
+
+# Searching
+K:165:0x80:0xA2
+
+# Teleportation
+K:166:0x80:0xA2
+
+# Slow Digestion
+K:167:0x80:0xA2
+
+# Resist Acid
+K:168:0x80:0xA2
+
+# Adornment
+K:169:0x80:0xA2
+
+# Double Ring Mail~
+K:170:0x80:0xDB
+
+# the Magi
+K:171:0x80:0xA2
+
+# DOOM
+K:172:0x80:0xA2
+
+# Enchant Weapon To-Hit
+K:173:0x80:0xBF
+
+# Enchant Weapon To-Dam
+K:174:0x80:0xBF
+
+# Enchant Armor
+K:175:0x80:0xBF
+
+# Identify
+K:176:0x80:0xBF
+
+# *Identify*
+K:177:0x80:0xBF
+
+# Rumour
+K:178:0x80:0xBF
+
+# Chaos
+K:179:0x80:0xBF
+
+# Remove Curse
+K:180:0x80:0xBF
+
+# Light
+K:181:0x80:0xBF
+
+# Fire
+K:182:0x80:0xBF
+
+# Ice
+K:183:0x80:0xBF
+
+# Summon Monster
+K:184:0x80:0xBF
+
+# Phase Door
+K:185:0x80:0xBF
+
+# Teleportation
+K:186:0x80:0xBF
+
+# Teleport Level
+K:187:0x80:0xBF
+
+# Monster Confusion
+K:188:0x80:0xBF
+
+# Magic Mapping
+K:189:0x80:0xBF
+
+# Rune of Protection
+K:190:0x80:0xBF
+
+# *Remove Curse*
+K:191:0x80:0xBF
+
+# Treasure Detection
+K:192:0x80:0xBF
+
+# Object Detection
+K:193:0x80:0xBF
+
+# Trap Detection
+K:194:0x80:0xBF
+
+# & Sheaf Arrow~
+K:195:0x80:0xFB
+
+# & Mithril Shot~
+K:196:0x80:0xFB
+
+# Door/Stair Location
+K:197:0x80:0xBF
+
+# Acquirement
+K:198:0x80:0xBF
+
+# *Acquirement*
+K:199:0x80:0xBF
+
+# Mass Genocide
+K:200:0x80:0xBF
+
+# Detect Invisible
+K:201:0x80:0xBF
+
+# Aggravate Monster
+K:202:0x80:0xBF
+
+# Trap Creation
+K:203:0x80:0xBF
+
+# Trap/Door Destruction
+K:204:0x80:0xBF
+
+# Artifact Creation
+K:205:0x80:0xBF
+
+# Recharging
+K:206:0x80:0xBF
+
+# Genocide
+K:207:0x80:0xBF
+
+# Darkness
+K:208:0x80:0xBF
+
+# Protection from Evil
+K:209:0x80:0xBF
+
+# Satisfy Hunger
+K:210:0x80:0xBF
+
+# Dispel Undead
+K:211:0x80:0xBF
+
+# *Enchant Weapon*
+K:212:0x80:0xBF
+
+# Curse Weapon
+K:213:0x80:0xBF
+
+# *Enchant Armor*
+K:214:0x80:0xBF
+
+# Curse Armor
+K:215:0x80:0xBF
+
+# Summon Undead
+K:216:0x80:0xBF
+
+# Blessing
+K:217:0x80:0xBF
+
+# Holy Chant
+K:218:0x80:0xBF
+
+# Holy Prayer
+K:219:0x80:0xBF
+
+# Word of Recall
+K:220:0x80:0xBF
+
+# *Destruction*
+K:221:0x80:0xBF
+
+# Slime Mold Juice
+K:222:0x80:0xA1
+
+# Apple Juice
+K:223:0x80:0xA1
+
+# Water
+K:224:0x80:0xA1
+
+# Strength
+K:225:0x80:0xA1
+
+# Weakness
+K:226:0x80:0xA1
+
+# Restore Strength
+K:227:0x80:0xA1
+
+# Intelligence
+K:228:0x80:0xA1
+
+# Stupidity
+K:229:0x80:0xA1
+
+# Restore Intelligence
+K:230:0x80:0xA1
+
+# Wisdom
+K:231:0x80:0xA1
+
+# Naivety
+K:232:0x80:0xA1
+
+# Restore Wisdom
+K:233:0x80:0xA1
+
+# Charisma
+K:234:0x80:0xA1
+
+# Ugliness
+K:235:0x80:0xA1
+
+# Restore Charisma
+K:236:0x80:0xA1
+
+# Curing
+K:237:0x80:0xA1
+
+# Invulnerability
+K:238:0x80:0xA1
+
+# New Life
+K:239:0x80:0xA1
+
+# Cure Serious Wounds
+K:240:0x80:0xA1
+
+# Cure Critical Wounds
+K:241:0x80:0xA1
+
+# Healing
+K:242:0x80:0xA1
+
+# Constitution
+K:243:0x80:0xA1
+
+# Experience
+K:244:0x80:0xA1
+
+# Sleep
+K:245:0x80:0xA1
+
+# Blindness
+K:246:0x80:0xA1
+
+# Booze
+K:247:0x80:0xA1
+
+# Poison
+K:248:0x80:0xA1
+
+# Speed
+K:249:0x80:0xA1
+
+# Slowness
+K:250:0x80:0xA1
+
+# Dexterity
+K:251:0x80:0xA1
+
+# Restore Dexterity
+K:252:0x80:0xA1
+
+# Restore Constitution
+K:253:0x80:0xA1
+
+# Lose Memories
+K:254:0x80:0xA1
+
+# Salt Water
+K:255:0x80:0xA1
+
+# Enlightenment
+K:256:0x80:0xA1
+
+# Heroism
+K:257:0x80:0xA1
+
+# Berserk Strength
+K:258:0x80:0xA1
+
+# Boldness
+K:259:0x80:0xA1
+
+# Restore Life Levels
+K:260:0x80:0xA1
+
+# Resist Heat
+K:261:0x80:0xA1
+
+# Resist Cold
+K:262:0x80:0xA1
+
+# Detect Invisible
+K:263:0x80:0xA1
+
+# Slow Poison
+K:264:0x80:0xA1
+
+# Neutralise Poison
+K:265:0x80:0xA1
+
+# Restore Mana
+K:266:0x80:0xA1
+
+# Infra-vision
+K:267:0x80:0xA1
+
+# Resistance
+K:268:0x80:0xA1
+
+# Light
+K:269:0x80:0xAD
+
+# Tame Monster
+K:270:0x80:0xAD
+
+# Frost Bolts
+K:271:0x80:0xAD
+
+# Fire Bolts
+K:272:0x80:0xAD
+
+# Stone to Mud
+K:273:0x80:0xAD
+
+# Polymorph
+K:274:0x80:0xAD
+
+# Heal Monster
+K:275:0x80:0xAD
+
+# Haste Monster
+K:276:0x80:0xAD
+
+# Slow Monster
+K:277:0x80:0xAD
+
+# Confuse Monster
+K:278:0x80:0xAD
+
+# Sleep Monster
+K:279:0x80:0xAD
+
+# Drain Life
+K:280:0x80:0xAD
+
+# Trap/Door Destruction
+K:281:0x80:0xAD
+
+# Magic Missile
+K:282:0x80:0xAD
+
+# Clone Monster
+K:283:0x80:0xAD
+
+# Scare Monster
+K:284:0x80:0xAD
+
+# Teleport Other
+K:285:0x80:0xAD
+
+# Disarming
+K:286:0x80:0xAD
+
+# Lightning Balls
+K:287:0x80:0xAD
+
+# Cold Balls
+K:288:0x80:0xAD
+
+# Fire Balls
+K:289:0x80:0xAD
+
+# Stinking Cloud
+K:290:0x80:0xAD
+
+# Acid Balls
+K:291:0x80:0xAD
+
+# Wonder
+K:292:0x80:0xAD
+
+# & Flight Arrow~
+K:293:0x80:0xFB
+
+# Acid Bolts
+K:294:0x80:0xAD
+
+# Dragon's Flame
+K:295:0x80:0xAD
+
+# Dragon's Frost
+K:296:0x80:0xAD
+
+# Dragon's Breath
+K:297:0x80:0xAD
+
+# Annihilation
+K:298:0x80:0xAD
+
+# Rockets
+K:299:0x80:0xAD
+
+# Trap Location
+K:300:0x80:0xDF
+
+# Treasure Location
+K:301:0x80:0xDF
+
+# Object Location
+K:302:0x80:0xDF
+
+# Teleportation
+K:303:0x80:0xDF
+
+# Earthquakes
+K:304:0x80:0xDF
+
+# Summoning
+K:305:0x80:0xDF
+
+# Light
+K:306:0x80:0xDF
+
+# *Destruction*
+K:307:0x80:0xDF
+
+# Starlight
+K:308:0x80:0xDF
+
+# Haste Monsters
+K:309:0x80:0xDF
+
+# Slow Monsters
+K:310:0x80:0xDF
+
+# Sleep Monsters
+K:311:0x80:0xDF
+
+# Cure Light Wounds
+K:312:0x80:0xDF
+
+# Detect Invisible
+K:313:0x80:0xDF
+
+# Speed
+K:314:0x80:0xDF
+
+# Slowness
+K:315:0x80:0xDF
+
+# Door/Stair Location
+K:316:0x80:0xDF
+
+# Remove Curse
+K:317:0x80:0xDF
+
+# Detect Evil
+K:318:0x80:0xDF
+
+# Curing
+K:319:0x80:0xDF
+
+# Dispel Evil
+K:320:0x80:0xDF
+
+# Probing
+K:321:0x80:0xDF
+
+# Darkness
+K:322:0x80:0xDF
+
+# Genocide
+K:323:0x80:0xDF
+
+# Power
+K:324:0x80:0xDF
+
+# the Magi
+K:325:0x80:0xDF
+
+# Perception
+K:326:0x80:0xDF
+
+# Holiness
+K:327:0x80:0xDF
+
+# Enlightenment
+K:328:0x80:0xDF
+
+# Healing
+K:329:0x80:0xDF
+
+# [Call of the West]
+K:330:0x80:0xBF
+
+# [Light of Valinor]
+K:331:0x80:0xBF
+
+# [Divine Mastery]
+K:332:0x80:0xBF
+
+# [Words of Power]
+K:333:0x80:0xBF
+
+# [Apprentice Handbook]
+K:334:0x80:0xBF
+
+# [Mystical Words]
+K:335:0x80:0xBF
+
+# [Arcane Chants]
+K:336:0x80:0xBF
+
+# [Locus of Force]
+K:337:0x80:0xBF
+
+# & Small wooden chest~
+K:338:0x80:0xFE
+
+# & Large wooden chest~
+K:339:0x80:0xFE
+
+# & Small iron chest~
+K:340:0x80:0xFE
+
+# & Large iron chest~
+K:341:0x80:0xFE
+
+# & Small steel chest~
+K:342:0x80:0xFE
+
+# & Large steel chest~
+K:343:0x80:0xFE
+
+# & Ruined chest~
+K:344:0x80:0xFE
+
+# & Iron Spike~
+K:345:0x81:0x91
+
+# & Wooden Torch~
+K:346:0x80:0xFE
+
+# & Brass Lantern~
+K:347:0x80:0xFE
+
+# & Flask~ of oil
+K:348:0x80:0xA1
+
+# & Empty Bottle~
+K:349:0x80:0xA1
+
+# Havoc
+K:350:0x80:0xAD
+
+# Door/Stair Location
+K:351:0x80:0xAD
+
+# Trap Location
+K:352:0x80:0xAD
+
+# Probing
+K:353:0x80:0xAD
+
+# Recall
+K:354:0x80:0xAD
+
+# Illumination
+K:355:0x80:0xAD
+
+# Light
+K:356:0x80:0xAD
+
+# Lightning Bolts
+K:357:0x80:0xAD
+
+# Frost Bolts
+K:358:0x80:0xAD
+
+# Fire Bolts
+K:359:0x80:0xAD
+
+# Polymorph
+K:360:0x80:0xAD
+
+# Slow Monster
+K:361:0x80:0xAD
+
+# Sleep Monster
+K:362:0x80:0xAD
+
+# Drain Life
+K:363:0x80:0xAD
+
+# Teleport Other
+K:364:0x80:0xAD
+
+# Disarming
+K:365:0x80:0xAD
+
+# Lightning Balls
+K:366:0x80:0xAD
+
+# Cold Balls
+K:367:0x80:0xAD
+
+# Fire Balls
+K:368:0x80:0xAD
+
+# Acid Balls
+K:369:0x80:0xAD
+
+# Acid Bolts
+K:370:0x80:0xAD
+
+# Enlightenment
+K:371:0x80:0xAD
+
+# Perception
+K:372:0x80:0xAD
+
+# Curing
+K:373:0x80:0xAD
+
+# Healing
+K:374:0x80:0xAD
+
+# Detection
+K:375:0x80:0xAD
+
+# Restoration
+K:376:0x80:0xAD
+
+# Speed
+K:377:0x80:0xAD
+
+# [Inner Void]
+K:378:0x80:0xBF
+
+# [Lurkings of the Night]
+K:379:0x80:0xBF
+
+# [Beings of Darkness]
+K:380:0x80:0xBF
+
+# [Material Shadow]
+K:381:0x80:0xBF
+
+# [Sign of Chaos]
+K:383:0x80:0xBF
+
+# [Chaos Mastery]
+K:384:0x80:0xBF
+
+# [Chaos Channels]
+K:385:0x80:0xBF
+
+# [Armageddon Tome]
+K:386:0x80:0xBF
+
+# [Nether Openings]
+K:387:0x80:0xBF
+
+# [Unholy Blessings]
+K:388:0x80:0xBF
+
+# & Firestone~
+K:389:0x80:0xFE
+
+# & Small Firestone~
+K:390:0x80:0xFE
+
+# & Broken Skull~
+K:391:0x80:0xFE
+
+# & Broken Bone~
+K:392:0x80:0xFE
+
+# & Canine Skeleton~
+K:393:0x80:0xFE
+
+# & Rodent Skeleton~
+K:394:0x80:0xFE
+
+# & Human Skeleton~
+K:395:0x80:0xFE
+
+# & Dwarf Skeleton~
+K:396:0x80:0xFE
+
+# & Elf Skeleton~
+K:397:0x80:0xFE
+
+# & Gnome Skeleton~
+K:398:0x80:0xFE
+
+# & Great Hammer~
+K:399:0x80:0xDC
+
+# Black Dragon Scale Mail~
+K:400:0x80:0xDB
+
+# Blue Dragon Scale Mail~
+K:401:0x80:0xDB
+
+# White Dragon Scale Mail~
+K:402:0x80:0xDB
+
+# Red Dragon Scale Mail~
+K:403:0x80:0xDB
+
+# Green Dragon Scale Mail~
+K:404:0x80:0xDB
+
+# Multi-Hued Dragon Scale Mail~
+K:405:0x80:0xDB
+
+# Pseudo Dragon Scale Mail~
+K:406:0x80:0xDB
+
+# Law Dragon Scale Mail~
+K:407:0x80:0xDB
+
+# Bronze Dragon Scale Mail~
+K:408:0x80:0xDB
+
+# Gold Dragon Scale Mail~
+K:409:0x80:0xDB
+
+# Chaos Dragon Scale Mail~
+K:410:0x80:0xDB
+
+# Balance Dragon Scale Mail~
+K:411:0x80:0xDB
+
+# Power Dragon Scale Mail~
+K:412:0x80:0xDB
+
+# & Dragon Helm~
+K:413:0x80:0xDD
+
+# & Dragon Shield~
+K:414:0x80:0xDB
+
+# Death
+K:415:0x80:0xA1
+
+# Ruination
+K:416:0x80:0xA1
+
+# Detonations
+K:417:0x80:0xA1
+
+# Augmentation
+K:418:0x80:0xA1
+
+# *Healing*
+K:419:0x80:0xA1
+
+# Life
+K:420:0x80:0xA1
+
+# Self Knowledge
+K:421:0x80:0xA1
+
+# *Enlightenment*
+K:422:0x80:0xA1
+
+# [Necromantic Incantations]
+K:423:0x80:0xBF
+
+# [Curses of Angmar]
+K:424:0x80:0xBF
+
+# Fear Resistance
+K:425:0x80:0xBD
+
+# Light and Darkness Resistance
+K:426:0x80:0xBD
+
+# Nether Resistance
+K:427:0x80:0xBD
+
+# Nexus Resistance
+K:428:0x80:0xBD
+
+# Sound Resistance
+K:429:0x80:0xBD
+
+# Confusion Resistance
+K:430:0x80:0xBD
+
+# Shard Resistance
+K:431:0x80:0xBD
+
+# Disenchantment Resistance
+K:432:0x80:0xBD
+
+# Chaos Resistance
+K:433:0x80:0xBD
+
+# Blindness Resistance
+K:434:0x80:0xBD
+
+# Lordly Protection
+K:435:0x80:0xBD
+
+# Extra Attacks
+K:436:0x80:0xBD
+
+# Cure Light Wounds
+K:437:0x80:0xA1
+
+# Clumsiness
+K:438:0x80:0xA1
+
+# Sickliness
+K:439:0x80:0xA1
+
+# Map of Bree
+K:440:0x80:0xBF
+
+# Map of Gondolin
+K:441:0x80:0xBF
+
+# Map of LothLorien
+K:442:0x80:0xBF
+
+# Map of Minas Anor
+K:443:0x80:0xBF
+
+# copper
+K:480:0x81:0xCA
+
+# copper
+K:481:0x81:0xC9
+
+# copper
+K:482:0x81:0xC8
+
+# silver
+K:483:0x80:0xA4
+
+# silver
+K:484:0x80:0xA4
+
+# silver
+K:485:0x80:0xA4
+
+# garnets
+K:486:0x80:0xA4
+
+# garnets
+K:487:0x80:0xA4
+
+# gold
+K:488:0x80:0xA4
+
+# gold
+K:489:0x80:0xA4
+
+# gold
+K:490:0x80:0xA4
+
+# opals
+K:491:0x80:0xA4
+
+# sapphires
+K:492:0x80:0xA4
+
+# rubies
+K:493:0x80:0xA4
+
+# diamonds
+K:494:0x80:0xA4
+
+# emeralds
+K:495:0x80:0xA4
+
+# mithril
+K:496:0x80:0xA4
+
+# adamantite
+K:497:0x80:0xA4
+
+# & Mighty Hammer~
+K:498:0x80:0xDC
+
+# & Massive Iron Crown~
+K:499:0x80:0xDD
+
+# & Phial~
+K:500:0x80:0xFE
+
+# & Star~
+K:501:0x80:0xFE
+
+# & Arkenstone~
+K:502:0x80:0xFE
+
+# & Amulet~
+K:503:0x80:0xA2
+
+# & Amulet~
+K:504:0x80:0xA2
+
+# & Necklace~
+K:505:0x80:0xA2
+
+# & Ring~
+K:506:0x80:0xBD
+
+# & Ring~
+K:507:0x80:0xBD
+
+# & Ring~
+K:508:0x80:0xBD
+
+# & Ring~
+K:509:0x80:0xBD
+
+# & Ring~
+K:510:0x80:0xBD
+
+# & Ring~
+K:511:0x80:0xBD
+
+# [Rites of Initiation]
+K:512:0x80:0xBF
+
+# [Ways of War]
+K:513:0x80:0xBF
+
+# [Divine Retribution]
+K:514:0x80:0xBF
+
+# [Essence of Fury]
+K:515:0x80:0xBF
+
+# [Novice Crafts]
+K:516:0x80:0xBF
+
+# [Arcane Channels]
+K:517:0x80:0xBF
+
+# [Sigils of Wizardry]
+K:518:0x80:0xBF
+
+# [Mana Focus]
+K:519:0x80:0xBF
+
+# Reflection
+K:520:0x80:0xA2
+
+# Anti-Magic
+K:521:0x80:0xA2
+
+# Anti-Teleportation
+K:522:0x80:0xA2
+
+# Resistance
+K:523:0x80:0xA2
+
+# & Zweihander~
+K:524:0x80:0xFC
+
+# & Tanto~
+K:525:0x80:0xFC
+
+# Splint Mail~
+K:526:0x80:0xDB
+
+# Do-maru~
+K:527:0x80:0xDB
+
+# & Trifurcate Spear~
+K:528:0x80:0xAF
+
+# & Three Piece Rod~
+K:529:0x80:0xDC
+
+# O-yoroi~
+K:530:0x80:0xDB
+
+# & Fur Cloak~
+K:531:0x80:0xA8
+
+# & Lajatang~
+K:532:0x80:0xAF
+
+# & Hatchet~
+K:533:0x80:0xAF
+
+# Rhino Hide Armour~
+K:535:0x80:0xA8
+
+# Leather Jacket~
+K:536:0x80:0xA8
+
+# & Sickle~
+K:537:0x80:0xAF
+
+# & Tetsubo~
+K:538:0x80:0xDC
+
+# & Nunchaku~
+K:539:0x80:0xDC
+
+# & Bo Staff~
+K:540:0x80:0xDC
+
+# & Jo Staff~
+K:541:0x80:0xDC
+
+# & Club~
+K:542:0x80:0xDC
+
+# & Broad Spear~
+K:543:0x80:0xAF
+
+# & Khopesh~
+K:544:0x80:0xFC
+
+# & Flamberge~
+K:545:0x80:0xFC
+
+# & Claymore~
+K:546:0x80:0xFC
+
+# & Espadon~
+K:547:0x80:0xFC
+
+# & Great Scimitar~
+K:548:0x80:0xFC
+
+# & Wakizashi~
+K:549:0x80:0xFC
+
+# & Naginata~
+K:550:0x80:0xAF
+
+# & Fauchard~
+K:551:0x80:0xAF
+
+# & Guisarme~
+K:552:0x80:0xAF
+
+# & Heavy Lance~
+K:553:0x80:0xAF
+
+# & Basillard~
+K:554:0x80:0xFC
+
+# & Ninjato~
+K:555:0x80:0xFC
+
+# Ring Mail~
+K:556:0x80:0xDB
+
+# Cord Armour~
+K:557:0x80:0xA8
+
+# Paper Armour~
+K:558:0x80:0xA8
+
+# Padded Armour~
+K:559:0x80:0xA8
+
+# & Kabuto~
+K:560:0x80:0xDD
+
+# Stone and Hide Armour~
+K:561:0x80:0xA8
+
+# & Jingasa~
+K:562:0x80:0xDD
+
+# Haramakido~
+K:563:0x80:0xDB
+
+# Nothing
+K:564:0x80:0xBF
+
+# Poison
+K:565:0x80:0xAA
+
+# Nothing
+K:566:0x80:0xAD
+
+# Nothing
+K:567:0x80:0xAD
+
+# Nothing
+K:568:0x80:0xAD
+
+# Nothing
+K:569:0x80:0xAD
+
+# Explosion
+K:570:0x80:0xAA
+
+# Teleport
+K:571:0x80:0xAA
+
+# Nothing
+K:572:0x80:0xAD
+
+# the Blood of Life
+K:573:0x80:0xA1
+
+# Cold
+K:574:0x80:0xAA
+
+# Fire
+K:575:0x80:0xAA
+
+# Acid
+K:576:0x80:0xAA
+
+# & Mage Staff~
+K:577:0x80:0xDC
+
+# Life
+K:579:0x80:0xAA
+
+# Confusion
+K:580:0x80:0xAA
+
+# Light
+K:581:0x80:0xAA
+
+# & Ring~
+K:582:0x80:0xBD
+
+# Invisibility
+K:583:0x80:0xA1
+
+# Chaos
+K:584:0x80:0xAA
+
+# Mutation
+K:585:0x80:0xA1
+
+# Invisibility
+K:586:0x80:0xBD
+
+# Time
+K:587:0x80:0xAA
+
+# Deep Thoughts
+K:588:0x80:0xBF
+
+# More Deep Thoughts
+K:589:0x80:0xBF
+
+# Compendium of Deep Thoughts
+K:590:0x80:0xBF
+
+# Artifact Lore Vol. I
+K:591:0x80:0xBF
+
+# Artifact Lore Vol. II
+K:592:0x80:0xBF
+
+# Artifact Lore Vol. III
+K:593:0x80:0xBF
+
+# Monstrous Compendium 1
+K:594:0x80:0xBF
+
+# Monstrous Compendium 2
+K:595:0x80:0xBF
+
+# Monstrous Compendium 3
+K:596:0x80:0xBF
+
+# Monstrous Compendium 4
+K:597:0x80:0xBF
+
+# Monstrous Compendium 5
+K:598:0x80:0xBF
+
+# Monstrous Compendium 6
+K:599:0x80:0xBF
+
+# Monstrous Compendium 7
+K:600:0x80:0xBF
+
+# Monstrous Compendium 8
+K:601:0x80:0xBF
+
+# Monstrous Compendium 9
+K:602:0x80:0xBF
+
+# Monstrous Compendium 10
+K:603:0x80:0xBF
+
+# Monstrous Compendium 11
+K:604:0x80:0xBF
+
+# Abomination
+K:605:0x80:0xA1
+
+# Shape of Wolf
+K:606:0x80:0xA1
+
+# Shape of Ape
+K:607:0x80:0xA1
+
+# Shape of Goat
+K:608:0x80:0xA1
+
+# Shape of Insect
+K:609:0x80:0xA1
+
+# Shape of Sparrow
+K:610:0x80:0xA1
+
+# Shape of Ent
+K:611:0x80:0xA1
+
+# Shape of Vampire
+K:612:0x80:0xA1
+
+# Shape of Spider
+K:613:0x80:0xA1
+
+# Shape of Mana ball
+K:614:0x80:0xA1
+
+# Shape of Fire cloud
+K:615:0x80:0xA1
+
+# Shape of Cold cloud
+K:616:0x80:0xA1
+
+# Shape of Chaos cloud
+K:617:0x80:0xA1
+
+# [Wolf]
+K:618:0x80:0xBF
+
+# [Ape]
+K:619:0x80:0xBF
+
+# [Goat]
+K:620:0x80:0xBF
+
+# [Insect]
+K:621:0x80:0xBF
+
+# [Sparrow]
+K:622:0x80:0xBF
+
+# [Ent]
+K:623:0x80:0xBF
+
+# [Vampire]
+K:624:0x80:0xBF
+
+# [Spider]
+K:625:0x80:0xBF
+
+# [Mana ball]
+K:626:0x80:0xBF
+
+# [Fire cloud]
+K:627:0x80:0xBF
+
+# [Cold cloud]
+K:628:0x80:0xBF
+
+# [Chaos Cloud]
+K:629:0x80:0xBF
+
+# [Ghost]
+K:630:0x80:0xBF
+
+# [Kobold]
+K:631:0x80:0xBF
+
+# [Dragon]
+K:632:0x80:0xBF
+
+# [Demon]
+K:633:0x80:0xBF
+
+# [Hound]
+K:634:0x80:0xBF
+
+# [Quylthulg]
+K:635:0x80:0xBF
+
+# [Maia]
+K:636:0x80:0xBF
+
+# [Serpent]
+K:637:0x80:0xBF
+
+# [Giant]
+K:638:0x80:0xBF
+
+# [Vala]
+K:639:0x80:0xBF
+
+# Magic
+K:640:0x80:0xAA
+
+# corpse
+K:641:0x80:0xFE
+
+# skeleton
+K:642:0x80:0xFE
+
+# head
+K:643:0x80:0xFE
+
+# skull
+K:644:0x80:0xFE
+
+# raw meat
+K:645:0x80:0xFE
+
+# & Dragonrider Coat~
+K:646:0x80:0xA8
+
+# & Stone~
+K:647:0x80:0xFE
+
+# & small wooden Boomerang~
+K:648:0x80:0xFB
+
+# & wooden Boomerang~
+K:649:0x80:0xFB
+
+# & small metal Boomerang~
+K:650:0x80:0xFB
+
+# & metal Boomerang~
+K:651:0x80:0xFB
+
+# & Anchor~
+K:652:0x80:0xFE
+
+# & ~
+K:653:0x80:0xFE
+
+# Summon never-moving pet
+K:654:0x80:0xBF
+
+# [Life in symbiosis]
+K:655:0x80:0xBF
+
+# [Perfect Symbiosis]
+K:656:0x80:0xBF
+
+# Cure Light Insanity
+K:657:0x80:0xA1
+
+# Cure Serious Insanity
+K:658:0x80:0xA1
+
+# Cure Critical Insanity
+K:659:0x80:0xA1
+
+# Cure Insanity
+K:660:0x80:0xA1
+
+# & Phial~
+K:661:0x80:0xFE
+
+# Random Artifact
+K:662:0x80:0xFE
+
+# Craftmanship
+K:663:0x80:0xBF
+
+# The One Ring
+K:664:0x80:0xBF
+
+# [Apprentice Handbook]
+K:665:0x80:0xBF
+
+# [Minstrel's Music]
+K:666:0x80:0xBF
+
+# [Harps of Rivendell]
+K:667:0x80:0xBF
+
+# [Lays of Beleriand]
+K:668:0x80:0xBF
+
+# & Flute~
+K:669:0x80:0xAF
+
+# & Drum~
+K:670:0x80:0xAF
+
+# & Harp~
+K:671:0x80:0xAF
+
+# & Banjo~
+K:672:0x80:0xAF
+
+# & Lute~
+K:673:0x80:0xAF
+
+# & Mandolin~
+K:674:0x80:0xAF
+
+# & Palantir~
+K:675:0x80:0xA1
+
+# Egg
+K:676:0x80:0xEF
+
+# Reset Recall
+K:677:0x80:0xBF
+
+# Divination
+K:678:0x80:0xBF
+
+# Self
+K:679:0x80:0xBF
+
+# Ray
+K:680:0x80:0xBF
+
+# Sphere
+K:681:0x80:0xBF
+
+# Knowledge
+K:682:0x80:0xBF
+
+# Life
+K:683:0x80:0xBF
+
+# Fire
+K:684:0x80:0xBF
+
+# Cold
+K:685:0x80:0xBF
+
+# Lightning
+K:686:0x80:0xBF
+
+# Acid
+K:687:0x80:0xBF
+
+# Element
+K:688:0x80:0xBF
+
+# Chaos
+K:689:0x80:0xBF
+
+# Mind
+K:690:0x80:0xBF
+
+# Holding
+K:691:0x80:0xBF
+
+# Arrow
+K:692:0x80:0xBF
+
+# Power Surge
+K:693:0x80:0xBF
+
+# Armageddon
+K:694:0x80:0xBF
+
+# Gravity
+K:695:0x80:0xBF
+
+# Extra Life
+K:696:0x80:0xAA
+
+# Anti-Death
+K:697:0x80:0xBF
+
+# Protection
+K:698:0x80:0xBF
+
+# & Horn~
+K:699:0x80:0xAF
+
+# Precognition
+K:700:0x80:0xBD
+
+# & Sprig~ of Athelas
+K:701:0x80:0xAC
+
+# [Magic for Beginners]
+K:702:0x80:0xBF
+
+# [Conjurings and Tricks]
+K:703:0x80:0xBF
+
+# [Incantations and Illusions]
+K:704:0x80:0xBF
+
+# [Sorcery and Evocations]
+K:705:0x80:0xBF
+
+# [Beginners Handbook]
+K:706:0x80:0xBF
+
+# [Words of Wisdom]
+K:707:0x80:0xBF
+
+# [Chants and Blessings]
+K:708:0x80:0xBF
+
+# [Exorcism and Dispelling]
+K:709:0x80:0xBF
+
+# [Resistance of Scarabtarices]
+K:710:0x80:0xBF
+
+# [Mordenkainen's Escapes]
+K:711:0x80:0xBF
+
+# [Kelek's Grimoire of Power]
+K:712:0x80:0xBF
+
+# [Tenser's Transformations]
+K:713:0x80:0xBF
+
+# [Raal's Tome of Destruction]
+K:714:0x80:0xBF
+
+# [Ethereal Openings]
+K:715:0x80:0xBF
+
+# [Godly Insights]
+K:716:0x80:0xBF
+
+# [Purifications and Healing]
+K:717:0x80:0xBF
+
+# [Holy Infusions]
+K:718:0x80:0xBF
+
+# [Wrath of God]
+K:719:0x80:0xBF
+
+# Deincarnation
+K:720:0x80:0xBF
+
+# Numenorean for beginners
+K:722:0x80:0xBF
+
+# Numenorean for beginners
+K:723:0x80:0xBF
+
+# Advanced lessons of Numenorean
+K:724:0x80:0xBF
+
+# Advanced lessons of Sindarin
+K:725:0x80:0xBF
+
+# & Shard~ of Pottery
+K:726:0x80:0xFE
+
+# & Broken Stick~
+K:727:0x80:0xFE
+
+# Wall Creation
+K:728:0x80:0xAD
+
+# [Illusions for Beginners]
+K:729:0x80:0xBF
+
+# [Tricks and Visions]
+K:730:0x80:0xBF
+
+# [Phantasms and Illusions]
+K:731:0x80:0xBF
+
+# [Shadows and Prisms]
+K:732:0x80:0xBF
+
+# [Serten's Immunities]
+K:733:0x80:0xBF
+
+# [Knowledge of Kenault]
+K:734:0x80:0xBF
+
+# [Otiluke's Spheres]
+K:735:0x80:0xBF
+
+# [Boccob's Book of Shadows]
+K:736:0x80:0xBF
+
+# [Bigby's Handbook]
+K:737:0x80:0xBF
+
+# [Hunt of Orome]
+K:738:0x80:0xBF
+
+# [Holy Sanctifications]
+K:739:0x80:0xBF
+
+# [Secrets of the Feanturi]
+K:740:0x80:0xBF
+
+# [War of Wrath]
+K:741:0x80:0xBF
+
+# [Gifts of Iluvatar]
+K:742:0x80:0xBF
+
+# Learning
+K:743:0x80:0xA1
+
+# [Eye of Sauron]
+K:744:0x80:0xBF
+
+# [Flame of Udun]
+K:745:0x80:0xBF
+
+# [Corruptions of Melkor]
+K:746:0x80:0xBF
+
+# [Crescent of Morgul]
+K:747:0x80:0xBF
+
+# [Morgoth's Ring]
+K:748:0x80:0xBF
+
+# Spell
+K:749:0x80:0xBF
+
+# Wishing
+K:750:0x80:0xDF
+
+# Khuzdul - The hidden tonge of the Dwarves
+K:751:0x80:0xBF
+
+# Nandorin for the dumbs
+K:752:0x80:0xBF
+
+# Advanced lessons of Orkish
+K:753:0x80:0xBF
+
+# Flying
+K:755:0x80:0xBD
+
+# [Powerful Sigils]
+K:756:0x80:0xBF
+
+# [Disruptive Forces]
+K:758:0x80:0xBF
+
+# [Forces of the Mind]
+K:759:0x80:0xBF
+
+# [Power of Ancient Sorcerors]
+K:760:0x80:0xBF
+
+# [Tricks of the Wild]
+K:761:0x80:0xBF
+
+# [Mastering the Rituals]
+K:762:0x80:0xBF
+
+# [Rites of Power]
+K:763:0x80:0xBF
+
+# [Tribal Power]
+K:764:0x80:0xBF
+
+# [Aiding Shades]
+K:765:0x80:0xBF
+
+# [Morgoth's Space-Time Warpings]
+K:766:0x80:0xBF
+
+# [Murazor Tome of Conjuring & Dispeling]
+K:767:0x80:0xBF
+
+# [Channeling the Void]
+K:768:0x80:0xBF
+
+# [Sauron's Forgotten Tome]
+K:769:0x80:0xBF
+
+# Wraith Form
+K:770:0x80:0xBD
+
+# [Earth]
+K:771:0x80:0xBF
+
+# [Fire]
+K:772:0x80:0xBF
+
+# [Air]
+K:773:0x80:0xBF
+
+# [Water]
+K:774:0x80:0xBF
+
+# [Mana]
+K:775:0x80:0xBF
+
+# Home Summoning
+K:776:0x80:0xAD
+
+# & Shadow Blade~
+K:777:0x80:0xFC
+
+# & Bluesteel Blade~
+K:778:0x80:0xFC
+
+# the Serpents
+K:779:0x80:0xA2
+
+# Darkness
+K:780:0x80:0xAA
+
+# Knowledge
+K:781:0x80:0xAA
+
+# Force
+K:782:0x80:0xAA
+
+# Lightning
+K:783:0x80:0xAA
+
+# Mana
+K:784:0x80:0xAA
+
+# Power
+K:785:0x80:0xBD
+
+# Climbing Set
+K:786:0x80:0xE0
+
+# Adventurer's Guide to Middle-earth
+K:787:0x80:0xBF
+
+# [Dark Incantations]
+K:788:0x80:0xBF
+
+# [Immortal Rituals]
+K:789:0x80:0xBF
+
+# [Minions of Azathoth]
+K:790:0x80:0xBF
+
+# [Demonthoughts]
+K:791:0x80:0xBF
+
+# [Hellfire Tome]
+K:792:0x80:0xBF
+
+# & Wooden Rod~ of#
+K:793:0x80:0xAD
+
+# & Copper Rod~ of#
+K:794:0x80:0xAD
+
+# & Iron Rod~ of#
+K:795:0x80:0xAD
+
+# & Aluminium Rod~ of#
+K:796:0x80:0xAD
+
+# & Silver Rod~ of#
+K:797:0x80:0xAD
+
+# & Golden Rod~ of#
+K:798:0x80:0xAD
+
+# & Mithril Rod~ of#
+K:799:0x80:0xAD
+
+# & Adamantite Rod~ of#
+K:800:0x80:0xAD
+
+
+
+
+
+
+
+# Monster attr/char definitions
+
+# Player
+R:0:0x80:0xC0
+
+# Filthy street urchin
+R:1:0x80:0xF4
+
+# Scrawny cat
+R:2:0x80:0xE6
+
+# Sparrow
+R:3:0x80:0xC2
+
+# Chaffinch
+R:4:0x80:0xC2
+
+# Wild rabbit
+R:5:0x80:0xF2
+
+# Woodsman
+R:6:0x80:0xF0
+
+# Scruffy little dog
+R:7:0x80:0xC3
+
+# Farmer Maggot
+R:8:0x81:0xBB
+
+# Blubbering idiot
+R:9:0x80:0xF4
+
+# Boil-covered wretch
+R:10:0x80:0xF4
+
+# Village idiot
+R:11:0x80:0xF4
+
+# Pitiful looking beggar
+R:12:0x80:0xF4
+
+# Mangy looking leper
+R:13:0x80:0xF4
+
+# Agent of black market
+R:14:0x81:0xB8
+
+# Singing, happy drunk
+R:15:0x81:0xB9
+
+# Aimless looking merchant
+R:16:0x81:0xBA
+
+# Mean looking mercenary
+R:17:0x80:0xF4
+
+# Battle scarred veteran
+R:18:0x81:0xC3
+
+# Martti Ihrasaari
+R:19:0x80:0xD0
+
+# Grey mold
+R:20:0x81:0x32
+
+# Large white snake
+R:21:0x81:0xA0
+
+# Grey mushroom patch
+R:22:0x80:0xAC
+
+# Newt
+R:23:0x80:0xD2
+
+# Giant white centipede
+R:24:0x80:0xE3
+
+# White icky thing
+R:25:0x80:0xE9
+
+# Clear icky thing
+R:26:0x80:0xE9
+
+# Giant white mouse
+R:27:0x80:0xF2
+
+# Large brown snake
+R:28:0x81:0xA1
+
+# Small kobold
+R:29:0x80:0xEB
+
+# Kobold
+R:30:0x80:0xEB
+
+# White worm mass
+R:31:0x80:0xF7
+
+# Floating eye
+R:32:0x80:0xE5
+
+# Rock lizard
+R:33:0x80:0xD2
+
+# Grid bug
+R:34:0x81:0xA9
+
+# Jackal
+R:35:0x81:0xB1
+
+# Soldier ant
+R:36:0x81:0xAA
+
+# Fruit bat
+R:37:0x80:0xE2
+
+# Insect swarm
+R:38:0x81:0xA8
+
+# Greater hell-beast
+R:39:0x80:0xD5
+
+# Shrieker mushroom patch
+R:40:0x80:0xAC
+
+# Blubbering icky thing
+R:41:0x80:0xE9
+
+# Metallic green centipede
+R:42:0x80:0xE3
+
+# Novice warrior
+R:43:0x81:0xC2
+
+# Novice rogue
+R:44:0x80:0xF0
+
+# Novice priest
+R:45:0x80:0xF0
+
+# Novice mage
+R:46:0x80:0xF0
+
+# Yellow mushroom patch
+R:47:0x80:0xAC
+
+# White jelly
+R:48:0x80:0xEA
+
+# Giant black ant
+R:49:0x80:0xE1
+
+# Salamander
+R:50:0x80:0xD2
+
+# White harpy
+R:51:0x80:0xC8
+
+# Blue yeek
+R:52:0x80:0xF9
+
+# Grip, Farmer Maggot's dog
+R:53:0x80:0xC3
+
+# Wolf, Farmer Maggot's dog
+R:54:0x80:0xC3
+
+# Fang, Farmer Maggot's dog
+R:55:0x80:0xC3
+
+# Giant green frog
+R:56:0x80:0xD2
+
+# Freesia
+R:57:0x80:0xE6
+
+# Green worm mass
+R:58:0x80:0xF7
+
+# Large yellow snake
+R:59:0x80:0xCA
+
+# Cave spider
+R:60:0x80:0xD3
+
+# Crow
+R:61:0x80:0xC2
+
+# Wild cat
+R:62:0x80:0xE6
+
+# Smeagol
+R:63:0x80:0xE8
+
+# Green ooze
+R:64:0x80:0xEA
+
+# Poltergeist
+R:65:0x80:0xC7
+
+# Yellow jelly
+R:66:0x80:0xEA
+
+# Metallic blue centipede
+R:67:0x80:0xE3
+
+# Raven
+R:68:0x80:0xC2
+
+# Giant white louse
+R:69:0x80:0xEC
+
+# Piranha
+R:70:0x80:0xFE
+
+# Black naga
+R:71:0x80:0xEE
+
+# Spotted mushroom patch
+R:72:0x80:0xAC
+
+# Silver jelly
+R:73:0x80:0xEA
+
+# Scruffy looking hobbit
+R:74:0x80:0xE8
+
+# Giant white ant
+R:75:0x80:0xE1
+
+# Yellow mold
+R:76:0x80:0xED
+
+# Metallic red centipede
+R:77:0x80:0xE3
+
+# Yellow worm mass
+R:78:0x80:0xF7
+
+# Clear worm mass
+R:79:0x80:0xF7
+
+# Radiation eye
+R:80:0x80:0xE5
+
+# Yellow light
+R:81:0x80:0xAA
+
+# Cave lizard
+R:82:0x80:0xD2
+
+# Novice ranger
+R:83:0x80:0xF0
+
+# Blue jelly
+R:84:0x80:0xEA
+
+# Creeping copper coins
+R:85:0x80:0xA4
+
+# Giant white rat
+R:86:0x80:0xF2
+
+# Snotling
+R:87:0x80:0xEF
+
+# Swordfish
+R:88:0x80:0xFE
+
+# Blue worm mass
+R:89:0x80:0xF7
+
+# Large grey snake
+R:90:0x80:0xCA
+
+# Skeleton kobold
+R:91:0x80:0xF3
+
+# Ewok
+R:92:0x80:0xE8
+
+# Novice mage
+R:93:0x80:0xF0
+
+# Green naga
+R:94:0x80:0xEE
+
+# Giant leech
+R:95:0x80:0xF7
+
+# Barracuda
+R:96:0x80:0xFE
+
+# Novice paladin
+R:97:0x80:0xF0
+
+# Zog
+R:98:0x80:0xE8
+
+# Blue ooze
+R:99:0x80:0xEA
+
+# Green glutton ghost
+R:100:0x80:0xC7
+
+# Green jelly
+R:101:0x80:0xEA
+
+# Large kobold
+R:102:0x80:0xEB
+
+# Grey icky thing
+R:103:0x80:0xE9
+
+# Disenchanter eye
+R:104:0x80:0xE5
+
+# Red worm mass
+R:105:0x80:0xF7
+
+# Copperhead snake
+R:106:0x80:0xCA
+
+# Death sword
+R:107:0x80:0xFC
+
+# Purple mushroom patch
+R:108:0x80:0xAC
+
+# Novice priest
+R:109:0x80:0xF0
+
+# Novice warrior
+R:110:0x80:0xF0
+
+# Nibelung
+R:111:0x80:0xE8
+
+# Disembodied hand that strangled people
+R:112:0x80:0xFA
+
+# Brown mold
+R:113:0x80:0xED
+
+# Giant brown bat
+R:114:0x80:0xE2
+
+# Rat-thing
+R:115:0x80:0xF2
+
+# Novice archer
+R:116:0x81:0xC1
+
+# Creeping silver coins
+R:117:0x80:0xA4
+
+# Snaga
+R:118:0x80:0xEF
+
+# Rattlesnake
+R:119:0x80:0xCA
+
+# Giant slug
+R:120:0x80:0xF7
+
+# Giant pink frog
+R:121:0x80:0xD2
+
+# Dark elf
+R:122:0x80:0xE8
+
+# Zombified kobold
+R:123:0x80:0xFA
+
+# Crypt Creep
+R:124:0x80:0xF3
+
+# Rotting corpse
+R:125:0x80:0xFA
+
+# Cave orc
+R:126:0x81:0xBC
+
+# Wood spider
+R:127:0x80:0xD3
+
+# Manes
+R:128:0x80:0xF5
+
+# Bloodshot eye
+R:129:0x80:0xE5
+
+# Red naga
+R:130:0x80:0xEE
+
+# Red jelly
+R:131:0x80:0xEA
+
+# Green icky thing
+R:132:0x80:0xE9
+
+# Lost soul
+R:133:0x80:0xC7
+
+# Night lizard
+R:134:0x80:0xD2
+
+# Mughash the Kobold Lord
+R:135:0x80:0xEB
+
+# Skeleton orc
+R:136:0x80:0xF3
+
+# Wormtongue, Agent of Saruman
+R:137:0x80:0xF0
+
+# Robin Hood, the Outlaw
+R:138:0x80:0xF0
+
+# Nurgling
+R:139:0x80:0xF5
+
+# Lagduf, the Snaga
+R:140:0x80:0xEF
+
+# Brown yeek
+R:141:0x80:0xF9
+
+# Novice ranger
+R:142:0x80:0xF0
+
+# Giant salamander
+R:143:0x80:0xD2
+
+# Space monster
+R:144:0x80:0xAE
+
+# Carnivorous flying monkey
+R:145:0x80:0xC8
+
+# Green mold
+R:146:0x80:0xED
+
+# Novice paladin
+R:147:0x80:0xF0
+
+# Lemure
+R:148:0x80:0xF5
+
+# Hill orc
+R:149:0x80:0xEF
+
+# Bandit
+R:150:0x80:0xF0
+
+# Hunting hawk
+R:151:0x80:0xC2
+
+# Phantom warrior
+R:152:0x80:0xC7
+
+# Gremlin
+R:153:0x80:0xF5
+
+# Yeti
+R:154:0x80:0xD9
+
+# Bloodshot icky thing
+R:155:0x80:0xE9
+
+# Giant grey rat
+R:156:0x80:0xF2
+
+# Black harpy
+R:157:0x80:0xC8
+
+# Skaven
+R:158:0x80:0xF2
+
+# The wounded bear
+R:159:0x80:0xF1
+
+# Portuguese man-o-war
+R:160:0x80:0xEA
+
+# Rock mole
+R:161:0x80:0xF2
+
+# Orc shaman
+R:162:0x80:0xEF
+
+# Baby blue dragon
+R:163:0x80:0xE4
+
+# Baby white dragon
+R:164:0x80:0xE4
+
+# Baby green dragon
+R:165:0x80:0xE4
+
+# Baby black dragon
+R:166:0x80:0xE4
+
+# Baby red dragon
+R:167:0x80:0xE4
+
+# Giant red ant
+R:168:0x80:0xE1
+
+# Brodda, the Easterling
+R:169:0x80:0xF0
+
+# Bloodfang the Wolf
+R:170:0x80:0xC3
+
+# King cobra
+R:171:0x80:0xCA
+
+# Eagle
+R:172:0x80:0xC2
+
+# War bear
+R:173:0x80:0xF1
+
+# Killer bee
+R:174:0x80:0xC9
+
+# Giant spider
+R:175:0x80:0xD3
+
+# Giant white tick
+R:176:0x80:0xD3
+
+# The Borshin
+R:177:0x80:0xE7
+
+# Dark elven mage
+R:178:0x80:0xE8
+
+# Kamikaze yeek
+R:179:0x80:0xF9
+
+# Orfax, Son of Boldor
+R:180:0x80:0xF9
+
+# Servant of Glaaki
+R:181:0x80:0xFA
+
+# Dark elven warrior
+R:182:0x81:0xBF
+
+# Sand-dweller
+R:183:0x80:0xF5
+
+# Clear mushroom patch
+R:184:0x80:0xAC
+
+# Quiver slot
+R:185:0x80:0xAC
+
+# Grishnakh, the Hill Orc
+R:186:0x80:0xEF
+
+# Giant piranha
+R:187:0x80:0xFE
+
+# Owlbear
+R:188:0x80:0xC8
+
+# Blue horror
+R:189:0x80:0xF5
+
+# Hairy mold
+R:190:0x80:0xED
+
+# Grizzly bear
+R:191:0x80:0xF1
+
+# Disenchanter mold
+R:192:0x80:0xED
+
+# Pseudo dragon
+R:193:0x80:0xE4
+
+# Tengu
+R:194:0x80:0xF5
+
+# Creeping gold coins
+R:195:0x80:0xA4
+
+# Wolf
+R:196:0x80:0xC3
+
+# Giant fruit fly
+R:197:0x80:0xC9
+
+# Panther
+R:198:0x80:0xE6
+
+# Brigand
+R:199:0x80:0xF0
+
+# Hobbes the Tiger
+R:200:0x80:0xE6
+
+# Shadow Creature of Fiona
+R:201:0x80:0xE8
+
+# Undead mass
+R:202:0x80:0xEA
+
+# Chaos shapechanger
+R:203:0x80:0xC8
+
+# Baby multi-hued dragon
+R:204:0x80:0xE4
+
+# Vorpal bunny
+R:205:0x80:0xF2
+
+# Old Man Willow
+R:206:0x80:0xA3
+
+# Hippocampus
+R:207:0x80:0xC8
+
+# Zombified orc
+R:208:0x80:0xFA
+
+# Hippogriff
+R:209:0x80:0xC8
+
+# Black mamba
+R:210:0x80:0xCA
+
+# White wolf
+R:211:0x80:0xC3
+
+# Grape jelly
+R:212:0x80:0xEA
+
+# Nether worm mass
+R:213:0x80:0xF7
+
+# Abyss worm mass
+R:214:0x80:0xF7
+
+# Golfimbul, the Hill Orc Chief
+R:215:0x80:0xEF
+
+# Swordsman
+R:216:0x80:0xF0
+
+# Skaven shaman
+R:217:0x80:0xF2
+
+# Gazer
+R:218:0x80:0xE5
+
+# Knight archer
+R:219:0x80:0xF0
+
+# Ixitxachitl
+R:220:0x80:0xFE
+
+# Mine-dog
+R:221:0x80:0xC3
+
+# Hellcat
+R:222:0x80:0xE6
+
+# Moon beast
+R:223:0x80:0xF1
+
+# Master yeek
+R:224:0x80:0xF9
+
+# Priest
+R:225:0x80:0xF0
+
+# Dark elven priest
+R:226:0x80:0xE8
+
+# Air spirit
+R:227:0x80:0xC5
+
+# Skeleton human
+R:228:0x80:0xF3
+
+# Zombified human
+R:229:0x80:0xFA
+
+# Tiger
+R:230:0x80:0xE6
+
+# Moaning spirit
+R:231:0x80:0xC7
+
+# Stegocentipede
+R:232:0x80:0xE3
+
+# Spotted jelly
+R:233:0x80:0xEA
+
+# Drider
+R:234:0x80:0xD3
+
+# Mongbat
+R:235:0x80:0xE2
+
+# Killer brown beetle
+R:236:0x80:0xCB
+
+# Boldor, King of the Yeeks
+R:237:0x80:0xF9
+
+# Ogre
+R:238:0x81:0xBD
+
+# Creeping mithril coins
+R:239:0x80:0xA4
+
+# Illusionist
+R:240:0x80:0xF0
+
+# Druid
+R:241:0x80:0xF0
+
+# Pink horror
+R:242:0x80:0xF5
+
+# Cloaker
+R:243:0x80:0xA8
+
+# Black orc
+R:244:0x80:0xEF
+
+# Ochre jelly
+R:245:0x80:0xEA
+
+# Software bug
+R:246:0x80:0xC9
+
+# Lurker
+R:247:0x80:0xAE
+
+# Nixie
+R:248:0x80:0xE8
+
+# Vlasta
+R:249:0x80:0xD2
+
+# Giant white dragon fly
+R:250:0x80:0xC6
+
+# Snaga sapper
+R:251:0x80:0xEF
+
+# Blue icky thing
+R:252:0x80:0xE9
+
+# Gibbering mouther
+R:253:0x80:0xEA
+
+# Irish wolfhound of Flora
+R:254:0x80:0xC3
+
+# Hill giant
+R:255:0x80:0xD0
+
+# Flesh golem
+R:256:0x80:0xE7
+
+# Warg
+R:257:0x80:0xC3
+
+# Cheerful leprechaun
+R:258:0x80:0xE8
+
+# Giant black flea
+R:259:0x80:0xC9
+
+# Ufthak of Cirith Ungol
+R:260:0x80:0xEF
+
+# Clay golem
+R:261:0x80:0xE7
+
+# Black ogre
+R:262:0x80:0xCF
+
+# Dweller on the threshold
+R:263:0x80:0xD9
+
+# Half-orc
+R:264:0x80:0xEF
+
+# Dark naga
+R:265:0x80:0xEE
+
+# Giant octopus
+R:266:0x80:0xFE
+
+# Magic mushroom patch
+R:267:0x80:0xAC
+
+# Plaguebearer of Nurgle
+R:268:0x80:0xFA
+
+# Guardian naga
+R:269:0x80:0xEE
+
+# Wererat
+R:270:0x80:0xF2
+
+# Light hound
+R:271:0x80:0xDA
+
+# Shadow hound
+R:272:0x80:0xDA
+
+# Flying skull
+R:273:0x80:0xF3
+
+# Mi-Go
+R:274:0x80:0xC9
+
+# Giant tarantula
+R:275:0x80:0xD3
+
+# Giant clear centipede
+R:276:0x80:0xE3
+
+# Mirkwood spider
+R:277:0x80:0xD3
+
+# Frost giant
+R:278:0x80:0xD0
+
+# Griffon
+R:279:0x80:0xC8
+
+# Homonculous
+R:280:0x80:0xF5
+
+# Gnome mage
+R:281:0x80:0xE8
+
+# Clear hound
+R:282:0x80:0xDA
+
+# Umber hulk
+R:283:0x80:0xD8
+
+# Rust monster
+R:284:0x80:0xF1
+
+# Orc captain
+R:285:0x80:0xEF
+
+# Gelatinous cube
+R:286:0x80:0xEA
+
+# Giant green dragon fly
+R:287:0x80:0xC6
+
+# Fire giant
+R:288:0x80:0xD0
+
+# Hummerhorn
+R:289:0x80:0xC9
+
+# Lizardman
+R:290:0x80:0xE8
+
+# Ulfast, Son of Ulfang
+R:291:0x80:0xF0
+
+# Hammerhead
+R:292:0x80:0xFE
+
+# Berserker
+R:293:0x80:0xF0
+
+# Quasit
+R:294:0x80:0xF5
+
+# Sphinx
+R:295:0x80:0xC8
+
+# Imp
+R:296:0x80:0xF5
+
+# Forest troll
+R:297:0x80:0xD4
+
+# Freezing sphere
+R:298:0x80:0xAA
+
+# Jumping fireball
+R:299:0x80:0xAA
+
+# Ball lightning
+R:300:0x80:0xAA
+
+# 2-headed hydra
+R:301:0x80:0xCD
+
+# Swamp thing
+R:302:0x80:0xC8
+
+# Water spirit
+R:303:0x80:0xC5
+
+# Giant red scorpion
+R:304:0x80:0xD3
+
+# Earth spirit
+R:305:0x80:0xC5
+
+# Fire spirit
+R:306:0x80:0xC5
+
+# Fire hound
+R:307:0x80:0xDA
+
+# Cold hound
+R:308:0x80:0xDA
+
+# Energy hound
+R:309:0x80:0xDA
+
+# Potion mimic
+R:310:0x80:0xA1
+
+# Door mimic
+R:311:0x80:0xAB
+
+# Blink dog
+R:312:0x80:0xC3
+
+# Uruk
+R:313:0x80:0xEF
+
+# Shagrat, the Orc Captain
+R:314:0x80:0xEF
+
+# Gorbag, the Orc Captain
+R:315:0x80:0xEF
+
+# Shambling mound
+R:316:0x80:0xAC
+
+# White shark
+R:317:0x80:0xFE
+
+# Chaos beastman
+R:318:0x80:0xC8
+
+# Daemonette of Slaanesh
+R:319:0x80:0xF5
+
+# Giant bronze dragon fly
+R:320:0x80:0xC6
+
+# Stone giant
+R:321:0x80:0xD0
+
+# Giant black dragon fly
+R:322:0x80:0xC6
+
+# Stone golem
+R:323:0x80:0xE7
+
+# Red mold
+R:324:0x80:0xED
+
+# Giant gold dragon fly
+R:325:0x80:0xC6
+
+# Stunwall
+R:326:0x80:0xA3
+
+# Ghast
+R:327:0x80:0xFA
+
+# Ixitxachitl priest
+R:328:0x80:0xFE
+
+# Huorn
+R:329:0x80:0xA3
+
+# Bolg, Son of Azog
+R:330:0x80:0xEF
+
+# Phase spider
+R:331:0x80:0xD3
+
+# Lizard king
+R:332:0x80:0xE8
+
+# Landmine
+R:333:0x80:0xAE
+
+# Wyvern
+R:334:0x80:0xE4
+
+# Great eagle
+R:335:0x80:0xC2
+
+# Livingstone
+R:336:0x80:0xA3
+
+# Earth hound
+R:337:0x80:0xDA
+
+# Air hound
+R:338:0x80:0xDA
+
+# Sabre-tooth tiger
+R:339:0x80:0xE6
+
+# Water hound
+R:340:0x80:0xDA
+
+# Chimera
+R:341:0x80:0xC8
+
+# Quylthulg
+R:342:0x80:0xD1
+
+# Sasquatch
+R:343:0x80:0xD9
+
+# Weir
+R:344:0x80:0xC3
+
+# Whale
+R:345:0x80:0xFE
+
+# Electric eel
+R:346:0x80:0xCA
+
+# Werewolf
+R:347:0x80:0xC3
+
+# Dark elven lord
+R:348:0x80:0xE8
+
+# Cloud giant
+R:349:0x80:0xD0
+
+# Ugluk, the Uruk
+R:350:0x80:0xEF
+
+# Blue dragon bat
+R:351:0x80:0xE2
+
+# Scroll mimic
+R:352:0x80:0xBF
+
+# Chest mimic
+R:353:0x80:0xFE
+
+# Fire vortex
+R:354:0x80:0xF6
+
+# Water vortex
+R:355:0x80:0xF6
+
+# Lugdush, the Uruk
+R:356:0x80:0xEF
+
+# Arch-vile
+R:357:0x80:0xF5
+
+# Cold vortex
+R:358:0x80:0xF6
+
+# Energy vortex
+R:359:0x80:0xF6
+
+# Globefish
+R:360:0x80:0xFE
+
+# Carrion
+R:361:0x80:0xC2
+
+# Mummified orc
+R:362:0x80:0xFA
+
+# Killer whale
+R:363:0x80:0xFE
+
+# Serpent man
+R:364:0x80:0xCA
+
+# Vampiric mist
+R:365:0x80:0xA3
+
+# Killer stag beetle
+R:366:0x80:0xCB
+
+# Iron golem
+R:367:0x80:0xE7
+
+# Auto-roller
+R:368:0x80:0xE7
+
+# Giant yellow scorpion
+R:369:0x80:0xD3
+
+# Jade monk
+R:370:0x80:0xF0
+
+# Black ooze
+R:371:0x80:0xEA
+
+# Hardened warrior
+R:372:0x80:0xF0
+
+# Azog, King of the Uruk-Hai
+R:373:0x80:0xEF
+
+# Fleshhound of Khorne
+R:374:0x80:0xC3
+
+# Dark elven warlock
+R:375:0x80:0xE8
+
+# Master rogue
+R:376:0x80:0xF0
+
+# Red dragon bat
+R:377:0x80:0xE2
+
+# Killer white beetle
+R:378:0x80:0xCB
+
+# Ice skeleton
+R:379:0x80:0xF3
+
+# Angamaite of Umbar
+R:380:0x80:0xF0
+
+# Forest wight
+R:381:0x80:0xD7
+
+# Mime, the Nibelung
+R:382:0x80:0xE8
+
+# Ibun, Son of Mim
+R:383:0x80:0xE8
+
+# Meneldor the Swift
+R:384:0x80:0xC2
+
+# Phantom beast
+R:385:0x80:0xC7
+
+# Great white shark
+R:386:0x80:0xFE
+
+# 4-headed hydra
+R:387:0x80:0xCD
+
+# Lesser hell-beast
+R:388:0x80:0xD5
+
+# Tyrannosaur
+R:389:0x80:0xD2
+
+# Mummified human
+R:390:0x80:0xFA
+
+# Vampire bat
+R:391:0x80:0xE2
+
+# Sangahyando of Umbar
+R:392:0x80:0xF0
+
+# It
+R:393:0x80:0xAE
+
+# Banshee
+R:394:0x80:0xC7
+
+# Carrion crawler
+R:395:0x80:0xE3
+
+# Xiclotlan
+R:396:0x80:0xA3
+
+# Silent watcher
+R:397:0x80:0xE7
+
+# Pukelman
+R:398:0x80:0xE7
+
+# Disenchanter beast
+R:399:0x80:0xF1
+
+# Dark elven druid
+R:400:0x80:0xE8
+
+# Stone troll
+R:401:0x80:0xD4
+
+# Black
+R:402:0x80:0xEA
+
+# Troll priest
+R:403:0x80:0xD4
+
+# Wereworm
+R:404:0x80:0xF7
+
+# Killer crimson beetle
+R:405:0x80:0xCB
+
+# Vampiric ixitxachitl
+R:406:0x80:0xFE
+
+# Gnoph-Keh
+R:407:0x80:0xF1
+
+# Giant grey ant
+R:408:0x80:0xE1
+
+# Khufu the Mummified King
+R:409:0x80:0xFA
+
+# Gwaihir the Windlord
+R:410:0x80:0xC2
+
+# Giant red tick
+R:411:0x80:0xD3
+
+# Displacer beast
+R:412:0x80:0xE6
+
+# Ulwarth, Son of Ulfang
+R:413:0x80:0xF0
+
+# Agent of Saruman
+R:414:0x80:0xF0
+
+# Cave ogre
+R:415:0x80:0xCF
+
+# White wraith
+R:416:0x80:0xD7
+
+# Monadic Deva
+R:417:0x80:0xC1
+
+# Ghoul
+R:418:0x80:0xFA
+
+# Mim, Betrayer of Turin
+R:419:0x80:0xE8
+
+# Hellblade
+R:420:0x80:0xFC
+
+# Killer red beetle
+R:421:0x80:0xCB
+
+# Beast of Nurgle
+R:422:0x80:0xF1
+
+# Creeping adamantite coins
+R:423:0x80:0xA4
+
+# Algroth
+R:424:0x80:0xD4
+
+# Flamer of Tzeentch
+R:425:0x80:0xAC
+
+# Roper
+R:426:0x80:0xA3
+
+# Headless
+R:427:0x80:0xC8
+
+# Vibration hound
+R:428:0x80:0xDA
+
+# Nexus hound
+R:429:0x80:0xDA
+
+# Ogre mage
+R:430:0x80:0xCF
+
+# Lokkak, the Ogre Chieftain
+R:431:0x80:0xCF
+
+# Vampire
+R:432:0x80:0xD6
+
+# Gorgimera
+R:433:0x80:0xC8
+
+# Shantak
+R:434:0x80:0xC2
+
+# Colbran
+R:435:0x80:0xE7
+
+# Spirit naga
+R:436:0x80:0xEE
+
+# Corpser
+R:437:0x80:0xAC
+
+# Fiend of Slaanesh
+R:438:0x80:0xD3
+
+# Stairway to hell
+R:439:0x80:0xBE
+
+# 5-headed hydra
+R:440:0x80:0xCD
+
+# Barney the Dinosaur
+R:441:0x80:0xD2
+
+# Black knight
+R:442:0x80:0xF0
+
+# Seahorse
+R:443:0x80:0xFE
+
+# Cyclops
+R:444:0x80:0xD0
+
+# Clairvoyant
+R:445:0x80:0xF0
+
+# Giant purple worm
+R:446:0x80:0xF7
+
+# Catoblepas
+R:447:0x80:0xF1
+
+# Lesser wall monster
+R:448:0x80:0xA3
+
+# Mage
+R:449:0x80:0xF0
+
+# Mind flayer
+R:450:0x80:0xE8
+
+# The Ultimate Dungeon Cleaner
+R:451:0x80:0xE7
+
+# Deep one
+R:452:0x80:0xF5
+
+# Basilisk
+R:453:0x80:0xD2
+
+# Ice troll
+R:454:0x80:0xD4
+
+# Dhole
+R:455:0x80:0xF7
+
+# Movanic Deva
+R:456:0x80:0xC1
+
+# Ring mimic
+R:457:0x80:0xBD
+
+# Chaos tile
+R:458:0x80:0xAE
+
+# Young blue dragon
+R:459:0x80:0xE4
+
+# Young white dragon
+R:460:0x80:0xE4
+
+# Young green dragon
+R:461:0x80:0xE4
+
+# Young bronze dragon
+R:462:0x80:0xE4
+
+# Aklash
+R:463:0x80:0xD4
+
+# Mithril golem
+R:464:0x80:0xE7
+
+# Skeleton troll
+R:465:0x80:0xF3
+
+# Skeletal tyrannosaur
+R:466:0x80:0xD2
+
+# Jaws
+R:467:0x80:0xFE
+
+# Thorondor
+R:468:0x80:0xC2
+
+# Giant blue ant
+R:469:0x80:0xE1
+
+# Grave wight
+R:470:0x80:0xD7
+
+# Shadow drake
+R:471:0x80:0xE4
+
+# Manticore
+R:472:0x80:0xC8
+
+# Giant army ant
+R:473:0x80:0xE1
+
+# Killer slicer beetle
+R:474:0x80:0xCB
+
+# Gorgon
+R:475:0x80:0xC8
+
+# Gug
+R:476:0x80:0xC7
+
+# Ghost
+R:477:0x80:0xC7
+
+# Death watch beetle
+R:478:0x80:0xCB
+
+# Ogre shaman
+R:479:0x80:0xCF
+
+# Nexus quylthulg
+R:480:0x80:0xD1
+
+# Shelob, Spider of Darkness
+R:481:0x80:0xD3
+
+# Giant squid
+R:482:0x80:0xFE
+
+# Ghoulking
+R:483:0x80:0xFA
+
+# Doombat
+R:484:0x80:0xE2
+
+# Ninja
+R:485:0x80:0xF0
+
+# Memory moss
+R:486:0x80:0xAC
+
+# Storm giant
+R:487:0x80:0xD0
+
+# Spectator
+R:488:0x80:0xE5
+
+# Bokrug
+R:489:0x80:0xD2
+
+# Biclops
+R:490:0x80:0xD0
+
+# Half-troll
+R:491:0x80:0xD4
+
+# Ivory monk
+R:492:0x80:0xF0
+
+# Bert the Stone Troll
+R:493:0x80:0xD4
+
+# Bill the Stone Troll
+R:494:0x80:0xD4
+
+# Tom the Stone Troll
+R:495:0x80:0xD4
+
+# Cave troll
+R:496:0x80:0xD4
+
+# Anti-paladin
+R:497:0x80:0xF0
+
+# Chaos master
+R:498:0x80:0xF0
+
+# Barrow wight
+R:499:0x80:0xD7
+
+# Giant skeleton troll
+R:500:0x80:0xF3
+
+# Chaos drake
+R:501:0x80:0xE4
+
+# Law drake
+R:502:0x80:0xE4
+
+# Balance drake
+R:503:0x80:0xE4
+
+# Ethereal drake
+R:504:0x80:0xE4
+
+# Groo the Wanderer
+R:505:0x80:0xD4
+
+# Fasolt the Giant
+R:506:0x80:0xD0
+
+# Shade
+R:507:0x80:0xC7
+
+# Spectre
+R:508:0x80:0xC7
+
+# Water troll
+R:509:0x80:0xD4
+
+# Fire elemental
+R:510:0x80:0xC5
+
+# Cherub
+R:511:0x80:0xC1
+
+# Water elemental
+R:512:0x80:0xC5
+
+# Multi-hued hound
+R:513:0x80:0xDA
+
+# Night stalker
+R:514:0x80:0xC5
+
+# Carrion crawler
+R:515:0x80:0xE3
+
+# Master thief
+R:516:0x80:0xF0
+
+# Waldern, King of Water
+R:517:0x80:0xC5
+
+# Lich
+R:518:0x80:0xCC
+
+# Gas spore
+R:519:0x80:0xE5
+
+# Master vampire
+R:520:0x80:0xD6
+
+# Oriental vampire
+R:521:0x80:0xD6
+
+# Greater mummy
+R:522:0x80:0xFA
+
+# Bloodletter of Khorne
+R:523:0x80:0xD5
+
+# Giant grey scorpion
+R:524:0x80:0xD3
+
+# Earth elemental
+R:525:0x80:0xC5
+
+# Air elemental
+R:526:0x80:0xC5
+
+# Doom drake
+R:527:0x80:0xE4
+
+# Gargoyle
+R:528:0x80:0xF5
+
+# Malicious leprechaun
+R:529:0x80:0xE8
+
+# Eog golem
+R:530:0x80:0xE7
+
+# Little Boy
+R:531:0x80:0xFB
+
+# Dagashi
+R:532:0x80:0xF0
+
+# Headless ghost
+R:533:0x80:0xC7
+
+# Dread
+R:534:0x80:0xC7
+
+# Leng spider
+R:535:0x80:0xD3
+
+# Star vampire
+R:536:0x80:0xD6
+
+# Smoke elemental
+R:537:0x80:0xC5
+
+# Olog
+R:538:0x80:0xD4
+
+# Halfling slinger
+R:539:0x80:0xE8
+
+# Gravity hound
+R:540:0x80:0xDA
+
+# Acidic cytoplasm
+R:541:0x80:0xEA
+
+# Inertia hound
+R:542:0x80:0xDA
+
+# Impact hound
+R:543:0x80:0xDA
+
+# Sea troll
+R:544:0x80:0xD4
+
+# Ooze elemental
+R:545:0x80:0xC5
+
+# Young black dragon
+R:546:0x80:0xE4
+
+# Mumak
+R:547:0x80:0xF1
+
+# Giant red ant
+R:548:0x80:0xE1
+
+# Mature white dragon
+R:549:0x80:0xE4
+
+# Xorn
+R:550:0x80:0xD8
+
+# Rogrog the Black Troll
+R:551:0x80:0xD4
+
+# Mist giant
+R:552:0x80:0xA3
+
+# Phantom
+R:553:0x80:0xC7
+
+# Grey wraith
+R:554:0x80:0xD7
+
+# Revenant
+R:555:0x80:0xD7
+
+# Young multi-hued dragon
+R:556:0x80:0xE4
+
+# Raal's Tome of Destruction
+R:557:0x80:0xBF
+
+# Colossus
+R:558:0x80:0xE7
+
+# Young gold dragon
+R:559:0x80:0xE4
+
+# Mature blue dragon
+R:560:0x80:0xE4
+
+# Mature green dragon
+R:561:0x80:0xE4
+
+# Mature bronze dragon
+R:562:0x80:0xE4
+
+# Young red dragon
+R:563:0x80:0xE4
+
+# Nightblade
+R:564:0x80:0xE8
+
+# Trapper
+R:565:0x80:0xAE
+
+# Bodak
+R:566:0x80:0xF5
+
+# Time bomb
+R:567:0x80:0xAE
+
+# Mezzodaemon
+R:568:0x80:0xF5
+
+# Elder thing
+R:569:0x80:0xF5
+
+# Ice elemental
+R:570:0x80:0xC5
+
+# Necromancer
+R:571:0x81:0xBE
+
+# The Greater hell magic mushroom were-quylthulg
+R:572:0x80:0xD1
+
+# Lorgan, Chief of the Easterlings
+R:573:0x80:0xF0
+
+# Chaos spawn
+R:574:0x80:0xE5
+
+# Mummified troll
+R:575:0x80:0xFA
+
+# Fire angel
+R:576:0x80:0xE4
+
+# Crypt thing
+R:577:0x80:0xCC
+
+# Chaos butterfly
+R:578:0x80:0xC9
+
+# Time elemental
+R:579:0x80:0xC5
+
+# Flying polyp
+R:580:0x80:0xFE
+
+# The Queen Ant
+R:581:0x80:0xE1
+
+# Will o' the wisp
+R:582:0x80:0xC5
+
+# Shan
+R:583:0x80:0xC9
+
+# Magma elemental
+R:584:0x80:0xC5
+
+# Black pudding
+R:585:0x80:0xEA
+
+# Killer iridescent beetle
+R:586:0x80:0xCB
+
+# Nexus vortex
+R:587:0x80:0xF6
+
+# Plasma vortex
+R:588:0x80:0xF6
+
+# Mature red dragon
+R:589:0x80:0xE4
+
+# Mature gold dragon
+R:590:0x80:0xE4
+
+# Crystal drake
+R:591:0x80:0xE4
+
+# Mature black dragon
+R:592:0x80:0xE4
+
+# Mature multi-hued dragon
+R:593:0x80:0xE4
+
+# Sky whale
+R:594:0x80:0xFE
+
+# Draebor, the Imp
+R:595:0x80:0xF5
+
+# Mother Hydra
+R:596:0x80:0xF5
+
+# Death knight
+R:597:0x80:0xF0
+
+# Castamir the Usurper
+R:598:0x80:0xF0
+
+# Time vortex
+R:599:0x80:0xF6
+
+# Shimmering vortex
+R:600:0x80:0xF6
+
+# Ancient blue dragon
+R:601:0x80:0xC4
+
+# Ancient bronze dragon
+R:602:0x80:0xC4
+
+# Beholder
+R:603:0x80:0xE5
+
+# Emperor wight
+R:604:0x80:0xD7
+
+# Planetar
+R:605:0x80:0xC1
+
+# Vargo, Tyrant of Fire
+R:606:0x80:0xC5
+
+# Black wraith
+R:607:0x80:0xD7
+
+# Nightgaunt
+R:608:0x80:0xD5
+
+# Baron of hell
+R:609:0x80:0xD5
+
+# Medusa
+R:610:0x80:0xCD
+
+# Monastic lich
+R:611:0x80:0xCC
+
+# Nether wraith
+R:612:0x80:0xD7
+
+# Fire vampire
+R:613:0x80:0xD6
+
+# 7-headed hydra
+R:614:0x80:0xCD
+
+# Moire, Queen of Rebma
+R:615:0x80:0xC5
+
+# Kavlax the Many-Headed
+R:616:0x80:0xE4
+
+# Ancient white dragon
+R:617:0x80:0xC4
+
+# Ancient green dragon
+R:618:0x80:0xC4
+
+# Chthonian
+R:619:0x80:0xF7
+
+# Eldrak
+R:620:0x80:0xD4
+
+# Ettin
+R:621:0x80:0xD4
+
+# Night mare
+R:622:0x80:0xF1
+
+# Vampire lord
+R:623:0x80:0xD6
+
+# Ancient black dragon
+R:624:0x80:0xC4
+
+# Weird fume
+R:625:0x80:0xA3
+
+# Spawn of Ubbo-Sathla
+R:626:0x80:0xEA
+
+# Fat Man
+R:627:0x80:0xFB
+
+# Malekith the Accursed
+R:628:0x80:0xE8
+
+# Shadowfax, steed of Gandalf
+R:629:0x80:0xF1
+
+# Spirit troll
+R:630:0x80:0xD4
+
+# War troll
+R:631:0x80:0xD4
+
+# Disenchanter worm mass
+R:632:0x80:0xF7
+
+# Rotting quylthulg
+R:633:0x80:0xD1
+
+# Lesser titan
+R:634:0x80:0xD0
+
+# 9-headed hydra
+R:635:0x80:0xCD
+
+# Enchantress
+R:636:0x80:0xF0
+
+# Archpriest
+R:637:0x80:0xF0
+
+# Sorcerer
+R:638:0x80:0xF0
+
+# Xaren
+R:639:0x80:0xD8
+
+# Giant roc
+R:640:0x80:0xC2
+
+# Minotaur
+R:641:0x80:0xC8
+
+# Jasra, Brand's Mistress
+R:642:0x80:0xEE
+
+# Death drake
+R:643:0x80:0xC4
+
+# Ancient red dragon
+R:644:0x80:0xC4
+
+# Ancient gold dragon
+R:645:0x80:0xC4
+
+# Great crystal drake
+R:646:0x80:0xC4
+
+# Wyrd sister
+R:647:0x80:0xF0
+
+# Clubber demon
+R:648:0x80:0xD5
+
+# Death quasit
+R:649:0x80:0xF5
+
+# Giganto the Gargantuan
+R:650:0x80:0xFE
+
+# Strygalldwir
+R:651:0x80:0xD5
+
+# Fallen angel
+R:652:0x80:0xC1
+
+# Giant headless
+R:653:0x80:0xC8
+
+# Judge Fire
+R:654:0x80:0xF3
+
+# Ubbo-Sathla, the Unbegotten Source
+R:655:0x80:0xEA
+
+# Judge Mortis
+R:656:0x80:0xFA
+
+# Dark elven sorceror
+R:657:0x80:0xE8
+
+# Master lich
+R:658:0x80:0xCC
+
+# Byakhee
+R:659:0x80:0xD5
+
+# Eol the Dark Elf
+R:660:0x80:0xE8
+
+# Archon
+R:661:0x80:0xC1
+
+# Formless spawn of Tsathoggua
+R:662:0x80:0xD5
+
+# Hunting horror
+R:663:0x80:0xD5
+
+# Undead beholder
+R:664:0x80:0xE5
+
+# Shadow demon
+R:665:0x80:0xC7
+
+# Iron lich
+R:666:0x80:0xCC
+
+# Dread
+R:667:0x80:0xC7
+
+# Greater basilisk
+R:668:0x80:0xD2
+
+# Charybdis
+R:669:0x80:0xFE
+
+# Jack of Shadows
+R:670:0x80:0xF0
+
+# Zephyr Lord
+R:671:0x80:0xD7
+
+# Juggernaut of Khorne
+R:672:0x80:0xE7
+
+# Great Mumak
+R:673:0x80:0xF1
+
+# Judge Fear
+R:674:0x80:0xD7
+
+# Ancient multi-hued dragon
+R:675:0x80:0xC4
+
+# Ethereal dragon
+R:676:0x80:0xC4
+
+# Dark young of Shub-Niggurath
+R:677:0x80:0xA3
+
+# Colour out of space
+R:678:0x80:0xAE
+
+# Quaker, Master of Earth
+R:679:0x80:0xC5
+
+# Death leprechaun
+R:680:0x80:0xE8
+
+# Chaugnar Faugn, Horror from the Hills
+R:681:0x80:0xF1
+
+# Lloigor
+R:682:0x80:0xF6
+
+# Utgard-Loke
+R:683:0x80:0xD0
+
+# Quachil Uttaus, Treader of the Dust
+R:684:0x80:0xFA
+
+# Shoggoth
+R:685:0x80:0xEA
+
+# Judge Death
+R:686:0x80:0xD7
+
+# Ariel, Queen of Air
+R:687:0x80:0xC5
+
+# 11-headed hydra
+R:688:0x80:0xCD
+
+# High priest
+R:689:0x80:0xF0
+
+# Dreadmaster
+R:690:0x80:0xC7
+
+# Drolem
+R:691:0x80:0xE7
+
+# Scatha the Worm
+R:692:0x80:0xC4
+
+# Warrior of the Dawn
+R:693:0x80:0xF0
+
+# Lesser black reaver
+R:694:0x80:0xCC
+
+# Zoth-Ommog
+R:695:0x80:0xD2
+
+# Grand master thief
+R:696:0x80:0xF0
+
+# Smaug the Golden
+R:697:0x80:0xC4
+
+# The Stormbringer
+R:698:0x80:0xFC
+
+# Ultra-elite paladin
+R:699:0x80:0xF0
+
+# Leprechaun fanatic
+R:700:0x80:0xE8
+
+# Dracolich
+R:701:0x80:0xC4
+
+# Greater titan
+R:702:0x80:0xD0
+
+# Dracolisk
+R:703:0x80:0xC4
+
+# Fastitocalon
+R:704:0x80:0xC4
+
+# Spectral tyrannosaur
+R:705:0x80:0xD2
+
+# Yibb-Tstll the Patient One
+R:706:0x80:0xD0
+
+# Ghatanothoa
+R:707:0x80:0xC8
+
+# Ent
+R:708:0x80:0xA3
+
+# Hru
+R:709:0x80:0xD0
+
+# Itangast the Fire Drake
+R:710:0x80:0xC4
+
+# Death mold
+R:711:0x80:0xED
+
+# Fafner the Dragon
+R:712:0x80:0xC4
+
+# Charon the Boatsman
+R:713:0x80:0xD7
+
+# Quickbeam
+R:714:0x80:0xA3
+
+# Glaurung, Father of the Dragons
+R:715:0x80:0xC4
+
+# Behemoth
+R:716:0x80:0xC8
+
+# Garm, Guardian of Hel
+R:717:0x80:0xC3
+
+# Greater wall monster
+R:718:0x80:0xA3
+
+# Nycadaemon
+R:719:0x80:0xD5
+
+# Balrog
+R:720:0x80:0xD5
+
+# Goat of Mendes
+R:721:0x80:0xF1
+
+# Nightwing
+R:722:0x80:0xD7
+
+# Maulotaur
+R:723:0x80:0xC8
+
+# Nether hound
+R:724:0x80:0xDA
+
+# Time hound
+R:725:0x80:0xDA
+
+# Plasma hound
+R:726:0x80:0xDA
+
+# Demonic quylthulg
+R:727:0x80:0xD1
+
+# Great storm wyrm
+R:728:0x80:0xC4
+
+# Ulik the Troll
+R:729:0x80:0xD4
+
+# Baphomet the Minotaur Lord
+R:730:0x80:0xC8
+
+# Hell knight
+R:731:0x80:0xF0
+
+# Bull Gates
+R:732:0x80:0xF0
+
+# Santa Claus
+R:733:0x80:0xE8
+
+# Eihort, the Thing in the Labyrinth
+R:734:0x80:0xEA
+
+# The King in Yellow
+R:735:0x80:0xCC
+
+# Great unclean one
+R:736:0x80:0xD5
+
+# Lord of Chaos
+R:737:0x80:0xF0
+
+# Old Sorcerer
+R:738:0x80:0xF0
+
+# Hound of Tindalos
+R:739:0x80:0xDA
+
+# Lesser kraken
+R:740:0x80:0xFE
+
+# Great ice wyrm
+R:741:0x80:0xC4
+
+# Demilich
+R:742:0x80:0xCC
+
+# The Phoenix
+R:743:0x80:0xC2
+
+# Nightcrawler
+R:744:0x80:0xD7
+
+# Lord of Change
+R:745:0x80:0xC2
+
+# Keeper of Secrets
+R:746:0x80:0xC8
+
+# Shudde M'ell
+R:747:0x80:0xF7
+
+# Hand druj
+R:748:0x80:0xF3
+
+# Eye druj
+R:749:0x80:0xF3
+
+# Skull druj
+R:750:0x80:0xF3
+
+# Chaos vortex
+R:751:0x80:0xF6
+
+# Aether vortex
+R:752:0x80:0xF6
+
+# Nidhogg the Hel-Drake
+R:753:0x80:0xC4
+
+# The Lernean Hydra
+R:754:0x80:0xCD
+
+# Thuringwethil
+R:755:0x80:0xD6
+
+# Great hell wyrm
+R:756:0x80:0xC4
+
+# Hastur the Unspeakable
+R:757:0x80:0xC8
+
+# Bloodthirster
+R:758:0x80:0xD5
+
+# Draconic quylthulg
+R:759:0x80:0xD1
+
+# Nyogtha, the Thing that Should not Be
+R:760:0x80:0xEA
+
+# Ahtu, Avatar of Nyarlathotep
+R:761:0x80:0xA3
+
+# Fundin Bluecloak
+R:762:0x80:0xE8
+
+# The Philosophy Teacher
+R:763:0x80:0xF0
+
+# Uriel, Angel of Fire
+R:764:0x80:0xC1
+
+# Azriel, Angel of Death
+R:765:0x80:0xC1
+
+# Ancalagon the Black
+R:766:0x80:0xC4
+
+# Daoloth, the Render of the Veils
+R:767:0x80:0xD5
+
+# Nightwalker
+R:768:0x80:0xD7
+
+# Gabriel, the Messenger
+R:769:0x80:0xC1
+
+# Artsi the Champion of Chaos
+R:770:0x80:0xE8
+
+# Saruman of Many Colours
+R:771:0x80:0xF0
+
+# Harowen the Black Hand
+R:772:0x80:0xF0
+
+# The Physics Teacher
+R:773:0x80:0xF0
+
+# Shadowlord
+R:774:0x80:0xC7
+
+# Greater kraken
+R:775:0x80:0xFE
+
+# Archlich
+R:776:0x80:0xCC
+
+# The Cat Lord
+R:777:0x80:0xE6
+
+# Chaos beetle
+R:778:0x80:0xCB
+
+# Chaos hound
+R:779:0x80:0xDA
+
+# Vlad Dracula, Prince of Darkness
+R:780:0x80:0xD6
+
+# Ultimate beholder
+R:781:0x80:0xE5
+
+# Leviathan
+R:782:0x80:0xC4
+
+# Great Wyrm of Chaos
+R:783:0x80:0xC4
+
+# Great Wyrm of Law
+R:784:0x80:0xC4
+
+# Great Wyrm of Balance
+R:785:0x80:0xC4
+
+# Shambler
+R:786:0x80:0xC5
+
+# Hypnos, Lord of Sleep
+R:787:0x80:0xD0
+
+# Glaaki
+R:788:0x80:0xFE
+
+# T'ron, the rebel DragonRider
+R:789:0x80:0xC4
+
+# Great Wyrm of Many Colours
+R:790:0x80:0xC4
+
+# Mardra, rider of the Gold Loranth
+R:791:0x80:0xC4
+
+# Tselakus, the Dreadlord
+R:792:0x80:0xC7
+
+# Sky Drake
+R:793:0x80:0xC4
+
+# Eilinel the Entrapped
+R:794:0x80:0xF0
+
+# Tiamat, Celestial Dragon of Evil
+R:795:0x80:0xC4
+
+# The Norsa
+R:796:0x80:0xC8
+
+# Rhan-Tegoth
+R:797:0x80:0xD3
+
+# Black reaver
+R:798:0x80:0xCC
+
+# Troll High Priest
+R:799:0x80:0xD4
+
+# Master quylthulg
+R:800:0x80:0xD1
+
+# Greater draconic quylthulg
+R:801:0x80:0xD1
+
+# Greater rotting quylthulg
+R:802:0x80:0xD1
+
+# Null the Living Void
+R:803:0x80:0xAE
+
+# Vecna, the Emperor Lich
+R:804:0x80:0xCC
+
+# Omarax the Eye Tyrant
+R:805:0x80:0xE5
+
+# Tsathoggua, the Sleeper of N'kai
+R:806:0x80:0xF2
+
+# Greater Balrog
+R:807:0x80:0xD5
+
+# Ungoliant, the Unlight
+R:808:0x80:0xD3
+
+# Atlach-Nacha, the Spider God
+R:809:0x80:0xD3
+
+# Y'golonac
+R:810:0x80:0xC8
+
+# Aether hound
+R:811:0x80:0xDA
+
+# Warp demon
+R:812:0x80:0xD5
+
+# Serpent of Chaos
+R:813:0x80:0xCA
+
+# Yig, Father of Serpents
+R:814:0x80:0xD2
+
+# Unmaker
+R:815:0x80:0xC5
+
+# Cyberdemon
+R:816:0x80:0xD5
+
+# Hela, Queen of the Dead
+R:817:0x80:0xF0
+
+# The Mouth of Sauron
+R:818:0x80:0xF0
+
+# Klingsor, Evil Master of Magic
+R:819:0x80:0xF0
+
+# Lessa, rider of the Gold Ramoth
+R:820:0x80:0xC4
+
+# The Emperor Quylthulg
+R:821:0x80:0xD1
+
+# Qlzqqlzuup, the Lord of Flesh
+R:822:0x80:0xD1
+
+# Cthugha, the Living Flame
+R:823:0x80:0xC5
+
+# F'lar, rider of the Bronze Mnementh
+R:824:0x80:0xC4
+
+# Maeglin, Betrayer of Gondolin
+R:825:0x80:0xE8
+
+# Cyaegha
+R:826:0x80:0xE5
+
+# Pazuzu, Lord of Air
+R:827:0x80:0xC2
+
+# Ithaqua the Windwalker
+R:828:0x80:0xD9
+
+# Hell hound
+R:829:0x80:0xC3
+
+# Cantoras, the Skeletal Lord
+R:830:0x80:0xF3
+
+# Mephistopheles, Lord of Hell
+R:831:0x80:0xD5
+
+# Godzilla
+R:832:0x80:0xD2
+
+# Abhoth, Source of Uncleanness
+R:833:0x80:0xCA
+
+# Ymir the Ice Giant
+R:834:0x80:0xD0
+
+# Loki the Trickster
+R:835:0x80:0xD0
+
+# Star-spawn of Cthulhu
+R:836:0x80:0xD5
+
+# Surtur the Giant Fire Demon
+R:837:0x80:0xD0
+
+# The Tarrasque
+R:838:0x80:0xD2
+
+# Lungorthin, the Balrog of White Fire
+R:839:0x80:0xD5
+
+# Draugluin, Sire of All Werewolves
+R:840:0x80:0xC3
+
+# Shuma-Gorath
+R:841:0x80:0xE5
+
+# Tulzscha, the Green Flame
+R:842:0x80:0xC5
+
+# Oremorj the Cyberdemon Lord
+R:843:0x80:0xD5
+
+# Feagwath the Undead Sorceror
+R:844:0x80:0xCC
+
+# Yog-Sothoth, the All-in-One
+R:845:0x80:0xEA
+
+# Fenris Wolf
+R:846:0x80:0xC3
+
+# Great Wyrm of Power
+R:847:0x80:0xC4
+
+# Shub-Niggurath, Black Goat of the Woods
+R:848:0x80:0xD5
+
+# Nodens, Lord of the Great Abyss
+R:849:0x80:0xD0
+
+# Carcharoth, the Jaws of Thirst
+R:850:0x80:0xC3
+
+# Nyarlathotep, the Crawling Chaos
+R:851:0x80:0xD5
+
+# Azathoth, the Daemon Sultan
+R:852:0x80:0xC5
+
+# Cerberus, Guardian of Hades
+R:853:0x80:0xC3
+
+# Jormungand the Midgard Serpent
+R:854:0x80:0xCA
+
+# The Destroyer
+R:855:0x80:0xE7
+
+# Gothmog, the High Captain of Balrogs
+R:856:0x80:0xD5
+
+# Great Cthulhu
+R:857:0x80:0xD5
+
+# Sorka, rider of the Gold Faranth
+R:858:0x80:0xC4
+
+# The Unicorn of Order
+R:859:0x80:0xF1
+
+# Sauron, the Sorcerer
+R:860:0x80:0xF0
+
+# Dark God, the Mighty Coder of Hell
+R:861:0x80:0xD0
+
+# Morgoth, Lord of Darkness
+R:862:0x80:0xD0
+
+# Human Warrior
+R:863:0x81:0xB7
+
+# Elven Archer
+R:864:0x81:0xC0
+
+# Dwarven Warrior
+R:865:0x80:0xE8
+
+# Mountain Orc
+R:866:0x80:0xEF
+
+# The Philosophy Teacher
+R:867:0x80:0xD0
+
+# The Variant Maintainer
+R:868:0x80:0xF0
+
+# Random Number Generator
+R:869:0x80:0xC9
+
+# Rocket mine
+R:870:0x80:0xAE
+
+# Bouncing mine
+R:871:0x80:0xAE
+
+# Muar, the Balrog
+R:872:0x80:0xD5
+
+# The Icky Queen
+R:873:0x80:0xE9
+
+# Ratmold
+R:874:0x80:0xED
+
+# Death
+R:875:0x80:0xC7
+
+# Famine
+R:876:0x80:0xC7
+
+# Pestilence
+R:877:0x80:0xC7
+
+# War
+R:878:0x80:0xC7
+
+# Pike
+R:879:0x80:0xFE
+
+# Electric eel
+R:880:0x80:0xFE
+
+# Giant crayfish
+R:881:0x80:0xFE
+
+# Mermaid
+R:882:0x80:0xE8
+
+# Merman
+R:883:0x80:0xE8
+
+# Big Pirahna
+R:884:0x80:0xFE
+
+# Lizard man
+R:885:0x80:0xE8
+
+# Frogman
+R:886:0x80:0xE8
+
+# Frogman warrior
+R:887:0x80:0xE8
+
+# Frogman shaman
+R:888:0x80:0xE8
+
+# Small medusa
+R:889:0x80:0xD1
+
+# Sand mite
+R:890:0x80:0xFE
+
+# Octopus
+R:891:0x80:0xD1
+
+# Kraken
+R:892:0x80:0xD1
+
+# Aquatic beholder
+R:893:0x80:0xE5
+
+# Murk dweller
+R:894:0x80:0xD3
+
+# Drowned soul
+R:895:0x80:0xC7
+
+# Tiger shark
+R:896:0x80:0xFE
+
+# Hammerhead shark
+R:897:0x80:0xFE
+
+# Great white shark
+R:898:0x80:0xFE
+
+# Aquatic golem
+R:899:0x80:0xE7
+
+# Aquatic kobold
+R:900:0x80:0xEB
+
+# Elder kraken
+R:901:0x80:0xD1
+
+# Aquatic troll
+R:902:0x80:0xD4
+
+# Elder aquatic beholder
+R:903:0x80:0xE5
+
+# Abysmal elf
+R:904:0x80:0xE8
+
+# Abysmal elven warrior
+R:905:0x80:0xE8
+
+# Abysmal elven shaman
+R:906:0x80:0xE8
+
+# Stargazer
+R:907:0x80:0xFE
+
+# Elder stargazer
+R:908:0x80:0xFE
+
+# Flounder
+R:909:0x80:0xFE
+
+# Giant turtle
+R:910:0x80:0xD2
+
+# Baby abysmal dragon
+R:911:0x80:0xE4
+
+# Young abysmal dragon
+R:912:0x80:0xE4
+
+# Mature abysmal dragon
+R:913:0x80:0xE4
+
+# Ancient abysmal dragon
+R:914:0x80:0xC4
+
+# Dragon turtle
+R:915:0x80:0xD2
+
+# Undead stargazer
+R:916:0x80:0xFE
+
+# Killer whale
+R:917:0x80:0xFE
+
+# Undead killer whale
+R:918:0x80:0xC7
+
+# Aquatic naga
+R:919:0x80:0xEE
+
+# Devilfish
+R:920:0x80:0xFE
+
+# Undead devilfish
+R:921:0x80:0xFE
+
+# Devilfish beholder
+R:922:0x80:0xE5
+
+# Aquatic hound
+R:923:0x80:0xDA
+
+# Aquatic demon
+R:924:0x80:0xD5
+
+# Aquatic demonlord
+R:925:0x80:0xD5
+
+# Manta ray
+R:926:0x80:0xFE
+
+# Undead manta ray
+R:927:0x80:0xFE
+
+# Mathilde, the Science Student
+R:928:0x80:0xE8
+
+# Child spirit
+R:929:0x80:0xC7
+
+# Young spirit
+R:930:0x80:0xC7
+
+# Mature spirit
+R:931:0x80:0xC7
+
+# Experienced spirit
+R:932:0x80:0xC7
+
+# Wise spirit
+R:933:0x80:0xC7
+
+# Fangorn the Treebeard
+R:934:0x80:0xA3
+
+# Gandalf the Grey
+R:935:0x80:0xF0
+
+# Nar, the Dwarf
+R:936:0x80:0xE8
+
+# Black troll
+R:937:0x80:0xD4
+
+# Troll Clan Chief
+R:938:0x80:0xD4
+
+# Troll King
+R:939:0x80:0xD4
+
+# Blue Firelizard
+R:940:0x80:0xE4
+
+# Green Firelizard
+R:941:0x80:0xE4
+
+# Brown Firelizard
+R:942:0x80:0xE4
+
+# Bronze Firelizard
+R:943:0x80:0xE4
+
+# Gold Firelizard
+R:944:0x80:0xE4
+
+# High-elven ranger
+R:945:0x80:0xE8
+
+# Uvatha the Horseman
+R:946:0x80:0xD7
+
+# Adunaphel the Quiet
+R:947:0x80:0xD7
+
+# Akhorahil the Blind
+R:948:0x80:0xD7
+
+# Ren the Unclean
+R:949:0x80:0xD7
+
+# Ji Indur Dawndeath
+R:950:0x80:0xD7
+
+# Dwar, Dog Lord of Waw
+R:951:0x80:0xD7
+
+# Hoarmurath of Dir
+R:952:0x80:0xD7
+
+# Khamul the Easterling
+R:953:0x80:0xD7
+
+# Murazor, the Witch-King of Angmar
+R:954:0x80:0xD7
+
+# Green DragonRider
+R:955:0x80:0xC4
+
+# Blue DragonRider
+R:956:0x80:0xC4
+
+# Brown DragonRider
+R:957:0x80:0xC4
+
+# Bronze DragonRider
+R:958:0x80:0xC4
+
+# Gold DragonRider
+R:959:0x80:0xC4
+
+# Thread
+R:960:0x80:0xED
+
+# Gorlim, Betrayer of Barahir
+R:961:0x80:0xF0
+
+# The Blubbering idiot, agent of black market, Simon the weak
+R:962:0x80:0xF4
+
+# Aranea
+R:963:0x80:0xD3
+
+# Elder aranea
+R:964:0x80:0xD3
+
+# Greater Aranea
+R:965:0x80:0xD3
+
+# Dolphiner
+R:966:0x80:0xF0
+
+# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+R:967:0x80:0xC0
+
+# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+R:968:0x80:0xC0
+
+# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+R:969:0x80:0xC0
+
+# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+R:970:0x80:0xC0
+
+# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+R:971:0x80:0xC0
+
+# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+R:972:0x80:0xC0
+
+# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+R:973:0x80:0xC0
+
+# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+R:974:0x80:0xC0
+
+# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+R:975:0x80:0xC0
+
+# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+R:976:0x80:0xC0
+
+# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+R:977:0x80:0xC0
+
+# Moldoux, the Defenceless Mold
+R:978:0x80:0xED
+
+# Ben Harrison
+R:979:0x80:0xF0
+
+# Ar-Pharazon the Golden
+R:980:0x80:0xF0
+
+# Doppleganger
+R:981:0x80:0xC0
+
+# Marylene, Heartbreakeress of the Netherworld
+R:982:0x80:0xD0
+
+# The Greater Lag Monster
+R:983:0x80:0xD5
+
+# Khim, Son of Mim
+R:984:0x80:0xE8
+
+# Bullroarer the Hobbit
+R:985:0x80:0xE8
+
+# 3-headed hydra
+R:986:0x80:0xCD
+
+# Uldor the Accursed
+R:987:0x80:0xF0
+
+# Mystic
+R:988:0x80:0xF0
+
+# Invisible stalker
+R:989:0x80:0xC5
+
+# Ulfang the Black
+R:990:0x80:0xF0
+
+# Demonologist
+R:991:0x80:0xF0
+
+# Hezrou
+R:992:0x80:0xD5
+
+# Glabrezu
+R:993:0x80:0xD5
+
+# Nalfeshnee
+R:994:0x80:0xD5
+
+# Marilith
+R:995:0x80:0xD5
+
+# Lesser Balrog
+R:996:0x80:0xD5
+
+# Master mystic
+R:997:0x80:0xF0
+
+# Grand master mystic
+R:998:0x80:0xF0
+
+# Erinyes
+R:999:0x80:0xD5
+
+# Medusa, the Gorgon
+R:1000:0x80:0xEE
+
+# Vrock
+R:1001:0x80:0xD5
+
+# Solar
+R:1002:0x80:0xC1
+
+# Ethereal hound
+R:1003:0x80:0xDA
+
+# Dreadlord
+R:1004:0x80:0xC7
+
+# Redweed
+R:1005:0x81:0xB0
+
+# The Rat King
+R:1006:0x80:0xF2
+
+# Vort the Kobold Queen
+R:1007:0x80:0xEB
+
+# Giant cockroach
+R:1008:0x80:0xC9
+
+# Fire Phantom
+R:1009:0x80:0xC7
+
+# The Insane Player
+R:1010:0x80:0xF0
+
+# Glaryssa, Succubus Queen
+R:1011:0x80:0xD5
+
+# Vermicious Knid
+R:1012:0x80:0xCF
+
+# Bone golem
+R:1013:0x80:0xE7
+
+# Snake of Yig
+R:1014:0x80:0xCA
+
+# Wild Man
+R:1015:0x80:0xE8
+
+# Dimensional shambler
+R:1016:0x80:0xE8
+
+# Cultist
+R:1017:0x80:0xF0
+
+# Cult leader
+R:1018:0x80:0xF0
+
+# Servitor of the outer gods
+R:1019:0x80:0xD5
+
+# Avatar of Nyarlathotep
+R:1020:0x80:0xF0
+
+# Fthagghua, Lord of the fire vampires
+R:1021:0x80:0xD5
+
+# Hypnos
+R:1022:0x80:0xF0
+
+# Blue Dragon Worm
+R:1023:0x80:0xF7
+
+# White Dragon Worm
+R:1024:0x80:0xF7
+
+# Red Dragon Worm
+R:1025:0x80:0xF7
+
+# Black Dragon Worm
+R:1026:0x80:0xF7
+
+# Green Dragon Worm
+R:1027:0x80:0xF7
+
+# Multi-hued Dragon Worm
+R:1028:0x80:0xF7
+
+# The Baby Minotaur
+R:1029:0x80:0xC8
+
+# The Sandworm Queen
+R:1030:0x80:0xF7
+
+# Sandworm
+R:1031:0x80:0xF7
+
+# Nobody, the Undefined Ghost
+R:1032:0x80:0xC7
+
+
+
+
+
diff --git a/lib/mods/theme/pref/graf-mac.prf b/lib/mods/theme/pref/graf-mac.prf
new file mode 100644
index 00000000..7bb84141
--- /dev/null
+++ b/lib/mods/theme/pref/graf-mac.prf
@@ -0,0 +1,15 @@
+# File: graf-mac.prf
+
+#
+# This file defines special attr/char mappings for use in "graphics" mode
+#
+# See "lib/help/command.txt" and "src/files.c" for more information.
+#
+
+# Standard file
+?:[EQU $GRAF old]
+%:graf-xxx.prf
+
+# New tiles
+?:[EQU $GRAF new]
+%:graf-new.prf
diff --git a/lib/mods/theme/pref/graf-new.prf b/lib/mods/theme/pref/graf-new.prf
new file mode 100644
index 00000000..2fb1b215
--- /dev/null
+++ b/lib/mods/theme/pref/graf-new.prf
@@ -0,0 +1,6934 @@
+# PRF file generated by Andreas Koch`s Tile Assigner
+# at 03.12.02 , 17:18:08 by Ja with version 1.7c
+
+# 2460 items
+# 2312 probably mapped correctly
+# 147 imported but not yet defined
+# 1 defined to value(s) lower than 0x80
+# Old header :
+# File: graf-new.prf
+#
+# This file defines special attr/char mappings for use in "graphics" mode
+# with Adam Bolt's 16x16 tiles.
+#
+# By Robert Ruehlmann < rr9@angband.org >
+#
+# See "lib/help/command.txt" and "src/files.c" for more information.
+#
+
+# General Store
+B:0:0x82/0x87
+
+# Armoury
+B:1:0x82/0x88
+
+# Weaponsmith
+B:2:0x82/0x89
+
+# Temple
+B:3:0x82/0x8A
+
+# Alchemy shop
+B:4:0x82/0x8B
+
+# Magic shop
+B:5:0x82/0x8C
+
+# Black Market
+B:6:0x82/0x8D
+
+# Home
+B:7:0x82/0x8E
+
+# Book Store
+B:8:0x82/0x8F
+
+# Pet Shop
+B:9:0x82/0x90
+
+# Mayor's Office
+B:10:0x86/0xA0
+
+# Inn
+B:11:0x86/0xA1
+
+# The Soothsayer
+B:12:0x86/0xA2
+
+# Library
+B:13:0x86/0xA3
+
+# Castle
+B:14:0x86/0xA4
+
+# Casino
+B:15:0x86/0xA5
+
+# Beastmaster Shanty
+B:16:0x86/0xA6
+
+# Fighters Hall
+B:17:0x86/0xA7
+
+# Tower of Magery
+B:18:0x86/0xA8
+
+# Inner Temple
+B:19:0x86/0xA9
+
+# Paladins Guild
+B:20:0x86/0xAA
+
+# Rangers Guild
+B:21:0x86/0xAB
+
+# Thunderlords' Hide
+B:22:0x86/0xAC
+
+# The Mirror
+B:23:0x86/0xAD
+
+# Seat of Ruling
+B:24:0x86/0xAE
+
+# Wizards Spire
+B:25:0x86/0xAF
+
+# Priests Circle
+B:26:0x86/0xB0
+
+# Tower of the King
+B:27:0x86/0xB1
+
+# Library
+B:28:0x86/0xA3
+
+# The White Tree
+B:29:0x86/0xB2
+
+# Craftsmaster
+B:30:0x86/0xB3
+
+# Earth-Dome (Nature)
+B:31:0x86/0xB4
+
+# Minstrels Haven
+B:32:0x86/0xB5
+
+# Star-Dome
+B:33:0x86/0xB6
+
+# Valarin Temple
+B:34:0x86/0xB7
+
+# Sea-Dome
+B:35:0x86/0xB8
+
+# The Golden Flower
+B:36:0x86/0xB9
+
+# The Fountain
+B:37:0x86/0xBA
+
+# Axe Smith
+B:38:0x86/0xBB
+
+# Hafted Smith
+B:39:0x86/0xBC
+
+# Polearm Smith
+B:40:0x86/0xBD
+
+# Sword Smith
+B:41:0x86/0xBE
+
+# Rare Jewelry Shop
+B:42:0x86/0xBF
+
+# Jewelry Shop
+B:43:0x87/0xA0
+
+# Footwear Shop
+B:44:0x87/0xA1
+
+# Rare Footwear Shop
+B:45:0x87/0xA2
+
+# Library
+B:46:0x86/0xA3
+
+# Forbidden Library
+B:47:0x87/0xA3
+
+# Expensive Black Market
+B:48:0x87/0xA4
+
+# Common Shop
+B:49:0x87/0xA5
+
+# Dragon Hunter
+B:50:0x87/0xA6
+
+# Speed Ring Market
+B:51:0x87/0xA7
+
+# Scribe
+B:52:0x87/0xA8
+
+# Potion Store
+B:53:0x87/0xA9
+
+# Recaller
+B:54:0x87/0xAA
+
+# Master Archer
+B:55:0x87/0xAB
+
+# Merchants Guild
+B:56:0x87/0xAC
+
+# The Mathom-house
+B:57:0x87/0xAD
+
+# The Prancing Pony
+B:58:0x86/0xA1
+
+# Mining Supply store
+B:59:0x86/0xB3
+
+# Library quest in Minas Anor
+B:60:0x86/0xA3
+
+# Hunting Supply Store
+B:61:0x87/0xAB
+
+# Runic Magic Shop
+B:62:0x82/0x8C
+
+# Construction Supply Store
+B:63:0x86/0xB3
+
+# Music Store
+B:64:0x86/0xB5
+
+# Magic Rod Market
+B:65:0x82/0x8C
+
+# Map store
+B:66:0x86/0xA3
+
+# Farm
+B:67:0x87/0xA5
+
+#Pelargir inn - The Grey Swan
+B:68:0x86/0xA1
+
+#Caras Galadhon inn - The Garden
+B:69:0x86/0xA1
+
+#Khazad Dum inn - The Mithril Lode
+B:70:0x86/0xA1
+
+#Dale inn - The Builder Barracks
+B:71:0x86/0xA1
+
+#Edoras inn - The Horse and Ox
+B:72:0x86/0xA1
+
+#Esgaroth inn - The Dancing Dragon
+B:73:0x86/0xA1
+
+#Hobbiton inn - The Green Dragon
+B:74:0x86/0xA1
+
+#Osgiliath inn - The Twinkling Star
+B:75:0x86/0xA1
+
+#The House of Beorn
+B:76:0x86/0xA0
+
+#Bard's Hut
+B:77:0x86/0xA0
+
+#The Ranger Conclave
+B:78:0x86/0xA0
+
+#Imladris
+B:79:0x86/0xA0
+
+#The Hornburg
+B:80:0x86/0xA0
+
+#Thranduil's Hall
+B:81:0x86/0xA0
+
+#Meduseld
+B:82:0x86/0xA0
+
+#The Master's House
+B:83:0x86/0xA0
+
+#Bag End
+B:84:0x86/0xA0
+
+#The Castle of Stars
+B:85:0x86/0xA0
+
+#The Prince's Tower
+B:86:0x86/0xA0
+
+#The Seat of Durin
+B:87:0x86/0xA0
+
+### The forge in Imladris
+B:88:0x86/0xB3
+
+# nothing
+F:0:0x80/0x80
+
+# open floor
+F:1:0x80/0x81
+
+# fountain
+F:2:0xC3/0x9A
+
+# glyph of warding
+F:3:0x8D/0x95
+
+# open door
+F:4:0x82/0x84
+
+# broken door
+F:5:0x82/0x85
+
+# up staircase
+F:6:0x80/0x96
+
+# down staircase
+F:7:0x80/0x99
+
+# quest entrance
+F:8:0x80/0x9A
+
+# quest exit
+F:9:0x80/0x97
+
+# quest down level
+F:10:0x80/0x9B
+
+# quest up level
+F:11:0x80/0x98
+
+# town exit
+F:12:0x82/0x84
+
+# shaft down
+F:13:0xC3/0x84
+
+# shaft up
+F:14:0xC3/0x85
+
+# fountain
+F:15:0xC3/0x99
+
+# web
+F:16:0x81/0x8C
+
+# trap
+F:17:0x81/0x89
+
+# visible trap -- spiked pit
+F:18:0x81/0x89
+
+# visible trap -- poison pit
+F:19:0x81/0x89
+
+# visible trap -- rune -- summon
+F:20:0x81/0x8F
+
+# visible trap -- rune -- teleport
+F:21:0x81/0x92
+
+# visible trap -- spot -- fire
+F:22:0x81/0x86
+
+# visible trap -- spot -- acid
+F:23:0x81/0x86
+
+# visible trap -- dart -- slow
+F:24:0x81/0x80
+
+# visible trap -- dart -- lose str
+F:25:0x81/0x80
+
+# visible trap -- dart -- lose dex
+F:26:0x81/0x80
+
+# visible trap -- dart -- lose con
+F:27:0x81/0x80
+
+# visible trap -- gas -- blind
+F:28:0x81/0x83
+
+# visible trap -- gas -- confuse
+F:29:0x81/0x83
+
+# visible trap -- gas -- poison
+F:30:0x81/0x83
+
+# visible trap -- gas -- sleep
+F:31:0x81/0x83
+
+# door
+F:32:0x82/0x83
+
+# locked door
+F:33:0x82/0x83
+F:34:0x82/0x83
+F:35:0x82/0x83
+F:36:0x82/0x83
+F:37:0x82/0x83
+F:38:0x82/0x86
+F:39:0x82/0x86
+
+# jammed door
+F:40:0x82/0x83
+F:41:0x82/0x83
+F:42:0x82/0x83
+F:43:0x82/0x83
+F:44:0x82/0x83
+F:45:0x82/0x86
+F:46:0x82/0x86
+F:47:0x82/0x86
+
+# secret door
+F:48:0x80/0x84
+
+# pile of rubble
+F:49:0x80/0x9C
+
+# magma vein
+F:50:0x80/0x8D
+
+# quartz vein
+F:51:0x80/0x87
+
+# magma vein
+F:52:0x80/0x90
+
+# quartz vein
+F:53:0x80/0x87
+
+# magma vein with treasure
+F:54:0x80/0x90
+
+# quartz vein with treasure
+F:55:0x80/0x8A
+
+# granite wall
+F:56:0x80/0x84
+F:57:0x80/0x84
+F:58:0x80/0x84
+F:59:0x80/0x84
+
+# permanent wall
+F:60:0x80/0x93
+F:61:0x80/0x93
+F:62:0x80/0x93
+F:63:0x80/0x93
+
+# explosive rune
+F:64:0x8D/0x9E
+
+# Straight Road startpoint
+F:65:0x81/0x95
+
+# section of the Straight Road
+F:66:0x81/0x95
+F:67:0x81/0x95
+F:68:0x81/0x95
+F:69:0x81/0x95
+F:70:0x81/0x95
+
+# section of the Straight Road (discharged)
+F:71:0x81/0x98
+
+# Straight Road exit
+F:72:0x81/0x9B
+
+# corrupted section of the Straight Road
+F:73:0x81/0x9E
+
+# Building
+F:74:0x82/0x93
+
+# permanent wall
+F:75:0x82/0x93
+F:76:0x82/0x94
+F:77:0x82/0x95
+F:78:0x82/0x96
+
+#Elanor
+F:79:0xC6:0xA0
+
+#Fumellar
+F:80:0xC6:0xA1
+
+#Anemones
+F:81:0xC6:0xA2
+
+#Niphredil
+F:82:0xC6:0xA3
+
+#Iris
+F:83:0xC6:0xA4
+
+# stream of shallow water
+F:84:0xB4/0x97
+
+# pool of deep lava
+F:85:0x83/0x8D
+
+# stream of shallow lava
+F:86:0xB4/0x9A
+
+# dark pit
+F:87:0x80/0x80
+
+# dirt
+F:88:0xB4/0x91
+
+# patch of grass
+F:89:0xB4/0x94
+
+# ice
+F:90:0xC3/0x83
+
+# sand
+F:91:0xC3/0x88
+
+# dead tree
+F:92:0xC3/0x98
+
+# ash
+F:93:0xC3/0x97
+
+# mud
+F:94:0xC3/0x96
+
+# ice wall
+F:95:0xC5/0x92
+
+# tree
+F:96:0x82/0x9A
+
+# mountain chain
+F:97:0x8D/0x98
+
+# sandwall
+F:98:0xC3/0x86
+F:99:0xC3/0x86
+
+# sandwall with treasure
+F:100:0xC3/0x87
+
+# high mountain chain
+F:101:0xC3/0x9E
+
+# nether mist
+F:102:0xC3/0x9F
+
+# molten glass wall
+F:103:0xC0/0x9F
+
+# Void Jumpgate
+F:160:0x91/0x84
+
+# Altar of Being
+F:161:0xC1/0x8E
+
+# Altar of Winds
+F:162:0xB5/0x8A
+
+# Altar of Force
+F:163:0xB5/0x86
+
+# Altar of Darkness
+F:164:0xB5/0x86
+
+# Altar of Nature
+F:165:0xB5/0x91
+
+# Altar of Sun
+F:166:0xB5/0x8F
+
+# Altar of Rage
+F:167:0xB5/0x8C
+
+# Altar of Winds
+F:168:0xB5/0x92
+
+# Altar of Stars
+F:169:0xC1/0x8F
+
+# Altar of Being
+F:170:0xB5/0x8D
+
+# Altar of Randomness
+F:171:0xB5/0x88
+
+# floor
+F:172:0x80/0x81
+
+# Underground Tunnel
+F:173:0x80/0x82
+
+# stream of tainted water
+F:174:0xAF/0x8E
+
+# monster trap
+F:175:0x81/0x9C
+
+# Void Jumpgate
+F:176:0xAF/0x8C
+
+# lava wall
+F:177:0xC6/0x8C
+
+# Great Fire
+F:178:0xC6/0x8A
+
+# path to the next area
+F:179:0x88/0xA1
+
+# path to the previous area
+F:180:0x88/0xA0
+
+# field
+F:181:0x88/0xA2
+
+# Ekkaia, the Encircling Sea
+F:182:0x88/0xA3
+
+# Altar of Energy
+F:183:0xB5/0x9A
+
+# Altar of Matter
+F:184:0xB5/0x9B
+
+# Altar of Being
+F:185:0xB5/0x9C
+
+# Altar of Unbeing
+F:186:0xB5/0x9D
+
+# pool of deep water
+F:187:0x83/0x80
+
+# glass wall
+F:188:0xC0/0x9F
+
+# illusion wall
+F:189:0x80/0x84
+
+# Grass roof
+F:190:0xC2/0x80
+
+# grass roof top
+F:191:0xC2/0x81
+
+# grass roof chimney
+F:192:0xC2/0x82
+
+# brick roof
+F:193:0xC3/0x80
+
+# brick roof top
+F:194:0xC3/0x81
+
+# brick roof chimney
+F:195:0xC3/0x82
+
+# window
+F:196:0xC2/0x83
+
+# small window
+F:197:0xC2/0x84
+
+# rain barrel
+F:198:0xC2/0x85
+
+# grass with flowers
+F:199:0xC2/0x86
+
+# cobblestone road
+F:200:0xC2/0x87
+
+# cobblestone with outlet
+F:201:0xC2/0x88
+
+# small tree
+F:202:0x82/0x9D
+
+# town
+F:203:0xC3/0x95
+
+# Underground Tunnel
+F:204:0x80/0x82
+
+# a blazing fire
+F:205:0xC6/0x8A
+
+# pile of rubble
+F:206:0xC6/0x8B
+
+# rocky ground
+F:207:0x8D/0xA0
+
+# cloud-like vapour
+F:208:0x8D/0xA1
+
+# condensing water
+F:209:0x8D/0xA2
+
+# dense mist
+F:210:0x8D/0xA3
+
+# hail-stone wall
+F:211:0x8D/0xA4
+
+# dead small tree
+F:212:0xC6:0xA5
+
+# low hill
+F:213:0xC6:0xA6
+
+# dark mountain chain
+F:214:0xC6:0xA7
+
+# blue mountain chain
+F:215:0xC6:0xA8
+
+# grey mountain chain
+F:216:0xC6:0xA9
+
+# part of Mount Doom
+F:217:0xC6:0xAA
+
+# snow-capped peak
+F:218:0xC3:0x9E
+
+# fir tree
+F:219:0xC6:0xAB
+
+# section of a flet
+F:220:0xC6:0xAC
+
+# light post
+F:221:0xC6:0xAD
+
+# water lily
+F:222:0xC6:0xAE
+
+# part of the Dead Marshes
+F:223:0xC6:0xAF
+
+# Black Gate
+F:224:0xC6:0xB0
+
+# river
+F:225:0xC6:0xB1
+
+# swamp pool
+F:226:0xC6:0xB2
+
+# stream of the Anduin river
+F:227:0xC6:0xB3
+
+# road sign that says 'Hurry to Gondolin!'
+F:228:0xC6:0xB4
+
+# beehive
+F:229:0xC6:0xB5
+
+# dirt road
+F:230:0xC6:0xB6
+
+# wide gate
+F:231:0xC6:0xB7
+
+# open gate
+F:232:0xC6:0xB8
+
+# wooden board
+F:233:0xC6:0xB9
+
+# wooden board
+F:234:0xC6:0xBA
+
+# wooden board
+F:235:0xC6:0xBB
+
+# wooden board
+F:236:0xC6:0xBC
+
+# white tree
+F:237:0xC6:0xBD
+
+# swift waterfall
+F:238:0xC6:0xBE
+
+# slippery rock ledge
+F:239:0xC5:0xA0
+
+# stable
+F:240:0xC5:0xA1
+
+# wooden plank
+F:241:0xC5:0xA2
+
+# fosse pit
+F:242:0xC5:0xA3
+
+# Mallorn
+F:243:0xC5:0xA4
+
+# copper pillar
+F:244:0xC5:0xBC
+
+# ethereal wall
+F:245:0x80/0x81
+
+# glacial wall
+F:246:0xC5/0x92
+
+# battlement
+F:247:0xC5:0xBD
+
+# dark pit
+F:248:0x82/0x84
+
+# Skeleton
+G:M:1:0xC6/0x91
+
+# Zombie
+G:M:2:0xC6/0x92
+
+# Lich
+G:M:3:0xC6/0x93
+
+# Spectral
+G:M:4:0xC6/0x94
+
+# Captain
+G:M:5:0xC6/0x95
+
+# Chieftain
+G:M:6:0xC6/0x96
+
+# Shaman
+G:M:7:0xC6/0x97
+
+# Priest
+G:M:8:0xC6/0x98
+
+# Mage
+G:M:9:0xC6/0x99
+
+# Archer
+G:M:10:0xC6/0x9A
+
+# Rogue
+G:M:11:0xC6/0x9B
+
+# Inertia Ball Trap
+G:T:95:0x82/0xBF
+
+# something
+K:0:0x01:0x20
+
+# Blindness
+K:1:0x85:0x94
+
+# Fear
+K:2:0x85:0x94
+
+# Confusion
+K:3:0x85:0x94
+
+# Hallucination
+K:4:0x85:0x94
+
+# Cure Poison
+K:5:0x85:0x94
+
+# Cure Blindness
+K:6:0x85:0x94
+
+# Cure Fear
+K:7:0xC6:0x83
+
+# Cure Confusion
+K:8:0x85:0x94
+
+# Weakness
+K:9:0x85:0x94
+
+# Unhealth
+K:10:0x85:0x94
+
+# Restore Constitution
+K:11:0x85:0x94
+
+# Restoring
+K:12:0x85:0x94
+
+# Stupidity
+K:13:0x85:0x94
+
+# Naivety
+K:14:0x85:0x94
+
+# Poison
+K:15:0x85:0x94
+
+# Sickness
+K:16:0x85:0x94
+
+# Paralysis
+K:17:0x85:0x94
+
+# Restore Strength
+K:18:0x85:0x94
+
+# Disease
+K:19:0x85:0x94
+
+# Cure Serious Wounds
+K:20:0x85:0x94
+
+# & Ration~ of Cram
+K:21:0x8E:0x84
+
+# & Round Seed-Cake~
+K:22:0x8E:0x82
+
+# & Strip~ of Venison
+K:23:0x8E:0x83
+
+# & Slime Mold~
+K:24:0x8E:0x85
+
+# & Lembas~
+K:25:0x8E:0x86
+
+# & Pint~ of Fine Ale
+K:26:0x8E:0x80
+
+# & Pint~ of Old Winyards
+K:27:0x8E:0x80
+
+# & Mattock~
+K:28:0xB6:0x8C
+
+# & Blue Stone~
+K:29:0xC5:0x93
+
+# & Broken Dagger~
+K:30:0x8A:0x8D
+
+# & Bastard Sword~
+K:31:0x8A:0x8E
+
+# & Scimitar~
+K:32:0x8A:0x97
+
+# & Tulwar~
+K:33:0x8A:0x95
+
+# & Broad Sword~
+K:34:0x8A:0x98
+
+# & Short Sword~
+K:35:0x8A:0x94
+
+# & Blade~ of Chaos
+K:36:0x8A:0x9E
+
+# & Two-Handed Sword~
+K:37:0x8A:0x9C
+
+# & Main Gauche~
+K:38:0x8A:0x90
+
+# & Cutlass~
+K:39:0x8A:0x96
+
+# & Executioner's Sword~
+K:40:0x8A:0x9D
+
+# & Katana~
+K:41:0x8A:0x9B
+
+# & Long Sword~
+K:42:0x8A:0x99
+
+# & Dagger~
+K:43:0x8A:0x8F
+
+# & Rapier~
+K:44:0x8A:0x91
+
+# & Sabre~
+K:45:0x8A:0x93
+
+# & Small Sword~
+K:46:0x8A:0x92
+
+# & Broken Sword~
+K:47:0x8A:0x8E
+
+# & Ball-and-Chain~
+K:48:0x8B:0x86
+
+# & Whip~
+K:49:0x8A:0x9F
+
+# & Flail~
+K:50:0x8B:0x83
+
+# & Two-Handed Flail~
+K:51:0x8B:0x87
+
+# & Morning Star~
+K:52:0x8B:0x84
+
+# & Mace~
+K:53:0x8B:0x81
+
+# & Quarterstaff~
+K:54:0x8B:0x82
+
+# & War Hammer~
+K:55:0x8B:0x80
+
+# & Lead-Filled Mace~
+K:56:0x8B:0x85
+
+# & Mace~ of Disruption
+K:57:0x8B:0x88
+
+# & Lucerne Hammer~
+K:58:0x8B:0x8D
+
+# & Beaked Axe~
+K:59:0x8B:0x90
+
+# & Glaive~
+K:60:0x8B:0x92
+
+# & Halberd~
+K:61:0x8B:0x93
+
+# & Awl-Pike~
+K:62:0x8B:0x8B
+
+# & Pike~
+K:63:0x8B:0x8F
+
+# & Spear~
+K:64:0x8B:0x89
+
+# & Trident~
+K:65:0x8B:0x8A
+
+# & Lance~
+K:66:0x8B:0x8C
+
+# & Great Axe~
+K:67:0x8B:0x95
+
+# & Battle Axe~
+K:68:0x8B:0x8E
+
+# & Lochaber Axe~
+K:69:0x8B:0x94
+
+# & Broad Axe~
+K:70:0x8B:0x91
+
+# & Scythe~
+K:71:0x8B:0x96
+
+# & Scythe~ of Slicing
+K:72:0x8B:0x97
+
+# & Short Bow~
+K:73:0x8B:0x98
+
+# & Long Bow~
+K:74:0x8B:0x99
+
+# & Light Crossbow~
+K:75:0x8B:0x9A
+
+# & Heavy Crossbow~
+K:76:0x8B:0x9B
+
+# & Sling~
+K:77:0x8B:0x9C
+
+# & Arrow~
+K:78:0x8C:0x80
+
+# & Seeker Arrow~
+K:79:0x8C:0x81
+
+# & Bolt~
+K:80:0x8C:0x82
+
+# & Seeker Bolt~
+K:81:0x8C:0x83
+
+# & Rounded Pebble~
+K:82:0x8C:0x84
+
+# & Iron Shot~
+K:83:0x8C:0x85
+
+# & Shovel~
+K:84:0x8E:0x8F
+
+# & Gnomish Shovel~
+K:85:0x8E:0x90
+
+# & Dwarven Shovel~
+K:86:0x8E:0x91
+
+# & Pick~
+K:87:0x8E:0x8C
+
+# & Orcish Pick~
+K:88:0x8E:0x8D
+
+# & Dwarven Pick~
+K:89:0x8E:0x91
+
+# & Elven Cloak~
+K:90:0x89:0x8A
+
+# & Pair~ of Soft Leather Boots
+K:91:0x88:0x8E
+
+# & Pair~ of Hard Leather Boots
+K:92:0x88:0x8F
+
+# & Pair~ of Metal Shod Boots
+K:93:0x88:0x90
+
+# & Hard Leather Cap~
+K:94:0x87:0x98
+
+# & Metal Cap~
+K:95:0x87:0x99
+
+# & Iron Helm~
+K:96:0x87:0x9A
+
+# & Steel Helm~
+K:97:0x87:0x9B
+
+# & Iron Crown~
+K:98:0x87:0x9C
+
+# & Golden Crown~
+K:99:0x87:0x9D
+
+# & Jewel-Encrusted Crown~
+K:100:0x87:0x9E
+
+# & Robe~
+K:101:0x89:0x8C
+
+# & Filthy Rag~
+K:102:0x89:0x8B
+
+# Soft Leather Armour~
+K:103:0x89:0x8D
+
+# Soft Studded Leather~
+K:104:0x89:0x8E
+
+# Hard Leather Armour~
+K:105:0x89:0x8F
+
+# Hard Studded Leather~
+K:106:0x89:0x90
+
+# Leather Scale Mail~
+K:107:0x89:0x91
+
+# Metal Scale Mail~
+K:108:0x89:0x92
+
+# Chain Mail~
+K:109:0x89:0x94
+
+# Rusty Chain Mail~
+K:110:0x89:0x93
+
+# Augmented Chain Mail~
+K:111:0x89:0x96
+
+# Bar Chain Mail~
+K:112:0x89:0x97
+
+# Metal Brigandine Armour~
+K:113:0x89:0x98
+
+# Partial Plate Armour~
+K:114:0x89:0x99
+
+# Metal Lamellar Armour~
+K:115:0x89:0x9A
+
+# Full Plate Armour~
+K:116:0x89:0x9B
+
+# Ribbed Plate Armour~
+K:117:0x89:0x9C
+
+# Galvorn Plate Mail~
+K:118:0x89:0x9F
+
+# Mithril Plate Mail~
+K:119:0x89:0x9E
+
+# Mithril Chain Mail~
+K:120:0x89:0x9D
+
+# Double Chain Mail~
+K:121:0x89:0x95
+
+# & Shield~ of Deflection
+K:122:0x88:0x98
+
+# & Cloak~
+K:123:0x89:0x88
+
+# & Shadow Cloak~
+K:124:0x89:0x89
+
+# & Set~ of Leather Gloves
+K:125:0x88:0x91
+
+# & Set~ of Gauntlets
+K:126:0x88:0x92
+
+# & Set~ of Cesti
+K:127:0x88:0x93
+
+# & Small Leather Shield~
+K:128:0x88:0x94
+
+# & Large Leather Shield~
+K:129:0x88:0x95
+
+# & Small Metal Shield~
+K:130:0x88:0x96
+
+# & Large Metal Shield~
+K:131:0x88:0x97
+
+# Strength
+K:132:0x84:0x81
+
+# Dexterity
+K:133:0x84:0x83
+
+# Constitution
+K:134:0x84:0x83
+
+# Intelligence
+K:135:0x84:0x83
+
+# Speed
+K:136:0x84:0x83
+
+# Searching
+K:137:0x84:0x83
+
+# Teleportation
+K:138:0x84:0x83
+
+# Slow Digestion
+K:139:0x84:0x83
+
+# Fire Resistance
+K:140:0x84:0x83
+
+# Cold Resistance
+K:141:0x84:0x83
+
+# Levitation
+K:142:0x84:0x83
+
+# Poison Resistance
+K:143:0x84:0x83
+
+# Free Action
+K:144:0x84:0x83
+
+# Weakness
+K:145:0x84:0x83
+
+# Flames
+K:146:0x84:0x83
+
+# Acid
+K:147:0x84:0x83
+
+# Ice
+K:148:0x84:0x83
+
+# Woe
+K:149:0x84:0x83
+
+# Stupidity
+K:150:0x84:0x83
+
+# Damage
+K:151:0x84:0x83
+
+# Accuracy
+K:152:0x84:0x83
+
+# Protection
+K:153:0x84:0x83
+
+# Aggravate Monster
+K:154:0x84:0x83
+
+# See Invisible
+K:155:0x84:0x83
+
+# Sustain Strength
+K:156:0x84:0x83
+
+# Sustain Intelligence
+K:157:0x84:0x83
+
+# Sustain Wisdom
+K:158:0x84:0x83
+
+# Sustain Constitution
+K:159:0x84:0x83
+
+# Sustain Dexterity
+K:160:0x84:0x83
+
+# Sustain Charisma
+K:161:0x84:0x83
+
+# Slaying
+K:162:0x84:0x83
+
+# Brilliance
+K:163:0x87:0x83
+
+# Charisma
+K:164:0x87:0x83
+
+# Searching
+K:165:0x87:0x83
+
+# Teleportation
+K:166:0x87:0x83
+
+# Slow Digestion
+K:167:0x87:0x83
+
+# Acid Resistance
+K:168:0x87:0x83
+
+# Protection from Evil
+K:169:0x87:0x83
+
+# Double Ring Mail~
+K:170:0x89:0x9B
+
+# the Magi
+K:171:0x87:0x83
+
+# Doom
+K:172:0x87:0x83
+
+# Enchant Weapon To-Hit
+K:173:0x83:0x9C
+
+# Enchant Weapon To-Dam
+K:174:0x83:0x9C
+
+# Enchant Armor
+K:175:0x83:0x9C
+
+# Identify
+K:176:0x83:0x9C
+
+# *Identify*
+K:177:0x83:0x9C
+
+# Rumour
+K:178:0x83:0x9C
+
+# Chaos
+K:179:0x83:0x9C
+
+# Remove Curse
+K:180:0x83:0x9C
+
+# Light
+K:181:0x83:0x9C
+
+# Fire
+K:182:0x83:0x9C
+
+# Ice
+K:183:0x83:0x9C
+
+# Summon Monsters
+K:184:0x83:0x9C
+
+# Phase Door
+K:185:0x83:0x9C
+
+# Teleportation
+K:186:0x83:0x9C
+
+# Teleport Level
+K:187:0x83:0x9C
+
+# Monster Confusion
+K:188:0x83:0x9C
+
+# Magic Mapping
+K:189:0x83:0x9C
+
+# Rune of Protection
+K:190:0x83:0x9C
+
+# *Remove Curse*
+K:191:0x83:0x9C
+
+# Treasure Detection
+K:192:0x83:0x9C
+
+# Object Detection
+K:193:0x83:0x9C
+
+# Trap Detection
+K:194:0x83:0x9C
+
+# & Sheaf Arrow~
+K:195:0x8C:0x81
+
+# & Mithril Shot~
+K:196:0x8C:0x85
+
+# Door/Stair Location
+K:197:0x83:0x9C
+
+# Acquirement
+K:198:0x83:0x9C
+
+# *Acquirement*
+K:199:0x83:0x9C
+
+# Mass Genocide
+K:200:0x83:0x9C
+
+# Detect Invisible
+K:201:0x83:0x9C
+
+# Aggravation
+K:202:0x83:0x9C
+
+# Trap Creation
+K:203:0x83:0x9C
+
+# Trap/Door Destruction
+K:204:0x83:0x9C
+
+# Artifact Creation
+K:205:0x83:0x9C
+
+# Recharging
+K:206:0x83:0x9C
+
+# Genocide
+K:207:0x83:0x9C
+
+# Darkness
+K:208:0x83:0x9C
+
+# Protection from Evil
+K:209:0x83:0x9C
+
+# Satisfy Hunger
+K:210:0x83:0x9C
+
+# Dispel Undead
+K:211:0x83:0x9C
+
+# *Enchant Weapon*
+K:212:0x83:0x9C
+
+# Curse Weapon
+K:213:0x83:0x9C
+
+# *Enchant Armour*
+K:214:0x83:0x9C
+
+# Curse Armour
+K:215:0x83:0x9C
+
+# Summon Undead
+K:216:0x83:0x9C
+
+# Blessing
+K:217:0x83:0x9C
+
+# Holy Chant
+K:218:0x83:0x9C
+
+# Holy Prayer
+K:219:0x83:0x9C
+
+# Word of Recall
+K:220:0x83:0x9C
+
+# *Destruction*
+K:221:0x83:0x9C
+
+# Slime Mold Juice
+K:222:0x85:0x85
+
+# Apple Juice
+K:223:0x85:0x85
+
+# Water
+K:224:0x85:0x85
+
+# Strength
+K:225:0x85:0x85
+
+# Weakness
+K:226:0x85:0x85
+
+# Restore Strength
+K:227:0x85:0x85
+
+# Intelligence
+K:228:0x85:0x85
+
+# Stupidity
+K:229:0x85:0x85
+
+# Restore Intelligence
+K:230:0x85:0x85
+
+# Wisdom
+K:231:0x85:0x85
+
+# Naivety
+K:232:0x85:0x85
+
+# Restore Wisdom
+K:233:0x85:0x85
+
+# Charisma
+K:234:0x85:0x85
+
+# Ugliness
+K:235:0x85:0x85
+
+# Restore Charisma
+K:236:0x85:0x85
+
+# Curing
+K:237:0x85:0x85
+
+# Invulnerability
+K:238:0x85:0x85
+
+# New Life
+K:239:0x85:0x85
+
+# Cure Serious Wounds
+K:240:0x85:0x85
+
+# Cure Critical Wounds
+K:241:0x85:0x85
+
+# Healing
+K:242:0x85:0x85
+
+# Constitution
+K:243:0x85:0x85
+
+# Experience
+K:244:0x85:0x85
+
+# Sleep
+K:245:0x85:0x85
+
+# Blindness
+K:246:0x85:0x85
+
+# Booze
+K:247:0x85:0x85
+
+# Poison
+K:248:0x85:0x85
+
+# Speed
+K:249:0x85:0x85
+
+# Slowness
+K:250:0x85:0x85
+
+# Dexterity
+K:251:0x85:0x85
+
+# Restore Dexterity
+K:252:0x85:0x85
+
+# Restore Constitution
+K:253:0x85:0x85
+
+# Lose Memories
+K:254:0x85:0x85
+
+# Salt Water
+K:255:0x85:0x85
+
+# Enlightenment
+K:256:0x85:0x85
+
+# Heroism
+K:257:0x85:0x85
+
+# Berserk Strength
+K:258:0x85:0x85
+
+# Boldness
+K:259:0x85:0x85
+
+# Restore Life Levels
+K:260:0x85:0x85
+
+# Resist Heat
+K:261:0x85:0x85
+
+# Resist Cold
+K:262:0x85:0x85
+
+# Detect Invisible
+K:263:0x85:0x85
+
+# Slow Poison
+K:264:0x85:0x85
+
+# Neutralise Poison
+K:265:0x85:0x85
+
+# Restore Mana
+K:266:0x85:0x85
+
+# Infra-vision
+K:267:0x85:0x85
+
+# Resistance
+K:268:0x85:0x85
+
+# Spell
+K:269:0x86:0x93
+
+# Manathrust
+K:270:0x86:0x93
+
+# Fireflash
+K:271:0x86:0x93
+
+# Firewall
+K:272:0x86:0x93
+
+# Tidal Wave
+K:273:0x86:0x93
+
+# Ice Storm
+K:274:0x86:0x93
+
+# Noxious Cloud
+K:275:0x86:0x93
+
+# Poison Blood
+K:276:0x86:0x93
+
+# Thunderstorm
+K:277:0x86:0x93
+
+# Dig
+K:278:0x86:0x93
+
+# Stone Prison
+K:279:0x86:0x93
+
+# Strike
+K:280:0x86:0x93
+
+# Teleport Away
+K:281:0x86:0x93
+
+# Summon Animal
+K:282:0x86:0x93
+
+# Magelock
+K:283:0x86:0x93
+
+# Slow Monster
+K:284:0x86:0x93
+
+# Essence of Speed
+K:285:0x86:0x93
+
+# Banishment
+K:286:0x86:0x93
+
+# Disperse Magic
+K:287:0x86:0x93
+
+# Charm
+K:288:0x86:0x93
+
+# Confuse
+K:289:0x86:0x93
+
+# Demon Blade
+K:290:0x86:0x93
+
+# Heal Monster
+K:291:0x86:0x93
+
+# Haste Monster
+K:292:0x86:0x93
+
+# & Flight Arrow~
+K:293:0x8C:0x81
+
+# & Boulder~
+K:295:0xC6:0x9F
+
+# & Flame~ Imperishable
+K:296:0xBE:0x9F
+
+# & Necromantic Teeth~
+K:297:0xC5:0xA5
+
+# & Golden Horn~ of the Eagles
+K:298:0x86:0x93
+
+# Spell
+K:300:0x87:0x92
+
+# Nothing
+K:301:0x87:0x92
+
+# Globe of Light
+K:302:0x87:0x92
+
+# Fiery Shield
+K:303:0x87:0x92
+
+# Remove Curses
+K:304:0x87:0x92
+
+# Wings of Winds
+K:305:0x87:0x92
+
+# Shake
+K:306:0x87:0x92
+
+# Disarm
+K:307:0x87:0x92
+
+# Teleportation
+K:308:0x87:0x92
+
+# Probability Travel
+K:309:0x87:0x92
+
+# Recovery
+K:310:0x87:0x92
+
+# Healing
+K:311:0x87:0x92
+
+# Vision
+K:312:0x87:0x92
+
+# Identify
+K:313:0x87:0x92
+
+# Sense Hidden
+K:314:0x87:0x92
+
+# Reveal Ways
+K:315:0x87:0x92
+
+# Sense Monsters
+K:316:0x87:0x92
+
+# Genocide
+K:317:0x87:0x92
+
+# Summon
+K:318:0x87:0x92
+
+# Sterilization
+K:319:0x87:0x92
+
+# Wish
+K:320:0x87:0x92
+
+# Mana
+K:321:0x87:0x92
+
+# & Tome~ of Magical Energy
+K:330:0x90:0xA0
+
+# & Tome~ of the Eternal Flame
+K:331:0x90:0xA1
+
+# & Tome~ of the Blowing Wind
+K:332:0x90:0xA2
+
+# & Tome~ of the Impenetrable Earth
+K:333:0x90:0xA3
+
+# & Tome~ of the Everrunning Wave
+K:334:0x90:0xA4
+
+# & Tome~ of Translocation
+K:335:0x90:0xA5
+
+# & Tome~ of the Tree
+K:336:0x90:0xA6
+
+# & Tome~ of Knowledge
+K:337:0x90:0xA7
+
+# & Small wooden chest~
+K:338:0x84:0x99
+
+# & Large wooden chest~
+K:339:0x84:0x9A
+
+# & Small iron chest~
+K:340:0x84:0x9B
+
+# & Large iron chest~
+K:341:0x84:0x9C
+
+# & Small steel chest~
+K:342:0x84:0x9D
+
+# & Large steel chest~
+K:343:0x84:0x9E
+
+# & Ruined chest~
+K:344:0x84:0x9F
+
+# & Iron Spike~
+K:345:0x8E:0x89
+
+# & Wooden Torch~
+K:346:0x8E:0x8B
+
+# & Brass Lantern~
+K:347:0x8E:0x8A
+
+# & Flask~ of oil
+K:348:0x8E:0x88
+
+# & Empty Bottle~
+K:349:0x8E:0x87
+
+# Havoc
+K:350:0x86:0x83
+
+# Door/Stair Location
+K:351:0x86:0x83
+
+# Trap Location
+K:352:0x86:0x83
+
+# Probing
+K:353:0x86:0x83
+
+# Recall
+K:354:0x86:0x83
+
+# Illumination
+K:355:0x86:0x83
+
+# Light
+K:356:0x86:0x83
+
+# Lightning Bolts
+K:357:0x86:0x83
+
+# Frost Bolts
+K:358:0x86:0x83
+
+# Fire Bolts
+K:359:0x86:0x83
+
+# Polymorph
+K:360:0x86:0x83
+
+# Slow Monster
+K:361:0x86:0x83
+
+# Sleep Monster
+K:362:0x86:0x83
+
+# Drain Life
+K:363:0x86:0x83
+
+# Teleport Other
+K:364:0x86:0x83
+
+# Disarming
+K:365:0x86:0x83
+
+# Lightning Balls
+K:366:0x86:0x83
+
+# Cold Balls
+K:367:0x86:0x83
+
+# Fire Balls
+K:368:0x86:0x83
+
+# Acid Balls
+K:369:0x86:0x83
+
+# Acid Bolts
+K:370:0x86:0x83
+
+# Enlightenment
+K:371:0x86:0x83
+
+# Perception
+K:372:0x86:0x83
+
+# Curing
+K:373:0x86:0x83
+
+# Healing
+K:374:0x86:0x83
+
+# Detection
+K:375:0x86:0x83
+
+# Restoration
+K:376:0x86:0x83
+
+# Speed
+K:377:0x86:0x83
+
+# Spell
+K:378:0x84:0x83
+
+# Spell
+K:379:0x87:0x80
+
+# & Broken Skull~
+K:391:0x8E:0x94
+
+# & Broken Bone~
+K:392:0x8E:0x95
+
+# & Canine Skeleton~
+K:393:0x8E:0x9A
+
+# & Rodent Skeleton~
+K:394:0x8E:0x9B
+
+# & Human Skeleton~
+K:395:0x8E:0x96
+
+# & Dwarf Skeleton~
+K:396:0x8E:0x98
+
+# & Elf Skeleton~
+K:397:0x8E:0x97
+
+# & Gnome Skeleton~
+K:398:0x8E:0x99
+
+# & Great Hammer~
+K:399:0xB6:0x8A
+
+# Black Dragon Scale Mail~
+K:400:0x8A:0x82
+
+# Blue Dragon Scale Mail~
+K:401:0x8A:0x80
+
+# White Dragon Scale Mail~
+K:402:0x8A:0x81
+
+# Red Dragon Scale Mail~
+K:403:0x8A:0x83
+
+# Green Dragon Scale Mail~
+K:404:0x8A:0x84
+
+# Multi-Hued Dragon Scale Mail~
+K:405:0x8A:0x8B
+
+# Pseudo Dragon Scale Mail~
+K:406:0x8A:0x87
+
+# Law Dragon Scale Mail~
+K:407:0x8A:0x89
+
+# Bronze Dragon Scale Mail~
+K:408:0x8A:0x85
+
+# Gold Dragon Scale Mail~
+K:409:0x8A:0x86
+
+# Chaos Dragon Scale Mail~
+K:410:0x8A:0x88
+
+# Balance Dragon Scale Mail~
+K:411:0x8A:0x8A
+
+# Power Dragon Scale Mail~
+K:412:0x8A:0x8C
+
+# & Dragon Helm~
+K:413:0x88:0x82
+
+# & Dragon Shield~
+K:414:0x88:0x9C
+
+# Death
+K:415:0x85:0x85
+
+# Ruination
+K:416:0x85:0x85
+
+# Detonations
+K:417:0x85:0x85
+
+# Augmentation
+K:418:0x85:0x85
+
+# *Healing*
+K:419:0x85:0x85
+
+# Life
+K:420:0x85:0x85
+
+# Self Knowledge
+K:421:0x85:0x85
+
+# *Enlightenment*
+K:422:0x85:0x85
+
+# Fear Resistance
+K:425:0x84:0x83
+
+# Light and Darkness Resistance
+K:426:0x84:0x83
+
+# Nether Resistance
+K:427:0x84:0x83
+
+# Nexus Resistance
+K:428:0x84:0x83
+
+# Sound Resistance
+K:429:0x84:0x83
+
+# Confusion Resistance
+K:430:0x84:0x83
+
+# Shard Resistance
+K:431:0x84:0x83
+
+# Disenchantment Resistance
+K:432:0x84:0x83
+
+# Chaos Resistance
+K:433:0x84:0x83
+
+# Blindness Resistance
+K:434:0x84:0x83
+
+# Lordly Protection
+K:435:0x84:0x83
+
+# Extra Attacks
+K:436:0x84:0x83
+
+# Cure Light Wounds
+K:437:0x85:0x85
+
+# Clumsiness
+K:438:0x85:0x85
+
+# Sickliness
+K:439:0x85:0x85
+
+# Map of Bree
+K:440:0xC4:0x80
+
+# Map of Gondolin
+K:441:0xC4:0x80
+
+# Map of Lothlorien
+K:442:0xC4:0x80
+
+# Map of Minas Anor
+K:443:0xC4:0x80
+
+# & Silver Arrow~
+K:465:0xC6:0x81
+
+# & Silver Bolt~
+K:466:0xC6:0x82
+
+# Lightning Resistance
+K:467:0x87:0x80
+
+# Wisdom
+K:468:0x87:0x80
+
+# Regeneration
+K:469:0x87:0x80
+
+# Infravision
+K:470:0x87:0x80
+
+# Devotion
+K:471:0x87:0x80
+
+# Weaponmastery
+K:472:0x87:0x80
+
+# Trickery
+K:473:0x87:0x80
+
+# Telepathy
+K:474:0x87:0x80
+
+# Sustenance
+K:475:0x87:0x80
+
+# & Palantir~
+K:476:0xC6:0x87
+
+# & Elfstone~
+K:477:0xC6:0x83
+
+# & Jewel~
+K:478:0xC6:0x84
+
+# & Ring~
+K:479:0xC6:0x85
+
+# copper
+K:480:0x83:0x91
+
+# copper
+K:481:0x83:0x91
+
+# copper
+K:482:0x83:0x91
+
+# silver
+K:483:0x83:0x92
+
+# silver
+K:484:0x83:0x92
+
+# silver
+K:485:0x83:0x92
+
+# garnets
+K:486:0x83:0x96
+
+# garnets
+K:487:0x83:0x96
+
+# gold
+K:488:0x83:0x93
+
+# gold
+K:489:0x83:0x93
+
+# gold
+K:490:0x83:0x93
+
+# opals
+K:491:0x83:0x97
+
+# sapphires
+K:492:0x83:0x98
+
+# rubies
+K:493:0x83:0x99
+
+# diamonds
+K:494:0x83:0x9A
+
+# emeralds
+K:495:0x83:0x9B
+
+# mithril
+K:496:0x83:0x94
+
+# adamantite
+K:497:0x83:0x95
+
+# & Mighty Hammer~
+K:498:0xB6:0x8A
+
+# & Massive Iron Crown~
+K:499:0x87:0x9C
+
+# & Phial~
+K:500:0x8E:0x9D
+
+# & Star~
+K:501:0x8E:0x9E
+
+# & Arkenstone~
+K:502:0x8E:0x9F
+
+# & Amulet~
+K:503:0x84:0x96
+
+# & Amulet~
+K:504:0x84:0x97
+
+# & Necklace~
+K:505:0x84:0x98
+
+# & Ring~
+K:506:0x84:0x8F
+
+# & Ring~
+K:507:0x84:0x83
+
+# & Ring~
+K:508:0x84:0x92
+
+# & Ring~
+K:509:0x84:0x93
+
+# & Ring~
+K:510:0x84:0x94
+
+# & Ring~
+K:511:0x84:0x95
+
+# Reflection
+K:520:0x87:0x83
+
+# Anti-Magic
+K:521:0x87:0x83
+
+# Anti-Teleportation
+K:522:0x87:0x83
+
+# Resistance
+K:523:0x87:0x83
+
+# & Zweihander~
+K:524:0xB6:0x8C
+
+# & Dwarven Lantern~
+K:525:0xC5:0x94
+
+# Splint Mail~
+K:526:0x89:0x9C
+
+# & Everburning Torch~
+K:527:0xC5:0x95
+
+# & Trifurcate Spear~
+K:528:0xB6:0x85
+
+# & Three-Piece Rod~
+K:529:0xB6:0x80
+
+# & Feanorian Lamp~
+K:530:0xC5:0x96
+
+# & Fur Cloak~
+K:531:0x89:0x89
+
+# Water Curing
+K:532:0x85:0x85
+
+# & Hatchet~
+K:533:0xB6:0x8F
+
+# Mumak Hide Armour~
+K:535:0x89:0x98
+
+# & Leather Jerkin~
+K:536:0x89:0x8F
+
+# & Sickle~
+K:537:0xB6:0x90
+
+# & Club~
+K:542:0xB6:0x92
+
+# & Broad Spear~
+K:543:0xB6:0x84
+
+# & Khopesh~
+K:544:0xB6:0x94
+
+# & Flamberge~
+K:545:0xB6:0x83
+
+# & Claymore~
+K:546:0xB6:0x8D
+
+# & Espadon~
+K:547:0xB6:0x8E
+
+# & Great Scimitar~
+K:548:0xB6:0x8B
+
+# Arrow
+K:549:0x8E:0xA0
+
+# Bolt
+K:550:0x8E:0xA1
+
+# & Fauchard~
+K:551:0xB6:0x95
+
+# & Guisarme~
+K:552:0xB6:0x96
+
+# & Heavy Lance~
+K:553:0xB6:0x82
+
+# & Bardiche~
+K:554:0xB6:0x99
+
+# Catapult
+K:555:0x8E:0xA2
+
+# Ring Mail~
+K:556:0x89:0x9C
+
+# Cord Armour~
+K:557:0x89:0x90
+
+# Paper Armour~
+K:558:0x8A:0x81
+
+# Padded Armour~
+K:559:0x89:0x91
+
+# Fumes
+K:560:0x8E:0xA3
+
+# Golden Ring Mail~
+K:561:0xC5:0xB4
+
+# Magic
+K:562:0x8E:0xA4
+
+# Device
+K:563:0x8E:0xA5
+
+# Nothing
+K:569:0x86:0x83
+
+# & Blood~ of Life
+K:573:0x85:0x85
+
+# & Mage Staff~
+K:577:0xB8:0x80
+
+# Lightning
+K:578:0x84:0x80
+
+# & Ring~
+K:582:0x84:0x85
+
+# Invisibility
+K:583:0x85:0x85
+
+# Corruption
+K:585:0x85:0x85
+
+# Invisibility
+K:586:0x84:0x80
+
+# Deep Thoughts
+K:588:0x83:0x9C
+
+# More Deep Thoughts
+K:589:0x83:0x9D
+
+# Compendium of Deep Thoughts
+K:590:0x83:0x9E
+
+# Artifact Lore Vol. I
+K:591:0x83:0x9C
+
+# Artifact Lore Vol. II
+K:592:0x83:0x9D
+
+# Artifact Lore Vol. III
+K:593:0x83:0x9F
+
+# Monstrous Compendium 1
+K:594:0x83:0x9F
+
+# Monstrous Compendium 2
+K:595:0x83:0x9E
+
+# Monstrous Compendium 3
+K:596:0x83:0x9D
+
+# Monstrous Compendium 4
+K:597:0x83:0x9C
+
+# Monstrous Compendium 5
+K:598:0x83:0x9F
+
+# Monstrous Compendium 6
+K:599:0x83:0x9E
+
+# Monstrous Compendium 7
+K:600:0x83:0x9D
+
+# Monstrous Compendium 8
+K:601:0x83:0x9C
+
+# Monstrous Compendium 9
+K:602:0x83:0x9D
+
+# Monstrous Compendium 10
+K:603:0x83:0x9E
+
+# Monstrous Compendium 11
+K:604:0x83:0x9F
+
+# & Morphic Oil~ of #
+K:605:0x85:0x85
+
+# Artifact Lore Vol. IV
+K:607:0x83:0x9C
+
+# Artifact Lore Vol. V
+K:608:0x83:0x9D
+
+# Artifact Lore Vol. VI
+K:609:0x83:0x9E
+
+# Artifact Lore Vol. VII
+K:610:0x83:0x9F
+
+# Artifact Lore Vol. VIII
+K:611:0x83:0x9C
+
+# Artifact Lore Vol. IX
+K:612:0x83:0x9D
+
+# Artifact Lore Vol. X
+K:613:0x83:0x9E
+
+# Artifact Lore Vol. XI
+K:614:0x83:0x9F
+
+# Artifact Lore Vol. IX
+K:615:0x83:0x9C
+
+# Artifact Lore Vol. X
+K:616:0x83:0x9D
+
+# Artifact Lore Vol. XI
+K:617:0x83:0x9E
+
+# & #~
+K:618:0x8F:0xA0
+
+# corpse
+K:641:0xB8:0x81
+
+# skeleton
+K:642:0x8E:0x96
+
+# head
+K:643:0x8E:0x94
+
+# skull
+K:644:0x8E:0x94
+
+# raw meat
+K:645:0x8E:0x83
+
+# & Great Eagle Down Coat~
+K:646:0x8A:0x86
+
+# & Key~
+K:647:0x8E:0x9C
+
+# & Small Wooden Boomerang~
+K:648:0xB8:0x82
+
+# & Wooden Boomerang~
+K:649:0xB8:0x83
+
+# & Small Metal Boomerang~
+K:650:0xB8:0x84
+
+# & Metal Boomerang~
+K:651:0xB8:0x85
+
+# & Anchor~
+K:652:0x8D:0x9E
+
+# & ~
+K:653:0xC5:0xB5
+
+# Summon Never-Moving Pet
+K:654:0x83:0x9D
+
+# Cure Light Insanity
+K:657:0x85:0x85
+
+# Cure Serious Insanity
+K:658:0x85:0x85
+
+# Cure Critical Insanity
+K:659:0x85:0x85
+
+# Cure Insanity
+K:660:0x85:0x85
+
+# & Phial~
+K:661:0x8E:0x9D
+
+# Junkart
+K:662:0xC5:0xB6
+
+# Craftsmanship
+K:663:0x83:0x9F
+
+# The One Ring
+K:664:0x83:0x9E
+
+# & Horn~
+K:669:0xB8:0x88
+
+# & Drum~
+K:670:0xB8:0x89
+
+# & Harp~
+K:671:0xB8:0x8A
+
+# & Palantir~
+K:675:0x8D:0x9F
+
+# Egg
+K:676:0xB7:0x8D
+
+# Reset Recall
+K:677:0x83:0x9D
+
+# Divination
+K:678:0x83:0x9D
+
+# Self
+K:679:0xB7:0x8E
+
+# Ray
+K:680:0xB7:0x8F
+
+# Sphere
+K:681:0xB7:0x90
+
+# Knowledge
+K:682:0xB7:0x94
+
+# Life
+K:683:0xB7:0x95
+
+# Fire
+K:684:0xB7:0x96
+
+# Cold
+K:685:0xB7:0x97
+
+# Lightning
+K:686:0xB7:0x98
+
+# Acid
+K:687:0xB7:0x99
+
+# Element
+K:688:0xB7:0x9A
+
+# Chaos
+K:689:0xB7:0x9B
+
+# Mind
+K:690:0xB7:0x9C
+
+# Holding
+K:691:0xB7:0x9D
+
+# Arrow
+K:692:0xB7:0x91
+
+# Power Surge
+K:693:0xB7:0x92
+
+# Armageddon
+K:694:0xB7:0x93
+
+# Gravity
+K:695:0xB7:0x9E
+
+# Undeath
+K:697:0xB6:0x9B
+
+# Protection
+K:698:0xB6:0x9C
+
+# & Ring~ of Precognition
+K:700:0x84:0x83
+
+# & Sprig~ of Athelas
+K:701:0xB8:0x8E
+
+# & Old Scroll~ of Deincarnation
+K:720:0x83:0x9F
+
+# & Dark Sword~
+K:721:0xC4:0x81
+
+# Numenorean for Beginners (I)
+K:722:0x83:0x9D
+
+# Numenorean for Beginners (II)
+K:723:0x83:0x9D
+
+# Advanced Lessons of Numenorean
+K:724:0x83:0x9D
+
+# Advanced Lessons of Sindarin
+K:725:0x83:0x9D
+
+# & Shard~ of Pottery
+K:726:0x8E:0x92
+
+# & Broken Stick~
+K:727:0x8E:0x93
+
+# & Book~ of Beginner Cantrips
+K:738:0x90:0xA0
+
+# & Book~ of Teleportation
+K:739:0x90:0xA5
+
+# & Book~ of Summoning
+K:741:0x90:0xA7
+
+# & Potion~ of Learning
+K:743:0xC1:0x82
+
+# Khuzdul - The Hidden Tongue of the Dwarves
+K:751:0x83:0x9D
+
+# Nandorin for Dummies
+K:752:0x83:0x9D
+
+# Advanced Lessons of Orcish
+K:753:0x83:0x9D
+
+# Flying
+K:755:0x84:0x88
+
+# & Tome~ of the Time
+K:756:0x90:0xA5
+
+# & Spellbook~ of #
+K:757:0x91:0xA4
+
+# & Tome~ of Meta Spells
+K:758:0x90:0xA0
+
+# & Tome~ of the Mind
+K:759:0x90:0xA7
+
+# & Holy Tome~ of Eru Iluvatar
+K:760:0x90:0xA7
+
+# & Holy Tome~ of Manwe Sulimo
+K:761:0x90:0xA2
+
+# & War Tome~ of Tulkas
+K:762:0x90:0xA5
+
+# & Unholy Tome~ of the Hellflame
+K:763:0x90:0xA1
+
+# & Corrupted Tome~ of Melkor
+K:764:0x90:0xA1
+
+# & Earth Tome~ of Aule
+K:765:0x90:0xA3
+
+# & Shining Tome~ of Varda
+K:766:0x90:0xA2
+
+# & Water Tome~ of Ulmo
+K:767:0x90:0xA4
+
+# & Forest Tome~ of Yavanna
+K:768:0x90:0xA6
+
+# Tome of#
+K:769:0x90:0xA3
+
+# & Ring~
+K:770:0x84:0x84
+
+# & Holy Tome~ of Mandos
+K:771:0x90:0xA0
+
+# & Great Rod Tip~ of Home Summoning
+K:776:0x86:0x83
+
+# & Shadow Blade~
+K:777:0xC1:0x91
+
+# & Bluesteel Blade~
+K:778:0xC1:0x92
+
+# the Serpents
+K:779:0xC4:0x88
+
+# Ring~ of Power
+K:785:0xC4:0x8E
+
+# Climbing Set~
+K:786:0xC1:0x93
+
+# Adventurer's Guide to Middle-earth
+K:787:0x83:0x9E
+
+# & Demonblade~
+K:788:0x90:0xA8
+
+# & Demonshield~
+K:789:0x90:0xA9
+
+# & Demonhorn~
+K:790:0x90:0xAA
+
+# & Wooden Rod~ of#
+K:793:0xC1:0x95
+
+# & Copper Rod~ of#
+K:794:0xC1:0x96
+
+# & Iron Rod~ of#
+K:795:0xC1:0x97
+
+# & Moonstone Rod~ of#
+K:796:0xC1:0x98
+
+# & Silver Rod~ of#
+K:797:0xC1:0x99
+
+# & Golden Rod~ of#
+K:798:0xC1:0x9B
+
+# & Mithril Rod~ of#
+K:799:0xC1:0x9C
+
+# & Tilkal Rod~ of#
+K:800:0xC1:0x9D
+
+# & Greater Ration~ of Health
+K:801:0xC4:0x87
+
+# & Crumpled Scroll~ of Mass Resurrection
+K:802:0x83:0x9E
+
+# & Cleaver~
+K:803:0xC4:0x82
+
+# & Light War Axe~
+K:804:0xC4:0x83
+
+# & Slaughter Axe~
+K:805:0xC4:0x84
+
+# & Runestone~
+K:806:0xC4:0x85
+
+# & Fortune cookie~
+K:807:0xC6:0x86
+
+# Critical Hits
+K:809:0x84:0x83
+
+# & Wand~ of Digging of Thrain
+K:810:0x86:0x93
+
+# & Gnarled Staff~ of Holy Fire of Mithrandir
+K:811:0x87:0x92
+
+# Partial Totem
+K:812:0xC6:0x9D
+
+# True Totem
+K:813:0xC6:0x9E
+
+# & Piece~ of the Relic of Eru
+K:814:0x8C:0xA2
+
+# & Piece~ of the Relic of Manwe
+K:815:0x8C:0xA3
+
+# & Piece~ of the Relic of Tulkas
+K:816:0x8C:0xA4
+
+# & Piece~ of the Relic of Melkor
+K:817:0x8C:0xA5
+
+# & Piece~ of the Relic of Yavanna
+K:818:0x8C:0xA6
+
+# & Ring~
+K:819:0x84:0x83
+
+# & Ring~
+K:820:0x84:0x83
+
+# & Ring~
+K:821:0x84:0x83
+
+# & Ring~
+K:822:0x84:0x83
+
+# & Ring~
+K:823:0x84:0x83
+
+# & Ring~
+K:824:0x84:0x83
+
+# & Piece~ of the Relic of Aule
+K:825:0x8C:0xA7
+
+# & Piece~ of the Relic of Varda
+K:826:0x8C:0xA8
+
+# & Piece~ of the Relic of Ulmo
+K:827:0x8C:0xA9
+
+# & Piece~ of the Relic of Mandos
+K:828:0x8C:0xAA
+
+# THEME
+
+# & Pinch~ of Longbottom Leaf
+K:831:0xC5:0xAA
+
+# & Ear~ of Corn
+K:832:0xC6:0xBF
+
+# & Tater~
+K:833:0xC5:0xA6
+
+# & Strawberry~
+K:834:0x93:0xA4
+
+# & Turnip~
+K:835:0xC5:0xA7
+
+# & Jar~ of Honey
+K:836:0xC5:0xA8
+
+# & Jug~ of Milk
+K:837:0xC5:0xA9
+
+# of War
+K:838:0x87:0x80
+
+# of Life
+K:839:0x87:0x80
+
+# Wizardry
+K:840:0x84:0x83
+
+# Vitality
+K:841:0x84:0x83
+
+# Clear Thought
+K:842:0x84:0x83
+
+# Clumsiness
+K:843:0x84:0x83
+
+# Sickliness
+K:844:0x84:0x83
+
+# Fortune
+K:845:0x84:0x83
+
+# Sterilise
+K:846:0x83:0x9C
+
+# Map of Middle-earth
+K:847:0xC4:0x80
+
+# Map of Edoras
+K:848:0xC4:0x80
+
+# Map of Esgaroth
+K:849:0xC4:0x80
+
+# Map of Hobbiton
+K:850:0xC4:0x80
+
+# Map of Osgiliath
+K:851:0xC4:0x80
+
+# Map of Pelargir
+K:852:0xC4:0x80
+
+# Map of Beorn's domain
+K:853:0xC4:0x80
+
+# Map of Dale
+K:854:0xC4:0x80
+
+# Map of Henneth Annun
+K:855:0xC4:0x80
+
+# Map of Helm's Deep
+K:856:0xC4:0x80
+
+# Map of Thranduil's realm
+K:857:0xC4:0x80
+
+# Map of Imladris
+K:858:0xC4:0x80
+
+# & Bearded Axe~
+K:859:0xC5:0xAD
+
+# & Double Axe~
+K:860:0xC5:0xAE
+
+# & Crusader Axe~
+K:861:0xC5:0xAF
+
+# & Reaper Axe~
+K:862:0xC5:0xB0
+
+# & Mithril Helm~
+K:863:0xC5:0xB8
+
+# & Set~ of Mithril Gauntlets
+K:864:0xC5:0xB9
+
+# & Small Mithril Shield~
+K:865:0xC5:0xBA
+
+# & Large Mithril Shield~
+K:866:0xC5:0xBB
+
+# & Map~
+K:867:0xC4:0x80
+
+# & Key~
+K:868:0x93:0xA7
+
+# & Cup~
+K:869:0xC5:0xAB
+
+# & Red Arrow~
+K:870:0xAE:0x87
+
+# & Sceptre~
+K:871:0x86:0x94
+
+# & Rod~
+K:872:0x86:0x93
+
+# & Necklace~
+K:873:0x87:0x8C
+
+# & Amulet~
+K:874:0x87:0x80
+
+# & Black Banner~
+K:875:0xC5:0xAC
+
+# & Pearl~
+K:876:0xC5:0xB1
+
+# & Silmaril~
+K:877:0xC5:0xB2
+
+# & Silmaril~
+K:878:0xC5:0xB3
+
+# & Golden Harp~
+K:879:0xC5:0xB7
+
+# Player
+R:0:0x8E/0x80
+
+# Filthy street urchin
+R:1:0xAA:0x80
+
+# Scrawny cat
+R:2:0xA7:0x82
+
+# Sparrow
+R:3:0xB4:0x9E
+
+# Chaffinch
+R:4:0xB4:0x9E
+
+# Wild rabbit
+R:5:0xB4:0x9F
+
+# Woodsman
+R:6:0xAA:0x91
+
+# Scruffy little dog
+R:7:0x9D:0x9A
+
+# Farmer Maggot
+R:8:0xAA:0x81
+
+# Blubbering idiot
+R:9:0xAA:0x82
+
+# Boil-covered wretch
+R:10:0xAA:0x83
+
+# Village idiot
+R:11:0xAA:0x84
+
+# Pitiful-looking beggar
+R:12:0xAA:0x85
+
+# Mangy-looking leper
+R:13:0xAA:0x86
+
+# Agent of the black market
+R:14:0xAA:0x87
+
+# Singing, happy drunk
+R:15:0xAA:0x88
+
+# Aimless-looking merchant
+R:16:0xAA:0x89
+
+# Mean-looking mercenary
+R:17:0xAA:0x8A
+
+# Battle-scarred veteran
+R:18:0xAA:0x8B
+
+# The Squint-eyed Southerner
+R:19:0xB0:0x80
+
+# Grey mold
+R:20:0xA8:0x9F
+
+# Large white snake
+R:21:0xA2:0x85
+
+# Grey mushroom patch
+R:22:0xB0:0x81
+
+# Newt
+R:23:0xB0:0x82
+
+# Ox
+R:24:0xC0:0xAE
+
+# Kine of Araw
+R:25:0xC0:0xAF
+
+# Sheep
+R:26:0xC0:0xB0
+
+# Giant white mouse
+R:27:0xAC:0x85
+
+# Large brown snake
+R:28:0xA2:0x84
+
+# Meara
+R:29:0xC0:0xB1
+
+# Horse
+R:30:0xC0:0xB2
+
+# White worm mass
+R:31:0xAC:0x9D
+
+# Floating eye
+R:32:0xA6:0x9B
+
+# Rock lizard
+R:33:0xA2:0x86
+
+# The Boar of Everholt
+R:34:0xC0:0xB3
+
+# Jackal
+R:35:0x9D:0x9B
+
+# Soldier ant
+R:36:0xA5:0x87
+
+# Fruit bat
+R:37:0xA5:0x8F
+
+# Insect swarm
+R:38:0xB5:0x9E
+
+# Boar
+R:39:0xC0:0xB4
+
+# Shrieker mushroom patch
+R:40:0x9D:0x86
+
+# Cow
+R:41:0xC0:0xB5
+
+# Novice warrior
+R:43:0xAA:0x8C
+
+# Novice rogue
+R:44:0xAA:0x8D
+
+# Novice priest
+R:45:0xAA:0x8E
+
+# Novice mage
+R:46:0xAA:0x8F
+
+# Yellow mushroom patch
+R:47:0x9D:0x87
+
+# White jelly
+R:48:0xA8:0x8A
+
+# Giant black ant
+R:49:0xA5:0x88
+
+# Salamander
+R:50:0xA2:0x88
+
+# White harpy
+R:51:0xA0:0x88
+
+# Deer
+R:52:0xC0:0xB6
+
+# Grip, Farmer Maggot's dog
+R:53:0x9D:0x9C
+
+# Wolf, Farmer Maggot's dog
+R:54:0x9D:0x9D
+
+# Fang, Farmer Maggot's dog
+R:55:0x9D:0x9D
+
+# Giant green frog
+R:56:0xA2:0x87
+
+# Lion
+R:57:0xC0:0xB7
+
+# Green worm mass
+R:58:0xAC:0x9E
+
+# Large yellow snake
+R:59:0xA2:0x89
+
+# Cave spider
+R:60:0xA2:0x9D
+
+# Crow
+R:61:0xB5:0x9F
+
+# Wild cat
+R:62:0xA7:0x83
+
+# Smeagol
+R:63:0xAA:0x90
+
+# Green ooze
+R:64:0xA8:0x8B
+
+# Poltergeist
+R:65:0x9F:0x99
+
+# Yellow jelly
+R:66:0xA8:0x8D
+
+# Squirrel
+R:67:0xC0:0xB8
+
+# Raven
+R:68:0xB5:0x9F
+
+# White midge
+R:69:0xA8:0x9D
+
+# Squirrel of Mirkwood
+R:70:0xC0:0xB9
+
+# Black naga
+R:71:0xA9:0x88
+
+# Spotted mushroom patch
+R:72:0x9D:0x88
+
+# Silver jelly
+R:73:0xA8:0x8C
+
+# Scruffy-looking hobbit
+R:74:0xA7:0x93
+
+# Giant white ant
+R:75:0xA5:0x89
+
+# Yellow mold
+R:76:0xA9:0x80
+
+# Ape
+R:77:0xC0:0xBA
+
+# Yellow worm mass
+R:78:0xAC:0x9F
+
+# Clear worm mass
+R:79:0xAD:0x80
+
+# Radiation eye
+R:80:0xA6:0x9C
+
+# Yellow light
+R:81:0xB8:0x93
+
+# Cave lizard
+R:82:0xA2:0x8A
+
+# Novice ranger
+R:83:0xAA:0x91
+
+# Blue jelly
+R:84:0xA8:0x8E
+
+# Creeping copper coins
+R:85:0x9D:0x80
+
+# Giant white rat
+R:86:0xAC:0x86
+
+# Snotling
+R:87:0xB9:0x89
+
+# Swordfish
+R:88:0xB6:0x9E
+
+# Blue worm mass
+R:89:0xAD:0x81
+
+# Large grey snake
+R:90:0xA2:0x8B
+
+# Corsair of Umbar
+R:91:0xC0:0xBB
+
+# Dunlending
+R:92:0xC0:0xBC
+
+# Apprentice mage
+R:93:0xAA:0x8F
+
+# Green naga
+R:94:0xA9:0x89
+
+# Giant leech
+R:95:0xB8:0x94
+
+# Barracuda
+R:96:0xB6:0x9F
+
+# Novice paladin
+R:97:0xAA:0x92
+
+# Man of Harad
+R:98:0xC0:0xBD
+
+# Blue ooze
+R:99:0xA8:0x8F
+
+# Green glutton ghost
+R:100:0x9F:0x9A
+
+# Green jelly
+R:101:0xA8:0x90
+
+# Lurtz, Uruk Captain of the White Hand
+R:102:0xA8:0x9B
+
+# Munchkin
+R:103:0xA8:0x86
+
+# Disenchanter eye
+R:104:0xA6:0x9D
+
+# Red worm mass
+R:105:0xAD:0x82
+
+# Copperhead snake
+R:106:0xA2:0x8C
+
+# Death sword
+R:107:0xB0:0x87
+
+# Purple mushroom patch
+R:108:0x9D:0x89
+
+# Apprentice priest
+R:109:0xAA:0x8E
+
+# Apprentice warrior
+R:110:0xAA:0x8C
+
+# Petty-dwarf
+R:111:0xB0:0x88
+
+# Petty-dwarf mage
+R:112:0xC0:0xBE
+
+# Brown mold
+R:113:0xA9:0x81
+
+# Giant brown bat
+R:114:0xA5:0x90
+
+# Butterfly
+R:115:0xC4:0xB3
+
+# Apprentice rogue
+R:116:0xAA:0x87
+
+# Creeping silver coins
+R:117:0x9D:0x81
+
+# Snaga
+R:118:0xA9:0x8E
+
+# Rattlesnake
+R:119:0xA2:0x8D
+
+# Giant slug
+R:120:0xB8:0x94
+
+# Giant pink frog
+R:121:0xB8:0x95
+
+# Dark elf
+R:122:0x92:0x94
+
+# Moth
+R:123:0xC4:0xB4
+
+# Crypt creep
+R:124:0xB0:0x8A
+
+# Rotting corpse
+R:125:0xB0:0x8B
+
+# Cave orc
+R:126:0xA9:0x8F
+
+# Wood spider
+R:127:0xA2:0x9E
+
+# Hurog
+R:128:0xA0:0x91
+
+# Bloodshot eye
+R:129:0xA6:0x9E
+
+# Red naga
+R:130:0xA9:0x8A
+
+# Red jelly
+R:131:0xA8:0x91
+
+# Nightingale
+R:132:0xC4:0xAD
+
+# Lost soul
+R:133:0x9F:0x9B
+
+# Night lizard
+R:134:0xA2:0x8F
+
+# Gorcrow
+R:135:0xC4:0xB1
+
+# Skeleton orc
+R:136:0xAC:0x8A
+
+# Grima the Wormtongue, Agent of Saruman
+R:137:0xAA:0x98
+
+# Robin Hood, the Outlaw
+R:138:0xB0:0x8C
+
+# Gull
+R:139:0xC4:0xAE
+
+# Lagduf, the Snaga
+R:140:0xA9:0x90
+
+# Kirinki
+R:141:0xC4:0xAF
+
+# Apprentice ranger
+R:142:0xAA:0x91
+
+# Giant salamander
+R:143:0xA2:0x90
+
+# Space monster
+R:144:0xB0:0x8D
+
+# Swan
+R:145:0xC0:0xBF
+
+# Green mold
+R:146:0xA9:0x82
+
+# Apprentice paladin
+R:147:0xAA:0x92
+
+# Caborrog
+R:148:0xA0:0x92
+
+# Hill orc
+R:149:0xA9:0x91
+
+# Bandit
+R:150:0xAA:0x9B
+
+# Hunting hawk
+R:151:0xB0:0x8E
+
+# Phantom warrior
+R:152:0xB0:0x8F
+
+# Thrush
+R:153:0xC4:0xB0
+
+# Yeti
+R:154:0xA4:0x91
+
+# Fox
+R:155:0xC4:0xAC
+
+# Giant grey rat
+R:156:0xAC:0x87
+
+# Black harpy
+R:157:0xA0:0x89
+
+# Fly of Mordor
+R:158:0xC4:0xB5
+
+# Limlug
+R:159:0xBF:0xA0
+
+# Cave bear
+R:160:0xC4:0x8F
+
+# Rock mole
+R:161:0xBA:0x82
+
+# Mindcrafter
+R:162:0xAA:0x93
+
+# Hatchling blue dragon
+R:163:0xA5:0x9D
+
+# Hatchling white dragon
+R:164:0xA5:0x9E
+
+# Hatchling green dragon
+R:165:0xA5:0x9F
+
+# Hatchling black dragon
+R:166:0xA6:0x80
+
+# Hatchling red dragon
+R:167:0xA6:0x81
+
+# Giant red ant
+R:168:0xA5:0x8D
+
+# Brodda, the Easterling
+R:169:0xAA:0x9C
+
+# Radbug, the Goblin
+R:170:0xBF:0xA1
+
+# King cobra
+R:171:0xA2:0x91
+
+# Eagle
+R:172:0xB4:0x9E
+
+# War bear
+R:173:0xB0:0x91
+
+# Killer bee
+R:174:0xB0:0x92
+
+# Giant spider
+R:175:0xA2:0x9F
+
+# Giant white tick
+R:176:0xA8:0x9D
+
+# The Lucky Hobbit
+R:177:0xBF:0xA2
+
+# Dark elven mage
+R:178:0xA7:0x96
+
+# Dark dwarven warrior
+R:179:0xBF:0xA3
+
+# Dark dwarven smith
+R:180:0xBF:0xA4
+
+# Dark dwarven lord
+R:181:0xBF:0xA5
+
+# Dark dwarven priest
+R:182:0xBF:0xA6
+
+# Dark elven warrior
+R:183:0xBF:0xA6
+
+# Clear mushroom patch
+R:184:0xB8:0x96
+
+# Quiver slot
+R:185:0xB0:0x93
+
+# Grishnakh, the Hill Orc
+R:186:0xA9:0x93
+
+# Giant tan bat
+R:187:0xC4:0x90
+
+# Owlbear
+R:188:0xBA:0x87
+
+# Clear mewlip
+R:189:0xBF:0xA7
+
+# Hairy mold
+R:190:0xA9:0x83
+
+# Grizzly bear
+R:191:0xBA:0x88
+
+# Disenchanter mold
+R:192:0xA9:0x84
+
+# Pseudo-dragon
+R:193:0xA6:0x82
+
+# Limrog
+R:194:0xA0:0x93
+
+# Creeping gold coins
+R:195:0x9D:0x82
+
+# Wolf
+R:196:0x9D:0x9E
+
+# Giant fruit fly
+R:197:0x9F:0x91
+
+# Panther
+R:198:0xA7:0x84
+
+# Brigand
+R:199:0xB0:0x94
+
+# Gray mewlip
+R:200:0xBF:0xA8
+
+# Orange mewlip
+R:201:0xBF:0xA9
+
+# Undead mass
+R:202:0xB0:0x97
+
+# Bloodshot mewlip
+R:203:0xBF:0xAA
+
+# Hatchling multi-hued dragon
+R:204:0xA6:0x83
+
+# Green mewlip
+R:205:0xBF:0xAB
+
+# Old Man Willow
+R:206:0xBA:0x89
+
+# Blue mewlip
+R:207:0xBF:0xAC
+
+# Zombified orc
+R:208:0xAC:0x8C
+
+# Hippogryph
+R:209:0xA0:0x8A
+
+# Black mamba
+R:210:0xA2:0x92
+
+# White wolf
+R:211:0x9D:0x9F
+
+# Grape jelly
+R:212:0xA8:0x92
+
+# Nether worm mass
+R:213:0xAD:0x83
+
+# Brown mewlip
+R:214:0xBF:0xAD
+
+# Golfimbul, the Hill Orc Chief
+R:215:0xA9:0x94
+
+# Swordsman
+R:216:0x97:0x81
+
+# Stone mewlip
+R:217:0xBF:0xAE
+
+# Hatchling bronze dragon
+R:218:0xA6:0x82
+
+# Hatchling gold dragon
+R:219:0xA6:0x82
+
+# Evil eye
+R:220:0xC4:0x91
+
+# Yellow mewlip
+R:221:0xBF:0xAF
+
+# Pink mewlip
+R:222:0xBF:0xB0
+
+# Tree mewlip
+R:223:0xBF:0xB1
+
+# Air mewlip
+R:224:0xBF:0xB2
+
+# Priest
+R:225:0xAA:0x9E
+
+# Dark elven priest
+R:226:0xA7:0x99
+
+# Air spirit
+R:227:0x9E:0x9F
+
+# Skeleton human
+R:228:0xAC:0x8B
+
+# Zombified human
+R:229:0xAD:0x8E
+
+# Tiger
+R:230:0xA7:0x85
+
+# Moaning spirit
+R:231:0x9F:0x9C
+
+# Plague mewlip
+R:232:0xBF:0xB3
+
+# Spotted jelly
+R:233:0xA8:0x93
+
+# Drider
+R:234:0xA3:0x80
+
+# Mongbat
+R:235:0xB0:0x9C
+
+# Killer brown beetle
+R:236:0xA0:0x9B
+
+# Death mewlip
+R:237:0xBF:0xB4
+
+# Ogre
+R:238:0xA1:0x8B
+
+# Creeping mithril coins
+R:239:0x9D:0x83
+
+# Illusionist
+R:240:0xAB:0x80
+
+# Druid
+R:241:0xAB:0x81
+
+# Fuinur, Lord of the Haradrim
+R:242:0xBF:0xB5
+
+# Cloaker
+R:243:0x89:0x88
+
+# Black orc
+R:244:0xA9:0x95
+
+# Ochre jelly
+R:245:0xA8:0x94
+
+# Software bug
+R:246:0xB0:0x9D
+
+# Lurker
+R:247:0x80:0x81
+
+# Tangleweed
+R:248:0xC4:0x92
+
+# Glorfindel of Rivendell
+R:249:0xBF:0xB6
+
+# Giant white dragonfly
+R:250:0x9F:0x93
+
+# Snaga sapper
+R:251:0xB9:0x8C
+
+# Finrod Felagund
+R:252:0xBF:0xB7
+
+# Gibbering mouther
+R:253:0xB0:0x9E
+
+# Maedhros the Tall
+R:254:0xBF:0xB8
+
+# Hill giant
+R:255:0xA1:0x91
+
+# Flesh golem
+R:256:0xA7:0x89
+
+# Warg
+R:257:0x9E:0x80
+
+# Cheerful leprawn
+R:258:0xB1:0x80
+
+# Giant flea
+R:259:0x9F:0x92
+
+# Ufthak of Cirith Ungol
+R:260:0xBA:0x8C
+
+# Clay golem
+R:261:0xB8:0x9D
+
+# Black ogre
+R:262:0xA1:0x8C
+
+# Maglor the Mighty Singer
+R:263:0xBF:0xB9
+
+# Half-orc
+R:264:0xBA:0x8D
+
+# Dark naga
+R:265:0xB8:0x9E
+
+# Poison ivy
+R:266:0xC4:0x93
+
+# Magic mushroom patch
+R:267:0x9D:0x8B
+
+# Celegorm the Fair
+R:268:0xBF:0xBA
+
+# Guardian naga
+R:269:0xA9:0x8B
+
+# Wererat
+R:270:0xBA:0x8E
+
+# Light hound
+R:271:0xA4:0x93
+
+# Dark hound
+R:272:0xA4:0x94
+
+# Flying skull
+R:273:0xB1:0x81
+
+# Caranthir the Dark
+R:274:0xBF:0xBB
+
+# Giant tarantula
+R:275:0xA3:0x81
+
+# Curufin the Crafty
+R:276:0xBF:0xBC
+
+# Mirkwood spider
+R:277:0xA3:0x82
+
+# Frost giant
+R:278:0xA1:0x92
+
+# Griffon
+R:279:0xA0:0x8B
+
+# Aewrog
+R:280:0xA0:0x94
+
+# Gnome mage
+R:281:0xA7:0x98
+
+# Clear hound
+R:282:0xA4:0x95
+
+# Umber hulk
+R:283:0xA3:0x99
+
+# Rust monster
+R:284:0xB9:0x8F
+
+# Ogrillon
+R:285:0xA9:0x98
+
+# Gelatinous cube
+R:286:0xA8:0x95
+
+# Giant green dragonfly
+R:287:0x9F:0x94
+
+# Fire giant
+R:288:0xA1:0x93
+
+# Hummerhorn
+R:289:0xBA:0x8F
+
+# Lizard man
+R:290:0xB9:0x90
+
+# Ulfast, Son of Ulfang
+R:291:0xAB:0x82
+
+# Crebain
+R:292:0xC4:0x94
+
+# Berserker
+R:293:0xA9:0x97
+
+# Draugrog
+R:294:0xA0:0x95
+
+# Sphinx
+R:295:0xB9:0x91
+
+# Narrog
+R:296:0xA0:0x96
+
+# Forest troll
+R:297:0xA3:0x89
+
+# Freezing sphere
+R:298:0xBA:0x91
+
+# Jumping fireball
+R:299:0xB9:0x92
+
+# Ball lightning
+R:300:0xBA:0x92
+
+# 2-headed hydra
+R:301:0xA2:0x93
+
+# Swamp thing
+R:302:0xB9:0x93
+
+# Water spirit
+R:303:0x9F:0x80
+
+# Giant red scorpion
+R:304:0xA3:0x83
+
+# Earth spirit
+R:305:0x9F:0x81
+
+# Fire spirit
+R:306:0x9F:0x82
+
+# Fire hound
+R:307:0xA4:0x96
+
+# Cold hound
+R:308:0xA4:0x97
+
+# Energy hound
+R:309:0xA4:0x98
+
+# Lesser mimic
+R:310:0x9D:0x8E
+
+# Door mimic
+R:311:0x82:0x83
+
+# Blink dog
+R:312:0x9E:0x81
+
+# Uruk
+R:313:0xA9:0x99
+
+# Shagrat, the Orc Captain
+R:314:0xA9:0x9A
+
+# Gorbag, the Orc Captain
+R:315:0xA9:0x9B
+
+# Shambling mound
+R:316:0x9D:0x8C
+
+# Venus Flytrap
+R:317:0xC4:0x95
+
+# Amrod, Son of Feanor
+R:318:0xBF:0xBD
+
+# Amras, Son of Feanor
+R:319:0xBF:0xBD
+
+# Giant bronze dragonfly
+R:320:0x9F:0x98
+
+# Stone giant
+R:321:0xA1:0x94
+
+# Giant black dragonfly
+R:322:0x9F:0x96
+
+# Stone golem
+R:323:0xA7:0x8B
+
+# Red mold
+R:324:0xA9:0x85
+
+# Giant gold dragonfly
+R:325:0x9F:0x97
+
+# Telchar the Smith
+R:326:0xBF:0xBE
+
+# Ghast
+R:327:0xBA:0x95
+
+# Neekerbreeker
+R:328:0xC4:0x96
+
+# Huorn
+R:329:0xBA:0x96
+
+# Bolg, Son of Azog
+R:330:0xA9:0x9C
+
+# Phase spider
+R:331:0xA3:0x84
+
+# Lizard king
+R:332:0xB9:0x97
+
+# Landmine
+R:333:0xBA:0x97
+
+# Roac, son of Carc
+R:334:0xC4:0xB2
+
+# Great eagle
+R:335:0xB9:0x98
+
+# Livingstone
+R:336:0xB1:0x84
+
+# Earth hound
+R:337:0xA4:0x99
+
+# Air hound
+R:338:0xA4:0x9A
+
+# Sabre-tooth tiger
+R:339:0xA7:0x86
+
+# Acid hound
+R:340:0xA4:0x9B
+
+# Chimaera
+R:341:0xA0:0x8C
+
+# Quylthulg
+R:342:0xA1:0x9A
+
+# Sasquatch
+R:343:0xA4:0x92
+
+# Carc of Ravenhill
+R:344:0xC4:0xB2
+
+# Ranger
+R:345:0xAA:0x97
+
+# Paladin
+R:346:0xAB:0x92
+
+# Werewolf
+R:347:0xBA:0x99
+
+# Dark elven lord
+R:348:0xA7:0x9C
+
+# Cloud giant
+R:349:0xA1:0x96
+
+# Ugluk, the Uruk
+R:350:0xA9:0x9D
+
+# Blue dragon bat
+R:351:0xA5:0x91
+
+# Mimic
+R:352:0x83:0x9D
+
+# Ultimate mimic
+R:353:0x84:0x9E
+
+# Fire vortex
+R:354:0xAC:0x94
+
+# Acid vortex
+R:355:0xAC:0x95
+
+# Lugdush, the Uruk
+R:356:0xB9:0x9A
+
+# Alatar, the Blue Wizard
+R:357:0xBF:0xBF
+
+# Cold vortex
+R:358:0xAC:0x96
+
+# Energy vortex
+R:359:0xAC:0x97
+
+# Globefish
+R:360:0xB9:0x9B
+
+# Giant firefly
+R:361:0x9F:0x95
+
+# Mummified orc
+R:362:0xA1:0x88
+
+# Wolf chieftain
+R:363:0xC4:0x97
+
+# Pallando, the Blue Wizard
+R:364:0xBF:0xBF
+
+# Vampiric mist
+R:365:0xB9:0x9D
+
+# Killer stag beetle
+R:366:0xA0:0x9D
+
+# Iron golem
+R:367:0xA7:0x8C
+
+# Auto-roller
+R:368:0xB1:0x86
+
+# Giant yellow scorpion
+R:369:0xA3:0x85
+
+# Muzgash, the Snaga
+R:370:0xBE:0xA0
+
+# Black ooze
+R:371:0xA8:0x96
+
+# Hardened warrior
+R:372:0xAB:0x83
+
+# Azog, King of the Uruk-Hai
+R:373:0xA9:0x9F
+
+# Bill Ferny
+R:374:0xBE:0xA1
+
+# Dark elven warlock
+R:375:0xB1:0x87
+
+# Master rogue
+R:376:0xAB:0x84
+
+# Red dragon bat
+R:377:0xA5:0x92
+
+# Killer white beetle
+R:378:0xBA:0x9E
+
+# Ice skeleton
+R:379:0xB9:0x9F
+
+# Angamaite of Umbar
+R:380:0xBB:0x80
+
+# Forest wight
+R:381:0xB1:0x88
+
+# Khim, Son of Mim
+R:382:0xB1:0x89
+
+# Ibun, Son of Mim
+R:383:0xB1:0x8A
+
+# Meneldor the Swift
+R:384:0xBB:0x81
+
+# Phantom beast
+R:385:0xB1:0x8B
+
+# Giant silver ant
+R:386:0xA0:0x9C
+
+# 4-headed hydra
+R:387:0xA2:0x95
+
+# Beruthiel, Queen of Cats
+R:388:0xBE:0xA2
+
+# The Hunter
+R:389:0xB1:0x8C
+
+# Mummified human
+R:390:0xA1:0x89
+
+# Vampire bat
+R:391:0xA5:0x93
+
+# Sangahyando of Umbar
+R:392:0xAB:0x85
+
+# It
+R:393:0xB1:0x8D
+
+# Banshee
+R:394:0x9F:0x9D
+
+# Herumor, Lord of the Haradrim
+R:395:0xBE:0xA3
+
+# Fimbrethil
+R:396:0xBB:0x84
+
+# Silent watcher
+R:397:0xB1:0x8E
+
+# Pukelman
+R:398:0xA7:0x8D
+
+# Mauhur, the Uruk
+R:399:0xBE:0xA4
+
+# Dark elven druid
+R:400:0xA7:0x9F
+
+# Stone troll
+R:401:0xA3:0x8A
+
+# Prince Imrahil the Proud
+R:402:0xBE:0xA5
+
+# Hill troll
+R:403:0xA3:0x8B
+
+# Wereworm
+R:404:0xAD:0x84
+
+# Killer red beetle
+R:405:0xA0:0x9F
+
+# Disenchanter bat
+R:406:0xC4:0x98
+
+# Umuiyan, Doorkeeper of Tevildo
+R:407:0xBE:0xA6
+
+# Giant grey ant
+R:408:0xA5:0x8C
+
+# Oikeroi, Bodyguard of Tevildo
+R:409:0xBE:0xA7
+
+# Gwaihir the Windlord
+R:410:0xBB:0x81
+
+# Giant fire tick
+R:411:0xBB:0x87
+
+# Lotho Sackville-Baggins, Betrayer of the Shire
+R:412:0xBE:0xA8
+
+# Ulwarth, Son of Ulfang
+R:413:0xAA:0x99
+
+# Werebear
+R:414:0xC4:0x8F
+
+# Cave ogre
+R:415:0xA1:0x8D
+
+# White wraith
+R:416:0xA3:0x9F
+
+# Thranduil, King of the Wood Elves
+R:417:0xBE:0xA9
+
+# Ghoul
+R:418:0xB4:0x8F
+
+# Mim, Betrayer of Turin
+R:419:0xB1:0x90
+
+# Hellblade
+R:420:0xB1:0x91
+
+# Killer fire beetle
+R:421:0xA1:0x80
+
+# Denethor, Steward of Gondor
+R:422:0xBE:0xAA
+
+# Creeping adamantite coins
+R:423:0x9D:0x84
+
+# Algroth
+R:424:0xA3:0x8C
+
+# Boromir, Son of Denethor
+R:425:0xBE:0xAB
+
+# Roper
+R:426:0xB9:0x80
+
+# Headless
+R:427:0xB1:0x92
+
+# Vibration hound
+R:428:0xA4:0x9C
+
+# Nexus hound
+R:429:0xA4:0x9D
+
+# Half-ogre
+R:430:0xA1:0x8E
+
+# Lokkak, the Ogre Chieftain
+R:431:0xA1:0x90
+
+# Vampire
+R:432:0xA3:0x9A
+
+# Gorgimaera
+R:433:0xA0:0x8D
+
+# Faramir, Son of Denethor
+R:434:0xBE:0xAC
+
+# Colbran
+R:435:0xA7:0x8E
+
+# Spirit naga
+R:436:0xA9:0x8C
+
+# Harry Goatleaf, Gatekeeper of Bree
+R:437:0xBE:0xAD
+
+# The Watcher of Cirith Ungol
+R:438:0xB1:0x8E
+
+# Stairway to Hell
+R:439:0xB1:0x94
+
+# 5-headed hydra
+R:440:0xA2:0x96
+
+# Tom Bombadil
+R:441:0xBE:0xAE
+
+# Wainrider
+R:442:0xAB:0x88
+
+# Seahorse
+R:443:0xBB:0x89
+
+# Cyclops
+R:444:0xBB:0x8A
+
+# Clairvoyant
+R:445:0xAB:0x86
+
+# Purple worm
+R:446:0xB9:0x82
+
+# Catoblepas
+R:447:0xAC:0x81
+
+# Lesser wall monster
+R:448:0xB1:0x96
+
+# Mage
+R:449:0xAB:0x8A
+
+# Mind flayer
+R:450:0xAB:0x8B
+
+# The Ultimate Dungeon Cleaner
+R:451:0xB1:0x97
+
+# The Mewlip Queen
+R:452:0xBE:0xAF
+
+# Basilisk
+R:453:0xA2:0x97
+
+# Snow-troll
+R:454:0xA3:0x8D
+
+# Fluithuin the Ogress, Consort of Morgoth
+R:455:0xBE:0xB0
+
+# Ulbandi the Ogress, Consort of Morgoth
+R:456:0xBE:0xB1
+
+# Naugladur, Lord of Nogrod
+R:457:0xBE:0xB2
+
+# Greater mimic
+R:458:0xB1:0x9A
+
+# Young blue dragon
+R:459:0xA6:0x84
+
+# Young white dragon
+R:460:0xA6:0x85
+
+# Young green dragon
+R:461:0xA6:0x86
+
+# Young bronze dragon
+R:462:0xA6:0x87
+
+# Androg the Outlaw
+R:463:0xBE:0xB3
+
+# Mithril golem
+R:464:0xA7:0x8F
+
+# Skeleton troll
+R:465:0xAC:0x8D
+
+# Amlach, son of Imlach
+R:466:0xBE:0xB4
+
+# Beorn, the Shape-Changer
+R:467:0xC4:0x99
+
+# Thorondor, Lord of Eagles
+R:468:0xBB:0x81
+
+# Giant blue ant
+R:469:0xA5:0x8B
+
+# Grave wight
+R:470:0xAD:0x9C
+
+# Shadow drake
+R:471:0xA6:0x88
+
+# Manticore
+R:472:0xA0:0x8E
+
+# Giant army ant
+R:473:0xAE:0x81
+
+# Killer slicer beetle
+R:474:0xA1:0x81
+
+# Gorgon
+R:475:0xBB:0x8D
+
+# Radagast the Brown
+R:476:0xBE:0xB5
+
+# Ghost
+R:477:0x9F:0x9E
+
+# Death watch beetle
+R:478:0xA1:0x82
+
+# Mountain ogre
+R:479:0xA1:0x8F
+
+# Nexus quylthulg
+R:480:0xA1:0x9B
+
+# Shelob, Spider of Darkness
+R:481:0xA3:0x86
+
+# Giant squid
+R:482:0xB9:0x83
+
+# Ghoulking
+R:483:0xAD:0x8C
+
+# Doombat
+R:484:0xB9:0x84
+
+# Easterling
+R:485:0xAB:0x8C
+
+# Memory moss
+R:486:0xA9:0x86
+
+# Storm giant
+R:487:0xA1:0x95
+
+# Spectator
+R:488:0xB1:0x9B
+
+# Bjorn the Warper
+R:489:0xC4:0x99
+
+# Vaire, the Weaver
+R:490:0xBE:0xB6
+
+# Half-troll
+R:491:0xA9:0x9E
+
+# Irmo of Lorien
+R:492:0xBE:0xB7
+
+# Bert the Stone Troll
+R:493:0xA3:0x90
+
+# Bill the Stone Troll
+R:494:0xA3:0x91
+
+# Tom the Stone Troll
+R:495:0xA3:0x92
+
+# Cave troll
+R:496:0xA3:0x8E
+
+# Este, the Gentle
+R:497:0xBE:0xB8
+
+# Barrow wight
+R:499:0xA4:0x81
+
+# Skeleton ettin
+R:500:0xC4:0x9A
+
+# Chaos drake
+R:501:0xA6:0x89
+
+# Law drake
+R:502:0xA6:0x8A
+
+# Balance drake
+R:503:0xA6:0x8B
+
+# Ethereal drake
+R:504:0xA6:0x8C
+
+# Groo, the Wanderer
+R:505:0xB1:0x9E
+
+# Nessa the Lithe
+R:506:0xBE:0xB9
+
+# Shade
+R:507:0xA4:0x89
+
+# Spectre
+R:508:0xA0:0x80
+
+# Water troll
+R:509:0xA3:0x93
+
+# Fire elemental
+R:510:0x9F:0x83
+
+# Water elemental
+R:512:0x9F:0x84
+
+# Multi-hued hound
+R:513:0xB2:0x81
+
+# Invisible stalker
+R:514:0x9F:0x85
+
+# Vana, the Ever-young
+R:515:0xBE:0xBA
+
+# Master thief
+R:516:0xAB:0x8E
+
+# The Watcher in the Water
+R:517:0xAF:0x95
+
+# Lich
+R:518:0xA1:0x83
+
+# Gas spore
+R:519:0xB2:0x8E
+
+# Master vampire
+R:520:0xA3:0x9B
+
+# Oriental vampire
+R:521:0xB2:0x83
+
+# Greater mummy
+R:522:0xA1:0x8A
+
+# Ingeborg, the Runemistress
+R:523:0xBE:0xBB
+
+# Giant grey scorpion
+R:524:0xA3:0x87
+
+# Earth elemental
+R:525:0x9F:0x86
+
+# Air elemental
+R:526:0x9F:0x87
+
+# Shimmering mold
+R:527:0xAF:0x81
+
+# Sarnrog
+R:528:0xBB:0x91
+
+# Malicious leprawn
+R:529:0xB2:0x85
+
+# Eog golem
+R:530:0xA7:0x90
+
+# Lindal Lossehelin
+R:531:0xBE:0xBC
+
+# Variag
+R:532:0x04:0x70
+
+# Headless ghost
+R:533:0xBB:0x92
+
+# Dread
+R:534:0xB9:0x87
+
+# Zizzo, Last of the Yeeks
+R:535:0xC3:0xAF
+
+# Gauth
+R:536:0xC4:0x9B
+
+# Smoke elemental
+R:537:0x9F:0x90
+
+# Olog
+R:538:0xA3:0x94
+
+# Halfling slinger
+R:539:0xB2:0x86
+
+# Gravity hound
+R:540:0xA4:0x9E
+
+# Acidic cytoplasm
+R:541:0xA8:0x97
+
+# Inertia hound
+R:542:0xA4:0x9F
+
+# Impact hound
+R:543:0xA5:0x80
+
+# Shardstorm
+R:544:0xC4:0x9C
+
+# Ooze elemental
+R:545:0x9F:0x88
+
+# Young black dragon
+R:546:0xA6:0x8D
+
+# Mumak
+R:547:0xAC:0x84
+
+# Giant fire ant
+R:548:0xA5:0x8A
+
+# Cold-drake
+R:549:0xA6:0x8E
+
+# Xorn
+R:550:0xA4:0x8F
+
+# Rogrog the Black Troll
+R:551:0xA3:0x8F
+
+# Erianyth, the Sorceress
+R:552:0xA7:0x91
+
+# Phantom
+R:553:0xB2:0x87
+
+# Grey wraith
+R:554:0xA4:0x82
+
+# Revenant
+R:555:0xA4:0x88
+
+# Young multi-hued dragon
+R:556:0xA6:0x8F
+
+# Karrazix the Brave
+R:557:0x9E:0x89
+
+# Colossus
+R:558:0xB2:0x89
+
+# Young gold dragon
+R:559:0xA6:0x90
+
+# Blue drake
+R:560:0xA6:0x91
+
+# Green drake
+R:561:0xA6:0x92
+
+# Bronze drake
+R:562:0xA6:0x93
+
+# Young red dragon
+R:563:0xA6:0x94
+
+# Sir Physt
+R:564:0x0B:0x56
+
+# Trapper
+R:565:0xAD:0x9F
+
+# Adanrog
+R:566:0xA0:0x98
+
+# Time bomb
+R:567:0xBB:0x96
+
+# Rawrog
+R:568:0xAD:0x90
+
+# Nick LeYeek, Second Last of the Yeeks
+R:569:0xC3:0xB0
+
+# Ice elemental
+R:570:0x9F:0x8A
+
+# Necromancer
+R:571:0xB2:0x8C
+
+# Slappy, Abbess of Pain
+R:572:0xBE:0xBD
+
+# Lorgan, Chief of the Easterlings
+R:573:0xB2:0x8D
+
+# Snow tiger
+R:574:0xC2:0xB0
+
+# Mummified troll
+R:575:0xBB:0x97
+
+# Storm of Unmagic
+R:576:0xC4:0x9D
+
+# Crypt thing
+R:577:0xA4:0x80
+
+# Chaos butterfly
+R:578:0xBB:0x98
+
+# Time elemental
+R:579:0xB2:0x8F
+
+# Blue yeek
+R:580:0xAD:0x87
+
+# The Queen Ant
+R:581:0xA5:0x8E
+
+# Will o' the wisp
+R:582:0x9F:0x8B
+
+# Brown yeek
+R:583:0xAD:0x88
+
+# Magma elemental
+R:584:0x9F:0x8C
+
+# Black pudding
+R:585:0xA8:0x98
+
+# Killer iridescent beetle
+R:586:0xB4:0x90
+
+# Nexus vortex
+R:587:0xAE:0x80
+
+# Plasma vortex
+R:588:0xAC:0x98
+
+# Fire-drake
+R:589:0xA6:0x95
+
+# Golden drake
+R:590:0xA6:0x96
+
+# Crystal drake
+R:591:0xA6:0x97
+
+# Black drake
+R:592:0xA6:0x98
+
+# Multi-hued drake
+R:593:0xA6:0x99
+
+# Master yeek
+R:594:0xAD:0x8A
+
+# Orfax, son of Boldor
+R:595:0xAD:0x89
+
+# Boldor, King of the Yeeks
+R:596:0xAD:0x8B
+
+# Black Numenorean
+R:597:0xAB:0x94
+
+# Castamir the Usurper
+R:598:0xB2:0x90
+
+# Time vortex
+R:599:0xAC:0x99
+
+# Shimmering vortex
+R:600:0xAC:0x9A
+
+# Ancient blue dragon
+R:601:0x9E:0x88
+
+# Ancient bronze dragon
+R:602:0x9E:0x89
+
+# Beholder
+R:603:0xA6:0x9F
+
+# Emperor wight
+R:604:0xA4:0x83
+
+# Giant tree ant
+R:605:0xC4:0xB7
+
+# Vargo, Tyrant of Fire
+R:606:0x9F:0x8D
+
+# Black wraith
+R:607:0xA4:0x84
+
+# Giant yellow ant
+R:608:0xC4:0xB8
+
+# Giant green ant
+R:609:0xC4:0xB9
+
+# Aquatic ant
+R:610:0xC4:0xBA
+
+# Monastic lich
+R:611:0xA1:0x87
+
+# Nether wraith
+R:612:0xA4:0x85
+
+# Hellhound
+R:613:0xAD:0x96
+
+# 7-headed hydra
+R:614:0xA2:0x99
+
+# Waldern, King of Water
+R:615:0x9F:0x8E
+
+# Termite
+R:616:0xC4:0xB6
+
+# Ancient white dragon
+R:617:0x9E:0x8A
+
+# Ancient green dragon
+R:618:0x9E:0x8B
+
+# Giant snow bat
+R:619:0xC4:0xBB
+
+# Eldrak
+R:620:0xA3:0x97
+
+# Ettin
+R:621:0xA3:0x96
+
+# Night mare
+R:622:0xAC:0x83
+
+# Vampire lord
+R:623:0xA3:0x9C
+
+# Ancient black dragon
+R:624:0x9E:0x8C
+
+# Weird fume
+R:625:0xAF:0x80
+
+# Giant grey bat
+R:626:0xC4:0xBC
+
+# Giant silver bat
+R:627:0xC4:0xBD
+
+# Giant yellow bat
+R:628:0xC4:0xBE
+
+# Shadowfax, steed of Gandalf
+R:629:0xBB:0x9E
+
+# Spirit troll
+R:630:0xA3:0x98
+
+# War troll
+R:631:0xB2:0x94
+
+# Disenchanter worm mass
+R:632:0xAD:0x86
+
+# Rotting quylthulg
+R:633:0xA1:0x9C
+
+# Lesser titan
+R:634:0xA1:0x97
+
+# 9-headed hydra
+R:635:0xA2:0x99
+
+# Enchantress
+R:636:0xAB:0x96
+
+# Ranger chieftain
+R:637:0xAB:0x97
+
+# Sorcerer
+R:638:0xAB:0x98
+
+# Xaren
+R:639:0xA4:0x90
+
+# Giant green bat
+R:640:0xC4:0xBF
+
+# Death vortex
+R:641:0xC3:0xA5
+
+# Gas vortex
+R:642:0xC3:0xA6
+
+# Death drake
+R:643:0x9E:0x8D
+
+# Ancient red dragon
+R:644:0x9E:0x8E
+
+# Ancient gold dragon
+R:645:0x9E:0x8F
+
+# Great crystal drake
+R:646:0x9E:0x90
+
+# Mana vortex
+R:647:0xC3:0xA7
+
+# Helcungol
+R:648:0xB2:0x95
+
+# Lygrog
+R:649:0xA0:0x99
+
+# Slow vortex
+R:650:0xC3:0xA8
+
+# Nether vortex
+R:651:0xC3:0xA9
+
+# Puzzling vortex
+R:652:0xC3:0xAA
+
+# Dark yeek
+R:653:0xC3:0xAB
+
+# Judge Fire
+R:654:0xAB:0x93
+
+# White yeek
+R:655:0xC3:0xAC
+
+# Judge Mortis
+R:656:0xBC:0x82
+
+# Dark elven sorcerer
+R:657:0xA8:0x81
+
+# Master lich
+R:658:0xA1:0x84
+
+# Gray yeek
+R:659:0xC3:0xAD
+
+# Eol, the Dark Elf
+R:660:0xB2:0x99
+
+# Yellow yeek
+R:661:0xC3:0xAE
+
+# Adventurer yeek
+R:662:0xAD:0x88
+
+# Dark mushroom patch
+R:663:0xC3:0xA1
+
+# Undead beholder
+R:664:0xA7:0x80
+
+# Shadow
+R:665:0xA0:0x81
+
+# Iron lich
+R:666:0xB2:0x9C
+
+# Dread
+R:667:0xB9:0x87
+
+# Greater basilisk
+R:668:0xBC:0x83
+
+# White mushroom patch
+R:669:0xC3:0xA0
+
+# Brown mushroom patch
+R:670:0xC3:0xA2
+
+# Silver mushroom patch
+R:671:0xC3:0xA3
+
+# Green mushroom patch
+R:672:0xC3:0xA4
+
+# Mumak
+R:673:0xAC:0x82
+
+# Judge Fear
+R:674:0xA7:0x88
+
+# Ancient multi-hued dragon
+R:675:0x9E:0x91
+
+# Ethereal dragon
+R:676:0x9E:0x92
+
+# Dark elemental
+R:677:0xC3:0xB1
+
+# Slow elemental
+R:678:0xC3:0xB2
+
+# Quaker, Master of Earth
+R:679:0x9F:0x8F
+
+# Death leprawn
+R:680:0xA7:0x9E
+
+# Chaos elemental
+R:681:0xC3:0xB4
+
+# Confusion elemental
+R:682:0xC3:0xB3
+
+# Large blue snake
+R:683:0xC2:0xA8
+
+# Large silver snake
+R:684:0xC2:0xA9
+
+# Large purple snake
+R:685:0xC2:0xAA
+
+# Judge Death
+R:686:0xBC:0x99
+
+# Ariel, Queen of Air
+R:687:0x9F:0x91
+
+# 11-headed hydra
+R:688:0xA2:0x9A
+
+# Patriarch
+R:689:0xAB:0x9A
+
+# Dreadmaster
+R:690:0xA0:0x85
+
+# Drolem
+R:691:0xA7:0x92
+
+# Scatha the Worm
+R:692:0xAD:0x9B
+
+# Warrior of the Dawn
+R:693:0xB2:0x9E
+
+# Lesser black reaver
+R:694:0xA4:0x87
+
+# Large red snake
+R:695:0xC2:0xAB
+
+# Grand master thief
+R:696:0xC2:0x8A
+
+# Smaug the Golden
+R:697:0x9E:0x93
+
+# The Stormbringer
+R:698:0xB3:0x80
+
+# Knight Templar
+R:699:0xB3:0x81
+
+# Large eel
+R:700:0xC2:0xAC
+
+# Dracolich
+R:701:0x9E:0x95
+
+# Greater titan
+R:702:0xA1:0x98
+
+# Dracolisk
+R:703:0x9E:0x94
+
+# Winged Horror
+R:704:0xC4:0x9E
+
+# Killer gray beetle
+R:705:0xC2:0xA1
+
+# Killer orange beetle
+R:706:0xC2:0xA2
+
+# Killer blue beetle
+R:707:0xC2:0xA3
+
+# Ent
+R:708:0xBC:0x86
+
+# Rock giant
+R:709:0xBC:0x9D
+
+# Itangast the Fire Drake
+R:710:0x9E:0x96
+
+# Death mold
+R:711:0xA9:0x87
+
+# Killer silver beetle
+R:712:0xC2:0xA4
+
+# Killer green beetle
+R:713:0xC2:0xA5
+
+# Quickbeam, the Ent
+R:714:0xBC:0x9F
+
+# Glaurung, Father of the Dragons
+R:715:0xAD:0x9A
+
+# Behemoth
+R:716:0xBD:0x80
+
+# Killer aquatic beetle
+R:717:0xC2:0xA6
+
+# Greater wall monster
+R:718:0xB3:0x84
+
+# Menelrog
+R:719:0xAD:0x91
+
+# Mornungol
+R:720:0xAD:0x95
+
+# Killer tree beetle
+R:721:0xC2:0xA7
+
+# Nightwing
+R:722:0xAD:0x9D
+
+# 6-headed hydra
+R:723:0xC3:0xB9
+
+# Nether hound
+R:724:0xA5:0x81
+
+# Time hound
+R:725:0xA5:0x82
+
+# Plasma hound
+R:726:0xA5:0x83
+
+# Demonic quylthulg
+R:727:0xA1:0x9D
+
+# Great Storm Worm
+R:728:0x9E:0x97
+
+# Ulik the Troll
+R:729:0xBD:0x81
+
+# 8-headed hydra
+R:730:0xC3:0xBA
+
+# Oathbreaker
+R:731:0xBD:0x82
+
+# 10-headed hydra
+R:732:0xC3:0xBB
+
+# 12-headed hydra
+R:733:0xC3:0xBC
+
+# 13-headed hydra
+R:734:0xC3:0xBD
+
+# 14-headed hydra
+R:735:0xC3:0xBE
+
+# 15-headed hydra
+R:736:0xC3:0xBF
+
+# Killer hydra
+R:737:0xC2:0xA0
+
+# Old Sorcerer
+R:738:0x9C:0x8A
+
+# Ethereal hound
+R:739:0xB3:0x8A
+
+# Lesser kraken
+R:740:0xBD:0x83
+
+# Great Ice Worm
+R:741:0x9E:0x98
+
+# Demilich
+R:742:0xA4:0x8A
+
+# The Phoenix
+R:743:0x9D:0x98
+
+# Nightcrawler
+R:744:0xA4:0x8C
+
+# Forest ogre
+R:745:0xC3:0xB8
+
+# Rebel ogre
+R:746:0xA1:0x8B
+
+# Rebel giant
+R:747:0xA1:0x91
+
+# Hand druj
+R:748:0xAC:0x8E
+
+# Eye druj
+R:749:0xAC:0x8F
+
+# Skull druj
+R:750:0xAC:0x90
+
+# Chaos vortex
+R:751:0xAC:0x9B
+
+# Aether vortex
+R:752:0xAC:0x9C
+
+# Spider quylthulg
+R:753:0xC3:0xB5
+
+# Canine quylthulg
+R:754:0xC3:0xB6
+
+# Thuringwethil, the Vampire Messenger
+R:755:0xA3:0x9D
+
+# Great Worm of Fire
+R:756:0x9E:0x99
+
+# Aquatic quylthulg
+R:757:0xC3:0xB7
+
+# Adventurer quylthulg
+R:758:0xA1:0x9A
+
+# Draconic quylthulg
+R:759:0xA1:0x9E
+
+# White hulk
+R:760:0xC4:0xA0
+
+# Death hulk
+R:761:0xC4:0xA1
+
+# Fundin Bluecloak
+R:762:0xBE:0x91
+
+# Black Balrog
+R:763:0xC0:0xA9
+
+# Orange hulk
+R:764:0xC4:0xA2
+
+# Fire hulk
+R:765:0xC4:0xA3
+
+# Ancalagon the Black
+R:766:0x9E:0x9A
+
+# Forest hulk
+R:767:0xC4:0xA4
+
+# Nightwalker
+R:768:0xBD:0x85
+
+# Night hulk
+R:769:0xC4:0xA5
+
+# Silver hulk
+R:770:0xC4:0xA6
+
+# Saruman of Many Colours
+R:771:0xAB:0x9E
+
+# Harowen the Black Hand
+R:772:0xBE:0x94
+
+# Blue Balrog
+R:773:0xC0:0xAB
+
+# Dreadlord
+R:774:0xA0:0x86
+
+# Greater kraken
+R:775:0xBD:0x86
+
+# Archlich
+R:776:0xA4:0x8D
+
+# Tevildo, Prince of Cats
+R:777:0xB3:0x8F
+
+# Jabberwock
+R:778:0xC5:0x82
+
+# Chaos hound
+R:779:0xA5:0x85
+
+# Chaos hulk
+R:780:0xC4:0xA7
+
+# Beholder hive-mother
+R:781:0xBE:0x96
+
+# Leviathan
+R:782:0xBD:0x87
+
+# Great Worm of Chaos
+R:783:0x9E:0x9B
+
+# Great Worm of Law
+R:784:0x9E:0x9C
+
+# Great Worm of Balance
+R:785:0x9E:0x9D
+
+# Yellow hulk
+R:786:0xC4:0xA8
+
+# White Balrog
+R:787:0xC0:0xAA
+
+# Red hulk
+R:788:0xC4:0xA9
+
+# Trone, the Rebel Thunderlord
+R:789:0x08:0x42
+
+# Great Worm of Many Colours
+R:790:0xB3:0x93
+
+# Marda, rider of gold Laronth
+R:791:0xB3:0x94
+
+# Tselakus, the Dreadlord
+R:792:0xA0:0x87
+
+# Sky Drake
+R:793:0xB3:0x95
+
+# Eilinel the Entrapped
+R:794:0xA0:0x83
+
+# Dagorrog
+R:795:0xC5:0x84
+
+# Green hulk
+R:796:0xC4:0xAA
+
+# Blue hulk
+R:797:0xC4:0xAB
+
+# Black reaver
+R:798:0xA1:0x85
+
+# Master mindcrafter
+R:799:0xAB:0x9F
+
+# Greater demonic quylthulg
+R:800:0xA1:0x9F
+
+# Greater draconic quylthulg
+R:801:0xA2:0x80
+
+# Greater rotting quylthulg
+R:802:0xA2:0x81
+
+# Invisible Horror
+R:803:0xBC:0x88
+
+# Feagwath, the Undead Sorcerer
+R:804:0xA1:0x86
+
+# Silver wraith
+R:805:0xA3:0x9F
+
+# Adventurer wraith
+R:806:0xA4:0x81
+
+# Balrog Captain
+R:807:0xC0:0xAC
+
+# Ungoliant, the Unlight
+R:808:0xA3:0x88
+
+# Vampire orc
+R:809:0xC0:0xA0
+
+# Vampire yeek
+R:810:0xC0:0xA1
+
+# Aether hound
+R:811:0xA5:0x86
+
+# Greater Balrog
+R:812:0xC0:0xAD
+
+# Vampire ogre
+R:813:0xC0:0xA2
+
+# Vampire troll
+R:814:0xC0:0xA3
+
+# Vampire dwarf
+R:815:0xC0:0xA4
+
+# Vampire elf
+R:816:0xC0:0xA5
+
+# Vampire gnome
+R:817:0xC0:0xA6
+
+# The Mouth of Sauron
+R:818:0xBE:0x9E
+
+# The Necromancer of Dol Guldur
+R:819:0xB3:0x9E
+
+# Lisa, rider of gold Romth
+R:820:0xB3:0x9F
+
+# Master quylthulg
+R:821:0xA2:0x82
+
+# Qlzqqlzuup, the Lord of Flesh
+R:822:0xA2:0x83
+
+# Vampire adventurer
+R:823:0xA3:0x9A
+
+# Flare, rider of bronze Moonth
+R:824:0xB4:0x80
+
+# Maeglin, the Traitor of Gondolin
+R:825:0xA4:0x8E
+
+# Snow-frog
+R:826:0xC1:0xBE
+
+# Swamp lizard
+R:827:0xC1:0xBD
+
+# Giant silver frog
+R:828:0xC1:0xBE
+
+# Greater Hellhound
+R:829:0x9E:0x83
+
+# Cantoras, the Skeletal Lord
+R:830:0xAC:0x91
+
+# Blue lizard
+R:831:0xC1:0xBF
+
+# Death dragonfly
+R:832:0xC1:0xB3
+
+# Giant swamp dragonfly
+R:833:0xC1:0xB4
+
+# Giant red dragonfly
+R:834:0xC1:0xB5
+
+# Giant forest dragonfly
+R:835:0xC1:0xB6
+
+# Giant blue dragonfly
+R:836:0xC1:0xB7
+
+# Giant brown dragonfly
+R:837:0xC1:0xB8
+
+# The Tarrasque
+R:838:0xBC:0x93
+
+# Lungorthin, the Balrog of White Fire
+R:839:0xBF:0x86
+
+# Draugluin, Sire of All Werewolves
+R:840:0xBF:0x87
+
+# Giant silver dragonfly
+R:841:0xC1:0xB9
+
+# Giant violet dragonfly
+R:842:0xC1:0xBA
+
+# Giant pink dragonfly
+R:843:0xC1:0xBB
+
+# Vecna, the Emperor Lich
+R:844:0xB4:0x85
+
+# Aquatic dragonfly
+R:845:0xC1:0xBC
+
+# Giant red mouse
+R:846:0xC1:0xB0
+
+# Great Wyrm of Power
+R:847:0xB4:0x87
+
+# Giant blue mouse
+R:848:0xC1:0xB1
+
+# Giant yellow mouse
+R:849:0xC1:0xB2
+
+# Carcharoth, the Jaws of Thirst
+R:850:0x9E:0x86
+
+# Giant pink rat
+R:851:0xC1:0xAE
+
+# Giant tree rat
+R:852:0xC1:0xAF
+
+# Huan, Wolfhound of the Valar
+R:853:0x9E:0x87
+
+# Polar bear
+R:854:0xC1:0xA8
+
+# Blue bear
+R:855:0xC1:0xA9
+
+# Gothmog, the High Captain of Balrogs
+R:856:0xAD:0x98
+
+# Old bear
+R:857:0xC1:0xAA
+
+# Sarko, rider of gold Foronth
+R:858:0xB4:0x8C
+
+# Teddy bear
+R:859:0xC1:0xAB
+
+# Sauron, the Sorcerer
+R:860:0xAC:0x80
+
+# DarkGod, the Mighty Coder of Hell
+R:861:0xC0:0x9D
+
+# Morgoth, Lord of Darkness
+R:862:0xB4:0x8E
+
+# Human Warrior
+R:863:0xB5:0x80
+
+# Elven archer
+R:864:0xB5:0x81
+
+# Dwarven warrior
+R:865:0xB5:0x82
+
+# Elite uruk
+R:866:0xB5:0x83
+
+# Fire bear
+R:867:0xC1:0xAC
+
+# The Variant Maintainer
+R:868:0xBC:0x8B
+
+# Random Number Generator
+R:869:0xBC:0x8A
+
+# Rocket mine
+R:870:0xBD:0x88
+
+# Bouncing mine
+R:871:0xBD:0x89
+
+# Durin's Bane
+R:872:0xBF:0x89
+
+# Aquatic bear
+R:873:0xC1:0xAD
+
+# Rot jelly
+R:874:0xBD:0x8A
+
+# Death
+R:875:0xBD:0x8B
+
+# Famine
+R:876:0xBD:0x8D
+
+# Pestilence
+R:877:0xBD:0x8C
+
+# War
+R:878:0xBD:0x8E
+
+# Pike
+R:879:0xBD:0x8F
+
+# Electric eel
+R:880:0xBD:0x90
+
+# Giant crayfish
+R:881:0xBD:0x91
+
+# Mermaid
+R:882:0xBD:0x92
+
+# Box jellyfish
+R:883:0xBA:0x81
+
+# Giant piranha
+R:884:0xB6:0x9D
+
+# Piranha
+R:885:0xB6:0x9D
+
+# Swamp naga
+R:886:0xC1:0xA2
+
+# Ocean naga
+R:887:0xC1:0xA3
+
+# Snail
+R:888:0xBE:0xBE
+
+# Whale
+R:889:0xBA:0x98
+
+# Sand mite
+R:890:0xBD:0x98
+
+# Octopus
+R:891:0xBD:0x99
+
+# Giant octopus
+R:892:0xBD:0x9A
+
+# Eye of the deep
+R:893:0xBD:0x9B
+
+# Murk dweller
+R:894:0xBF:0x8B
+
+# Drowned soul
+R:895:0xBF:0x8C
+
+# Tiger shark
+R:896:0xBF:0x8D
+
+# Hammerhead shark
+R:897:0xBA:0x90
+
+# Great white shark
+R:898:0xBB:0x82
+
+# Aquatic golem
+R:899:0xBF:0x8E
+
+# Brown naga
+R:900:0xC1:0xA4
+
+# White shark
+R:901:0xBB:0x82
+
+# Scrag
+R:902:0xBF:0x91
+
+# Jaws
+R:903:0xBB:0x8C
+
+# Silver naga
+R:904:0xC1:0xA5
+
+# Aquatic elven warrior
+R:905:0xBF:0x94
+
+# Aquatic elven mage
+R:906:0xBF:0x95
+
+# Stargazer
+R:907:0xBF:0x96
+
+# Elder stargazer
+R:908:0xBF:0x97
+
+# Flounder
+R:909:0xBF:0x98
+
+# Giant turtle
+R:910:0xBF:0x99
+
+# Hatchling dragon turtle
+R:911:0xBF:0x9A
+
+# Young dragon turtle
+R:912:0xBF:0x9B
+
+# Mature dragon turtle
+R:913:0xBF:0x9C
+
+# Ancient dragon turtle
+R:914:0xBF:0x9D
+
+# Fastitocalon
+R:915:0xBF:0x9E
+
+# Undead stargazer
+R:916:0xBF:0x9F
+
+# Killer whale
+R:917:0xB9:0x9C
+
+# Merrow
+R:918:0xC5:0x85
+
+# Water naga
+R:919:0xC0:0x81
+
+# Night naga
+R:920:0xC1:0xA6
+
+# Tree naga
+R:921:0xC1:0xA7
+
+# Moby Dick, the White Whale
+R:922:0xC0:0x80
+
+# Aquatic hound
+R:923:0xC0:0x85
+
+# Gaurrog
+R:924:0xC0:0x86
+
+# Adventurer naga
+R:925:0xA9:0x88
+
+# White mold
+R:926:0xC2:0xBD
+
+# Silver mold
+R:927:0xC2:0xBE
+
+# Mathilde
+R:928:0xBD:0x9C
+
+# Child spirit
+R:929:0xBD:0x9D
+
+# Young spirit
+R:930:0xBD:0x9E
+
+# Mature spirit
+R:931:0xBD:0x9F
+
+# Experienced spirit
+R:932:0xBE:0x80
+
+# Wise spirit
+R:933:0xBE:0x81
+
+# Fangorn the Treebeard, Lord of the Ents
+R:934:0xC0:0x8A
+
+# Gandalf the Grey
+R:935:0xC0:0x8B
+
+# Nar, the Dwarf
+R:936:0xC0:0x8C
+
+# Apprentice mindcrafter
+R:937:0xAA:0x9A
+
+# Great Swamp Worm
+R:938:0xC5:0x86
+
+# Great Bile Worm
+R:939:0xC5:0x87
+
+# Blue Firebird
+R:940:0xBE:0x82
+
+# Green Firebird
+R:941:0xBE:0x83
+
+# Brown Firebird
+R:942:0xBE:0x84
+
+# Bronze Firebird
+R:943:0xBE:0x85
+
+# Gold Firebird
+R:944:0xBE:0x86
+
+# High-elven ranger
+R:945:0xBE:0x87
+
+# Uvatha the Horseman
+R:946:0xC0:0x90
+
+# Adunaphel the Quiet
+R:947:0xC0:0x91
+
+# Akhorahil the Blind
+R:948:0xC0:0x92
+
+# Ren the Unclean
+R:949:0xC0:0x93
+
+# Ji Indur Dawndeath
+R:950:0xC0:0x94
+
+# Dwar, Dog Lord of Waw
+R:951:0xC0:0x95
+
+# Hoarmurath of Dir
+R:952:0xC0:0x96
+
+# Khamul, the Black Easterling
+R:953:0xC0:0x97
+
+# The Witch-King of Angmar
+R:954:0xC0:0x98
+
+# Green Thunderlord
+R:955:0xB3:0x96
+
+# Blue Thunderlord
+R:956:0xB3:0x8E
+
+# Brown Thunderlord
+R:957:0xB3:0x98
+
+# Bronze Thunderlord
+R:958:0xB3:0x98
+
+# Gold Thunderlord
+R:959:0xB3:0x94
+
+# Blood Sprout
+R:960:0xBE:0x88
+
+# Gorlim the Unhappy
+R:961:0xC0:0x99
+
+# Pink mold
+R:962:0xC2:0xBF
+
+# Aranea
+R:963:0xC1:0x9A
+
+# Elder aranea
+R:964:0xC0:0x9A
+
+# Giant brown tick
+R:965:0xC5:0x88
+
+# Wavelord
+R:966:0xC0:0x9C
+
+# Novice possessor (soul)
+R:967:0xC4:0x86
+
+# Bat of Gorgoroth
+R:968:0xC5:0x97
+
+# The Princess
+R:969:0xC5:0x98
+
+# Merton Proudfoot, the lost hobbit
+R:970:0xC5:0x99
+
+# The Wight-King of the Barrow-downs
+R:971:0xA4:0x81
+
+# Adventurer
+R:972:0xC5:0x9B
+
+# Experienced possessor (soul)
+R:973:0xC5:0x9C
+
+# Old possessor (soul)
+R:974:0xC5:0x9D
+
+# Tree mold
+R:975:0xC1:0xA0
+
+# Bronze dragon worm
+R:976:0xC6:0x80
+
+# Gold dragon worm
+R:977:0xC5:0x9F
+
+# Defenceless Mold
+R:978:0xBC:0x89
+
+# Blue mold
+R:979:0xC1:0xA1
+
+# Ar-Pharazon the Golden
+R:980:0xC0:0x9E
+
+# Doppleganger
+R:981:0x97:0x8C
+
+# Marylene, Heartbreakeress of the Netherworld
+R:982:0xC1:0x8D
+
+# Adventurer mold
+R:983:0xA9:0x81
+
+# Gnome paladin
+R:984:0xC2:0xB7
+
+# Bandobras Took
+R:985:0xA7:0x9B
+
+# 3-headed hydra
+R:986:0xA2:0x94
+
+# Uldor the Accursed
+R:987:0xAB:0x95
+
+# Mystic
+R:988:0xAB:0x9B
+
+# Elder vampire
+R:989:0xA1:0x99
+
+# Ulfang the Black
+R:990:0xAA:0x96
+
+# Demonologist
+R:991:0xA8:0x82
+
+# Ungorrog
+R:992:0xA2:0x9C
+
+# Faunungol
+R:993:0xA2:0x8E
+
+# Naurungol
+R:994:0xC2:0x8E
+
+# Sererrog
+R:995:0xC2:0x8F
+
+# Red Balrog
+R:996:0xC0:0xA8
+
+# Master mystic
+R:997:0xAA:0x94
+
+# Grand master mystic
+R:998:0xAB:0x9D
+
+# Morgulrog
+R:999:0xA0:0x84
+
+# Novice mindcrafter
+R:1000:0xAA:0x9A
+
+# Gnome lord
+R:1001:0xC2:0xB8
+
+# Great Worm of Perplexity
+R:1002:0xC2:0x92
+
+# Gnome mystic
+R:1003:0xC2:0xBA
+
+# Great Worm of Thunder
+R:1004:0xC5:0x8A
+
+# Silver mouse
+R:1005:0xC5:0x8B
+
+# The Rat King
+R:1006:0xC2:0x96
+
+# Gnome priest
+R:1007:0xC2:0xB9
+
+# Black midge
+R:1008:0xC2:0x98
+
+# Fire Phantom
+R:1009:0xC2:0x99
+
+# The Insane Player
+R:1010:0x92:0x81
+
+# Gnome rogue
+R:1011:0xC2:0xBB
+
+# Vermicious Knid
+R:1012:0xC2:0x9B
+
+# Bone golem
+R:1013:0xC2:0x9C
+
+# Gnome warrior
+R:1014:0xC2:0xBC
+
+# Bronze golem
+R:1015:0xC5:0x8C
+
+# Wizard leprawn
+R:1016:0xC2:0xB5
+
+# Kender
+R:1017:0xC2:0xB6
+
+# Adventurer gnome
+R:1018:0xC2:0xBC
+
+# Tree cat
+R:1019:0xC2:0xB1
+
+# Night cat
+R:1020:0xC2:0xB2
+
+# Leopard
+R:1021:0xC2:0xB3
+
+# Cheshire cat
+R:1022:0xC2:0xB4
+
+# Blue dragon worm
+R:1023:0xC3:0x8E
+
+# White dragon worm
+R:1024:0xC3:0x8F
+
+# Green dragon worm
+R:1025:0xC3:0x92
+
+# Black dragon worm
+R:1026:0xC3:0x91
+
+# Red dragon worm
+R:1027:0xC3:0x90
+
+# Multi-hued dragon worm
+R:1028:0xC3:0x93
+
+# The Minotaur of the Labyrinth
+R:1029:0xC3:0x94
+
+# The Sandworm Queen
+R:1030:0xC3:0x9B
+
+# Sandworm
+R:1031:0xC3:0x9C
+
+# Tik'srvzllat
+R:1032:0xC3:0x9D
+
+# The Glass Golem
+R:1033:0xC5:0x8E
+
+# Elenwe the Lost
+R:1034:0xBE:0xBF
+
+# Golgarach, the Living Rock
+R:1035:0x80:0x84
+
+# Sanctimonious-looking preacher
+R:1036:0xC2:0xAD
+
+# Weary-looking traveller
+R:1037:0xC2:0xAE
+
+# Water hound
+R:1038:0xC6:0x88
+
+# Improv, the mighty MoLD
+R:1039:0xC6:0x8E
+
+# Emperor mimic
+R:1040:0xC6:0x9C
+
+# Melinda Proudfoot
+R:1041:0x88:0xAA
+
+# Thrain, the King Under the Mountain
+R:1042:0x88:0xAB
+
+# Fire golem
+R:1043:0x8C:0xA0
+
+# Melkor, Lord of Darkness
+R:1044:0x8C:0xA1
+
+# Spirit
+R:1045:0x92:0x9F
+
+# Spirit
+R:1046:0x92:0xA0
+
+# Spirit
+R:1047:0x92:0xA1
+
+# Spirit
+R:1048:0x92:0xA2
+
+# Spirit
+R:1049:0x92:0xA3
+
+# Spirit
+R:1050:0x92:0xA4
+
+# Spirit
+R:1051:0x92:0xA5
+
+# Spirit
+R:1052:0x92:0xA6
+
+# Spirit
+R:1053:0x92:0xA7
+
+# Spirit
+R:1054:0x92:0xA8
+
+# Spirit
+R:1055:0x92:0xA9
+
+# Spirit
+R:1056:0x92:0xAA
+
+# Spirit
+R:1057:0x92:0xA3
+
+# Spirit
+R:1058:0x92:0xAB
+
+# Spirit
+R:1059:0x92:0xAC
+
+# Spirit
+R:1060:0x92:0xAD
+
+# Spirit
+R:1061:0x92:0xAE
+
+# Spirit
+R:1062:0x92:0xAF
+
+# Spirit
+R:1063:0x92:0xB0
+
+# Spirit
+R:1064:0x92:0xB1
+
+# Spirit
+R:1065:0x92:0xB2
+
+# Spirit
+R:1066:0x92:0xB3
+
+# Spirit
+R:1067:0x92:0xB4
+
+# Spirit
+R:1068:0x92:0xB5
+
+# Spirit
+R:1069:0x92:0xB6
+
+# Spirit
+R:1070:0x92:0xB7
+
+# Spirit
+R:1071:0x92:0xB8
+
+# Spirit
+R:1072:0x92:0xB9
+
+# Spirit
+R:1073:0x92:0xBA
+
+# Spirit
+R:1074:0x92:0xBB
+
+# Spirit
+R:1075:0x92:0xBC
+
+# Neil, the Sorceror
+R:1076:0x0A:0x68
+
+# Swamp wight
+R:1077:0xC0:0xA7
+
+# Knight of the Swan
+R:1078:0xC2:0xAF
+
+# Spells (*)
+S:48:0x91/0x88
+S:49:0x91/0x89
+S:50:0x91/0x8A
+S:51:0x91/0x8B
+S:52:0x91/0x8C
+S:53:0x91/0x8D
+S:54:0x91/0x8E
+S:55:0x91/0x8F
+S:56:0x91/0x90
+S:57:0x91/0x91
+S:58:0x91/0x92
+S:59:0x91/0x93
+S:60:0x91/0x94
+S:61:0x91/0x95
+S:62:0x91/0x96
+S:63:0x91/0x97
+
+# Spells (|)
+S:64:0x8F/0x80
+S:65:0x8F/0x84
+S:66:0x8F/0x88
+S:67:0x8F/0x8C
+S:68:0x8F/0x90
+S:69:0x8F/0x94
+S:70:0x8F/0x98
+S:71:0x8F/0x9C
+S:72:0x90/0x80
+S:73:0x90/0x84
+S:74:0x90/0x88
+S:75:0x90/0x8C
+S:76:0x90/0x90
+S:77:0x90/0x94
+S:78:0x90/0x98
+S:79:0x90/0x9C
+
+# Spells (-)
+S:80:0x8F/0x81
+S:81:0x8F/0x85
+S:82:0x8F/0x89
+S:83:0x8F/0x8D
+S:84:0x8F/0x91
+S:85:0x8F/0x95
+S:86:0x8F/0x99
+S:87:0x8F/0x9D
+S:88:0x90/0x81
+S:89:0x90/0x85
+S:90:0x90/0x89
+S:91:0x90/0x8D
+S:92:0x90/0x91
+S:93:0x90/0x95
+S:94:0x90/0x99
+S:95:0x90/0x9D
+
+# Spells (/)
+S:96:0x8F/0x82
+S:97:0x8F/0x86
+S:98:0x8F/0x8A
+S:99:0x8F/0x8E
+S:100:0x8F/0x92
+S:101:0x8F/0x96
+S:102:0x8F/0x9A
+S:103:0x8F/0x9E
+S:104:0x90/0x82
+S:105:0x90/0x86
+S:106:0x90/0x8A
+S:107:0x90/0x8E
+S:108:0x90/0x92
+S:109:0x90/0x96
+S:110:0x90/0x9A
+S:111:0x90/0x9E
+
+# Spells (\)
+S:112:0x8F/0x83
+S:113:0x8F/0x87
+S:114:0x8F/0x8B
+S:115:0x8F/0x8F
+S:116:0x8F/0x93
+S:117:0x8F/0x97
+S:118:0x8F/0x9B
+S:119:0x8F/0x9F
+S:120:0x90/0x83
+S:121:0x90/0x87
+S:122:0x90/0x8B
+S:123:0x90/0x8F
+S:124:0x90/0x93
+S:125:0x90/0x97
+S:126:0x90/0x9B
+S:127:0x90/0x9F
+
+# Amulets (")
+S:128:0x87/0x87
+S:129:0x87/0x80
+S:130:0x87/0x88
+S:131:0x87/0x82
+S:132:0x87/0x83
+S:133:0x87/0x84
+S:134:0x87/0x85
+S:135:0x87/0x86
+S:136:0x87/0x81
+S:137:0x87/0x81
+S:138:0x87/0x89
+S:139:0x87/0x8A
+S:140:0x87/0x8B
+S:141:0x87/0x8C
+S:142:0x87/0x8D
+S:143:0x87/0x8E
+
+# Rings (=)
+S:144:0x84/0x87
+S:145:0x84/0x80
+S:146:0x84/0x88
+S:147:0x84/0x82
+S:148:0x84/0x83
+S:149:0x84/0x84
+S:150:0x84/0x85
+S:151:0x84/0x86
+S:152:0x84/0x81
+S:153:0x84/0x81
+S:154:0x84/0x89
+S:155:0x84/0x8A
+S:156:0x84/0x8B
+S:157:0x84/0x8C
+S:158:0x84/0x8D
+S:159:0x84/0x8E
+
+# Staffs (_)
+S:160:0x87/0x96
+S:161:0x87/0x95
+S:162:0x87/0x95
+S:163:0x87/0x92
+S:164:0x87/0x92
+S:165:0x87/0x93
+S:166:0x87/0x95
+S:167:0x87/0x90
+S:168:0x87/0x95
+S:169:0x87/0x95
+S:170:0x87/0x92
+S:171:0x87/0x94
+S:172:0x87/0x92
+S:173:0x87/0x93
+S:174:0x87/0x96
+S:175:0x87/0x90
+
+# Wands (-)
+S:176:0x86/0x97
+S:177:0x86/0x90
+S:178:0x86/0x98
+S:179:0x86/0x92
+S:180:0x86/0x93
+S:181:0x86/0x94
+S:182:0x86/0x95
+S:183:0x86/0x96
+S:184:0x86/0x91
+S:185:0x86/0x91
+S:186:0x86/0x99
+S:187:0x86/0x9A
+S:188:0x86/0x9B
+S:189:0x86/0x9C
+S:190:0x86/0x9D
+S:191:0x86/0x9E
+
+# Rods (-)
+S:192:0x86/0x87
+S:193:0x86/0x80
+S:194:0x86/0x88
+S:195:0x86/0x82
+S:196:0x86/0x83
+S:197:0x86/0x84
+S:198:0x86/0x85
+S:199:0x86/0x86
+S:200:0x86/0x81
+S:201:0x86/0x81
+S:202:0x86/0x89
+S:203:0x86/0x8A
+S:204:0x86/0x8B
+S:205:0x86/0x8C
+S:206:0x86/0x8D
+S:207:0x86/0x8E
+
+# Scrolls (?)
+S:208:0x83/0x9C
+S:209:0x83/0x9D
+S:210:0x83/0x9E
+S:211:0x83/0x9F
+S:212:0x83/0x9C
+S:213:0x83/0x9D
+S:214:0x83/0x9E
+S:215:0x83/0x9F
+S:216:0x83/0x9C
+S:217:0x83/0x9D
+S:218:0x83/0x9E
+S:219:0x83/0x9F
+S:220:0x83/0x9C
+S:221:0x83/0x9D
+S:222:0x83/0x9E
+S:223:0x83/0x9F
+
+# Potions (!)
+S:224:0x85/0x87
+S:225:0x85/0x80
+S:226:0x85/0x88
+S:227:0x85/0x82
+S:228:0x85/0x83
+S:229:0x85/0x84
+S:230:0x85/0x85
+S:231:0x85/0x86
+S:232:0x85/0x81
+S:233:0x85/0x81
+S:234:0x85/0x89
+S:235:0x85/0x8A
+S:236:0x85/0x8B
+S:237:0x85/0x8C
+S:238:0x85/0x8D
+S:239:0x85/0x8E
+
+# Food (,)
+S:240:0x85/0x97
+S:241:0x85/0x90
+S:242:0x85/0x98
+S:243:0x85/0x92
+S:244:0x85/0x93
+S:245:0x85/0x94
+S:246:0x85/0x95
+S:247:0x85/0x96
+S:248:0x85/0x91
+S:249:0x85/0x91
+S:250:0x85/0x99
+S:251:0x85/0x9A
+S:252:0x85/0x9B
+S:253:0x85/0x9C
+S:254:0x85/0x9D
+S:255:0x85/0x9E
+
+# Elven
+G:M:12:0x91/0xA1
+
+# Dwarven
+G:M:13:0x91/0xA0
+
+# Spirit
+R:1045:0x92/0x9F
+R:1046:0x92/0xA0
+R:1047:0x92/0xA1
+R:1048:0x92/0xA2
+R:1049:0x92/0xA3
+R:1050:0x92/0xA4
+R:1051:0x92/0xA5
+R:1052:0x92/0xA6
+R:1053:0x92/0xA7
+R:1054:0x92/0xA8
+R:1055:0x92/0xA9
+R:1056:0x92/0xAA
+R:1057:0x92/0xA3
+R:1058:0x92/0xAB
+R:1059:0x92/0xAC
+R:1060:0x92/0xAD
+R:1061:0x92/0xAE
+R:1062:0x92/0xAF
+R:1063:0x92/0xB0
+R:1064:0x92/0xB1
+R:1065:0x92/0xB2
+R:1066:0x92/0xB3
+R:1067:0x92/0xB4
+R:1068:0x92/0xB5
+R:1069:0x92/0xB6
+R:1070:0x92/0xB7
+R:1071:0x92/0xB8
+R:1072:0x92/0xB9
+R:1073:0x92/0xBA
+R:1074:0x92/0xBB
+R:1075:0x92/0xBC
+
+# & Spellbook~ of #
+K:757:0x91/0xA4
+
+# Weakness Trap
+#G:T:1:0xFF/0xFF
+#G:T:2:0xFF/0xFF
+#G:T:3:0xFF/0xFF
+
+# Intelligence Trap
+#G:T:4:0xFF/0xFF
+#G:T:5:0xFF/0xFF
+#G:T:6:0xFF/0xFF
+
+# Wisdom Trap
+#G:T:7:0xFF/0xFF
+#G:T:8:0xFF/0xFF
+#G:T:9:0xFF/0xFF
+
+# Fumbling Fingers Trap
+#G:T:10:0xFF/0xFF
+#G:T:11:0xFF/0xFF
+#G:T:12:0xFF/0xFF
+
+# Wasting Trap
+#G:T:13:0xFF/0xFF
+#G:T:14:0xFF/0xFF
+#G:T:15:0xFF/0xFF
+
+# Beauty Trap
+#G:T:16:0xFF/0xFF
+#G:T:17:0xFF/0xFF
+#G:T:18:0xFF/0xFF
+
+# Trap of Curse Weapon
+#G:T:20:0xFF/0xFF
+
+# Trap of Curse Armor
+#G:T:21:0xFF/0xFF
+
+# Earthquake Trap
+#G:T:22:0xFF/0xFF
+
+# Poison Needle Trap
+#G:T:23:0xFF/0xFF
+
+# Summon Monster Trap
+#G:T:24:0xFF/0xFF
+
+# Summon Undead Trap
+#G:T:25:0xFF/0xFF
+
+# Summon Greater Undead Trap
+#G:T:26:0xFF/0xFF
+
+# Teleport Trap
+#G:T:27:0xFF/0xFF
+
+# Paralyzing Trap
+#G:T:28:0xFF/0xFF
+
+# Explosive Device
+#G:T:29:0xFF/0xFF
+
+# Teleport Item Trap
+#G:T:30:0xFF/0xFF
+
+# Lose Memory Trap
+#G:T:31:0xFF/0xFF
+
+# Bitter Regret Trap
+#G:T:32:0xFF/0xFF
+
+# Bowel Cramps Trap
+#G:T:33:0xFF/0xFF
+
+# Blindness
+#G:T:34:0xFF/0xFF
+
+# Aggravation Trap
+#G:T:35:0xFF/0xFF
+
+# Multiplication Trap
+#G:T:36:0xFF/0xFF
+
+# Steal Item Trap
+#G:T:37:0xFF/0xFF
+
+# Summon Fast Quylthulgs Trap
+#G:T:38:0xFF/0xFF
+
+# Trap of Sinking
+#G:T:39:0xFF/0xFF
+
+# Trap of Mana Drain
+#G:T:40:0xFF/0xFF
+
+# Trap of Missing Money
+#G:T:41:0xFF/0xFF
+
+# Trap of No Return
+#G:T:42:0xFF/0xFF
+
+# Trap of Silent Switching
+#G:T:43:0xFF/0xFF
+
+# Trap of Walls
+#G:T:44:0xFF/0xFF
+
+# Trap of Calling Out
+#G:T:45:0xFF/0xFF
+
+# Trap of Sliding
+#G:T:46:0xFF/0xFF
+
+# Trap of Charges Drain
+#G:T:47:0xFF/0xFF
+
+# Trap of Stair Movement
+#G:T:48:0xFF/0xFF
+
+# Trap of New Trap
+#G:T:49:0xFF/0xFF
+
+# Trap of Scatter Items
+#G:T:50:0xFF/0xFF
+
+# Trap of Decay
+#G:T:51:0xFF/0xFF
+
+# Trap of Wasting Wands
+#G:T:52:0xFF/0xFF
+
+# Trap of Filling
+#G:T:53:0xFF/0xFF
+
+# Trap of Drain Speed
+#G:T:54:0xFF/0xFF
+
+# Lightning Bolt Trap
+#G:T:60:0xFF/0xFF
+
+# Poison Bolt Trap
+#G:T:61:0xFF/0xFF
+
+# Acid Bolt Trap
+#G:T:62:0xFF/0xFF
+
+# Cold Bolt Trap
+#G:T:63:0xFF/0xFF
+
+# Fire Bolt Trap
+#G:T:64:0xFF/0xFF
+
+# Plasma Bolt Trap
+#G:T:65:0xFF/0xFF
+
+# Water Bolt Trap
+#G:T:66:0xFF/0xFF
+
+# Lite Bolt Trap
+#G:T:67:0xFF/0xFF
+
+# Dark Bolt Trap
+#G:T:68:0xFF/0xFF
+
+# Shards Bolt Trap
+#G:T:69:0xFF/0xFF
+
+# Sound Bolt Trap
+#G:T:70:0xFF/0xFF
+
+# Confusion Bolt Trap
+#G:T:71:0xFF/0xFF
+
+# Force Bolt Trap
+#G:T:72:0xFF/0xFF
+
+# Inertia Bolt Trap
+#G:T:73:0xFF/0xFF
+
+# Mana Bolt Trap
+#G:T:74:0xFF/0xFF
+
+# Ice Bolt Trap
+#G:T:75:0xFF/0xFF
+
+# Chaos Bolt Trap
+#G:T:76:0xFF/0xFF
+
+# Nether Bolt Trap
+#G:T:77:0xFF/0xFF
+
+# Disenchantment Bolt Trap
+#G:T:78:0xFF/0xFF
+
+# Nexus Bolt Trap
+#G:T:79:0xFF/0xFF
+
+# Time Bolt Trap
+#G:T:80:0xFF/0xFF
+
+# Gravity Bolt Trap
+#G:T:81:0xFF/0xFF
+
+# Lightning Ball Trap
+#G:T:82:0xFF/0xFF
+
+# Poison Ball Trap
+#G:T:83:0xFF/0xFF
+
+# Acid Ball Trap
+#G:T:84:0xFF/0xFF
+
+# Cold Ball Trap
+#G:T:85:0xFF/0xFF
+
+# Fire Ball Trap
+#G:T:86:0xFF/0xFF
+
+# Plasma Ball Trap
+#G:T:87:0xFF/0xFF
+
+# Water Ball Trap
+#G:T:88:0xFF/0xFF
+
+# Light Ball Trap
+#G:T:89:0xFF/0xFF
+
+# Darkness Ball Trap
+#G:T:90:0xFF/0xFF
+
+# Shards Ball Trap
+#G:T:91:0xFF/0xFF
+
+# Sound Ball Trap
+#G:T:92:0xFF/0xFF
+
+# Confusion Ball Trap
+#G:T:93:0xFF/0xFF
+
+# Force Ball Trap
+#G:T:94:0xFF/0xFF
+
+# Mana Ball Trap
+#G:T:96:0xFF/0xFF
+
+# Ice Ball Trap
+#G:T:97:0xFF/0xFF
+
+# Chaos Ball Trap
+#G:T:98:0xFF/0xFF
+
+# Nether Ball Trap
+#G:T:99:0xFF/0xFF
+
+# Disenchantment Ball Trap
+#G:T:100:0xFF/0xFF
+
+# Nexus Ball Trap
+#G:T:101:0xFF/0xFF
+
+# Time Ball Trap
+#G:T:102:0xFF/0xFF
+
+# Gravity Ball Trap
+#G:T:103:0xFF/0xFF
+
+# Arrow Trap
+#G:T:110:0xFF/0xFF
+
+# Bolt Trap
+#G:T:111:0xFF/0xFF
+
+# Seeker Arrow Trap
+#G:T:112:0xFF/0xFF
+
+# Seeker Bolt Trap
+#G:T:113:0xFF/0xFF
+
+# Poison Arrow Trap
+#G:T:114:0xFF/0xFF
+
+# Poison Bolt Trap
+#G:T:115:0xFF/0xFF
+
+# Poison Seeker Arrow Trap
+#G:T:116:0xFF/0xFF
+
+# Poison Seeker Bolt Trap
+#G:T:117:0xFF/0xFF
+
+# Broken Dagger Trap
+#G:T:118:0xFF/0xFF
+
+# Dagger Trap
+#G:T:119:0xFF/0xFF
+
+# Poison Broken Dagger Trap
+#G:T:120:0xFF/0xFF
+
+# Poison Dagger Trap
+#G:T:121:0xFF/0xFF
+
+# Arrows Trap
+#G:T:122:0xFF/0xFF
+
+# Bolts Trap
+#G:T:123:0xFF/0xFF
+
+# Seeker Arrow Trap
+#G:T:124:0xFF/0xFF
+
+# Seeker Bolt Trap
+#G:T:125:0xFF/0xFF
+
+# Poison Arrows Trap
+#G:T:126:0xFF/0xFF
+
+# Poison Bolt Trap
+#G:T:127:0xFF/0xFF
+
+# Poison Seeker Arrows Trap
+#G:T:128:0xFF/0xFF
+
+# Poison Seeker Bolts Trap
+#G:T:129:0xFF/0xFF
+
+# Broken Daggers Trap
+#G:T:130:0xFF/0xFF
+
+# Dagger Trap
+#G:T:131:0xFF/0xFF
+
+# Poison Broken Daggers Trap
+#G:T:132:0xFF/0xFF
+
+# Poison Daggers Trap
+#G:T:133:0xFF/0xFF
+
+# Trap of Drop Item
+#G:T:140:0xFF/0xFF
+
+# Trap of Drop Items
+#G:T:141:0xFF/0xFF
+
+# Trap of Drop Everything
+#G:T:142:0xFF/0xFF
+
+# Trap of Femininity
+#G:T:150:0xFF/0xFF
+
+# Trap of Masculinity
+#G:T:151:0xFF/0xFF
+
+# Trap of Neutrality
+#G:T:152:0xFF/0xFF
+
+# Trap of Aging
+#G:T:153:0xFF/0xFF
+
+# Trap of Growing
+#G:T:154:0xFF/0xFF
+
+# Trap of Shrinking
+#G:T:155:0xFF/0xFF
+
+# Trap of Tanker Drain
+#G:T:157:0xFF/0xFF
+
+# Trap of Divine Anger
+#G:T:158:0xFF/0xFF
+
+# Trap of Divine Wrath
+#G:T:159:0xFF/0xFF
+
+# Hallucination Trap
+#G:T:160:0xFF/0xFF
+
+# Greater Magic Missile Trap
+#G:T:161:0xFF/0xFF
+
+# Foulness Trap
+#G:T:162:0xFF/0xFF
+
+# Trap of Holy Fire
+#G:T:164:0xFF/0xFF
+
+# Trap of Hell Fire
+#G:T:165:0xFF/0xFF
+
+# Psi Bolt Trap
+#G:T:166:0xFF/0xFF
+
+# Psi Drain Trap
+#G:T:167:0xFF/0xFF
+
+# Plasma Ball Trap
+#G:T:168:0xFF/0xFF
+
+# Psi Ball Trap
+#G:T:169:0xFF/0xFF
+
+# Acquirement Trap
+#G:T:170:0xFF/0xFF
+
+# Greater Lightning Bolt Trap
+#G:T:171:0xFF/0xFF
+
+# Greater Poison Bolt Trap
+#G:T:172:0xFF/0xFF
+
+# Greater Acid Bolt Trap
+#G:T:173:0xFF/0xFF
+
+# Greater Cold Bolt Trap
+#G:T:174:0xFF/0xFF
+
+# Greater Fire Bolt Trap
+#G:T:175:0xFF/0xFF
+# non-defines encountered :
+# Load the special player pictures
+%:xtra-new.prf
diff --git a/lib/mods/theme/pref/graf-sdl.prf b/lib/mods/theme/pref/graf-sdl.prf
new file mode 100644
index 00000000..818f876a
--- /dev/null
+++ b/lib/mods/theme/pref/graf-sdl.prf
@@ -0,0 +1,37 @@
+# File: graf-x11.prf
+
+
+# Font stuff
+%:font-x11.prf
+
+
+# Color palette - Graphics
+
+#V:16:0x01:0x00:0x00:0x00
+#V:17:0x01:0xF0:0xE0:0xD0
+#V:18:0x01:0x80:0x80:0x80
+#V:19:0x01:0x50:0x50:0x50
+#V:20:0x01:0xE0:0xB0:0x00
+#V:21:0x01:0xC0:0xA0:0x70
+#V:22:0x01:0x80:0x60:0x40
+#V:23:0x01:0x50:0x3C:0x28
+#V:24:0x01:0x00:0xA0:0xF0
+#V:25:0x01:0x00:0x00:0xF0
+#V:26:0x01:0x00:0x00:0x70
+#V:27:0x01:0xF0:0x00:0x00
+#V:28:0x01:0x80:0x00:0x00
+#V:29:0x01:0x90:0x00:0xB0
+#V:30:0x01:0x00:0x60:0x10
+#V:31:0x01:0x60:0xF0:0x40
+
+
+# Standard file
+?:[EQU $GRAF old]
+%:graf-xxx.prf
+
+# New tiles
+?:[EQU $GRAF new]
+%:graf-new.prf
+
+?:1
+
diff --git a/lib/mods/theme/pref/graf-win.prf b/lib/mods/theme/pref/graf-win.prf
new file mode 100644
index 00000000..f59edb35
--- /dev/null
+++ b/lib/mods/theme/pref/graf-win.prf
@@ -0,0 +1,16 @@
+# File: graf-win.prf
+
+#
+# This file defines special attr/char mappings for use in "graphics" mode
+#
+# See "lib/help/command.txt" and "src/files.c" for more information.
+#
+
+
+# Standard file
+?:[EQU $GRAF old]
+%:graf-xxx.prf
+
+# New tiles
+?:[EQU $GRAF new]
+%:graf-new.prf
diff --git a/lib/mods/theme/pref/graf-x11.prf b/lib/mods/theme/pref/graf-x11.prf
new file mode 100644
index 00000000..818f876a
--- /dev/null
+++ b/lib/mods/theme/pref/graf-x11.prf
@@ -0,0 +1,37 @@
+# File: graf-x11.prf
+
+
+# Font stuff
+%:font-x11.prf
+
+
+# Color palette - Graphics
+
+#V:16:0x01:0x00:0x00:0x00
+#V:17:0x01:0xF0:0xE0:0xD0
+#V:18:0x01:0x80:0x80:0x80
+#V:19:0x01:0x50:0x50:0x50
+#V:20:0x01:0xE0:0xB0:0x00
+#V:21:0x01:0xC0:0xA0:0x70
+#V:22:0x01:0x80:0x60:0x40
+#V:23:0x01:0x50:0x3C:0x28
+#V:24:0x01:0x00:0xA0:0xF0
+#V:25:0x01:0x00:0x00:0xF0
+#V:26:0x01:0x00:0x00:0x70
+#V:27:0x01:0xF0:0x00:0x00
+#V:28:0x01:0x80:0x00:0x00
+#V:29:0x01:0x90:0x00:0xB0
+#V:30:0x01:0x00:0x60:0x10
+#V:31:0x01:0x60:0xF0:0x40
+
+
+# Standard file
+?:[EQU $GRAF old]
+%:graf-xxx.prf
+
+# New tiles
+?:[EQU $GRAF new]
+%:graf-new.prf
+
+?:1
+
diff --git a/lib/mods/theme/pref/graf-xxx.prf b/lib/mods/theme/pref/graf-xxx.prf
new file mode 100644
index 00000000..8be9d6da
--- /dev/null
+++ b/lib/mods/theme/pref/graf-xxx.prf
@@ -0,0 +1,3267 @@
+# PRF file generated by Andreas Koch`s Tile Assigner
+# at 12:19:29 AM
+
+# 2185 items
+# 2185 probably mapped correctly
+# 0 imported but not yet defined
+# 0 defined to value(s) lower than 0x80
+# Old header :
+### Special attr:char values ###
+# # Unused (@)
+# S:0x00:0x00:0x40
+# S:0x01:0x01:0x40
+# S:0x02:0x02:0x40
+# S:0x03:0x03:0x40
+# S:0x04:0x04:0x40
+# S:0x05:0x05:0x40
+# S:0x06:0x06:0x40
+# S:0x07:0x07:0x40
+# S:0x08:0x08:0x40
+# S:0x09:0x09:0x40
+# S:0x0A:0x0A:0x40
+# S:0x0B:0x0B:0x40
+# S:0x0C:0x0C:0x40
+# S:0x0D:0x0D:0x40
+# S:0x0E:0x0E:0x40
+# S:0x0F:0x0F:0x40
+# # Unused (@)
+# S:0x10:0x00:0x40
+# S:0x11:0x01:0x40
+# S:0x12:0x02:0x40
+# S:0x13:0x03:0x40
+# S:0x14:0x04:0x40
+# S:0x15:0x05:0x40
+# S:0x16:0x06:0x40
+# S:0x17:0x07:0x40
+# S:0x18:0x08:0x40
+# S:0x19:0x09:0x40
+# S:0x1A:0x0A:0x40
+# S:0x1B:0x0B:0x40
+# S:0x1C:0x0C:0x40
+# S:0x1D:0x0D:0x40
+# S:0x1E:0x0E:0x40
+# S:0x1F:0x0F:0x40
+# # Unused (@)
+# S:0x20:0x00:0x40
+# S:0x21:0x01:0x40
+# S:0x22:0x02:0x40
+# S:0x23:0x03:0x40
+# S:0x24:0x04:0x40
+# S:0x25:0x05:0x40
+# S:0x26:0x06:0x40
+# S:0x27:0x07:0x40
+# S:0x28:0x08:0x40
+# S:0x29:0x09:0x40
+# S:0x2A:0x0A:0x40
+# S:0x2B:0x0B:0x40
+# S:0x2C:0x0C:0x40
+# S:0x2D:0x0D:0x40
+# S:0x2E:0x0E:0x40
+# S:0x2F:0x0F:0x40
+
+# General Store
+B:0:0x81/0x91
+
+# Armoury
+B:1:0x81/0x92
+
+# Weapon Smiths
+B:2:0x81/0x93
+
+# Temple
+B:3:0x81/0x94
+
+# Alchemy Shop
+B:4:0x81/0x95
+
+# Magic Shop
+B:5:0x81/0x96
+
+# Black Market
+B:6:0x81/0x97
+
+# Home
+B:7:0x81/0x98
+
+# Bookstore
+B:8:0x82/0x93
+
+# Pet Shop
+B:9:0xCB/0x96
+
+# Mayor's Office
+B:10:0xCB/0x92
+
+# Inn
+B:11:0xCB/0x95
+
+# The Soothsayer
+B:12:0xD4/0x85
+
+# Library
+B:13:0xD4/0x89
+
+# Castle
+B:14:0xCB/0x92
+
+# Casino
+B:15:0xD5/0x81
+
+# Beastmaster Shanty
+B:16:0xD3/0x8B
+
+# Fighters Hall
+B:17:0xD3/0x8C
+
+# Tower of Magery
+B:18:0xD4/0x8B
+
+# Inner Temple
+B:19:0xD4/0x9D
+
+# Paladins Guild
+B:20:0xCB/0x8F
+
+# Rangers Guild
+B:21:0xD3/0x83
+
+# Weyr
+B:22:0xCB/0x93
+
+# The Mirror
+B:23:0xD4/0x89
+
+# Seat of Ruling
+B:24:0xCB/0x92
+
+# Wizards Spire
+B:25:0xD4/0x8A
+
+# Priests Circle
+B:26:0xD4/0x92
+
+# Tower of the King
+B:27:0xCB/0x92
+
+# Library
+B:28:0xD4/0x89
+
+# The White Tree
+B:29:0xCB/0x95
+
+# Craftsmaster
+B:30:0xCB/0x97
+
+# Earth-Dome (Nature)
+B:31:0xCB/0x9A
+
+# Minstrels Haven
+B:32:0xD3/0x9F
+
+# Star-Dome
+B:33:0xD4/0x8C
+
+# Valarin Temple
+B:34:0xD4/0x90
+
+# Sea-Dome
+B:35:0xD4/0x91
+
+# The Golden Flower
+B:36:0xD3/0x83
+
+# The Fountain
+B:37:0xD4/0x9D
+
+# Axe Smith
+B:38:0xCC/0x96
+
+# Hafted Smith
+B:39:0xCC/0x97
+
+# Polearm Smith
+B:40:0xCC/0x98
+
+# Sword Smith
+B:41:0xCC/0x80
+
+# Rare Jewelry Shop
+B:42:0xD3/0x96
+
+# Jewelry Shop
+B:43:0xD3/0x93
+
+# Footwear Shop
+B:44:0xD3/0x9D
+
+# Rare Footwear Shop
+B:45:0xD3/0x9E
+
+# Library
+B:46:0xD3/0x9C
+
+# Forbidden Library
+B:47:0xD4/0x8F
+
+# Expensive Black Market
+B:48:0xD4/0x95
+
+# Common Shop
+B:49:0xD4/0x93
+
+# Dragon Hunter
+B:50:0xCC/0x89
+
+# Speed Ring Market
+B:51:0xD3/0x97
+
+# Scribe
+B:52:0xD4/0x86
+
+# Potion Store
+B:53:0xD4/0x80
+
+# Recaller
+B:54:0xD4/0x88
+
+# Master Archer
+B:55:0xD3/0x85
+
+# Merchants Guild
+B:56:0xD4/0x9B
+
+# The Mathom-house
+B:57:0xCB/0x9B
+
+# The Prancing Pony
+B:58:0xCB/0x95
+
+# Mining Supply store
+B:59:0xCB/0x97
+
+# Library quest in Minas Anor
+B:60:0xD3/0x9C
+
+# Hunting Supply Store
+B:61:0xD3/0x85
+
+# Runic Magic Shop
+B:62:0x81/0x96
+
+# Construction Supply Store
+B:63:0xCB/0x97
+
+# Music Store
+B:64:0xD3/0x9F
+
+# Magic Rod Market
+B:65:0x81/0x96
+
+# Map store
+B:66:0xD3/0x9C
+
+# Farm
+B:67:0xD4/0x93
+
+#Pelargir inn - The Grey Swan
+B:68:0xCB/0x95
+
+#Caras Galadhon inn - The Garden
+B:69:0xCB/0x95
+
+#Khazad Dum inn - The Mithril Lode
+B:70:0xCB/0x95
+
+#Dale inn - The Builder Barracks
+B:71:0xCB/0x95
+
+#Edoras inn - The Horse and Ox
+B:72:0xCB/0x95
+
+#Esgaroth inn - The Dancing Dragon
+B:73:0xCB/0x95
+
+#Hobbiton inn - The Green Dragon
+B:74:0xCB/0x95
+
+#Osgiliath inn - The Twinkling Star
+B:75:0xCB/0x95
+
+#The House of Beorn
+B:76:0xCB/0x92
+
+#Bard's Hut
+B:77:0xCB/0x92
+
+#The Ranger Conclave
+B:78:0xCB/0x92
+
+#Imladris
+B:79:0xCB/0x92
+
+#The Hornburg
+B:80:0xCB/0x92
+
+#Thranduil's Hall
+B:81:0xCB/0x92
+
+#Meduseld
+B:82:0xCB/0x92
+
+#The Master's House
+B:83:0xCB/0x92
+
+#Bag End
+B:84:0xCB/0x92
+
+#The Castle of Stars
+B:85:0xCB/0x92
+
+#The Prince's Tower
+B:86:0xCB/0x92
+
+#The Seat of Durin
+B:87:0xCB/0x92
+
+### The forge in Imladris
+B:88:0xCB/0x97
+
+# nothing
+F:0:0x81/0x80
+
+# open floor
+F:1:0x80/0x80
+
+# fountain - wet
+F:2:0xD1/0x83
+
+# glyph of warding
+F:3:0xA2/0x88
+
+# open door
+F:4:0x81/0x87
+
+# broken door
+F:5:0x81/0x87
+
+# up staircase
+F:6:0x81/0x9C
+
+# down staircase
+F:7:0x81/0x9E
+
+# quest entrance
+F:8:0x82/0x8E
+
+# quest exit
+F:9:0x82/0x8B
+
+# quest down level
+F:10:0x82/0x8F
+
+# quest up level
+F:11:0x82/0x8C
+
+# town exit
+F:12:0x82/0x91
+
+# shaft down
+F:13:0x82/0x90
+
+# shaft up
+F:14:0x82/0x8D
+
+# fountain
+F:15:0xD1/0x82
+
+# web
+F:16:0x82/0x92
+
+# Open pit
+F:17:0xA2/0x96
+
+# Spiked Pit
+F:18:0xA2/0x96
+
+# Poison Pit
+F:19:0xA2/0x96
+
+# Summon Rune
+F:20:0x8A/0x9C
+
+# Teleport Rune
+F:21:0x8A/0x9C
+
+# Fire spot
+F:22:0x8A/0x9B
+
+# Acid spot
+F:23:0x8A/0x9B
+
+# Slow dart trap
+F:24:0x82/0x9E
+
+# Lose str dart
+F:25:0xA2/0x89
+
+# Lose dex dart
+F:26:0xA2/0x8D
+
+# Lose con dart
+F:27:0xA2/0x92
+
+# gas trap - blind
+F:28:0xA2/0x8E
+
+# gas trap - confuse
+F:29:0xA2/0x8F
+
+# gas trap - poison
+F:30:0xA2/0x90
+
+# gas trap - sleep
+F:31:0xA2/0x91
+
+# door
+F:32:0x81/0x8B
+
+# locked door
+F:33:0x81/0x8B
+F:34:0x81/0x8B
+F:35:0x81/0x8B
+F:36:0x81/0x8B
+F:37:0x81/0x8B
+F:38:0x81/0x8B
+F:39:0x81/0x8B
+
+# jammed door
+F:40:0x81/0x8B
+F:41:0x81/0x8B
+F:42:0x81/0x8B
+F:43:0x81/0x8B
+F:44:0x81/0x8B
+F:45:0x81/0x8B
+F:46:0x81/0x8B
+F:47:0x81/0x8B
+
+# secret door
+F:48:0x80/0x82
+
+# pile of rubble
+F:49:0x81/0x9A
+
+# magma vein
+F:50:0x81/0x83
+
+# quartz vein
+F:51:0x80/0x83
+
+# magma vein
+F:52:0x81/0x83
+
+# quartz vein
+F:53:0x80/0x83
+
+# magma vein with treasure
+F:54:0x80/0x84
+
+# quartz vein with treasure
+F:55:0x80/0x84
+
+# granite wall
+F:56:0x80/0x82
+F:57:0x80/0x82
+F:58:0x80/0x82
+F:59:0x80/0x82
+
+# permanent wall
+F:60:0x80/0x95
+F:61:0x80/0x95
+F:62:0x80/0x95
+F:63:0x80/0x95
+
+# explosive rune
+F:64:0xA2/0x87
+
+# Straight Road startpoint
+F:65:0xA3/0x9D
+
+# section of the Straight Road
+F:66:0xA3/0x97
+F:67:0xA3/0x9C
+F:68:0xA3/0x9B
+F:69:0xA3/0x9A
+F:70:0xA3/0x98
+
+# section of the Straight Road (discharged)
+F:71:0xA3/0x98
+
+# Straight Road exit
+F:72:0xA3/0x9D
+
+# corrupted section of the Straight Road
+F:73:0xA3/0x99
+
+# Building
+F:74:0x81/0x91
+
+# permanent wall
+F:75:0x80/0x95
+F:76:0x80/0x95
+F:77:0x80/0x95
+F:78:0x80/0x95
+
+# grass with Elanor flowers
+F:79:0x82:0x95
+
+# grass with Fumella flowers
+F:80:0x82:0x96
+
+# grass with anemones
+F:81:0x82:0x97
+
+# grass with Niphredil flowers
+F:82:0x82:0x98
+
+# grass with irises
+F:83:0x82:0x99
+
+# stream of shallow water
+F:84:0xD2/0x81
+
+# pool of deep lava
+F:85:0xCB/0x89
+
+# stream of shallow lava
+F:86:0xCB/0x88
+
+# dark pit
+F:87:0x81/0x80
+
+# dirt
+F:88:0xCB/0x84
+
+# patch of grass
+F:89:0xD0/0x8E
+
+# ice
+F:90:0xCF/0x81
+
+# sand
+F:91:0xCF/0x8E
+
+# dead tree
+F:92:0xCF/0x85
+
+# ash
+F:93:0xCF/0x95
+
+# mud
+F:94:0xCF/0x8D
+
+# ice wall
+F:95:0xD0/0x88
+
+# tree
+F:96:0xCB/0x86
+
+# mountain chain
+F:97:0xCB/0x87
+
+# sandwall
+F:98:0xD0/0x87
+F:99:0xD0/0x87
+
+# sandwall with treasure
+F:100:0xD0/0x8A
+
+# high mountain chain
+F:101:0xCB/0x87
+
+# nether mist
+F:102:0xC5/0x8C
+
+# molten glass wall
+F:103:0xD0/0x89
+
+# Between gate
+F:160:0x8A/0x9D
+
+# Altar of Forests
+F:161:0xD1/0x85
+
+# Altar of Water
+F:162:0xD1/0x86
+
+# Altar of Earth
+F:163:0xD1/0x8E
+
+# Altar of Darkness
+F:164:0xD1/0x88
+
+# Altar of Moon
+F:165:0xD1/0x89
+
+# Altar of Sun
+F:166:0xD1/0x8C
+
+# Altar of Rage
+F:167:0xD1/0x8A
+
+# Altar of Winds
+F:168:0xD1/0x8B
+
+# Altar of Stars
+F:169:0xD1/0x8D
+
+# Altar of Being
+F:170:0xD1/0x87
+
+# Altar of Randomness
+F:171:0xD1/0x8F
+
+# floor
+F:172:0x80/0x80
+
+# Underground Tunnel
+F:173:0xCF/0x97
+
+# stream of tainted water
+F:174:0xD2/0x82
+
+# monster trap
+F:175:0x82/0x94
+
+# Between gate
+F:176:0x8A/0x9D
+
+# lava wall
+F:177:0xD0/0x86
+
+# Great Fire
+F:178:0xD1/0x90
+
+# Path to next area
+F:179:0xCF/0x9C
+
+# Path to previous area
+F:180:0xCF/0x9B
+
+# field
+F:181:0xCF/0x8A
+
+# Ekkaia, the Encircling Sea
+F:182:0xD2/0x84
+
+# pool of deep water
+F:187:0xD2/0x80
+
+# glass wall
+F:188:0xD0/0x89
+
+# illusion wall
+F:189:0xD0/0x8C
+
+# Grass roof
+F:190:0xD0/0x8F
+
+# grass roof top
+F:191:0xD0/0x8F
+
+# grass roof chimney
+F:192:0xD0/0x8F
+
+# brick roof
+F:193:0xD0/0x90
+
+# brick roof top
+F:194:0xD0/0x90
+
+# brick roof chimney
+F:195:0xD0/0x90
+
+# window
+F:196:0xD0/0x91
+
+# small window
+F:197:0xD0/0x92
+
+# rain barrel
+F:198:0xD0/0x93
+
+# grass with flowers
+F:199:0xD0/0x8D
+
+# cobblestone road
+F:200:0x82/0x8A
+
+# cobblestone with outlet
+F:201:0x82/0x8A
+
+# small tree
+F:202:0xD0/0x8B
+
+# town
+F:203:0xD0/0x94
+
+# Underground Tunnel
+F:204:0xD0/0x95
+
+# a blazing fire
+F:205:0xD1/0x84
+
+# pile of rubble
+F:206:0x81/0x9A
+
+# rocky ground
+F:207:0x82:0x9A
+
+# cloud-like vapour
+F:208:0x82:0x9B
+
+# condensing water
+F:209:0x82:0x9C
+
+# dense mist
+F:210:0x82:0x9D
+
+# hail-stone wall
+F:211:0x83:0x80
+
+# dead small tree
+F:212:0x83:0x83
+
+# low hill
+F:213:0x83:0x84
+
+# dark mountain chain
+F:214:0x83:0x85
+
+# blue mountain chain
+F:215:0x83:0x86
+
+# grey mountain chain
+F:216:0x83:0x87
+
+# part of Mount Doom
+F:217:0x83:0x88
+
+# snow-capped peak
+F:218:0x83:0x89
+
+# fir tree
+F:219:0x83:0x8A
+
+# section of a flet
+F:220:0x83:0x8B
+
+# light post
+F:221:0x83:0x8C
+
+# water lily
+F:222:0x83:0x8D
+
+# part of the Dead Marshes
+F:223:0x83:0x8E
+
+# Black Gate
+F:224:0x83:0x8F
+
+# river
+F:225:0x83:0x90
+
+# swamp pool
+F:226:0x83:0x91
+
+# stream of the Anduin river
+F:227:0x83:0x92
+
+# road sign that says 'Hurry to Gondolin!'
+F:228:0x83:0x93
+
+# beehive
+F:229:0x83:0x94
+
+# dirt road
+F:230:0x83:0x95
+
+# wide gate
+F:231:0x83:0x96
+
+# open gate
+F:232:0x83:0x97
+
+# wooden board
+F:233:0x83:0x98
+
+# wooden board
+F:234:0x83:0x99
+
+# wooden board
+F:235:0x83:0x9A
+
+# wooden board
+F:236:0x83:0x9B
+
+# white tree
+F:237:0x83:0x9C
+
+# swift waterfall
+F:238:0x83:0x9D
+
+# slippery rock ledge
+F:239:0x82:0x9A
+
+# stable
+F:240:0x83:0x9E
+
+# wooden plank
+F:241:0x83:0x9F
+
+# fosse pit
+F:242:0x82:0x9F
+
+# Mallorn
+F:243:0x81:0x9F
+
+# copper pillar
+F:244:0x86:0x93
+
+# ethereal wall
+F:245:0x80:0x80
+
+# glacial wall
+F:246:0xD0:0x88
+
+# battlement
+F:247:0x86:0x98
+
+# door of Orthanc
+F:248:0x04:0x27
+
+# something
+K:0:0x80:0x80
+
+# Blindness
+K:1:0xBA:0x81
+
+# Fear
+K:2:0xBA:0x81
+
+# Confusion
+K:3:0xBA:0x81
+
+# Hallucination
+K:4:0xBA:0x81
+
+# Cure Poison
+K:5:0xBA:0x81
+
+# Cure Blindness
+K:6:0xBA:0x81
+
+# Cure Fear
+K:7:0xBA:0x81
+
+# Cure Confusion
+K:8:0xBA:0x81
+
+# Weakness
+K:9:0xBA:0x81
+
+# Unhealth
+K:10:0xBA:0x81
+
+# Restore Constitution
+K:11:0xBA:0x81
+
+# Restoring
+K:12:0xBA:0x81
+
+# Stupidity
+K:13:0xBA:0x81
+
+# Naivety
+K:14:0xBA:0x81
+
+# Poison
+K:15:0xBA:0x81
+
+# Sickness
+K:16:0xBA:0x81
+
+# Paralysis
+K:17:0xBA:0x81
+
+# Restore Strength
+K:18:0xBA:0x81
+
+# Disease
+K:19:0xBA:0x81
+
+# Cure Serious Wounds
+K:20:0xBA:0x81
+
+# & Ration~ of Cram
+K:21:0x8B:0x82
+
+# & Round Seed-Cake~
+K:22:0x8B:0x82
+
+# & Strip~ of Venison
+K:23:0x8B:0x82
+
+# & Slime Mold~
+K:24:0x8A:0x9F
+
+# & Lembas~
+K:25:0x8B:0x80
+
+# & Pint~ of Fine Ale
+K:26:0x8A:0x95
+
+# & Pint~ of Old Winyards
+K:27:0x8A:0x96
+
+# & Mattock~
+K:28:0xCD:0x80
+
+# & Blue Stone~
+K:29:0xB6:0x89
+
+# & Broken Dagger~
+K:30:0x89:0x83
+
+# & Bastard Sword~
+K:31:0x89:0x85
+
+# & Scimitar~
+K:32:0x89:0x85
+
+# & Tulwar~
+K:33:0x89:0x84
+
+# & Broad Sword~
+K:34:0x89:0x85
+
+# & Short Sword~
+K:35:0x89:0x84
+
+# & Blade~ of Chaos
+K:36:0x89:0x87
+
+# & Two-Handed Sword~
+K:37:0x89:0x85
+
+# & Main Gauche~
+K:38:0x89:0x83
+
+# & Cutlass~
+K:39:0x89:0x84
+
+# & Executioner's Sword~
+K:40:0x89:0x86
+
+# & Katana~
+K:41:0x89:0x85
+
+# & Long Sword~
+K:42:0x89:0x85
+
+# & Dagger~
+K:43:0x89:0x83
+
+# & Rapier~
+K:44:0x89:0x84
+
+# & Sabre~
+K:45:0x89:0x84
+
+# & Small Sword~
+K:46:0x89:0x84
+
+# & Broken Sword~
+K:47:0x89:0x83
+
+# & Ball-and-Chain~
+K:48:0x89:0x88
+
+# & Whip~
+K:49:0x89:0x89
+
+# & Flail~
+K:50:0x89:0x8B
+
+# & Two-Handed Flail~
+K:51:0x89:0x8B
+
+# & Morning Star~
+K:52:0x89:0x8B
+
+# & Mace~
+K:53:0x89:0x8C
+
+# & Quarterstaff~
+K:54:0x89:0x8E
+
+# & War Hammer~
+K:55:0x89:0x8F
+
+# & Lead-Filled Mace~
+K:56:0x89:0x8C
+
+# & Mace~ of Disruption
+K:57:0x89:0x8D
+
+# & Lucerne Hammer~
+K:58:0x89:0x90
+
+# & Beaked Axe~
+K:59:0x89:0x90
+
+# & Glaive~
+K:60:0x89:0x90
+
+# & Halberd~
+K:61:0x89:0x90
+
+# & Awl-Pike~
+K:62:0x89:0x91
+
+# & Pike~
+K:63:0x89:0x91
+
+# & Spear~
+K:64:0x89:0x91
+
+# & Trident~
+K:65:0x89:0x92
+
+# & Lance~
+K:66:0x89:0x93
+
+# & Great Axe~
+K:67:0x89:0x90
+
+# & Battle Axe~
+K:68:0x89:0x90
+
+# & Lochaber Axe~
+K:69:0x89:0x90
+
+# & Broad Axe~
+K:70:0x89:0x90
+
+# & Scythe~
+K:71:0x89:0x94
+
+# & Scythe~ of Slicing
+K:72:0x89:0x94
+
+# & Short Bow~
+K:73:0x89:0x95
+
+# & Long Bow~
+K:74:0x89:0x96
+
+# & Light Crossbow~
+K:75:0x89:0x97
+
+# & Heavy Crossbow~
+K:76:0x89:0x98
+
+# & Sling~
+K:77:0x89:0x99
+
+# & Arrow~
+K:78:0x89:0x9A
+
+# & Seeker Arrow~
+K:79:0x89:0x9B
+
+# & Bolt~
+K:80:0x89:0x9C
+
+# & Seeker Bolt~
+K:81:0x89:0x9D
+
+# & Rounded Pebble~
+K:82:0x89:0x9E
+
+# & Iron Shot~
+K:83:0x89:0x9F
+
+# & Shovel~
+K:84:0x8A:0x98
+
+# & Gnomish Shovel~
+K:85:0x8B:0x8F
+
+# & Dwarven Shovel~
+K:86:0x8B:0x90
+
+# & Pick~
+K:87:0x8A:0x97
+
+# & Orcish Pick~
+K:88:0x8B:0x8D
+
+# & Dwarven Pick~
+K:89:0x8B:0x8E
+
+# & Elven Cloak~
+K:90:0x88:0x81
+
+# & Pair~ of Soft Leather Boots
+K:91:0x88:0x89
+
+# & Pair~ of Hard Leather Boots
+K:92:0x88:0x8A
+
+# & Pair~ of Metal Shod Boots
+K:93:0x88:0x8B
+
+# & Hard Leather Cap~
+K:94:0x88:0x82
+
+# & Metal Cap~
+K:95:0x88:0x83
+
+# & Iron Helm~
+K:96:0x88:0x84
+
+# & Steel Helm~
+K:97:0x88:0x85
+
+# & Iron Crown~
+K:98:0x88:0x86
+
+# & Golden Crown~
+K:99:0x88:0x87
+
+# & Jewel-Encrusted Crown~
+K:100:0x88:0x88
+
+# & Robe~
+K:101:0x88:0x95
+
+# & Filthy Rag~
+K:102:0x88:0x94
+
+# Soft Leather Armour~
+K:103:0x88:0x96
+
+# Soft Studded Leather~
+K:104:0x88:0x96
+
+# Hard Leather Armour~
+K:105:0x88:0x97
+
+# Hard Studded Leather~
+K:106:0x88:0x97
+
+# Leather Scale Mail~
+K:107:0x88:0x98
+
+# Metal Scale Mail~
+K:108:0x88:0x98
+
+# Chain Mail~
+K:109:0x88:0x99
+
+# Rusty Chain Mail~
+K:110:0x88:0x9A
+
+# Augmented Chain Mail~
+K:111:0x88:0x99
+
+# Bar Chain Mail~
+K:112:0x88:0x99
+
+# Metal Brigandine Armour~
+K:113:0x88:0x99
+
+# Partial Plate Armour~
+K:114:0x88:0x9B
+
+# Metal Lamellar Armour~
+K:115:0x88:0x9B
+
+# Full Plate Armour~
+K:116:0xCD:0x82
+
+# Ribbed Plate Armour~
+K:117:0x88:0x9B
+
+# Galvorn Plate Mail~
+K:118:0xA3:0x96
+
+# Mithril Plate Mail~
+K:119:0x85:0x96
+
+# Mithril Chain Mail~
+K:120:0x85:0x96
+
+# Double Chain Mail~
+K:121:0x88:0x99
+
+# & Shield~ of Deflection
+K:122:0x88:0x93
+
+# & Cloak~
+K:123:0x88:0x80
+
+# & Shadow Cloak~
+K:124:0x88:0x81
+
+# & Set~ of Leather Gloves
+K:125:0x88:0x8C
+
+# & Set~ of Gauntlets
+K:126:0x88:0x8D
+
+# & Set~ of Cesti
+K:127:0x88:0x8E
+
+# & Small Leather Shield~
+K:128:0x88:0x8F
+
+# & Large Leather Shield~
+K:129:0x88:0x90
+
+# & Small Metal Shield~
+K:130:0x88:0x91
+
+# & Large Metal Shield~
+K:131:0x88:0x92
+
+# Strength
+K:132:0xB5:0x81
+
+# Dexterity
+K:133:0xB5:0x81
+
+# Constitution
+K:134:0xB5:0x81
+
+# Intelligence
+K:135:0xB5:0x81
+
+# Speed
+K:136:0xB5:0x83
+
+# Searching
+K:137:0xB5:0x80
+
+# Teleportation
+K:138:0xB5:0x80
+
+# Slow Digestion
+K:139:0xB5:0x80
+
+# Fire Resistance
+K:140:0xB5:0x80
+
+# Cold Resistance
+K:141:0xB5:0x80
+
+# Levitation
+K:142:0xB5:0x80
+
+# Poison Resistance
+K:143:0xB5:0x82
+
+# Free Action
+K:144:0xB5:0x80
+
+# Weakness
+K:145:0xB5:0x80
+
+# Flames
+K:146:0xB5:0x82
+
+# Acid
+K:147:0xB5:0x82
+
+# Ice
+K:148:0xB5:0x82
+
+# Woe
+K:149:0xB5:0x82
+
+# Stupidity
+K:150:0xB5:0x80
+
+# Damage
+K:151:0xB5:0x81
+
+# Accuracy
+K:152:0xB5:0x81
+
+# Protection
+K:153:0xB5:0x80
+
+# Aggravate Monster
+K:154:0xB5:0x80
+
+# See Invisible
+K:155:0xB5:0x81
+
+# Sustain Strength
+K:156:0xB5:0x81
+
+# Sustain Intelligence
+K:157:0xB5:0x81
+
+# Sustain Wisdom
+K:158:0xB5:0x81
+
+# Sustain Constitution
+K:159:0xB5:0x81
+
+# Sustain Dexterity
+K:160:0xB5:0x81
+
+# Sustain Charisma
+K:161:0xB5:0x81
+
+# Slaying
+K:162:0xB5:0x81
+
+# Brilliance
+K:163:0xB6:0x9F
+
+# Charisma
+K:164:0xB6:0x9F
+
+# Searching
+K:165:0xB6:0x9E
+
+# Teleportation
+K:166:0xB6:0x9E
+
+# Slow Digestion
+K:167:0xB6:0x9E
+
+# Acid Resistance
+K:168:0xB6:0x9E
+
+# Protection from Evil
+K:169:0xB6:0x9E
+
+# Double Ring Mail~
+K:170:0xCD:0x83
+
+# the Magi
+K:171:0xB6:0x80
+
+# Doom
+K:172:0xB6:0x80
+
+# Enchant Weapon To-Hit
+K:173:0x86:0x80
+
+# Enchant Weapon To-Dam
+K:174:0x86:0x80
+
+# Enchant Armor
+K:175:0x86:0x80
+
+# Identify
+K:176:0x86:0x80
+
+# *Identify*
+K:177:0x86:0x82
+
+# Rumour
+K:178:0x86:0x80
+
+# Chaos
+K:179:0x86:0x80
+
+# Remove Curse
+K:180:0x86:0x80
+
+# Light
+K:181:0x86:0x80
+
+# Fire
+K:182:0x86:0x80
+
+# Ice
+K:183:0x86:0x80
+
+# Summon Monsters
+K:184:0x86:0x80
+
+# Phase Door
+K:185:0x86:0x80
+
+# Teleportation
+K:186:0x86:0x80
+
+# Teleport Level
+K:187:0x86:0x80
+
+# Monster Confusion
+K:188:0x86:0x80
+
+# Magic Mapping
+K:189:0x86:0x80
+
+# Rune of Protection
+K:190:0x86:0x82
+
+# *Remove Curse*
+K:191:0x86:0x82
+
+# Treasure Detection
+K:192:0x86:0x80
+
+# Object Detection
+K:193:0x86:0x80
+
+# Trap Detection
+K:194:0x86:0x80
+
+# & Sheaf Arrow~
+K:195:0xCD:0x84
+
+# & Mithril Shot~
+K:196:0xCD:0x85
+
+# Door/Stair Location
+K:197:0x86:0x80
+
+# Acquirement
+K:198:0x86:0x80
+
+# *Acquirement*
+K:199:0x86:0x82
+
+# Mass Genocide
+K:200:0x86:0x82
+
+# Detect Invisible
+K:201:0x86:0x80
+
+# Aggravation
+K:202:0x86:0x80
+
+# Trap Creation
+K:203:0x86:0x80
+
+# Trap/Door Destruction
+K:204:0x86:0x80
+
+# Artifact Creation
+K:205:0x86:0x82
+
+# Recharging
+K:206:0x86:0x81
+
+# Genocide
+K:207:0x86:0x81
+
+# Darkness
+K:208:0x86:0x80
+
+# Protection from Evil
+K:209:0x86:0x81
+
+# Satisfy Hunger
+K:210:0x86:0x80
+
+# Dispel Undead
+K:211:0x86:0x81
+
+# *Enchant Weapon*
+K:212:0x86:0x82
+
+# Curse Weapon
+K:213:0x86:0x82
+
+# *Enchant Armour*
+K:214:0x86:0x82
+
+# Curse Armour
+K:215:0x86:0x82
+
+# Summon Undead
+K:216:0x86:0x80
+
+# Blessing
+K:217:0x86:0x80
+
+# Holy Chant
+K:218:0x86:0x80
+
+# Holy Prayer
+K:219:0x86:0x81
+
+# Word of Recall
+K:220:0x86:0x80
+
+# *Destruction*
+K:221:0x86:0x82
+
+# Slime Mold Juice
+K:222:0xBC:0x85
+
+# Apple Juice
+K:223:0xBC:0x85
+
+# Water
+K:224:0xBC:0x85
+
+# Strength
+K:225:0xBC:0x86
+
+# Weakness
+K:226:0xBC:0x85
+
+# Restore Strength
+K:227:0xBC:0x86
+
+# Intelligence
+K:228:0xBC:0x86
+
+# Stupidity
+K:229:0xBC:0x85
+
+# Restore Intelligence
+K:230:0xBC:0x86
+
+# Wisdom
+K:231:0xBC:0x86
+
+# Naivety
+K:232:0xBC:0x85
+
+# Restore Wisdom
+K:233:0xBC:0x86
+
+# Charisma
+K:234:0xBC:0x86
+
+# Ugliness
+K:235:0xBC:0x86
+
+# Restore Charisma
+K:236:0xBC:0x86
+
+# Curing
+K:237:0xBC:0x86
+
+# Invulnerability
+K:238:0xBC:0x86
+
+# New Life
+K:239:0xBC:0x86
+
+# Cure Serious Wounds
+K:240:0xBC:0x85
+
+# Cure Critical Wounds
+K:241:0xBC:0x85
+
+# Healing
+K:242:0xBC:0x85
+
+# Constitution
+K:243:0xBC:0x86
+
+# Experience
+K:244:0xBC:0x87
+
+# Sleep
+K:245:0xBC:0x85
+
+# Blindness
+K:246:0xBC:0x85
+
+# Booze
+K:247:0xBC:0x85
+
+# Poison
+K:248:0xBC:0x85
+
+# Speed
+K:249:0xBC:0x85
+
+# Slowness
+K:250:0xBC:0x85
+
+# Dexterity
+K:251:0xBC:0x86
+
+# Restore Dexterity
+K:252:0xBC:0x86
+
+# Restore Constitution
+K:253:0xBC:0x86
+
+# Lose Memories
+K:254:0xBC:0x85
+
+# Salt Water
+K:255:0xBC:0x85
+
+# Enlightenment
+K:256:0xBC:0x85
+
+# Heroism
+K:257:0xBC:0x85
+
+# Berserk Strength
+K:258:0xBC:0x85
+
+# Boldness
+K:259:0xBC:0x85
+
+# Restore Life Levels
+K:260:0xBC:0x87
+
+# Resist Heat
+K:261:0xBC:0x85
+
+# Resist Cold
+K:262:0xBC:0x85
+
+# Detect Invisible
+K:263:0xBC:0x85
+
+# Slow Poison
+K:264:0xBC:0x85
+
+# Neutralise Poison
+K:265:0xBC:0x85
+
+# Restore Mana
+K:266:0xBC:0x86
+
+# Infra-vision
+K:267:0xBC:0x85
+
+# Resistance
+K:268:0xBC:0x85
+
+# Spell
+K:269:0xB7:0x8F
+
+# Manathrust
+K:270:0xB7:0x8F
+
+# Fireflash
+K:271:0xB7:0x8F
+
+# Firewall
+K:272:0xB7:0x90
+
+# Tidal Wave
+K:273:0xB7:0x8F
+
+# Ice Storm
+K:274:0xB7:0x8F
+
+# Noxious Cloud
+K:275:0xB7:0x8F
+
+# Poison Blood
+K:276:0xB7:0x8F
+
+# Thunderstorm
+K:277:0xB7:0x8F
+
+# Dig
+K:278:0xB7:0x8F
+
+# Stone Prison
+K:279:0xB7:0x8F
+
+# Strike
+K:280:0xB7:0x91
+
+# Teleport Away
+K:281:0xB7:0x8F
+
+# Summon Animal
+K:282:0xB7:0x8F
+
+# Magelock
+K:283:0xB7:0x90
+
+# Slow Monster
+K:284:0xB7:0x90
+
+# Essence of Speed
+K:285:0xB7:0x8F
+
+# Banishment
+K:286:0xB7:0x8F
+
+# Disperse Magic
+K:287:0xB7:0x90
+
+# Charm
+K:288:0xB7:0x90
+
+# Confuse
+K:289:0xB7:0x91
+
+# Demon Blade
+K:290:0xB7:0x8F
+
+# Heal Monster
+K:291:0xB7:0x91
+
+# Haste Monster
+K:292:0xB7:0x8F
+
+# & Flight Arrow~
+K:293:0xCD:0x86
+
+# & Boulder~
+K:295:0x85:0x97
+
+# & Flame~ Imperishable
+K:296:0x85:0x98
+
+# & Necromantic Teeth~
+K:297:0x85:0x99
+
+# & Golden Horn~ of the Eagles
+K:298:0xB7:0x91
+
+# Spell
+K:300:0xB9:0x99
+
+# Nothing
+K:301:0xB9:0x99
+
+# Globe of Light
+K:302:0xB9:0x99
+
+# Fiery Shield
+K:303:0xB9:0x99
+
+# Remove Curses
+K:304:0xB9:0x9A
+
+# Wings of Winds
+K:305:0xB9:0x99
+
+# Shake
+K:306:0xB9:0x99
+
+# Disarm
+K:307:0xB9:0x9B
+
+# Teleportation
+K:308:0xB9:0x99
+
+# Probability Travel
+K:309:0xB9:0x99
+
+# Recovery
+K:310:0xB9:0x99
+
+# Healing
+K:311:0xB9:0x99
+
+# Vision
+K:312:0xB9:0x99
+
+# Identify
+K:313:0xB9:0x99
+
+# Sense Hidden
+K:314:0xB9:0x9A
+
+# Reveal Ways
+K:315:0xB9:0x99
+
+# Sense Monsters
+K:316:0xB9:0x99
+
+# Genocide
+K:317:0xB9:0x9A
+
+# Summon
+K:318:0xB9:0x99
+
+# Sterilization
+K:319:0xB9:0x9A
+
+# Wish
+K:320:0xB9:0x9B
+
+# Mana
+K:321:0xB9:0x9A
+
+# & Tome~ of Magical Energy
+K:330:0xA3:0x8A
+
+# & Tome~ of the Eternal Flame
+K:331:0xA3:0x8A
+
+# & Tome~ of the Blowing Wind
+K:332:0xA3:0x8A
+
+# & Tome~ of the Impenetrable Earth
+K:333:0xA3:0x8A
+
+# & Tome~ of the Everrunning Wave
+K:334:0xA3:0x8C
+
+# & Tome~ of Translocation
+K:335:0xA3:0x8C
+
+# & Tome~ of the Tree
+K:336:0xA3:0x8C
+
+# & Tome~ of Knowledge
+K:337:0xA3:0x8C
+
+# & Small wooden chest~
+K:338:0x80:0x96
+
+# & Large wooden chest~
+K:339:0x80:0x97
+
+# & Small iron chest~
+K:340:0x80:0x98
+
+# & Large iron chest~
+K:341:0x80:0x99
+
+# & Small steel chest~
+K:342:0x80:0x9A
+
+# & Large steel chest~
+K:343:0x80:0x9B
+
+# & Ruined chest~
+K:344:0x80:0x9C
+
+# & Iron Spike~
+K:345:0x8B:0x84
+
+# & Wooden Torch~
+K:346:0x8B:0x86
+
+# & Brass Lantern~
+K:347:0x8B:0x85
+
+# & Flask~ of oil
+K:348:0xBC:0x90
+
+# & Empty Bottle~
+K:349:0x8A:0x99
+
+# Havoc
+K:350:0xB8:0x94
+
+# Door/Stair Location
+K:351:0xB8:0x94
+
+# Trap Location
+K:352:0xB8:0x94
+
+# Probing
+K:353:0xB8:0x97
+
+# Recall
+K:354:0xB8:0x96
+
+# Illumination
+K:355:0xB8:0x95
+
+# Light
+K:356:0xB8:0x94
+
+# Lightning Bolts
+K:357:0xB8:0x94
+
+# Frost Bolts
+K:358:0xB8:0x95
+
+# Fire Bolts
+K:359:0xB8:0x95
+
+# Polymorph
+K:360:0xB8:0x95
+
+# Slow Monster
+K:361:0xB8:0x95
+
+# Sleep Monster
+K:362:0xB8:0x95
+
+# Drain Life
+K:363:0xB8:0x97
+
+# Teleport Other
+K:364:0xB8:0x96
+
+# Disarming
+K:365:0xB8:0x95
+
+# Lightning Balls
+K:366:0xB8:0x96
+
+# Cold Balls
+K:367:0xB8:0x96
+
+# Fire Balls
+K:368:0xB8:0x97
+
+# Acid Balls
+K:369:0xB8:0x97
+
+# Acid Bolts
+K:370:0xB8:0x95
+
+# Enlightenment
+K:371:0xB8:0x97
+
+# Perception
+K:372:0xB8:0x96
+
+# Curing
+K:373:0xB8:0x97
+
+# Healing
+K:374:0xB8:0x97
+
+# Detection
+K:375:0xB8:0x95
+
+# Restoration
+K:376:0xB8:0x97
+
+# Speed
+K:377:0xB8:0x97
+
+# Spell
+K:378:0xA3:0x8E
+
+# Spell
+K:379:0x86:0x9E
+
+# & Broken Skull~
+K:391:0x8B:0x8A
+
+# & Broken Bone~
+K:392:0x8B:0x8B
+
+# & Canine Skeleton~
+K:393:0x8B:0x87
+
+# & Rodent Skeleton~
+K:394:0x8B:0x87
+
+# & Human Skeleton~
+K:395:0x8B:0x87
+
+# & Dwarf Skeleton~
+K:396:0x8B:0x87
+
+# & Elf Skeleton~
+K:397:0x8B:0x87
+
+# & Gnome Skeleton~
+K:398:0x8B:0x87
+
+# & Great Hammer~
+K:399:0xCD:0x87
+
+# Black Dragon Scale Mail~
+K:400:0x88:0x9F
+
+# Blue Dragon Scale Mail~
+K:401:0x88:0x9D
+
+# White Dragon Scale Mail~
+K:402:0x88:0x9E
+
+# Red Dragon Scale Mail~
+K:403:0x89:0x81
+
+# Green Dragon Scale Mail~
+K:404:0x89:0x80
+
+# Multi-Hued Dragon Scale Mail~
+K:405:0x89:0x82
+
+# Pseudo Dragon Scale Mail~
+K:406:0xBB:0x9C
+
+# Law Dragon Scale Mail~
+K:407:0x88:0x9F
+
+# Bronze Dragon Scale Mail~
+K:408:0x88:0x96
+
+# Gold Dragon Scale Mail~
+K:409:0x88:0x9C
+
+# Chaos Dragon Scale Mail~
+K:410:0x89:0x80
+
+# Balance Dragon Scale Mail~
+K:411:0x88:0x99
+
+# Power Dragon Scale Mail~
+K:412:0xA2:0x9E
+
+# & Dragon Helm~
+K:413:0xA2:0x9D
+
+# & Dragon Shield~
+K:414:0xA2:0x9C
+
+# Death
+K:415:0xBC:0x88
+
+# Ruination
+K:416:0xBC:0x87
+
+# Detonations
+K:417:0xBC:0x87
+
+# Augmentation
+K:418:0xBC:0x87
+
+# *Healing*
+K:419:0xBC:0x87
+
+# Life
+K:420:0xBC:0x88
+
+# Self Knowledge
+K:421:0xBC:0x87
+
+# *Enlightenment*
+K:422:0xBC:0x88
+
+# Fear Resistance
+K:425:0xB5:0x81
+
+# Light and Darkness Resistance
+K:426:0xB5:0x81
+
+# Nether Resistance
+K:427:0xB5:0x81
+
+# Nexus Resistance
+K:428:0xB5:0x81
+
+# Sound Resistance
+K:429:0xB5:0x81
+
+# Confusion Resistance
+K:430:0xB5:0x81
+
+# Shard Resistance
+K:431:0xB5:0x81
+
+# Disenchantment Resistance
+K:432:0xB5:0x81
+
+# Chaos Resistance
+K:433:0xB5:0x81
+
+# Blindness Resistance
+K:434:0xB5:0x81
+
+# Lordly Protection
+K:435:0xB5:0x81
+
+# Extra Attacks
+K:436:0xB5:0x81
+
+# Cure Light Wounds
+K:437:0xBC:0x85
+
+# Clumsiness
+K:438:0xBC:0x85
+
+# Sickliness
+K:439:0xBC:0x85
+
+# Map of Bree
+K:440:0xD8:0x81
+
+# Map of Gondolin
+K:441:0xD8:0x81
+
+# Map of Lothlorien
+K:442:0xD8:0x81
+
+# Map of Minas Anor
+K:443:0xD8:0x81
+
+# & Silver Arrow~
+K:465:0xCE:0x91
+
+# & Silver Bolt~
+K:466:0xCE:0x92
+
+# Lightning Resistance
+K:467:0x87:0x80
+
+# Wisdom
+K:468:0x87:0x80
+
+# Regeneration
+K:469:0x87:0x80
+
+# Infravision
+K:470:0x87:0x80
+
+# Devotion
+K:471:0x87:0x80
+
+# Weaponmastery
+K:472:0x87:0x80
+
+# Trickery
+K:473:0x87:0x80
+
+# Telepathy
+K:474:0x87:0x80
+
+# Sustenance
+K:475:0x87:0x80
+
+# & Palantir~
+K:476:0xD8:0x8F
+
+# & Elfstone~
+K:477:0xB6:0x8F
+
+# & Jewel~
+K:478:0xB6:0x90
+
+# & Ring~
+K:479:0xB5:0x8E
+
+# copper
+K:480:0x80:0x8B
+
+# copper
+K:481:0x80:0x8B
+
+# copper
+K:482:0x80:0x8B
+
+# silver
+K:483:0x80:0x8C
+
+# silver
+K:484:0x80:0x8C
+
+# silver
+K:485:0x80:0x8C
+
+# garnets
+K:486:0x80:0x8F
+
+# garnets
+K:487:0x80:0x8F
+
+# gold
+K:488:0x80:0x8D
+
+# gold
+K:489:0x80:0x8D
+
+# gold
+K:490:0x80:0x8D
+
+# opals
+K:491:0x80:0x90
+
+# sapphires
+K:492:0x80:0x91
+
+# rubies
+K:493:0x80:0x92
+
+# diamonds
+K:494:0x80:0x93
+
+# emeralds
+K:495:0x80:0x94
+
+# mithril
+K:496:0x80:0x8E
+
+# adamantite
+K:497:0xA3:0x95
+
+# & Mighty Hammer~
+K:498:0x87:0x9A
+
+# & Massive Iron Crown~
+K:499:0x87:0x9B
+
+# & Phial~
+K:500:0x87:0x9D
+
+# & Star~
+K:501:0x87:0x9E
+
+# & Arkenstone~
+K:502:0x87:0x9F
+
+# & Amulet~
+K:503:0xB6:0x82
+
+# & Amulet~
+K:504:0xB6:0x83
+
+# & Necklace~
+K:505:0xB6:0x84
+
+# & Ring~
+K:506:0xB5:0x83
+
+# & Ring~
+K:507:0xB5:0x83
+
+# & Ring~
+K:508:0xB5:0x84
+
+# & Ring~
+K:509:0xB5:0x85
+
+# & Ring~
+K:510:0xB5:0x86
+
+# & Ring~
+K:511:0xB5:0x87
+
+# Reflection
+K:520:0xB6:0x80
+
+# Anti-Magic
+K:521:0xB6:0x80
+
+# Anti-Teleportation
+K:522:0xB6:0x80
+
+# Resistance
+K:523:0xB6:0x80
+
+# & Zweihander~
+K:524:0xCD:0x88
+
+# & Dwarven Lantern~
+K:525:0xD8:0x86
+
+# Splint Mail~
+K:526:0xCD:0x8A
+
+# & Everburning Torch~
+K:527:0xD8:0x87
+
+# & Trifurcate Spear~
+K:528:0xCD:0x96
+
+# & Three-Piece Rod~
+K:529:0xCD:0x8C
+
+# & Feanorian Lamp~
+K:530:0xD8:0x85
+
+# & Fur Cloak~
+K:531:0xCD:0x8E
+
+# Water Curing
+K:532:0xBC:0x84
+
+# & Hatchet~
+K:533:0xCD:0x90
+
+# Mumak Hide Armour~
+K:535:0xCD:0x91
+
+# & Leather Jerkin~
+K:536:0xCD:0x92
+
+# & Sickle~
+K:537:0xCD:0x93
+
+# & Club~
+K:542:0xCD:0x99
+
+# & Broad Spear~
+K:543:0xCD:0x9A
+
+# & Khopesh~
+K:544:0xCD:0x9B
+
+# & Flamberge~
+K:545:0xCD:0x9C
+
+# & Claymore~
+K:546:0xCD:0x9D
+
+# & Espadon~
+K:547:0xCD:0x9E
+
+# & Great Scimitar~
+K:548:0xCD:0x9F
+
+# Arrow
+K:549:0xD7:0x84
+
+# Bolt
+K:550:0xD7:0x83
+
+# & Fauchard~
+K:551:0xCE:0x82
+
+# & Guisarme~
+K:552:0xCE:0x83
+
+# & Heavy Lance~
+K:553:0xCE:0x84
+
+# & Bardiche~
+K:554:0xCE:0x85
+
+# Catapult
+K:555:0xD7:0x82
+
+# Ring Mail~
+K:556:0xCE:0x87
+
+# Cord Armour~
+K:557:0xCE:0x88
+
+# Paper Armour~
+K:558:0xCE:0x89
+
+# Padded Armour~
+K:559:0xCE:0x8A
+
+# Fumes
+K:560:0xD7:0x80
+
+# Golden Ring Mail~
+K:561:0x87:0x98
+
+# Magic
+K:562:0xD7:0x81
+
+# Device
+K:563:0xD7:0x85
+
+# Nothing
+K:569:0xB8:0x95
+
+# & Blood~ of Life
+K:573:0x87:0x88
+
+# & Mage Staff~
+K:577:0xCE:0x97
+
+# Lightning
+K:578:0xB5:0x81
+
+# & Ring~
+K:582:0xB5:0x8F
+
+# Invisibility
+K:583:0xB8:0x85
+
+# Corruption
+K:585:0xB8:0x85
+
+# Invisibility
+K:586:0xB5:0x81
+
+# Deep Thoughts
+K:588:0xD8:0x80
+
+# More Deep Thoughts
+K:589:0xD8:0x80
+
+# Compendium of Deep Thoughts
+K:590:0xD8:0x80
+
+# Artifact Lore Vol. I
+K:591:0xD8:0x80
+
+# Artifact Lore Vol. II
+K:592:0xD8:0x80
+
+# Artifact Lore Vol. III
+K:593:0xD8:0x80
+
+# Monstrous Compendium 1
+K:594:0xD8:0x80
+
+# Monstrous Compendium 2
+K:595:0xD8:0x80
+
+# Monstrous Compendium 3
+K:596:0xD8:0x80
+
+# Monstrous Compendium 4
+K:597:0xD8:0x80
+
+# Monstrous Compendium 5
+K:598:0xD8:0x80
+
+# Monstrous Compendium 6
+K:599:0xD8:0x80
+
+# Monstrous Compendium 7
+K:600:0xD8:0x80
+
+# Monstrous Compendium 8
+K:601:0xD8:0x80
+
+# Monstrous Compendium 9
+K:602:0xD8:0x80
+
+# Monstrous Compendium 10
+K:603:0xD8:0x80
+
+# Monstrous Compendium 11
+K:604:0xD8:0x80
+
+# & Morphic Oil~ of #
+K:605:0xBC:0x85
+
+# Artifact Lore Vol. IV
+K:607:0xD8:0x80
+
+# Artifact Lore Vol. V
+K:608:0xD8:0x80
+
+# Artifact Lore Vol. VI
+K:609:0xD8:0x80
+
+# Artifact Lore Vol. VII
+K:610:0xD8:0x80
+
+# Artifact Lore Vol. VIII
+K:611:0xD8:0x80
+
+# Artifact Lore Vol. IX
+K:612:0xD8:0x80
+
+# Artifact Lore Vol. X
+K:613:0xD8:0x80
+
+# Artifact Lore Vol. XI
+K:614:0xD8:0x80
+
+# Artifact Lore Vol. IX
+K:615:0xD8:0x80
+
+# Artifact Lore Vol. X
+K:616:0xD8:0x80
+
+# Artifact Lore Vol. XI
+K:617:0xD8:0x80
+
+# & #~
+K:618:0xCE:0x93
+
+# corpse
+K:641:0xB4:0x90
+
+# skeleton
+K:642:0xB4:0x8B
+
+# head
+K:643:0xB4:0x8E
+
+# skull
+K:644:0xB4:0x8F
+
+# raw meat
+K:645:0xB4:0x8C
+
+# & Great Eagle Down Coat~
+K:646:0xCE:0x98
+
+# & Key~
+K:647:0xD8:0x90
+
+# & Small Wooden Boomerang~
+K:648:0xCE:0x99
+
+# & Wooden Boomerang~
+K:649:0xCE:0x9A
+
+# & Small Metal Boomerang~
+K:650:0xCE:0x9B
+
+# & Metal Boomerang~
+K:651:0xCE:0x9C
+
+# & Anchor~
+K:652:0xD8:0x91
+
+# & ~
+K:653:0x87:0x99
+
+# Summon Never-Moving Pet
+K:654:0x86:0x80
+
+# Cure Light Insanity
+K:657:0xBC:0x85
+
+# Cure Serious Insanity
+K:658:0xBC:0x85
+
+# Cure Critical Insanity
+K:659:0xBC:0x85
+
+# Cure Insanity
+K:660:0xBC:0x85
+
+# & Phial~
+K:661:0x87:0x9D
+
+# Junkart
+K:662:0x87:0x9C
+
+# Craftsmanship
+K:663:0x86:0x82
+
+# The One Ring
+K:664:0xD8:0x81
+
+# & Horn~
+K:669:0xD8:0x88
+
+# & Drum~
+K:670:0xD8:0x89
+
+# & Harp~
+K:671:0xD8:0x8A
+
+# & Palantir~
+K:675:0xD8:0x8F
+
+# Egg
+K:676:0xD8:0x84
+
+# Reset Recall
+K:677:0x86:0x81
+
+# Divination
+K:678:0x86:0x81
+
+# Self
+K:679:0xDA:0x80
+
+# Ray
+K:680:0xDA:0x80
+
+# Sphere
+K:681:0xDA:0x80
+
+# Knowledge
+K:682:0xDA:0x80
+
+# Life
+K:683:0xDA:0x84
+
+# Fire
+K:684:0xDA:0x81
+
+# Cold
+K:685:0xDA:0x80
+
+# Lightning
+K:686:0xDA:0x85
+
+# Acid
+K:687:0xDA:0x88
+
+# Element
+K:688:0xDA:0x89
+
+# Chaos
+K:689:0xDA:0x83
+
+# Mind
+K:690:0xDA:0x84
+
+# Holding
+K:691:0xDA:0x84
+
+# Arrow
+K:692:0xDA:0x80
+
+# Power Surge
+K:693:0xDA:0x80
+
+# Armageddon
+K:694:0xDA:0x80
+
+# Gravity
+K:695:0xDA:0x82
+
+# Undeath
+K:697:0xDA:0x82
+
+# Protection
+K:698:0xDA:0x82
+
+# & Ring~ of Precognition
+K:700:0xB5:0x8E
+
+# & Sprig~ of Athelas
+K:701:0xCE:0x96
+
+# & Old Scroll~ of Deincarnation
+K:720:0x86:0x82
+
+# & Dark Sword~
+K:721:0xCE:0x9D
+
+# Numenorean for Beginners (I)
+K:722:0xD8:0x81
+
+# Numenorean for Beginners (II)
+K:723:0xD8:0x81
+
+# Advanced Lessons of Numenorean
+K:724:0xD8:0x81
+
+# Advanced Lessons of Sindarin
+K:725:0xD8:0x81
+
+# & Shard~ of Pottery
+K:726:0x8B:0x88
+
+# & Broken Stick~
+K:727:0x8B:0x89
+
+# & Book~ of Beginner Cantrips
+K:738:0xA3:0x8B
+
+# & Book~ of Teleportation
+K:739:0xA3:0x8B
+
+# & Book~ of Summoning
+K:741:0xA3:0x8B
+
+# & Potion~ of Learning
+K:743:0x87:0x86
+
+# Khuzdul - The Hidden Tongue of the Dwarves
+K:751:0xD8:0x81
+
+# Nandorin for Dummies
+K:752:0xD8:0x81
+
+# Advanced Lessons of Orcish
+K:753:0xD8:0x81
+
+# Flying
+K:755:0xB5:0x80
+
+# & Tome~ of the Time
+K:756:0xA3:0x8D
+
+# & Spellbook~ of #
+K:757:0xA3:0x8A
+
+# & Tome~ of Meta Spells
+K:758:0xA3:0x8D
+
+# & Tome~ of the Mind
+K:759:0xA3:0x8D
+
+# & Holy Tome~ of Eru Iluvatar
+K:760:0xA3:0x8B
+
+# & Holy Tome~ of Manwe Sulimo
+K:761:0xA3:0x8C
+
+# & War Tome~ of Tulkas
+K:762:0xA3:0x90
+
+# & Unholy Tome~ of the Hellflame
+K:763:0xA3:0x91
+
+# & Corrupted Tome~ of Melkor
+K:764:0xA3:0x91
+
+# & Earth Tome~ of Aule
+K:765:0xA3:0x92
+
+# & Shining Tome~ of Varda
+K:766:0xA3:0x8B
+
+# & Water Tome~ of Ulmo
+K:767:0xA3:0x8D
+
+# & Forest Tome~ of Yavanna
+K:768:0xA3:0x8F
+
+# Tome of#
+K:769:0xA3:0x8F
+
+# & Ring~
+K:770:0xB5:0x8E
+
+# & Holy Tome~ of Mandos
+K:771:0xA3:0x8A
+
+# & Great Rod Tip~ of Home Summoning
+K:776:0xB8:0x84
+
+# & Shadow Blade~
+K:777:0xCD:0x9C
+
+# & Bluesteel Blade~
+K:778:0xCE:0x9E
+
+# the Serpents
+K:779:0xB6:0x9F
+
+# Ring~ of Power
+K:785:0xB5:0x85
+
+# Climbing Set~
+K:786:0xD8:0x92
+
+# Adventurer's Guide to Middle-earth
+K:787:0xD8:0x80
+
+# & Demonblade~
+K:788:0xCE:0x94
+
+# & Demonshield~
+K:789:0xCE:0x94
+
+# & Demonhorn~
+K:790:0xCE:0x95
+
+# & Wooden Rod~ of#
+K:793:0xDB:0x80
+
+# & Copper Rod~ of#
+K:794:0xDB:0x81
+
+# & Iron Rod~ of#
+K:795:0xDB:0x82
+
+# & Moonstone Rod~ of#
+K:796:0xDB:0x83
+
+# & Silver Rod~ of#
+K:797:0xDB:0x84
+
+# & Golden Rod~ of#
+K:798:0xDB:0x85
+
+# & Mithril Rod~ of#
+K:799:0xDB:0x86
+
+# & Tilkal Rod~ of#
+K:800:0xDB:0x87
+
+# & Greater Ration~ of Health
+K:801:0x8A:0x9E
+
+# & Crumpled Scroll~ of Mass Resurrection
+K:802:0x86:0x82
+
+# & Cleaver~
+K:803:0xD8:0x93
+
+# & Light War Axe~
+K:804:0xD8:0x94
+
+# & Slaughter Axe~
+K:805:0xD8:0x95
+
+# & Runestone~
+K:806:0xDA:0x83
+
+# & Fortune cookie~
+K:807:0x8A:0x93
+
+# Critical Hits
+K:809:0xB5:0x82
+
+# & Wand~ of Digging of Thrain
+K:810:0xB8:0x97
+
+# & Gnarled Staff~ of Holy Fire of Mithrandir
+K:811:0xCE:0x9F
+
+# Partial Totem
+K:812:0xB4:0x82
+
+# True Totem
+K:813:0xB4:0x85
+
+# & Piece~ of the Relic of Eru
+K:814:0x8B:0x91
+
+# & Piece~ of the Relic of Manwe
+K:815:0x8B:0x92
+
+# & Piece~ of the Relic of Tulkas
+K:816:0x8B:0x93
+
+# & Piece~ of the Relic of Melkor
+K:817:0x8B:0x94
+
+# & Piece~ of the Relic of Yavanna
+K:818:0x8B:0x95
+
+# & Ring~
+K:819:0xB5:0x82
+
+# & Ring~
+K:820:0xB5:0x82
+
+# & Ring~
+K:821:0xB5:0x82
+
+# & Ring~
+K:822:0xB5:0x82
+
+# & Ring~
+K:823:0xB5:0x82
+
+# & Ring~
+K:824:0xB5:0x82
+
+# & Piece~ of the Relic of Aule
+K:825:0x8B:0x96
+
+# & Piece~ of the Relic of Varda
+K:826:0x8B:0x97
+
+# & Piece~ of the Relic of Ulmo
+K:827:0x8B:0x98
+
+# & Piece~ of the Relic of Mandos
+K:828:0x8B:0x99
+
+# & Pinch~ of Longbottom Leaf
+K:831:0x87:0x8C
+
+# & Ear~ of Corn
+K:832:0x85:0x9A
+
+# & Tater~
+K:833:0x85:0x9B
+
+# & Strawberry~
+K:834:0x85:0x9C
+
+# & Turnip~
+K:835:0x85:0x9D
+
+# & Jar~ of Honey
+K:836:0x85:0x9E
+
+# & Jug~ of Milk
+K:837:0x85:0x9F
+
+# of War
+K:838:0xB9:0x9A
+
+# of Life
+K:839:0xB9:0x9C
+
+# Wizardry
+K:840:0x82:0x81
+
+# Vitality
+K:841:0x82:0x81
+
+# Clear Thought
+K:842:0x00:0x3D
+
+# Clumsiness
+K:843:0x82:0x81
+
+# Sickliness
+K:844:0x82:0x81
+
+# Fortune
+K:845:0x82:0x7F
+
+# Sterilise
+K:846:0xA3:0x92
+
+# Map of Middle-earth
+K:847:0xA3:0x92
+
+# Map of Edoras
+K:848:0xD8:0x81
+
+# Map of Esgaroth
+K:849:0xD8:0x81
+
+# Map of Hobbiton
+K:850:0xD8:0x81
+
+# Map of Osgiliath
+K:851:0xD8:0x81
+
+# Map of Pelargir
+K:852:0xD8:0x81
+
+# Map of Beorn's domain
+K:853:0xD8:0x81
+
+# Map of Dale
+K:854:0xD8:0x81
+
+# Map of Henneth Annun
+K:855:0xD8:0x81
+
+# Map of Helm's Deep
+K:856:0xD8:0x81
+
+# Map of Thranduil's realm
+K:857:0xD8:0x81
+
+# Map of Imladris
+K:858:0xD8:0x81
+
+# & Bearded Axe~
+K:859:0x87:0x90
+
+# & Double Axe~
+K:860:0x87:0x91
+
+# & Crusader Axe~
+K:861:0x87:0x92
+
+# & Reaper Axe~
+K:862:0x87:0x93
+
+# & Mithril Helm~
+K:863:0x8B:0x9A
+
+# & Set~ of Mithril Gauntlets
+K:864:0x8B:0x9B
+
+# & Small Mithril Shield~
+K:865:0x8B:0x9C
+
+# & Large Mithril Shield~
+K:866:0x8B:0x9D
+
+# & Map~
+K:867:0xA3:0x92
+
+# & Key~
+K:868:0x87:0x8D
+
+# & Cup~
+K:869:0x87:0x8E
+
+# & Red Arrow~
+K:870:0x87:0x8F
+
+# & Sceptre~
+K:871:0x86:0x91
+
+# & Rod~
+K:872:0x86:0x90
+
+# & Necklace~
+K:873:0x86:0x9F
+
+# & Amulet~
+K:874:0x86:0x9E
+
+# & Black Banner~
+K:875:0x87:0x94
+
+# & Pearl~
+K:876:0x87:0x95
+
+# & Silmaril~
+K:877:0x87:0x96
+
+# & Silmaril~
+K:878:0x87:0x97
+
+# & Golden Harp~
+K:879:0xD9:0x8A
+
+# Player
+R:0:0x8C/0x81
+
+# Spells (*)
+S:0x30:0x85/0x93
+S:0x31:0x85/0x92
+S:0x32:0x85/0x92
+S:0x33:0x85/0x8D
+S:0x34:0x85/0x8C
+S:0x35:0x85/0x8F
+S:0x36:0x85/0x90
+S:0x37:0x85/0x95
+S:0x38:0x85/0x93
+S:0x39:0x85/0x92
+S:0x3A:0x85/0x91
+S:0x3B:0x85/0x8E
+S:0x3C:0x85/0x8D
+S:0x3D:0x85/0x8F
+S:0x3E:0x85/0x90
+S:0x3F:0x85/0x95
+
+# Spells (|)
+S:0x40:0x84/0x9C
+S:0x41:0x84/0x98
+S:0x42:0x84/0x98
+S:0x43:0x85/0x88
+S:0x44:0x84/0x80
+S:0x45:0x84/0x8C
+S:0x46:0x84/0x90
+S:0x47:0x85/0x84
+S:0x48:0x84/0x9C
+S:0x49:0x84/0x98
+S:0x4A:0x84/0x94
+S:0x4B:0x84/0x88
+S:0x4C:0x85/0x88
+S:0x4D:0x84/0x8C
+S:0x4E:0x84/0x90
+S:0x4F:0x85/0x84
+
+# Spells (-)
+S:0x50:0x84/0x9D
+S:0x51:0x84/0x99
+S:0x52:0x84/0x99
+S:0x53:0x85/0x89
+S:0x54:0x84/0x81
+S:0x55:0x84/0x8D
+S:0x56:0x84/0x91
+S:0x57:0x85/0x85
+S:0x58:0x84/0x9D
+S:0x59:0x84/0x99
+S:0x5A:0x84/0x95
+S:0x5B:0x84/0x89
+S:0x5C:0x85/0x89
+S:0x5D:0x84/0x8D
+S:0x5E:0x84/0x91
+S:0x5F:0x85/0x85
+
+# Spells (:)
+S:0x60:0x84/0x9E
+S:0x61:0x84/0x9A
+S:0x62:0x84/0x9A
+S:0x63:0x85/0x8A
+S:0x64:0x84/0x82
+S:0x65:0x84/0x8E
+S:0x66:0x84/0x92
+S:0x67:0x85/0x86
+S:0x68:0x84/0x9E
+S:0x69:0x84/0x9A
+S:0x6A:0x84/0x96
+S:0x6B:0x84/0x8A
+S:0x6C:0x85/0x8A
+S:0x6D:0x84/0x8E
+S:0x6E:0x84/0x92
+S:0x6F:0x85/0x86
+
+# Spells (\)
+S:0x70:0x84/0x9F
+S:0x71:0x84/0x9B
+S:0x72:0x84/0x9B
+S:0x73:0x85/0x8B
+S:0x74:0x84/0x83
+S:0x75:0x84/0x8F
+S:0x76:0x84/0x93
+S:0x77:0x85/0x87
+S:0x78:0x84/0x9F
+S:0x79:0x84/0x9B
+S:0x7A:0x84/0x97
+S:0x7B:0x84/0x8B
+S:0x7C:0x85/0x8B
+S:0x7D:0x84/0x8F
+S:0x7E:0x84/0x93
+S:0x7F:0x85/0x87
+
+# Amulets (")
+S:0x80:0xB6/0x87
+S:0x81:0xB6/0x88
+S:0x82:0xB6/0x85
+S:0x83:0xB6/0x86
+S:0x84:0xB6/0x81
+S:0x85:0xB6/0x82
+S:0x86:0xB6/0x83
+S:0x87:0xB6/0x84
+S:0x88:0xB6/0x87
+S:0x89:0xB6/0x88
+S:0x8A:0xB6/0x8E
+S:0x8B:0xB6/0x86
+S:0x8C:0xB6/0x81
+S:0x8D:0xB6/0x82
+S:0x8E:0xB6/0x8B
+S:0x8F:0xB6/0x8C
+
+# Rings (=)
+S:0x90:0xB5/0x8B
+S:0x91:0xB5/0x8C
+S:0x92:0xB5/0x89
+S:0x93:0xB5/0x8A
+S:0x94:0xB5/0x81
+S:0x95:0xB5/0x82
+S:0x96:0xB5/0x83
+S:0x97:0xB5/0x88
+S:0x98:0xB5/0x8B
+S:0x99:0xB5/0x8C
+S:0x9A:0xB5/0x80
+S:0x9B:0xB5/0x8A
+S:0x9C:0xB5/0x81
+S:0x9D:0xB5/0x82
+S:0x9E:0xB5/0x83
+S:0x9F:0xB5/0x88
+
+# Staffs (_)
+S:0xA0:0xB9/0x84
+S:0xA1:0xB9/0x85
+S:0xA2:0xB9/0x85
+S:0xA3:0xB9/0x81
+S:0xA4:0xB9/0x81
+S:0xA5:0xB9/0x82
+S:0xA6:0xB9/0x80
+S:0xA7:0xB9/0x87
+S:0xA8:0xB9/0x84
+S:0xA9:0xB9/0x85
+S:0xAA:0xB9/0x83
+S:0xAB:0xB9/0x87
+S:0xAC:0xB9/0x81
+S:0xAD:0xB9/0x82
+S:0xAE:0xB9/0x80
+S:0xAF:0xB9/0x87
+
+# Wands (-)
+S:0xB0:0xB7/0x84
+S:0xB1:0xB7/0x85
+S:0xB2:0xB7/0x85
+S:0xB3:0xB7/0x86
+S:0xB4:0xB7/0x81
+S:0xB5:0xB7/0x82
+S:0xB6:0xB7/0x80
+S:0xB7:0xB7/0x87
+S:0xB8:0xB7/0x84
+S:0xB9:0xB7/0x85
+S:0xBA:0xB7/0x83
+S:0xBB:0xB7/0x86
+S:0xBC:0xB7/0x81
+S:0xBD:0xB7/0x82
+S:0xBE:0xB7/0x80
+S:0xBF:0xB7/0x87
+
+# Rods (-)
+S:0xC0:0xB8/0x84
+S:0xC1:0xB8/0x85
+S:0xC2:0xB8/0x85
+S:0xC3:0xB8/0x86
+S:0xC4:0xB8/0x81
+S:0xC5:0xB8/0x82
+S:0xC6:0xB8/0x80
+S:0xC7:0xB8/0x87
+S:0xC8:0xB8/0x84
+S:0xC9:0xB8/0x85
+S:0xCA:0xB8/0x83
+S:0xCB:0xB8/0x86
+S:0xCC:0xB8/0x81
+S:0xCD:0xB8/0x82
+S:0xCE:0xB8/0x80
+S:0xCF:0xB8/0x87
+
+# Scrolls (?)
+S:0xD0:0x86/0x82
+S:0xD1:0x86/0x82
+S:0xD2:0x86/0x82
+S:0xD3:0x86/0x82
+S:0xD4:0x86/0x82
+S:0xD5:0x86/0x82
+S:0xD6:0x86/0x82
+S:0xD7:0x86/0x82
+S:0xD8:0x86/0x82
+S:0xD9:0x86/0x82
+S:0xDA:0x86/0x82
+S:0xDB:0x86/0x82
+S:0xDC:0x86/0x82
+S:0xDD:0x86/0x82
+S:0xDE:0x86/0x82
+S:0xDF:0x86/0x82
+
+# Potions (!)
+S:0xE0:0xBC/0x84
+S:0xE1:0xBC/0x83
+S:0xE2:0xBC/0x8A
+S:0xE3:0xBC/0x8B
+S:0xE4:0xBC/0x87
+S:0xE5:0xBC/0x86
+S:0xE6:0xBC/0x85
+S:0xE7:0xBC/0x89
+S:0xE8:0xBC/0x84
+S:0xE9:0xBC/0x83
+S:0xEA:0xBC/0x8E
+S:0xEB:0xBC/0x88
+S:0xEC:0xBC/0x8B
+S:0xED:0xBC/0x8C
+S:0xEE:0xBC/0x8D
+S:0xEF:0xBC/0x89
+
+# Food (,)
+S:0xF0:0xBA/0x84
+S:0xF1:0xBA/0x85
+S:0xF2:0xBA/0x85
+S:0xF3:0xBA/0x86
+S:0xF4:0xBA/0x81
+S:0xF5:0xBA/0x82
+S:0xF6:0xBA/0x80
+S:0xF7:0xBA/0x87
+S:0xF8:0xBA/0x84
+S:0xF9:0xBA/0x85
+S:0xFA:0xBA/0x83
+S:0xFB:0xBA/0x86
+S:0xFC:0xBA/0x81
+S:0xFD:0xBA/0x82
+S:0xFE:0xBA/0x80
+S:0xFF:0xBA/0x87
+
+# Unknown Amulet
+U:40:0xB6/0x81
+
+# Unknown Ring
+U:45:0xB5/0x81
+
+# Unknown Staff
+U:55:0xB9/0x81
+
+# Unknown Wand
+U:65:0xB7/0x81
+
+# Unknown Rod
+U:66:0xB8/0x81
+
+# Unknown Scroll
+U:70:0x86/0x82
+
+# Unknown Potion
+U:75:0xBC/0x85
+
+# Unknown Food
+U:80:0x8B/0x81
+# non-defines encountered :
+# Load the Trap image definitions
+%:trap-xxx.prf
diff --git a/lib/mods/theme/pref/graf.prf b/lib/mods/theme/pref/graf.prf
new file mode 100644
index 00000000..a82ce364
--- /dev/null
+++ b/lib/mods/theme/pref/graf.prf
@@ -0,0 +1,51 @@
+# File: graf.prf
+
+#
+# This file defines special attr/char mappings for use in "graphics" mode
+#
+# This file includes, if appropriate, various "sub-files"
+#
+# See "lib/help/command.txt" and "src/files.c" for more information.
+#
+
+
+##### Standard font file #####
+
+%:font-xxx.prf
+
+
+##### System Specific Subfiles #####
+
+?:[IOR [EQU $SYS xaw] [EQU $SYS x11] [EQU $SYS gtk]]
+%:graf-x11.prf
+
+?:[EQU $SYS gcu]
+%:graf-gcu.prf
+
+?:[EQU $SYS ami]
+%:graf-ami.prf
+
+?:[EQU $SYS mac]
+%:graf-mac.prf
+
+?:[EQU $SYS dos]
+%:graf-dos.prf
+
+?:[EQU $SYS win]
+%:graf-win.prf
+
+?:[EQU $SYS ibm]
+%:graf-ibm.prf
+
+?:[EQU $SYS emx]
+%:graf-emx.prf
+
+?:[EQU $SYS acn]
+%:graf-acn.prf
+
+?:[EQU $SYS sdl]
+%:graf-sdl.prf
+
+?:1
+
+
diff --git a/lib/mods/theme/pref/pref-acn.prf b/lib/mods/theme/pref/pref-acn.prf
new file mode 100644
index 00000000..ae95fe26
--- /dev/null
+++ b/lib/mods/theme/pref/pref-acn.prf
@@ -0,0 +1,24 @@
+# File: pref-acn.prf
+
+# This is a minimal "pref" file for RISC OS
+
+
+# Map cursor keys onto keypad
+
+A:4
+P:^_18C\r
+
+A:6
+P:^_18D\r
+
+A:2
+P:^_18E\r
+
+A:8
+P:^_18F\r
+
+
+# Map F3 to ^S (to be a bit RISC OS-ey)
+
+A:^S
+P:^_183\r
diff --git a/lib/mods/theme/pref/pref-ami.prf b/lib/mods/theme/pref/pref-ami.prf
new file mode 100644
index 00000000..08a1c310
--- /dev/null
+++ b/lib/mods/theme/pref/pref-ami.prf
@@ -0,0 +1,7 @@
+# File: pref-ami.prf
+
+#
+# This file contains various default macros for use with
+# the executable built from "main-ami.c".
+#
+
diff --git a/lib/mods/theme/pref/pref-emx.prf b/lib/mods/theme/pref/pref-emx.prf
new file mode 100644
index 00000000..555c0dbc
--- /dev/null
+++ b/lib/mods/theme/pref/pref-emx.prf
@@ -0,0 +1,19 @@
+# File: pref-emx.prf
+
+#
+# Include "pref-ibm.prf" to get the default macros.
+#
+# Note that, while most key-to-trigger mappings are the same as DOS/Win,
+# some few odd keys will be different or not available at all.
+#
+# Examples: Ctrl-Escape, Alt-PrintScreen
+#
+# What's NOT working: color palette redefinitions.
+#
+
+%:pref-win.prf
+
+
+# shift-5 - rest
+A:R\r
+P:^_Sx4C\r
diff --git a/lib/mods/theme/pref/pref-gcu.prf b/lib/mods/theme/pref/pref-gcu.prf
new file mode 100644
index 00000000..cbc80ada
--- /dev/null
+++ b/lib/mods/theme/pref/pref-gcu.prf
@@ -0,0 +1,70 @@
+# File: pref-gcu.prf
+
+#
+# This file may be included by "pref.prf", when using "main-gcu.prf".
+#
+# It contains macro definitions to allow the VT100 cursor keys to be
+# recognized by Angband. This will also make the "escape" key take a
+# few seconds to recognize, so you may want to use the "`" key instead.
+#
+
+
+### VT100 Keypad ###
+
+
+# Special keypad keys (delete, insert)
+
+A:.
+P:\e[3~
+
+A:0
+P:\e[2~
+
+
+# Numerical keypad keys (map to appropriate number)
+
+A:1
+P:\e[4~
+P:\e[F
+
+A:2
+P:\e[B
+
+A:3
+P:\e[6~
+
+A:4
+P:\e[D
+
+A:5
+P:\e[G
+
+A:6
+P:\e[C
+
+A:7
+P:\e[1~
+P:\e[H
+
+A:8
+P:\e[A
+
+A:9
+P:\e[5~
+
+
+# Basic function keys (F1 - F4)
+
+A:\e
+P:\eOP
+
+A:\e
+P:\eOQ
+
+A:\e
+P:\eOR
+
+A:\e
+P:\eOS
+
+
diff --git a/lib/mods/theme/pref/pref-mac.prf b/lib/mods/theme/pref/pref-mac.prf
new file mode 100644
index 00000000..88e5618e
--- /dev/null
+++ b/lib/mods/theme/pref/pref-mac.prf
@@ -0,0 +1,243 @@
+# File: pref-mac.prf
+
+#
+# This file is included by "pref.prf" when "main-mac.c" is used.
+#
+# See "lib/help/command.txt" and "src/files.c" for more information.
+#
+
+
+#
+# Macro Trigger configuration
+#
+# T:<trigger template>:<modifiers>:<modifier name1>:<modifier name2>:....
+# '&' in <trigger template> specifies location of modifier character.
+# '#' in <trigger template> specifies location of key code.
+#
+# If <trigger template> is null string, all trigger difinition will be cleared.
+
+T:&#:CSOX:control-:shift-:option-:command-
+
+# T:<trigger name>:<keycode>:<keycode with shiftkey>
+# '\' in <trigger name> is escape character.
+
+T:KP_Decimal:1
+T:KP_Multiply:3
+T:KP_Add:5
+T:KP_Clear:7
+T:KP_Divide:11
+T:KP_Enter:12
+T:KP_Subtract:14
+T:KP_Equal:17
+T:KP_0:18
+T:KP_1:19
+T:KP_2:20
+T:KP_3:21
+T:KP_4:22
+T:KP_5:23
+T:KP_6:24
+T:KP_7:25
+T:KP_8:27
+T:KP_9:28
+T:F5:32
+T:F6:33
+T:F7:34
+T:F3:35
+T:F8:36
+T:F10:37
+T:F11:39
+T:F13:41
+T:F14:43
+T:F9:45
+T:F12:47
+T:F15:49
+T:Help:50
+T:Home:51
+T:Page_Up:52
+T:Delete:53
+T:F4:54
+T:End:55
+T:F2:56
+T:Page_Down:57
+T:F1:58
+T:Left:59
+T:Right:60
+T:Down:61
+T:Up:62
+
+##### Simple Macros #####
+
+
+#
+# Keypad -- (/,*,7,8,9,-,4,5,6,+,1,2,3,0,.)
+#
+
+A:/
+P:^_K/\r
+
+A:*
+P:^_K*\r
+
+A:7
+P:^_K7\r
+
+A:8
+P:^_K8\r
+
+A:9
+P:^_K9\r
+
+A:-
+P:^_K-\r
+
+A:4
+P:^_K4\r
+
+A:5
+P:^_K5\r
+
+A:6
+P:^_K6\r
+
+A:+
+P:^_K+\r
+
+A:1
+P:^_K1\r
+
+A:2
+P:^_K2\r
+
+A:3
+P:^_K3\r
+
+A:0
+P:^_K0\r
+
+A:.
+P:^_K.\r
+
+
+#
+# Shift-Keypad -- Directed running
+#
+
+A:\e\e\\.1
+P:^_S19\r
+
+A:\e\e\\.2
+P:^_S20\r
+
+A:\e\e\\.3
+P:^_S21\r
+
+A:\e\e\\.4
+P:^_S22\r
+
+A:\e\e\\.5
+P:^_S23\r
+
+A:\e\e\\.6
+P:^_S24\r
+
+A:\e\e\\.7
+P:^_S25\r
+
+A:\e\e\\.8
+P:^_S27\r
+
+A:\e\e\\.9
+P:^_S28\r
+
+
+#
+# Control-Keypad -- Directed tunneling
+#
+
+A:\e\e\\+1
+P:^_C19\r
+
+A:\e\e\\+2
+P:^_C20\r
+
+A:\e\e\\+3
+P:^_C21\r
+
+A:\e\e\\+4
+P:^_C22\r
+
+A:\e\e\\+5
+P:^_C23\r
+
+A:\e\e\\+6
+P:^_C24\r
+
+A:\e\e\\+7
+P:^_C25\r
+
+A:\e\e\\+8
+P:^_C27\r
+
+A:\e\e\\+9
+P:^_C28\r
+
+
+
+#
+# Option-Control-Keypad -- wield {@0} and tunnel
+#
+
+A:\e\ew0\s\s\\+1
+P:^_CO19\r
+
+A:\e\ew0\s\s\\+2
+P:^_CO20\r
+
+A:\e\ew0\s\s\\+3
+P:^_CO21\r
+
+A:\e\ew0\s\s\\+4
+P:^_CO22\r
+
+A:\e\ew0\s\s\\+5
+P:^_CO23\r
+
+A:\e\ew0\s\s\\+6
+P:^_CO24\r
+
+A:\e\ew0\s\s\\+7
+P:^_CO25\r
+
+A:\e\ew0\s\s\\+8
+P:^_CO27\r
+
+A:\e\ew0\s\s\\+9
+P:^_CO28\r
+
+
+#
+# Option-Control-Keypad-Zero -- wield {@0}
+#
+
+A:\e\ew0\s
+P:^_CO18\r
+
+
+
+#
+# Hack -- Arrow-Keys
+#
+
+A:4
+P:^_59\r
+
+A:6
+P:^_60\r
+
+A:2
+P:^_61\r
+
+A:8
+P:^_62\r
+
+
diff --git a/lib/mods/theme/pref/pref-sdl.prf b/lib/mods/theme/pref/pref-sdl.prf
new file mode 100644
index 00000000..3bc0f030
--- /dev/null
+++ b/lib/mods/theme/pref/pref-sdl.prf
@@ -0,0 +1,144 @@
+# File: pref-sdl.prf
+
+# This file implements macros for extended keyboard commands (characters not
+# within the 128 character ASCII set).
+# Basically, if you have to hold down control or alt or it's an arrow key,
+# it will be handled here. This means that we can let SDL worry about figuring
+# out what key is which; all it needs to do is give us the name and we'll map
+# it here.
+#
+# Note the use of "\e\e\e\e" (four escapes) to allow the macros to work
+# even if the game is not yet ready for a command.
+#
+# Note the use of "\\." (for "run") and "\\+" (for "alter"), to make sure
+# that the macros will work regardless of the "keymap" being used.
+#
+
+# Basic Arrow Movement
+
+A:8
+P:\[up]
+
+A:6
+P:\[right]
+
+A:4
+P:\[left]
+
+A:2
+P:\[down]
+
+# Basic Arrows with Shift Down
+
+A:\e\e\e\e\\.8
+P:\[shift-up]
+
+A:\e\e\e\e\\.6
+P:\[shift-right]
+
+A:\e\e\e\e\\.4
+P:\[shift-left]
+
+A:\e\e\e\e\\.2
+P:\[shift-down]
+
+# Basic Arrows with Control Down
+
+A:\e\e\e\e\\+8
+P:\[ctrl-up]
+
+A:\e\e\e\e\\+6
+P:\[ctrl-right]
+
+A:\e\e\e\e\\+4
+P:\[ctrl-left]
+
+A:\e\e\e\e\\+2
+P:\[ctrl-down]
+
+# Keypad
+
+A:1
+P:\[[1]]
+
+A:2
+P:\[[2]]
+
+A:3
+P:\[[3]]
+
+A:4
+P:\[[4]]
+
+A:5
+P:\[[5]]
+
+A:6
+P:\[[6]]
+
+A:7
+P:\[[7]]
+
+A:8
+P:\[[8]]
+
+A:9
+P:\[[9]]
+
+# Keypad With Shift
+
+A:\e\e\e\e\\.1
+P:\[shift-[1]]
+
+A:\e\e\e\e\\.2
+P:\[shift-[2]]
+
+A:\e\e\e\e\\.3
+P:\[shift-[3]]
+
+A:\e\e\e\e\\.4
+P:\[shift-[4]]
+
+A:\e\e\e\e\\.5
+P:\[shift-[5]]
+
+A:\e\e\e\e\\.6
+P:\[shift-[6]]
+
+A:\e\e\e\e\\.7
+P:\[shift-[7]]
+
+A:\e\e\e\e\\.8
+P:\[shift-[8]]
+
+A:\e\e\e\e\\.9
+P:\[shift-[9]]
+
+# Keypad With Control
+
+A:\e\e\e\e\\+1
+P:\[ctrl-[1]]
+
+A:\e\e\e\e\\+2
+P:\[ctrl-[2]]
+
+A:\e\e\e\e\\+3
+P:\[ctrl-[3]]
+
+A:\e\e\e\e\\+4
+P:\[ctrl-[4]]
+
+A:\e\e\e\e\\+5
+P:\[ctrl-[5]]
+
+A:\e\e\e\e\\+6
+P:\[ctrl-[6]]
+
+A:\e\e\e\e\\+7
+P:\[ctrl-[7]]
+
+A:\e\e\e\e\\+8
+P:\[ctrl-[8]]
+
+A:\e\e\e\e\\+9
+P:\[ctrl-[9]]
diff --git a/lib/mods/theme/pref/pref-win.prf b/lib/mods/theme/pref/pref-win.prf
new file mode 100644
index 00000000..7b1501f1
--- /dev/null
+++ b/lib/mods/theme/pref/pref-win.prf
@@ -0,0 +1,534 @@
+# File: pref-ibm.prf
+
+#
+# This file is used by Angband (when it was compiled using "main-ibm.c"
+# or "main-dos.c" or "main-win.c") to specify various "user preferences",
+# including "macros".
+#
+# This file defines some basic macros, which allow the use of the "keypad",
+# alone, and with the shift and/or control modifier keys. All "special"
+# keys are translated by "main-ibm.c" (or "main-win.c") into special "macro
+# triggers" of the encoded form "^_MMMxSS\r", where the "modifier" flags are
+# stored in "MMM", and the two digit hexidecimal scan code of the keypress is
+# stored in "SS".
+#
+# The "main-ibm.prf" and "main-dos.prf" files may not be able to recognize
+# the "/" and "*" keys on the keypad, because it mistakenly classifies the
+# "0x35" and "0x37" codes as the keycodes of "normal" keys.
+#
+# The "main-win.prf" file should not be using the final "control + keypad"
+# section in this file, it was created for "main-ibm.c" and "main-dos.c".
+#
+# The "main-win.prf" file may actually send the "ascii" equivalent of some
+# keypad keys after the keypad key itself, especially if "numlock" is down,
+# which may cause problems. Or it may not, it is hard to tell. This is bad.
+#
+# See "main-ibm.c" and "main-dos.c" and "main-win.c" for more info.
+#
+
+#
+# Macro Trigger configuration
+#
+# T:<trigger template>:<modifiers>:<modifier name1>:<modifier name2>:....
+# '&' in <trigger template> specifies location of modifier character.
+# '#' in <trigger template> specifies location of key code.
+#
+# If <trigger template> is null string, all trigger difinition will be cleared.
+
+T:&x#:CSA:control-:shift-:alt-
+
+# T:<trigger name>:<keycode>:<keycode with shiftkey>
+# '\' in <trigger name> is escape character.
+
+# These keycodes are actually direct keyboard scan code taken from the 'dinput.h'.
+
+?:[EQU $KEYBOARD JAPAN]
+# For Japanese keyboard.
+T:-:0C
+T:^:0D
+T:@:1A
+T:[:1B
+T:;:27
+T:\::28
+T:]:2B
+T:,:33
+T:.:34
+T:\/:35
+T:_:73
+?:1
+
+?:[EQU $KEYBOARD 0]
+# For US keyboard.
+T:-:0C
+T:=:0D
+T:[:1A
+T:]:1B
+T:;:27
+T:\':28
+T:`:29
+T:\\:2B
+T:,:33
+T:.:34
+T:\/:35
+?:1
+
+############
+# Common keycodes (except NEC PC-98x1)
+
+?:[NOT [EQU $KEYBOARD NEC98]]
+T:1:02
+T:2:03
+T:3:04
+T:4:05
+T:5:06
+T:6:07
+T:7:08
+T:8:09
+T:9:0A
+T:0:0B
+T:Backspace:0E
+T:Q:10
+T:W:11
+T:E:12
+T:R:13
+T:T:14
+T:Y:15
+T:U:16
+T:I:17
+T:O:18
+T:P:19
+T:Enter:1C
+T:A:1E
+T:S:1F
+T:D:20
+T:F:21
+T:G:22
+T:H:23
+T:J:24
+T:K:25
+T:L:26
+T:Zenkaku_Hankaku:29
+T:Z:2C
+T:X:2D
+T:C:2E
+T:V:2F
+T:B:30
+T:N:31
+T:M:32
+T:KP_Multiply:37
+T:CapsLock:3A
+T:F1:3B
+T:F2:3C
+T:F3:3D
+T:F4:3E
+T:F5:3F
+T:F6:40
+T:F7:41
+T:F8:42
+T:F9:43
+T:F10:44
+T:Numlock:45
+T:Scroll:46
+#T:KP_7:47
+T:Home:47
+#T:KP_8:48
+T:Up:48
+#T:KP_9:49
+T:Page_Up:49
+T:KP_Subtract:4A
+#T:KP_4:4B
+T:Left:4B
+T:KP_5:4C
+#T:KP_6:4D
+T:Right:4D
+T:KP_Add:4E
+#T:KP_1:4F
+T:End:4F
+#T:KP_2:50
+T:Down:50
+#T:KP_3:51
+T:Page_Down:51
+#T:KP_0:52
+T:Insert:52
+#T:KP_Decimal:53
+T:Delete:53
+T:Oem_102:56
+T:F11:57
+T:F12:58
+T:Menu:5D
+T:F13:64
+T:F14:65
+T:F15:66
+T:Hiragana_Katakana:70
+T:Abnt_C1:73
+T:Henkan:79
+T:Muhenkan:7B
+T:Yen:7D
+T:Abnt_C2:7E
+T:KP_equals:8D
+T:Prevtrack:90
+T:Kanji:94
+T:Stop:95
+T:Ax:96
+T:Unlabeled:97
+T:Nexttrack:99
+T:KP_Enter:9C
+T:Mute:A0
+T:Calculator:A1
+T:Playpause:A2
+T:Mediastop:A4
+T:Volumedown:AE
+T:Volumeup:B0
+T:Webhome:B2
+T:KP_Comma:B3
+T:KP_Divide:B5
+T:Sys_Req:B7
+T:Pause:C5
+#T:Home:C7
+#T:Up:C8
+#T:Prior:C9
+#T:Left:CB
+#T:Right:CD
+#T:End:CF
+#T:Down:D0
+#T:Next:D1
+#T:Insert:D2
+#T:Delete:D3
+T:Lwin:DB
+T:Rwin:DC
+T:Apps:DD
+T:Power:DE
+T:Sleep:DF
+T:Wake:E3
+T:Websearch:E5
+T:Webfavorites:E6
+T:Webrefresh:E7
+T:Webstop:E8
+T:Webforward:E9
+T:Webback:EA
+T:Mycomputer:EB
+T:Mail:EC
+T:Mediaselect:ED
+?:1
+
+
+######################
+# For NEC PC-98x1
+
+?:[EQU $KEYBOARD NEC98]
+T:1:01
+T:2:02
+T:3:03
+T:4:04
+T:5:05
+T:6:06
+T:7:07
+T:8:08
+T:9:09
+T:0:0A
+T:-:0B
+T:^:0C
+T:Yen:0D
+T:Backspace:0E
+T:Q:10
+T:W:11
+T:E:12
+T:R:13
+T:T:14
+T:Y:15
+T:U:16
+T:I:17
+T:O:18
+T:P:19
+T:@:1a
+T:[:1b
+T:Enter:1C
+T:A:1D
+T:S:1E
+T:D:1F
+T:F:20
+T:G:21
+T:H:22
+T:J:23
+T:K:24
+T:L:25
+T:;:26
+T:\::27
+T:[:28
+T:Z:29
+T:X:2A
+T:C:2B
+T:V:2C
+T:B:2D
+T:N:2E
+T:M:2F
+T:,:30
+T:.:31
+T:\/:32
+T:_:33
+T:Henkan:35
+T:Page_Down:36
+T:Page_Up:37
+T:Insert:38
+T:Delete:39
+T:Up:3A
+T:Left:3B
+T:Right:3C
+T:Down:3D
+T:Home:3E
+T:End:3F
+T:KP_Subtract:40
+T:KP_Divide:41
+T:KP_7:42
+T:KP_8:43
+T:KP_9:44
+T:KP_Multiply:45
+T:KP_4:46
+T:KP_5:47
+T:KP_6:48
+T:KP_Add:49
+T:KP_1:4A
+T:KP_2:4B
+T:KP_3:4C
+T:KP_Equal:4D
+T:KP_0:4E
+T:KP_Comma:4F
+T:KP_Decimal:50
+T:Muhenkan:51
+T:F11:52
+T:F12:53
+T:F13:54
+T:F14:55
+T:F15:56
+T:Pause:60
+T:F1:62
+T:F2:63
+T:F3:64
+T:F4:65
+T:F5:66
+T:F6:67
+T:F7:68
+T:F8:69
+T:F9:6A
+T:F10:6B
+T:CapsLock:71
+T:Hiragana_Katakana:72
+T:Menu:79
+
+?:[NOT [EQU $KEYBOARD NEC98]]
+
+
+#
+# Hack -- Some foreign keyboards have a special key on the keyboard, which
+# is used to generate the "<", ">", and "|" keys (alone, shifted, alt-ed).
+#
+
+A:<
+P:^_x56\r
+
+A:>
+P:^_Sx56\r
+
+A:|
+P:^_Ax56\r
+
+
+#
+# Keypad (/,*,7,8,9,-,4,5,6,+,1,2,3,0,.)
+#
+
+A:/
+P:^_x35\r
+
+A:*
+P:^_x37\r
+
+A:7
+P:^_x47\r
+
+A:8
+P:^_x48\r
+
+A:9
+P:^_x49\r
+
+A:-
+P:^_x4A\r
+
+A:4
+P:^_x4B\r
+
+A:5
+P:^_x4C\r
+
+A:6
+P:^_x4D\r
+
+A:+
+P:^_x4E\r
+
+A:1
+P:^_x4F\r
+
+A:2
+P:^_x50\r
+
+A:3
+P:^_x51\r
+
+A:0
+P:^_x52\r
+
+A:.
+P:^_x53\r
+
+
+#
+# Shift + Keypad (/,*,7,8,9,-,4,5,6,+,1,2,3,0,.)
+#
+
+A:\e\e\e
+P:^_Sx35\r
+
+A:\e\e\e
+P:^_Sx37\r
+
+A:\e\e\\.7
+P:^_Sx47\r
+
+A:\e\e\\.8
+P:^_Sx48\r
+
+A:\e\e\\.9
+P:^_Sx49\r
+
+A:\e\e\e
+P:^_Sx4A\r
+
+A:\e\e\\.4
+P:^_Sx4B\r
+
+A:\e\e\\.5
+P:^_Sx4C\r
+
+A:\e\e\\.6
+P:^_Sx4D\r
+
+A:\e\e\e
+P:^_Sx4E\r
+
+A:\e\e\\.1
+P:^_Sx4F\r
+
+A:\e\e\\.2
+P:^_Sx50\r
+
+A:\e\e\\.3
+P:^_Sx51\r
+
+A:\e\e\e
+P:^_Sx52\r
+
+A:\e\e\e
+P:^_Sx53\r
+
+
+#
+# Control + Keypad (/,*,7,8,9,-,4,5,6,+,1,2,3,0,.)
+#
+
+A:\e\e\e
+P:^_Cx35\r
+
+A:\e\e\e
+P:^_Cx37\r
+
+A:\e\e\\+7
+P:^_Cx47\r
+
+A:\e\e\\+8
+P:^_Cx48\r
+
+A:\e\e\\+9
+P:^_Cx49\r
+
+A:\e\e\e
+P:^_Cx4A\r
+
+A:\e\e\\+4
+P:^_Cx4B\r
+
+A:\e\e\\+5
+P:^_Cx4C\r
+
+A:\e\e\\+6
+P:^_Cx4D\r
+
+A:\e\e\e
+P:^_Cx4E\r
+
+A:\e\e\\+1
+P:^_Cx4F\r
+
+A:\e\e\\+2
+P:^_Cx50\r
+
+A:\e\e\\+3
+P:^_Cx51\r
+
+A:\e\e\e
+P:^_Cx52\r
+
+A:\e\e\e
+P:^_Cx53\r
+
+
+#
+# Control + Keypad (/,*,7,8,9,-,4,5,6,+,1,2,3,0,.)
+#
+
+A:\e\e\e
+P:^_Cx95\r
+
+A:\e\e\e
+P:^_Cx96\r
+
+A:\e\e\\+7
+P:^_Cx77\r
+
+A:\e\e\\+8
+P:^_Cx8D\r
+
+A:\e\e\\+9
+P:^_Cx84\r
+
+A:\e\e\e
+P:^_Cx8E\r
+
+A:\e\e\\+4
+P:^_Cx73\r
+
+A:\e\e\\+5
+P:^_Cx8F\r
+
+A:\e\e\\+6
+P:^_Cx74\r
+
+A:\e\e\e
+P:^_Cx90\r
+
+A:\e\e\\+1
+P:^_Cx75\r
+
+A:\e\e\\+2
+P:^_Cx91\r
+
+A:\e\e\\+3
+P:^_Cx76\r
+
+A:\e\e\e
+P:^_Cx92\r
+
+A:\e\e\e
+P:^_Cx93\r
+
diff --git a/lib/mods/theme/pref/pref-x11.prf b/lib/mods/theme/pref/pref-x11.prf
new file mode 100644
index 00000000..f4df9376
--- /dev/null
+++ b/lib/mods/theme/pref/pref-x11.prf
@@ -0,0 +1,413 @@
+# File: pref-x11.prf
+
+#
+# This file provides some macros for use with versions of Angband compiled
+# using the "main-x11.c" (or "main-xaw.c") file.
+#
+# Note the use of "\e\e\e\e" (four escapes) to allow the macros to work
+# even if the game is not yet ready for a command.
+#
+# Note the use of "\\." (for "run") and "\\+" (for "alter"), to make sure
+# that the macros will work regardless of the "keymap" being used.
+#
+
+#
+# Macro Trigger configuration
+#
+# T:<trigger template>:<modifiers>:<modifier name1>:<modifier name2>:....
+# '&' in <trigger template> specifies location of modifier character.
+# '#' in <trigger template> specifies location of key code.
+#
+# If <trigger template> is null string, all trigger difinition will be cleared.
+
+T:&_#:NSOM:control-:shift-:alt-:mod2-
+
+# T:<trigger name>:<keycode>:<keycode with shiftkey>
+# '\' in <trigger name> is escape character.
+
+T:Clear:FF0B
+T:Pause:FF13
+T:Scroll_Lock:FF14
+T:Sys_Req:FF15
+T:Escape:FF1B
+T:Delete:FFFF
+T:Multi_Key:FF20
+T:Codeinput:FF37
+T:SingleCandidate:FF3C
+T:MultipleCandidate:FF3D
+T:PreviousCandidate:FF3E
+T:Kanji:FF21
+T:Muhenkan:FF22
+T:Henkan:FF23
+T:Henkan_Mode:FF23
+T:Romaji:FF24
+T:Hiragana:FF25
+T:Katakana:FF26
+T:Hiragana_Katakana:FF27
+T:Zenkaku:FF28
+T:Hankaku:FF29
+T:Zenkaku_Hankaku:FF2A
+T:Touroku:FF2B
+T:Massyo:FF2C
+T:Kana_Lock:FF2D
+T:Kana_Shift:FF2E
+T:Eisu_Shift:FF2F
+T:Eisu_Toggle:FF30
+T:Kanji_Bangou:FF37
+T:Zen_Koho:FF3D
+T:Mae_Koho:FF3E
+T:Home:FF50
+T:Left:FF51
+T:Up:FF52
+T:Right:FF53
+T:Down:FF54
+T:Page_Up:FF55
+T:Page_Down:FF56
+T:End:FF57
+T:Begin:FF58
+T:Select:FF60
+T:Print:FF61
+T:Execute:FF62
+T:Insert:FF63
+T:Undo:FF65
+T:Redo:FF66
+T:Menu:FF67
+T:Find:FF68
+T:Cancel:FF69
+T:Help:FF6A
+T:Break:FF6B
+T:Mode_Switch:FF7E
+T:Num_Lock:FF7F
+T:KP_Space:FF80
+T:KP_Tab:FF89
+T:KP_Enter:FF8D
+T:KP_F1:FF91
+T:KP_F2:FF92
+T:KP_F3:FF93
+T:KP_F4:FF94
+T:KP_Home:FF95
+T:KP_Left:FF96
+T:KP_Up:FF97
+T:KP_Right:FF98
+T:KP_Down:FF99
+T:KP_Page_Up:FF9A
+T:KP_Page_Down:FF9B
+T:KP_End:FF9C
+T:KP_Begin:FF9D
+T:KP_Insert:FF9E
+T:KP_Delete:FF9F
+T:KP_Equal:FFBD
+T:KP_Multiply:FFAA
+T:KP_Add:FFAB
+T:KP_Comma:FFAC
+T:KP_Subtract:FFAD
+T:KP_Decimal:FFAE
+T:KP_Divide:FFAF
+T:KP_0:FFB0
+T:KP_1:FFB1
+T:KP_2:FFB2
+T:KP_3:FFB3
+T:KP_4:FFB4
+T:KP_5:FFB5
+T:KP_6:FFB6
+T:KP_7:FFB7
+T:KP_8:FFB8
+T:KP_9:FFB9
+T:F1:FFBE
+T:F2:FFBF
+T:F3:FFC0
+T:F4:FFC1
+T:F5:FFC2
+T:F6:FFC3
+T:F7:FFC4
+T:F8:FFC5
+T:F9:FFC6
+T:F10:FFC7
+T:F11:FFC8
+T:F12:FFC9
+T:F13:FFCA
+T:F14:FFCB
+T:F15:FFCC
+T:F16:FFCD
+T:F17:FFCE
+T:F18:FFCF
+T:F19:FFD0
+T:F20:FFD1
+T:F21:FFD2
+T:F22:FFD3
+T:F23:FFD4
+T:F24:FFD5
+T:F25:FFD6
+T:F26:FFD7
+T:F27:FFD8
+T:F28:FFD9
+T:F29:FFDA
+T:F30:FFDB
+T:F31:FFDC
+T:F32:FFDD
+T:F33:FFDE
+T:F34:FFDF
+T:F35:FFE0
+
+T:\::3A:2A
+T:*:3A:2A
+T:;:3B:2B
+T:+:3B:2B
+T:,:2C:3C
+T:<:2C:3C
+T:-:2D:3D
+T:=:2D:3D
+T:.:2E:3E
+T:>:2E:3E
+T:\/:2F:3F
+T:?:2F:3F
+T:0:30:7E
+T:~:30:7E
+T:1:31:21
+T:!:31:21
+T:2:32:22
+T:":32:22
+T:3:33:23
+T:#:33:23
+T:4:34:24
+T:$:34:24
+T:5:35:25
+T:%:35:25
+T:6:36:26
+T:&:36:26
+T:7:37:27
+T:\':37:27
+T:8:38:28
+T:(:38:28
+T:9:39:29
+T:):39:29
+T:@:40:60
+T:`:40:60
+T:A:61:41
+T:B:62:42
+T:C:63:43
+T:D:64:44
+T:E:65:45
+T:F:66:46
+T:G:67:47
+T:H:68:48
+T:I:69:49
+T:J:6A:4A
+T:K:6B:4B
+T:L:6C:4C
+T:M:6D:4D
+T:N:6E:4E
+T:O:6F:4F
+T:P:70:50
+T:Q:71:51
+T:R:72:52
+T:S:73:53
+T:T:74:54
+T:U:75:55
+T:V:76:56
+T:W:77:57
+T:X:78:58
+T:Y:79:59
+T:Z:7A:5A
+T:[:5B:7B
+T:{:5B:7B
+T:\\:5C:5F
+T:_:5C:5F
+T:]:5D:7D
+T:}:5D:7D
+T:^:5E:7E
+T:~:5E:7E
+T:|:A5:7C
+
+
+# Keypad (0-9)
+
+A:0
+P:^__FFB0\r
+P:^__FF63\r
+P:^__????\r
+P:^__FF9E\r
+
+A:1
+P:^__FFB1\r
+P:^__FF57\r
+P:^__FFDE\r
+P:^__FF9C\r
+
+A:2
+P:^__FFB2\r
+P:^__FF54\r
+P:^__FFDF\r
+P:^__FF99\r
+
+A:3
+P:^__FFB3\r
+P:^__FF56\r
+P:^__FFE0\r
+P:^__FF9B\r
+
+A:4
+P:^__FFB4\r
+P:^__FF51\r
+P:^__FFDB\r
+P:^__FF96\r
+
+A:5
+P:^__FFB5\r
+P:^__FF80\r
+P:^__FFDC\r
+P:^__FF9D\r
+
+A:6
+P:^__FFB6\r
+P:^__FF53\r
+P:^__FFDD\r
+P:^__FF98\r
+
+A:7
+P:^__FFB7\r
+P:^__FF50\r
+P:^__FFD8\r
+P:^__FF95\r
+
+A:8
+P:^__FFB8\r
+P:^__FF52\r
+P:^__FFD9\r
+P:^__FF97\r
+
+A:9
+P:^__FFB9\r
+P:^__FF55\r
+P:^__FFDA\r
+P:^__FF9A\r
+
+
+# Shift-Keypad (0-9)
+
+A:\e\e\e\e\\.0
+P:^_S_FFB0\r
+P:^_S_FF63\r
+P:^_S_????\r
+P:^_S_FF9E\r
+
+A:\e\e\e\e\\.1
+P:^_S_FFB1\r
+P:^_S_FF57\r
+P:^_S_FFDE\r
+P:^_S_FF9C\r
+
+A:\e\e\e\e\\.2
+P:^_S_FFB2\r
+P:^_S_FF54\r
+P:^_S_FFDF\r
+P:^_S_FF99\r
+
+A:\e\e\e\e\\.3
+P:^_S_FFB3\r
+P:^_S_FF56\r
+P:^_S_FFE0\r
+P:^_S_FF9B\r
+
+A:\e\e\e\e\\.4
+P:^_S_FFB4\r
+P:^_S_FF51\r
+P:^_S_FFDB\r
+P:^_S_FF96\r
+
+A:\e\e\e\e\\.5
+P:^_S_FFB5\r
+P:^_S_FF80\r
+P:^_S_FFDC\r
+P:^_S_????\r
+
+A:\e\e\e\e\\.6
+P:^_S_FFB6\r
+P:^_S_FF53\r
+P:^_S_FFDD\r
+P:^_S_FF98\r
+
+A:\e\e\e\e\\.7
+P:^_S_FFB7\r
+P:^_S_FF50\r
+P:^_S_FFD8\r
+P:^_S_FF95\r
+
+A:\e\e\e\e\\.8
+P:^_S_FFB8\r
+P:^_S_FF52\r
+P:^_S_FFD9\r
+P:^_S_FF97\r
+
+A:\e\e\e\e\\.9
+P:^_S_FFB9\r
+P:^_S_FF55\r
+P:^_S_FFDA\r
+P:^_S_FF9A\r
+
+
+# Control-Keypad (0-9)
+
+A:\e\e\e\e\\+0
+P:^_N_FFB0\r
+P:^_N_FF63\r
+P:^_N_????\r
+P:^_N_FF9E\r
+
+A:\e\e\e\e\\+1
+P:^_N_FFB1\r
+P:^_N_FF57\r
+P:^_N_FFDE\r
+P:^_N_FF9C\r
+
+A:\e\e\e\e\\+2
+P:^_N_FFB2\r
+P:^_N_FF54\r
+P:^_N_FFDF\r
+P:^_N_FF99\r
+
+A:\e\e\e\e\\+3
+P:^_N_FFB3\r
+P:^_N_FF56\r
+P:^_N_FFE0\r
+P:^_N_FF9B\r
+
+A:\e\e\e\e\\+4
+P:^_N_FFB4\r
+P:^_N_FF51\r
+P:^_N_FFDB\r
+P:^_N_FF96\r
+
+A:\e\e\e\e\\+5
+P:^_N_FFB5\r
+P:^_N_FF80\r
+P:^_N_FFDC\r
+P:^_N_????\r
+
+A:\e\e\e\e\\+6
+P:^_N_FFB6\r
+P:^_N_FF53\r
+P:^_N_FFDD\r
+P:^_N_FF98\r
+
+A:\e\e\e\e\\+7
+P:^_N_FFB7\r
+P:^_N_FF50\r
+P:^_N_FFD8\r
+P:^_N_FF95\r
+
+A:\e\e\e\e\\+8
+P:^_N_FFB8\r
+P:^_N_FF52\r
+P:^_N_FFD9\r
+P:^_N_FF97\r
+
+A:\e\e\e\e\\+9
+P:^_N_FFB9\r
+P:^_N_FF55\r
+P:^_N_FFDA\r
+P:^_N_FF9A\r
+
+
+
+
diff --git a/lib/mods/theme/pref/pref.prf b/lib/mods/theme/pref/pref.prf
new file mode 100644
index 00000000..a6bfdbe1
--- /dev/null
+++ b/lib/mods/theme/pref/pref.prf
@@ -0,0 +1,311 @@
+# File: pref.prf
+
+#
+# This file defines "default" actions of various kinds
+#
+# This file includes, if appropriate, various "sub-files"
+#
+# See "lib/help/command.txt" and "src/files.c" for more information.
+#
+# Note that the "X" key is mapped in both keysets to the key sequence
+# "w0", which will "swap weapons" as long as both weapons contain the
+# inscription "@0". For example, inscribe your main weapon as "@1@0"
+# and your digger (or secondary weapon) as "@2@0".
+#
+
+
+##### Force certain options #####
+
+## # Option -- Default to original commands
+## X:rogue_like_commands
+
+## # Option -- Default to roguelike commands
+## Y:rogue_like_commands
+
+
+##### Original Keyset Mappings #####
+
+# Stay still
+A:,
+C:0:5
+
+# Movement
+A:;1
+C:0:1
+A:;2
+C:0:2
+A:;3
+C:0:3
+A:;4
+C:0:4
+A:;6
+C:0:6
+A:;7
+C:0:7
+A:;8
+C:0:8
+A:;9
+C:0:9
+
+# Hack -- Return
+A:\r
+C:0:^J
+
+# Hack -- Commit suicide
+A:Q
+C:0:^K
+
+# Hack -- Commit suicide
+A:Q
+C:0:^C
+
+
+##### Roguelike Keyset Mappings #####
+
+# Run
+A:.
+C:1:,
+
+# Stay still
+A:,
+C:1:.
+
+# Stay still
+A:,
+C:1:5
+
+# Movement
+A:;1
+C:1:1
+A:;2
+C:1:2
+A:;3
+C:1:3
+A:;4
+C:1:4
+A:;6
+C:1:6
+A:;7
+C:1:7
+A:;8
+C:1:8
+A:;9
+C:1:9
+
+# Movement (rogue keys)
+A:;1
+C:1:b
+A:;2
+C:1:j
+A:;3
+C:1:n
+A:;4
+C:1:h
+A:;6
+C:1:l
+A:;7
+C:1:y
+A:;8
+C:1:k
+A:;9
+C:1:u
+
+# Running (shift + rogue keys)
+A:.1
+C:1:B
+A:.2
+C:1:J
+A:.3
+C:1:N
+A:.4
+C:1:H
+A:.6
+C:1:L
+A:.7
+C:1:Y
+A:.8
+C:1:K
+A:.9
+C:1:U
+
+# Altering (control + rogue keys)
+A:+1
+C:1:^B
+A:+2
+C:1:^J
+A:+3
+C:1:^N
+A:+4
+C:1:^H
+A:+6
+C:1:^L
+A:+7
+C:1:^Y
+A:+8
+C:1:^K
+A:+9
+C:1:^U
+
+# Allow use of the "tunnel" command
+A:T
+C:1:^T
+
+# Allow use of the "destroy" command
+A:k
+C:1:^D
+
+# Locate player on map
+A:L
+C:1:W
+
+# Browse a book (Peruse)
+A:b
+C:1:P
+
+# Toggle search mode
+A:S
+C:1:#
+
+# Use a staff (Zap)
+A:u
+C:1:Z
+
+# Take off equipment
+A:t
+C:1:T
+
+# Fire an item
+A:f
+C:1:t
+
+# Bash a door (Force)
+A:B
+C:1:f
+
+# Look around (examine)
+A:l
+C:1:x
+
+# Aim a wand (Zap)
+A:a
+C:1:z
+
+# Zap a rod (Activate)
+A:z
+C:1:a
+
+# Hack -- Commit suicide
+A:Q
+C:1:^C
+
+# Hack - race/mutation power activation
+A:U
+C:1:O
+
+# Sacrifice at an altar
+A:O
+C:1:^g
+
+# Hack up a corpse
+A:h
+C:1:$
+
+# Cure meat
+A:K
+C:1:^O
+
+# Pet commands
+A:P
+C:1:X
+
+# Engrave
+A:x
+C:1:]
+
+# Steal
+A:Z
+C:1:[
+
+# Drink from a fountain
+A:H
+C:1:V
+
+# Give item
+A:y
+C:1:'
+
+# Chat
+A:Y
+C:1:(
+
+# Command line
+A:#
+C:1:)
+
+# Record command
+A:$
+C:1:S
+
+
+### Extended macros ###
+
+# Note that : and ' can only be included in triggers if they are
+# within quotes (i.e. as ':' or ''').
+
+L:-8192:help:Show this help
+L:-8192:?
+L:-8192:'''
+L:-8191:irc_on:Connect to IRC
+L:-8191:C
+L:-8190:irc_say:Speak on IRC
+L:-8190:@
+L:-8190:':'
+L:-8189:irc_off:Disconnect from IRC
+L:-8188:time:Get the current game time
+L:-8188:T
+L:-8187:skills:Check skills
+L:-8187:S
+L:-8186:html-dump:Save an html screenshot
+L:-8186:D
+L:-8184:quest:Show quest list
+L:-8184:Q
+L:-8183:blunder:Walk without disarming
+L:-8183:B
+L:-8182:ability:Check abilities
+L:-8182:A
+L:y:give:Give an object to a monster
+L:Y:chat:Talk to a monster
+L:j:jam:Jam a door
+
+##### System Specific Subfiles #####
+
+?:[IOR [EQU $SYS xaw] [EQU $SYS x11] [EQU $SYS gtk2]]
+%:pref-x11.prf
+
+?:[EQU $SYS gcu]
+%:pref-gcu.prf
+
+?:[EQU $SYS ami]
+%:pref-ami.prf
+
+?:[EQU $SYS mac]
+%:pref-mac.prf
+
+?:[IOR [EQU $SYS win] [EQU $SYS dos] [EQU $SYS ibm]]
+%:pref-win.prf
+
+?:[EQU $SYS emx]
+%:pref-emx.prf
+
+?:[EQU $SYS acn]
+%:pref-acn.prf
+
+?:[EQU $SYS sdl]
+%:pref-sdl.prf
+
+?:[EQU $SYS pgu]
+%:pref-pgu.prf
+
+?:1
+
+
diff --git a/lib/mods/theme/pref/trap-xxx.prf b/lib/mods/theme/pref/trap-xxx.prf
new file mode 100644
index 00000000..f4d699a0
--- /dev/null
+++ b/lib/mods/theme/pref/trap-xxx.prf
@@ -0,0 +1,428 @@
+# Prf file for use with the 8x8 tiles to define
+# trap image locations. Separated out from main
+# graphics definitions due to the G:T:num:y:x
+# instead of T:num:y:x (major problems if this
+# file is opened in the TileAssigner)
+
+# Weakness Traps
+G:T:1:0x82:0x9E
+G:T:2:0x82:0x9E
+G:T:3:0x82:0x9E
+
+# Intelligence Traps
+G:T:4:0x82:0x9E
+G:T:5:0x82:0x9E
+G:T:6:0x82:0x9E
+
+# Wisdom Traps
+G:T:7:0x82:0x9E
+G:T:8:0x82:0x9E
+G:T:9:0x82:0x9E
+
+# Fumbling Fingers Traps
+G:T:10:0x82:0x9E
+G:T:11:0x82:0x9E
+G:T:12:0x82:0x9E
+
+# Wasting Traps
+G:T:13:0x82:0x9E
+G:T:14:0x82:0x9E
+G:T:15:0x82:0x9E
+
+# Beauty Traps
+G:T:16:0x82:0x9E
+G:T:17:0x82:0x9E
+G:T:18:0x82:0x9E
+
+# Trap of Curse Weapon
+G:T:20:0xA2:0x92
+
+# Trap of Curse Armor
+G:T:21:0xA2:0x92
+
+# Earthquake Trap
+G:T:22:0xA2:0x87
+
+# Poison Needle Trap
+G:T:23:0xA2:0x8B
+
+# Summon Monster Trap
+G:T:24:0xA2:0x89
+
+# Summon Undead Trap
+G:T:25:0xA2:0x89
+
+# Summon Greater Undead Trap
+G:T:26:0xA2:0x89
+
+# Teleport Trap
+G:T:27:0x8A:0x9C
+
+# Paralyzing Trap
+G:T:28:0xA2:0x8B
+
+# Explosive Device
+G:T:29:0xA2:0x8B
+
+# Teleport Item Trap
+G:T:30:0x8A:0x9C
+
+# Lose Memory Trap
+G:T:31:0xA2:0x8B
+
+# Bitter Regret Trap
+G:T:32:0xA2:0x8B
+
+# Bowel Cramps Trap
+G:T:33:0xA2:0x8B
+
+# Blindness/Confusion Trap
+G:T:34:0xA2:0x8B
+
+# Aggravation Trap
+G:T:35:0xA2:0x87
+
+# Multiplication Trap
+G:T:36:0xA2:0x87
+
+# Steal Item Trap
+G:T:37:0xA2:0x92
+
+# Summon Fast Quylthulgs Trap
+G:T:38:0xA2:0x89
+
+# Trap of Sinking
+G:T:39:0x8A:0x9C
+
+# Trap of Mana Drain
+G:T:40:0xA2:0x8B
+
+# Trap of Missing Money
+G:T:41:0xA2:0x92
+
+# Trap of No Return
+G:T:42:0xA2:0x92
+
+# Trap of Silent Switching
+G:T:43:0xA2:0x92
+
+# Trap of Walls
+G:T:44:0xA2:0x87
+
+# Trap of Calling Out
+G:T:45:0xA2:0x89
+
+# Trap of Sliding
+G:T:46:0xA2:0x8B
+
+# Trap of Charges Drain
+G:T:47:0xA2:0x92
+
+# Trap of Stair Movement
+G:T:48:0xA2:0x87
+
+# Trap of New Trap
+G:T:49:0xA2:0x87
+
+# Trap of Scatter Items
+G:T:50:0x8A:0x9C
+
+# Trap of Decay
+G:T:51:0xA2:0x8B
+
+# Trap of Wasting Wands
+G:T:52:0xA2:0x92
+
+# Trap of Filling
+G:T:53:0xA2:0x87
+
+# Trap of Drain Speed
+G:T:54:0xA2:0x92
+
+# Lightning Bolt Trap
+G:T:60:0xA2:0x8C
+
+# Poison Bolt Trap
+G:T:61:0xA2:0x8C
+
+# Acid Bolt Trap
+G:T:62:0xA2:0x8C
+
+# Cold Bolt Trap
+G:T:63:0xA2:0x8C
+
+# Fire Bolt Trap
+G:T:64:0xA2:0x8C
+
+# Plasma Bolt Trap
+G:T:65:0xA2:0x8C
+
+# Water Bolt Trap
+G:T:66:0xA2:0x8C
+
+# Lite Bolt Trap
+G:T:67:0xA2:0x8C
+
+# Dark Bolt Trap
+G:T:68:0xA2:0x8C
+
+# Shards Bolt Trap
+G:T:69:0xA2:0x8C
+
+# Sound Bolt Trap
+G:T:70:0xA2:0x8C
+
+# Confusion Bolt Trap
+G:T:71:0xA2:0x8C
+
+# Force Bolt Trap
+G:T:72:0xA2:0x8C
+
+# Inertia Bolt Trap
+G:T:73:0xA2:0x8C
+
+# Mana Bolt Trap
+G:T:74:0xA2:0x8C
+
+# Ice Bolt Trap
+G:T:75:0xA2:0x8C
+
+# Chaos Bolt Trap
+G:T:76:0xA2:0x8C
+
+# Nether Bolt Trap
+G:T:77:0xA2:0x8C
+
+# Disenchantment Bolt Trap
+G:T:78:0xA2:0x8C
+
+# Nexus Bolt Trap
+G:T:79:0xA2:0x8C
+
+# Time Bolt Trap
+G:T:80:0xA2:0x8C
+
+# Gravity Bolt Trap
+G:T:81:0xA2:0x8C
+
+# Lightning Ball Trap
+G:T:82:0xA2:0x8D
+
+# Poison Ball Trap
+G:T:83:0xA2:0x8D
+
+# Acid Ball Trap
+G:T:84:0xA2:0x8D
+
+# Cold Ball Trap
+G:T:85:0xA2:0x8D
+
+# Fire Ball Trap
+G:T:86:0xA2:0x8D
+
+# Plasma Ball Trap
+G:T:87:0xA2:0x8D
+
+# Water Ball Trap
+G:T:88:0xA2:0x8D
+
+# Light Ball Trap
+G:T:89:0xA2:0x8D
+
+# Darkness Ball Trap
+G:T:90:0xA2:0x8D
+
+# Shards Ball Trap
+G:T:91:0xA2:0x8D
+
+# Sound Ball Trap
+G:T:92:0xA2:0x8D
+
+# Confusion Ball Trap
+G:T:93:0xA2:0x8D
+
+# Force Ball Trap
+G:T:94:0xA2:0x8D
+
+# Inertia Ball Trap
+G:T:95:0xA2:0x8D
+
+# Mana Ball Trap
+G:T:96:0xA2:0x8D
+
+# Ice Ball Trap
+G:T:97:0xA2:0x8D
+
+# Chaos Ball Trap
+G:T:98:0xA2:0x8D
+
+# Nether Ball Trap
+G:T:99:0xA2:0x8D
+
+# Disenchantment Ball Trap
+G:T:100:0xA2:0x8D
+
+# Nexus Ball Trap
+G:T:101:0xA2:0x8D
+
+# Time Ball Trap
+G:T:102:0xA2:0x8D
+
+# Gravity Ball Trap
+G:T:103:0xA2:0x8D
+
+# Arrow Trap
+G:T:110:0xA2:0x8E
+
+# Bolt Trap
+G:T:111:0xA2:0x8E
+
+# Seeker Arrow Trap
+G:T:112:0xA2:0x8E
+
+# Seeker Bolt Trap
+G:T:113:0xA2:0x8E
+
+# Poison Arrow Trap
+G:T:114:0xA2:0x8E
+
+# Poison Bolt Trap
+G:T:115:0xA2:0x8E
+
+# Poison Seeker Arrow Trap
+G:T:116:0xA2:0x8E
+
+# Poison Seeker Bolt Trap
+G:T:117:0xA2:0x8E
+
+# Broken Dagger Trap
+G:T:118:0xA2:0x8E
+
+# Dagger Trap
+G:T:119:0xA2:0x8E
+
+# Poison Broken Dagger Trap
+G:T:120:0xA2:0x8E
+
+# Poison Dagger Trap
+G:T:121:0xA2:0x8E
+
+# Arrows Trap
+G:T:122:0xA2:0x8E
+
+# Bolts Trap
+G:T:123:0xA2:0x8E
+
+# Seeker Arrow Trap
+G:T:124:0xA2:0x8E
+
+# Seeker Bolt Trap
+G:T:125:0xA2:0x8E
+
+# Poison Arrows Trap
+G:T:126:0xA2:0x8E
+
+# Poison Bolt Trap
+G:T:127:0xA2:0x8E
+
+# Poison Seeker Arrows Trap
+G:T:128:0xA2:0x8E
+
+# Poison Seeker Bolts Trap
+G:T:129:0xA2:0x8E
+
+# Broken Daggers Trap
+G:T:130:0xA2:0x8E
+
+# Dagger Trap
+G:T:131:0xA2:0x8E
+
+# Poison Broken Daggers Trap
+G:T:132:0xA2:0x8E
+
+# Poison Daggers Trap
+G:T:133:0xA2:0x8E
+
+# Trap of Drop Item
+G:T:140:0xA2:0x92
+
+# Trap of Drop Items
+G:T:141:0xA2:0x92
+
+# Trap of Drop Everything
+G:T:142:0xA2:0x92
+
+# Trap of Femininity
+G:T:150:0xA2:0x8B
+
+# Trap of Masculinity
+G:T:151:0xA2:0x8B
+
+# Trap of Neutrality
+G:T:152:0xA2:0x8B
+
+# Trap of Aging
+G:T:153:0xA2:0x8B
+
+# Trap of Growing
+G:T:154:0xA2:0x8B
+
+# Trap of Shrinking
+G:T:155:0xA2:0x8B
+
+# Trap of Tanker Drain
+G:T:157:0xA2:0x8B
+
+# Trap of Divine Anger
+G:T:158:0xA2:0x88
+
+# Trap of Divine Wrath
+G:T:159:0xA2:0x88
+
+# Hallucination Trap
+G:T:160:0xA2:0x8B
+
+# Greater Magic Missile Trap
+G:T:161:0xA2:0x8C
+
+# Foulness Trap
+G:T:162:0xA2:0x8C
+
+# Trap of Death Ray
+G:T:163:0xA2:0x8C
+
+# Trap of Holy Fire
+G:T:164:0xA2:0x8C
+
+# Trap of Hell Fire
+G:T:165:0xA2:0x8C
+
+# Psi Bolt Trap
+G:T:166:0xA2:0x8C
+
+# Psi Drain Trap
+G:T:167:0xA2:0x8B
+
+# Plasma (Nuke) Ball Trap
+G:T:168:0xA2:0x8D
+
+# Psi Ball Trap
+G:T:169:0xA2:0x8D
+
+# Aquirement Trap
+G:T:170:0xA2:0x89
+
+# Greater Lightning Bolt Trap
+G:T:171:0xA2:0x8C
+
+# Greater Poison Bolt Trap
+G:T:172:0xA2:0x8C
+
+# Greater Acid Bolt Trap
+G:T:173:0xA2:0x8C
+
+# Greater Cold Bolt Trap
+G:T:174:0xA2:0x8C
+
+# Greater Fire Bolt Trap
+G:T:175:0xA2:0x8C \ No newline at end of file
diff --git a/lib/mods/theme/pref/user.prf b/lib/mods/theme/pref/user.prf
new file mode 100644
index 00000000..9e10b2ac
--- /dev/null
+++ b/lib/mods/theme/pref/user.prf
@@ -0,0 +1,50 @@
+# File: user.prf
+
+#
+# This file defines "override" actions of various kinds
+#
+# This file includes, if appropriate, various "sub-files"
+#
+# See "lib/help/command.txt" and "src/files.c" for more information.
+#
+
+
+## Option -- Force the use of original commands
+#X:rogue_like_commands
+
+## Option -- Force the use of roguelike commands
+#Y:rogue_like_commands
+
+
+##### System Specific Subfiles #####
+
+?:[IOR [EQU $SYS xaw] [EQU $SYS x11]]
+%:user-x11.prf
+
+?:[EQU $SYS gcu]
+%:user-gcu.prf
+
+?:[EQU $SYS ami]
+%:user-ami.prf
+
+?:[EQU $SYS mac]
+%:user-mac.prf
+
+?:[EQU $SYS dos]
+%:user-dos.prf
+
+?:[EQU $SYS ibm]
+%:user-ibm.prf
+
+?:[EQU $SYS win]
+%:user-win.prf
+
+?:[EQU $SYS emx]
+%:user-emx.prf
+
+?:[EQU $SYS acn]
+%:user-acn.prf
+
+?:1
+
+
diff --git a/lib/mods/theme/pref/xtra-gcu.prf b/lib/mods/theme/pref/xtra-gcu.prf
new file mode 100644
index 00000000..7097658e
--- /dev/null
+++ b/lib/mods/theme/pref/xtra-gcu.prf
@@ -0,0 +1,34 @@
+# File: xtra-gcu.prf
+
+# Rename this file to "pref-gcu.prf" to allow the VT100 cursor keys
+# to be recognized by Angband. This will also make the "escape" key
+# take a few seconds to recognize, so you may want to use the "`" key
+# instead, or make a macro from escape+escape to escape.
+
+### VT100 Keypad ###
+
+# Special keypad keys (delete, insert)
+A:.
+P:\e[3~
+A:0
+P:\e[2~
+
+# Numerical keypad keys (map to appropriate number)
+A:1
+P:\e[4~
+A:2
+P:\e[B
+A:3
+P:\e[6~
+A:4
+P:\e[D
+A:5
+P:\e[G
+A:6
+P:\e[C
+A:7
+P:\e[1~
+A:8
+P:\e[A
+A:9
+P:\e[5~
diff --git a/lib/mods/theme/pref/xtra-new.prf b/lib/mods/theme/pref/xtra-new.prf
new file mode 100644
index 00000000..214796cf
--- /dev/null
+++ b/lib/mods/theme/pref/xtra-new.prf
@@ -0,0 +1,63 @@
+# File: xtra-new.prf
+
+#
+# This file defines special attr/char mappings for use in "graphics" mode
+#
+# Edited for use with Adam Bolt's new graphics by Robert Ruehlmann < rr9@angband.org >
+#
+# See "lib/help/command.txt" and "src/files.c" for more information.
+#
+
+
+##### AK 20011216 Default pictures for all races that
+# are not handled below, without caring for class
+
+
+?:[EQU $RACE Human]
+R:0:0x89/0xA0
+?:[EQU $RACE Half-Elf]
+R:0:0x89/0xA1
+?:[EQU $RACE Elf]
+R:0:0x89/0xA2
+?:[EQU $RACE Hobbit]
+R:0:0x89/0xA3
+?:[EQU $RACE Gnome]
+R:0:0x89/0xA4
+?:[EQU $RACE Dwarf]
+R:0:0x89/0xA5
+?:[EQU $RACE Orc]
+R:0:0x89/0xA6
+?:[EQU $RACE Troll]
+R:0:0x89/0xA7
+?:[EQU $RACE Dunadan]
+R:0:0x89/0xA8
+?:[EQU $RACE High-Elf]
+R:0:0x89/0xA9
+?:[EQU $RACE Half-Ogre]
+R:0:0x89/0xAA
+?:[EQU $RACE Beorning]
+R:0:0x89/0xAB
+?:[EQU $RACE Druadan]
+R:0:0x89/0xAC
+?:[EQU $RACE Petty-Dwarf]
+R:0:0x89/0xAD
+?:[EQU $RACE Dark-Elf]
+R:0:0x89/0xAE
+?:[EQU $RACE Ent]
+R:0:0x89/0xAF
+?:[EQU $RACE RohanKnight]
+R:0:0x89/0xB0
+?:[EQU $RACE Eagle]
+R:0:0x89/0xB1
+?:[EQU $RACE Dragon]
+R:0:0x89/0xB2
+?:[EQU $RACE Yeek]
+R:0:0x89/0xB3
+?:[EQU $RACE Wood-Elf]
+R:0:0x89/0xB4
+?:[EQU $RACE Maia]
+R:0:0x89/0xB5
+?:[EQU $RACE Easterling]
+R:0:0x89/0xB6
+?:[EQU $RACE Demon]
+R:0:0x89/0xB7 \ No newline at end of file
diff --git a/lib/mods/theme/pref/xtra-xxx.prf b/lib/mods/theme/pref/xtra-xxx.prf
new file mode 100644
index 00000000..0c6186de
--- /dev/null
+++ b/lib/mods/theme/pref/xtra-xxx.prf
@@ -0,0 +1,137 @@
+# File: xtra-xxx.prf
+
+#
+# This file defines special attr/char mappings for use in "graphics" mode
+#
+# See "lib/help/command.txt" and "src/files.c" for more information.
+#
+
+
+##### Remap the player icon #####
+
+?:[AND [EQU $CLASS Warrior] [EQU $RACE Human] ]
+R:0:0x8C/0x80
+?:[AND [EQU $CLASS Warrior] [EQU $RACE Half-Elf] ]
+R:0:0x8C/0x81
+?:[AND [EQU $CLASS Warrior] [EQU $RACE Elf] ]
+R:0:0x8C/0x82
+?:[AND [EQU $CLASS Warrior] [EQU $RACE Hobbit] ]
+R:0:0x8C/0x83
+?:[AND [EQU $CLASS Warrior] [EQU $RACE Gnome] ]
+R:0:0x8C/0x84
+?:[AND [EQU $CLASS Warrior] [EQU $RACE Dwarf] ]
+R:0:0x8C/0x85
+?:[AND [EQU $CLASS Warrior] [EQU $RACE Half-Orc] ]
+R:0:0x8C/0x86
+?:[AND [EQU $CLASS Warrior] [EQU $RACE Half-Troll] ]
+R:0:0x8C/0x87
+?:[AND [EQU $CLASS Warrior] [EQU $RACE Dunadan] ]
+R:0:0x8C/0x88
+?:[AND [EQU $CLASS Warrior] [EQU $RACE High-Elf] ]
+R:0:0x8C/0x89
+
+?:[AND [EQU $CLASS Mage] [EQU $RACE Human] ]
+R:0:0x8C/0x8A
+?:[AND [EQU $CLASS Mage] [EQU $RACE Half-Elf] ]
+R:0:0x8C/0x8B
+?:[AND [EQU $CLASS Mage] [EQU $RACE Elf] ]
+R:0:0x8C/0x8C
+?:[AND [EQU $CLASS Mage] [EQU $RACE Hobbit] ]
+R:0:0x8C/0x8D
+?:[AND [EQU $CLASS Mage] [EQU $RACE Gnome] ]
+R:0:0x8C/0x8E
+?:[AND [EQU $CLASS Mage] [EQU $RACE Dwarf] ]
+R:0:0x8C/0x8F
+?:[AND [EQU $CLASS Mage] [EQU $RACE Half-Orc] ]
+R:0:0x8C/0x90
+?:[AND [EQU $CLASS Mage] [EQU $RACE Half-Troll] ]
+R:0:0x8C/0x91
+?:[AND [EQU $CLASS Mage] [EQU $RACE Dunadan] ]
+R:0:0x8C/0x92
+?:[AND [EQU $CLASS Mage] [EQU $RACE High-Elf] ]
+R:0:0x8C/0x93
+
+?:[AND [EQU $CLASS Priest] [EQU $RACE Human] ]
+R:0:0x8C/0x94
+?:[AND [EQU $CLASS Priest] [EQU $RACE Half-Elf] ]
+R:0:0x8C/0x95
+?:[AND [EQU $CLASS Priest] [EQU $RACE Elf] ]
+R:0:0x8C/0x96
+?:[AND [EQU $CLASS Priest] [EQU $RACE Hobbit] ]
+R:0:0x8C/0x97
+?:[AND [EQU $CLASS Priest] [EQU $RACE Gnome] ]
+R:0:0x8C/0x98
+?:[AND [EQU $CLASS Priest] [EQU $RACE Dwarf] ]
+R:0:0x8C/0x99
+?:[AND [EQU $CLASS Priest] [EQU $RACE Half-Orc] ]
+R:0:0x8C/0x9A
+?:[AND [EQU $CLASS Priest] [EQU $RACE Half-Troll] ]
+R:0:0x8C/0x9B
+?:[AND [EQU $CLASS Priest] [EQU $RACE Dunadan] ]
+R:0:0x8C/0x9C
+?:[AND [EQU $CLASS Priest] [EQU $RACE High-Elf] ]
+R:0:0x8C/0x9D
+
+?:[AND [EQU $CLASS Rogue] [EQU $RACE Human] ]
+R:0:0x8C/0x9E
+?:[AND [EQU $CLASS Rogue] [EQU $RACE Half-Elf] ]
+R:0:0x8C/0x9F
+?:[AND [EQU $CLASS Rogue] [EQU $RACE Elf] ]
+R:0:0x8D/0x80
+?:[AND [EQU $CLASS Rogue] [EQU $RACE Hobbit] ]
+R:0:0x8D/0x81
+?:[AND [EQU $CLASS Rogue] [EQU $RACE Gnome] ]
+R:0:0x8D/0x82
+?:[AND [EQU $CLASS Rogue] [EQU $RACE Dwarf] ]
+R:0:0x8D/0x83
+?:[AND [EQU $CLASS Rogue] [EQU $RACE Half-Orc] ]
+R:0:0x8D/0x84
+?:[AND [EQU $CLASS Rogue] [EQU $RACE Half-Troll] ]
+R:0:0x8D/0x85
+?:[AND [EQU $CLASS Rogue] [EQU $RACE Dunadan] ]
+R:0:0x8D/0x86
+?:[AND [EQU $CLASS Rogue] [EQU $RACE High-Elf] ]
+R:0:0x8D/0x87
+
+?:[AND [EQU $CLASS Ranger] [EQU $RACE Human] ]
+R:0:0x8D/0x88
+?:[AND [EQU $CLASS Ranger] [EQU $RACE Half-Elf] ]
+R:0:0x8D/0x89
+?:[AND [EQU $CLASS Ranger] [EQU $RACE Elf] ]
+R:0:0x8D/0x8A
+?:[AND [EQU $CLASS Ranger] [EQU $RACE Hobbit] ]
+R:0:0x8D/0x8B
+?:[AND [EQU $CLASS Ranger] [EQU $RACE Gnome] ]
+R:0:0x8D/0x8C
+?:[AND [EQU $CLASS Ranger] [EQU $RACE Dwarf] ]
+R:0:0x8D/0x8D
+?:[AND [EQU $CLASS Ranger] [EQU $RACE Half-Orc] ]
+R:0:0x8D/0x8E
+?:[AND [EQU $CLASS Ranger] [EQU $RACE Half-Troll] ]
+R:0:0x8D/0x8F
+?:[AND [EQU $CLASS Ranger] [EQU $RACE Dunadan] ]
+R:0:0x8D/0x90
+?:[AND [EQU $CLASS Ranger] [EQU $RACE High-Elf] ]
+R:0:0x8D/0x91
+
+?:[AND [EQU $CLASS Paladin] [EQU $RACE Human] ]
+R:0:0x8D/0x92
+?:[AND [EQU $CLASS Paladin] [EQU $RACE Half-Elf] ]
+R:0:0x8D/0x93
+?:[AND [EQU $CLASS Paladin] [EQU $RACE Elf] ]
+R:0:0x8D/0x94
+?:[AND [EQU $CLASS Paladin] [EQU $RACE Hobbit] ]
+R:0:0x8D/0x95
+?:[AND [EQU $CLASS Paladin] [EQU $RACE Gnome] ]
+R:0:0x8D/0x96
+?:[AND [EQU $CLASS Paladin] [EQU $RACE Dwarf] ]
+R:0:0x8D/0x97
+?:[AND [EQU $CLASS Paladin] [EQU $RACE Half-Orc] ]
+R:0:0x8D/0x98
+?:[AND [EQU $CLASS Paladin] [EQU $RACE Half-Troll] ]
+R:0:0x8D/0x99
+?:[AND [EQU $CLASS Paladin] [EQU $RACE Dunadan] ]
+R:0:0x8D/0x9A
+?:[AND [EQU $CLASS Paladin] [EQU $RACE High-Elf] ]
+R:0:0x8D/0x9B
+
diff --git a/lib/mods/theme/save/delete.me b/lib/mods/theme/save/delete.me
new file mode 100644
index 00000000..2e65efe2
--- /dev/null
+++ b/lib/mods/theme/save/delete.me
@@ -0,0 +1 @@
+a \ No newline at end of file
diff --git a/lib/mods/theme/scpt/bounty.lua b/lib/mods/theme/scpt/bounty.lua
new file mode 100644
index 00000000..94c15598
--- /dev/null
+++ b/lib/mods/theme/scpt/bounty.lua
@@ -0,0 +1,90 @@
+-- The bounty quest! bring back corpses to increase your monster lore skill
+
+add_quest
+{
+ ["global"] = "BOUNTY_QUEST",
+ ["name"] = "Bounty quest",
+ ["desc"] = function()
+ if quest(BOUNTY_QUEST).status == QUEST_STATUS_TAKEN then
+ print_hook("#####yBounty quest!\n")
+ print_hook("You must bring back "..monster_race_desc(bounty_quest_monster, 0).." corpse to the beastmaster.\n")
+ print_hook("\n")
+ end
+ end,
+ ["level"] = -1,
+ ["data"] = {
+ ["bounty_quest_monster"] = 0,
+ },
+ ["hooks"] = {
+ -- Start the game without the quest, need to request it
+ [HOOK_BIRTH_OBJECTS] = function()
+ quest(BOUNTY_QUEST).status = QUEST_STATUS_UNTAKEN
+ end,
+ },
+}
+
+add_building_action
+{
+ -- Index is used in ba_info.txt to set the actions
+ ["index"] = 54,
+ ["action"] = function()
+ if quest(BOUNTY_QUEST).status == QUEST_STATUS_UNTAKEN then
+ quest(BOUNTY_QUEST).status = QUEST_STATUS_TAKEN
+ bounty_quest_monster = get_new_bounty_monster(3 + ((player.lev * 3) / 2))
+
+ msg_print("You must bring me back "..monster_race_desc(bounty_quest_monster, 0).." corpse.")
+ else
+ msg_print("You still must bring me back "..monster_race_desc(bounty_quest_monster, 0).." corpse.")
+ end
+ end
+}
+
+add_building_action
+{
+ -- Index is used in ba_info.txt to set the actions
+ ["index"] = 55,
+ ["action"] = function()
+ if quest(BOUNTY_QUEST).status == QUEST_STATUS_TAKEN then
+ local ret, item
+
+ -- Ask for an item
+ ret, item = get_item("What corpse to return?",
+ "You have no corpse to return.",
+ bor(USE_INVEN),
+ function (obj)
+ if (obj.tval == TV_CORPSE) and (obj.pval2 == bounty_quest_monster) then
+ return TRUE
+ end
+ return FALSE
+ end
+ )
+
+ -- Ok we got the corpse!
+ if ret == TRUE then
+ -- Take the corpse from the inventory
+ inven_item_increase(item, -1)
+ inven_item_optimize(item)
+
+ msg_print("Ah well done adventurer!")
+ msg_print("As a reward I will teach you a bit of monster lore.")
+
+ if skill(SKILL_LORE).mod == 0 then
+ skill(SKILL_LORE).mod = 900
+ skill(SKILL_LORE).dev = TRUE
+ end
+ skill(SKILL_LORE).value = skill(SKILL_LORE).value + skill(SKILL_LORE).mod
+ if skill(SKILL_PRESERVATION).mod == 0 then
+ skill(SKILL_PRESERVATION).value = 800
+ skill(SKILL_PRESERVATION).mod = 800
+ skill(SKILL_PRESERVATION).dev = TRUE
+ msg_print("I see you don't know the corpse preservation skill, I shall teach you it too.")
+ end
+
+ quest(BOUNTY_QUEST).status = QUEST_STATUS_UNTAKEN
+ bounty_quest_monster = 0
+ end
+ else
+ msg_print("You do not have any bounty quest yet.")
+ end
+ end
+}
diff --git a/lib/mods/theme/scpt/corrupt.lua b/lib/mods/theme/scpt/corrupt.lua
new file mode 100644
index 00000000..f402add3
--- /dev/null
+++ b/lib/mods/theme/scpt/corrupt.lua
@@ -0,0 +1,1089 @@
+-- Definition of the corruptions
+-- Theme adds the restriction T-Plus has for Maiar: they may only gain the Balrog corruptions.
+
+-- The Balrog corruptions
+CORRUPT_BALROG_AURA = add_corruption
+{
+ ["color"] = TERM_ORANGE,
+ ["name"] = "Balrog Aura",
+ ["get_text"] = "A corrupted wall of flames surrounds you.",
+ ["lose_text"] = "The wall of corrupted flames abandons you.",
+ ["desc"] =
+ {
+ " Surrounds you with a fiery aura",
+ " But it can burn scrolls when you read them"
+ },
+ ["hooks"] =
+ {
+ [HOOK_CALC_BONUS] = function()
+ player.xtra_f3 = bor(player.xtra_f3, TR3_SH_FIRE)
+ player.xtra_f3 = bor(player.xtra_f3, TR3_LITE1)
+ end,
+ [HOOK_READ] = function(obj)
+ if magik(5) == TRUE then
+ msg_print("Your demon aura burns the scroll before you read it!")
+ return TRUE, TRUE, FALSE
+ else
+ return FALSE
+ end
+ end,
+ },
+}
+
+CORRUPT_BALROG_WINGS = add_corruption
+{
+ ["color"] = TERM_ORANGE,
+ ["name"] = "Balrog Wings",
+ ["get_text"] = "Wings of shadow grow in your back.",
+ ["lose_text"] = "The wings in your back fall apart.",
+ ["desc"] =
+ {
+ " Creates ugly, but working, wings allowing you to fly",
+ " But it reduces charisma by 4 and dexterity by 2"
+ },
+ ["hooks"] =
+ {
+ [HOOK_CALC_BONUS] = function()
+ player.xtra_f4 = bor(player.xtra_f4, TR4_FLY)
+ player.modify_stat(A_CHR, -4)
+ player.modify_stat(A_DEX, -2)
+ end,
+ },
+}
+
+CORRUPT_BALROG_STRENGTH = add_corruption
+{
+ ["color"] = TERM_ORANGE,
+ ["name"] = "Balrog Strength",
+ ["get_text"] = "Your muscles get unnatural strength.",
+ ["lose_text"] = "Your muscles get weaker again.",
+ ["desc"] =
+ {
+ " Provides 3 strength and 1 constitution",
+ " But it reduces charisma by 1 and dexterity by 3"
+ },
+ ["hooks"] =
+ {
+ [HOOK_CALC_BONUS] = function()
+ player.modify_stat(A_STR, 3)
+ player.modify_stat(A_CON, 1)
+ player.modify_stat(A_DEX, -3)
+ player.modify_stat(A_CHR, -1)
+ end,
+ },
+}
+
+CORRUPT_BALROG_FORM = add_corruption
+{
+ ["color"] = TERM_YELLOW,
+ ["name"] = "Balrog Form",
+ ["get_text"] = "You feel the might of a Balrog inside you.",
+ ["lose_text"] = "The presence of the Balrog seems to abandon you.",
+ ["desc"] =
+ {
+ " Allows you to turn into a Balrog at will",
+ " You need Balrog Wings, Balrog Aura and Balrog Strength to activate it"
+ },
+ ["depends"] =
+ {
+ [CORRUPT_BALROG_AURA] = TRUE,
+ [CORRUPT_BALROG_WINGS] = TRUE,
+ [CORRUPT_BALROG_STRENGTH] = TRUE
+ },
+ ["hooks"] =
+ {
+ [HOOK_CALC_POWERS] = function()
+ player.add_power(PWR_BALROG)
+ end,
+ },
+}
+
+
+-- The Demon corruptions
+CORRUPT_DEMON_SPIRIT = add_corruption
+{
+ ["color"] = TERM_RED,
+ ["name"] = "Demon Spirit",
+ ["get_text"] = "Your spirit opens to corrupted thoughts.",
+ ["lose_text"] = "Your spirit closes again to the corrupted thoughts.",
+ ["desc"] =
+ {
+ " Increases your intelligence by 1",
+ " But reduce your charisma by 2",
+ },
+["can_gain"] = function()
+ -- Maiar can't get this one!
+ local str = get_race_name()
+ if str == "Maia" then
+ return nil
+ else
+ return not nil
+ end
+ end,
+ ["hooks"] =
+ {
+ [HOOK_CALC_BONUS] = function()
+ player.modify_stat(A_INT, 1)
+ player.modify_stat(A_CHR, -2)
+ end,
+ },
+}
+
+CORRUPT_DEMON_HIDE = add_corruption
+{
+ ["color"] = TERM_RED,
+ ["name"] = "Demon Hide",
+ ["get_text"] = "Your skin grows into a thick hide.",
+ ["lose_text"] = "Your skin returns to a natural state.",
+ ["desc"] =
+ {
+ " Increases your armour class by your level",
+ " Provides immunity to fire at level 40",
+ " But reduces speed by your level / 7",
+ },
+["can_gain"] = function()
+ -- Maiar can't get this one!
+ local str = get_race_name()
+ if str == "Maia" then
+ return nil
+ else
+ return not nil
+ end
+ end,
+ ["hooks"] =
+ {
+ [HOOK_CALC_BONUS] = function()
+ player.to_a = player.to_a + player.lev
+ player.dis_to_a = player.dis_to_a + player.lev
+ player.pspeed = player.pspeed - (player.lev / 7)
+ if player.lev >= 40 then player.xtra_f2 = bor(player.xtra_f2, TR2_IM_FIRE) end
+ end,
+ },
+}
+
+CORRUPT_DEMON_BREATH = add_corruption
+{
+ ["color"] = TERM_RED,
+ ["name"] = "Demon Breath",
+ ["get_text"] = "Your breath becomes mephitic.",
+ ["lose_text"] = "Your breath is once again normal.",
+ ["desc"] =
+ {
+ " Provides fire breath",
+ " But gives a small chance to spoil potions when you quaff them",
+ },
+ ["hooks"] =
+ {
+ [HOOK_CALC_POWERS] = function()
+ player.add_power(PWR_BR_FIRE)
+ end,
+ [HOOK_QUAFF] = function(obj)
+ if magik(9) == TRUE then
+ msg_print("Your demon breath spoils the potion!")
+ return TRUE, FALSE
+ else
+ return FALSE
+ end
+ end,
+ },
+}
+
+CORRUPT_DEMON_REALM = add_corruption
+{
+ ["color"] = TERM_L_RED,
+ ["name"] = "Demon Realm",
+ ["get_text"] = "You feel more attuned to the demon realm.",
+ ["lose_text"] = "You lose your attunement to the demon realm.",
+ ["desc"] =
+ {
+ " Provides access to the demon school skill and the use of demonic equipment",
+ " You need Demon Spirit, Demon Hide and Demon Breath to activate it"
+ },
+ ["depends"] =
+ {
+ [CORRUPT_DEMON_SPIRIT] = TRUE,
+ [CORRUPT_DEMON_HIDE] = TRUE,
+ [CORRUPT_DEMON_BREATH] = TRUE
+ },
+["can_gain"] = function()
+ -- Maiar can't get this one!
+ local str = get_race_name()
+ if str == "Maia" then
+ return nil
+ else
+ return not nil
+ end
+ end,
+ ["hooks"] =
+ {
+ [HOOK_CALC_BONUS] = function()
+ -- 1500 may seem a lot, but people are rather unlikely to get the corruption very soon
+ -- due to the dependencies
+ if s_info[SKILL_DAEMON + 1].mod == 0 then s_info[SKILL_DAEMON + 1].mod = 1500 end
+ s_info[SKILL_DAEMON + 1].hidden = FALSE;
+ end,
+ },
+}
+
+
+-- Teleportation corruptions
+
+-- Random teleportation will ask for confirmation 70% of the time
+-- But 30% of the time it will teleport, without asking
+CORRUPT_RANDOM_TELEPORT = add_corruption
+{
+ ["color"] = TERM_GREEN,
+ ["name"] = "Random teleportation",
+ ["get_text"] = "Space seems to fizzle around you.",
+ ["lose_text"] = "Space solidify again around you.",
+ ["desc"] =
+ {
+ " Randomly teleports you around",
+ },
+["can_gain"] = function()
+ -- Maiar can't get this one!
+ local str = get_race_name()
+ if str == "Maia" then
+ return nil
+ else
+ return not nil
+ end
+ end,
+ -- No oppose field, it will be automatically set when we declare the anti-telep corruption to oppose us
+ ["hooks"] =
+ {
+ [HOOK_CALC_BONUS] = function()
+ player.xtra_f3 = bor(player.xtra_f3, TR3_TELEPORT)
+ end,
+ [HOOK_PROCESS_WORLD] = function()
+ if rand_int(300) == 1 then
+ if magik(70) == TRUE then
+ if get_check("Teleport?") == TRUE then
+ teleport_player(50)
+ end
+ else
+ disturb(0, 0)
+ msg_print("Your corruption takes over you, you teleport!")
+ teleport_player(50)
+ end
+ end
+ end,
+ },
+}
+
+-- Anti-teleportation corruption, can be stopped with this power
+CORRUPT_ANTI_TELEPORT = add_corruption
+{
+ ["color"] = TERM_GREEN,
+ ["name"] = "Anti-teleportation",
+ ["get_text"] = "Space continuum freezes around you.",
+ ["lose_text"] = "Space continuum can once more be altered around you.",
+ ["desc"] =
+ {
+ " Prevents all teleportations, be it of you or monsters",
+ },
+ ["oppose"] =
+ {
+ [CORRUPT_RANDOM_TELEPORT] = TRUE
+ },
+ ["can_gain"] = function()
+ -- Maiar can't get this one!
+ local str = get_race_name()
+ if str == "Maia" then
+ return nil
+ else
+ return not nil
+ end
+ end,
+ ["hooks"] =
+ {
+ [HOOK_BIRTH_OBJECTS] = function()
+ player.corrupt_anti_teleport_stopped = FALSE
+ end,
+ [HOOK_CALC_POWERS] = function()
+ player.add_power(POWER_COR_SPACE_TIME)
+ end,
+ [HOOK_CALC_BONUS] = function()
+ if player.corrupt_anti_teleport_stopped == FALSE then
+ player.resist_continuum = TRUE
+ end
+ end,
+ [HOOK_PROCESS_WORLD] = function()
+ if player.corrupt_anti_teleport_stopped == TRUE then
+ local amt = player.msp + player.csp
+ amt = amt / 100
+ if (amt < 1) then amt = 1 end
+ increase_mana(-amt)
+ if player.csp == 0 then
+ player.corrupt_anti_teleport_stopped = FALSE
+ msg_print("You stop controlling your corruption.")
+ player.update = bor(player.update, PU_BONUS)
+ end
+ end
+ end,
+ },
+}
+
+
+-- Troll blood
+CORRUPT_TROLL_BLOOD = add_corruption
+{
+ ["color"] = TERM_GREEN,
+ ["name"] = "Troll Blood",
+ ["get_text"] = "Your blood thickens, you sense corruption in it.",
+ ["lose_text"] = "Your blood returns to a normal state.",
+ ["desc"] =
+ {
+ " Troll blood flows in your veins, granting increased regeneration",
+ " It also enables you to feel the presence of other troll beings",
+ " But it will make your presence more noticeable and aggravating",
+ },
+ ["can_gain"] = function()
+ -- Ok trolls should not get this one. never.
+ local str = get_race_name()
+ if (str == "Maia") or (str == "Troll") then
+ return nil
+ else
+ return not nil
+ end
+ end,
+ ["hooks"] =
+ {
+ [HOOK_CALC_BONUS] = function()
+ player.xtra_f3 = bor(player.xtra_f3, TR3_REGEN, TR3_AGGRAVATE)
+ player.xtra_esp = bor(player.xtra_esp, ESP_TROLL)
+ end,
+ },
+}
+
+-- The vampire corruption set
+CORRUPT_VAMPIRE_TEETH = add_corruption
+{
+ ["group"] = "Vampire",
+ ["removable"] = FALSE,
+ ["color"] = TERM_L_DARK,
+ ["name"] = "Vampiric Teeth",
+ ["get_text"] = "You grow vampiric teeth!",
+ ["lose_text"] = "BUG! this should not happen",
+ ["desc"] =
+ {
+ " Your teeth allow you to drain blood to feed yourself",
+ " However your stomach now only accepts blood.",
+ },
+ ["can_gain"] = function()
+ -- Maiar can't get this one!
+ local str = get_race_name()
+ if str == "Maia" then
+ return nil
+ else
+ return not nil
+ end
+ end,
+ ["allow"] = function()
+ if test_race_flags(1, PR1_NO_SUBRACE_CHANGE) == FALSE then return not nil else return nil end
+ end,
+ ["gain"] = function()
+ switch_subrace(SUBRACE_SAVE, TRUE);
+
+ subrace_add_power(subrace(SUBRACE_SAVE), PWR_VAMPIRISM)
+ subrace(SUBRACE_SAVE).flags1 = bor(subrace(SUBRACE_SAVE).flags1, PR1_VAMPIRE, PR1_UNDEAD, PR1_NO_SUBRACE_CHANGE)
+ end,
+ ["hooks"] =
+ {
+ },
+}
+CORRUPT_VAMPIRE_STRENGTH = add_corruption
+{
+ ["group"] = "Vampire",
+ ["removable"] = FALSE,
+ ["color"] = TERM_L_DARK,
+ ["name"] = "Vampiric Strength",
+ ["get_text"] = "Your body seems more dead than alive.",
+ ["lose_text"] = "BUG! this should not happen",
+ ["desc"] =
+ {
+ " Your body seems somewhat dead",
+ " In this near undead state it has improved strength, constitution and intelligence",
+ " But reduced dexterity, wisdom and charisma.",
+ },
+ ["depends"] =
+ {
+ [CORRUPT_VAMPIRE_TEETH] = TRUE,
+ },
+ ["can_gain"] = function()
+ -- Maiar can't get this one!
+ local str = get_race_name()
+ if str == "Maia" then
+ return nil
+ else
+ return not nil
+ end
+ end,
+ ["gain"] = function()
+ -- Apply the bonuses/penalities
+ subrace(SUBRACE_SAVE).r_mhp = subrace(SUBRACE_SAVE).r_mhp + 1
+ subrace(SUBRACE_SAVE).r_exp = subrace(SUBRACE_SAVE).r_exp + 100
+
+ subrace(SUBRACE_SAVE).r_adj[A_STR + 1] = subrace(SUBRACE_SAVE).r_adj[A_STR + 1] + 3
+ subrace(SUBRACE_SAVE).r_adj[A_INT + 1] = subrace(SUBRACE_SAVE).r_adj[A_INT + 1] + 2
+ subrace(SUBRACE_SAVE).r_adj[A_WIS + 1] = subrace(SUBRACE_SAVE).r_adj[A_WIS + 1] - 3
+ subrace(SUBRACE_SAVE).r_adj[A_DEX + 1] = subrace(SUBRACE_SAVE).r_adj[A_DEX + 1] - 2
+ subrace(SUBRACE_SAVE).r_adj[A_CON + 1] = subrace(SUBRACE_SAVE).r_adj[A_CON + 1] + 1
+ subrace(SUBRACE_SAVE).r_adj[A_CHR + 1] = subrace(SUBRACE_SAVE).r_adj[A_CHR + 1] - 4
+
+ -- be reborn!
+ do_rebirth()
+ cmsg_print(TERM_L_DARK, "You feel death slipping inside.")
+ end,
+ ["hooks"] =
+ {
+ },
+}
+CORRUPT_VAMPIRE_VAMPIRE = add_corruption
+{
+ ["group"] = "Vampire",
+ ["removable"] = FALSE,
+ ["color"] = TERM_L_DARK,
+ ["name"] = "Vampire",
+ ["get_text"] = "You die to be reborn in a Vampire form.",
+ ["lose_text"] = "BUG! this should not happen",
+ ["desc"] =
+ {
+ " You are a Vampire. As such you resist cold, poison, darkness and nether.",
+ " Your life is sustained, but you cannot stand the light of the sun."
+ },
+ ["depends"] =
+ {
+ [CORRUPT_VAMPIRE_STRENGTH] = TRUE,
+ },
+ ["can_gain"] = function()
+ -- Maiar can't get this one!
+ local str = get_race_name()
+ if str == "Maia" then
+ return nil
+ else
+ return not nil
+ end
+ end,
+ ["gain"] = function()
+ -- Be a Vampire and be proud of it
+ local title = get_subrace_title(SUBRACE_SAVE)
+ if title == " " or title == "Vampire" then
+ title = "Vampire"
+ subrace(SUBRACE_SAVE).place = FALSE
+ else
+ title = "Vampire "..title
+ end
+ set_subrace_title(SUBRACE_SAVE, title)
+
+ -- Bonus/and .. not bonus :)
+ subrace(SUBRACE_SAVE).flags1 = bor(subrace(SUBRACE_SAVE).flags1, PR1_HURT_LITE)
+ subrace(SUBRACE_SAVE).oflags2[2] = bor(subrace(SUBRACE_SAVE).oflags2[2], TR2_RES_POIS, TR2_RES_NETHER, TR2_RES_COLD, TR2_RES_DARK, TR2_HOLD_LIFE)
+ subrace(SUBRACE_SAVE).oflags3[2] = bor(subrace(SUBRACE_SAVE).oflags3[2], TR3_LITE1)
+ end,
+ ["hooks"] =
+ {
+ },
+}
+
+-- The old activable corruptions / mutations
+
+MUT1_SPIT_ACID = add_corruption
+{
+ ["color"] = TERM_RED,
+ ["name"] = "Ancalagon's Breath",
+ ["get_text"] = "You gain the ability to spit acid.",
+ ["lose_text"] = "You lose the ability to spit acid.",
+ ["desc"] =
+ {
+ " Fires an acid ball.",
+ " Damage=level Radius 1+(level/30)",
+ " Level=9, Cost=9, Stat=DEX, Difficulty=15",
+ },
+ ["can_gain"] = function()
+ -- Maiar can't get this one!
+ local str = get_race_name()
+ if str == "Maia" then
+ return nil
+ else
+ return not nil
+ end
+ end,
+ ["hooks"] =
+ {
+ [HOOK_CALC_POWERS] = function()
+ player.add_power(PWR_SPIT_ACID)
+ end,
+ },
+}
+
+MUT1_BR_FIRE = add_corruption
+{
+ ["color"] = TERM_RED,
+ ["name"] = "Smaug's Breath",
+ ["get_text"] = "You gain the ability to breathe fire.",
+ ["lose_text"] = "You lose the ability to breathe fire.",
+ ["desc"] =
+ {
+ " Fires a fire ball.",
+ " Damage=2*level Radius 1+(level/20)",
+ " Level=20, Cost=10, Stat=CON, Difficulty=18",
+ },
+ ["can_gain"] = function()
+ -- Maiar can't get this one!
+ local str = get_race_name()
+ if str == "Maia" then
+ return nil
+ else
+ return not nil
+ end
+ end,
+ ["hooks"] =
+ {
+ [HOOK_CALC_POWERS] = function()
+ player.add_power(PWR_BR_FIRE)
+ end,
+ },
+}
+
+MUT1_HYPN_GAZE = add_corruption
+{
+ ["color"] = TERM_RED,
+ ["name"] = "Glaurung's Gaze",
+ ["get_text"] = "Your eyes look mesmerizing...",
+ ["lose_text"] = "Your eyes look uninteresting.",
+ ["desc"] =
+ {
+ " Tries to make a monster your pet.",
+ " Power=level",
+ " Level=12, Cost=12, Stat=CHR, Difficulty=18",
+ },
+ ["can_gain"] = function()
+ -- Maiar can't get this one!
+ local str = get_race_name()
+ if str == "Maia" then
+ return nil
+ else
+ return not nil
+ end
+ end,
+ ["hooks"] =
+ {
+ [HOOK_CALC_POWERS] = function()
+ player.add_power(PWR_HYPN_GAZE)
+ end,
+ },
+}
+
+MUT1_TELEKINES = add_corruption
+{
+ ["color"] = TERM_RED,
+ ["name"] = "Saruman's Power",
+ ["get_text"] = "You gain the ability to move objects telekinetically.",
+ ["lose_text"] = "You lose the ability to move objects telekinetically.",
+ ["desc"] =
+ {
+ " Move an object in line of sight to you.",
+ " Max weight equal to (level) pounds",
+ " Level=9, Cost=9, Stat=WIS, Difficulty=14",
+ },
+ ["can_gain"] = function()
+ -- Maiar can't get this one!
+ local str = get_race_name()
+ if str == "Maia" then
+ return nil
+ else
+ return not nil
+ end
+ end,
+ ["hooks"] =
+ {
+ [HOOK_CALC_POWERS] = function()
+ player.add_power(PWR_TELEKINES)
+ end,
+ },
+}
+
+MUT1_VTELEPORT = add_corruption
+{
+ ["color"] = TERM_RED,
+ ["name"] = "Teleport",
+ ["get_text"] = "You gain the power of teleportation at will.",
+ ["lose_text"] = "You lose the power of teleportation at will.",
+ ["desc"] =
+ {
+ " Teleports the player at will.",
+ " Distance 10+4*level squares",
+ " Level=7, Cost=7, Stat=WIS, Difficulty=15",
+ },
+ ["can_gain"] = function()
+ -- Maiar can't get this one!
+ local str = get_race_name()
+ if str == "Maia" then
+ return nil
+ else
+ return not nil
+ end
+ end,
+ ["hooks"] =
+ {
+ [HOOK_CALC_POWERS] = function()
+ player.add_power(PWR_VTELEPORT)
+ end,
+ },
+}
+
+MUT1_MIND_BLST = add_corruption
+{
+ ["color"] = TERM_RED,
+ ["name"] = "Glaurung's Spell",
+ ["get_text"] = "You gain the power of Mind Blast.",
+ ["lose_text"] = "You lose the power of Mind Blast.",
+ ["desc"] =
+ {
+ " Fires a mind blasting bolt (psi damage).",
+ " Psi Damage (3+(level-1)/5)d3",
+ " Level=5, Cost=3, Stat=WIS, Difficulty=15",
+ },
+ ["can_gain"] = function()
+ -- Maiar can't get this one!
+ local str = get_race_name()
+ if str == "Maia" then
+ return nil
+ else
+ return not nil
+ end
+ end,
+ ["hooks"] =
+ {
+ [HOOK_CALC_POWERS] = function()
+ player.add_power(PWR_MIND_BLST)
+ end,
+ },
+}
+
+MUT1_VAMPIRISM = add_corruption
+{
+ ["color"] = TERM_RED,
+ ["name"] = "Vampiric Drain",
+ ["get_text"] = "You become vampiric.",
+ ["lose_text"] = "You are no longer vampiric.",
+ ["desc"] =
+ {
+ " You can drain life from a foe like a vampire.",
+ " Drains (level+1d(level))*(level/10) hitpoints,",
+ " heals you and satiates you. Doesn't work on all monsters",
+ " Level=4, Cost=5, Stat=CON, Difficulty=9",
+ },
+ ["can_gain"] = function()
+ -- Maiar can't get this one!
+ local str = get_race_name()
+ if str == "Maia" then
+ return nil
+ else
+ return not nil
+ end
+ end,
+ ["hooks"] =
+ {
+ [HOOK_CALC_POWERS] = function()
+ player.add_power(PWR_VAMPIRISM)
+ end,
+ },
+}
+
+MUT1_SMELL_MET = add_corruption
+{
+ ["color"] = TERM_RED,
+ ["name"] = "Carcharoth's Nose",
+ ["get_text"] = "You smell a metallic odour.",
+ ["lose_text"] = "You no longer smell a metallic odour.",
+ ["desc"] =
+ {
+ " You can detect nearby precious metal (treasure).",
+ " Radius 25",
+ " Level=3, Cost=2, Stat=INT, Difficulty=12",
+ },
+ ["can_gain"] = function()
+ -- Maiar can't get this one!
+ local str = get_race_name()
+ if str == "Maia" then
+ return nil
+ else
+ return not nil
+ end
+ end,
+ ["hooks"] =
+ {
+ [HOOK_CALC_POWERS] = function()
+ player.add_power(PWR_SMELL_MET)
+ end,
+ },
+}
+
+MUT1_SMELL_MON = add_corruption
+{
+ ["color"] = TERM_RED,
+ ["name"] = "Huan's Nose",
+ ["get_text"] = "You smell filthy monsters.",
+ ["lose_text"] = "You no longer smell filthy monsters.",
+ ["desc"] =
+ {
+ " You can detect nearby monsters.",
+ " Radius 25",
+ " Level=5, Cost=4, Stat=INT, Difficulty=15",
+ },
+ ["can_gain"] = function()
+ -- Maiar can't get this one!
+ local str = get_race_name()
+ if str == "Maia" then
+ return nil
+ else
+ return not nil
+ end
+ end,
+ ["hooks"] =
+ {
+ [HOOK_CALC_POWERS] = function()
+ player.add_power(PWR_SMELL_MON)
+ end,
+ },
+}
+
+MUT1_BLINK = add_corruption
+{
+ ["color"] = TERM_RED,
+ ["name"] = "Blink",
+ ["get_text"] = "You gain the power of minor teleportation.",
+ ["lose_text"] = "You lose the power of minor teleportation.",
+ ["desc"] =
+ {
+ " You can teleport yourself short distances (10 squares).",
+ " Level=3, Cost=3, Stat=WIS, Difficulty=12",
+ },
+ ["can_gain"] = function()
+ -- Maiar can't get this one!
+ local str = get_race_name()
+ if str == "Maia" then
+ return nil
+ else
+ return not nil
+ end
+ end,
+ ["hooks"] =
+ {
+ [HOOK_CALC_POWERS] = function()
+ player.add_power(PWR_BLINK)
+ end,
+ },
+}
+
+MUT1_EAT_ROCK = add_corruption
+{
+ ["color"] = TERM_RED,
+ ["name"] = "Eat Rock",
+ ["get_text"] = "The walls look delicious.",
+ ["lose_text"] = "The walls look unappetizing.",
+ ["desc"] =
+ {
+ " You can consume solid rock with food benefit,",
+ " leaving an empty space behind.",
+ " Level=8, Cost=12, Stat=CON, Difficulty=18",
+ },
+ ["can_gain"] = function()
+ -- Maiar can't get this one!
+ local str = get_race_name()
+ if str == "Maia" then
+ return nil
+ else
+ return not nil
+ end
+ end,
+ ["hooks"] =
+ {
+ [HOOK_CALC_POWERS] = function()
+ player.add_power(PWR_EAT_ROCK)
+ end,
+ },
+}
+
+MUT1_SWAP_POS = add_corruption
+{
+ ["color"] = TERM_RED,
+ ["name"] = "Swap Position",
+ ["get_text"] = "You feel like walking a mile in someone else's shoes.",
+ ["lose_text"] = "You feel like staying in your own shoes.",
+ ["desc"] =
+ {
+ " You can switch locations with another being,",
+ " unless it resists teleportation.",
+ " Level=15, Cost=12, Stat=DEX, Difficulty=16",
+ },
+ ["can_gain"] = function()
+ -- Maiar can't get this one!
+ local str = get_race_name()
+ if str == "Maia" then
+ return nil
+ else
+ return not nil
+ end
+ end,
+ ["hooks"] =
+ {
+ [HOOK_CALC_POWERS] = function()
+ player.add_power(PWR_SWAP_POS)
+ end,
+ },
+}
+
+MUT1_SHRIEK = add_corruption
+{
+ ["color"] = TERM_RED,
+ ["name"] = "Shriek",
+ ["get_text"] = "Your vocal cords get much tougher.",
+ ["lose_text"] = "Your vocal cords get much weaker.",
+ ["desc"] =
+ {
+ " Fires a sound ball and aggravates monsters.",
+ " Damage=level*4, Radius=8, centered on player",
+ " Level=4, Cost=4, Stat=CON, Difficulty=6",
+ },
+ ["can_gain"] = function()
+ -- Maiar can't get this one!
+ local str = get_race_name()
+ if str == "Maia" then
+ return nil
+ else
+ return not nil
+ end
+ end,
+ ["hooks"] =
+ {
+ [HOOK_CALC_POWERS] = function()
+ player.add_power(PWR_SHRIEK)
+ end,
+ },
+}
+
+MUT1_ILLUMINE = add_corruption
+{
+ ["color"] = TERM_RED,
+ ["name"] = "Illuminate",
+ ["get_text"] = "You can light up rooms with your presence.",
+ ["lose_text"] = "You can no longer light up rooms with your presence.",
+ ["desc"] =
+ {
+ " You can emit bright light that illuminates an area.",
+ " Damage=2d(level/2) Radius=(level/10)+1",
+ " Level=3, Cost=2, Stat=INT, Difficulty=10",
+ },
+ ["can_gain"] = function()
+ -- Maiar can't get this one!
+ local str = get_race_name()
+ if str == "Maia" then
+ return nil
+ else
+ return not nil
+ end
+ end,
+ ["hooks"] =
+ {
+ [HOOK_CALC_POWERS] = function()
+ player.add_power(PWR_ILLUMINE)
+ end,
+ },
+}
+
+MUT1_DET_CURSE = add_corruption
+{
+ ["color"] = TERM_RED,
+ ["name"] = "Detect Curses",
+ ["get_text"] = "You can feel evil magics.",
+ ["lose_text"] = "You can no longer feel evil magics.",
+ ["desc"] =
+ {
+ " You can feel the danger of evil magic.",
+ " It detects cursed items in the inventory",
+ " Level=7, Cost=14, Stat=WIS, Difficulty=14",
+ },
+ ["can_gain"] = function()
+ -- Maiar can't get this one!
+ local str = get_race_name()
+ if str == "Maia" then
+ return nil
+ else
+ return not nil
+ end
+ end,
+ ["hooks"] =
+ {
+ [HOOK_CALC_POWERS] = function()
+ player.add_power(PWR_DET_CURSE)
+ end,
+ },
+}
+
+MUT1_BERSERK = add_corruption
+{
+ ["color"] = TERM_RED,
+ ["name"] = "Berserk",
+ ["get_text"] = "You feel a controlled rage.",
+ ["lose_text"] = "You no longer feel a controlled rage.",
+ ["desc"] =
+ {
+ " You can drive yourself into a berserk frenzy.",
+ " It grants super-heroism. Duration=10+1d(level)",
+ " Level=8, Cost=8, Stat=STR, Difficulty=14",
+ },
+ ["can_gain"] = function()
+ -- Maiar can't get this one!
+ local str = get_race_name()
+ if str == "Maia" then
+ return nil
+ else
+ return not nil
+ end
+ end,
+ ["hooks"] =
+ {
+ [HOOK_CALC_POWERS] = function()
+ player.add_power(PWR_BERSERK)
+ end,
+ },
+}
+
+
+MUT1_MIDAS_TCH = add_corruption
+{
+ ["color"] = TERM_RED,
+ ["name"] = "Midas touch",
+ ["get_text"] = "You gain the Midas touch.",
+ ["lose_text"] = "You lose the Midas touch.",
+ ["desc"] =
+ {
+ " You can turn ordinary items to gold.",
+ " Turns a non-artifact object into 1/3 its value in gold",
+ " Level=10, Cost=5, Stat=INT, Difficulty=12",
+ },
+ ["can_gain"] = function()
+ -- Maiar can't get this one!
+ local str = get_race_name()
+ if str == "Maia" then
+ return nil
+ else
+ return not nil
+ end
+ end,
+ ["hooks"] =
+ {
+ [HOOK_CALC_POWERS] = function()
+ player.add_power(PWR_MIDAS_TCH)
+ end,
+ },
+}
+
+MUT1_GROW_MOLD = add_corruption
+{
+ ["color"] = TERM_RED,
+ ["name"] = "Grow Mold",
+ ["get_text"] = "You feel a sudden affinity for mold.",
+ ["lose_text"] = "You feel a sudden dislike for mold.",
+ ["desc"] =
+ {
+ " You can cause mold to grow near you.",
+ " Summons up to 8 molds around the player",
+ " Level=1, Cost=6, Stat=CON, Difficulty=14",
+ },
+ ["can_gain"] = function()
+ -- Maiar can't get this one!
+ local str = get_race_name()
+ if str == "Maia" then
+ return nil
+ else
+ return not nil
+ end
+ end,
+ ["hooks"] =
+ {
+ [HOOK_CALC_POWERS] = function()
+ player.add_power(PWR_GROW_MOLD)
+ end,
+ },
+}
+
+MUT1_RESIST = add_corruption
+{
+ ["color"] = TERM_RED,
+ ["name"] = "Resist Elements",
+ ["get_text"] = "You feel like you can protect yourself.",
+ ["lose_text"] = "You feel like you might be vulnerable.",
+ ["desc"] =
+ {
+ " You can harden yourself to the ravages of the elements.",
+ " Level-dependent chance of gaining resistances to the four ",
+ " elements and poison. Duration=20 + d20",
+ " Level=10, Cost=12, Stat=CON, Difficulty=12",
+ },
+ ["can_gain"] = function()
+ -- Maiar can't get this one!
+ local str = get_race_name()
+ if str == "Maia" then
+ return nil
+ else
+ return not nil
+ end
+ end,
+ ["hooks"] =
+ {
+ [HOOK_CALC_POWERS] = function()
+ player.add_power(PWR_RESIST)
+ end,
+ },
+}
+
+MUT1_EARTHQUAKE = add_corruption
+{
+ ["color"] = TERM_RED,
+ ["name"] = "Earthquake",
+ ["get_text"] = "You gain the ability to wreck the dungeon.",
+ ["lose_text"] = "You lose the ability to wreck the dungeon.",
+ ["desc"] =
+ {
+ " You can bring down the dungeon around your ears.",
+ " Radius=10, center on the player",
+ " Level=12, Cost=12, Stat=STR, Difficulty=16",
+ },
+ ["can_gain"] = function()
+ -- Maiar can't get this one!
+ local str = get_race_name()
+ if str == "Maia" then
+ return nil
+ else
+ return not nil
+ end
+ end,
+ ["hooks"] =
+ {
+ [HOOK_CALC_POWERS] = function()
+ player.add_power(PWR_EARTHQUAKE)
+ end,
+ },
+}
+--[[
+CORRUPT_ = add_corruption
+{
+ ["color"] = TERM_GREEN,
+ ["name"] = "",
+ ["get_text"] = "",
+ ["lose_text"] = "",
+ ["desc"] =
+ {
+ " ",
+ },
+ ["hooks"] =
+ {
+ [HOOK_CALC_BONUS] = function()
+ end,
+ },
+}
+]]
diff --git a/lib/mods/theme/scpt/drunk.lua b/lib/mods/theme/scpt/drunk.lua
new file mode 100644
index 00000000..7d90af8d
--- /dev/null
+++ b/lib/mods/theme/scpt/drunk.lua
@@ -0,0 +1,21 @@
+-- silly function that allows a drunk to take a bottle of wine/ale from the player
+
+function drunk_takes_wine(m_idx, item)
+
+ m_ptr = monster(m_idx)
+ o_ptr = get_object(item)
+
+ if (m_ptr.r_idx == test_monster_name("Singing, happy drunk"))
+ and (o_ptr.tval == TV_FOOD) and ((o_ptr.sval == 38) or (o_ptr.sval == 39)) then
+
+ cmsg_print(TERM_YELLOW, "'Hic!'")
+
+ inven_item_increase(item, -1)
+ inven_item_optimize(item)
+ return TRUE
+ else
+ return FALSE
+ end
+end
+
+add_hook_script(HOOK_GIVE, "drunk_takes_wine", "drunk_takes_wine")
diff --git a/lib/mods/theme/scpt/fireprof.lua b/lib/mods/theme/scpt/fireprof.lua
new file mode 100644
index 00000000..8691b821
--- /dev/null
+++ b/lib/mods/theme/scpt/fireprof.lua
@@ -0,0 +1,415 @@
+-- The Old Mages/Fireproofing quest: Bring back a rune from a fiery cave and get some books/scrolls/staves fireproofed in return
+
+fireproof_quest = {}
+
+
+-- change this constant (and the FOO_POINTS ones) to adjust the no of items fire-proofed as a reward
+fireproof_quest.TOTAL_ITEM_POINTS = 24
+
+-- These constants are how many 'points' each type of item will take up. So currently, you can fireproof 3 books, 4 staves or 12 scrolls.
+fireproof_quest.BOOK_POINTS = 4
+fireproof_quest.STAFF_POINTS = 3
+fireproof_quest.SCROLL_POINTS = 1
+
+add_quest
+{
+ ["global"] = "FIREPROOF_QUEST",
+ ["name"] = "Old Mages quest",
+ ["desc"] = function()
+ local num_books, num_staff, num_scroll
+
+ num_books = fireproof_quest.item_points_remaining / fireproof_quest.BOOK_POINTS
+ num_staff = fireproof_quest.item_points_remaining / fireproof_quest.STAFF_POINTS
+ num_scroll = fireproof_quest.item_points_remaining / fireproof_quest.SCROLL_POINTS
+
+ -- Quest taken
+ if (quest(FIREPROOF_QUEST).status == QUEST_STATUS_TAKEN) then
+ print_hook("#####yAn Old Mages Quest!\n")
+ print_hook("Retrieve the strange rune for the old mage in Lothlorien.\n")
+ print_hook("\n")
+ -- essence retrieved, not taken to mage
+ elseif (quest(FIREPROOF_QUEST).status == QUEST_STATUS_COMPLETED) then
+ print_hook("#####yAn Old Mages Quest!\n")
+ print_hook("You have retrieved the rune for the old mage in Lothlorien. Perhaps you \n")
+ print_hook("should see about a reward.\n")
+ print_hook("\n")
+ -- essence returned, not all books fireproofed
+ elseif (quest(FIREPROOF_QUEST).status == QUEST_STATUS_FINISHED) and (fireproof_quest.item_points_remaining > 0) then
+ print_hook("#####yAn Old Mages Quest!\n")
+ print_hook("You have retrieved the rune for the old mage in Lothlorien. He will still \n")
+ print_hook("fireproof "..num_books.." book(s) or "..num_staff.." staff/staves or "..num_scroll.." scroll(s) for you.\n")
+ print_hook("\n")
+ end
+ end,
+ ["level"] = 20,
+ ["data"] = {
+ -- store some variables
+ ["fireproof_quest.item_points_remaining"] = fireproof_quest.TOTAL_ITEM_POINTS,
+ ["fireproof_quest.essence"] = 0,
+ },
+ ["hooks"] = {
+ -- Start the game without the quest, need to request it
+ [HOOK_BIRTH_OBJECTS] = function()
+ quest(FIREPROOF_QUEST).status = QUEST_STATUS_UNTAKEN
+
+ -- reset some variables on birth
+ fireproof_quest.item_points_remaining = fireproof_quest.TOTAL_ITEM_POINTS
+ fireproof_quest.essence = 0
+ end,
+ [HOOK_GEN_QUEST] = function()
+ local essence, y, x, traps, tries, trap_y, trap_x, grid
+
+ -- Only if player doing this quest
+ if (player.inside_quest ~= FIREPROOF_QUEST) then
+ return FALSE
+ else
+ -- load the map
+ load_map("fireprof.map", 2, 2)
+
+ -- no teleport
+ level_flags2 = DF2_NO_TELEPORT
+
+ -- determine type of rune
+ fireproof_quest.essence = randint(5)
+
+ -- create essence
+ essence = create_object(TV_RUNE2, fireproof_quest.essence)
+
+ -- mark rune
+ essence.pval2 = fireproof_quest.essence
+ essence.note = quark_add("quest")
+
+ -- roll for co-ordinates in top half of map
+ y = randint(3) + 2
+ x = randint(45) + 2
+
+ -- drop it
+ drop_near(essence, -1, y, x)
+
+ -- how many traps to generate
+ traps = rand_range(10, 30)
+
+ -- generate the traps
+ while (traps > 0) do
+
+ -- initialise tries variable
+ tries = 0
+
+ -- make sure it's a safe place
+ while (tries == 0) do
+
+ -- get grid coordinates
+ trap_y = randint(19) + 2
+ trap_x = randint(45) + 2
+ grid = cave(trap_y, trap_x)
+
+ -- are the coordinates on a stair, or a wall?
+ if (cave_is(grid, FF1_PERMANENT) ~= 0) or (cave_is(grid, FF1_FLOOR) == 0) then
+
+ -- try again
+ tries = 0
+ else
+ -- not a stair, then stop this 'while'
+ tries = 1
+ end
+ end
+
+ -- randomise level of trap
+ trap_level = rand_range(20, 40)
+
+ -- put the trap there
+ place_trap(trap_y, trap_x, trap_level)
+
+ -- that's one less trap to place
+ traps = traps - 1
+ end
+ return TRUE
+ end
+ end,
+ [HOOK_STAIR] = function()
+ local ret
+
+ -- only ask this if player about to go up stairs of quest and hasn't retrieved rune
+ if (player.inside_quest ~= FIREPROOF_QUEST) or
+ (quest(FIREPROOF_QUEST).status == QUEST_STATUS_COMPLETED) then
+ return FALSE
+ else
+ if cave(player.py, player.px).feat ~= FEAT_LESS then return end
+
+ -- flush all pending input
+ flush()
+
+ -- confirm
+ ret = get_check("Really abandon the quest?")
+
+ -- if yes, then
+ if (ret == TRUE) then
+
+ -- fail the quest
+ quest(FIREPROOF_QUEST).status = QUEST_STATUS_FAILED
+ return FALSE
+ else
+ -- if no, they stay in the quest
+ return TRUE
+ end
+ end
+ end,
+ [HOOK_GET] = function(o_ptr)
+
+ -- if they're in the quest and haven't picked up the rune already, continue
+ if (player.inside_quest ~= FIREPROOF_QUEST) or
+ (quest(FIREPROOF_QUEST).status == QUEST_STATUS_COMPLETED) then
+ return FALSE
+ else
+
+ -- check that it's the real rune and not another one generated via the random object placing in fireproof.map
+ if (o_ptr.pval2 == fireproof_quest.essence) then
+
+ -- ok mark the quest 'completed'
+ quest(FIREPROOF_QUEST).status = QUEST_STATUS_COMPLETED
+ msg_print(TERM_YELLOW, "Fine! Looks like you've found it.")
+ end
+ end
+ end,
+
+ },
+}
+
+-- add the bit that determines what happens when the request 'q'uest bit is done in the wizard spire
+add_building_action
+{
+ -- Index is used in ba_info.txt to set the actions
+ ["index"] = 56,
+ ["action"] = function()
+
+ local num_books, num_staff, num_scroll
+
+ num_books = fireproof_quest.item_points_remaining / fireproof_quest.BOOK_POINTS
+ num_staff = fireproof_quest.item_points_remaining / fireproof_quest.STAFF_POINTS
+ num_scroll = fireproof_quest.item_points_remaining / fireproof_quest.SCROLL_POINTS
+
+ -- the quest hasn;t been requested already, right?
+ if quest(FIREPROOF_QUEST).status == QUEST_STATUS_UNTAKEN then
+
+ -- quest has been taken now
+ quest(FIREPROOF_QUEST).status = QUEST_STATUS_TAKEN
+ fireproof_quest.item_points_remaining = fireproof_quest.TOTAL_ITEM_POINTS
+
+ -- issue instructions
+ msg_print("I need a very special rune for a spell I am working on. I am too old to ")
+ msg_print("fetch it myself. Please bring it back to me. You can find it north of here.")
+ msg_print("Be careful with it, it's fragile and might be destroyed easily.")
+
+ return TRUE, FALSE, TRUE
+ -- if quest completed (rune was retrieved)
+ elseif (quest(FIREPROOF_QUEST).status == QUEST_STATUS_COMPLETED) then
+
+ -- ask for rune
+ ret, item = get_item("Which rune?",
+ "You have no runes to return",
+ bor(USE_INVEN),
+ function (obj)
+
+ -- check it's the 'marked' rune
+ if (obj.tval == TV_RUNE2) and (obj.sval == fireproof_quest.essence) and (obj.pval2 == fireproof_quest.essence) then
+ return TRUE
+ end
+ return FALSE
+ end
+ )
+
+ -- didn't get the rune?
+ if (ret == FALSE) then
+ return TRUE
+
+ -- got the rune!
+ else
+
+ -- take rune
+ inven_item_increase(item, -1)
+ inven_item_optimize(item)
+ msg_print("Great! Let me fireproof some of your items in thanks. I can do "..num_books.." books, ")
+ msg_print(num_staff.." staves, or "..num_scroll.." scrolls.")
+
+ -- how many items to proof?
+ local items = fireproof_quest.item_points_remaining
+
+ -- repeat till up to 3 (value defined as TOTAL_ITEM_POINTS constant) books fireproofed
+ while items > 0 do
+ ret = fireproof()
+
+ -- don't loop the fireproof if there's nothing to fireproof
+ if ret == FALSE then
+ break
+ end
+
+ -- subtract item points
+ items = fireproof_quest.item_points_remaining
+ end
+
+ -- have they all been done?
+ if (fireproof_quest.item_points_remaining == 0) then
+ -- mark quest to make sure no more quests are given
+ quest(FIREPROOF_QUEST).status = QUEST_STATUS_REWARDED
+ else
+ -- mark in preparation of anymore books to fireproof
+ quest(FIREPROOF_QUEST).status = QUEST_STATUS_FINISHED
+ end
+
+
+ end
+
+ -- if the player asks for a quest when they already have it, but haven't failed it, give them some extra instructions
+ elseif (quest(FIREPROOF_QUEST).status == QUEST_STATUS_TAKEN) then
+ msg_print("The rune is in a cave just behind the shop.")
+
+ -- ok not all books have been fireproofed... lets do the rest
+ elseif (quest(FIREPROOF_QUEST).status == QUEST_STATUS_FINISHED) then
+
+ -- how many books still to proof?
+ local items = fireproof_quest.item_points_remaining
+
+ -- repeat as necessary
+ while items > 0 do
+ ret = fireproof()
+
+ -- don't loop the fireproof if there's nothing to fireproof
+ if ret == FALSE then
+ break
+ else
+ -- have they all been done?
+ if (fireproof_quest.item_points_remaining == 0) then quest(FIREPROOF_QUEST).status = QUEST_STATUS_REWARDED end
+ end
+
+ -- subtract item points
+ items = fireproof_quest.item_points_remaining
+ end
+
+ -- quest failed or completed, then give no more quests
+ elseif (quest(FIREPROOF_QUEST).status == QUEST_STATUS_FAILED) or (quest(FIREPROOF_QUEST).status == QUEST_STATUS_REWARDED) then
+ msg_print("I have no more quests for you")
+ end
+ return TRUE
+ end,
+}
+
+-- the routine that checks for a book and actually fireproofs it
+function fireproof()
+
+ local ret, item, obj2, stack, obj3, carry_it
+
+ ret, item = get_item("Which item shall I fireproof?",
+ "You have no more items I can fireproof, come back when you have some.",
+ bor(USE_INVEN),
+ function (obj)
+
+ -- get some flags
+ local f1, f2, f3, f4, f5, esp = object_flags(obj)
+
+ -- is it a book/staff/scroll, is it already fireproof?
+ if ((obj.tval == TV_BOOK) or (obj.tval == TV_SCROLL) or (obj.tval == TV_STAFF)) and (band(f3, TR3_IGNORE_FIRE) == 0) then
+ return TRUE
+ end
+ return FALSE
+ end
+ )
+
+ -- get the object type from the number
+ obj2 = get_object(item)
+
+ -- check we have enough points (if we 'got' an item)
+ if (ret == TRUE) then
+ ret2, stack = enough_points(obj2)
+ end
+
+ -- did either routine fail?
+ if (ret == FALSE) or (ret2 == FALSE) then
+ return FALSE
+ else
+
+ -- are we part of the items from a stack?
+ if (obj2.number ~= stack) then
+
+ -- make a new object to handle
+ object_copy(obj_forge, obj2)
+
+ -- give it the right number of items
+ obj_forge.number = stack
+
+ -- adjust for number of items in pack not to be fireproofed
+ obj2.number = obj2.number - stack
+ obj3 = obj_forge
+
+ -- we'll need to add this to the inventory after fireproofing
+ carry_it = TRUE
+ else
+
+ -- use the whole stack
+ obj3 = obj2
+
+ -- we'll be dealing this while it's still in the inventory
+ carry_it = FALSE
+ end
+
+ -- make it fireproof
+ obj3.name2 = 149
+
+ -- apply it, making sure the pvals don't change with apply_magic (it would change the type of book!)
+ local oldpval = obj3.pval
+ local oldpval2 = obj3.pval2
+ local oldpval3 = obj3.pval3
+ apply_magic(obj3, -1, FALSE, FALSE, FALSE)
+ obj3.pval = oldpval
+ obj3.pval2 = oldpval2
+ obj3.pval3 = oldpval3
+
+ -- put it in the inventory if it's only part of a stack
+ if (carry_it == TRUE) then
+ inven_carry(obj3, TRUE)
+ end
+
+ -- id and notice it
+ set_known(obj3)
+ set_aware(obj3)
+
+ return TRUE
+ end
+end
+
+-- This function makes sure the player has enough 'points' left to fireproof stuff.
+function enough_points(obj)
+ local item_value, stack
+
+ -- are the items in a stack?
+ if (obj.number > 1) then
+
+ -- how many to fireproof?
+ stack = get_quantity("How many would you like fireproofed?", obj.number)
+ else
+ stack = 1
+ end
+
+ -- check for item type and multiply number in the stack by the amount of points per item of that type
+ if (obj.tval == TV_BOOK) then
+ item_value = fireproof_quest.BOOK_POINTS * stack
+ elseif (obj.tval == TV_STAFF) then
+ item_value = fireproof_quest.STAFF_POINTS * stack
+ elseif (obj.tval == TV_SCROLL) then
+ item_value = fireproof_quest.SCROLL_POINTS * stack
+ end
+
+ -- do we have enough points?
+ if (item_value > fireproof_quest.item_points_remaining) then
+ msg_print("I do not have enough fireproofing material for that.")
+ return FALSE
+ else
+ -- if so then subtract those points before we do the fireproofing
+ fireproof_quest.item_points_remaining = fireproof_quest.item_points_remaining - item_value
+ end
+
+ -- Used all the points? the quest is completely rewarded.
+ if fireproof_quest.item_points_remaining == 0 then quest(FIREPROOF_QUEST).status = QUEST_STATUS_REWARDED end
+
+ return TRUE, stack
+end
+
diff --git a/lib/mods/theme/scpt/god.lua b/lib/mods/theme/scpt/god.lua
new file mode 100644
index 00000000..7567178c
--- /dev/null
+++ b/lib/mods/theme/scpt/god.lua
@@ -0,0 +1,812 @@
+-- The god quest: find randomly placed relic in a randomly placed dungeon!
+
+-- set some global variables (stored in the save file via the ["data"] key)
+god_quest = {}
+
+-- increase this number to make god quests more common, to a max value of 100
+god_quest.CHANCE_OF_GOD_QUEST = 21
+
+-- increase this number to make more quests
+god_quest.MAX_NUM_GOD_QUESTS = 7
+
+-- d_idx of the god_quest (Lost Temple) dungeon
+god_quest.DUNGEON_GOD = 30
+
+add_quest
+{
+ ["global"] = "GOD_QUEST",
+ ["name"] = "God quest",
+ ["desc"] = function()
+
+ if quest(GOD_QUEST).status == QUEST_STATUS_TAKEN then
+
+ -- get the direction that the dungeon lies from lothlorien/angband
+ local home, home_axis, home_distance, home2, home2_axis, home2_distance = get_god_quest_axes()
+
+ print_hook("#####yGod quest "..god_quest.quests_given.."!\n")
+ print_hook("Thou art to find the lost temple of thy God and\n");
+ print_hook("to retrieve the lost part of the relic for thy God! \n")
+ if home_axis ~= "close" then
+ print_hook("The temple lies "..home_distance.." to the "..home_axis.." of "..home..", \n")
+ else
+ print_hook("The temple lies very close to "..home..", \n")
+ end
+ if home2_axis ~= "close" then
+ print_hook( "and "..home2_distance.." to the "..home2_axis.." of "..home2..", I can feel it.' \n")
+ else
+ print_hook("and very close to "..home2..", I can feel it.' \n")
+ end
+ print_hook("\n")
+ end
+ end,
+ ["level"] = -1,
+ ["data"] = {
+ ["god_quest.relic_num"] = 1,
+ ["god_quest.quests_given"] = 0,
+ ["god_quest.relics_found"] = 0,
+ ["god_quest.dun_mindepth"] = 1,
+ ["god_quest.dun_maxdepth"] = 4,
+ ["god_quest.dun_minplev"] = 0,
+ ["god_quest.relic_gen_tries"] = 0,
+ ["god_quest.relic_generated"] = FALSE,
+ ["god_quest.dung_x"] = 1,
+ ["god_quest.dung_y"] = 1,
+ ["god_quest.player_x"] = 0,
+ ["god_quest.player_y"] = 0,
+ },
+ ["hooks"] = {
+ -- Start the game without the quest, given it by chance
+ [HOOK_BIRTH_OBJECTS] = function()
+ quest(GOD_QUEST).status = QUEST_STATUS_UNTAKEN
+
+ -- initialise save-file stored variables when new character is created
+ god_quest.relic_num = 1
+ god_quest.quests_given = 0
+ god_quest.relics_found = 0
+ god_quest.dun_mindepth = 1
+ god_quest.dun_maxdepth = 4
+ god_quest.dun_minplev = 0
+ god_quest.relic_gen_tries = 0
+ god_quest.relic_generated = FALSE
+ end,
+ [HOOK_PLAYER_LEVEL] = function(gained)
+ local home_axis, home
+
+ if gained > 0 then
+ -- roll for chance of quest
+ local give_god_quest = magik(god_quest.CHANCE_OF_GOD_QUEST)
+
+ -- check player is worshipping a god, not already on a god quest.
+ if (player.astral ~= FALSE) or (player.pgod <= 0)
+ or (quest(GOD_QUEST).status == QUEST_STATUS_TAKEN) or (quest(GOD_QUEST).status == QUEST_STATUS_FAILED)
+ or (god_quest.quests_given >= god_quest.MAX_NUM_GOD_QUESTS) or (give_god_quest == FALSE)
+ or ((current_dungeon_idx == god_quest.DUNGEON_GOD) and (dun_level > 0)) or (player.lev <= god_quest.dun_minplev) then
+ -- Don't let a player get quests with trickery
+ if player.lev > god_quest.dun_minplev then
+ god_quest.dun_minplev = player.lev
+ end
+ return
+ else
+ -- each god has different characteristics, so the quests are differnet depending on your god
+ if player.pgod == GOD_ERU then
+ god_quest.relic_num = 7
+ elseif player.pgod == GOD_MANWE then
+ god_quest.relic_num = 8
+ elseif player.pgod == GOD_TULKAS then
+ god_quest.relic_num = 9
+ elseif player.pgod == GOD_MELKOR then
+ god_quest.relic_num = 10
+ elseif player.pgod == GOD_YAVANNA then
+ god_quest.relic_num = 11
+ elseif player.pgod == GOD_AULE then
+ god_quest.relic_num = 16
+ elseif player.pgod == GOD_VARDA then
+ god_quest.relic_num = 17
+ elseif player.pgod == GOD_ULMO then
+ god_quest.relic_num = 18
+ elseif player.pgod == GOD_MANDOS then
+ god_quest.relic_num = 19
+ end
+
+ -- This var will need resetting
+ god_quest.relic_generated = FALSE
+ quest(GOD_QUEST).status = QUEST_STATUS_TAKEN
+ god_quest.quests_given = god_quest.quests_given + 1
+
+ -- actually place the dungeon in a random place
+ place_rand_dung()
+
+ -- store the variables of the coords where the player was given the quest
+ god_quest.player_y, god_quest.player_x = player.get_wild_coord()
+
+ -- establish direction of player and 'home' from dungeon
+ local home, home_axis, home_distance, home2, home2_axis, home2_distance = get_god_quest_axes()
+
+ -- God issues instructions
+ cmsg_print(TERM_L_BLUE, "The voice of "..deity(player.pgod).name.." booms in your head:")
+
+ cmsg_print(TERM_YELLOW, "'I have a task for thee.")
+ cmsg_print(TERM_YELLOW, "Centuries ago an ancient relic of mine was broken apart.")
+ cmsg_print(TERM_YELLOW, "The pieces of it have been lost in fallen temples.")
+ cmsg_print(TERM_YELLOW, "Thou art to find my lost temple and retrieve a piece of the relic.")
+ cmsg_print(TERM_YELLOW, "When thy task is done, thou art to lift it in the air and call upon my name.")
+ cmsg_print(TERM_YELLOW, "I shall then come to reclaim what is mine!")
+ if home_axis ~= "close" then
+ cmsg_print(TERM_YELLOW, "The temple lies "..home_distance.." to the "..home_axis.." of "..home..", ")
+ else
+ cmsg_print(TERM_YELLOW, "The temple lies very close to "..home..",")
+ end
+
+ if home2_axis ~= "close" then
+ cmsg_print(TERM_YELLOW, "and "..home2_distance.." to the "..home2_axis.." of "..home2..", I can feel it.'")
+ else
+ cmsg_print(TERM_YELLOW, "and very close to "..home2..", I can feel it.'")
+ end
+
+ -- Prepare depth of dungeon. If this was generated in set_god_dungeon_attributes(),
+ -- then we'd have trouble if someone levelled up in the dungeon!
+ god_quest.dun_mindepth = player.lev*2/3
+ god_quest.dun_maxdepth = god_quest.dun_mindepth + 4
+ end
+ end
+ end,
+ [HOOK_LEVEL_END_GEN] = function()
+ local chance
+
+ -- Check for dungeon
+ if (current_dungeon_idx ~= god_quest.DUNGEON_GOD) or (quest(GOD_QUEST).status == QUEST_STATUS_UNTAKEN) then
+ return
+ -- if the relic has been created at this point, then it was created on the *PREVIOUS* call of HOOK_LEVEL_END_GEN, and
+ -- therefore the player has caused another level generation in the temple and hence failed the quest.
+ elseif (god_quest.relic_generated == TRUE) and quest(GOD_QUEST).status ~= QUEST_STATUS_FAILED then
+
+ -- fail the quest, don't give another one, don't give this message again
+ quest(GOD_QUEST).status = QUEST_STATUS_FAILED
+ -- God issues instructions
+ cmsg_print(TERM_L_BLUE, "The voice of "..deity(player.pgod).name.." booms in your head:")
+
+ cmsg_print(TERM_YELLOW, "'Thou art a fool!")
+ cmsg_print(TERM_YELLOW, "I told thee to look carefully for the relic. It appears thou hast missed the")
+ cmsg_print(TERM_YELLOW, "opportunity to claim it in my name, as I sense that those monsters who ")
+ cmsg_print(TERM_YELLOW, "have overrun my temple have destroyed it themselves.")
+ cmsg_print(TERM_YELLOW, "I shall not ask thee to do such a thing again, as thou hast failed me in this")
+ cmsg_print(TERM_YELLOW, "simple task!'")
+ else
+ -- Force relic generation on 5th attempt if others have been unsuccessful.
+ if (god_quest.relic_gen_tries == 4) and (god_quest.relic_generated == FALSE) then
+ generate_relic()
+ else
+ -- 1/5 chance of generation
+ chance = randint(5)
+ if (chance == 5) then
+ generate_relic()
+ else
+ god_quest.relic_gen_tries = god_quest.relic_gen_tries + 1
+ end
+ end
+ end
+ end,
+ [HOOK_ENTER_DUNGEON] = function(d_idx)
+ -- call the function to set the dungeon variables (dependant on pgod) the first time we enter the dungeon
+ if d_idx ~= god_quest.DUNGEON_GOD then
+ return
+ else
+ set_god_dungeon_attributes()
+ end
+ end,
+ [HOOK_GEN_LEVEL_BEGIN] = function()
+ -- call the function to set the dungeon variables (dependant on pgod) when we WoR back into the dungeon
+ if current_dungeon_idx ~= god_quest.DUNGEON_GOD then
+ return
+ else
+ set_god_dungeon_attributes()
+ end
+ end,
+ [HOOK_STAIR] = function()
+ -- call the function to set the dungeon variables (dependant on pgod) every time we go down a level
+ if current_dungeon_idx ~= god_quest.DUNGEON_GOD then
+ return
+ else
+ set_god_dungeon_attributes()
+ end
+ end,
+ [HOOK_GET] = function(o_ptr, item)
+ -- Is it the relic, and check to make sure the relic hasn't already been identified
+ if (quest(GOD_QUEST).status == QUEST_STATUS_TAKEN) and (o_ptr.tval == TV_JUNK) and (o_ptr.sval == god_quest.relic_num)
+ and (o_ptr.pval ~= TRUE) and (god_quest.relics_found < god_quest.quests_given) then
+
+ -- more God talky-talky
+ cmsg_print(TERM_L_BLUE, deity(player.pgod).name.." speaks to you:")
+
+ -- Is it the last piece of the relic?
+ if (god_quest.quests_given == god_quest.MAX_NUM_GOD_QUESTS) then
+ cmsg_print(TERM_YELLOW, "'At last! Thou hast found all of the relic pieces.")
+
+ -- reward player by increasing prayer skill
+ cmsg_print(TERM_YELLOW, "Thou hast done exceptionally well! I shall increase thy prayer skill even more!'")
+ skill(SKILL_PRAY).value = skill(SKILL_PRAY).value + (10 * (skill(SKILL_PRAY).mod))
+
+ -- Take the relic piece
+ floor_item_increase(item, -1)
+ floor_item_optimize(item)
+ else
+ cmsg_print(TERM_YELLOW, "'Well done! Thou hast found part of the relic.")
+ cmsg_print(TERM_YELLOW, "I shall surely ask thee to find more of it later!")
+ cmsg_print(TERM_YELLOW, "I will take it from thee for now'")
+
+ -- Take the relic piece
+ floor_item_increase(item, -1)
+ floor_item_optimize(item)
+
+ -- reward player by increasing prayer skill
+ cmsg_print(TERM_YELLOW, "'As a reward, I shall teach thee how to pray better'")
+ skill(SKILL_PRAY).value = skill(SKILL_PRAY).value + (5 * (skill(SKILL_PRAY).mod))
+ end
+
+ -- relic piece has been identified
+ o_ptr.pval = TRUE
+ god_quest.relics_found = god_quest.relics_found + 1
+
+ -- Make sure quests can be given again if neccesary
+ quest(GOD_QUEST).status = QUEST_STATUS_UNTAKEN
+ return TRUE
+ end
+ end,
+ [HOOK_CHAR_DUMP] = function()
+
+ if (god_quest.quests_given > 0) then
+
+ local relics = god_quest.relics_found
+ local append_text = ""
+ if (god_quest.relics_found == god_quest.MAX_NUM_GOD_QUESTS) then
+ relics = "all"
+ append_text = " and pleased your god"
+ else
+ if (god_quest.relics_found == 0) then
+ relics = "none"
+ end
+ if (quest(GOD_QUEST).status == QUEST_STATUS_FAILED) then
+ append_text = " and failed in your quest"
+ end
+ end
+
+ print_hook("\n You found "..(relics).." of the relic pieces"..(append_text)..".")
+
+ end
+ end,
+ },
+}
+
+-- this function places the lost temple at a randomly determined place.
+function place_rand_dung()
+ local tries, grid
+
+ -- erase old dungeon
+ if (god_quest.quests_given > 0) then
+ place_dungeon(god_quest.dung_y, god_quest.dung_x)
+
+ -- erase old recall level
+ max_dlv[god_quest.DUNGEON_GOD + 1] = 0
+ end
+
+ -- initialise tries variable
+ tries = 1000
+
+ while tries > 0 do
+
+ tries = tries - 1
+ -- get grid coordinates, within a range which prevents dungeon being generated at the very edge of the wilderness (would crash the game).
+ god_quest.dung_x = rand_range(1, max_wild_x-2)
+ god_quest.dung_y = rand_range(1, max_wild_y-2)
+
+ -- Is there a town/dungeon/potentially impassable feature there, ?
+ if (wild_map(god_quest.dung_y, god_quest.dung_x).entrance ~= 0)
+ or (wild_feat(wild_map(god_quest.dung_y, god_quest.dung_x)).entrance ~= 0)
+ or (wild_feat(wild_map(god_quest.dung_y, god_quest.dung_x)).terrain_idx == TERRAIN_EDGE)
+ or (wild_feat(wild_map(god_quest.dung_y, god_quest.dung_x)).terrain_idx == TERRAIN_DEEP_WATER)
+ or (wild_feat(wild_map(god_quest.dung_y, god_quest.dung_x)).terrain_idx == TERRAIN_TREES)
+ or (wild_feat(wild_map(god_quest.dung_y, god_quest.dung_x)).terrain_idx == TERRAIN_SHALLOW_LAVA)
+ or (wild_feat(wild_map(god_quest.dung_y, god_quest.dung_x)).terrain_idx == TERRAIN_DEEP_LAVA)
+ or (wild_feat(wild_map(god_quest.dung_y, god_quest.dung_x)).terrain_idx == TERRAIN_MOUNTAIN) then
+ -- try again
+ else
+ --neither player, nor wall, then stop this 'while'
+ break
+ end
+ end
+
+ -- Uhuh BAD ! lets use the default location up bree
+ if tries == 0 then
+ god_quest.dung_x = 32
+ god_quest.dung_y = 19
+ end
+
+ -- create god dungeon in that place
+ place_dungeon(god_quest.dung_y, god_quest.dung_x, god_quest.DUNGEON_GOD)
+
+end
+
+-- this function generates the relic at a randomly determined place in the temple.
+function generate_relic()
+ local tries, grid, x, y, relic
+
+ -- initialise tries variable
+ tries = 1000
+
+ while (tries > 0) do
+
+ tries = tries - 1
+ -- get grid coordinates from current height/width, minus one to prevent relic being generated in outside wall. (would crash the game)
+ y = randint(cur_hgt-1)
+ x = randint(cur_wid-1)
+ grid = cave(y, x)
+
+ -- are the coordinates on a floor, not on a permanent feature (eg stairs), and not on a trap ?
+ if (cave_is(grid, FF1_FLOOR) == TRUE) and (cave_is(grid, FF1_PERMANENT) == FALSE) and (grid.t_idx == 0) then break end
+
+ end
+
+ -- create relic
+ relic = create_object(TV_JUNK, god_quest.relic_num)
+
+ -- inscribe it to prevent automatizer 'accidents'
+ relic.note = quark_add("quest")
+
+ -- If no safe co-ords were found, put it in the players backpack
+ if tries == 0 then
+
+ -- explain it
+ msg_print(TERM_L_BLUE, "You luckily stumble across the relic on the stairs!")
+
+ if (inven_carry_okay(relic)) then
+ inven_carry(relic, FALSE)
+ else
+ -- no place found, drop it on the stairs
+ drop_near(relic, -1, player.py, player.px)
+ end
+
+ else
+ -- drop it
+ drop_near(relic, -1, y, x)
+ end
+
+ -- Only generate once!
+ god_quest.relic_generated = TRUE
+
+ -- Reset some variables
+ god_quest.relic_gen_tries = 0
+
+end
+
+
+
+
+function set_god_dungeon_attributes()
+
+ -- dungeon properties altered according to which god player is worshipping,
+ if player.pgod == GOD_ERU then
+
+ -- The Eru temple is based on Meneltarma.
+ -- W: Not too many monsters (they'll be tough though, with big levels)
+ dungeon(god_quest.DUNGEON_GOD).min_m_alloc_level = 14
+ dungeon(god_quest.DUNGEON_GOD).min_m_alloc_chance = 200
+
+ -- L: Dirt and grass. More dirt at bottom, more grass at top. rocky ground would be nice
+ dungeon(god_quest.DUNGEON_GOD).floor1 = 88
+ dungeon(god_quest.DUNGEON_GOD).floor2 = 89
+ dungeon(god_quest.DUNGEON_GOD).floor_percent1[1] = 70
+ dungeon(god_quest.DUNGEON_GOD).floor_percent2[1] = 30
+ dungeon(god_quest.DUNGEON_GOD).floor_percent1[2] = 10
+ dungeon(god_quest.DUNGEON_GOD).floor_percent2[2] = 90
+
+ -- A: Outer wall mountain chain. other walls granite
+ dungeon(god_quest.DUNGEON_GOD).fill_type1 = 97
+ dungeon(god_quest.DUNGEON_GOD).fill_percent1[1] = 100
+ dungeon(god_quest.DUNGEON_GOD).outer_wall = 57
+ dungeon(god_quest.DUNGEON_GOD).inner_wall = 97
+ dungeon(god_quest.DUNGEON_GOD).fill_method = 2
+
+ -- O: "At Meneltarma no weapon or tool had ever been borne" (but invaders would have left a small number)
+ dungeon(god_quest.DUNGEON_GOD).objs.treasure = 45
+ dungeon(god_quest.DUNGEON_GOD).objs.combat = 5
+ dungeon(god_quest.DUNGEON_GOD).objs.magic = 45
+ dungeon(god_quest.DUNGEON_GOD).objs.tools = 5
+
+ -- F: A large pillar, with stairs created at edges. (You can't climb a rock through the middle, can you?)
+ dungeon(god_quest.DUNGEON_GOD).flags1 = bor(DF1_BIG, DF1_NO_DOORS, DF1_CIRCULAR_ROOMS, DF1_EMPTY, DF1_TOWER, DF1_FLAT, DF1_ADJUST_LEVEL_2)
+ dungeon(god_quest.DUNGEON_GOD).flags2 = bor(DF2_ADJUST_LEVEL_1_2, DF2_NO_SHAFT, DF2_ADJUST_LEVEL_PLAYER)
+
+ -- R:
+ dungeon(god_quest.DUNGEON_GOD).rules[1].mode = 3
+ dungeon(god_quest.DUNGEON_GOD).rules[1].percent = 50
+
+ -- M: We want evil or flying characters
+ dungeon(god_quest.DUNGEON_GOD).rules[1].mflags3 = RF3_EVIL
+
+ dungeon(god_quest.DUNGEON_GOD).rules[2].mode = 3
+ dungeon(god_quest.DUNGEON_GOD).rules[2].percent = 50
+
+ -- M: We want evil or flying characters
+ dungeon(god_quest.DUNGEON_GOD).rules[2].mflags7 = RF7_CAN_FLY
+
+
+ elseif player.pgod == GOD_MANWE then
+
+ -- Manwe's lost temple is high in the clouds
+ -- W: Has average number of monsters.
+ dungeon(god_quest.DUNGEON_GOD).min_m_alloc_level = 18
+ dungeon(god_quest.DUNGEON_GOD).min_m_alloc_chance = 160
+
+
+ -- L: floor will be 'cloud-like vapour' and pools of 'condensing water'
+ dungeon(god_quest.DUNGEON_GOD).floor1 = 208
+ dungeon(god_quest.DUNGEON_GOD).floor2 = 209
+ dungeon(god_quest.DUNGEON_GOD).floor_percent1[1] = 85
+ dungeon(god_quest.DUNGEON_GOD).floor_percent2[1] = 15
+
+ -- A: Outer wall is 'hail stone wall', inner wall 'dense fog'. FIlled at max smoothing, like islands.
+ dungeon(god_quest.DUNGEON_GOD).fill_type1 = 211
+ dungeon(god_quest.DUNGEON_GOD).fill_percent1[1] = 100
+ dungeon(god_quest.DUNGEON_GOD).outer_wall = 210
+ dungeon(god_quest.DUNGEON_GOD).inner_wall = 211
+ dungeon(god_quest.DUNGEON_GOD).fill_method = 4
+
+ -- O: Can't imagine Manwe having much treasure. Little need for tools in a cloud temple. lots of magical stuff though...
+ dungeon(god_quest.DUNGEON_GOD).objs.treasure = 15
+ dungeon(god_quest.DUNGEON_GOD).objs.combat = 25
+ dungeon(god_quest.DUNGEON_GOD).objs.magic = 55
+ dungeon(god_quest.DUNGEON_GOD).objs.tools = 5
+
+ -- F: It's open, goes up like a tower, give it a few interesting rooms, make the monsters hard(ish).
+ dungeon(god_quest.DUNGEON_GOD).flags1 = bor(DF1_NO_DOORS, DF1_TOWER, DF1_CAVERN, DF1_ADJUST_LEVEL_2)
+ dungeon(god_quest.DUNGEON_GOD).flags2 = bor(DF2_NO_SHAFT, DF2_ADJUST_LEVEL_PLAYER)
+
+ -- R:
+ dungeon(god_quest.DUNGEON_GOD).rules[1].mode = 3
+ dungeon(god_quest.DUNGEON_GOD).rules[1].percent = 20
+ dungeon(god_quest.DUNGEON_GOD).rules[2].mode = 3
+ dungeon(god_quest.DUNGEON_GOD).rules[2].percent = 20
+ dungeon(god_quest.DUNGEON_GOD).rules[3].mode = 3
+ dungeon(god_quest.DUNGEON_GOD).rules[3].percent = 20
+ dungeon(god_quest.DUNGEON_GOD).rules[4].mode = 3
+ dungeon(god_quest.DUNGEON_GOD).rules[4].percent = 20
+ dungeon(god_quest.DUNGEON_GOD).rules[5].mode = 3
+ dungeon(god_quest.DUNGEON_GOD).rules[5].percent = 20
+
+ -- M: We want air(poison-type) or flying characters. Orcs too. They would have ransacked his elf-loving temple :)
+ dungeon(god_quest.DUNGEON_GOD).rules[1].mflags2 = RF2_INVISIBLE
+ dungeon(god_quest.DUNGEON_GOD).rules[2].mflags3 = bor(RF3_ORC, RF3_IM_POIS)
+ dungeon(god_quest.DUNGEON_GOD).rules[3].mflags4 = bor(RF4_BR_POIS, RF4_BR_GRAV)
+ dungeon(god_quest.DUNGEON_GOD).rules[4].mflags5 = RF5_BA_POIS
+ dungeon(god_quest.DUNGEON_GOD).rules[5].mflags7 = RF7_CAN_FLY
+
+
+ elseif player.pgod == GOD_TULKAS then
+
+ -- Tulkas dungeon is quite normal, possibly a bit boring to be honest. Maybe I should add something radical to it.
+ -- 'The house of Tulkas in the midmost of Valmar was a house of mirth and revelry. It sprang into the air with many storeys,
+ -- and had a tower of bronze and pillars of copper in a wide arcade'
+ -- W: but with lots of monsters
+ dungeon(god_quest.DUNGEON_GOD).min_m_alloc_level = 20
+ dungeon(god_quest.DUNGEON_GOD).min_m_alloc_chance = 120
+
+ -- L: floor is normal
+ dungeon(god_quest.DUNGEON_GOD).floor1 = 1
+ dungeon(god_quest.DUNGEON_GOD).floor_percent1[1] = 100
+
+ -- A: Granite walls
+ dungeon(god_quest.DUNGEON_GOD).fill_type1 = 56
+ dungeon(god_quest.DUNGEON_GOD).fill_percent1[1] = 100
+ dungeon(god_quest.DUNGEON_GOD).outer_wall = 58
+ dungeon(god_quest.DUNGEON_GOD).inner_wall = 57
+ dungeon(god_quest.DUNGEON_GOD).fill_method = 0
+
+ -- O: Loads of combat drops
+ dungeon(god_quest.DUNGEON_GOD).objs.treasure = 10
+ dungeon(god_quest.DUNGEON_GOD).objs.combat = 70
+ dungeon(god_quest.DUNGEON_GOD).objs.magic = 5
+ dungeon(god_quest.DUNGEON_GOD).objs.tools = 15
+
+ -- F: fairly standard
+ dungeon(god_quest.DUNGEON_GOD).flags1 = bor(DF1_NO_DESTROY, DF1_ADJUST_LEVEL_2)
+ dungeon(god_quest.DUNGEON_GOD).flags2 = DF2_ADJUST_LEVEL_PLAYER
+
+ -- R:
+ dungeon(god_quest.DUNGEON_GOD).rules[1].mode = 3
+ dungeon(god_quest.DUNGEON_GOD).rules[1].percent = 100
+
+ -- M: plenty demons please
+ dungeon(god_quest.DUNGEON_GOD).rules[1].mflags3 = bor(RF3_DEMON, RF3_EVIL)
+
+
+ elseif player.pgod == GOD_MELKOR then
+
+ -- Melkors dungeon will be dark, fiery and stuff
+ -- Many many monsters! (but prob ADJUST_LEVEL_1_2)
+ dungeon(god_quest.DUNGEON_GOD).min_m_alloc_level = 24
+ dungeon(god_quest.DUNGEON_GOD).min_m_alloc_chance = 80
+
+
+ -- L: floor is dirt/mud/nether
+ dungeon(god_quest.DUNGEON_GOD).floor1 = 88
+ dungeon(god_quest.DUNGEON_GOD).floor2 = 94
+ dungeon(god_quest.DUNGEON_GOD).floor3 = 102
+ dungeon(god_quest.DUNGEON_GOD).floor_percent1[1] = 45
+ dungeon(god_quest.DUNGEON_GOD).floor_percent2[1] = 45
+ dungeon(god_quest.DUNGEON_GOD).floor_percent3[1] = 10
+ dungeon(god_quest.DUNGEON_GOD).floor_percent1[2] = 35
+ dungeon(god_quest.DUNGEON_GOD).floor_percent2[2] = 35
+ dungeon(god_quest.DUNGEON_GOD).floor_percent3[2] = 30
+
+ -- A: Granite walls to fill but glass walls for room perimeters (you can see the nasty monsters coming)
+ dungeon(god_quest.DUNGEON_GOD).fill_type1 = 188
+ dungeon(god_quest.DUNGEON_GOD).fill_percent1[1] = 100
+ dungeon(god_quest.DUNGEON_GOD).outer_wall = 188
+ dungeon(god_quest.DUNGEON_GOD).inner_wall = 57
+ dungeon(god_quest.DUNGEON_GOD).fill_method = 1
+
+ -- O: Even drops
+ dungeon(god_quest.DUNGEON_GOD).objs.treasure = 25
+ dungeon(god_quest.DUNGEON_GOD).objs.combat = 25
+ dungeon(god_quest.DUNGEON_GOD).objs.magic = 25
+ dungeon(god_quest.DUNGEON_GOD).objs.tools = 25
+
+ -- F: Small, lava rivers, nasty monsters hehehehehe
+ dungeon(god_quest.DUNGEON_GOD).flags1 = bor(DF1_SMALL, DF1_LAVA_RIVERS, DF1_ADJUST_LEVEL_1)
+ dungeon(god_quest.DUNGEON_GOD).flags2 = bor(DF2_ADJUST_LEVEL_1_2, DF2_ADJUST_LEVEL_PLAYER)
+
+ -- R: No restrictions on monsters here
+ dungeon(god_quest.DUNGEON_GOD).rules[1].mode = 0
+ dungeon(god_quest.DUNGEON_GOD).rules[1].percent = 80
+
+ -- R: Apart from making sure we have some GOOD ones
+ dungeon(god_quest.DUNGEON_GOD).rules[2].mode = 3
+ dungeon(god_quest.DUNGEON_GOD).rules[2].percent = 20
+
+ -- M:
+ dungeon(god_quest.DUNGEON_GOD).rules[2].mflags3 = RF3_GOOD
+
+ elseif player.pgod == GOD_YAVANNA then
+
+ -- Yavannas dungeon will be very natural, tress and stuff.
+ dungeon(god_quest.DUNGEON_GOD).min_m_alloc_level = 22
+ dungeon(god_quest.DUNGEON_GOD).min_m_alloc_chance = 100
+
+ -- L: floor is grass/flowers, plus dirt so not always regenerating quick!
+ dungeon(god_quest.DUNGEON_GOD).floor1 = 89
+ dungeon(god_quest.DUNGEON_GOD).floor2 = 199
+ dungeon(god_quest.DUNGEON_GOD).floor3 = 88
+ dungeon(god_quest.DUNGEON_GOD).floor_percent1[1] = 40
+ dungeon(god_quest.DUNGEON_GOD).floor_percent2[1] = 15
+ dungeon(god_quest.DUNGEON_GOD).floor_percent3[1] = 45
+
+ -- A: Tree walls to fill, small trees for inner walls
+ dungeon(god_quest.DUNGEON_GOD).fill_type1 = 96
+ dungeon(god_quest.DUNGEON_GOD).fill_percent1[1] = 100
+ dungeon(god_quest.DUNGEON_GOD).outer_wall = 202
+ dungeon(god_quest.DUNGEON_GOD).inner_wall = 96
+ dungeon(god_quest.DUNGEON_GOD).fill_method = 1
+
+ -- O: nt much combat.. tools where ransackers have tried to chop trees down.
+ dungeon(god_quest.DUNGEON_GOD).objs.treasure = 20
+ dungeon(god_quest.DUNGEON_GOD).objs.combat = 10
+ dungeon(god_quest.DUNGEON_GOD).objs.magic = 30
+ dungeon(god_quest.DUNGEON_GOD).objs.tools = 40
+
+ -- F: Natural looking
+ dungeon(god_quest.DUNGEON_GOD).flags1 = bor(DF1_NO_DOORS, DF1_WATER_RIVERS, DF1_NO_DESTROY, DF1_ADJUST_LEVEL_1, DF1_NO_RECALL)
+ dungeon(god_quest.DUNGEON_GOD).flags2 = bor(DF2_ADJUST_LEVEL_1_2, DF2_NO_SHAFT, DF2_NO_GENO, DF2_ADJUST_LEVEL_PLAYER)
+
+ -- R: Demons, Undead, non-living
+ dungeon(god_quest.DUNGEON_GOD).rules[1].mode = 3
+ dungeon(god_quest.DUNGEON_GOD).rules[1].percent = 100
+
+ -- M:
+ dungeon(god_quest.DUNGEON_GOD).rules[1].mflags3 = bor(RF3_DEMON, RF3_UNDEAD, RF3_NONLIVING)
+
+ elseif player.pgod == GOD_AULE then
+
+ dungeon(god_quest.DUNGEON_GOD).min_m_alloc_level = 24
+ dungeon(god_quest.DUNGEON_GOD).min_m_alloc_chance = 80
+
+ -- L: floor is dirt/mud/shallow water
+ dungeon(god_quest.DUNGEON_GOD).floor1 = 88
+ dungeon(god_quest.DUNGEON_GOD).floor2 = 94
+ dungeon(god_quest.DUNGEON_GOD).floor3 = 84
+ dungeon(god_quest.DUNGEON_GOD).floor_percent1[1] = 45
+ dungeon(god_quest.DUNGEON_GOD).floor_percent2[1] = 45
+ dungeon(god_quest.DUNGEON_GOD).floor_percent3[1] = 10
+ dungeon(god_quest.DUNGEON_GOD).floor_percent1[2] = 35
+ dungeon(god_quest.DUNGEON_GOD).floor_percent2[2] = 35
+ dungeon(god_quest.DUNGEON_GOD).floor_percent3[2] = 30
+
+ -- A: Grey mountains, inner walls are low hills
+ dungeon(god_quest.DUNGEON_GOD).fill_type1 = 216
+ dungeon(god_quest.DUNGEON_GOD).fill_percent1[1] = 100
+ dungeon(god_quest.DUNGEON_GOD).outer_wall = 216
+ dungeon(god_quest.DUNGEON_GOD).inner_wall = 213
+ dungeon(god_quest.DUNGEON_GOD).fill_method = 1
+
+ -- O: Weapons and tools only
+ dungeon(god_quest.DUNGEON_GOD).objs.treasure = 0
+ dungeon(god_quest.DUNGEON_GOD).objs.combat = 50
+ dungeon(god_quest.DUNGEON_GOD).objs.magic = 0
+ dungeon(god_quest.DUNGEON_GOD).objs.tools = 50
+
+ -- F: Small, no destroyed levels, min monster level = dungeon level
+ dungeon(god_quest.DUNGEON_GOD).flags1 = bor(DF1_SMALL, DF1_NO_DESTROY, DF1_ADJUST_LEVEL_1, DF1_NO_STREAMERS)
+
+ -- R: No restrictions on monsters here
+ dungeon(god_quest.DUNGEON_GOD).rules[1].mode = 0
+ dungeon(god_quest.DUNGEON_GOD).rules[1].percent = 80
+
+ elseif player.pgod == GOD_VARDA then
+
+ -- Varda lives with Manwe, so high in the clouds
+ -- W: Has average number of monsters.
+ dungeon(god_quest.DUNGEON_GOD).min_m_alloc_level = 18
+ dungeon(god_quest.DUNGEON_GOD).min_m_alloc_chance = 160
+
+
+ -- L: floor will be grass and flowers
+ dungeon(god_quest.DUNGEON_GOD).floor1 = 89
+ dungeon(god_quest.DUNGEON_GOD).floor2 = 82
+ dungeon(god_quest.DUNGEON_GOD).floor_percent1[1] = 85
+ dungeon(god_quest.DUNGEON_GOD).floor_percent2[1] = 15
+
+ -- A: Outer wall is 'hail stone wall', inner wall 'dense fog'. Filled at max smoothing, like islands.
+ dungeon(god_quest.DUNGEON_GOD).fill_type1 = 211
+ dungeon(god_quest.DUNGEON_GOD).fill_percent1[1] = 100
+ dungeon(god_quest.DUNGEON_GOD).outer_wall = 210
+ dungeon(god_quest.DUNGEON_GOD).inner_wall = 211
+ dungeon(god_quest.DUNGEON_GOD).fill_method = 4
+
+ -- O: Varda likes magical items and tools, not much treasure or weapons
+ dungeon(god_quest.DUNGEON_GOD).objs.treasure = 15
+ dungeon(god_quest.DUNGEON_GOD).objs.combat = 5
+ dungeon(god_quest.DUNGEON_GOD).objs.magic = 55
+ dungeon(god_quest.DUNGEON_GOD).objs.tools = 25
+
+ -- F: It's open, goes up like a tower, give it a few interesting rooms, make the monsters hard(ish).
+ dungeon(god_quest.DUNGEON_GOD).flags1 = bor(DF1_NO_DOORS, DF1_TOWER, DF1_CAVERN, DF1_ADJUST_LEVEL_1)
+ dungeon(god_quest.DUNGEON_GOD).flags2 = bor(DF2_NO_SHAFT, DF2_ADJUST_LEVEL_PLAYER)
+
+ -- R:
+ dungeon(god_quest.DUNGEON_GOD).rules[1].mode = 3
+ dungeon(god_quest.DUNGEON_GOD).rules[1].percent = 20
+ dungeon(god_quest.DUNGEON_GOD).rules[2].mode = 3
+ dungeon(god_quest.DUNGEON_GOD).rules[2].percent = 20
+ dungeon(god_quest.DUNGEON_GOD).rules[3].mode = 3
+ dungeon(god_quest.DUNGEON_GOD).rules[3].percent = 20
+ dungeon(god_quest.DUNGEON_GOD).rules[4].mode = 3
+ dungeon(god_quest.DUNGEON_GOD).rules[4].percent = 20
+ dungeon(god_quest.DUNGEON_GOD).rules[5].mode = 3
+ dungeon(god_quest.DUNGEON_GOD).rules[5].percent = 20
+
+ -- M: We want air(poison-type) or flying characters. Orcs too.
+ dungeon(god_quest.DUNGEON_GOD).rules[1].mflags2 = RF2_INVISIBLE
+ dungeon(god_quest.DUNGEON_GOD).rules[2].mflags3 = bor(RF3_ORC, RF3_IM_POIS)
+ dungeon(god_quest.DUNGEON_GOD).rules[3].mflags4 = bor(RF4_BR_POIS, RF4_BR_GRAV)
+ dungeon(god_quest.DUNGEON_GOD).rules[4].mflags5 = RF5_BA_POIS
+ dungeon(god_quest.DUNGEON_GOD).rules[5].mflags7 = RF7_CAN_FLY
+
+
+ elseif player.pgod == GOD_ULMO then
+
+ -- Mandos dungeon is basically Tulkas, except with undead.
+ -- W: but with lots of monsters
+ dungeon(god_quest.DUNGEON_GOD).min_m_alloc_level = 20
+ dungeon(god_quest.DUNGEON_GOD).min_m_alloc_chance = 120
+
+ -- L: floor is dirt
+ dungeon(god_quest.DUNGEON_GOD).floor1 = 88
+ dungeon(god_quest.DUNGEON_GOD).floor_percent1[1] = 100
+
+ -- A: Cheat: walls are water.
+ dungeon(god_quest.DUNGEON_GOD).fill_type1 = 187
+ dungeon(god_quest.DUNGEON_GOD).fill_percent1[1] = 100
+ dungeon(god_quest.DUNGEON_GOD).outer_wall = 238
+ dungeon(god_quest.DUNGEON_GOD).inner_wall = 84
+ dungeon(god_quest.DUNGEON_GOD).fill_method = 0
+
+ -- O: Lots of treasure, not much else.
+ dungeon(god_quest.DUNGEON_GOD).objs.treasure = 90
+ dungeon(god_quest.DUNGEON_GOD).objs.combat = 0
+ dungeon(god_quest.DUNGEON_GOD).objs.magic = 5
+ dungeon(god_quest.DUNGEON_GOD).objs.tools = 5
+
+ -- F: fairly standard
+ dungeon(god_quest.DUNGEON_GOD).flags1 = bor(DF1_NO_DESTROY, DF1_ADJUST_LEVEL_2)
+ dungeon(god_quest.DUNGEON_GOD).flags2 = DF2_ADJUST_LEVEL_PLAYER
+
+ -- R:
+ dungeon(god_quest.DUNGEON_GOD).rules[1].mode = 3
+ dungeon(god_quest.DUNGEON_GOD).rules[1].percent = 35
+ dungeon(god_quest.DUNGEON_GOD).rules[2].mode = 3
+ dungeon(god_quest.DUNGEON_GOD).rules[2].percent = 30
+ dungeon(god_quest.DUNGEON_GOD).rules[3].mode = 3
+ dungeon(god_quest.DUNGEON_GOD).rules[3].percent = 30
+
+ -- M: Aquatic creatures only.
+ dungeon(god_quest.DUNGEON_GOD).rules[1].mflags3 = RF7_CAN_FLY
+ dungeon(god_quest.DUNGEON_GOD).rules[2].mflags3 = RF7_AQUATIC
+ dungeon(god_quest.DUNGEON_GOD).rules[3].mflags3 = RF3_RES_WATE
+
+ elseif player.pgod == GOD_MANDOS then
+
+ -- Mandos dungeon is basically Tulkas, except with undead.
+ -- W: but with lots of monsters
+ dungeon(god_quest.DUNGEON_GOD).min_m_alloc_level = 20
+ dungeon(god_quest.DUNGEON_GOD).min_m_alloc_chance = 120
+
+ -- L: floor is normal
+ dungeon(god_quest.DUNGEON_GOD).floor1 = 1
+ dungeon(god_quest.DUNGEON_GOD).floor_percent1[1] = 100
+
+ -- A: Granite walls
+ dungeon(god_quest.DUNGEON_GOD).fill_type1 = 56
+ dungeon(god_quest.DUNGEON_GOD).fill_percent1[1] = 100
+ dungeon(god_quest.DUNGEON_GOD).outer_wall = 58
+ dungeon(god_quest.DUNGEON_GOD).inner_wall = 57
+ dungeon(god_quest.DUNGEON_GOD).fill_method = 0
+
+ -- O: Loads of combat drops
+ dungeon(god_quest.DUNGEON_GOD).objs.treasure = 10
+ dungeon(god_quest.DUNGEON_GOD).objs.combat = 70
+ dungeon(god_quest.DUNGEON_GOD).objs.magic = 5
+ dungeon(god_quest.DUNGEON_GOD).objs.tools = 15
+
+ -- F: fairly standard
+ dungeon(god_quest.DUNGEON_GOD).flags1 = bor(DF1_NO_DESTROY, DF1_ADJUST_LEVEL_2)
+ dungeon(god_quest.DUNGEON_GOD).flags2 = DF2_ADJUST_LEVEL_PLAYER
+
+ -- R:
+ dungeon(god_quest.DUNGEON_GOD).rules[1].mode = 3
+ dungeon(god_quest.DUNGEON_GOD).rules[1].percent = 100
+
+ -- M: vampires!
+ dungeon(god_quest.DUNGEON_GOD).rules[1].r_char = "V"
+ dungeon(god_quest.DUNGEON_GOD).rules[1].mflags3 = bor(RF3_UNDEAD, RF3_EVIL)
+
+ end
+
+ -- W: All dungeons are 5 levels deep, and created at 2/3 of the player clvl when the quest is given
+ dungeon(god_quest.DUNGEON_GOD).mindepth = god_quest.dun_mindepth
+ dungeon(god_quest.DUNGEON_GOD).maxdepth = god_quest.dun_maxdepth
+ dungeon(god_quest.DUNGEON_GOD).minplev = god_quest.dun_minplev
+
+end
+
+-- Calling this function returns the direction the dungeon is in from the players position at the time
+-- the quest was given, and also the direction from angband (if the player is worshipping Melkor) or lothlorien.
+function get_god_quest_axes()
+ local home, home_y_coord, home_x_coord, home_axis, home2, home2_y_coord, home2_x_coord, home2_axis, mydistance
+
+ -- different values for different gods...
+ if player.pgod ~= GOD_MELKOR then
+
+ -- one of the valar, "home" is lothlorien, home2 is Minas Arnor
+ home = "Bree"
+ home_y_coord = 21
+ home_x_coord = 35
+ home2 = "Minas Anor"
+ home2_y_coord = 56
+ home2_x_coord = 60
+ else
+ -- Melkor, "home" is angband, home2 is Barad-dur
+ home = "the Pits of Angband"
+ home_y_coord = 7
+ home_x_coord = 11
+ home2 = "the Land of Mordor"
+ home2_y_coord = 49
+ home2_x_coord = 70
+ end
+
+ home_axis = compass(home_y_coord, home_x_coord, god_quest.dung_y, god_quest.dung_x)
+ home2_axis = compass(home2_y_coord, home2_x_coord, god_quest.dung_y, god_quest.dung_x)
+
+ home_distance = approximate_distance(home_y_coord, home_x_coord, god_quest.dung_y, god_quest.dung_x)
+ home2_distance = approximate_distance(home2_y_coord, home2_x_coord, god_quest.dung_y, god_quest.dung_x)
+
+ return home, home_axis, home_distance, home2, home2_axis, home2_distance
+end
diff --git a/lib/mods/theme/scpt/gods.lua b/lib/mods/theme/scpt/gods.lua
new file mode 100644
index 00000000..014a4423
--- /dev/null
+++ b/lib/mods/theme/scpt/gods.lua
@@ -0,0 +1,26 @@
+add_hooks
+{
+ [HOOK_FOLLOW_GOD] = function(god, action)
+ if action == "ask" then
+ if not (god == GOD_MELKOR) then
+ local i = INVEN_WIELD
+ while i < INVEN_TOTAL do
+ -- 13 is ART_POWER
+ if player.inventory(i).name1 == 13 then
+ msg_print("The One Ring has corrupted you, and you are rejected.")
+ return TRUE
+ end
+ i = i + 1
+ end
+ end
+ end
+ return FALSE
+ end,
+ [HOOK_RECALC_SKILLS] = function()
+ if not (player.pgod == GOD_NONE) and (get_skill(SKILL_ANTIMAGIC) > 0) then
+ msg_print("You no longer believe.")
+ abandon_god(GOD_ALL)
+ end
+ return FALSE
+ end,
+}
diff --git a/lib/mods/theme/scpt/gods_new.lua b/lib/mods/theme/scpt/gods_new.lua
new file mode 100644
index 00000000..8153d453
--- /dev/null
+++ b/lib/mods/theme/scpt/gods_new.lua
@@ -0,0 +1,454 @@
+-- This file contains all the new gods
+
+add_loadsave("GRACE_DELAY",0)
+
+function aule_stone_skin()
+local type
+ if player.grace >= 10000 then
+ type = SHIELD_COUNTER
+ else
+ type = 0
+ end
+
+ set_shield(randint(10) + 10 + (player.grace / 100), 10 + (player.grace / 100), type, 2 + (player.grace / 200), 3 + (player.grace / 400))
+end
+
+GOD_AULE = add_god
+{
+ ["name"] = "Aule the Smith",
+ ["desc"] =
+ {
+ "Aule is a smith, and the creator of the Dwarves."
+ },
+ ["hooks"] =
+ {
+ [HOOK_CALC_BONUS] = function()
+ if (player.pgod == GOD_AULE) and (player.grace > 0) then
+ -- Resist fire, not shown on the character screen (?)
+ if (player.grace > 5000) then
+ player.resist_fire = TRUE
+ end
+
+ local bonus = player.grace / 5000
+ if bonus > 5 then
+ bonus = 5
+ end
+ player.to_h = player.to_h + bonus
+ player.dis_to_h = player.dis_to_h + bonus
+ player.to_d = player.to_d + bonus
+ player.dis_to_d = player.dis_to_d + bonus
+
+ end
+ end,
+ [HOOK_PROCESS_WORLD] = function()
+ if (player.pgod == GOD_AULE) then
+ GRACE_DELAY = GRACE_DELAY + 1
+ if GRACE_DELAY >= 15 then
+ -- Aule likes Dwarves and Dark Elves (Eol's influence here)
+ if
+ (get_race_name() ~= "Dwarf") and
+ (get_race_name() ~= "Petty-dwarf") and
+ (get_race_name() ~= "Gnome") and
+ (get_race_name() ~= "Dark-Elf") then
+ set_grace(player.grace - 1)
+ end
+
+ -- Search inventory for axe or hammer - Gain 1 point of grace for each hammer or axe
+ for i = 0, INVEN_TOTAL - 1 do
+ if ((player.inventory(i).tval) == TV_AXE) then
+ set_grace(player.grace + 1)
+ end
+ if ((player.inventory(i).tval) == TV_HAFTED) then
+ if (((player.inventory(i).sval) == SV_WAR_HAMMER) or ((player.inventory(i).sval) == SV_LUCERN_HAMMER) or ((player.inventory(i).sval) == SV_GREAT_HAMMER)) then
+ set_grace(player.grace + 1)
+ end
+ end
+ end
+
+ if (player.praying == TRUE) then
+ set_grace(player.grace - 2)
+
+ -- Chance of casting Stoneskin if praying
+ local chance
+ if (player.grace >= 50000) then
+ chance = 50000
+ else
+ chance = 50000 - player.grace
+ end
+
+ if (randint(100000) <= 100000 / chance) then
+ aule_stone_skin()
+ msg_print("Aule casts Stone Skin on you.")
+ end
+
+ end
+ GRACE_DELAY = 0
+ end
+
+ end
+ end,
+ [HOOK_SACRIFICE_GOD] = function()
+ if (player.pgod == GOD_AULE) then
+ local ret, item, obj, value
+ ret, item = get_item(
+ "Sacrifice which item? ",
+ "You have nothing to sacrifice.",
+ USE_INVEN,
+ function(obj)
+ -- perhaps restrict this only to metal armour and weapons
+ if (obj.found == OBJ_FOUND_SELFMADE) then
+ return TRUE
+ end
+ return FALSE
+ end
+ )
+
+ -- Item selected
+ if ret == TRUE then
+ -- Increase piety by the value of the item / 10
+ -- object_value is not available in Lua, therefore I used the
+ -- cost of the base item, without magical boni
+ obj = get_object(item)
+ -- value = object_value(obj)/10
+ value = k_info[obj.k_idx + 1].cost/10
+
+ set_grace(player.grace + value)
+
+ -- remove the object
+ inven_item_increase(item, -1)
+ inven_item_optimize(item)
+ end
+ end
+ end,
+ [HOOK_MONSTER_DEATH] = function(m_idx)
+ if (player.pgod == GOD_AULE) then
+ m_ptr = monster(m_idx)
+ if
+ (m_ptr.r_idx == test_monster_name("Petty-dwarf")) or
+ (m_ptr.r_idx == test_monster_name("Petty-dwarf mage")) or
+ (m_ptr.r_idx == test_monster_name("Dark dwarven warrior")) or
+ (m_ptr.r_idx == test_monster_name("Dark dwarven smith")) or
+ (m_ptr.r_idx == test_monster_name("Dark dwarven lord")) or
+ (m_ptr.r_idx == test_monster_name("Dark dwarven priest")) or
+ (m_ptr.r_idx == test_monster_name("Dwarven warrior")) then
+ -- Aule dislikes you killing dwarves
+ set_grace(player.grace - 20)
+ end
+ if
+ (m_ptr.r_idx == test_monster_name("Nar, the Dwarf")) or
+ (m_ptr.r_idx == test_monster_name("Naugladur, Lord of Nogrod")) or
+ (m_ptr.r_idx == test_monster_name("Telchar the Smith")) or
+ (m_ptr.r_idx == test_monster_name("Fundin Bluecloak")) or
+ (m_ptr.r_idx == test_monster_name("Khim, Son of Mim")) or
+ (m_ptr.r_idx == test_monster_name("Ibun, Son of Mim")) or
+ (m_ptr.r_idx == test_monster_name("Mim, Betrayer of Turin")) then
+ -- These uniques earn a bigger penalty
+ set_grace(player.grace - 500)
+ end
+ end
+ end,
+ }
+}
+
+GOD_VARDA = add_god
+{
+ ["name"] = "Varda Elentari",
+ ["desc"] =
+ {
+ "The Queen of the Stars. In light is her power and joy."
+ },
+ ["hooks"] =
+ {
+ [HOOK_PROCESS_WORLD] = function()
+ if (player.pgod == GOD_VARDA) then
+ GRACE_DELAY = GRACE_DELAY + 1
+
+ -- piety increase if in light
+ if (GRACE_DELAY >= 15) then
+ if band(cave(player.py, player.px).info, CAVE_GLOW) ~= 0 then
+ set_grace(player.grace + 2)
+ end
+ if (
+ (get_race_name() == "Orc") or
+ (get_race_name() == "Troll") or
+ (get_race_name() == "Dragon") or
+ (get_race_name() == "Demon")) then
+ -- Varda hates evils
+ set_grace(player.grace - 2)
+ else
+ set_grace(player.grace - 1)
+ end
+
+ if (player.praying == TRUE) then
+ set_grace(player.grace - 1)
+ end
+ GRACE_DELAY = 0
+ end
+ end
+ end,
+ [HOOK_CALC_LITE] = function()
+ if (player.pgod == GOD_VARDA) then
+ -- increase lite radius
+ player.cur_lite = player.cur_lite + 1
+ end
+ end,
+ [HOOK_GF_EXEC] = function (target, who, type, dam, r, y, x, m_ptr)
+ if (player.pgod == GOD_VARDA) then
+ if ((type == GF_LITE) or (type == GF_LITE_WEAK)) then
+ -- Raise piety for using lite
+ set_grace(player.grace + 1)
+ end
+ end
+ end,
+ },
+}
+
+GOD_ULMO = add_god
+{
+ ["name"] = "Ulmo",
+ ["desc"] =
+ {
+ "Ulmo is called Lord of Waters, he rules all that is water on Arda."
+ },
+ ["hooks"] =
+ {
+ [HOOK_CALC_BONUS] = function()
+ if (player.pgod == GOD_ULMO) then
+ player.water_breath = TRUE
+ end
+ if (player.pgod == GOD_ULMO) and (player.grace > 0) then
+ local bonus = player.grace / 5000
+ if bonus > 5 then
+ bonus = 5
+ end
+
+ if ((player.grace > 1000) and (player.praying == TRUE)) then
+ player.resist_pois = TRUE
+ end
+ if ((player.grace > 15000) and (player.praying == TRUE)) then
+ player.magic_breath = TRUE
+ end
+ end
+ end,
+
+ [HOOK_MONSTER_DEATH] = function(m_idx)
+ if (player.pgod == GOD_ULMO) then
+ m_ptr = monster(m_idx)
+ if
+ (m_ptr.r_idx == test_monster_name("Swordfish")) or
+ (m_ptr.r_idx == test_monster_name("Barracuda")) or
+ (m_ptr.r_idx == test_monster_name("Globefish")) or
+ (m_ptr.r_idx == test_monster_name("Aquatic bear")) or
+ (m_ptr.r_idx == test_monster_name("Pike")) or
+ (m_ptr.r_idx == test_monster_name("Electric eel")) or
+ (m_ptr.r_idx == test_monster_name("Giant crayfish")) or
+ (m_ptr.r_idx == test_monster_name("Mermaid")) or
+ (m_ptr.r_idx == test_monster_name("Leviathan")) or
+ (m_ptr.r_idx == test_monster_name("Box jellyfish")) or
+ (m_ptr.r_idx == test_monster_name("Giant piranha")) or
+ (m_ptr.r_idx == test_monster_name("Piranha")) or
+ (m_ptr.r_idx == test_monster_name("Ocean naga")) or
+ (m_ptr.r_idx == test_monster_name("Whale")) or
+ (m_ptr.r_idx == test_monster_name("Octopus")) or
+ (m_ptr.r_idx == test_monster_name("Giant octopus")) or
+ (m_ptr.r_idx == test_monster_name("Drowned soul")) or
+ (m_ptr.r_idx == test_monster_name("Tiger shark")) or
+ (m_ptr.r_idx == test_monster_name("Hammerhead shark")) or
+ (m_ptr.r_idx == test_monster_name("Great white shark")) or
+ (m_ptr.r_idx == test_monster_name("White shark")) or
+ (m_ptr.r_idx == test_monster_name("Stargazer")) or
+ (m_ptr.r_idx == test_monster_name("Flounder")) or
+ (m_ptr.r_idx == test_monster_name("Giant turtle")) or
+ (m_ptr.r_idx == test_monster_name("Killer whale")) or
+ (m_ptr.r_idx == test_monster_name("Water naga")) or
+ (m_ptr.r_idx == test_monster_name("Behemoth")) then
+ -- He doesn't like it if you kill these monsters
+ set_grace(player.grace - 20)
+ end
+ if
+ (m_ptr.r_idx == test_monster_name("Seahorse")) or
+ (m_ptr.r_idx == test_monster_name("Aquatic elven warrior")) or
+ (m_ptr.r_idx == test_monster_name("Aquatic elven mage")) or
+ (m_ptr.r_idx == test_monster_name("Wavelord")) or
+ (m_ptr.r_idx == test_monster_name("The Watcher in the Water")) then
+ -- These monsters earn higher penalties
+ set_grace(player.grace - 500)
+ end
+ end
+ end,
+ [HOOK_GF_EXEC] = function (target, who, type, dam, r, y, x, m_ptr)
+ if (player.pgod == GOD_ULMO) then
+ if ((type == GF_FIRE) or (type == GF_HELL_FIRE) or (type == GF_HOLY_FIRE) or (type == GF_LAVA_FLOW) or (type == GF_METEOR) or (type == GF_NUKE) or (type == GF_PLASMA)) then
+ -- Reduce piety for using any kind of fire magic
+ set_grace(player.grace - 5)
+ end
+ end
+ end,
+ [HOOK_PROCESS_WORLD] = function()
+ if (player.pgod == GOD_ULMO) then
+ GRACE_DELAY = GRACE_DELAY + 1
+ if GRACE_DELAY >= 15 then
+ -- Ulmo likes the Edain (except Easterlings)
+ if
+ (get_race_name() == "Human") or
+ (get_race_name() == "Dunadan") or
+ (get_race_name() == "Druadan") or
+ (get_race_name() == "RohanKnight") then
+ set_grace(player.grace + 1)
+
+ elseif (
+ (get_race_name() == "Easterling") or
+ (get_race_name() == "Demon") or
+ (get_race_name() == "Orc")) then
+ -- hated races
+ set_grace(player.grace - 2)
+ else
+ set_grace(player.grace + 1)
+ end
+
+ if (player.praying == TRUE) then
+ set_grace(player.grace - 1)
+ end
+ -- Search inventory for axe or hammer - Gain 1 point of grace for each hammer or axe
+ for i = 0, INVEN_TOTAL - 1 do
+ if ((player.inventory(i).tval) == TV_POLEARM) then
+ if ((player.inventory(i).sval) == SV_TRIDENT) then
+ set_grace(player.grace + 1)
+ end
+ end
+ end
+
+ GRACE_DELAY = 0
+ end
+
+ end
+ end,
+ },
+}
+
+GOD_MANDOS = add_god
+{
+ ["name"] = "Mandos",
+ ["desc"] =
+ {
+ "The Doomsman of the Valar and keeper of the slain."
+ },
+ ["hooks"] =
+ {
+ [HOOK_CALC_BONUS] = function()
+ if (player.pgod == GOD_MANDOS) then
+ player.resist_neth = TRUE
+ end
+ if (player.pgod == GOD_MANDOS) and (player.grace > 0) then
+ local bonus = player.grace / 5000
+ if bonus > 5 then
+ bonus = 5
+ end
+
+ if ((player.grace > 10000) and (player.praying == TRUE)) then
+ player.resist_continuum = TRUE
+ end
+
+ if ((player.grace > 20000) and (player.praying == TRUE)) then
+ player.immune_neth = TRUE
+ end
+ end
+ end,
+ [HOOK_PROCESS_WORLD] = function()
+ if (player.pgod == GOD_MANDOS) then
+ GRACE_DELAY = GRACE_DELAY + 1
+ if GRACE_DELAY >= 15 then
+ -- He loves astral beings
+ if (get_subrace_name() == "LostSoul") then
+ set_grace(player.grace + 1)
+ end
+
+ -- He likes High Elves only, though, as races
+ if (get_race_name() ~= "High-Elf") then
+ set_grace(player.grace - 1)
+ end
+ end
+ -- piety increase if (condition)
+ if (GRACE_DELAY >= 15) then
+ if (
+ (get_subrace_name() == "Vampire") or
+ (get_race_name() == "Demon")) then
+ -- hated races
+ set_grace(player.grace - 10)
+ else
+ set_grace(player.grace + 2)
+ end
+ -- he really doesn't like to be disturbed
+ if (player.praying == TRUE) then
+ set_grace(player.grace - 5)
+ end
+ GRACE_DELAY = 0
+ end
+
+ end
+ end,
+ [HOOK_MONSTER_DEATH] = function(m_idx)
+ if (player.pgod == GOD_MANDOS) then
+ m_ptr = monster(m_idx)
+ if
+ (m_ptr.r_idx == test_monster_name("Vampire")) or
+ (m_ptr.r_idx == test_monster_name("Master vampire")) or
+ (m_ptr.r_idx == test_monster_name("Oriental vampire")) or
+ (m_ptr.r_idx == test_monster_name("Vampire lord")) or
+ (m_ptr.r_idx == test_monster_name("Vampire orc")) or
+ (m_ptr.r_idx == test_monster_name("Vampire yeek")) or
+ (m_ptr.r_idx == test_monster_name("Vampire ogre")) or
+ (m_ptr.r_idx == test_monster_name("Vampire troll")) or
+ (m_ptr.r_idx == test_monster_name("Vampire dwarf")) or
+ (m_ptr.r_idx == test_monster_name("Vampire gnome")) or
+ (m_ptr.r_idx == test_monster_name("Elder vampire")) then
+ -- He really likes it if you kill Vampires (but not the adventurer kind :P)
+ set_grace(player.grace + 50)
+ end
+
+ if
+ (m_ptr.r_idx == test_monster_name("Vampire elf")) or
+ (m_ptr.r_idx == test_monster_name("Thuringwethil, the Vampire Messenger")) then
+ -- He *loves* it if you kill vampire Elves
+ -- He will also thank you extra kindly if you kill Thuringwethil
+ set_grace(player.grace + 200)
+ end
+
+ if
+ (m_ptr.r_idx == test_monster_name("Dark elf")) or
+ (m_ptr.r_idx == test_monster_name("Dark elven druid")) or
+ (m_ptr.r_idx == test_monster_name("Eol, the Dark Elf")) or
+ (m_ptr.r_idx == test_monster_name("Maeglin, the Traitor of Gondolin")) or
+ (m_ptr.r_idx == test_monster_name("Dark elven mage")) or
+ (m_ptr.r_idx == test_monster_name("Dark elven warrior")) or
+ (m_ptr.r_idx == test_monster_name("Dark elven priest")) or
+ (m_ptr.r_idx == test_monster_name("Dark elven lord")) or
+ (m_ptr.r_idx == test_monster_name("Dark elven warlock")) or
+ (m_ptr.r_idx == test_monster_name("Dark elven sorcerer")) then
+ -- He doesn't like it if you kill normal Elves (means more work for him :P)
+ set_grace(player.grace - 20)
+ end
+ if
+ (m_ptr.r_idx == test_monster_name("Glorfindel of Rivendell")) or
+ (m_ptr.r_idx == test_monster_name("Finrod Felagund")) or
+ (m_ptr.r_idx == test_monster_name("Thranduil, King of the Wood Elves")) or
+ (m_ptr.r_idx == test_monster_name("Aquatic elven warrior")) or
+ (m_ptr.r_idx == test_monster_name("Aquatic elven mage")) or
+ (m_ptr.r_idx == test_monster_name("High-elven ranger")) or
+ (m_ptr.r_idx == test_monster_name("Elven archer")) then
+ -- He hates it if you kill coaligned Elves
+ set_grace(player.grace - 200)
+ end
+ if
+ (m_ptr.r_idx == test_monster_name("Child spirit")) or
+ (m_ptr.r_idx == test_monster_name("Young spirit")) or
+ (m_ptr.r_idx == test_monster_name("Mature spirit")) or
+ (m_ptr.r_idx == test_monster_name("Experienced spirit")) or
+ (m_ptr.r_idx == test_monster_name("Wise spirit")) then
+ -- He *hates* it if you kill the coaligned Spirits
+ set_grace(player.grace - 1000)
+ end
+ end
+ end
+ }
+}
diff --git a/lib/mods/theme/scpt/gondolin.lua b/lib/mods/theme/scpt/gondolin.lua
new file mode 100644
index 00000000..c85d8f53
--- /dev/null
+++ b/lib/mods/theme/scpt/gondolin.lua
@@ -0,0 +1,63 @@
+-- This script makes the void jumpgates between Minas Anor and Gondolin appear in Gondolin rather than in a weird wilderness spot
+-- as well as making the Save Gondolin quest take the player straight to Gondolin instead of the Secret Valley.
+-- Many thanks to TheFalcon for the code.
+
+function minas_gate()
+ if (quest(16).status == QUEST_STATUS_FINISHED) and (player.wilderness_y == 56) and (player.wilderness_x == 60) and (player.wild_mode == FALSE) then
+ cave(35,10).feat = 159
+ end
+end
+
+add_hook_script(HOOK_QUEST_FINISH, "minas_gate", "minas_gate")
+add_hook_script(HOOK_WILD_GEN, "minas_gate", "minas_gate")
+
+function minas_jump(direction)
+ if (quest(16).status == QUEST_STATUS_FINISHED) and (player.wilderness_y == 56) and (player.wilderness_x == 60) and (player.wild_mode == FALSE) then
+ if (player.px == 10) and (player.py == 35) then
+ if (direction == "down") then
+ player.wilderness_x = 3
+ player.wilderness_y = 11
+ player.wild_mode = FALSE
+ player.px = 119
+ player.py = 25
+ player.oldpx = player.px
+ player.oldpy = player.py
+ dun_level = 0
+ player.leaving = TRUE
+ return TRUE
+ end
+ end
+ end
+end
+
+add_hook_script(HOOK_STAIR, "minas_jump", "minas_jump")
+
+add_loadsave("tolan_count", 0)
+
+function tolan_travel()
+ if (quest(15).status == QUEST_STATUS_TAKEN) and (tolan_count == 0) then
+ player.wilderness_x = 3
+ player.wilderness_y = 11
+ player.wild_mode = FALSE
+ player.px = 117
+ player.py = 25
+ player.oldpx = player.px
+ player.oldpy = player.py
+ dun_level = 0
+ player.leaving = TRUE
+ tolan_count = 1
+ return TRUE
+ end
+end
+
+add_hook_script(HOOK_END_TURN, "tolan_travel", "tolan_travel")
+
+add_hooks
+{
+ [HOOK_BIRTH] = function()
+ if tolan_count >=1
+ then tolan_count = 0
+ else
+ end
+ end
+} \ No newline at end of file
diff --git a/lib/mods/theme/scpt/help.lua b/lib/mods/theme/scpt/help.lua
new file mode 100644
index 00000000..4e244df6
--- /dev/null
+++ b/lib/mods/theme/scpt/help.lua
@@ -0,0 +1,445 @@
+-- Ingame contextual help
+
+-------------------------------------------------------------------------------
+-------------------------------------------------------------------------------
+-----------------------Here comes the definition of help-----------------------
+-------------------------------------------------------------------------------
+-------------------------------------------------------------------------------
+
+ingame_help
+{
+ ["hook"] = HOOK_MOVE,
+ ["event"] = function(y, x) if cave(y, x).feat == FEAT_BETWEEN then return TRUE end end,
+ ["desc"] =
+ {
+ "Void Jumpgates can be entered by pressing the > key. They will transport",
+ "you to another jumpgate, but beware of the cold damage that might kill you.",
+ }
+}
+
+ingame_help
+{
+ ["hook"] = HOOK_MOVE,
+ ["event"] = function(y, x) if cave(y, x).feat == FEAT_FOUNTAIN then return TRUE end end,
+ ["desc"] =
+ {
+ "Fountains are always magical. You can quaff from them by pressing H.",
+ "Beware that unlike potions they cannot be identified.",
+ }
+}
+
+ingame_help
+{
+ ["hook"] = HOOK_MOVE,
+ ["event"] = function(y, x) if cave(y, x).o_idx ~= 0 then return TRUE end end,
+ ["desc"] =
+ {
+ "So you found your first item! Nice, eh? Now when you stumble across",
+ "objects, you can pick them up by pressing g, and if you are wondering",
+ "what they do, press I (then *, then the letter for the item) to get",
+ "some basic information. You may also want to identify them with scrolls,",
+ "staves, rods or spells.",
+ }
+}
+
+ingame_help
+{
+ ["hook"] = HOOK_MOVE,
+ ["event"] = function(y, x) if (cave(y, x).feat >= FEAT_ALTAR_HEAD) and (cave(y, x).feat <= FEAT_ALTAR_TAIL) then return TRUE end end,
+ ["desc"] =
+ {
+ "Altars are the way to reach the Valar, powers of the world,",
+ "usualy called Gods. You can press O to become a follower.",
+ "Beware that once you follow a god, you are not allowed to change.",
+ "For an exact description of what gods do and want, read the documentation."
+ }
+}
+
+-- Beware this one, if Bree is moved from 21, 34 (y, x) on the wilderness map it will break
+ingame_help
+{
+ ["hook"] = HOOK_END_TURN,
+ ["event"] = function(y, x)
+ if ((player.wilderness_x ~= 34) or (player.wilderness_y ~= 21) and (player.astral == FALSE)) then return TRUE end
+ end,
+ ["desc"] =
+ {
+ "Ahh wilderness travel... The overview mode will allow you to travel",
+ "fast, but that comes to the cost of GREATLY increased food consumption.",
+ "So you should bring lots of food and really watch your hunger status.",
+ "To enter the overview mode, press < while in the wilderness.",
+ }
+}
+
+ingame_help
+{
+ ["hook"] = HOOK_PLAYER_LEVEL,
+ ["event"] = function(y, x) if player.lev > 1 then return TRUE end end,
+ ["desc"] =
+ {
+ "Ok, so you now gained a level, and you have skill points to spend.",
+ "To do so simply press G to learn skills. Reading the documentation",
+ "about skills and abilities is also strongly recommended.",
+ }
+}
+
+ingame_help
+{
+ ["hook"] = HOOK_MOVE,
+ ["event"] = function(y, x) if cave(y, x).feat == FEAT_MORE then return TRUE end end,
+ ["desc"] =
+ {
+ "Ah, this is a stair, or a way into something. Press > to enter it.",
+ "But be ready to fight what lies within, for it might not be too friendly.",
+ }
+}
+
+ingame_help
+{
+ ["callback"] = "monster_chat",
+ ["desc"] =
+ {
+ "Somebody is speaking to you it seems. You can talk back with the Y key.",
+ "This can lead to quests. You can also give items to 'monsters' with the y key.",
+ }
+}
+
+ingame_help
+{
+ ["hook"] = HOOK_END_TURN,
+ ["event"] = function(y, x) return TRUE end,
+ ["desc"] =
+ {
+ "Welcome to Theme! I am the spirit of knowledge and my task is to help you",
+ "to get used to how to play. I have prepared a #vparchment#y for you to #vread#y.",
+ "Press r, then space then select it. You can also check the documentation",
+ "by pressing ? at (nearly) any time.",
+ "The first place you can explore is Barrow-downs. Go to the west of town",
+ "and you should see a #v>#y there.",
+ "If you miss any of this you can press ctrl+p to see your message log.",
+ "Now I must reveal your task here. You are on a quest to investigate",
+ "the dreadful tower of Dol Guldur in the Mirkwood forest to see what evil",
+ "lurks there, but beware, you are not yet ready.",
+ "If you do not want me to bother you any more with tips, press = then go",
+ "into the ToME options and deactivate the ingame_help option.",
+ "You can see your quest log by pressing ctrl+q. Now go to your destiny!",
+ }
+}
+
+ingame_help
+{
+ ["no_test"] = TRUE,
+ ["callback"] = "select_context",
+ ["fct"] = function(typ, name)
+ -- list of files for classes, { filename, anchor }
+ local t =
+ {
+ ["race"] =
+ {
+ ["Beorning"] = { "r_beorn.txt", 0 },
+ ["Dragon"] = { "r_dragon.txt", 0 },
+ ["Dark-Elf"] = { "r_drkelf.txt", 0 },
+ ["Dunadan"] = { "r_dunad.txt", 0 },
+ ["Dwarf"] = { "r_dwarf.txt", 0 },
+ ["Elf"] = { "r_elf.txt", 0 },
+ ["Ent"] = { "r_ent.txt", 0 },
+ ["Gnome"] = { "r_gnome.txt", 0 },
+ ["Half-Elf"] = { "r_hafelf.txt", 0 },
+ ["Half-Ogre"] = { "r_hafogr.txt", 0 },
+ ["High-Elf"] = { "r_hielf.txt", 0 },
+ ["Hobbit"] = { "r_hobbit.txt", 0 },
+ ["Human"] = { "r_human.txt", 0 },
+ ["Druadan"] = { "r_druadan.txt", 0 },
+ ["Maia"] = { "r_maia.txt", 0 },
+ ["Orc"] = { "r_orc.txt", 0 },
+ ["Petty-Dwarf"] = { "r_pettyd.txt", 0 },
+ ["RohanKnight"] = { "r_rohank.txt", 0 },
+ ["Eagle"] = { "r_eagle.txt", 0 },
+ ["Troll"] = { "r_troll.txt", 0 },
+ ["Wood-Elf"] = { "r_wodelf.txt", 0 },
+ ["Yeek"] = { "r_yeek.txt", 0 },
+ ["Easterling"] = { "r_easterl.txt", 0 },
+ ["Demon"] = { "r_demon.txt", 0},
+ },
+ ["subrace"] =
+ {
+ ["Barbarian"] = { "rm_barb.txt", 0 },
+ ["Classical"] = { "rm_class.txt", 0 },
+ ["Corrupted"] = { "rm_corru.txt", 0 },
+ ["Hermit"] = { "rm_herm.txt", 0 },
+ ["LostSoul"] = { "rm_lsoul.txt", 0 },
+ ["Skeleton"] = { "rm_skel.txt", 0 },
+ ["Spectre"] = { "rm_spec.txt", 0 },
+ ["Vampire"] = { "rm_vamp.txt", 0 },
+ ["Zombie"] = { "rm_zomb.txt", 0 },
+ ["Red"] = {"rm_red.txt", 0 },
+ ["Black"] = {"rm_black.txt", 0 },
+ ["Green"] = {"rm_green.txt", 0 },
+ ["Blue"] = {"rm_blue.txt", 0 },
+ ["White"] = {"rm_white.txt", 0 },
+ ["Ethereal"] = {"rm_ether.txt", 0 },
+ ["(Narrog)"] = {"rm_narrog.txt", 0 },
+ ["(Aewrog)"] = {"rm_aewrog.txt", 0 },
+ ["(Hurog)"] = {"rm_hurog.txt", 0 },
+ ["(Sarnrog)"] = {"rm_sarnrog.txt", 0 },
+ ["(Caborrog)"] = {"rm_cabrog.txt", 0 },
+ ["(Draugrog)"] = {"rm_drarog.txt", 0 },
+ ["(Lygrog)"] = {"rm_lygrog.txt", 0 },
+ ["(Limrog)"] = {"rm_limrog.txt", 0 },
+ ["(Rawrog)"] = {"rm_rawrog.txt", 0 },
+ ["(Adanrog)"] = {"rm_adanrog.txt", 0 },
+ },
+ ["class"] =
+ {
+ ["Archer"] = { "c_archer.txt", 0 },
+ ["Ascetic"] = { "c_ascet.txt", 0 },
+ ["Assassin"] = { "c_assass.txt", 0 },
+ ["Axemaster"] = { "c_axemas.txt", 0 },
+ ["Bard"] = { "c_bard.txt", 0 },
+ ["Clairvoyant"] = {"c_clairv.txt", 0},
+ ["Dark-Priest"] = { "c_pr_drk.txt", 0 },
+ ["Demonologist"] = { "c_demono.txt", 0 },
+ ["Druid"] = { "c_druid.txt", 0 },
+ ["Geomancer"] = { "c_geoman.txt", 0 },
+ ["Haftedmaster"] = { "c_hafted.txt", 0 },
+ ["Loremaster"] = { "c_lorema.txt", 0 },
+ ["Mage"] = { "c_mage.txt", 0 },
+ ["Mercenary"] = { "c_mercen.txt", 0 },
+ ["Mimic"] = { "c_mimic.txt", 0 },
+ ["Mindcrafter"] = { "c_mindcr.txt", 0 },
+ ["Monk"] = { "c_monk.txt", 0 },
+ ["Necromancer"] = { "c_necro.txt", 0 },
+ ["Pacifist"] = { "c_pacif.txt", 0 },
+ ["Paladin"] = { "c_palad.txt", 0 },
+ ["Peace-mage"] = { "c_peacemag.txt", 0 },
+ ["Polearmmaster"] = { "c_polear.txt", 0 },
+ ["Possessor"] = { "c_posses.txt", 0 },
+ ["Priest"] = { "c_priest.txt", 0 },
+ ["Priest(Eru)"] = { "c_pr_eru.txt", 0 },
+ ["Priest(Mandos)"] = { "c_pr_mand.txt", 0 },
+ ["Priest(Manwe)"] = { "c_pr_man.txt", 0 },
+ ["Priest(Ulmo)"] = { "c_pr_ulmo.txt", 0 },
+ ["Priest(Varda)"] = { "c_pr_varda.txt", 0 },
+ ["Ranger"] = { "c_ranger.txt", 0 },
+ ["Rogue"] = { "c_rogue.txt", 0 },
+ ["Runecrafter"] = { "c_runecr.txt", 0 },
+ ["Sniper"] = {"c_sniper.txt", 0 },
+ ["Sorceror"] = { "c_sorcer.txt", 0 },
+ ["Stonewright"] = { "c_stonewr.txt", 0 },
+ ["Summoner"] = { "c_summon.txt", 0 },
+ ["Swordmaster"] = { "c_swordm.txt", 0 },
+ ["Symbiant"] = { "c_symbia.txt", 0 },
+ ["Thaumaturgist"] = { "c_thaum.txt", 0 },
+ ["Trapper"] = { "c_trapper.txt", 0 },
+ ["Unbeliever"] = { "c_unbel.txt", 0 },
+ ["Wainrider"] = { "c_wainrid.txt", 0 },
+ ["War-mage"] = { "c_warmage.txt", 0 },
+ ["Warper"] = { "c_warper.txt", 0 },
+ ["Warrior"] = { "c_warrio.txt", 0 },
+ },
+ ["god"] =
+ {
+ ["Aule the Smith"] = { "g_aule.txt", 0 },
+ ["Eru Iluvatar"] = { "g_eru.txt", 0 },
+ ["Mandos"] = { "g_mandos.txt", 0 },
+ ["Manwe Sulimo"] = { "g_manwe.txt", 0 },
+ ["Melkor Bauglir"] = { "g_melkor.txt", 0 },
+ ["Tulkas"] = { "g_tulkas.txt", 0 },
+ ["Ulmo"] = { "g_ulmo.txt", 0 },
+ ["Varda Elentari"] = { "g_varda.txt", 0 },
+ ["Yavanna Kementari"] = { "g_yavann.txt", 0 },
+ },
+ ["skill"] =
+ {
+ ["Air"] = { "skills.txt", 27 },
+ ["Alchemy"] = { "skills.txt", 49 },
+ ["Antimagic"] = { "skills.txt", 50 },
+ ["Archery"] = { "skills.txt", 08 },
+ ["Axe-mastery"] = { "skills.txt", 05 },
+ ["Backstab"] = { "skills.txt", 18 },
+ ["Barehand-combat"] = { "skills.txt", 13 },
+ ["Boomerang-mastery"] = { "skills.txt", 12 },
+ ["Boulder-throwing"] = { "skills.txt", 58 },
+ ["Bow-mastery"] = { "skills.txt", 10 },
+ ["Combat"] = { "skills.txt", 01 },
+ ["Conveyance"] = { "skills.txt", 30 },
+ ["Corpse-preservation"] = { "skills.txt", 44 },
+ ["Critical-hits"] = { "skills.txt", 04 },
+ ["Crossbow-mastery"] = { "skills.txt", 11 },
+ ["Demonology"] = { "skills.txt", 52 },
+ ["Disarming"] = { "skills.txt", 16 },
+ ["Divination"] = { "skills.txt", 31 },
+ ["Dodging"] = { "skills.txt", 20 },
+ ["Druidistic"] = { "skills.txt", 40 },
+ ["Earth"] = { "skills.txt", 28 },
+ ["Fire"] = { "skills.txt", 25 },
+ ["Geomancy"] = { "skills.txt", 60 },
+ ["Hafted-mastery"] = { "skills.txt", 06 },
+ ["Magic"] = { "skills.txt", 21 },
+ ["Magic-Device"] = { "skills.txt", 54 },
+ ["Mana"] = { "skills.txt", 24 },
+ ["Meta"] = { "skills.txt", 29 },
+ ["Mimicry"] = { "skills.txt", 47 },
+ ["Mind"] = { "skills.txt", 33 },
+ ["Mindcraft"] = { "skills.txt", 41 },
+ ["Monster-lore"] = { "skills.txt", 42 },
+ ["Music"] = { "skills.txt", 59 },
+ ["Nature"] = { "skills.txt", 34 },
+ ["Necromancy"] = { "skills.txt", 35 },
+ ["Polearm-mastery"] = { "skills.txt", 07 },
+ ["Possession"] = { "skills.txt", 45 },
+ ["Prayer"] = { "skills.txt", 39 },
+ ["Runecraft"] = { "skills.txt", 36 },
+ ["Sling-mastery"] = { "skills.txt", 09 },
+ ["Sneakiness"] = { "skills.txt", 14 },
+ ["Spell-power"] = { "skills.txt", 22 },
+ ["Spirituality"] = { "skills.txt", 38 },
+ ["Sorcery"] = { "skills.txt", 23 },
+ ["Stealing"] = { "skills.txt", 19 },
+ ["Stealth"] = { "skills.txt", 15 },
+ ["Stunning-blows"] = { "skills.txt", 53 },
+ ["Summoning"] = { "skills.txt", 43 },
+ ["Sword-mastery"] = { "skills.txt", 03 },
+ ["Symbiosis"] = { "skills.txt", 46 },
+ ["Temporal"] = { "skills.txt", 32 },
+ ["Thaumaturgy"] = { "skills.txt", 37 },
+ ["Udun"] = { "skills.txt", 48 },
+ ["Weaponmastery"] = { "skills.txt", 02 },
+ ["Water"] = { "skills.txt", 26 },
+ },
+ ["ability"] =
+ {
+ ["Spread blows"] = { "ability.txt", 02 },
+ ["Tree walking"] = { "ability.txt", 03 },
+ ["Perfect casting"] = { "ability.txt", 04 },
+ ["Extra Max Blow(1)"] = { "ability.txt", 05 },
+ ["Extra Max Blow(2)"] = { "ability.txt", 06 },
+ ["Ammo creation"] = { "ability.txt", 07 },
+ ["Touch of death"] = { "ability.txt", 08 },
+ ["Artifact Creation"] = { "ability.txt", 09 },
+ ["Far reaching attack"] = { "ability.txt", 10 },
+ ["Trapping"] = { "ability.txt", 11 },
+ ["Undead Form"] = { "ability.txt", 12 },
+ },
+ }
+
+ if t[typ][name] then ingame_help_doc(t[typ][name][1], t[typ][name][2])
+ else ingame_help_doc("help.hlp", 0)
+ end
+ end,
+}
+
+ingame_help
+{
+ ["hook"] = HOOK_IDENTIFY,
+ ["event"] = function(i, mode)
+ if mode == "full" then
+ local obj = get_object(i)
+ local f1, f2, f3, f4, f5, esp = object_flags(obj)
+ if band(f5, TR5_SPELL_CONTAIN) ~= 0 then return TRUE end
+ end
+ end,
+ ["desc"] =
+ {
+ "Ah, an item that can contain a spell. To use it you must have some levels of",
+ "Magic skill and then you get the option to copy a spell when pressing m.",
+ "Then just select which spell to copy and to which object. Note that doing so",
+ "is permanent; the spell cannot be removed or changed later.",
+ }
+}
+
+ingame_help
+{
+ ["hook"] = HOOK_GET,
+ ["event"] = function(obj, idx) if obj.tval == TV_BATERIE then return TRUE end end,
+ ["desc"] =
+ {
+ "Ah, an essence! Those magical containers stores energies. They are used",
+ "with the Alchemy skill to create or modify the powers of items.",
+ }
+}
+
+ingame_help
+{
+ ["hook"] = HOOK_GET,
+ ["event"] = function(obj, idx) if obj.tval == TV_RUNE1 or obj.tval == TV_RUNE2 then return TRUE end end,
+ ["desc"] =
+ {
+ "Ah, a rune! Runes are used with the Runecraft skill to allow you to",
+ "create spells on your own.",
+ }
+}
+
+ingame_help
+{
+ ["hook"] = HOOK_GET,
+ ["event"] = function(obj, idx) if obj.tval == TV_ROD_MAIN then return TRUE end end,
+ ["desc"] =
+ {
+ "This is a rod. You will need to attach a rod tip to it before you",
+ "can use it. This main part of the rod may give the rod bonuses",
+ "like quicker charging time, or a larger capacity for charges.",
+ }
+}
+
+ingame_help
+{
+ ["hook"] = HOOK_GET,
+ ["event"] = function(obj, idx) if obj.tval == TV_ROD then return TRUE end end,
+ ["desc"] =
+ {
+ "You've found a rod-tip! You will need to attach it to a rod base",
+ "before you can use it. Once it has been attatched (use the 'z' key)",
+ "you cannot unattach it! The rod tip will determine the effect of",
+ "the rod. To use your rod, 'z'ap it once it has been assembled.",
+ }
+}
+
+ingame_help
+{
+ ["hook"] = HOOK_GET,
+ ["event"] = function(obj, idx) if obj.tval == TV_TRAPKIT then return TRUE end end,
+ ["desc"] =
+ {
+ "Ooooh, a trapping kit. If you have ability in the trapping skill,",
+ "you can lay this trap (via the 'm' key) to harm unsuspecting foes.",
+ "You'll generally need either some ammo or magic device depending",
+ "on the exact type of trap kit.",
+ }
+}
+
+ingame_help
+{
+ ["hook"] = HOOK_RECALC_SKILLS,
+ ["event"] = function() if game.started and (get_melee_skills() > 1) then return TRUE end end,
+ ["desc"] =
+ {
+ "Ah, you now possess more than one melee type. To switch between them press m",
+ "and select the switch melee type option.",
+ }
+}
+
+ingame_help
+{
+ ["hook"] = HOOK_GET,
+ ["event"] = function(obj, idx) if obj.tval == TV_WAND or obj.tval == TV_STAFF then return TRUE end end,
+ ["desc"] =
+ {
+ "You've found a magical device, either a staff or a wand. Each staff",
+ "contains a spell, often from one of the primary magic schools. There",
+ "is a lot of information you can find about this object if you identify",
+ "it and 'I'nspect it. Check the help file on Magic for more about these.",
+ }
+}
+
+ingame_help
+{
+ ["hook"] = HOOK_PLAYER_LEVEL,
+ ["event"] = function(y, x) if player.lev >= 20 then return TRUE end end,
+ ["desc"] =
+ {
+ "I see you are now at least level 20. Nice! If you want to gloat about your",
+ "character you could press 'C' then 'f' to make a character dump and post it to",
+ "http://angband.oook.cz/ where it will end up in the ladder.",
+ }
+}
diff --git a/lib/mods/theme/scpt/init.lua b/lib/mods/theme/scpt/init.lua
new file mode 100644
index 00000000..958d8f7d
--- /dev/null
+++ b/lib/mods/theme/scpt/init.lua
@@ -0,0 +1,56 @@
+--
+-- This file is loaded at the initialisation of ToME
+--
+
+-- Load the class specific stuff
+tome_dofile("player.lua")
+
+-- Load the ingame contextual help
+tome_dofile("help.lua")
+
+-- let the store specific stuff happen!
+tome_dofile("stores.lua")
+
+-- Add various 'U' powers
+tome_dofile("powers.lua")
+
+-- Add the mimic shapes
+tome_dofile("mimic.lua")
+
+-- Add the corruptions
+tome_dofile("corrupt.lua")
+
+-- Add the mkey activations
+tome_dofile("mkeys.lua")
+
+-- Add god stuff
+tome_dofile("gods.lua")
+tome_dofile("gods_new.lua")
+
+-- Add the schools of magic
+tome_dofile("spells.lua")
+
+-- Add some quests
+tome_dofile("bounty.lua")
+tome_dofile("god.lua")
+tome_dofile("fireprof.lua")
+tome_dofile("library.lua")
+
+-- Add joke stuff
+tome_dofile("drunk.lua")
+tome_dofile("joke.lua")
+
+-- Some tests, if the file is not present, this is fine
+tome_dofile_anywhere(ANGBAND_DIR_SCPT, "dg_test.lua", FALSE)
+
+-- A nice custom intro :)
+tome_dofile("intro.lua")
+
+-- Add monster interaction
+tome_dofile("monsters.lua")
+
+-- Add miscellaneous stuff
+tome_dofile("misc.lua")
+
+-- Add map-related quest fix
+tome_dofile("gondolin.lua") \ No newline at end of file
diff --git a/lib/mods/theme/scpt/intro.lua b/lib/mods/theme/scpt/intro.lua
new file mode 100644
index 00000000..3cdce225
--- /dev/null
+++ b/lib/mods/theme/scpt/intro.lua
@@ -0,0 +1,43 @@
+function tome_intro()
+ screen_save()
+ Term_clear()
+
+ if (TRUE == drop_text_left(TERM_L_BLUE, "Three Rings for the Elven-kings under the sky,", 10, 0)) then screen_load() return end
+ if (TRUE == drop_text_right(TERM_L_BLUE, "Seven for the Dwarf-lords in their halls of stone,", 11, -1)) then screen_load() return end
+ if (TRUE == drop_text_left(TERM_L_BLUE, "Nine for Mortal Men doomed to die,", 12, 0)) then screen_load() return end
+ if (TRUE == drop_text_right(TERM_L_BLUE, "One for the Dark Lord on his dark throne", 13, -1)) then screen_load() return end
+ if (TRUE == drop_text_left(TERM_L_BLUE, "In the land of Mordor, where the Shadows lie.", 14, 0)) then screen_load() return end
+ if (TRUE == drop_text_right(TERM_L_BLUE, "One Ring to rule them all, One Ring to find them,", 15, -1)) then screen_load() return end
+ if (TRUE == drop_text_left(TERM_L_BLUE, "One Ring to bring them all and in the darkness bind them", 16, 0)) then screen_load() return end
+ if (TRUE == drop_text_right(TERM_L_BLUE, "In the land of Mordor, where the Shadows lie.", 17, -1)) then screen_load() return end
+ if (TRUE == drop_text_right(TERM_L_GREEN, "--J.R.R. Tolkien", 18, 0)) then screen_load() return end
+ if (TRUE == drop_text_left(TERM_WHITE, "[Press any key to continue]", 23, -1)) then screen_load() return end
+
+ Term_putch(0, 0, TERM_DARK, 32)
+ inkey_scan = FALSE
+ inkey()
+
+ Term_clear()
+
+ if (TRUE == drop_text_left(TERM_L_BLUE, "furiosity", 8, 0)) then screen_load() return end
+ if (TRUE == drop_text_right(TERM_WHITE, "in collaboration with", 9, -1)) then screen_load() return end
+ if (TRUE == drop_text_left(TERM_L_GREEN, "DarkGod and all the ToME contributors,", 10, 0)) then screen_load() return end
+ if (TRUE == drop_text_right(TERM_L_GREEN, "module creators, t-o-m-e.net forum posters,", 11, -1)) then screen_load() return end
+ if (TRUE == drop_text_left(TERM_WHITE, "and", 12, 0)) then screen_load() return end
+ if (TRUE == drop_text_right(TERM_L_GREEN, "by the grace of the Valar", 13, -1)) then screen_load() return end
+
+ if (TRUE == drop_text_left(TERM_WHITE, "present", 15, 1)) then screen_load() return end
+ if (TRUE == drop_text_right(TERM_YELLOW, "Theme (a module for ToME)", 16, 0)) then screen_load() return end
+
+ if (TRUE == drop_text_left(TERM_WHITE, "[Press any key to continue]", 23, -1)) then screen_load() return end
+ Term_putch(0, 0, TERM_DARK, 32)
+
+ inkey_scan = FALSE
+
+ inkey()
+
+ screen_load()
+ return
+end
+
+add_hook_script(HOOK_INIT, "tome_intro", "lua_intro_init")
diff --git a/lib/mods/theme/scpt/joke.lua b/lib/mods/theme/scpt/joke.lua
new file mode 100644
index 00000000..2d87b651
--- /dev/null
+++ b/lib/mods/theme/scpt/joke.lua
@@ -0,0 +1,31 @@
+-- Place a monster in a good spot
+function gen_joke_place_monster(r_idx)
+ local try = 1000
+ local x
+ local y
+ while try > 0 do
+ x = randint(cur_hgt - 4) + 2
+ y = randint(cur_wid - 4) + 2
+ if not (0 == place_monster_one(y, x, r_idx, 0, FALSE, MSTATUS_ENEMY)) then
+ return
+ end
+ try = try - 1
+ end
+end
+
+-- Check if a special joke monster can be generated here
+function gen_joke_monsters()
+ if joke_monsters == FALSE then
+ return
+ end
+
+ -- Neil
+ if (current_dungeon_idx == 20) and (dun_level == 72) then
+ neil = test_monster_name("Neil, the Sorceror")
+ m_allow_special[neil + 1] = TRUE
+ gen_joke_place_monster(neil)
+ m_allow_special[neil + 1] = FALSE
+ end
+end
+
+add_hook_script(HOOK_LEVEL_END_GEN, "gen_joke_monsters", "gen_joke_monsters")
diff --git a/lib/mods/theme/scpt/library.lua b/lib/mods/theme/scpt/library.lua
new file mode 100644
index 00000000..a16d37ef
--- /dev/null
+++ b/lib/mods/theme/scpt/library.lua
@@ -0,0 +1,439 @@
+-- Library quest in Minas Anor
+
+-- Partially based on Fireproofing quest
+
+library_quest = {}
+
+-- Map helper
+library_quest.place_random = function(minY, minX, maxY, maxX, monster)
+ y = randint(maxY - minY + 1) + minY
+ x = randint(maxX - minX + 1) + minX
+ return place_monster_one(y, x, monster, 0, TRUE, MSTATUS_ENEMY)
+end
+
+-- Book creation helpers
+library_quest.bookable_spells =
+{
+ MANATHRUST, DELCURSES,
+ GLOBELIGHT, FIREGOLEM, FIREFLASH, FIREWALL,
+ GEYSER, VAPOR, ENTPOTION,
+ NOXIOUSCLOUD, POISONBLOOD,
+ STONESKIN, DIG,
+ RECHARGE, DISPERSEMAGIC,
+ BLINK, DISARM, TELEPORT,
+ SENSEMONSTERS, SENSEHIDDEN, REVEALWAYS, IDENTIFY, VISION,
+ MAGELOCK, SLOWMONSTER, ESSENCESPEED,
+ CHARM, CONFUSE, ARMOROFFEAR, STUN,
+ GROWTREE, HEALING, RECOVERY,
+ ERU_SEE, ERU_LISTEN,
+ MANWE_BLESS, MANWE_SHIELD,
+ YAVANNA_CHARM_ANIMAL, YAVANNA_GROW_GRASS, YAVANNA_TREE_ROOTS,
+ TULKAS_AIM, TULKAS_SPIN,
+ MELKOR_CURSE, MELKOR_CORPSE_EXPLOSION, DRAIN,
+ AULE_FIREBRAND, AULE_CHILD,
+ VARDA_LIGHT_VALINOR, VARDA_EVENSTAR,
+ ULMO_BELEGAER, ULMO_WRATH,
+ MANDOS_TEARS_LUTHIEN, MANDOS_TALE_DOOM
+}
+
+library_quest.get_term_size = function()
+ local width = 0
+ local height = 0
+ ret, width, height = Term_get_size(width, height)
+ return width, height
+end
+
+library_quest.book_slots_left = function()
+ if school_book[61][1] == -1 then
+ return 3
+ elseif school_book[61][2] == -1 then
+ return 2
+ elseif school_book[61][3] == -1 then
+ return 1
+ else
+ return 0
+ end
+end
+
+library_quest.book_contains_spell = function(spell)
+ if school_book[61][1] == spell then
+ return TRUE
+ elseif school_book[61][2] == spell then
+ return TRUE
+ elseif school_book[61][3] == spell then
+ return TRUE
+ else
+ return FALSE
+ end
+end
+
+library_quest.add_spell = function(spell)
+ if school_book[61][1] == -1 then
+ school_book[61][1] = spell
+ return TRUE
+ elseif school_book[61][2] == -1 then
+ school_book[61][2] = spell
+ return TRUE
+ elseif school_book[61][3] == -1 then
+ school_book[61][3] = spell
+ return TRUE
+ else
+ return FALSE
+ end
+end
+
+library_quest.remove_spell = function(spell)
+ if school_book[61][1] == spell then
+ school_book[61][1] = school_book[61][2]
+ school_book[61][2] = school_book[61][3]
+ school_book[61][3] = -1
+ return TRUE
+ elseif school_book[61][2] == spell then
+ school_book[61][2] = school_book[61][3]
+ school_book[61][3] = -1
+ return TRUE
+ elseif school_book[61][3] == spell then
+ school_book[61][3] = -1
+ return TRUE
+ else
+ return FALSE
+ end
+end
+
+-- Print a spell (taken from s_aux)
+function library_quest.print_spell(color, y, spl)
+ local x, index, sch, size, s
+
+ x = 0
+ size = 0
+ book = 255
+ obj = nil
+
+ -- Hack if the book is 255 it is a random book
+ if book == 255 then
+ school_book[book] = {spl}
+ end
+
+ -- Parse all spells
+ for index, s in school_book[book] do
+ local lvl, na = get_level_school(s, 50, -50)
+ local xx, sch_str
+
+ sch_str = spell_school_name(s)
+
+ if s == spl then
+ if na then
+ c_prt(color, format("%-20s%-16s %3s %4s %3d%s %s", spell(s).name, sch_str, na, get_mana(s), spell_chance(s), "%", __spell_info[s]()), y, x)
+ else
+ c_prt(color, format("%-20s%-16s %3d %4s %3d%s %s", spell(s).name, sch_str, lvl, get_mana(s), spell_chance(s), "%", __spell_info[s]()), y, x)
+ end
+ y = y + 1
+ size = size + 1
+ end
+ end
+ return y
+end
+
+-- spell selection routines inspired by skills.c
+library_quest.print_spells = function(first, current)
+ Term_clear()
+ width, height = library_quest.get_term_size()
+ slots = library_quest.book_slots_left()
+
+ c_prt(TERM_WHITE, "Book Creation Screen", 0, 0);
+ c_prt(TERM_WHITE, "Up/Down to move, Right/Left to modify, I to describe, Esc to Save/Cancel", 1, 0);
+
+ if slots == 0 then
+ c_prt(TERM_L_RED, "The book can hold no more spells.", 2, 0);
+ elseif slots == 1 then
+ c_prt(TERM_L_BLUE, "The book can hold 1 more spell.", 2, 0);
+ else
+ c_prt(TERM_L_BLUE, "The book can hold "..slots.." more spells.", 2, 0);
+ end
+
+ row = 3;
+ for index, spell in library_quest.bookable_spells do
+ if index >= first then
+ if index == current then
+ color = TERM_GREEN
+ elseif library_quest.book_contains_spell(spell) == TRUE then
+ color = TERM_WHITE
+ else
+ color = TERM_ORANGE
+ end
+ library_quest.print_spell(color, row, spell)
+
+ if row == height - 1 then
+ return
+ end
+ row = row + 1
+ end
+ end
+end
+
+library_quest.fill_book = function()
+ -- Always start with a cleared book
+ school_book[61] = {-1, -1, -1}
+
+ screen_save()
+ width, height = library_quest.get_term_size()
+ -- room for legend
+ margin = 3
+
+ first = 1
+ current = 1
+ done = FALSE
+
+ while done == FALSE do
+ library_quest.print_spells(first, current)
+
+ inkey_scan = FALSE
+ inkey_base = TRUE
+ char = inkey()
+ dir = get_keymap_dir(char)
+ if char == ESCAPE then
+ if library_quest.book_slots_left() == 0 then
+ flush()
+ done = get_check("Really create the book?")
+ else
+ done = TRUE
+ end
+ elseif char == strbyte('\r') then
+ -- TODO: make tree of schools
+ elseif char == strbyte('n') then
+ current = current + height
+ elseif char == strbyte('p') then
+ current = current - height
+ elseif char == strbyte('I') then
+ print_spell_desc(library_quest.bookable_spells[current], 0)
+ inkey()
+ elseif dir == 2 then
+ current = current + 1
+ elseif dir == 8 then
+ current = current - 1
+ elseif dir == 6 then
+ if library_quest.book_contains_spell(library_quest.bookable_spells[current]) == FALSE then
+ library_quest.add_spell(library_quest.bookable_spells[current])
+ end
+ elseif dir == 4 then
+ library_quest.remove_spell(library_quest.bookable_spells[current])
+ end
+ total = getn(library_quest.bookable_spells)
+ if current > total then
+ current = total
+ elseif current < 1 then
+ current = 1
+ end
+
+ if current > (first + height - margin - 1) then
+ first = current - height + margin + 1
+ elseif first > current then
+ first = current
+ end
+ end
+
+ screen_load()
+end
+
+-- Quest data and hooks
+add_quest
+{
+ ["global"] = "LIBRARY_QUEST",
+ ["name"] = "Library quest",
+ ["desc"] = function()
+ -- Quest taken
+ if (quest(LIBRARY_QUEST).status == QUEST_STATUS_TAKEN) then
+ print_hook("#####yAn Old Mages Quest! (Danger Level: 35)\n")
+ print_hook("Make the library safe for the old mage in Minas Anor.\n")
+ print_hook("\n")
+ -- Quest done, book not gotten yet
+ elseif (quest(LIBRARY_QUEST).status == QUEST_STATUS_COMPLETED) then
+ print_hook("#####yAn Old Mages Quest!\n")
+ print_hook("You have made the library safe for the old mage in Minas Anor.\n")
+ print_hook("Perhaps you should see about a reward.\n")
+ print_hook("\n")
+ end
+ end,
+ ["level"] = 35,
+ ["data"] =
+ {
+ ["school_book[61][1]"] = -1,
+ ["school_book[61][2]"] = -1,
+ ["school_book[61][3]"] = -1
+ },
+ ["hooks"] =
+ {
+ -- Start the game without the quest, need to request it
+ [HOOK_BIRTH_OBJECTS] = function()
+ quest(LIBRARY_QUEST).status = QUEST_STATUS_UNTAKEN
+ school_book[61] = {-1, -1, -1}
+ end,
+
+ [HOOK_GEN_QUEST] = function()
+ -- Only if player doing this quest
+ if (player.inside_quest ~= LIBRARY_QUEST) then
+ return FALSE
+ end
+
+ load_map("library.map", 2, 2)
+ level_flags2 = DF2_NO_GENO
+
+ -- generate the Liches 518
+ liches = damroll(4, 2) -- plus one on the map
+ while(liches > 0) do
+ if 0 < library_quest.place_random(4, 4, 14, 37, 518) then
+ liches = liches - 1
+ end
+ end
+
+ -- generate the Monastic liches 611
+ liches = damroll(1, 2)
+ while(liches > 0) do
+ if 0 < library_quest.place_random(14, 34, 37, 67, 611) then
+ liches = liches - 1
+ end
+ end
+
+ -- generate more Monastic liches 611
+ liches = damroll(1, 2) - 1
+ while(liches > 0) do
+ if 0 < library_quest.place_random(4, 34, 14, 67, 611) then
+ liches = liches - 1
+ end
+ end
+
+ -- generate even more Monastic liches 611
+ liches = damroll(1, 2) - 1
+ while(liches > 0) do
+ if 0 < library_quest.place_random(14, 4, 37, 34, 611) then
+ liches = liches - 1
+ end
+ end
+
+ -- Flesh golem 256
+ golems = 2
+ while(golems > 0) do
+ if 0 < library_quest.place_random(10, 10, 37, 67, 256) then
+ golems = golems - 1
+ end
+ end
+
+ -- Clay golem 261
+ golems = 2
+ while(golems > 0) do
+ if 0 < library_quest.place_random(10, 10, 37, 67, 261) then
+ golems = golems - 1
+ end
+ end
+
+ -- Iron golem 367
+ golems = 2
+ while(golems > 0) do
+ if 0 < library_quest.place_random(10, 10, 37, 67, 367) then
+ golems = golems - 1
+ end
+ end
+
+ -- Mithril Golem 464
+ golems = 1
+ while(golems > 0) do
+ if 0 < library_quest.place_random(10, 10, 37, 67, 464) then
+ golems = golems - 1
+ end
+ end
+
+ -- one Master lich is on the map
+
+ return TRUE
+ end,
+ [HOOK_STAIR] = function()
+ local ret
+
+ -- only ask this if player about to go up stairs of quest and hasn't won yet
+ if (player.inside_quest ~= LIBRARY_QUEST) or (quest(LIBRARY_QUEST).status == QUEST_STATUS_COMPLETED) then
+ return FALSE
+ end
+
+ if cave(player.py, player.px).feat ~= FEAT_LESS then return end
+
+ -- flush all pending input
+ flush()
+
+ -- confirm
+ ret = get_check("Really abandon the quest?")
+
+ -- if yes, then
+ if ret == TRUE then
+ -- fail the quest
+ quest(LIBRARY_QUEST).status = QUEST_STATUS_FAILED
+ return FALSE
+ else
+ -- if no, they stay in the quest
+ return TRUE
+ end
+ end,
+ [HOOK_MONSTER_DEATH] = function()
+ -- if they're in the quest and haven't won, continue
+ if (player.inside_quest ~= LIBRARY_QUEST) or (quest(LIBRARY_QUEST).status == QUEST_STATUS_COMPLETED) then
+ return FALSE
+ end
+
+ i = 1
+ count = -1
+ while i <= m_max do
+ local monster = m_list[i]
+ if (monster.r_idx > 0) and (monster.status <= MSTATUS_ENEMY) then
+ count = count + 1
+ end
+ i = i + 1
+ end
+
+ if count == 0 then
+ quest(LIBRARY_QUEST).status = QUEST_STATUS_COMPLETED
+ msg_print(TERM_YELLOW, "The library is safe now.")
+ end
+ end,
+ },
+}
+
+-- Library store action
+add_building_action
+{
+ ["index"] = 61,
+ ["action"] = function()
+ -- the quest hasn't been requested already, right?
+ if quest(LIBRARY_QUEST).status == QUEST_STATUS_UNTAKEN then
+ -- quest has been taken now
+ quest(LIBRARY_QUEST).status = QUEST_STATUS_TAKEN
+
+ -- issue instructions
+ msg_print("I need get some stock from my main library, but it is infested with monsters!")
+ msg_print("Please use the side entrance and vanquish the intruders for me.")
+
+ return TRUE, FALSE, TRUE
+ -- if quest completed
+ elseif (quest(LIBRARY_QUEST).status == QUEST_STATUS_COMPLETED) then
+ msg_print("Thank you! Let me make a special book for you.")
+ msg_print("Tell me three spells and I will write them in the book.")
+ library_quest.fill_book()
+ if library_quest.book_slots_left() == 0 then
+ quest(LIBRARY_QUEST).status = QUEST_STATUS_REWARDED
+ book = create_object(TV_BOOK, 61)
+ book.art_name = quark_add(player_name())
+ book.found = OBJ_FOUND_REWARD
+ set_aware(book)
+ set_known(book)
+ inven_carry(book, FALSE)
+ end
+
+ -- if the player asks for a quest when they already have it, but haven't failed it, give them some extra instructions
+ elseif (quest(LIBRARY_QUEST).status == QUEST_STATUS_TAKEN) then
+ msg_print("Please use the side entrance and vanquish the intruders for me.")
+
+ -- quest failed or completed, then give no more quests
+ elseif (quest(LIBRARY_QUEST).status == QUEST_STATUS_FAILED) or (quest(LIBRARY_QUEST).status == QUEST_STATUS_REWARDED) then
+ msg_print("I have no more quests for you.")
+ end
+ return TRUE
+ end,
+}
diff --git a/lib/mods/theme/scpt/mimic.lua b/lib/mods/theme/scpt/mimic.lua
new file mode 100644
index 00000000..f38f70f7
--- /dev/null
+++ b/lib/mods/theme/scpt/mimic.lua
@@ -0,0 +1,419 @@
+-- Define the various possible mimic shapes
+
+-- Nature shapes
+add_mimic_shape
+{
+ ["name"] = "Mouse",
+ ["obj_name"] = "Mouse Fur",
+ ["desc"] = "Mice are small, fast and very stealthy",
+ ["realm"] = "nature",
+ ["level"] = 1,
+ ["rarity"] = 10,
+ ["duration"] = {20, 40},
+ ["calc"] = function ()
+ -- Mice run!
+ player.pspeed = player.pspeed + 5 + (player.mimic_level / 7)
+
+ -- They can crtawl under your armor to hit you ;)
+ player.to_h = player.to_h + 10 + (player.mimic_level / 5)
+ player.dis_to_h = player.dis_to_h + 10 + (player.mimic_level / 5)
+
+ -- But they are not very powerfull
+ player.to_d = player.to_d / 5
+ player.dis_to_d = player.dis_to_d / 5
+
+ -- But they are stealthy
+ player.skill_stl = player.skill_stl + 10 + (player.mimic_level / 5)
+
+ -- Stat mods
+ player.modify_stat(A_STR, -5)
+ player.modify_stat(A_DEX, 3)
+ player.modify_stat(A_CON, 1)
+
+ end,
+ ["power"] = function()
+ if player.mimic_level >= 30 then
+ player.add_power(POWER_INVISIBILITY)
+ end
+ end,
+}
+
+add_mimic_shape
+{
+ ["name"] = "Eagle",
+ ["obj_name"] = "Feathered Cloak",
+ ["desc"] = "Eagles are master of the air, good hunters with excellent vision.",
+ ["realm"] = "nature",
+ ["level"] = 10,
+ ["rarity"] = 30,
+ ["duration"] = {10, 50},
+ ["calc"] = function ()
+ player.ffall = TRUE
+ player.pspeed = player.pspeed + 2 + (player.mimic_level / 6)
+
+ player.modify_stat(A_STR, -3)
+ player.modify_stat(A_DEX, 2 + (player.mimic_level / 15))
+ player.modify_stat(A_CON, 4 + (player.mimic_level / 20))
+ player.modify_stat(A_INT, -1)
+ player.modify_stat(A_WIS, 1)
+ player.modify_stat(A_CHR, -1)
+
+ if player.mimic_level >= 20 then
+ player.xtra_f4 = bor(player.xtra_f4, TR4_FLY)
+ player.xtra_f3 = bor(player.xtra_f3, TR3_SEE_INVIS)
+ end
+ if player.mimic_level >= 25 then
+ player.xtra_f2 = bor(player.xtra_f2, TR2_FREE_ACT)
+ end
+ if player.mimic_level >= 30 then
+ player.xtra_f2 = bor(player.xtra_f2, TR2_RES_ELEC)
+ end
+ if player.mimic_level >= 30 then
+ player.xtra_f3 = bor(player.xtra_f3, TR3_SH_ELEC)
+ end
+ end,
+}
+
+add_mimic_shape
+{
+ ["name"] = "Wolf",
+ ["obj_name"] = "Wolf Pelt",
+ ["desc"] = "Wolves are masters of movement, strong and have excellent eyesight.",
+ ["realm"] = "nature",
+ ["level"] = 20,
+ ["rarity"] = 40,
+ ["duration"] = {10, 50},
+ ["calc"] = function ()
+ player.modify_stat(A_STR, 2 + (player.mimic_level / 20))
+ player.modify_stat(A_DEX, 3 + (player.mimic_level / 20))
+ player.modify_stat(A_INT, -3)
+ player.modify_stat(A_CHR, -2)
+
+ player.pspeed = player.pspeed + 10 + (player.mimic_level / 5)
+
+ player.xtra_f2 = bor(player.xtra_f2, TR2_FREE_ACT)
+ player.xtra_f2 = bor(player.xtra_f2, TR2_RES_FEAR)
+
+ if player.mimic_level >= 10 then
+ player.xtra_f2 = bor(player.xtra_f2, TR2_RES_COLD)
+ end
+ if player.mimic_level >= 15 then
+ player.xtra_f3 = bor(player.xtra_f3, TR3_SEE_INVIS)
+ end
+ if player.mimic_level >= 30 then
+ player.xtra_f2 = bor(player.xtra_f2, TR2_RES_DARK)
+ end
+ if player.mimic_level >= 35 then
+ player.xtra_f2 = bor(player.xtra_f2, TR2_RES_CONF)
+ end
+ end,
+}
+
+add_mimic_shape
+{
+ ["name"] = "Spider",
+ ["obj_name"] = "Spider Web",
+ ["desc"] = "Spiders are clever and become good climbers.",
+ ["realm"] = "nature",
+ ["level"] = 25,
+ ["rarity"] = 50,
+ ["duration"] = {10, 50},
+ ["calc"] = function ()
+ player.modify_stat(A_STR, -4)
+ player.modify_stat(A_DEX, 1 + (player.mimic_level / 8))
+ player.modify_stat(A_INT, 1 + (player.mimic_level / 5))
+ player.modify_stat(A_WIS, 1 + (player.mimic_level / 5))
+ player.modify_stat(A_CON, -5)
+ player.modify_stat(A_CHR, -10)
+
+ player.pspeed = player.pspeed + 5
+
+ player.xtra_f2 = bor(player.xtra_f2, TR2_RES_POIS)
+ player.xtra_f2 = bor(player.xtra_f2, TR2_RES_FEAR)
+ player.xtra_f2 = bor(player.xtra_f2, TR2_RES_DARK)
+
+ if player.mimic_level >= 40 then
+ player.xtra_f4 = bor(player.xtra_f4, TR4_CLIMB)
+ end
+
+ end,
+ ["power"] = function()
+ if player.mimic_level >= 25 then
+ player.add_power(POWER_WEB)
+ end
+ end,
+}
+
+add_mimic_shape
+{
+ ["name"] = "Elder Ent",
+ ["obj_name"] = "Entish Bark",
+ ["desc"] = "Ents are powerful tree-like beings dating from the dawn of time.",
+ ["realm"] = "nature",
+ ["level"] = 40,
+ ["rarity"] = 60,
+ ["duration"] = {10, 30},
+ ["limit"] = TRUE,
+ ["calc"] = function ()
+ player.pspeed = player.pspeed - 5 - (player.mimic_level / 10)
+
+ player.to_a = player.to_a + 10 + player.mimic_level
+ player.dis_to_a = player.dis_to_a + 10 + player.mimic_level
+
+ player.modify_stat(A_STR, player.mimic_level / 5)
+ player.modify_stat(A_INT, - (player.mimic_level / 7))
+ player.modify_stat(A_WIS, - (player.mimic_level / 7))
+ player.modify_stat(A_DEX, -4)
+ player.modify_stat(A_CON, player.mimic_level / 5)
+ player.modify_stat(A_CHR, -7)
+
+ player.xtra_f2 = bor(player.xtra_f2, TR2_RES_POIS)
+ player.xtra_f2 = bor(player.xtra_f2, TR2_RES_COLD)
+ player.xtra_f2 = bor(player.xtra_f2, TR2_FREE_ACT)
+ player.xtra_f3 = bor(player.xtra_f3, TR3_REGEN)
+ player.xtra_f3 = bor(player.xtra_f3, TR3_SEE_INVIS)
+ player.xtra_f2 = bor(player.xtra_f2, TR2_SENS_FIRE)
+ end,
+ ["power"] = function ()
+ player.add_power(PWR_GROW_TREE)
+ end,
+}
+
+add_mimic_shape
+{
+ ["name"] = "Vapour",
+ ["obj_name"] = "Cloak of Mist",
+ ["desc"] = "A sentient cloud, darting around",
+ ["realm"] = "nature",
+ ["level"] = 15,
+ ["rarity"] = 10,
+ ["duration"] = {10, 40},
+ ["calc"] = function ()
+
+ player.pspeed = player.pspeed + 5
+
+ --Try to hit a cloud!
+ player.to_a = player.to_a + 40 + player.mimic_level
+ player.dis_to_a = player.dis_to_a + 40 + player.mimic_level
+
+ --Try to hit WITH a cloud!
+ player.to_h = player.to_h - 40
+ player.dis_to_h = player.dis_to_h -40
+
+ -- Stat mods
+ player.modify_stat(A_STR, -4)
+ player.modify_stat(A_DEX, 5)
+ player.modify_stat(A_CON, -4)
+ player.modify_stat(A_CHR, -10)
+
+ -- But they are stealthy
+ player.skill_stl = player.skill_stl + 10 + (player.mimic_level / 5)
+ player.xtra_f2 = bor(player.xtra_f2, TR2_RES_POIS)
+ player.xtra_f2 = bor(player.xtra_f2, TR2_RES_SHARDS)
+ player.xtra_f2 = bor(player.xtra_f2, TR2_IM_COLD)
+ player.xtra_f2 = bor(player.xtra_f2, TR2_FREE_ACT)
+ player.xtra_f3 = bor(player.xtra_f3, TR3_REGEN)
+ player.xtra_f3 = bor(player.xtra_f3, TR3_SEE_INVIS)
+ player.xtra_f2 = bor(player.xtra_f2, TR2_SENS_FIRE)
+ player.xtra_f3 = bor(player.xtra_f3, TR3_FEATHER)
+ end,
+}
+
+add_mimic_shape
+{
+ ["name"] = "Serpent",
+ ["obj_name"] = "Snakeskin Cloak",
+ ["desc"] = "Serpents are fast, lethal predators.",
+ ["realm"] = "nature",
+ ["level"] = 30,
+ ["rarity"] = 25,
+ ["duration"] = {15, 20},
+ ["calc"] = function ()
+ player.pspeed = player.pspeed + 10 + (player.mimic_level / 6)
+ player.to_a = player.to_a + 3 + (player.mimic_level / 8)
+ player.dis_to_a = player.dis_to_a + 3 + (player.mimic_level / 8)
+
+ player.modify_stat(A_STR, player.mimic_level / 8)
+ player.modify_stat(A_INT, -6)
+ player.modify_stat(A_WIS, -6)
+ player.modify_stat(A_DEX, -4)
+ player.modify_stat(A_CON, player.mimic_level / 7)
+ player.modify_stat(A_CHR, -6)
+
+ player.xtra_f2 = bor(player.xtra_f2, TR2_RES_POIS)
+ if player.mimic_level >= 25 then
+ player.xtra_f2 = bor(player.xtra_f2, TR2_FREE_ACT)
+ end
+ end,
+}
+
+add_mimic_shape
+{
+ ["name"] = "Mumak",
+ ["obj_name"] = "Mumak Hide",
+ ["desc"] = "A giant, elaphantine form.",
+ ["realm"] = "nature",
+ ["level"] = 40,
+ ["rarity"] = 40,
+ ["duration"] = {15, 20},
+ ["calc"] = function ()
+ player.pspeed = player.pspeed - 5 - (player.mimic_level / 10)
+ player.to_a = player.to_a + 10 + (player.mimic_level / 6)
+ player.dis_to_a = player.dis_to_a + 10 + (player.mimic_level / 6)
+ player.to_d = player.to_d + 5 + ((player.mimic_level * 2) / 3)
+ player.dis_to_d = player.dis_to_d + 5 + ((player.mimic_level * 2) / 3)
+
+ player.modify_stat(A_STR, player.mimic_level / 4)
+ player.modify_stat(A_INT, -8)
+ player.modify_stat(A_WIS, -4)
+ player.modify_stat(A_DEX, -5)
+ player.modify_stat(A_CON, player.mimic_level / 3)
+ player.modify_stat(A_CHR, -10)
+
+ if player.mimic_level >= 10 then
+ player.xtra_f2 = bor(player.xtra_f2, TR2_RES_FEAR)
+ end
+ if player.mimic_level >= 25 then
+ player.xtra_f2 = bor(player.xtra_f2, TR2_RES_CONF)
+ end
+ if player.mimic_level >= 30 then
+ player.xtra_f2 = bor(player.xtra_f2, TR2_FREE_ACT)
+ end
+ if player.mimic_level >= 35 then
+ player.xtra_f2 = bor(player.xtra_f2, TR2_RES_NEXUS)
+ end
+ end,
+}
+
+--------- Extra shapes -----------
+
+-- For Beornings
+add_mimic_shape
+{
+ ["name"] = "Bear",
+ ["desc"] = "A fierce, terrible bear.",
+ ["realm"] = nil,
+ ["level"] = 1,
+ ["rarity"] = 101,
+ ["duration"] = {50, 200},
+ ["limit"] = TRUE,
+ ["calc"] = function ()
+ player.pspeed = player.pspeed - 5 + (player.mimic_level / 5)
+
+ player.to_a = player.to_a + 5 + ((player.mimic_level * 2) / 3)
+ player.dis_to_a = player.dis_to_a + 5 + ((player.mimic_level * 2) / 3)
+
+ player.modify_stat(A_STR, player.mimic_level / 11)
+ player.modify_stat(A_INT, player.mimic_level / 11)
+ player.modify_stat(A_WIS, player.mimic_level / 11)
+ player.modify_stat(A_DEX, -1)
+ player.modify_stat(A_CON, player.mimic_level / 11)
+ player.modify_stat(A_CHR, -10)
+
+ if player.mimic_level >= 10 then
+ player.xtra_f2 = bor(player.xtra_f2, TR2_FREE_ACT)
+ end
+ if player.mimic_level >= 20 then
+ player.xtra_f3 = bor(player.xtra_f3, TR3_REGEN)
+ end
+ if player.mimic_level >= 30 then
+ player.xtra_f2 = bor(player.xtra_f2, TR2_RES_CONF)
+ end
+ if player.mimic_level >= 35 then
+ player.xtra_f2 = bor(player.xtra_f2, TR2_RES_NEXUS)
+ end
+
+ -- activate the skill
+ skill(SKILL_BEAR).hidden = FALSE
+ end,
+}
+
+-- For balrog corruptions
+add_mimic_shape
+{
+ ["name"] = "Balrog",
+ ["desc"] = "A corrupted maia.",
+ ["realm"] = nil,
+ ["level"] = 1,
+ ["rarity"] = 101,
+ ["duration"] = {30, 70},
+ ["limit"] = TRUE,
+ ["calc"] = function ()
+ player.modify_stat(A_STR, 5 + player.mimic_level / 5)
+ player.modify_stat(A_INT, player.mimic_level / 10)
+ player.modify_stat(A_WIS, - ( 5 + player.mimic_level / 10))
+ player.modify_stat(A_DEX, player.mimic_level / 10)
+ player.modify_stat(A_CON, 5 + player.mimic_level / 5)
+ player.modify_stat(A_CHR, - ( 5 + player.mimic_level / 10))
+
+ player.xtra_f2 = bor(player.xtra_f2, TR2_IM_ACID)
+ player.xtra_f2 = bor(player.xtra_f2, TR2_IM_FIRE)
+ player.xtra_f2 = bor(player.xtra_f2, TR2_IM_ELEC)
+ player.xtra_f2 = bor(player.xtra_f2, TR2_RES_DARK)
+ player.xtra_f2 = bor(player.xtra_f2, TR2_RES_CHAOS)
+ player.xtra_f2 = bor(player.xtra_f2, TR2_RES_POIS)
+ player.xtra_f2 = bor(player.xtra_f2, TR2_HOLD_LIFE)
+ player.xtra_f3 = bor(player.xtra_f3, TR3_FEATHER)
+ player.xtra_f3 = bor(player.xtra_f3, TR3_REGEN)
+ player.xtra_f3 = bor(player.xtra_f3, TR3_SH_FIRE)
+ player.xtra_f3 = bor(player.xtra_f3, TR3_LITE1)
+ return 1
+ end,
+}
+
+-- For avatar spell
+add_mimic_shape
+{
+ ["name"] = "Maia",
+ ["desc"] = "A near god-like being.",
+ ["realm"] = nil,
+ ["level"] = 1,
+ ["rarity"] = 101,
+ ["duration"] = {30, 70},
+ ["limit"] = TRUE,
+ ["calc"] = function ()
+ player.modify_stat(A_STR, 5 + player.mimic_level / 5)
+ player.modify_stat(A_INT, 5 + player.mimic_level / 5)
+ player.modify_stat(A_WIS, 5 + player.mimic_level / 5)
+ player.modify_stat(A_DEX, 5 + player.mimic_level / 5)
+ player.modify_stat(A_CON, 5 + player.mimic_level / 5)
+ player.modify_stat(A_CHR, 5 + player.mimic_level / 5)
+
+ player.xtra_f2 = bor(player.xtra_f2, TR2_IM_FIRE)
+ player.xtra_f2 = bor(player.xtra_f2, TR2_IM_ELEC)
+ player.xtra_f2 = bor(player.xtra_f2, TR2_IM_ACID)
+ player.xtra_f2 = bor(player.xtra_f2, TR2_IM_COLD)
+ player.xtra_f2 = bor(player.xtra_f2, TR2_RES_POIS)
+ player.xtra_f2 = bor(player.xtra_f2, TR2_RES_LITE)
+ player.xtra_f2 = bor(player.xtra_f2, TR2_RES_DARK)
+ player.xtra_f2 = bor(player.xtra_f2, TR2_RES_CHAOS)
+ player.xtra_f2 = bor(player.xtra_f2, TR2_HOLD_LIFE)
+ player.xtra_f3 = bor(player.xtra_f3, TR3_FEATHER)
+ player.xtra_f3 = bor(player.xtra_f3, TR3_REGEN)
+ return 2
+ end,
+}
+
+-- For Geomancy
+add_mimic_shape
+{
+ ["name"] = "Fire Elem.",
+ ["desc"] = "A towering column of flames",
+ ["realm"] = nil,
+ ["level"] = 1,
+ ["rarity"] = 101,
+ ["duration"] = {10, 10},
+ ["limit"] = TRUE,
+ ["calc"] = function ()
+ player.modify_stat(A_STR, 5 + (player.mimic_level / 5))
+ player.modify_stat(A_DEX, 5 + (player.mimic_level / 5))
+ player.modify_stat(A_WIS, -5 - (player.mimic_level / 5))
+
+ player.xtra_f2 = bor(player.xtra_f2, TR2_IM_FIRE)
+ -- was immune to poison in the 3.0.0 version
+ player.xtra_f2 = bor(player.xtra_f2, TR2_RES_POIS)
+ player.xtra_f3 = bor(player.xtra_f3, TR3_SH_FIRE)
+ player.xtra_f3 = bor(player.xtra_f3, TR3_LITE1)
+ return 0
+ end,
+}
diff --git a/lib/mods/theme/scpt/misc.lua b/lib/mods/theme/scpt/misc.lua
new file mode 100644
index 00000000..acb45f3c
--- /dev/null
+++ b/lib/mods/theme/scpt/misc.lua
@@ -0,0 +1,213 @@
+-- New scrolls
+function sterilize_scroll(tval, sval)
+ if tval == 70 and sval == 54 then
+ msg_print("A neutralising wave radiates from you!")
+ set_no_breeders(randint(100) + 100)
+ return TRUE
+ end
+end
+
+add_hook_script(HOOK_READ, "sterilize_scroll", "sterilize_scroll")
+
+-- Neil's automagic statgain script
+
+player.last_rewarded_level = 1
+add_loadsave("player.last_rewarded_level", 1)
+
+add_hooks
+ {
+ [HOOK_PLAYER_LEVEL] = function()
+ while player.last_rewarded_level * 5 <= player.lev do
+ do_inc_stat(A_STR)
+ do_inc_stat(A_INT)
+ do_inc_stat(A_WIS)
+ do_inc_stat(A_DEX)
+ do_inc_stat(A_CON)
+ do_inc_stat(A_CHR)
+ player.last_rewarded_level = player.last_rewarded_level + 1
+ end
+ end,
+ }
+
+add_hooks
+{
+ [HOOK_BIRTH_OBJECTS] = function()
+ if player.last_rewarded_level >= 1
+ then player.last_rewarded_level = 1
+ else
+ end
+ end
+}
+
+-- silly function that allows a drunk to take a bottle of wine/ale from the player
+
+function drunk_takes_wine(m_idx, item)
+
+ m_ptr = monster(m_idx)
+ o_ptr = get_object(item)
+
+ if (m_ptr.r_idx == test_monster_name("Singing, happy drunk"))
+ and (o_ptr.tval == TV_FOOD) and ((o_ptr.sval == 38) or (o_ptr.sval == 39)) then
+
+ cmsg_print(TERM_YELLOW, "'Hic!'")
+
+ inven_item_increase(item, -1)
+ inven_item_optimize(item)
+
+-- HackSmurf: the drunk may drop an empty bottle
+ bottle = create_object(TV_BOTTLE,1)
+ drop_near(bottle, 50, player.py, player.px)
+ return TRUE
+ else
+ return FALSE
+ end
+end
+
+add_hook_script(HOOK_GIVE, "drunk_takes_wine", "drunk_takes_wine")
+
+-- winged races are allowed soft armor only, no cloaks (from T-Plus)
+function __hook_wings_wear(obj)
+ local str = get_race_name()
+ local type = obj.tval
+ if (str == "Dragon" or str == "Eagle") and (type == 35 or type == 37 or type == 38) then
+ return TRUE, -1
+ end
+end
+
+add_hook_script(HOOK_WIELD_SLOT, "__hook_wings_wear", "__hook_wings_wear")
+
+-- A not-too-scummy way of generating junk for ammo
+function food_vessel(object)
+ if ((object.tval == 80) and (object.sval == 43)) or
+ ((object.tval == 80) and (object.sval == 44)) then
+ local obj = create_object(TV_JUNK, 3)
+ obj.ident = bor(obj.ident, IDENT_MENTAL, IDENT_KNOWN)
+ inven_carry(obj, FALSE)
+ end_object(obj)
+ return FALSE
+ end
+end
+
+add_hook_script(HOOK_EAT, "food_vessel", "food_vessel")
+
+-- Longbottom Leaf *is* a great stress reliever:
+function longbottom_leaf(object)
+ if (object.tval == 80) and (object.sval == 45) then
+ msg_print("What a stress reliever!")
+ heal_insanity(1000)
+ return FALSE
+ end
+end
+add_hook_script(HOOK_EAT, "longbottom_leaf", "longbottom_leaf")
+
+-- Hobbits like food
+function hobbit_food(m_idx, item)
+
+ m_ptr = monster(m_idx)
+ o_ptr = get_object(item)
+
+ if (m_ptr.r_idx == test_monster_name("Scruffy-looking hobbit"))
+ and (o_ptr.tval == TV_FOOD) then
+ cmsg_print(TERM_YELLOW, "'Yum!'")
+ inven_item_increase(item, -1)
+ inven_item_optimize(item)
+ return TRUE
+ else
+ return FALSE
+ end
+end
+
+add_hook_script(HOOK_GIVE, "hobbit_food", "hobbit_food")
+
+-- Smeagol likes rings
+function smeagol_ring(m_idx, item)
+
+ m_ptr = monster(m_idx)
+ o_ptr = get_object(item)
+
+ if (m_ptr.r_idx == test_monster_name("Smeagol"))
+ and (o_ptr.tval == TV_RING) then
+
+ cmsg_print(TERM_YELLOW, "'MY... PRECIOUSSSSS!!!'")
+
+ inven_item_increase(item, -1)
+ inven_item_optimize(item)
+ return TRUE
+ else
+ return FALSE
+ end
+end
+
+add_hook_script(HOOK_GIVE, "smeagol_ring", "smeagol_ring")
+
+-- functions to check for Map and Key of Thror before proceeding in Erebor
+-- Thank you, Massimiliano Marangio :-)
+add_hooks
+{
+ [HOOK_STAIR] = function(direction)
+ if ((current_dungeon_idx == 20) and (dun_level == 60) and (direction == "down")) then
+ local i
+ local mapkey = 0
+ for i = 0, INVEN_TOTAL - 1 do
+ if ((player.inventory(i).name1 == 209) or (player.inventory(i).name1 == 210)) then
+ mapkey = mapkey + 1
+ end
+ end
+
+ if (mapkey == 2) then
+ msg_print("The moon-letters on the map show you the keyhole! You use the key to enter.")
+ return FALSE
+ else
+ msg_print("You have found a door, but you cannot find a way to enter. Ask in Dale, perhaps?")
+ return TRUE
+ end
+ end
+ return FALSE
+ end,
+}
+
+-- function to make the Dale mayor tell you about how to get to Erebor 61
+add_building_action
+{
+ ["index"] = 66,
+ ["action"] = function()
+ msg_print("You will need Thorin's Key and Thrain's Map to get anywhere in Erebor. One may be found in the Barrow-Downs. The other, in Mirkwood.")
+ end
+}
+
+-- function to make Melkor like it if a player quaffs potions of corruption
+function melkor_potion_corruption(object)
+ if (player.pgod == GOD_MELKOR) then
+ if (object.tval == TV_POTION) and (object.sval == SV_POTION_MUTATION) then
+ msg_print("Your quaffing of this potion pleases Melkor!")
+ set_grace(player.grace + 2)
+ return FALSE
+ end
+ end
+end
+add_hook_script(HOOK_QUAFF, "melkor_potion_corruption", "melkor_potion_corruption")
+
+-- function to check for Key of Orthanc before proceeding to the final level in Isengard
+add_hooks
+{
+ [HOOK_STAIR] = function(direction)
+ if ((current_dungeon_idx == 36) and (dun_level == 39) and (direction == "down")) then
+ local i
+ local orthkey = 0
+ for i = 0, INVEN_TOTAL - 1 do
+ if (player.inventory(i).name1 == 15) then
+ orthkey = orthkey + 1
+ end
+ end
+
+ if (orthkey == 1) then
+ msg_print("#BYou have the key to the tower of Orthanc! You may proceed.#w")
+ return FALSE
+ else
+ msg_print("#yYou may not enter Orthanc without the key to the gates!#w Rumours say the key was lost in the Mines of Moria...")
+ return TRUE
+ end
+ end
+ return FALSE
+ end,
+} \ No newline at end of file
diff --git a/lib/mods/theme/scpt/mkeys.lua b/lib/mods/theme/scpt/mkeys.lua
new file mode 100644
index 00000000..07105c64
--- /dev/null
+++ b/lib/mods/theme/scpt/mkeys.lua
@@ -0,0 +1,95 @@
+-- Mkeys for skills & abilities
+
+GF_INSTA_DEATH = add_spell_type
+{
+ ["color"] = { TERM_DARK, 0 },
+ ["angry"] = function() return TRUE, TRUE end,
+ ["monster"] = function(who, dam, rad, y, x, monst)
+ local race = race_info_idx(monst.r_idx, monst.ego)
+ if magik(5) == FALSE or band(race.flags1, RF1_UNIQUE) ~= FALSE or band(race.flags3, RF3_UNDEAD) ~= FALSE or band(race.flags3, RF3_NONLIVING) ~= FALSE then
+ return TRUE, FALSE
+ else
+ -- Reduce the exp gained this way
+ monst.level = monst.level / 3
+ return TRUE, FALSE, 32535, 0, 0, 0, 0, 0, 0, 0, " faints.", " is sucked out of life."
+ end
+ end,
+}
+
+-- Death touch ability
+add_mkey
+{
+ ["mkey"] = 100,
+ ["fct"] = function()
+ if player.csp > 40 then
+ increase_mana(-40)
+ set_project(randint(30) + 10, GF_INSTA_DEATH, 1, 0, bor(PROJECT_STOP, PROJECT_KILL))
+ energy_use = 100
+ else
+ msg_print("You need at least 40 mana.")
+ end
+ end,
+}
+
+
+-- Geomancy skill
+add_mkey
+{
+ ["mkey"] = 101,
+ ["fct"] = function()
+ local s
+
+ -- No magic
+ if (player.antimagic > 0) then
+ msg_print("Your anti-magic field disrupts any magic attempts.")
+ return
+ end
+
+ local obj = get_object(INVEN_WIELD)
+ if (obj.k_idx <= 0) or (obj.tval ~= TV_MSTAFF) then
+ msg_print('You must wield a magestaff to use Geomancy.')
+ return
+ end
+
+ s = get_school_spell("cast", "is_ok_spell", 62);
+
+ -- Actualy cast the choice
+ if (s ~= -1) then
+ cast_school_spell(s, spell(s))
+ end
+ end,
+}
+
+-- Far reaching attack of polearms
+add_mkey
+{
+ ["mkey"] = 102,
+ ["fct"] = function()
+ local weapon = get_object(INVEN_WIELD);
+ if weapon.tval == TV_POLEARM then
+ else
+ msg_print("You will need a long polearm for this!")
+ return
+ end
+
+ ret, dir = get_rep_dir()
+ if ret == FALSE then return end
+
+ local dy, dx = explode_dir(dir)
+ dy = dy * 2
+ dx = dx * 2
+ targety = player.py + dy
+ targetx = player.px + dx
+
+ local max_blows = get_skill_scale(SKILL_POLEARM, player.num_blow / 2)
+ if max_blows == 0 then max_blows = 1 end
+
+ if get_skill(SKILL_POLEARM) >= 40 then
+ energy_use = energy_use + 200
+ return project(0, 0, targety, targetx, max_blows, GF_ATTACK, bor(PROJECT_BEAM, PROJECT_KILL))
+ else
+ energy_use = energy_use + 200
+ return project(0, 0, targety, targetx, max_blows, GF_ATTACK, bor(PROJECT_BEAM, PROJECT_STOP, PROJECT_KILL))
+ end
+ end,
+}
diff --git a/lib/mods/theme/scpt/monsters.lua b/lib/mods/theme/scpt/monsters.lua
new file mode 100644
index 00000000..ad3a5628
--- /dev/null
+++ b/lib/mods/theme/scpt/monsters.lua
@@ -0,0 +1,182 @@
+-- This file holds various things that govern monster behaviour with respect to the player
+
+-- Enables player to push past any monster who is >= MSTATUS_NEUTRAL.
+-- Written by BauMog for the Intets Hevn module; permission granted to use in the Theme module
+
+-- Adapted from defines.h
+function cave_floor_bold(y, x)
+ local c_ptr = cave(y, x);
+ if(cave_is(c_ptr, FF1_FLOOR) == TRUE) and (c_ptr.feat ~= FEAT_MON_TRAP) then
+ return TRUE
+ else
+ return FALSE
+ end
+end
+
+-- Adapted from cmd1.c
+function __hook_push_past(y, x)
+ local c_ptr = cave(y, x);
+
+ if(c_ptr.m_idx > 0) then
+ m_ptr = monster(c_ptr.m_idx);
+ if(m_ptr.status >= MSTATUS_NEUTRAL) then
+ if(cave_floor_bold(y, x) == TRUE) or (m_ptr.flags2 == RF2_PASS_WALL) then
+ msg_print(format("You push past %s.", monster_desc(m_ptr, 0)));
+ m_ptr.fy = player.py;
+ m_ptr.fx = player.px;
+ cave(player.py, player.px).m_idx = c_ptr.m_idx;
+ c_ptr.m_idx = 0;
+ else
+ msg_print(format("%s is in your way!", monster_desc(m_ptr, 0)));
+ energy_use = 0;
+ end
+ end
+ end
+
+end
+
+add_hook_script(HOOK_MOVE, "__hook_push_past", "__hook_push_past");
+
+-- Monster vs. Player Race alignment script
+-- From T-Plus by Ingeborg S. Norden
+
+monst_al = {}
+
+function monst_al_add(status, mrs, prs)
+for i,v in mrs do
+-- added end
+if not monst_al[v] then monst_al[v] = {} end
+for j, w in prs do
+monst_al[v][w] = status
+end
+end
+end
+
+function monst_al_get(mr,pr)
+ if monst_al[mr] then return monst_al[mr][pr]
+ else return end
+end
+
+-- Maia aggravation for evil beings (provided that no demonic corruptions are present)
+-- Based on parts of angel.lua from T-Plus by Ingeborg S. Norden
+
+-- cast dispel evil with 0 damage every 10 turns
+
+TIMER_AGGRAVATE_EVIL = new_timer
+{
+ ["enabled"] = FALSE,
+ ["delay"] = 10,
+ ["callback"] = function()
+ dispel_evil(0)
+ end,
+}
+
+add_hooks{
+[HOOK_GAME_START] = function()
+
+ if ((get_race_name() == "Maia") and
+ (player.corruption(CORRUPT_BALROG_AURA) ~= TRUE) and
+ (player.corruption(CORRUPT_BALROG_WINGS) ~= TRUE) and
+ (player.corruption(CORRUPT_BALROG_STRENGTH) ~= TRUE) and
+ (player.corruption(CORRUPT_BALROG_FORM) ~= TRUE)) then
+ -- "Proper" Maiar aggravate evil beings
+ TIMER_AGGRAVATE_EVIL.enabled = TRUE
+ -- Good beings (except swans, GWoPs, Wyrm Spirits, and some joke uniques) are coaligned with Maiar
+
+ monst_al_add(MSTATUS_FRIEND, {25, 29, 45, 97, 109, 147, 225, 335, 346, 443, 581, 629, 699, 853, 984, 1007, 1017}, {21})
+
+ -- Non-evil humanoids are neutral to Humans, Dunedain, Druedain, Rohirrim
+ elseif ((get_race_name() == "Human") or
+ (get_race_name() == "Dunadan") or
+ (get_race_name() == "Druadan") or
+ (get_race_name() == "RohanKnight")) then
+ monst_al_add(MSTATUS_NEUTRAL, {43, 45, 46, 83, 93, 97, 109, 110, 142, 147, 216, 225, 293, 345, 346, 693, 699, 937, 988, 997, 998, 1000},{0, 8, 12, 16})
+
+ -- Non-evil sentient (and non-animal) creatures are neutral to Hobbits, Elves, Wood-Elves
+ elseif ((get_race_name() == "Hobbit") or
+ (get_race_name() == "Elf") or
+ (get_race_name() == "Wood-Elf")) then
+ monst_al_add(MSTATUS_NEUTRAL, {43, 45, 46, 83, 93, 97, 109, 110, 142, 147, 216, 225, 293, 345, 346, 693, 699, 937, 988, 997, 998, 1000, 74, 103, 882, 1017},{2, 3, 20})
+
+ -- Gnome monsters are neutral to Gnomes
+ elseif get_race_name() == "Gnome" then
+ monst_al_add(MSTATUS_NEUTRAL, {103, 281, 680, 984, 1001, 1003, 1007, 1011, 1014, 1016},{4})
+
+ -- Dwarven monsters are neutral to Petty-dwarves and Dwarves
+ elseif ((get_race_name() == "Dwarf") or
+ (get_race_name() == "Petty-Dwarf")) then
+ monst_al_add(MSTATUS_NEUTRAL, {111, 112, 179, 180, 181, 182},{5, 13})
+
+ -- If an Orc character worships Melkor, lower-level Orcs are neutral (not Uruk-hai, however)
+ elseif ((get_race_name() == "Orc") and
+ (player.pgod == GOD_MELKOR)) then
+ monst_al_add(MSTATUS_FRIEND, {87, 118, 126, 149, 244, 251, 264},{6})
+
+ -- If a Troll character worships Melkor, Trolls are neutral (not Eldraks, Ettins, and War trolls, though)
+ elseif ((get_race_name() == "Troll") and
+ (player.pgod == GOD_MELKOR)) then
+ monst_al_add(MSTATUS_NEUTRAL, {297, 401, 403, 424, 454, 491, 496, 509, 538},{7})
+
+ -- Ogres are neutral to Half-Ogres
+ elseif get_race_name() == "Half-Ogre" then
+ monst_al_add(MSTATUS_NEUTRAL, {262, 285, 415, 430, 479, 745, 918},{10})
+
+ -- Bears are neutral to Beornings, except werebears.
+ elseif get_race_name() == "Beorning" then
+ monst_al_add(MSTATUS_NEUTRAL, {160, 173, 191, 854, 855, 867, 873},{11})
+
+ -- Dark elven monsters are coaligned with Dark Elves
+ elseif get_race_name() == "Dark-Elf" then
+ monst_al_add(MSTATUS_FRIEND, {122, 178, 183, 226, 348, 375, 400, 657},{14})
+
+ -- Plants are coaligned with Ents
+ elseif get_race_name() == "Ent" then
+ monst_al_add(MSTATUS_FRIEND, {248, 266, 317, 329, 396},{15})
+
+ -- And since the above is largely useless except out in the wild...
+ -- If an Ent worships Yavanna, lower-level animals are coaligned
+ -- should make the early game a bit easier for Ents.
+ elseif ((get_race_name() == "Ent") and
+ (player.pgod == GOD_YAVANNA)) then
+ monst_al_add(MSTATUS_FRIEND, {21, 23, 24, 25, 26, 27, 28, 29, 30, 31, 33, 35, 36, 37, 38, 39, 41, 49, 50, 52, 56, 57, 58, 59, 60, 61, 62, 69, 70, 75, 77, 78, 79, 86, 88, 89, 90, 95, 96, 105, 106, 114, 119, 120, 121, 123, 127, 134, 141, 143, 151, 154, 155, 156, 160, 161, 168, 171, 173, 174, 175, 176, 187, 191, 196, 197, 198, 210, 211, 213, 230, 236, 250, 259},{15})
+
+ -- All non-evil non-neutral birds are coaligned with Eagles
+ elseif get_race_name() == "Eagle" then
+ monst_al_add(MSTATUS_FRIEND, {61, 141, 151, 279},{17})
+
+ -- Hatchling dragons are coaligned with Dragons
+ elseif get_race_name() == "Dragon" then
+ monst_al_add(MSTATUS_FRIEND, {163, 164, 165, 166, 167, 204, 218, 219, 911},{18})
+
+ -- Yeeks are neutral to Yeeks
+ elseif get_race_name() == "Yeek" then
+ monst_al_add(MSTATUS_NEUTRAL, {580, 583, 594, 653, 655, 659, 661},{19})
+
+ -- Oathbreakers are coaligned if player is wielding Anduril
+ -- It's dirty, but it works, and it doesn't bother checking demons and the races who can't wield weapons.
+ elseif get_object(INVEN_WIELD).name1 == 83 then
+ monst_al_add(MSTATUS_FRIEND, {731},{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 19, 20, 21, 22, 23})
+ end
+end,
+
+[HOOK_LEVEL_END_GEN] = function()
+
+for i=0,m_max-1 do
+ local monst = monster(i)
+ local s = monst_al_get(monst.r_idx, player.prace)
+ if s then monst.status = s end
+end
+
+end,
+
+[HOOK_NEW_MONSTER] = function()
+
+for i=0,m_max-1 do
+ local monst = monster(i)
+ local s = monst_al_get(monst.r_idx, player.prace)
+ if s then monst.status = s end
+end
+
+end,
+
+} \ No newline at end of file
diff --git a/lib/mods/theme/scpt/player.lua b/lib/mods/theme/scpt/player.lua
new file mode 100644
index 00000000..fd11ed9d
--- /dev/null
+++ b/lib/mods/theme/scpt/player.lua
@@ -0,0 +1,196 @@
+------------------------------------------------------------------------------
+----------------------- Hook to create birth objects -------------------------
+------------------------------------------------------------------------------
+function __birth_hook_objects()
+
+ -- Grace delay for adding piety
+ GRACE_DELAY = 0
+
+ -- Provide a book of Geyser to Geomancers
+ if get_class_name() == "Geomancer" then
+ local obj = create_object(TV_BOOK, 255);
+ obj.pval = find_spell("Geyser")
+ obj.ident = bor(obj.ident, IDENT_MENTAL, IDENT_KNOWN)
+ inven_carry(obj, FALSE)
+ end_object(obj)
+ end
+
+ -- Provide a book of prayer to priests
+ if get_class_name() == "Priest(Eru)" then
+ local obj = create_object(TV_BOOK, 255);
+ obj.pval = find_spell("See the Music")
+ obj.ident = bor(obj.ident, IDENT_MENTAL, IDENT_KNOWN)
+ inven_carry(obj, FALSE)
+ end_object(obj)
+ end
+ if get_class_name() == "Priest(Manwe)" then
+ local obj = create_object(TV_BOOK, 255);
+ obj.pval = find_spell("Manwe's Blessing")
+ obj.ident = bor(obj.ident, IDENT_MENTAL, IDENT_KNOWN)
+ inven_carry(obj, FALSE)
+ end_object(obj)
+ end
+ if get_class_name() == "Druid" then
+ local obj = create_object(TV_BOOK, 255);
+ obj.pval = find_spell("Charm Animal")
+ obj.ident = bor(obj.ident, IDENT_MENTAL, IDENT_KNOWN)
+ inven_carry(obj, FALSE)
+ end_object(obj)
+ end
+ if get_class_name() == "Dark-Priest" then
+ local obj = create_object(TV_BOOK, 255);
+ obj.pval = find_spell("Curse")
+ obj.ident = bor(obj.ident, IDENT_MENTAL, IDENT_KNOWN)
+ inven_carry(obj, FALSE)
+ end_object(obj)
+ end
+ if get_class_name() == "Paladin" then
+ local obj = create_object(TV_BOOK, 255);
+ obj.pval = find_spell("Divine Aim")
+ obj.ident = bor(obj.ident, IDENT_MENTAL, IDENT_KNOWN)
+ inven_carry(obj, FALSE)
+ end_object(obj)
+ end
+ if get_class_name() == "Stonewright" then
+ local obj = create_object(TV_BOOK, 255);
+ obj.pval = find_spell("Firebrand")
+ obj.ident = bor(obj.ident, IDENT_MENTAL, IDENT_KNOWN)
+ inven_carry(obj, FALSE)
+ end_object(obj)
+ end
+ if get_class_name() == "Priest(Varda)" then
+ local obj = create_object(TV_BOOK, 255);
+ obj.pval = find_spell("Light of Valinor")
+ obj.ident = bor(obj.ident, IDENT_MENTAL, IDENT_KNOWN)
+ inven_carry(obj, FALSE)
+ end_object(obj)
+ end
+ if get_class_name() == "Priest(Ulmo)" then
+ local obj = create_object(TV_BOOK, 255);
+ obj.pval = find_spell("Song of Belegaer")
+ obj.ident = bor(obj.ident, IDENT_MENTAL, IDENT_KNOWN)
+ inven_carry(obj, FALSE)
+ end_object(obj)
+ end
+ if get_class_name() == "Priest(Mandos)" then
+ local obj = create_object(TV_BOOK, 255);
+ obj.pval = find_spell("Tears of Luthien")
+ obj.ident = bor(obj.ident, IDENT_MENTAL, IDENT_KNOWN)
+ inven_carry(obj, FALSE)
+ end_object(obj)
+ end
+
+ if get_class_name() == "Mimic" then
+ local obj = create_object(TV_CLOAK, 100);
+ obj.pval2 = resolve_mimic_name("Mouse")
+ obj.ident = bor(obj.ident, IDENT_MENTAL, IDENT_KNOWN)
+ inven_carry(obj, FALSE)
+ end_object(obj)
+ end
+
+ -- Start the undeads, as undeads with the corruptions
+ if get_subrace_name() == "Vampire" then
+ player.corruption(CORRUPT_VAMPIRE_TEETH, TRUE)
+ player.corruption(CORRUPT_VAMPIRE_STRENGTH, TRUE)
+ player.corruption(CORRUPT_VAMPIRE_VAMPIRE, TRUE)
+ end
+
+ -- Start the Red (Fire) dragons with a book of Light (Theme)
+ if get_subrace_name() == "Red" then
+ local obj = create_object(TV_BOOK, 255);
+ obj.pval = find_spell("Globe of Light")
+ obj.ident = bor(obj.ident, IDENT_MENTAL, IDENT_KNOWN)
+ inven_carry(obj, FALSE)
+ end_object(obj)
+ end
+
+ -- Start the Black (Water) dragons with a book of Geyser (Theme)
+ if get_subrace_name() == "Black" then
+ local obj = create_object(TV_BOOK, 255);
+ obj.pval = find_spell("Geyser")
+ obj.ident = bor(obj.ident, IDENT_MENTAL, IDENT_KNOWN)
+ inven_carry(obj, FALSE)
+ end_object(obj)
+ end
+
+ -- Start the Green (Air) dragons with a book of Noxious Cloud (Theme)
+ if get_subrace_name() == "Green" then
+ local obj = create_object(TV_BOOK, 255);
+ obj.pval = find_spell("Noxious Cloud")
+ obj.ident = bor(obj.ident, IDENT_MENTAL, IDENT_KNOWN)
+ inven_carry(obj, FALSE)
+ end_object(obj)
+ end
+
+ -- Start the Blue (Earth) dragons with a book of Stone Skin (Theme)
+ if get_subrace_name() == "Blue" then
+ local obj = create_object(TV_BOOK, 255);
+ obj.pval = find_spell("Stone Skin")
+ obj.ident = bor(obj.ident, IDENT_MENTAL, IDENT_KNOWN)
+ inven_carry(obj, FALSE)
+ end_object(obj)
+ end
+
+ -- Start the White dragons with a book of Sense Monsters (Theme)
+ if get_subrace_name() == "White" then
+ local obj = create_object(TV_BOOK, 255);
+ obj.pval = find_spell("Sense Monsters")
+ obj.ident = bor(obj.ident, IDENT_MENTAL, IDENT_KNOWN)
+ inven_carry(obj, FALSE)
+ end_object(obj)
+ end
+
+ -- Start the Ethereal dragons with a book of Recharge (Theme)
+ if get_subrace_name() == "Ethereal" then
+ local obj = create_object(TV_BOOK, 255);
+ obj.pval = find_spell("Recharge")
+ obj.ident = bor(obj.ident, IDENT_MENTAL, IDENT_KNOWN)
+ inven_carry(obj, FALSE)
+ end_object(obj)
+ end
+
+ -- Start the Aewroeg with a book of Charm (Theme)
+ if get_subrace_name() == "(Aewrog)" then
+ local obj = create_object(TV_BOOK, 255);
+ obj.pval = find_spell("Charm")
+ obj.ident = bor(obj.ident, IDENT_MENTAL, IDENT_KNOWN)
+ inven_carry(obj, FALSE)
+ end_object(obj)
+ end
+
+ -- Start the Narroeg with a book of blink (Theme)
+ if get_subrace_name() == "(Narrog)" then
+ local obj = create_object(TV_BOOK, 255);
+ obj.pval = find_spell("Phase Door")
+ obj.ident = bor(obj.ident, IDENT_MENTAL, IDENT_KNOWN)
+ inven_carry(obj, FALSE)
+ end_object(obj)
+ end
+
+ -- Start the Peace-mages with a book of blink (Theme)
+ if get_class_name() == "Peace-mage" then
+ local obj = create_object(TV_BOOK, 255);
+ obj.pval = find_spell("Phase Door")
+ obj.ident = bor(obj.ident, IDENT_MENTAL, IDENT_KNOWN)
+ inven_carry(obj, FALSE)
+ end_object(obj)
+ end
+
+ -- Start the Wainriders with a book of Curse (Theme)
+ if get_class_name() == "Wainrider" then
+ local obj = create_object(TV_BOOK, 255);
+ obj.pval = find_spell("Curse")
+ obj.ident = bor(obj.ident, IDENT_MENTAL, IDENT_KNOWN)
+ inven_carry(obj, FALSE)
+ end_object(obj)
+ end
+
+ -- Provide everyone with a scroll of WoR (Theme)
+ local obj = create_object(TV_SCROLL, SV_SCROLL_WORD_OF_RECALL);
+ inven_carry(obj, FALSE)
+ end_object(obj)
+ identify_pack_fully()
+end
+
+-- Register in the hook list
+add_hook_script(HOOK_BIRTH_OBJECTS, "__birth_hook_objects", "__birth_hook_objects")
diff --git a/lib/mods/theme/scpt/powers.lua b/lib/mods/theme/scpt/powers.lua
new file mode 100644
index 00000000..ff4c62c5
--- /dev/null
+++ b/lib/mods/theme/scpt/powers.lua
@@ -0,0 +1,61 @@
+-- Various 'U' powers
+
+-- Invisibility power, for the mouse mimic shape
+POWER_INVISIBILITY = add_power
+{
+ ["name"] = "invisibility",
+ ["desc"] = "You are able melt into the shadows to become invisible.",
+ ["desc_get"] = "You suddenly become able to melt into the shadows.",
+ ["desc_lose"] = "You lose your shadow-melting ability.",
+ ["level"] = 30,
+ ["cost"] = 10,
+ ["stat"] = A_DEX,
+ ["fail"] = 20,
+ ["power"] = function()
+ set_invis(20 + randint(30), 30)
+ end,
+}
+
+-- Web power, for the spider mimic shape
+POWER_WEB = add_power
+{
+ ["name"] = "web",
+ ["desc"] = "You are able throw a thick and very resistant spider web.",
+ ["desc_get"] = "You suddenly become able to weave webs.",
+ ["desc_lose"] = "You lose your web-weaving capability.",
+ ["level"] = 25,
+ ["cost"] = 30,
+ ["stat"] = A_DEX,
+ ["fail"] = 20,
+ ["power"] = function()
+ -- Warning, beware of f_info changes .. I hate to do that ..
+ grow_things(16, 1 + (player.lev / 10))
+ end,
+}
+
+-- Activating/stopping space-continuum
+-- When stopped it will induce constant mana loss
+player.corrupt_anti_teleport_stopped = FALSE
+add_loadsave("player.corrupt_anti_teleport_stopped", FALSE)
+POWER_COR_SPACE_TIME = add_power
+{
+ ["name"] = "control space/time continuum",
+ ["desc"] = "You are able to control the space/time continuum.",
+ ["desc_get"] = "You become able to control the space/time continuum.",
+ ["desc_lose"] = "You are no more able to control the space/time continuum.",
+ ["level"] = 1,
+ ["cost"] = 10,
+ ["stat"] = A_WIS,
+ ["fail"] = 10,
+ ["power"] = function()
+ if player.corrupt_anti_teleport_stopped == TRUE then
+ player.corrupt_anti_teleport_stopped = FALSE
+ msg_print("You stop controlling your corruption.")
+ player.update = bor(player.update, PU_BONUS)
+ else
+ player.corrupt_anti_teleport_stopped = TRUE
+ msg_print("You start controlling your corruption, teleportation works once more.")
+ player.update = bor(player.update, PU_BONUS)
+ end
+ end,
+}
diff --git a/lib/mods/theme/scpt/s_air.lua b/lib/mods/theme/scpt/s_air.lua
new file mode 100644
index 00000000..afd1f584
--- /dev/null
+++ b/lib/mods/theme/scpt/s_air.lua
@@ -0,0 +1,193 @@
+-- handle the air school
+
+NOXIOUSCLOUD = add_spell
+{
+ ["name"] = "Noxious Cloud",
+ ["school"] = {SCHOOL_AIR},
+ ["level"] = 3,
+ ["mana"] = 3,
+ ["mana_max"] = 30,
+ ["fail"] = 20,
+ ["stick"] =
+ {
+ ["charge"] = { 5, 7 },
+ [TV_WAND] =
+ {
+ ["rarity"] = 15,
+ ["base_level"] = { 1, 15 },
+ ["max_level"] = { 25, 50 },
+ },
+ },
+ ["spell"] = function()
+ local ret, dir, type
+
+ ret, dir = get_aim_dir()
+ if ret == FALSE then return end
+ if get_level(NOXIOUSCLOUD, 50) >= 30 then type = GF_UNBREATH
+ else type = GF_POIS end
+ fire_cloud(type, dir, 7 + get_level(NOXIOUSCLOUD, 150), 3, 5 + get_level(NOXIOUSCLOUD, 40))
+ return TRUE
+ end,
+ ["info"] = function()
+ return "dam "..(7 + get_level(NOXIOUSCLOUD, 150)).." rad 3 dur "..(5 + get_level(NOXIOUSCLOUD, 40))
+ end,
+ ["desc"] = {
+ "Creates a cloud of poison",
+ "The cloud will persist for some turns, damaging all monsters passing by",
+ "At spell level 30 it turns into a thick gas attacking all living beings"
+ }
+}
+
+AIRWINGS = add_spell
+{
+ ["name"] = "Wings of Winds",
+ ["school"] = {SCHOOL_AIR, SCHOOL_CONVEYANCE},
+ ["level"] = 22,
+ ["mana"] = 30,
+ ["mana_max"] = 40,
+ ["fail"] = 60,
+ ["stick"] =
+ {
+ ["charge"] = { 7, 5 },
+ [TV_STAFF] =
+ {
+ ["rarity"] = 27,
+ ["base_level"] = { 1, 10 },
+ ["max_level"] = { 20, 50 },
+ },
+ },
+ ["inertia"] = { 1, 10 },
+ ["spell"] = function()
+ if get_level(AIRWINGS, 50) >= 16 then
+ if player.tim_fly == 0 then return set_tim_fly(randint(10) + 5 + get_level(AIRWINGS, 25)) end
+ else
+ if player.tim_ffall == 0 then return set_tim_ffall(randint(10) + 5 + get_level(AIRWINGS, 25)) end
+ end
+ return FALSE
+ end,
+ ["info"] = function()
+ return "dur "..(5 + get_level(AIRWINGS, 25)).."+d10"
+ end,
+ ["desc"] = {
+ "Grants the power of levitation",
+ "At level 16 it grants the power of controlled flight"
+ }
+}
+
+INVISIBILITY = add_spell
+{
+ ["name"] = "Invisibility",
+ ["school"] = {SCHOOL_AIR},
+ ["level"] = 16,
+ ["mana"] = 10,
+ ["mana_max"] = 20,
+ ["fail"] = 50,
+ ["inertia"] = { 1, 30 },
+ ["spell"] = function()
+ if player.tim_invisible == 0 then return set_invis(randint(20) + 15 + get_level(INVISIBILITY, 50), 20 + get_level(INVISIBILITY, 50)) end
+ end,
+ ["info"] = function()
+ return "dur "..(15 + get_level(INVISIBILITY, 50)).."+d20 power "..(20 + get_level(INVISIBILITY, 50))
+ end,
+ ["desc"] = {
+ "Grants invisibility"
+ }
+}
+
+POISONBLOOD = add_spell
+{
+ ["name"] = "Poison Blood",
+ ["school"] = {SCHOOL_AIR},
+ ["level"] = 12,
+ ["mana"] = 10,
+ ["mana_max"] = 20,
+ ["fail"] = 30,
+ ["stick"] =
+ {
+ ["charge"] = { 10, 15 },
+ [TV_WAND] =
+ {
+ ["rarity"] = 45,
+ ["base_level"] = { 1, 25 },
+ ["max_level"] = { 35, 50 },
+ },
+ },
+ ["inertia"] = { 1, 35 },
+ ["spell"] = function()
+ local obvious = nil
+ if player.oppose_pois == 0 then obvious = set_oppose_pois(randint(30) + 25 + get_level(POISONBLOOD, 25)) end
+ if (player.tim_poison == 0) and (get_level(POISONBLOOD, 50) >= 15) then obvious = is_obvious(set_poison(randint(30) + 25 + get_level(POISONBLOOD, 25)), obvious) end
+ return obvious
+ end,
+ ["info"] = function()
+ return "dur "..(25 + get_level(POISONBLOOD, 25)).."+d30"
+ end,
+ ["desc"] = {
+ "Grants resist poison",
+ "At level 15 it provides poison branding to wielded weapon"
+ }
+}
+
+THUNDERSTORM = add_spell
+{
+ ["name"] = "Thunderstorm",
+ ["school"] = {SCHOOL_AIR, SCHOOL_NATURE},
+ ["level"] = 25,
+ ["mana"] = 40,
+ ["mana_max"] = 60,
+ ["fail"] = 60,
+ ["stick"] =
+ {
+ ["charge"] = { 5, 5 },
+ [TV_WAND] =
+ {
+ ["rarity"] = 85,
+ ["base_level"] = { 1, 5 },
+ ["max_level"] = { 25, 50 },
+ },
+ },
+ ["inertia"] = { 2, 15 },
+ ["spell"] = function()
+ if player.tim_thunder == 0 then return set_tim_thunder(randint(10) + 10 + get_level(THUNDERSTORM, 25), 5 + get_level(THUNDERSTORM, 10), 10 + get_level(THUNDERSTORM, 25)) end
+ return FALSE
+ end,
+ ["info"] = function()
+ return "dam "..(5 + get_level(THUNDERSTORM, 10)).."d"..(10 + get_level(THUNDERSTORM, 25)).." dur "..(10 + get_level(THUNDERSTORM, 25)).."+d10"
+ end,
+ ["desc"] = {
+ "Charges up the air around you with electricity",
+ "Each turn it will throw a thunder bolt at a random monster in sight",
+ "The thunder does 3 types of damage, one third of lightning",
+ "one third of sound and one third of light"
+ }
+}
+
+STERILIZE = add_spell
+{
+ ["name"] = "Sterilize",
+ ["school"] = {SCHOOL_AIR},
+ ["level"] = 20,
+ ["mana"] = 10,
+ ["mana_max"] = 100,
+ ["fail"] = 50,
+ ["stick"] =
+ {
+ ["charge"] = { 7, 5 },
+ [TV_STAFF] =
+ {
+ ["rarity"] = 20,
+ ["base_level"] = { 1, 10 },
+ ["max_level"] = { 20, 50 },
+ },
+ },
+ ["spell"] = function()
+ set_no_breeders((30) + 20 + get_level(STERILIZE, 70))
+ return TRUE
+ end,
+ ["info"] = function()
+ return "dur "..(20 + get_level(STERILIZE, 70)).."+d30"
+ end,
+ ["desc"] = {
+ "Prevents explosive breeding for a while."
+ }
+}
diff --git a/lib/mods/theme/scpt/s_aule.lua b/lib/mods/theme/scpt/s_aule.lua
new file mode 100644
index 00000000..d3ca4733
--- /dev/null
+++ b/lib/mods/theme/scpt/s_aule.lua
@@ -0,0 +1,222 @@
+-- Spells for Aule school
+
+BOOK_AULE = 63
+
+AULE_FIREBRAND = add_spell
+{
+ ["name"] = "Firebrand",
+ ["school"] = {SCHOOL_AULE},
+ ["level"] = 1,
+ ["mana"] = 10,
+ ["mana_max"] = 100,
+ ["fail"] = 20,
+ ["piety"] = TRUE,
+ ["stat"] = A_WIS,
+ ["random"] = SKILL_SPIRITUALITY,
+ ["spell"] = function()
+ local type, rad
+ local level = get_level(AULE_FIREBRAND)
+ type = GF_FIRE
+
+ if (get_level(AULE_FIREBRAND) > 30) then
+ type = GF_HOLY_FIRE
+ end
+
+ rad = 0
+ if (level >= 15) then
+ rad = 1
+ end
+ return set_project(level + randint(20),
+ type, 4 + level, rad,
+ bor(PROJECT_STOP, PROJECT_KILL))
+ end,
+ ["info"] = function()
+ local level = get_level(AULE_FIREBRAND)
+ return "dur "..(level).."+d20 dam "..(4 + level).."/blow"
+ end,
+ ["desc"] = {
+ "Imbues your melee weapon with fire to deal more damage",
+ "At level 15 it spreads over a 1 radius zone around your target",
+ "At level 30 it deals holy fire damage"
+ }
+}
+
+AULE_ENCHANT_WEAPON = add_spell
+{
+ ["name"] = "Enchant Weapon",
+ ["school"] = {SCHOOL_AULE},
+ ["level"] = 10,
+ ["mana"] = 100,
+ ["mana_max"] = 200,
+ ["fail"] = 20,
+ ["piety"] = TRUE,
+ ["stat"] = A_WIS,
+ ["random"] = SKILL_SPIRITUALITY,
+ ["spell"] = function()
+ local level = get_level(AULE_ENCHANT_WEAPON)
+ local num_h, num_d, num_p
+
+ local ret, item, obj
+
+ num_h = 1 + randint(level/12)
+ num_d = 0
+ num_p = 0
+ if (level >= 5) then
+ num_d = 1 + randint(level/12)
+ end
+ if (level >= 45) then
+ num_p = 1
+ end
+ --return enchant_spell(num_h, num_d, 0, num_p)
+
+ ret, item = get_item("Which object do you want to enchant?",
+ "You have no objects to enchant.",
+ bor(USE_INVEN),
+ function (obj)
+ if obj.name1 > 0 then return FALSE end
+ if (obj.tval == TV_MSTAFF) then
+ return TRUE
+ elseif (obj.tval == TV_BOW) then
+ return TRUE
+ elseif (obj.tval == TV_HAFTED) then
+ return TRUE
+ elseif (obj.tval == TV_POLEARM) then
+ return TRUE
+ elseif (obj.tval == TV_SWORD) then
+ return TRUE
+ elseif (obj.tval == TV_AXE) then
+ return TRUE
+ end
+ return FALSE
+ end
+ )
+ if ret == FALSE then return FALSE end
+
+ obj = get_object(item)
+
+ obj.to_h = obj.to_h + num_h
+ obj.to_d = obj.to_d + num_h
+ obj.pval = obj.pval + num_p
+
+ return TRUE
+
+ end,
+ ["info"] = function()
+ return "tries "..(1 + get_level(AULE_ENCHANT_WEAPON)/12)
+ end,
+ ["desc"] = {
+ "Tries to enchant a weapon to-hit",
+ "At level 5 it also enchants to-dam",
+ "At level 45 it enhances the special powers of magical weapons",
+ "The might of the enchantment increases with the level"
+ }
+}
+
+AULE_ENCHANT_ARMOUR = add_spell {
+ ["name"] = "Enchant Armour",
+ ["school"] = {SCHOOL_AULE},
+ ["level"] = 15,
+ ["mana"] = 100,
+ ["mana_max"] = 200,
+ ["fail"] = 20,
+ ["piety"] = TRUE,
+ ["stat"] = A_WIS,
+ ["random"] = SKILL_SPIRITUALITY,
+ ["spell"] = function()
+ local level = get_level(AULE_ENCHANT_ARMOUR)
+ local num_h, num_d, num_a, num_p
+ local ret, item, obj
+
+ num_a = 1 + randint(level/10)
+ num_h = 0
+ num_d = 0
+ num_p = 0
+ if (level >= 20) then
+ num_h = 1
+ num_d = 1
+ end
+ if (level >= 40) then
+ num_p = 1
+ end
+ --return enchant_spell(num_h, num_d, num_a, num_p)
+
+ ret, item = get_item("Which object do you want to enchant?",
+ "You have no objects to enchant.",
+ bor(USE_INVEN),
+ function (obj)
+ if obj.name1 > 0 then return FALSE end
+ if (obj.tval == TV_BOOTS) then
+ return TRUE
+ elseif (obj.tval == TV_GLOVES) then
+ return TRUE
+ elseif (obj.tval == TV_HELM) then
+ return TRUE
+ elseif (obj.tval == TV_CROWN) then
+ return TRUE
+ elseif (obj.tval == TV_SHIELD) then
+ return TRUE
+ elseif (obj.tval == TV_CLOAK) then
+ return TRUE
+ elseif (obj.tval == TV_SOFT_ARMOR) then
+ return TRUE
+ elseif (obj.tval == TV_HARD_ARMOR) then
+ return TRUE
+ elseif (obj.tval == TV_DRAG_ARMOR) then
+ return TRUE
+ end
+ return FALSE
+ end
+ )
+ if ret == FALSE then return FALSE end
+
+ obj = get_object(item)
+
+ obj.to_h = obj.to_h + num_h
+ obj.to_d = obj.to_d + num_h
+ obj.pval = obj.pval + num_p
+ obj.to_a = obj.to_a + num_h
+
+ return TRUE
+
+ end,
+ ["info"] = function()
+ return "tries "..(1 + get_level(AULE_ENCHANT_ARMOUR)/10)
+ end,
+ ["desc"] = {
+ "Tries to enchant a piece of armour",
+ "At level 20 it also enchants to-hit and to-dam",
+ "At level 40 it enhances the special powers of magical armour",
+ "The might of the enchantment increases with the level"
+ }
+}
+
+AULE_CHILD = add_spell
+{
+ ["name"] = "Child of Aule",
+ ["school"] = {SCHOOL_AULE},
+ ["level"] = 20,
+ ["mana"] = 200,
+ ["mana_max"] = 500,
+ ["fail"] = 40,
+ ["piety"] = TRUE,
+ ["stat"] = A_WIS,
+ ["random"] = SKILL_SPIRITUALITY,
+ ["spell"] = function()
+ local y, x, m_idx
+
+ y, x = find_position(player.py, player.px)
+ m_idx = place_monster_one(y, x, test_monster_name("Dwarven warrior"), 0, FALSE, MSTATUS_FRIEND)
+
+ if m_idx ~= 0 then
+ monster_set_level(m_idx, 20 + get_level(AULE_CHILD, 70, 0))
+ return TRUE
+ end
+ end,
+ ["info"] = function()
+ return "level "..(20 + get_level(AULE_CHILD, 70))
+ end,
+ ["desc"] = {
+ "Summons a levelled Dwarven warrior to help you battle the forces",
+ "of Morgoth"
+ }
+} \ No newline at end of file
diff --git a/lib/mods/theme/scpt/s_convey.lua b/lib/mods/theme/scpt/s_convey.lua
new file mode 100644
index 00000000..1105a850
--- /dev/null
+++ b/lib/mods/theme/scpt/s_convey.lua
@@ -0,0 +1,226 @@
+-- handle the conveyance school
+
+BLINK = add_spell
+{
+ ["name"] = "Phase Door",
+ ["school"] = {SCHOOL_CONVEYANCE},
+ ["level"] = 1,
+ ["mana"] = 1,
+ ["mana_max"] = 3,
+ ["fail"] = 10,
+ ["inertia"] = { 1, 5 },
+ ["spell"] = function()
+ if get_level(BLINK, 50) >= 30 then
+ local oy, ox = player.py, player.px
+
+ teleport_player(10 + get_level(BLINK, 8))
+ create_between_gate(0, oy, ox)
+ return TRUE
+ else
+ teleport_player(10 + get_level(BLINK, 8))
+ return TRUE
+ end
+ end,
+ ["info"] = function()
+ return "distance "..(10 + get_level(BLINK, 8))
+ end,
+ ["desc"] = {
+ "Teleports you on a small scale range",
+ "At level 30 it creates void jumpgates",
+ }
+}
+
+DISARM = add_spell
+{
+ ["name"] = "Disarm",
+ ["school"] = {SCHOOL_CONVEYANCE},
+ ["level"] = 3,
+ ["mana"] = 2,
+ ["mana_max"] = 4,
+ ["fail"] = 15,
+ ["stick"] =
+ {
+ ["charge"] = { 10, 15 },
+ [TV_STAFF] =
+ {
+ ["rarity"] = 4,
+ ["base_level"] = { 1, 10 },
+ ["max_level"] = { 10, 50 },
+ },
+ },
+ ["spell"] = function()
+ local obvious
+ obvious = destroy_doors_touch()
+ if get_level(DISARM, 50) >= 10 then obvious = is_obvious(destroy_traps_touch(), obvious) end
+ return obvious
+ end,
+ ["info"] = function()
+ return ""
+ end,
+ ["desc"] = {
+ "Destroys doors and disarms traps",
+ "At level 10 it unlocks doors and disarms traps",
+ }
+}
+
+TELEPORT = add_spell
+{
+ ["name"] = "Teleportation",
+ ["school"] = {SCHOOL_CONVEYANCE},
+ ["level"] = 10,
+ ["mana"] = 8,
+ ["mana_max"] = 14,
+ ["fail"] = 30,
+ ["stick"] =
+ {
+ ["charge"] = { 7, 7 },
+ [TV_STAFF] =
+ {
+ ["rarity"] = 50,
+ ["base_level"] = { 1, 20 },
+ ["max_level"] = { 20, 50 },
+ },
+ },
+ ["inertia"] = { 1, 10 },
+ ["spell"] = function()
+ player.energy = player.energy - (25 - get_level(TELEPORT, 50))
+ teleport_player(100 + get_level(TELEPORT, 100))
+ return TRUE
+ end,
+ ["info"] = function()
+ return "distance "..(100 + get_level(TELEPORT, 100))
+ end,
+ ["desc"] = {
+ "Teleports you around the level. The casting time decreases with level",
+ }
+}
+
+TELEAWAY = add_spell
+{
+ ["name"] = "Teleport Away",
+ ["school"] = {SCHOOL_CONVEYANCE},
+ ["level"] = 23,
+ ["mana"] = 15,
+ ["mana_max"] = 40,
+ ["fail"] = 60,
+ ["stick"] =
+ {
+ ["charge"] = { 3, 5 },
+ [TV_WAND] =
+ {
+ ["rarity"] = 75,
+ ["base_level"] = { 1, 20 },
+ ["max_level"] = { 20, 50 },
+ },
+ },
+ ["spell"] = function()
+ local ret, dir
+
+ if get_level(TELEAWAY, 50) >= 20 then
+ return project_los(GF_AWAY_ALL, 100)
+ elseif get_level(TELEAWAY, 50) >= 10 then
+ ret, dir = get_aim_dir()
+ if ret == FALSE then return end
+ return fire_ball(GF_AWAY_ALL, dir, 100, 3 + get_level(TELEAWAY, 4))
+ else
+ ret, dir = get_aim_dir()
+ if ret == FALSE then return end
+ return teleport_monster(dir)
+ end
+ end,
+ ["info"] = function()
+ return ""
+ end,
+ ["desc"] = {
+ "Teleports a line of monsters away",
+ "At level 10 it turns into a ball",
+ "At level 20 it teleports all monsters in sight"
+ }
+}
+
+RECALL = add_spell
+{
+ ["name"] = "Recall",
+ ["school"] = {SCHOOL_CONVEYANCE},
+ ["level"] = 30,
+ ["mana"] = 25,
+ ["mana_max"] = 25,
+ ["fail"] = 60,
+ ["spell"] = function()
+ local ret, x, y, c_ptr
+ ret, x, y = tgt_pt()
+ if ret == FALSE then return end
+ c_ptr = cave(y, x)
+ if (y == player.py) and (x == player.px) then
+ local d = 21 - get_level(RECALL, 15)
+ if d < 0 then
+ d = 0
+ end
+ local f = 15 - get_level(RECALL, 10)
+ if f < 1 then
+ f = 1
+ end
+ recall_player(d, f)
+ return TRUE
+ elseif c_ptr.m_idx > 0 then
+ swap_position(y, x)
+ return TRUE
+ elseif c_ptr.o_idx > 0 then
+ set_target(y, x)
+ if get_level(RECALL, 50) >= 15 then
+ fetch(5, 10 + get_level(RECALL, 150), FALSE)
+ else
+ fetch(5, 10 + get_level(RECALL, 150), TRUE)
+ end
+ return TRUE
+ end
+ end,
+ ["info"] = function()
+ local d = 21 - get_level(RECALL, 15)
+ if d < 0 then
+ d = 0
+ end
+ local f = 15 - get_level(RECALL, 10)
+ if f < 1 then
+ f = 1
+ end
+ return "dur "..f.."+d"..d.." weight "..(1 + get_level(RECALL, 15)).."lb"
+ end,
+ ["desc"] = {
+ "Cast on yourself it will recall you to the surface/dungeon.",
+ "Cast at a monster you will swap positions with the monster.",
+ "Cast at an object it will fetch the object to you."
+ }
+}
+
+PROBABILITY_TRAVEL = add_spell
+{
+ ["name"] = "Probability Travel",
+ ["school"] = {SCHOOL_CONVEYANCE},
+ ["level"] = 35,
+ ["mana"] = 30,
+ ["mana_max"] = 50,
+ ["fail"] = 90,
+ ["stick"] =
+ {
+ ["charge"] = { 1, 2 },
+ [TV_STAFF] =
+ {
+ ["rarity"] = 97,
+ ["base_level"] = { 1, 5 },
+ ["max_level"] = { 8, 25 },
+ },
+ },
+ ["inertia"] = { 6, 40 },
+ ["spell"] = function()
+ return set_prob_travel(randint(20) + get_level(PROBABILITY_TRAVEL, 60))
+ end,
+ ["info"] = function()
+ return "dur "..get_level(PROBABILITY_TRAVEL, 60).."+d20"
+ end,
+ ["desc"] = {
+ "Renders you immaterial, when you hit a wall you travel through it and",
+ "instantly appear on the other side of it. You can also float up and down",
+ "at will"
+ }
+}
diff --git a/lib/mods/theme/scpt/s_demon.lua b/lib/mods/theme/scpt/s_demon.lua
new file mode 100644
index 00000000..ada97310
--- /dev/null
+++ b/lib/mods/theme/scpt/s_demon.lua
@@ -0,0 +1,337 @@
+-- handle the demonology school
+
+-- Demonblade
+DEMON_BLADE = add_spell
+{
+ ["name"] = "Demon Blade",
+ ["school"] = {SCHOOL_DEMON},
+ ["level"] = 1,
+ ["mana"] = 4,
+ ["mana_max"] = 44,
+ ["fail"] = 10,
+ ["random"] = 0,
+ ["stick"] =
+ {
+ ["charge"] = { 3, 7 },
+ [TV_WAND] =
+ {
+ ["rarity"] = 75,
+ ["base_level"] = { 1, 17 },
+ ["max_level"] = { 20, 40 },
+ },
+ },
+ ["spell"] = function()
+ local type, rad
+
+ type = GF_FIRE
+ if get_level(DEMON_BLADE) >= 30 then type = GF_HELL_FIRE end
+
+ rad = 0
+ if get_level(DEMON_BLADE) >= 45 then rad = 1 end
+
+ return set_project(randint(20) + get_level(DEMON_BLADE, 80),
+ type,
+ 4 + get_level(DEMON_BLADE, 40),
+ rad,
+ bor(PROJECT_STOP, PROJECT_KILL))
+ end,
+ ["info"] = function()
+ return "dur "..(get_level(DEMON_BLADE, 80)).."+d20 dam "..(4 + get_level(DEMON_BLADE, 40)).."/blow"
+ end,
+ ["desc"] = {
+ "Imbues your blade with fire to deal more damage",
+ "At level 30 it deals hellfire damage",
+ "At level 45 it spreads over a 1 radius zone around your target",
+ }
+}
+
+DEMON_MADNESS = add_spell
+{
+ ["name"] = "Demon Madness",
+ ["school"] = {SCHOOL_DEMON},
+ ["level"] = 10,
+ ["mana"] = 5,
+ ["mana_max"] = 20,
+ ["fail"] = 25,
+ ["random"] = 0,
+ ["spell"] = function()
+ local ret, dir, type, y1, x1, y2, x2
+
+ ret, dir = get_aim_dir()
+ if ret == FALSE then return end
+
+ type = GF_CHAOS
+ if magik(33) == TRUE then type = GF_CONFUSION end
+ if magik(33) == TRUE then type = GF_CHARM end
+
+ -- Calc the coordinates of arrival
+ y1, x1 = get_target(dir)
+ y2 = player.py - (y1 - player.py)
+ x2 = player.px - (x1 - player.px)
+
+ local obvious = nil
+ obvious = project(0, 1 + get_level(DEMON_MADNESS, 4, 0),
+ y1, x1,
+ 20 + get_level(DEMON_MADNESS, 200),
+ type, bor(PROJECT_STOP, PROJECT_GRID, PROJECT_ITEM, PROJECT_KILL))
+ obvious = is_obvious(project(0, 1 + get_level(DEMON_MADNESS, 4, 0),
+ y2, x2,
+ 20 + get_level(DEMON_MADNESS, 200),
+ type, bor(PROJECT_STOP, PROJECT_GRID, PROJECT_ITEM, PROJECT_KILL)), obvious)
+ return obvious
+ end,
+ ["info"] = function()
+ return "dam "..(20 + get_level(DEMON_MADNESS, 200)).." rad "..(1 + get_level(DEMON_MADNESS, 4, 0))
+ end,
+ ["desc"] = {
+ "Fire 2 balls in opposite directions of randomly chaos, confusion or charm",
+ }
+}
+
+DEMON_FIELD = add_spell
+{
+ ["name"] = "Demon Field",
+ ["school"] = {SCHOOL_DEMON},
+ ["level"] = 20,
+ ["mana"] = 20,
+ ["mana_max"] = 60,
+ ["fail"] = 60,
+ ["random"] = 0,
+ ["spell"] = function()
+ local ret, dir
+
+ ret, dir = get_aim_dir()
+ if ret == FALSE then return end
+ return fire_cloud(GF_NEXUS, dir, 20 + get_level(DEMON_FIELD, 70), 7, 30 + get_level(DEMON_FIELD, 100))
+ end,
+ ["info"] = function()
+ return "dam "..(20 + get_level(DEMON_FIELD, 70)).." dur "..(30 + get_level(DEMON_FIELD, 100))
+ end,
+ ["desc"] = {
+ "Fires a cloud of deadly nexus over a radius of 7",
+ }
+}
+
+-- Demonshield
+
+DOOM_SHIELD = add_spell
+{
+ ["name"] = "Doom Shield",
+ ["school"] = {SCHOOL_DEMON},
+ ["level"] = 1,
+ ["mana"] = 2,
+ ["mana_max"] = 30,
+ ["fail"] = 10,
+ ["random"] = 0,
+ ["spell"] = function()
+ return set_shield(randint(10) + 20 + get_level(DOOM_SHIELD, 100), -300 + get_level(DOOM_SHIELD, 100), SHIELD_COUNTER, 1 + get_level(DOOM_SHIELD, 14), 10 + get_level(DOOM_SHIELD, 15))
+ end,
+ ["info"] = function()
+ return "dur "..(20 + get_level(DOOM_SHIELD, 100)).."+d10 dam "..(1 + get_level(DOOM_SHIELD, 14)).."d"..(10 + get_level(DOOM_SHIELD, 15))
+ end,
+ ["desc"] = {
+ "Raises a mirror of pain around you, doing very high damage to your foes",
+ "that dare hit you, but greatly reduces your armour class",
+ }
+}
+
+UNHOLY_WORD = add_spell
+{
+ ["name"] = "Unholy Word",
+ ["school"] = {SCHOOL_DEMON},
+ ["level"] = 25,
+ ["mana"] = 15,
+ ["mana_max"] = 45,
+ ["fail"] = 55,
+ ["random"] = 0,
+ ["spell"] = function()
+ local ret, x, y, c_ptr
+ ret, x, y = tgt_pt()
+ if ret == FALSE then return end
+ c_ptr = cave(y, x)
+
+ -- ok that is a monster
+ if c_ptr.m_idx > 0 then
+ local m_ptr = monster(c_ptr.m_idx)
+ if m_ptr.status ~= MSTATUS_PET then
+ msg_print("You can only target a pet.")
+ return
+ end
+
+ -- Oups he is angry now
+ if magik(30 - get_level(UNHOLY_WORD, 25, 0)) == TRUE then
+ local m_name = monster_desc(m_ptr, 0).." turns against you."
+ msg_print(strupper(strsub(m_name, 0, 1))..strsub(m_name, 2))
+ else
+ local m_name = monster_desc(m_ptr, 0)
+ msg_print("You consume "..m_name..".")
+
+ local heal = (m_ptr.hp * 100) / m_ptr.maxhp
+ heal = ((30 + get_level(UNHOLY_WORD, 50, 0)) * heal) / 100
+
+ hp_player(heal)
+
+ delete_monster_idx(c_ptr.m_idx)
+ end
+ return TRUE
+ end
+ end,
+ ["info"] = function()
+ return "heal mhp% of "..(30 + get_level(UNHOLY_WORD, 50, 0)).."%"
+ end,
+ ["desc"] = {
+ "Kills a pet to heal you",
+ "There is a chance that the pet won't die but will turn against you",
+ "it will decrease with higher level",
+ }
+}
+
+DEMON_CLOAK = add_spell
+{
+ ["name"] = "Demon Cloak",
+ ["school"] = {SCHOOL_DEMON},
+ ["level"] = 20,
+ ["mana"] = 10,
+ ["mana_max"] = 40,
+ ["fail"] = 70,
+ ["random"] = 0,
+ ["spell"] = function()
+ return set_tim_reflect(randint(5) + 5 + get_level(DEMON_CLOAK, 15, 0))
+ end,
+ ["info"] = function()
+ return "dur "..(5 + get_level(DEMON_CLOAK, 15, 0)).."+d5"
+ end,
+ ["desc"] = {
+ "Raises a mirror that can reflect bolts and arrows for a time",
+ }
+}
+
+
+-- Demonhorn
+DEMON_SUMMON = add_spell
+{
+ ["name"] = "Summon Demon",
+ ["school"] = {SCHOOL_DEMON},
+ ["level"] = 5,
+ ["mana"] = 10,
+ ["mana_max"] = 50,
+ ["fail"] = 30,
+ ["random"] = 0,
+ ["spell"] = function()
+ local type = SUMMON_DEMON
+ local level = dun_level
+ local minlevel = 4
+ if level < minlevel then level=minlevel end
+ summon_specific_level = 5 + get_level(DEMON_SUMMON, 100)
+ if get_level(DEMON_SUMMON) >= 35 then type = SUMMON_HI_DEMON end
+ if summon_monster(player.py, player.px, level, TRUE, type) == TRUE then
+ return TRUE
+ else
+ msg_print("Something blocks your summoning!")
+ return FALSE
+ end
+ end,
+ ["info"] = function()
+ return "level "..(5 + get_level(DEMON_SUMMON, 100))
+ end,
+ ["desc"] = {
+ "Summons a leveled demon to your side",
+ "At level 35 it summons a high demon",
+ }
+}
+
+DISCHARGE_MINION = add_spell
+{
+ ["name"] = "Discharge Minion",
+ ["school"] = {SCHOOL_DEMON},
+ ["level"] = 10,
+ ["mana"] = 20,
+ ["mana_max"] = 50,
+ ["fail"] = 30,
+ ["random"] = 0,
+ ["spell"] = function()
+ local ret, x, y, c_ptr
+ ret, x, y = tgt_pt()
+ if ret == FALSE then return end
+ c_ptr = cave(y, x)
+
+ -- ok that is a monster
+ if c_ptr.m_idx > 0 then
+ local m_ptr = monster(c_ptr.m_idx)
+ if m_ptr.status ~= MSTATUS_PET then
+ msg_print("You can only target a pet.")
+ return
+ end
+
+ local dam = m_ptr.hp
+ delete_monster_idx(c_ptr.m_idx)
+ dam = (dam * (20 + get_level(DISCHARGE_MINION, 60, 0))) / 100
+ if dam > 100 + get_level(DISCHARGE_MINION, 500, 0) then
+ dam = 100 + get_level(DISCHARGE_MINION, 500, 0)
+ end
+
+ -- We use project instead of fire_ball because we must tell it exactly where to land
+ return project(0, 2,
+ y, x,
+ dam,
+ GF_GRAVITY, bor(PROJECT_STOP, PROJECT_GRID, PROJECT_ITEM, PROJECT_KILL))
+ end
+ end,
+ ["info"] = function()
+ return "dam "..(20 + get_level(DISCHARGE_MINION, 60, 0)).."% max "..(100 + get_level(DISCHARGE_MINION, 500, 0))
+ end,
+ ["desc"] = {
+ "The targeted pet will explode in a burst of gravity",
+ }
+}
+
+CONTROL_DEMON = add_spell
+{
+ ["name"] = "Control Demon",
+ ["school"] = {SCHOOL_DEMON},
+ ["level"] = 25,
+ ["mana"] = 30,
+ ["mana_max"] = 70,
+ ["fail"] = 55,
+ ["random"] = 0,
+ ["spell"] = function()
+ local ret, dir = get_aim_dir()
+ return fire_ball(GF_CONTROL_DEMON, dir, 50 + get_level(CONTROL_DEMON, 250), 0)
+ end,
+ ["info"] = function()
+ return "power "..(50 + get_level(CONTROL_DEMON, 250))
+ end,
+ ["desc"] = {
+ "Attempts to control a demon",
+ }
+}
+
+-- ok we need to have different wield slots
+add_hooks
+{
+ [HOOK_WIELD_SLOT] = function (obj, ideal)
+ if (obj.tval == TV_DAEMON_BOOK) then
+ local slot
+ if (obj.sval == SV_DEMONBLADE) then
+ if(ideal == TRUE) then
+ slot = INVEN_WIELD
+ else
+ slot = get_slot(INVEN_WIELD)
+ end
+ elseif (obj.sval == SV_DEMONSHIELD) then
+ if(ideal == TRUE) then
+ slot = INVEN_ARM
+ else
+ slot = get_slot(INVEN_ARM)
+ end
+ elseif (obj.sval == SV_DEMONHORN) then
+ if(ideal == TRUE) then
+ slot = INVEN_HEAD
+ else
+ slot = get_slot(INVEN_HEAD)
+ end
+ end
+ return TRUE, slot
+ end
+ end,
+}
diff --git a/lib/mods/theme/scpt/s_divin.lua b/lib/mods/theme/scpt/s_divin.lua
new file mode 100644
index 00000000..60b0275f
--- /dev/null
+++ b/lib/mods/theme/scpt/s_divin.lua
@@ -0,0 +1,230 @@
+-- Handles thhe divination school
+
+
+STARIDENTIFY = add_spell
+{
+ ["name"] = "Greater Identify",
+ ["school"] = {SCHOOL_DIVINATION},
+ ["level"] = 35,
+ ["mana"] = 30,
+ ["mana_max"] = 30,
+ ["fail"] = 80,
+ ["spell"] = function()
+ if get_check("Cast on yourself?") == TRUE then
+ self_knowledge()
+ else
+ identify_fully()
+ end
+ return TRUE
+ end,
+ ["info"] = function()
+ return ""
+ end,
+ ["desc"] = {
+ "Asks for an object and fully identify it, providing the full list of powers",
+ "Cast at yourself it will reveal your powers"
+ }
+}
+
+IDENTIFY = add_spell
+{
+ ["name"] = "Identify",
+ ["school"] = {SCHOOL_DIVINATION},
+ ["level"] = 8,
+ ["mana"] = 10,
+ ["mana_max"] = 50,
+ ["fail"] = 40,
+ ["stick"] =
+ {
+ ["charge"] = { 7, 10 },
+ [TV_STAFF] =
+ {
+ ["rarity"] = 45,
+ ["base_level"] = { 1, 15 },
+ ["max_level"] = { 15, 40 },
+ },
+ },
+ ["spell"] = function()
+ if get_level(IDENTIFY, 50) >= 27 then
+ local obvious
+ obvious = identify_pack()
+ obvious = is_obvious(fire_ball(GF_IDENTIFY, 0, 1, get_level(IDENTIFY, 3)), obvious)
+ if obvious == TRUE then
+ player.notice = bor(player.notice, PN_COMBINE, PN_REORDER)
+ end
+ return obvious
+ elseif get_level(IDENTIFY, 50) >= 17 then
+ local obvious
+ obvious = identify_pack()
+ obvious = is_obvious(fire_ball(GF_IDENTIFY, 0, 1, 0), obvious)
+ if obvious == TRUE then
+ player.notice = bor(player.notice, PN_COMBINE, PN_REORDER)
+ end
+ return obvious
+ else
+ if ident_spell() == TRUE then return TRUE else return end
+ end
+ end,
+ ["info"] = function()
+ if get_level(IDENTIFY, 50) >= 27 then
+ return "rad "..(get_level(IDENTIFY, 3))
+ else
+ return ""
+ end
+ end,
+ ["desc"] = {
+ "Asks for an object and identifies it",
+ "At level 17 it identifies all objects in the inventory",
+ "At level 27 it identifies all objects in the inventory and in a",
+ "radius on the floor, as well as probing monsters in that radius"
+ }
+}
+
+VISION = add_spell
+{
+ ["name"] = "Vision",
+ ["school"] = {SCHOOL_DIVINATION},
+ ["level"] = 15,
+ ["mana"] = 7,
+ ["mana_max"] = 55,
+ ["fail"] = 45,
+ ["stick"] =
+ {
+ ["charge"] = { 4, 6 },
+ [TV_STAFF] =
+ {
+ ["rarity"] = 60,
+ ["base_level"] = { 1, 5 },
+ ["max_level"] = { 10, 30 },
+ },
+ },
+ ["inertia"] = { 2, 200 },
+ ["spell"] = function()
+ if get_level(VISION, 50) >= 25 then
+ wiz_lite_extra()
+ else
+ map_area()
+ end
+ return TRUE
+ end,
+ ["info"] = function()
+ return ""
+ end,
+ ["desc"] = {
+ "Detects the layout of the surrounding area",
+ "At level 25 it maps and lights the whole level",
+ }
+}
+
+SENSEHIDDEN = add_spell
+{
+ ["name"] = "Sense Hidden",
+ ["school"] = {SCHOOL_DIVINATION},
+ ["level"] = 5,
+ ["mana"] = 2,
+ ["mana_max"] = 10,
+ ["fail"] = 25,
+ ["stick"] =
+ {
+ ["charge"] = { 1, 15 },
+ [TV_STAFF] =
+ {
+ ["rarity"] = 20,
+ ["base_level"] = { 1, 15 },
+ ["max_level"] = { 10, 50 },
+ },
+ },
+ ["inertia"] = { 1, 10 },
+ ["spell"] = function()
+ local obvious = nil
+ obvious = detect_traps(15 + get_level(SENSEHIDDEN, 40, 0))
+ if get_level(SENSEHIDDEN, 50) >= 15 then
+ obvious = is_obvious(set_tim_invis(10 + randint(20) + get_level(SENSEHIDDEN, 40)), obvious)
+ end
+ return obvious
+ end,
+ ["info"] = function()
+ if get_level(SENSEHIDDEN, 50) >= 15 then
+ return "rad "..(15 + get_level(SENSEHIDDEN, 40)).." dur "..(10 + get_level(SENSEHIDDEN, 40)).."+d20"
+ else
+ return "rad "..(15 + get_level(SENSEHIDDEN, 40))
+ end
+ end,
+ ["desc"] = {
+ "Detects the traps in a certain radius around you",
+ "At level 15 it allows you to sense invisible for a while"
+ }
+}
+
+REVEALWAYS = add_spell
+{
+ ["name"] = "Reveal Ways",
+ ["school"] = {SCHOOL_DIVINATION},
+ ["level"] = 9,
+ ["mana"] = 3,
+ ["mana_max"] = 15,
+ ["fail"] = 20,
+ ["stick"] =
+ {
+ ["charge"] = { 6, 6 },
+ [TV_STAFF] =
+ {
+ ["rarity"] = 35,
+ ["base_level"] = { 1, 15 },
+ ["max_level"] = { 25, 50 },
+ },
+ },
+ ["inertia"] = { 1, 10 },
+ ["spell"] = function()
+ local obvious
+ obvious = detect_doors(10 + get_level(REVEALWAYS, 40, 0))
+ obvious = is_obvious(detect_stairs(10 + get_level(REVEALWAYS, 40, 0)), obvious)
+ return obvious
+ end,
+ ["info"] = function()
+ return "rad "..(10 + get_level(REVEALWAYS, 40))
+ end,
+ ["desc"] = {
+ "Detects the doors/stairs/ways in a certain radius around you",
+ }
+}
+
+SENSEMONSTERS = add_spell
+{
+ ["name"] = "Sense Monsters",
+ ["school"] = {SCHOOL_DIVINATION},
+ ["level"] = 1,
+ ["mana"] = 1,
+ ["mana_max"] = 20,
+ ["fail"] = 10,
+ ["stick"] =
+ {
+ ["charge"] = { 5, 10 },
+ [TV_STAFF] =
+ {
+ ["rarity"] = 37,
+ ["base_level"] = { 1, 10 },
+ ["max_level"] = { 15, 40 },
+ },
+ },
+ ["inertia"] = { 1, 10 },
+ ["spell"] = function()
+ local obvious
+ obvious = detect_monsters_normal(10 + get_level(SENSEMONSTERS, 40, 0))
+ if get_level(SENSEMONSTERS, 50) >= 30 then
+ obvious = is_obvious(set_tim_esp(10 + randint(10) + get_level(SENSEMONSTERS, 20)), obvious)
+ end
+ return obvious
+ end,
+ ["info"] = function()
+ if get_level(SENSEMONSTERS, 50) >= 30 then
+ return "rad "..(10 + get_level(SENSEMONSTERS, 40)).." dur "..(10 + get_level(SENSEMONSTERS, 20)).."+d10"
+ else
+ return "rad "..(10 + get_level(SENSEMONSTERS, 40))
+ end
+ end,
+ ["desc"] = {
+ "Detects all monsters near you",
+ "At level 30 it allows you to sense monster minds for a while"
+ }
+}
diff --git a/lib/mods/theme/scpt/s_earth.lua b/lib/mods/theme/scpt/s_earth.lua
new file mode 100644
index 00000000..23aa001c
--- /dev/null
+++ b/lib/mods/theme/scpt/s_earth.lua
@@ -0,0 +1,184 @@
+-- The earth school
+
+STONESKIN = add_spell
+{
+ ["name"] = "Stone Skin",
+ ["school"] = SCHOOL_EARTH,
+ ["level"] = 1,
+ ["mana"] = 1,
+ ["mana_max"] = 50,
+ ["fail"] = 10,
+ ["inertia"] = { 2, 50 },
+ ["spell"] = function()
+ local type
+ if get_level(STONESKIN, 50) >= 25 then
+ type = SHIELD_COUNTER
+ else
+ type = 0
+ end
+ return set_shield(randint(10) + 10 + get_level(STONESKIN, 100), 10 + get_level(STONESKIN, 50), type, 2 + get_level(STONESKIN, 5), 3 + get_level(STONESKIN, 5))
+ end,
+ ["info"] = function()
+ if get_level(STONESKIN, 50) >= 25 then
+ return "dam "..(2 + get_level(STONESKIN, 5)).."d"..(3 + get_level(STONESKIN, 5)).." dur "..(10 + get_level(STONESKIN, 100)).."+d10 AC "..(10 + get_level(STONESKIN, 50))
+ else
+ return "dur "..(10 + get_level(STONESKIN, 100)).."+d10 AC "..(10 + get_level(STONESKIN, 50))
+ end
+ end,
+ ["desc"] = {
+ "Creates a shield of earth around you to protect you",
+ "At level 25 it starts dealing damage to attackers"
+ }
+}
+
+DIG = add_spell
+{
+ ["name"] = "Dig",
+ ["school"] = SCHOOL_EARTH,
+ ["level"] = 12,
+ ["mana"] = 14,
+ ["mana_max"] = 14,
+ ["fail"] = 20,
+ ["stick"] =
+ {
+ ["charge"] = { 15, 5 },
+ [TV_WAND] =
+ {
+ ["rarity"] = 25,
+ ["base_level"] = { 1, 1 },
+ ["max_level"] = { 1, 1 },
+ },
+ },
+ ["spell"] = function()
+ local ret, dir
+ ret, dir = get_aim_dir()
+ if ret == FALSE then return end
+ return wall_to_mud(dir)
+ end,
+ ["info"] = function()
+ return ""
+ end,
+ ["desc"] = {
+ "Digs a hole in a wall much faster than any shovels",
+ }
+}
+
+STONEPRISON = add_spell
+{
+ ["name"] = "Stone Prison",
+ ["school"] = SCHOOL_EARTH,
+ ["level"] = 25,
+ ["mana"] = 30,
+ ["mana_max"] = 50,
+ ["fail"] = 65,
+ ["stick"] =
+ {
+ ["charge"] = { 5, 3 },
+ [TV_WAND] =
+ {
+ ["rarity"] = 57,
+ ["base_level"] = { 1, 3 },
+ ["max_level"] = { 5, 20 },
+ },
+ },
+ ["spell"] = function()
+ local ret, x, y
+ if get_level(STONEPRISON, 50) >= 10 then
+ ret, x, y = tgt_pt()
+ else
+ y = player.py
+ x = player.px
+ end
+ wall_stone(y, x)
+ return TRUE
+ end,
+ ["info"] = function()
+ return ""
+ end,
+ ["desc"] = {
+ "Creates a prison of walls around you",
+ "At level 10 it allows you to target a monster"
+ }
+}
+
+STRIKE = add_spell
+{
+ ["name"] = "Strike",
+ ["school"] = {SCHOOL_EARTH},
+ ["level"] = 30,
+ ["mana"] = 30,
+ ["mana_max"] = 50,
+ ["fail"] = 60,
+ ["stick"] =
+ {
+ ["charge"] = { 2, 6 },
+ [TV_WAND] =
+ {
+ ["rarity"] = 635,
+ ["base_level"] = { 1, 5 },
+ ["max_level"] = { 10, 50 },
+ },
+ },
+ ["spell"] = function()
+ local ret, dir, rad
+ ret, dir = get_aim_dir()
+ if ret == FALSE then return end
+ if get_level(STRIKE, 50) >= 12 then
+ return fire_ball(GF_FORCE, dir, 50 + get_level(STRIKE, 50), 1)
+ else
+ return fire_ball(GF_FORCE, dir, 50 + get_level(STRIKE, 50), 0)
+ end
+ end,
+ ["info"] = function()
+ if get_level(STRIKE, 50) >= 12 then
+ return "dam "..(50 + get_level(STRIKE, 50)).." rad 1"
+ else
+ return "dam "..(50 + get_level(STRIKE, 50))
+ end
+ end,
+ ["desc"] = {
+ "Creates a micro-ball of force that will push monsters backwards",
+ "If the monster is caught near a wall, it'll be crushed against it",
+ "At level 12 it turns into a ball of radius 1"
+ }
+}
+
+SHAKE = add_spell
+{
+ ["name"] = "Shake",
+ ["school"] = {SCHOOL_EARTH},
+ ["level"] = 27,
+ ["mana"] = 25,
+ ["mana_max"] = 30,
+ ["fail"] = 60,
+ ["stick"] =
+ {
+ ["charge"] = { 5, 10 },
+ [TV_STAFF] =
+ {
+ ["rarity"] = 75,
+ ["base_level"] = { 1, 3 },
+ ["max_level"] = { 9, 20 },
+ },
+ },
+ ["inertia"] = { 2, 50 },
+ ["spell"] = function()
+ local ret, x, y
+ if get_level(SHAKE, 50) >= 10 then
+ ret, x, y = tgt_pt()
+ if ret == FALSE then return end
+ else
+ x = player.px
+ y = player.py
+ end
+ earthquake(y, x, 4 + get_level(SHAKE, 10));
+ return TRUE
+ end,
+ ["info"] = function()
+ return "rad "..(4 + get_level(SHAKE, 10))
+ end,
+ ["desc"] = {
+ "Creates a localised earthquake",
+ "At level 10 it can be targeted at any location"
+ }
+}
diff --git a/lib/mods/theme/scpt/s_eru.lua b/lib/mods/theme/scpt/s_eru.lua
new file mode 100644
index 00000000..c0cb0aaf
--- /dev/null
+++ b/lib/mods/theme/scpt/s_eru.lua
@@ -0,0 +1,130 @@
+-- Handle Eru Iluvatar magic school
+
+ERU_SEE = add_spell
+{
+ ["name"] = "See the Music",
+ ["school"] = {SCHOOL_ERU},
+ ["level"] = 1,
+ ["mana"] = 1,
+ ["mana_max"] = 50,
+ ["fail"] = 20,
+ -- Uses piety to cast
+ ["piety"] = TRUE,
+ ["stat"] = A_WIS,
+ -- Unnafected by blindness
+ ["blind"] = FALSE,
+ ["random"] = SKILL_SPIRITUALITY,
+ ["spell"] = function()
+ local obvious
+ obvious = set_tim_invis(randint(20) + 10 + get_level(ERU_SEE, 100))
+ if get_level(ERU_SEE) >= 30 then
+ wiz_lite_extra()
+ obvious = TRUE
+ elseif get_level(ERU_SEE) >= 10 then
+ map_area()
+ obvious = TRUE
+ end
+ if get_level(ERU_SEE) >= 20 then
+ obvious = is_obvious(set_blind(0), obvious)
+ end
+ return obvious
+ end,
+ ["info"] = function()
+ return "dur "..(10 + get_level(ERU_SEE, 100)).."+d20"
+ end,
+ ["desc"] = {
+ "Allows you to 'see' the Great Music from which the world",
+ "originates, allowing you to see unseen things",
+ "At level 10 it allows you to see your surroundings",
+ "At level 20 it allows you to cure blindness",
+ "At level 30 it allows you to fully see all the level"
+ }
+}
+
+ERU_LISTEN = add_spell
+{
+ ["name"] = "Listen to the Music",
+ ["school"] = {SCHOOL_ERU},
+ ["level"] = 7,
+ ["mana"] = 15,
+ ["mana_max"] = 200,
+ ["fail"] = 25,
+ -- Uses piety to cast
+ ["piety"] = TRUE,
+ ["stat"] = A_WIS,
+ ["random"] = SKILL_SPIRITUALITY,
+ ["spell"] = function()
+ if get_level(ERU_LISTEN) >= 30 then
+ ident_all()
+ identify_pack()
+ return TRUE
+ elseif get_level(ERU_LISTEN) >= 14 then
+ identify_pack()
+ return TRUE
+ else
+ return ident_spell()
+ end
+ end,
+ ["info"] = function()
+ return ""
+ end,
+ ["desc"] = {
+ "Allows you to listen to the Great Music from which the world",
+ "originates, allowing you to understand the meaning of things",
+ "At level 14 it allows you to identify all your pack",
+ "At level 30 it allows you to identify all items on the level",
+ }
+}
+
+ERU_UNDERSTAND = add_spell
+{
+ ["name"] = "Know the Music",
+ ["school"] = {SCHOOL_ERU},
+ ["level"] = 30,
+ ["mana"] = 200,
+ ["mana_max"] = 600,
+ ["fail"] = 50,
+ -- Uses piety to cast
+ ["piety"] = TRUE,
+ ["stat"] = A_WIS,
+ ["random"] = SKILL_SPIRITUALITY,
+ ["spell"] = function()
+ if get_level(ERU_UNDERSTAND) >= 10 then
+ identify_pack_fully()
+ return TRUE
+ else
+ return identify_fully()
+ end
+ end,
+ ["info"] = function()
+ return ""
+ end,
+ ["desc"] = {
+ "Allows you to understand the Great Music from which the world",
+ "originates, allowing you to know the full abilities of things",
+ "At level 10 it allows you to *identify* all your pack",
+ }
+}
+
+ERU_PROT = add_spell
+{
+ ["name"] = "Lay of Protection",
+ ["school"] = {SCHOOL_ERU},
+ ["level"] = 35,
+ ["mana"] = 400,
+ ["mana_max"] = 400,
+ ["fail"] = 80,
+ -- Uses piety to cast
+ ["piety"] = TRUE,
+ ["stat"] = A_WIS,
+ ["random"] = SKILL_SPIRITUALITY,
+ ["spell"] = function()
+ return fire_ball(GF_MAKE_GLYPH, 0, 1, 1 + get_level(ERU_PROT, 2, 0))
+ end,
+ ["info"] = function()
+ return "rad "..(1 + get_level(ERU_PROT, 2, 0))
+ end,
+ ["desc"] = {
+ "Creates a circle of safety around you",
+ }
+}
diff --git a/lib/mods/theme/scpt/s_fire.lua b/lib/mods/theme/scpt/s_fire.lua
new file mode 100644
index 00000000..dbbf7604
--- /dev/null
+++ b/lib/mods/theme/scpt/s_fire.lua
@@ -0,0 +1,227 @@
+-- handle the fire school
+
+GLOBELIGHT = add_spell
+{
+ ["name"] = "Globe of Light",
+ ["school"] = {SCHOOL_FIRE},
+ ["level"] = 1,
+ ["mana"] = 2,
+ ["mana_max"] = 15,
+ ["fail"] = 10,
+ ["stick"] =
+ {
+ ["charge"] = { 10, 5 },
+ [TV_STAFF] =
+ {
+ ["rarity"] = 7,
+ ["base_level"] = { 1, 15 },
+ ["max_level"] = { 10, 45 },
+ },
+ },
+ ["inertia"] = { 1, 40 },
+ ["spell"] = function()
+ local obvious
+ if get_level(GLOBELIGHT, 50) >= 3 then
+ obvious = lite_area(10, 4)
+ else
+ lite_room(player.py, player.px)
+ obvious = TRUE
+ end
+ if get_level(GLOBELIGHT, 50) >= 15 then
+ obvious = is_obvious(fire_ball(GF_LITE, 0, 10 + get_level(GLOBELIGHT, 100), 5 + get_level(GLOBELIGHT, 6)), obvious)
+ player.update = bor(player.update, PU_VIEW)
+ end
+ return obvious
+ end,
+ ["info"] = function()
+ if get_level(GLOBELIGHT, 50) >= 15 then
+ return "dam "..(10 + get_level(GLOBELIGHT, 100)).." rad "..(5 + get_level(GLOBELIGHT, 6))
+ else
+ return ""
+ end
+ end,
+ ["desc"] = {
+ "Creates a globe of pure light",
+ "At level 3 it starts damaging monsters",
+ "At level 15 it starts creating a more powerful kind of light",
+ }
+}
+
+FIREFLASH = add_spell
+{
+ ["name"] = "Fireflash",
+ ["school"] = {SCHOOL_FIRE},
+ ["level"] = 10,
+ ["mana"] = 5,
+ ["mana_max"] = 70,
+ ["fail"] = 35,
+ ["stick"] =
+ {
+ ["charge"] = { 5, 5 },
+ [TV_WAND] =
+ {
+ ["rarity"] = 35,
+ ["base_level"] = { 1, 15 },
+ ["max_level"] = { 15, 35 },
+ },
+ },
+ ["spell"] = function()
+ local ret, dir, type
+ if (get_level(FIREFLASH, 50) >= 20) then
+ type = GF_HOLY_FIRE
+ else
+ type = GF_FIRE
+ end
+ ret, dir = get_aim_dir()
+ if ret == FALSE then return end
+ return fire_ball(type, dir, 20 + get_level(FIREFLASH, 500), 2 + get_level(FIREFLASH, 5))
+ end,
+ ["info"] = function()
+ return "dam "..(20 + get_level(FIREFLASH, 500)).." rad "..(2 + get_level(FIREFLASH, 5))
+ end,
+ ["desc"] = {
+ "Conjures a ball of fire to burn your foes to ashes",
+ "At level 20 it turns into a ball of holy fire"
+ }
+}
+
+FIERYAURA = add_spell
+{
+ ["name"] = "Fiery Shield",
+ ["school"] = {SCHOOL_FIRE},
+ ["level"] = 20,
+ ["mana"] = 20,
+ ["mana_max"] = 60,
+ ["fail"] = 50,
+ ["stick"] =
+ {
+ ["charge"] = { 3, 5 },
+ [TV_STAFF] =
+ {
+ ["rarity"] = 50,
+ ["base_level"] = { 1, 10 },
+ ["max_level"] = { 5, 40 },
+ },
+ },
+ ["inertia"] = { 2, 15 },
+ ["spell"] = function()
+ local type
+ if (get_level(FIERYAURA, 50) >= 8) then
+ type = SHIELD_GREAT_FIRE
+ else
+ type = SHIELD_FIRE
+ end
+ return set_shield(randint(20) + 10 + get_level(FIERYAURA, 70), 10, type, 5 + get_level(FIERYAURA, 10), 5 + get_level(FIERYAURA, 7))
+ end,
+ ["info"] = function()
+ return "dam "..(5 + get_level(FIERYAURA, 15)).."d"..(5 + get_level(FIERYAURA, 7)).." dur "..(10 + get_level(FIERYAURA, 70)).."+d20"
+ end,
+ ["desc"] = {
+ "Creates a shield of fierce flames around you",
+ "At level 8 it turns into a greater kind of flame that can not be resisted"
+ }
+}
+
+FIREWALL = add_spell
+{
+ ["name"] = "Firewall",
+ ["school"] = {SCHOOL_FIRE},
+ ["level"] = 15,
+ ["mana"] = 25,
+ ["mana_max"] = 100,
+ ["fail"] = 40,
+ ["stick"] =
+ {
+ ["charge"] = { 4, 5 },
+ [TV_WAND] =
+ {
+ ["rarity"] = 55,
+ ["base_level"] = { 1, 10 },
+ ["max_level"] = { 5, 40 },
+ },
+ },
+ ["spell"] = function()
+ local ret, dir, type
+ if (get_level(FIREWALL, 50) >= 6) then
+ type = GF_HELL_FIRE
+ else
+ type = GF_FIRE
+ end
+ ret, dir = get_aim_dir()
+ if ret == FALSE then return end
+ fire_wall(type, dir, 40 + get_level(FIREWALL, 150), 10 + get_level(FIREWALL, 14))
+ return TRUE
+ end,
+ ["info"] = function()
+ return "dam "..(40 + get_level(FIREWALL, 150)).." dur "..(10 + get_level(FIREWALL, 14))
+ end,
+ ["desc"] = {
+ "Creates a fiery wall to incinerate monsters stupid enough to attack you",
+ "At level 6 it turns into a wall of hell fire"
+ }
+}
+
+FIREGOLEM = add_spell
+{
+ ["name"] = "Fire Golem",
+ ["school"] = {SCHOOL_FIRE, SCHOOL_MIND},
+ ["level"] = 7,
+ ["mana"] = 16,
+ ["mana_max"] = 70,
+ ["fail"] = 40,
+ ["spell"] = function()
+ local m_idx, y, x, ret, item
+
+ -- Can we reconnect ?
+ if do_control_reconnect() == TRUE then
+ msg_print("Control re-established.")
+ return
+ end
+
+ ret, item = get_item("Which light source do you want to use to create the golem?",
+ "You have no light source for the golem",
+ bor(USE_INVEN, USE_EQUIP),
+ function (obj)
+ if (obj.tval == TV_LITE) and ((obj.sval == SV_LITE_TORCH) or (obj.sval == SV_LITE_LANTERN)) then
+ return TRUE
+ end
+ return FALSE
+ end
+ )
+ if ret == FALSE then return TRUE end
+ inven_item_increase(item, -1)
+ inven_item_describe(item)
+ inven_item_optimize(item)
+
+ -- Summon it
+ m_allow_special[1043 + 1] = TRUE
+ y, x = find_position(player.py, player.px)
+ m_idx = place_monster_one(y, x, 1043, 0, FALSE, MSTATUS_FRIEND)
+ m_allow_special[1043 + 1] = FALSE
+
+ -- level it
+ if m_idx ~= 0 then
+ monster_set_level(m_idx, 7 + get_level(FIREGOLEM, 70))
+ player.control = m_idx
+ monster(m_idx).mflag = bor(monster(m_idx).mflag, MFLAG_CONTROL)
+ end
+ return TRUE
+ end,
+ ["info"] = function()
+ return "golem level "..(7 + get_level(FIREGOLEM, 70))
+ end,
+ ["desc"] = {
+ "Creates a fiery golem and controls it",
+ "During the control the available keylist is:",
+ "Movement keys: movement of the golem(depending on its speed",
+ " it can move more than one square)",
+ ", : pickup all items on the floor",
+ "d : drop all carried items",
+ "i : list all carried items",
+ "m : end the possession/use golem powers",
+ "Most of the other keys are disabled, you cannot interact with your",
+ "real body while controlling the golem",
+ "But to cast the spell you will need a lantern or a wooden torch to",
+ "Create the golem from"
+ }
+}
diff --git a/lib/mods/theme/scpt/s_geom.lua b/lib/mods/theme/scpt/s_geom.lua
new file mode 100644
index 00000000..b9730318
--- /dev/null
+++ b/lib/mods/theme/scpt/s_geom.lua
@@ -0,0 +1,656 @@
+-- Geomancy school
+
+function geomancy_random_wall(y, x)
+ local c_ptr = cave(y, x)
+
+ -- Do not destroy permanent things
+ if cave_is(c_ptr, FF1_PERMANENT) ~= FALSE then return end
+
+ local feat = nil
+ local table =
+ {
+ [1] = { SKILL_FIRE, FEAT_SANDWALL, 1},
+
+ [2] = { SKILL_WATER, FEAT_TREES, 1},
+ [3] = { SKILL_WATER, FEAT_ICE_WALL, 12},
+
+ [4] = { SKILL_EARTH, FEAT_WALL_EXTRA, 1},
+ }
+
+ while feat == nil do
+ local t = table[randint(getn(table))]
+
+ -- Do we meet the requirements ?
+ -- And then select the features based on skill proportions
+ if get_skill(t[1]) >= t[3] and magik(get_skill_scale(t[1], 100)) == TRUE then
+ feat = t[2]
+ end
+ end
+
+ cave_set_feat(y, x, feat)
+end
+
+
+GF_ELEMENTAL_WALL = add_spell_type
+{
+ ["color"] = { TERM_GREEN, 0 },
+ ["angry"] = function() return TRUE, FALSE end,
+ ["grid"] = function(who, dam, rad, y, x)
+ if player.py ~= y or player.px ~= x then
+ geomancy_random_wall(y, x)
+ end
+ end,
+}
+
+function geomancy_random_floor(y, x, kill_wall)
+ local c_ptr = cave(y, x)
+
+ -- Do not destroy permanent things
+ if cave_is(c_ptr, FF1_PERMANENT) ~= FALSE then return end
+ if not kill_wall then
+ if cave_is(c_ptr, FF1_FLOOR) ~= TRUE then return end
+ end
+
+ local feat = nil
+ local table =
+ {
+ [1] = { SKILL_FIRE, FEAT_SAND, 1},
+ [2] = { SKILL_FIRE, FEAT_SHAL_LAVA, 8},
+ [3] = { SKILL_FIRE, FEAT_DEEP_LAVA, 18},
+
+ [4] = { SKILL_WATER, FEAT_SHAL_WATER, 1},
+ [5] = { SKILL_WATER, FEAT_DEEP_WATER, 8},
+ [6] = { SKILL_WATER, FEAT_ICE, 18},
+
+ [7] = { SKILL_EARTH, FEAT_GRASS, 1},
+ [8] = { SKILL_EARTH, FEAT_FLOWER, 8},
+ [9] = { SKILL_EARTH, FEAT_DARK_PIT, 18},
+ }
+
+ while feat == nil do
+ local t = table[randint(getn(table))]
+
+ -- Do we meet the requirements ?
+ -- And then select the features based on skill proportions
+ if get_skill(t[1]) >= t[3] and magik(get_skill_scale(t[1], 100)) == TRUE then
+ feat = t[2]
+ end
+ end
+
+ cave_set_feat(y, x, feat)
+end
+
+
+GF_ELEMENTAL_GROWTH = add_spell_type
+{
+ ["color"] = { TERM_GREEN, 0 },
+ ["angry"] = function() return TRUE, FALSE end,
+ ["grid"] = function(who, dam, rad, y, x)
+ geomancy_random_floor(y, x)
+ end,
+}
+
+CALL_THE_ELEMENTS = add_spell
+{
+ ["name"] = "Call the Elements",
+ ["school"] = {SCHOOL_GEOMANCY},
+ ["level"] = 1,
+ ["mana"] = 2,
+ ["mana_max"] = 20,
+ ["fail"] = 10,
+ -- Unnafected by blindness
+ ["blind"] = FALSE,
+ ["random"] = 0,
+ ["spell"] = function()
+ local ret, dir = 0, 0
+
+ if get_level(CALL_THE_ELEMENTS) >= 17 then
+ ret, dir = get_aim_dir()
+ if ret == FALSE then return end
+ end
+
+ fire_ball(GF_ELEMENTAL_GROWTH, dir, 1, 1 + get_level(CALL_THE_ELEMENTS, 5, 0))
+ return TRUE
+ end,
+ ["info"] = function()
+ return "rad "..(1 + get_level(CALL_THE_ELEMENTS, 5, 0))
+ end,
+ ["desc"] = {
+ "Randomly creates various elements around you",
+ "Each type of element chance is controlled by your level",
+ "in the corresponding skill",
+ "At level 17 it can be targeted",
+ }
+}
+
+-- Seperate function because an other spell needs it
+function channel_the_elements(y, x, level, silent)
+ local t =
+ {
+ -- Earth stuff
+ [FEAT_GRASS] = function()
+ hp_player(player.mhp * (5 + get_skill_scale(SKILL_EARTH, 20)) / 100)
+ end,
+ [FEAT_FLOWER] = function()
+ hp_player(player.mhp * (5 + get_skill_scale(SKILL_EARTH, 30)) / 100)
+ end,
+ [FEAT_DARK_PIT] = function()
+ local ret, dir = get_aim_dir()
+ if ret == FALSE then return end
+
+ local type = GF_DARK
+ if get_skill(SKILL_EARTH) >= 18 then type = GF_NETHER end
+ fire_bolt(type, dir, damroll(10, get_skill(SKILL_EARTH)))
+ end,
+
+ -- Water stuff
+ [FEAT_SHAL_WATER] = function()
+ local ret, dir = get_aim_dir()
+ if ret == FALSE then return end
+
+ local type = GF_WATER
+ if get_skill(SKILL_WATER) >= 18 then type = GF_WAVE end
+
+ if get_skill(SKILL_WATER) >= 8 then
+ fire_beam(type, dir, damroll(3, get_skill(SKILL_WATER)))
+ else
+ fire_bolt(type, dir, damroll(3, get_skill(SKILL_WATER)))
+ end
+ end,
+ [FEAT_DEEP_WATER] = function()
+ local ret, dir = get_aim_dir()
+ if ret == FALSE then return end
+
+ local type = GF_WATER
+ if get_skill(SKILL_WATER) >= 18 then type = GF_WAVE end
+
+ if get_skill(SKILL_WATER) >= 8 then
+ fire_beam(type, dir, damroll(5, get_skill(SKILL_WATER)))
+ else
+ fire_bolt(type, dir, damroll(5, get_skill(SKILL_WATER)))
+ end
+ end,
+ [FEAT_ICE] = function()
+ local ret, dir = get_aim_dir()
+ if ret == FALSE then return end
+
+ if get_skill(SKILL_WATER) >= 12 then
+ fire_ball(GF_ICE, dir, get_skill_scale(SKILL_WATER, 340), 3)
+ else
+ fire_bolt(GF_ICE, dir, damroll(3, get_skill(SKILL_WATER)))
+ end
+ end,
+
+ -- Fire stuff
+ [FEAT_SAND] = function()
+ local type
+ if (get_level(FIERYAURA, 50) >= 8) then
+ type = SHIELD_GREAT_FIRE
+ else
+ type = SHIELD_FIRE
+ end
+ local dur = randint(20) + %level + get_skill(SKILL_AIR)
+ set_shield(dur, 0, type, 5 + get_skill_scale(SKILL_FIRE, 20), 5 + get_skill_scale(SKILL_FIRE, 14))
+ set_blind(dur)
+ end,
+ [FEAT_SHAL_LAVA] = function()
+ local ret, dir = get_aim_dir()
+ if ret == FALSE then return end
+
+ if get_skill(SKILL_FIRE) >= 15 then
+ fire_bolt(GF_HELL_FIRE, dir, damroll(get_skill_scale(SKILL_FIRE, 30), 15))
+ else
+ fire_bolt(GF_FIRE, dir, damroll(get_skill_scale(SKILL_FIRE, 30), 15))
+ end
+ end,
+ [FEAT_DEEP_LAVA] = function()
+ local ret, dir = get_aim_dir()
+ if ret == FALSE then return end
+
+ if get_skill(SKILL_FIRE) >= 15 then
+ fire_ball(GF_HELL_FIRE, dir, damroll(get_skill_scale(SKILL_FIRE, 30), 15), 3)
+ else
+ fire_ball(GF_FIRE, dir, damroll(get_skill_scale(SKILL_FIRE, 30), 15), 3)
+ end
+ end,
+ }
+
+ if t[cave(y, x).feat] then
+ t[cave(y, x).feat]()
+
+ if magik(100 - level) == TRUE then
+ if cave(y, x).feat == FEAT_FLOWER then
+ cave_set_feat(y, x, FEAT_GRASS)
+ else
+ cave_set_feat(y, x, FEAT_FLOOR)
+ end
+ msg_print("The area is drained.")
+ end
+ elseif not silent then
+ msg_print("You cannot channel this area.")
+ end
+end
+
+CHANNEL_ELEMENTS = add_spell
+{
+ ["name"] = "Channel Elements",
+ ["school"] = {SCHOOL_GEOMANCY},
+ ["level"] = 3,
+ ["mana"] = 3,
+ ["mana_max"] = 30,
+ ["fail"] = 20,
+ -- Unnafected by blindness
+ ["blind"] = FALSE,
+ ["random"] = 0,
+ ["spell"] = function()
+ channel_the_elements(player.py, player.px, get_level(CHANNEL_ELEMENTS), nil)
+ return TRUE
+ end,
+ ["info"] = function()
+ return ""
+ end,
+ ["desc"] = {
+ "Draws on the caster's immediate environs to form an attack or other effect.",
+ "Grass/Flower heals.",
+ "Water creates water bolt attacks.",
+ "Ice creates ice bolt attacks.",
+ "Sand creates a wall of thick, blinding, burning sand around you.",
+ "Lava creates fire bolt attacks.",
+ "Deep lava creates fire ball attacks.",
+ "Chasm creates darkness bolt attacks.",
+ "At Earth level 18, darkness becomes nether.",
+ "At Water level 8, water attacks become beams with a striking effect.",
+ "At Water level 12, ice attacks become balls of ice shards.",
+ "At Water level 18, water attacks push monsters back.",
+ "At Fire level 15, fire become hellfire.",
+ }
+}
+
+ELEMENTAL_WAVE = add_spell
+{
+ ["name"] = "Elemental Wave",
+ ["school"] = {SCHOOL_GEOMANCY},
+ ["level"] = 15,
+ ["mana"] = 15,
+ ["mana_max"] = 50,
+ ["fail"] = 20,
+ -- Unnafected by blindness
+ ["blind"] = FALSE,
+ ["random"] = 0,
+ ["spell"] = function()
+ local ret, dir = get_rep_dir()
+ if ret == FALSE then return end
+
+ local y, x = explode_dir(dir)
+ y = y + player.py
+ x = x + player.px
+
+ local t =
+ {
+ -- Earth stuff
+ [FEAT_GRASS] = { GF_POIS, GF_POIS, 10 + get_skill_scale(SKILL_EARTH, 200) },
+ [FEAT_FLOWER] = { GF_POIS, GF_POIS, 10 + get_skill_scale(SKILL_EARTH, 300) },
+ -- cannot turn chasm into a wave
+
+ -- Water stuff
+ [FEAT_SHAL_WATER] = { GF_WATER, GF_WATER, 10 + get_skill_scale(SKILL_WATER, 200) },
+ [FEAT_DEEP_WATER] = { GF_WATER, GF_WATER, 10 + get_skill_scale(SKILL_WATER, 300) },
+ [FEAT_ICE] = { GF_ICE, GF_ICE, 10 + get_skill_scale(SKILL_WATER, 200) },
+
+ -- Fire stuff
+ [FEAT_SAND] = { GF_LITE, GF_LITE, 10 + get_skill_scale(SKILL_FIRE, 400) },
+ [FEAT_SHAL_LAVA] = { GF_FIRE, GF_HOLY_FIRE, 10 + get_skill_scale(SKILL_FIRE, 200) },
+ [FEAT_DEEP_LAVA] = { GF_FIRE, GF_HOLY_FIRE, 10 + get_skill_scale(SKILL_FIRE, 300) },
+ }
+
+
+ local effect = t[cave(y, x).feat]
+ if not effect then
+ msg_print("You cannot channel this area.")
+ else
+ local typ = effect[1]
+ if get_level(ELEMENTAL_WAVE) >= 20 then typ = effect[2] end
+
+ cave_set_feat(y, x, FEAT_FLOOR)
+
+ fire_wave(typ, 0, effect[3], 0, 6 + get_level(ELEMENTAL_WAVE, 20), EFF_WAVE + EFF_LAST + getglobal("EFF_DIR"..dir))
+ end
+
+ return TRUE
+ end,
+ ["info"] = function()
+ return ""
+ end,
+ ["desc"] = {
+ "Draws on an adjacent special square to project a slow-moving",
+ "wave of that element in that direction",
+ "Abyss squares cannot be channeled into a wave.",
+ }
+}
+
+VAPORIZE = add_spell
+{
+ ["name"] = "Vaporize",
+ ["school"] = {SCHOOL_GEOMANCY},
+ ["level"] = 4,
+ ["mana"] = 3,
+ ["mana_max"] = 30,
+ ["fail"] = 15,
+ -- Unnafected by blindness
+ ["blind"] = FALSE,
+ -- Must have at least 4 Air
+ ["random"] = 0,
+ ["depend"] = function()
+ if get_skill(SKILL_AIR) >= 4 then return TRUE end
+ end,
+ ["spell"] = function()
+ local t =
+ {
+ -- Earth stuff
+ [FEAT_GRASS] = { GF_POIS, GF_POIS, 5 + get_skill_scale(SKILL_EARTH, 100) },
+ [FEAT_FLOWER] = { GF_POIS, GF_POIS, 5 + get_skill_scale(SKILL_EARTH, 150) },
+ [FEAT_DARK_PIT] = { GF_DARK, GF_DARK, 5 + get_skill_scale(SKILL_EARTH, 200) },
+
+ -- Water stuff
+ [FEAT_SHAL_WATER] = { GF_WATER, GF_WATER, 5 + get_skill_scale(SKILL_WATER, 100) },
+ [FEAT_DEEP_WATER] = { GF_WATER, GF_WATER, 5 + get_skill_scale(SKILL_WATER, 150) },
+ [FEAT_ICE] = { GF_ICE, GF_ICE, 5 + get_skill_scale(SKILL_WATER, 100) },
+
+ -- Fire stuff
+ [FEAT_SAND] = { GF_LITE, GF_LITE, 5 + get_skill_scale(SKILL_FIRE, 200) },
+ [FEAT_SHAL_LAVA] = { GF_FIRE, GF_HOLY_FIRE, 5 + get_skill_scale(SKILL_FIRE, 100) },
+ [FEAT_DEEP_LAVA] = { GF_FIRE, GF_HOLY_FIRE, 5 + get_skill_scale(SKILL_FIRE, 150) },
+ }
+
+ local effect = t[cave(player.py, player.px).feat]
+ if not effect then
+ msg_print("You cannot channel this area.")
+ else
+ local typ = effect[1]
+ if get_level(VAPORIZE) >= 20 then typ = effect[2] end
+
+ cave_set_feat(player.py, player.px, FEAT_FLOOR)
+
+ fire_cloud(typ, 0, effect[3], 1 + get_level(VAPORIZE, 4), 10 + get_level(VAPORIZE, 20))
+ end
+
+ return TRUE
+ end,
+ ["info"] = function()
+ return "rad "..(1 + get_level(VAPORIZE, 4)).." dur "..(10 + get_level(VAPORIZE, 20))
+ end,
+ ["desc"] = {
+ "Draws upon your immediate environs to form a cloud of damaging vapors",
+ }
+}
+
+geomancy_can_tunnel =
+{
+ [FEAT_WALL_EXTRA] = TRUE,
+ [FEAT_WALL_OUTER] = TRUE,
+ [FEAT_WALL_INNER] = TRUE,
+ [FEAT_WALL_SOLID] = TRUE,
+
+ [FEAT_MAGMA] = TRUE,
+ [FEAT_QUARTZ] = TRUE,
+ [FEAT_MAGMA_H] = TRUE,
+ [FEAT_QUARTZ_H] = TRUE,
+ [FEAT_MAGMA_K] = TRUE,
+ [FEAT_QUARTZ_K] = TRUE,
+
+ [FEAT_TREES] = TRUE,
+ [FEAT_DEAD_TREE] = TRUE,
+
+ [FEAT_SANDWALL] = TRUE,
+ [FEAT_SANDWALL_H] = TRUE,
+ [FEAT_SANDWALL_K] = TRUE,
+
+ [FEAT_ICE_WALL] = TRUE,
+}
+
+-- Dig & sprew
+function geomancy_dig(oy, ox, dir, length)
+ local dy, dx = explode_dir(dir)
+ local y = dy + oy
+ local x = dx + ox
+
+ for i = 1, length do
+ local c_ptr = cave(y, x)
+ local ox = x - dx
+ local oy = y - dy
+
+ -- stop at the end of tunnelable things
+ if not geomancy_can_tunnel[c_ptr.feat] then break end
+
+ if geomancy_can_tunnel[cave(y - 1, x - 1).feat] then geomancy_random_wall(y - 1, x - 1) end
+ if geomancy_can_tunnel[cave(y - 1, x).feat] then geomancy_random_wall(y - 1, x) end
+ if geomancy_can_tunnel[cave(y - 1, x + 1).feat] then geomancy_random_wall(y - 1, x + 1) end
+
+ if geomancy_can_tunnel[cave(y, x - 1).feat] then geomancy_random_wall(y, x - 1) end
+ if geomancy_can_tunnel[cave(y, x + 1).feat] then geomancy_random_wall(y, x + 1) end
+
+ if geomancy_can_tunnel[cave(y + 1, x - 1).feat] then geomancy_random_wall(y + 1, x - 1) end
+ if geomancy_can_tunnel[cave(y + 1, x).feat] then geomancy_random_wall(y + 1, x) end
+ if geomancy_can_tunnel[cave(y + 1, x + 1).feat] then geomancy_random_wall(y + 1, x + 1) end
+
+ y = y + dy
+ x = x + dx
+ end
+
+ y = y - dy
+ x = x - dx
+ while (y ~= oy) or (x ~= ox) do
+ geomancy_random_floor(y, x, TRUE)
+
+ -- Should we branch ?
+ if magik(20) == TRUE then
+ local rot = 1
+ if magik(50) == TRUE then rot = -1 end
+ geomancy_dig(y, x, rotate_dir(dir, rot), length / 3)
+ end
+
+ y = y - dy
+ x = x - dx
+ end
+end
+
+GEOLYSIS = add_spell
+{
+ ["name"] = "Geolysis",
+ ["school"] = {SCHOOL_GEOMANCY},
+ ["level"] = 7,
+ ["mana"] = 15,
+ ["mana_max"] = 40,
+ ["fail"] = 15,
+ -- Unnafected by blindness
+ ["blind"] = FALSE,
+ ["random"] = 0,
+ -- Must have at least 7 Earth
+ ["depend"] = function()
+ if get_skill(SKILL_EARTH) >= 7 then return TRUE end
+ end,
+ ["spell"] = function()
+ local ret, dir = get_rep_dir()
+ if ret == FALSE then return end
+
+ msg_print("Elements recombine before you, laying down an open path.")
+ geomancy_dig(player.py, player.px, dir, 5 + get_level(GEOLYSIS, 12))
+
+ return TRUE
+ end,
+ ["info"] = function()
+ return "length "..(5 + get_level(GEOLYSIS, 12))
+ end,
+ ["desc"] = {
+ "Burrows deeply and slightly at random into a wall,",
+ "leaving behind tailings of various different sorts of walls in the passage.",
+ }
+}
+
+player.dripping_tread = 0
+add_loadsave("player.dripping_tread", 0)
+add_hooks
+{
+ [HOOK_MOVED] = function(oy, ox)
+ if player.dripping_tread > 0 then
+ geomancy_random_floor(oy, ox)
+ player.dripping_tread = player.dripping_tread - 1
+ if player.dripping_tread == 0 then
+ msg_print("You stop dripping raw elemental energies.")
+ end
+ end
+ end
+}
+DRIPPING_TREAD = add_spell
+{
+ ["name"] = "Dripping Tread",
+ ["school"] = {SCHOOL_GEOMANCY},
+ ["level"] = 10,
+ ["mana"] = 15,
+ ["mana_max"] = 25,
+ ["fail"] = 15,
+ -- Unnafected by blindness
+ ["blind"] = FALSE,
+ ["random"] = 0,
+ -- Must have at least 10 Water
+ ["depend"] = function()
+ if get_skill(SKILL_WATER) >= 10 then return TRUE end
+ end,
+ ["spell"] = function()
+ if player.dripping_tread == 0 then
+ player.dripping_tread = randint(15) + 10 + get_level(DRIPPING_TREAD)
+ msg_print("You start dripping raw elemental energies.")
+ else
+ player.dripping_tread = 0
+ msg_print("You stop dripping raw elemental energies.")
+ end
+ return TRUE
+ end,
+ ["info"] = function()
+ return "dur "..(10 + get_level(DRIPPING_TREAD)).."+d15 movs"
+ end,
+ ["desc"] = {
+ "Causes you to leave random elemental forms behind as you walk",
+ }
+}
+
+GROW_BARRIER = add_spell
+{
+ ["name"] = "Grow Barrier",
+ ["school"] = {SCHOOL_GEOMANCY},
+ ["level"] = 12,
+ ["mana"] = 30,
+ ["mana_max"] = 40,
+ ["fail"] = 15,
+ -- Unnafected by blindness
+ ["blind"] = FALSE,
+ ["random"] = 0,
+ -- Must have at least 12 Earth
+ ["depend"] = function()
+ if get_skill(SKILL_EARTH) >= 12 then return TRUE end
+ end,
+ ["spell"] = function()
+ local ret, dir = 0, 0
+
+ if get_level(GROW_BARRIER) >= 20 then
+ ret, dir = get_aim_dir()
+ if ret == FALSE then return end
+ end
+
+ fire_ball(GF_ELEMENTAL_WALL, dir, 1, 1)
+ return TRUE
+ end,
+ ["info"] = function()
+ return ""
+ end,
+ ["desc"] = {
+ "Creates impassable terrain (walls, trees, etc.) around you.",
+ "At level 20 it can be projected around another area.",
+ }
+}
+
+ELEMENTAL_MINION = add_spell
+{
+ ["name"] = "Elemental Minion",
+ ["school"] = {SCHOOL_GEOMANCY},
+ ["level"] = 20,
+ ["mana"] = 40,
+ ["mana_max"] = 80,
+ ["fail"] = 25,
+ -- Unnafected by blindness
+ ["random"] = 0,
+ -- Must have at least 12 Earth
+ ["spell"] = function()
+ local ret, dir = 0, 0
+
+ ret, dir = get_rep_dir()
+ if ret == FALSE then return end
+
+ local t =
+ {
+ [FEAT_WALL_EXTRA] = { SKILL_EARTH, { "Earth elemental", "Xorn", "Xaren" } },
+ [FEAT_WALL_OUTER] = { SKILL_EARTH, { "Earth elemental", "Xorn", "Xaren" } },
+ [FEAT_WALL_INNER] = { SKILL_EARTH, { "Earth elemental", "Xorn", "Xaren" } },
+ [FEAT_WALL_SOLID] = { SKILL_EARTH, { "Earth elemental", "Xorn", "Xaren" } },
+ [FEAT_MAGMA] = { SKILL_EARTH, { "Earth elemental", "Xorn", "Xaren" } },
+ [FEAT_QUARTZ] = { SKILL_EARTH, { "Earth elemental", "Xorn", "Xaren" } },
+ [FEAT_MAGMA_H] = { SKILL_EARTH, { "Earth elemental", "Xorn", "Xaren" } },
+ [FEAT_QUARTZ_H] = { SKILL_EARTH, { "Earth elemental", "Xorn", "Xaren" } },
+ [FEAT_MAGMA_K] = { SKILL_EARTH, { "Earth elemental", "Xorn", "Xaren" } },
+ [FEAT_QUARTZ_K] = { SKILL_EARTH, { "Earth elemental", "Xorn", "Xaren" } },
+
+ [FEAT_DARK_PIT] = { SKILL_AIR, { "Air elemental", "Ancient blue dragon", "Great Storm Wyrm", "Sky Drake" } },
+
+ [FEAT_SANDWALL] = { SKILL_FIRE, { "Fire elemental", "Ancient red dragon" } },
+ [FEAT_SANDWALL_H] = { SKILL_FIRE, { "Fire elemental", "Ancient red dragon" } },
+ [FEAT_SANDWALL_K] = { SKILL_FIRE, { "Fire elemental", "Ancient red dragon" } },
+ [FEAT_SHAL_LAVA] = { SKILL_FIRE, { "Fire elemental", "Ancient red dragon" } },
+ [FEAT_DEEP_LAVA] = { SKILL_FIRE, { "Fire elemental", "Ancient red dragon" } },
+
+ [FEAT_ICE_WALL] = { SKILL_WATER, { "Water elemental", "Water troll", "Water demon" } },
+ [FEAT_SHAL_WATER] = { SKILL_WATER, { "Water elemental", "Water troll", "Water demon" } },
+ [FEAT_DEEP_WATER] = { SKILL_WATER, { "Water elemental", "Water troll", "Water demon" } },
+ }
+
+ local y, x = explode_dir(dir)
+ y = y + player.py
+ x = x + player.px
+
+ local effect = t[cave(y, x).feat]
+ if not effect then
+ msg_print("You cannot summon from this area.")
+ else
+ local skill = effect[1]
+ local types = effect[2]
+
+ local max = get_skill_scale(skill, getn(types))
+ if max == 0 then max = 1 end
+
+ local r_idx = test_monster_name(types[rand_range(1, max)])
+
+ -- Summon it
+ local my, mx = find_position(y, x)
+ local m_idx = place_monster_one(my, mx, r_idx, 0, FALSE, MSTATUS_FRIEND)
+
+ -- level it
+ if m_idx ~= 0 then
+ monster_set_level(m_idx, 10 + get_level(ELEMENTAL_MINION, 120))
+ end
+
+ cave_set_feat(y, x, FEAT_FLOOR)
+ end
+
+ return TRUE
+ end,
+ ["info"] = function()
+ return "min level "..(10 + get_level(ELEMENTAL_MINION, 120))
+ end,
+ ["desc"] = {
+ "Summons a minion from a nearby element.",
+ "Walls can summon Earth elmentals, Xorns and Xarens",
+ "Dark Pits can summon Air elementals, Ancient blue dragons, Great Storm Wyrms",
+ "and Sky Drakes",
+ "Sandwalls and lava can summon Fire elementals and Ancient red dragons",
+ "Icewall, and water can summon Water elementals, Water trolls and Water demons",
+ }
+}
diff --git a/lib/mods/theme/scpt/s_mana.lua b/lib/mods/theme/scpt/s_mana.lua
new file mode 100644
index 00000000..736b06b0
--- /dev/null
+++ b/lib/mods/theme/scpt/s_mana.lua
@@ -0,0 +1,132 @@
+-- The mana school
+
+function get_manathrust_dam()
+ return 3 + get_level(MANATHRUST, 50), 1 + get_level(MANATHRUST, 20)
+end
+
+MANATHRUST = add_spell
+{
+ ["name"] = "Manathrust",
+ ["school"] = SCHOOL_MANA,
+ ["level"] = 1,
+ ["mana"] = 1,
+ ["mana_max"] = 25,
+ ["fail"] = 10,
+ ["stick"] =
+ {
+ ["charge"] = { 7, 10 },
+ [TV_WAND] =
+ {
+ ["rarity"] = 5,
+ ["base_level"] = { 1, 20 },
+ ["max_level"] = { 15, 33 },
+ },
+ },
+ ["spell"] = function()
+ local ret, dir
+
+ ret, dir = get_aim_dir()
+ if ret == FALSE then return end
+ return fire_bolt(GF_MANA, dir, damroll(get_manathrust_dam()))
+ end,
+ ["info"] = function()
+ local x, y
+
+ x, y = get_manathrust_dam()
+ return "dam "..x.."d"..y
+ end,
+ ["desc"] = {
+ "Conjures up mana into a powerful bolt",
+ "The damage is irresistible and will increase with level"
+ }
+}
+
+DELCURSES = add_spell
+{
+ ["name"] = "Remove Curses",
+ ["school"] = SCHOOL_MANA,
+ ["level"] = 10,
+ ["mana"] = 20,
+ ["mana_max"] = 40,
+ ["fail"] = 30,
+ ["stick"] =
+ {
+ ["charge"] = { 3, 8 },
+ [TV_STAFF] =
+ {
+ ["rarity"] = 70,
+ ["base_level"] = { 1, 5 },
+ ["max_level"] = { 15, 50 },
+ },
+ },
+ ["inertia"] = { 1, 10 },
+ ["spell"] = function()
+ local done
+
+ if get_level(DELCURSES, 50) >= 20 then done = remove_all_curse()
+ else done = remove_curse() end
+ if done == TRUE then msg_print("The curse is broken!") end
+ return done
+ end,
+ ["info"] = function()
+ return ""
+ end,
+ ["desc"] = {
+ "Remove curses of worn objects",
+ "At level 20 switches to *remove curses*"
+ }
+}
+
+RESISTS = add_spell
+{
+ ["name"] = "Elemental Shield",
+ ["school"] = SCHOOL_MANA,
+ ["level"] = 20,
+ ["mana"] = 17,
+ ["mana_max"] = 20,
+ ["fail"] = 40,
+ ["inertia"] = { 2, 25 },
+ ["spell"] = function()
+ local obvious
+ if player.oppose_fire == 0 then obvious = set_oppose_fire(randint(10) + 15 + get_level(RESISTS, 50)) end
+ if player.oppose_cold == 0 then obvious = is_obvious(set_oppose_cold(randint(10) + 15 + get_level(RESISTS, 50)), obvious) end
+ if player.oppose_elec == 0 then obvious = is_obvious(set_oppose_elec(randint(10) + 15 + get_level(RESISTS, 50)), obvious) end
+ if player.oppose_acid == 0 then obvious = is_obvious(set_oppose_acid(randint(10) + 15 + get_level(RESISTS, 50)), obvious) end
+ return obvious
+ end,
+ ["info"] = function()
+ return "dur "..(15 + get_level(RESISTS, 50)).."+d10"
+ end,
+ ["desc"] = {
+ "Provide resistances to the four basic elements",
+ }
+}
+
+MANASHIELD = add_spell
+{
+ ["name"] = "Disruption Shield",
+ ["school"] = SCHOOL_MANA,
+ ["level"] = 45,
+ ["mana"] = 50,
+ ["mana_max"] = 50,
+ ["fail"] = 90,
+ ["inertia"] = { 9, 10},
+ ["spell"] = function()
+ if get_level(MANASHIELD, 50) >= 5 then
+ if (player.invuln == 0) then
+ return set_invuln(randint(5) + 3 + get_level(MANASHIELD, 10))
+ end
+ else
+ if (player.disrupt_shield == 0) then return set_disrupt_shield(randint(5) + 3 + get_level(MANASHIELD, 10)) end
+ end
+ end,
+ ["info"] = function()
+ return "dur "..(3 + get_level(MANASHIELD, 10)).."+d5"
+ end,
+ ["desc"] = {
+ "Uses mana instead of hp to take damage",
+ "At level 5 switches to Globe of Invulnerability.",
+ "The spell breaks as soon as a melee, shooting, throwing or magical",
+ "skill action is attempted, and lasts only a short time."
+ }
+}
diff --git a/lib/mods/theme/scpt/s_mandos.lua b/lib/mods/theme/scpt/s_mandos.lua
new file mode 100644
index 00000000..cc7e346a
--- /dev/null
+++ b/lib/mods/theme/scpt/s_mandos.lua
@@ -0,0 +1,186 @@
+-- Spells for the school of Mandos
+
+BOOK_MANDOS = 66
+
+-- precognition timer for high-level spell [from T-Plus by Ingeborg S. Norden]
+
+add_loadsave("tim_precognition",0)
+
+function set_precognition(v)
+ local notice = FALSE
+ if (v < 0) then v = 0 end
+ if (v > 10000) then v = 10000 end
+
+ -- Check if the state will change
+ if (v > 0) and (tim_precognition == 0) then
+ msg_print("You feel able to predict the future.")
+ notice = TRUE
+ elseif (v == 0) and (tim_precognition > 0) then
+ msg_print("You feel less able to predict the future.")
+ notice = TRUE
+ end
+
+ -- set the new value
+ tim_precognition = v
+
+ if (notice == TRUE) then
+ player.update = bor(player.update, PU_BONUS)
+ disturb(0,0)
+ end
+ return notice
+end
+
+-- related hooks
+
+add_hooks{
+ [HOOK_CALC_BONUS] = function()
+ if (tim_precognition > 0) then
+ --player.precognition = TRUE
+ apply_flags(0, 0, 0, TR4_PRECOGNITION, 0, 0, 0, 0, 0, 0, 0)
+ end
+ end,
+
+ [HOOK_PROCESS_WORLD] = function()
+ if (tim_precognition > 0) then
+ set_precognition(tim_precognition - 1)
+ end
+ end,
+}
+
+-- "Tears of Luthien" based on Holy Word from T-Plus
+MANDOS_TEARS_LUTHIEN = add_spell
+{
+ ["name"] = "Tears of Luthien",
+ ["school"] = {SCHOOL_MANDOS},
+ ["level"] = 5,
+ ["mana"] = 10,
+ ["mana_max"] = 100,
+ ["fail"] = 25,
+ ["piety"] = TRUE,
+ ["stat"] = A_WIS,
+ ["random"] = SKILL_SPIRITUALITY,
+ ["spell"] = function()
+ local level = get_level(MANDOS_TEARS_LUTHIEN, 30)
+ local obvious = hp_player(10 * level)
+ obvious = is_obvious (set_stun(0), obvious)
+ obvious = is_obvious (set_cut(0), obvious)
+ obvious = is_obvious (set_afraid(0), obvious)
+ return obvious
+ end,
+ ["info"] = function()
+ local level = get_level(MANDOS_TEARS_LUTHIEN, 30)
+ return "heals "..(10 * level)
+ end,
+ ["desc"] = {
+ "Calls upon the spirit of Luthien to ask Mandos for healing and succour."
+ }
+}
+
+-- "Spirit of the Feanturi" based on Restore Mind from T-Plus
+MANDOS_SPIRIT_FEANTURI = add_spell {
+ ["name"] = "Feanturi",
+ ["school"] = {SCHOOL_MANDOS},
+ ["level"] = 10,
+ ["mana"] = 40,
+ ["mana_max"] = 200,
+ ["fail"] = 50,
+ -- Uses piety to cast
+ ["piety"] = TRUE,
+ ["stat"] = A_WIS,
+ ["random"] = SKILL_SPIRITUALITY,
+ ["spell"] = function()
+ local level = get_level(MANDOS_SPIRIT_FEANTURI, 50)
+ local obvious
+ obvious = set_afraid(0)
+ obvious = is_obvious(set_confused(0), obvious)
+
+ if level >= 20 then
+ obvious = is_obvious(do_res_stat(A_WIS, TRUE), obvious)
+ obvious = is_obvious(do_res_stat(A_INT, TRUE), obvious)
+ end
+
+ if level >= 30 then
+ obvious = is_obvious(set_image(0), obvious)
+ obvious = is_obvious(heal_insanity(player.msane * level / 100), obvious)
+ end
+
+ return obvious
+ end,
+
+ ["info"] = function()
+ local level = get_level(MANDOS_SPIRIT_FEANTURI, 50)
+ if level >= 20 then
+ return "heals "..level.."%"
+ else
+ return ""
+ end
+ end,
+ ["desc"] = {
+ "Channels the power of Mandos to cure fear and confusion.",
+ "At level 20 it restores lost INT and WIS",
+ "At level 30 it cures hallucinations and restores a percentage of lost sanity"
+ }
+}
+
+-- "Tale of Doom" based on Foretell from T-Plus
+MANDOS_TALE_DOOM = add_spell
+{
+ ["name"] = "Tale of Doom",
+ ["school"] = {SCHOOL_MANDOS},
+ ["level"] = 25,
+ ["mana"] = 60,
+ ["mana_max"] = 300,
+ ["stat"] = A_WIS,
+ ["fail"] = 75,
+ -- Uses piety to cast
+ ["piety"] = TRUE,
+ ["stat"] = A_WIS,
+ ["random"] = SKILL_SPIRITUALITY,
+ ["spell"] = function()
+ return set_precognition(5 + get_level(MANDOS_TALE_DOOM,10))
+ end,
+ ["info"] = function()
+ return "dur "..(5 + get_level(MANDOS_TALE_DOOM,10))
+ end,
+ ["desc"] = {
+ "Allows you to predict the future for a short time."
+ }
+}
+
+-- "Call to the Halls" based on Call Blessed Soul from T-Plus
+MANDOS_CALL_HALLS= add_spell
+
+{
+ ["name"] = "Call to the Halls",
+ ["school"] = {SCHOOL_MANDOS},
+ ["level"] = 30,
+ ["mana"] = 80,
+ ["mana_max"] = 400,
+ ["fail"] = 95,
+ ["piety"] = TRUE,
+ ["stat"] = A_WIS,
+ ["random"] = SKILL_SPIRITUALITY,
+ ["spell"] = function()
+ local y, x, m_idx
+ local summons =
+ {
+ test_monster_name("Experienced spirit"),
+ test_monster_name("Wise spirit"),
+ }
+ y, x = find_position(player.py, player.px)
+ m_idx = place_monster_one(y, x, summons[rand_range(1, 2)], 0, FALSE, MSTATUS_FRIEND)
+ if m_idx ~= 0 then
+ monster_set_level(m_idx, 20 + get_level(MANDOS_CALL_HALLS, 70, 0))
+ return TRUE
+ end
+ end,
+
+ ["info"] = function()
+ return "level "..(get_level(MANDOS_CALL_HALLS, 70))
+ end,
+ ["desc"] = {
+ "Summons a leveled spirit from the Halls of Mandos",
+ "to fight for you."
+
+ }
+} \ No newline at end of file
diff --git a/lib/mods/theme/scpt/s_manwe.lua b/lib/mods/theme/scpt/s_manwe.lua
new file mode 100644
index 00000000..6f0f9661
--- /dev/null
+++ b/lib/mods/theme/scpt/s_manwe.lua
@@ -0,0 +1,144 @@
+-- Handle Manwe Sulimo magic school
+
+MANWE_SHIELD = add_spell
+{
+ ["name"] = "Wind Shield",
+ ["school"] = {SCHOOL_MANWE},
+ ["level"] = 10,
+ ["mana"] = 100,
+ ["mana_max"] = 500,
+ ["fail"] = 30,
+ -- Uses piety to cast
+ ["piety"] = TRUE,
+ ["stat"] = A_WIS,
+ ["random"] = SKILL_SPIRITUALITY,
+ ["spell"] = function()
+ local dur = get_level(MANWE_SHIELD, 50) + 10 + randint(20)
+ local obvious
+
+ obvious = set_protevil(dur)
+ if get_level(MANWE_SHIELD) >= 10 then
+ local type
+
+ type = 0
+ if get_level(MANWE_SHIELD) >= 20 then
+ type = SHIELD_COUNTER
+ end
+ obvious = is_obvious(set_shield(dur, get_level(MANWE_SHIELD, 30), type, 1 + get_level(MANWE_SHIELD, 2), 1 + get_level(MANWE_SHIELD, 6)), obvious)
+ end
+ return obvious
+ end,
+ ["info"] = function()
+ local desc = "dur "..(get_level(MANWE_SHIELD, 50) + 10).."+d20"
+
+ if get_level(MANWE_SHIELD) >= 10 then
+ desc = desc.." AC "..(get_level(MANWE_SHIELD, 30))
+ end
+ if get_level(MANWE_SHIELD) >= 20 then
+ desc = desc.." dam "..(1 + get_level(MANWE_SHIELD, 2)).."d"..(1 + get_level(MANWE_SHIELD, 6))
+ end
+ return desc
+ end,
+ ["desc"] = {
+ "It surrounds you with a shield of wind that deflects blows from evil monsters",
+ "At level 10 it increases your armour rating",
+ "At level 20 it retaliates against monsters that melee you",
+ }
+}
+
+MANWE_AVATAR = add_spell
+{
+ ["name"] = "Avatar",
+ ["school"] = {SCHOOL_MANWE},
+ ["level"] = 35,
+ ["mana"] = 1000,
+ ["mana_max"] = 1000,
+ ["fail"] = 80,
+ -- Uses piety to cast
+ ["piety"] = TRUE,
+ ["stat"] = A_WIS,
+ ["random"] = SKILL_SPIRITUALITY,
+ ["spell"] = function()
+ return set_mimic(get_level(MANWE_AVATAR, 20) + randint(10), resolve_mimic_name("Maia"), player.lev)
+ end,
+ ["info"] = function()
+ return "dur "..(get_level(MANWE_AVATAR, 20)).."+d10"
+ end,
+ ["desc"] = {
+ "It turns you into a full grown Maia",
+ }
+}
+
+MANWE_BLESS = add_spell
+{
+ ["name"] = "Manwe's Blessing",
+ ["school"] = {SCHOOL_MANWE},
+ ["level"] = 1,
+ ["mana"] = 10,
+ ["mana_max"] = 100,
+ ["fail"] = 20,
+ -- Uses piety to cast
+ ["piety"] = TRUE,
+ ["stat"] = A_WIS,
+ ["random"] = SKILL_SPIRITUALITY,
+ ["spell"] = function()
+ local dur = get_level(MANWE_BLESS, 70) + 30 + randint(40)
+ local obvious
+
+ obvious = set_blessed(dur)
+ obvious = is_obvious(set_afraid(0), obvious)
+ obvious = is_obvious(set_lite(0), obvious)
+ if get_level(MANWE_BLESS) >= 10 then
+ obvious = is_obvious(set_hero(dur), obvious)
+ end
+ if get_level(MANWE_BLESS) >= 20 then
+ obvious = is_obvious(set_shero(dur), obvious)
+ end
+ if get_level(MANWE_BLESS) >= 30 then
+ obvious = is_obvious(set_holy(dur), obvious)
+ end
+ return obvious
+ end,
+ ["info"] = function()
+ return "dur "..(get_level(MANWE_BLESS, 70) + 30).."+d40"
+ end,
+ ["desc"] = {
+ "Manwe's Blessing removes your fears, blesses you and surrounds you with",
+ "holy light",
+ "At level 10 it also grants heroism",
+ "At level 20 it also grants super heroism",
+ "At level 30 it also grants holy luck and life protection",
+ }
+}
+
+MANWE_CALL = add_spell
+{
+ ["name"] = "Manwe's Call",
+ ["school"] = {SCHOOL_MANWE},
+ ["level"] = 20,
+ ["mana"] = 200,
+ ["mana_max"] = 500,
+ ["fail"] = 40,
+ -- Uses piety to cast
+ ["piety"] = TRUE,
+ ["stat"] = A_WIS,
+ ["random"] = SKILL_SPIRITUALITY,
+ ["spell"] = function()
+ local y, x, m_idx
+
+ y, x = find_position(player.py, player.px)
+ m_idx = place_monster_one(y, x, test_monster_name("Great eagle"), 0, FALSE, MSTATUS_FRIEND)
+
+ if m_idx ~= 0 then
+ monster_set_level(m_idx, 20 + get_level(MANWE_CALL, 70, 0))
+ return TRUE
+ end
+ end,
+ ["info"] = function()
+ return "level "..(get_level(MANWE_CALL, 70) + 20)
+ end,
+ ["desc"] = {
+ "Manwe's Call summons a Great Eagle to help you battle the forces",
+ "of Morgoth"
+ }
+}
diff --git a/lib/mods/theme/scpt/s_melkor.lua b/lib/mods/theme/scpt/s_melkor.lua
new file mode 100644
index 00000000..b2c693dd
--- /dev/null
+++ b/lib/mods/theme/scpt/s_melkor.lua
@@ -0,0 +1,154 @@
+-- handle the melkor school
+
+-- Not included in the spell code directly because I need to call it from somewhere else too
+function do_melkor_curse(who)
+ local m_ptr = monster(who)
+
+ if get_level(MELKOR_CURSE) >= 35 then
+ local r_ptr = race_info_idx(m_ptr.r_idx, m_ptr.ego)
+
+ m_ptr.maxhp = m_ptr.maxhp - r_ptr.hside;
+ if m_ptr.maxhp < 1 then m_ptr.maxhp = 1 end
+ if m_ptr.hp > m_ptr.maxhp then m_ptr.hp = m_ptr.maxhp end
+ player.redraw = bor(player.redraw, PR_HEALTH)
+ end
+ if get_level(MELKOR_CURSE) >= 25 then
+ m_ptr.speed = m_ptr.speed - get_level(MELKOR_CURSE, 7)
+ m_ptr.mspeed = m_ptr.mspeed - get_level(MELKOR_CURSE, 7)
+
+ if m_ptr.speed < 70 then m_ptr.speed = 70 end
+ if m_ptr.mspeed < 70 then m_ptr.mspeed = 70 end
+ end
+ if get_level(MELKOR_CURSE) >= 15 then
+ m_ptr.ac = m_ptr.ac - get_level(MELKOR_CURSE, 50)
+
+ if m_ptr.ac < -70 then m_ptr.ac = -70 end
+ end
+
+ local i, pow
+ i = 1
+ pow = get_level(MELKOR_CURSE, 2)
+ while (i <= 4) do
+ if m_ptr.blow[i].d_dice > 0 then
+ if m_ptr.blow[i].d_dice < pow then
+ pow = m_ptr.blow[i].d_dice
+ end
+ if m_ptr.blow[i].d_side < pow then
+ pow = m_ptr.blow[i].d_side
+ end
+ m_ptr.blow[i].d_dice = m_ptr.blow[i].d_dice - pow
+ end
+ i = i + 1
+ end
+
+ local m_name = monster_desc(m_ptr, 0).." looks weaker."
+ msg_print(strupper(strsub(m_name, 0, 1))..strsub(m_name, 2))
+
+ -- wake it
+ m_ptr.csleep = 0;
+end
+
+MELKOR_CURSE = add_spell
+{
+ ["name"] = "Curse",
+ ["school"] = {SCHOOL_MELKOR},
+ ["level"] = 1,
+ ["mana"] = 50,
+ ["mana_max"] = 300,
+ ["fail"] = 20,
+ -- Uses piety to cast
+ ["piety"] = TRUE,
+ ["stat"] = A_WIS,
+ ["random"] = SKILL_SPIRITUALITY,
+ ["spell"] = function()
+ local ret, dir = get_aim_dir()
+ if ret == FALSE then return end
+
+ if target_who == -1 then
+ msg_print("You must target a monster.")
+ else
+ do_melkor_curse(target_who)
+ end
+ return TRUE
+ end,
+ ["info"] = function()
+ return ""
+ end,
+ ["desc"] = {
+ "It curses a monster, reducing its melee power",
+ "At level 5 it can be auto-casted (with no piety cost) while fighting",
+ "At level 15 it also reduces armor",
+ "At level 25 it also reduces speed",
+ "At level 35 it also reduces max life (but it is never fatal)",
+ }
+}
+
+MELKOR_CORPSE_EXPLOSION = add_spell
+{
+ ["name"] = "Corpse Explosion",
+ ["school"] = {SCHOOL_MELKOR},
+ ["level"] = 10,
+ ["mana"] = 100,
+ ["mana_max"] = 500,
+ ["fail"] = 45,
+ -- Uses piety to cast
+ ["piety"] = TRUE,
+ ["stat"] = A_WIS,
+ ["random"] = SKILL_SPIRITUALITY,
+ ["spell"] = function()
+ return fire_ball(GF_CORPSE_EXPL, 0, 20 + get_level(MELKOR_CORPSE_EXPLOSION, 70), 2 + get_level(MELKOR_CORPSE_EXPLOSION, 5))
+ end,
+ ["info"] = function()
+ return "dam "..(20 + get_level(MELKOR_CORPSE_EXPLOSION, 70)).."%"
+ end,
+ ["desc"] = {
+ "It makes corpses in an area around you explode for a percent of their",
+ "hit points as damage",
+ }
+}
+
+MELKOR_MIND_STEAL = add_spell
+{
+ ["name"] = "Mind Steal",
+ ["school"] = {SCHOOL_MELKOR},
+ ["level"] = 20,
+ ["mana"] = 1000,
+ ["mana_max"] = 3000,
+ ["fail"] = 90,
+ -- Uses piety to cast
+ ["piety"] = TRUE,
+ ["stat"] = A_WIS,
+ ["random"] = SKILL_SPIRITUALITY,
+ ["spell"] = function()
+ local ret, dir = get_aim_dir()
+ if ret == FALSE then return end
+
+ if target_who == -1 then
+ msg_print("You must target a monster.")
+ else
+ local chance, m_ptr, r_ptr
+
+ m_ptr = monster(target_who)
+ r_ptr = race_info_idx(m_ptr.r_idx, m_ptr.ego)
+ chance = get_level(MELKOR_MIND_STEAL)
+ if (randint(m_ptr.level) < chance) and (band(r_ptr.flags1, RF1_UNIQUE) == 0) then
+ player.control = target_who
+ m_ptr.mflag = bor(m_ptr.mflag, MFLAG_CONTROL)
+
+ local m_name = monster_desc(m_ptr, 0).." falls under your control."
+ msg_print(strupper(strsub(m_name, 0, 1))..strsub(m_name, 2))
+ else
+ local m_name = monster_desc(m_ptr, 0).." resists."
+ msg_print(strupper(strsub(m_name, 0, 1))..strsub(m_name, 2))
+ end
+ return TRUE
+ end
+ end,
+ ["info"] = function()
+ return "chance 1d(mlvl)<"..(get_level(MELKOR_MIND_STEAL))
+ end,
+ ["desc"] = {
+ "It allows your spirit to temporarily leave your own body, which will",
+ "be vulnerable, to control one of your enemies body."
+ }
+}
diff --git a/lib/mods/theme/scpt/s_meta.lua b/lib/mods/theme/scpt/s_meta.lua
new file mode 100644
index 00000000..eab691d8
--- /dev/null
+++ b/lib/mods/theme/scpt/s_meta.lua
@@ -0,0 +1,287 @@
+-- handle the meta school
+
+RECHARGE = add_spell
+{
+ ["name"] = "Recharge",
+ ["school"] = {SCHOOL_META},
+ ["level"] = 5,
+ ["mana"] = 10,
+ ["mana_max"] = 100,
+ ["fail"] = 20,
+ ["spell"] = function()
+ return recharge(60 + get_level(RECHARGE, 140))
+ end,
+ ["info"] = function()
+ return "power "..(60 + get_level(RECHARGE, 140))
+ end,
+ ["desc"] = {
+ "Taps on the ambient mana to recharge an object's power (charges or mana)",
+ }
+}
+
+function get_spellbinder_max()
+ local i
+
+ i = get_level(SPELLBINDER, 4)
+ if i > 4 then i = 4 end
+ return i
+end
+--'
+SPELLBINDER = add_spell
+{
+ ["name"] = "Spellbinder",
+ ["school"] = {SCHOOL_META},
+ ["level"] = 20,
+ ["mana"] = 100,
+ ["mana_max"] = 300,
+ ["fail"] = 85,
+ ["spell"] = function()
+ local i, ret, c
+
+ if player.spellbinder_num ~= 0 then
+ local t =
+ {
+ [SPELLBINDER_HP75] = "75% HP",
+ [SPELLBINDER_HP50] = "50% HP",
+ [SPELLBINDER_HP25] = "25% HP",
+ }
+ msg_print("The spellbinder is already active.")
+ msg_print("It will trigger at "..t[player.spellbinder_trigger]..".")
+ msg_print("With the spells: ")
+ for i = 1, player.spellbinder_num do
+ msg_print(spell(player.spellbinder[i]).name)
+ end
+ return TRUE
+ end
+
+ ret, c = get_com("Trigger at [a]75% hp [b]50% hp [c]25% hp?", strbyte("a"))
+ if ret == FALSE then return TRUE end
+
+ if c == strbyte("a") then
+ player.spellbinder_trigger = SPELLBINDER_HP75
+ elseif c == strbyte("b") then
+ player.spellbinder_trigger = SPELLBINDER_HP50
+ elseif c == strbyte("c") then
+ player.spellbinder_trigger = SPELLBINDER_HP25
+ else
+ return
+ end
+ player.spellbinder_num = get_spellbinder_max()
+ i = player.spellbinder_num
+ while i > 0 do
+ local s
+
+ s = get_school_spell("bind", "is_ok_spell", 0)
+ if s == -1 then
+ player.spellbinder_trigger = 0
+ player.spellbinder_num = 0
+ return TRUE
+ else
+ if spell(s).skill_level > 7 + get_level(SPELLBINDER, 35) then
+ msg_print("You are only allowed spells with a base level of "..(7 + get_level(SPELLBINDER, 35))..".");
+ return TRUE
+ end
+ end
+ player.spellbinder[i] = s
+ i = i - 1
+ end
+ player.energy = player.energy - 3100;
+ msg_print("Spellbinder ready.")
+ return TRUE
+ end,
+ ["info"] = function()
+ return "number "..(get_spellbinder_max()).." max level "..(7 + get_level(SPELLBINDER, 35))
+ end,
+ ["desc"] = {
+ "Stores spells in a trigger.",
+ "When the condition is met all spells fire off at the same time",
+ "This spell takes a long time to cast so you are advised to prepare it",
+ "in a safe area.",
+ "Also it will use the mana for the Spellbinder and the mana for the",
+ "selected spells"
+ }
+}
+
+DISPERSEMAGIC = add_spell
+{
+ ["name"] = "Disperse Magic",
+ ["school"] = {SCHOOL_META},
+ ["level"] = 15,
+ ["mana"] = 30,
+ ["mana_max"] = 60,
+ ["fail"] = 40,
+ -- Unnafected by blindness
+ ["blind"] = FALSE,
+ -- Unnafected by confusion
+ ["confusion"] = FALSE,
+ ["stick"] =
+ {
+ ["charge"] = { 5, 5 },
+ [TV_WAND] =
+ {
+ ["rarity"] = 25,
+ ["base_level"] = { 1, 15 },
+ ["max_level"] = { 5, 40 },
+ },
+ },
+ ["inertia"] = { 1, 5 },
+ ["spell"] = function()
+ local obvious
+ obvious = set_blind(0)
+ obvious = is_obvious(set_lite(0), obvious)
+ if get_level(DISPERSEMAGIC, 50) >= 5 then
+ obvious = is_obvious(set_confused(0), obvious)
+ obvious = is_obvious(set_image(0), obvious)
+ end
+ if get_level(DISPERSEMAGIC, 50) >= 10 then
+ obvious = is_obvious(set_slow(0), obvious)
+ obvious = is_obvious(set_fast(0, 0), obvious)
+ obvious = is_obvious(set_light_speed(0), obvious)
+ end
+ if get_level(DISPERSEMAGIC, 50) >= 15 then
+ obvious = is_obvious(set_stun(0), obvious)
+ obvious = is_obvious(set_meditation(0), obvious)
+ obvious = is_obvious(set_cut(0), obvious)
+ end
+ if get_level(DISPERSEMAGIC, 50) >= 20 then
+ obvious = is_obvious(set_hero(0), obvious)
+ obvious = is_obvious(set_shero(0), obvious)
+ obvious = is_obvious(set_blessed(0), obvious)
+ obvious = is_obvious(set_shield(0, 0, 0, 0, 0), obvious)
+ obvious = is_obvious(set_afraid(0), obvious)
+ obvious = is_obvious(set_parasite(0, 0), obvious)
+ obvious = is_obvious(set_mimic(0, 0, 0), obvious)
+ end
+ return TRUE
+ end,
+ ["info"] = function()
+ return ""
+ end,
+ ["desc"] = {
+ "Dispels a lot of magic that can affect you, be it good or bad",
+ "Level 1: blindness and light",
+ "Level 5: confusion and hallucination",
+ "Level 10: speed (both bad or good) and light speed",
+ "Level 15: stunning, meditation, cuts",
+ "Level 20: hero, super hero, bless, shields, afraid, parasites, mimicry",
+ }
+}
+
+TRACKER = add_spell
+{
+ ["name"] = "Tracker",
+ ["school"] = {SCHOOL_META, SCHOOL_CONVEYANCE},
+ ["level"] = 30,
+ ["mana"] = 50,
+ ["mana_max"] = 50,
+ ["fail"] = 95,
+ ["spell"] = function()
+ if last_teleportation_y == -1 then
+ msg_print("There has not been any teleporatation here.")
+ return TRUE
+ end
+ teleport_player_to(last_teleportation_y, last_teleportation_x)
+ return TRUE
+ end,
+ ["info"] = function()
+ return ""
+ end,
+ ["desc"] = {
+ "Tracks down the last teleportation that happened on the level and teleports",
+ "you to it",
+ }
+}
+
+-- Saves the values of the timer
+save_timer("TIMER_INERTIA_CONTROL")
+add_loadsave("player.inertia_controlled_spell", -1)
+player.inertia_controlled_spell = -1
+
+-- Automatically cast the inertia controlled spells
+TIMER_INERTIA_CONTROL = new_timer
+{
+ ["enabled"] = FALSE,
+ ["delay"] = 10,
+ ["callback"] = function()
+ -- Don't cast a controlled spell in wilderness mode
+ if player.antimagic then
+ msg_print("Your anti-magic field disrupts any magic attempts.")
+ elseif player.anti_magic then
+ msg_print("Your anti-magic shell disrupts any magic attempts.")
+ elseif (player.inertia_controlled_spell ~= -1) and (player.wild_mode == FALSE) then
+ __spell_spell[player.inertia_controlled_spell]()
+ end
+ end,
+}
+
+stop_inertia_controlled_spell = function()
+ player.inertia_controlled_spell = -1
+ TIMER_INERTIA_CONTROL.enabled = FALSE
+ player.update = bor(player.update, PU_MANA)
+ return TRUE
+end
+
+add_hooks
+{
+ -- Reduce the mana by four times the cost of the spell
+ [HOOK_CALC_MANA] = function(msp)
+ if player.inertia_controlled_spell ~= -1 then
+ msp = msp - (get_mana(player.inertia_controlled_spell) * 4)
+ if msp < 0 then msp = 0 end
+ return TRUE, msp
+ end
+ end,
+
+ -- Stop a previous spell at birth
+ [HOOK_BIRTH_OBJECTS] = function()
+ stop_inertia_controlled_spell()
+ end,
+}
+
+INERTIA_CONTROL = add_spell
+{
+ ["name"] = "Inertia Control",
+ ["school"] = {SCHOOL_META},
+ ["level"] = 37,
+ ["mana"] = 300,
+ ["mana_max"] = 700,
+ ["fail"] = 95,
+ ["spell"] = function()
+ if player.inertia_controlled_spell ~= -1 then
+ msg_print("You cancel your inertia flow control.")
+ return stop_inertia_controlled_spell()
+ end
+
+ local s = get_school_spell("control", "is_ok_spell", 0)
+ if s == -1 then
+ return stop_inertia_controlled_spell()
+ end
+
+ local inertia = __tmp_spells[s].inertia
+
+ if inertia == nil then
+ msg_print("This spell inertia flow can not be controlled.")
+ return stop_inertia_controlled_spell()
+ end
+ if inertia[1] > get_level(INERTIA_CONTROL, 10) then
+ msg_print("This spell inertia flow("..inertia[1]..") is too strong to be controlled by your current spell.")
+ return stop_inertia_controlled_spell()
+ end
+
+ player.inertia_controlled_spell = s
+ TIMER_INERTIA_CONTROL.enabled = TRUE
+ TIMER_INERTIA_CONTROL.delay = inertia[2]
+ TIMER_INERTIA_CONTROL.countdown = TIMER_INERTIA_CONTROL.delay
+ player.update = bor(player.update, PU_MANA)
+ msg_print("Inertia flow controlling spell "..spell(s).name..".")
+ return TRUE
+ end,
+ ["info"] = function()
+ return "level "..get_level(INERTIA_CONTROL, 10)
+ end,
+ ["desc"] = {
+ "Changes the energy flow of a spell to be continuously recasted",
+ "at a given interval. The inertia controlled spell reduces your",
+ "maximum mana by four times its cost.",
+ }
+}
diff --git a/lib/mods/theme/scpt/s_mind.lua b/lib/mods/theme/scpt/s_mind.lua
new file mode 100644
index 00000000..d1b25e9e
--- /dev/null
+++ b/lib/mods/theme/scpt/s_mind.lua
@@ -0,0 +1,132 @@
+-- handle the mind school
+
+CHARM = add_spell
+{
+ ["name"] = "Charm",
+ ["school"] = {SCHOOL_MIND},
+ ["level"] = 1,
+ ["mana"] = 1,
+ ["mana_max"] = 20,
+ ["fail"] = 10,
+ ["stick"] =
+ {
+ ["charge"] = { 7, 5 },
+ [TV_WAND] =
+ {
+ ["rarity"] = 35,
+ ["base_level"] = { 1, 15 },
+ ["max_level"] = { 20, 40 },
+ },
+ },
+ ["spell"] = function()
+ if get_level(CHARM, 50) >= 35 then
+ return project_los(GF_CHARM, 10 + get_level(CHARM, 150))
+ elseif get_level(CHARM, 50) >= 15 then
+ local ret, dir = get_aim_dir()
+ if ret == FALSE then return end
+ return fire_ball(GF_CHARM, dir, 10 + get_level(CHARM, 150), 3)
+ else
+ local ret, dir = get_aim_dir()
+ if ret == FALSE then return end
+ return fire_bolt(GF_CHARM, dir, 10 + get_level(CHARM, 150))
+ end
+ end,
+ ["info"] = function()
+ return "power "..(10 + get_level(CHARM, 150))
+ end,
+ ["desc"] = {
+ "Tries to manipulate the mind of a monster to make it friendly",
+ "At level 15 it turns into a ball",
+ "At level 35 it affects all monsters in sight"
+ }
+}
+
+CONFUSE = add_spell
+{
+ ["name"] = "Confuse",
+ ["school"] = {SCHOOL_MIND},
+ ["level"] = 5,
+ ["mana"] = 5,
+ ["mana_max"] = 30,
+ ["fail"] = 20,
+ ["stick"] =
+ {
+ ["charge"] = { 3, 4 },
+ [TV_WAND] =
+ {
+ ["rarity"] = 45,
+ ["base_level"] = { 1, 5 },
+ ["max_level"] = { 20, 40 },
+ },
+ },
+ ["spell"] = function()
+ if get_level(CONFUSE, 50) >= 35 then
+ return project_los(GF_OLD_CONF, 10 + get_level(CONFUSE, 150))
+ elseif get_level(CONFUSE, 50) >= 15 then
+ local ret, dir = get_aim_dir()
+ if ret == FALSE then return end
+ return fire_ball(GF_OLD_CONF, dir, 10 + get_level(CONFUSE, 150), 3)
+ else
+ local ret, dir = get_aim_dir()
+ if ret == FALSE then return end
+ return fire_bolt(GF_OLD_CONF, dir, 10 + get_level(CONFUSE, 150))
+ end
+ end,
+ ["info"] = function()
+ return "power "..(10 + get_level(CONFUSE, 150))
+ end,
+ ["desc"] = {
+ "Tries to manipulate the mind of a monster to confuse it",
+ "At level 15 it turns into a ball",
+ "At level 35 it affects all monsters in sight"
+ }
+}
+
+ARMOROFFEAR = add_spell
+{
+ ["name"] = "Armor of Fear",
+ ["school"] = SCHOOL_MIND,
+ ["level"] = 10,
+ ["mana"] = 10,
+ ["mana_max"] = 50,
+ ["fail"] = 35,
+ ["inertia"] = { 2, 20 },
+ ["spell"] = function()
+ return set_shield(randint(10) + 10 + get_level(ARMOROFFEAR, 100), 10, SHIELD_FEAR, 1 + get_level(ARMOROFFEAR, 7), 5 + get_level(ARMOROFFEAR, 20))
+ end,
+ ["info"] = function()
+ return "dur "..(10 + get_level(ARMOROFFEAR, 100)).." power "..(1 + get_level(ARMOROFFEAR, 7)).."d"..(5 + get_level(ARMOROFFEAR, 20))
+ end,
+ ["desc"] = {
+ "Creates a shield of pure fear around you. Any monster attempting to hit you",
+ "must save or flee",
+ }
+}
+
+STUN = add_spell
+{
+ ["name"] = "Stun",
+ ["school"] = {SCHOOL_MIND},
+ ["level"] = 15,
+ ["mana"] = 10,
+ ["mana_max"] = 90,
+ ["fail"] = 45,
+ ["spell"] = function()
+ if get_level(STUN, 50) >= 20 then
+ local ret, dir = get_aim_dir()
+ if ret == FALSE then return end
+ return fire_ball(GF_STUN, dir, 10 + get_level(STUN, 150), 3)
+ else
+ local ret, dir = get_aim_dir()
+ if ret == FALSE then return end
+ return fire_bolt(GF_STUN, dir, 10 + get_level(STUN, 150))
+ end
+ end,
+ ["info"] = function()
+ return "power "..(10 + get_level(STUN, 150))
+ end,
+ ["desc"] = {
+ "Tries to manipulate the mind of a monster to stun it",
+ "At level 20 it turns into a ball",
+ }
+}
diff --git a/lib/mods/theme/scpt/s_music.lua b/lib/mods/theme/scpt/s_music.lua
new file mode 100644
index 00000000..9da6393a
--- /dev/null
+++ b/lib/mods/theme/scpt/s_music.lua
@@ -0,0 +1,443 @@
+-- handle the music school
+-- *ALL* lasting spell must return the mana cost in the lasting function
+
+MUSIC_STOP = add_spell
+{
+ ["name"] = "Stop singing(I)",
+ ["school"] = {SCHOOL_MUSIC},
+ ["level"] = 1,
+ ["mana"] = 0,
+ ["mana_max"] = 0,
+ ["fail"] = -400,
+ ["stat"] = A_CHR,
+ ["random"] = SKILL_MUSIC,
+ ["pval"] = 1,
+ ["blind"] = FALSE,
+ ["spell"] = function()
+ player.start_lasting_spell(0)
+ return TRUE
+ end,
+ ["info"] = function()
+ return ""
+ end,
+ ["desc"] = {
+ "Stops the current song, if any."
+ }
+}
+
+--- Drums
+MUSIC_HOLD = add_spell
+{
+ ["name"] = "Holding Pattern(I)",
+ ["school"] = {SCHOOL_MUSIC},
+ ["level"] = 1,
+ ["mana"] = 1,
+ ["mana_max"] = 10,
+ ["fail"] = 20,
+ ["stat"] = A_CHR,
+ ["random"] = SKILL_MUSIC,
+ ["pval"] = 1,
+ ["blind"] = FALSE,
+ ["lasting"] = function()
+ project_los(GF_OLD_SLOW, 10 + get_level(MUSIC_HOLD, 100))
+ return get_mana(MUSIC_HOLD)
+ end,
+ ["spell"] = function()
+ player.start_lasting_spell(MUSIC_HOLD)
+ return TRUE
+ end,
+ ["info"] = function()
+ return "power "..(10 + get_level(MUSIC_HOLD, 100))
+ end,
+ ["desc"] = {
+ "Slows down all monsters listening the song.",
+ "Consumes the amount of mana each turn.",
+ }
+}
+
+MUSIC_CONF = add_spell
+{
+ ["name"] = "Illusion Pattern(II)",
+ ["school"] = {SCHOOL_MUSIC},
+ ["level"] = 5,
+ ["mana"] = 2,
+ ["mana_max"] = 15,
+ ["fail"] = 30,
+ ["stat"] = A_CHR,
+ ["random"] = SKILL_MUSIC,
+ ["pval"] = 2,
+ ["blind"] = FALSE,
+ ["lasting"] = function()
+ project_los(GF_OLD_CONF, 10 + get_level(MUSIC_CONF, 100))
+ return get_mana(MUSIC_CONF)
+ end,
+ ["spell"] = function()
+ player.start_lasting_spell(MUSIC_CONF)
+ return TRUE
+ end,
+ ["info"] = function()
+ return "power "..(10 + get_level(MUSIC_CONF, 100))
+ end,
+ ["desc"] = {
+ "Tries to confuse all monsters listening the song.",
+ "Consumes the amount of mana each turn.",
+ }
+}
+
+MUSIC_STUN = add_spell
+{
+ ["name"] = "Stun Pattern(IV)",
+ ["school"] = {SCHOOL_MUSIC},
+ ["level"] = 10,
+ ["mana"] = 3,
+ ["mana_max"] = 25,
+ ["fail"] = 45,
+ ["stat"] = A_CHR,
+ ["random"] = SKILL_MUSIC,
+ ["pval"] = 4,
+ ["blind"] = FALSE,
+ ["lasting"] = function()
+ project_los(GF_STUN, 10 + get_level(MUSIC_STUN, 90))
+ return get_mana(MUSIC_STUN)
+ end,
+ ["spell"] = function()
+ player.start_lasting_spell(MUSIC_STUN)
+ return TRUE
+ end,
+ ["info"] = function()
+ return "power "..(10 + get_level(MUSIC_STUN, 90))
+ end,
+ ["desc"] = {
+ "Stuns all monsters listening the song.",
+ "Consumes the amount of mana each turn.",
+ }
+}
+
+--- Harps
+MUSIC_LITE = add_spell
+{
+ ["name"] = "Song of the Sun(I)",
+ ["school"] = {SCHOOL_MUSIC},
+ ["level"] = 1,
+ ["mana"] = 1,
+ ["mana_max"] = 1,
+ ["fail"] = 20,
+ ["stat"] = A_CHR,
+ ["random"] = SKILL_MUSIC,
+ ["blind"] = FALSE,
+ ["pval"] = 1,
+ ["lasting"] = function()
+ set_lite(5)
+ return 1
+ end,
+ ["spell"] = function()
+ player.start_lasting_spell(MUSIC_LITE)
+ return TRUE
+ end,
+ ["info"] = function()
+ return ""
+ end,
+ ["desc"] = {
+ "Provides light as long as you sing.",
+ "Consumes the amount of mana each turn.",
+ }
+}
+
+MUSIC_HEAL = add_spell
+{
+ ["name"] = "Flow of Life(II)",
+ ["school"] = {SCHOOL_MUSIC},
+ ["level"] = 7,
+ ["mana"] = 5,
+ ["mana_max"] = 30,
+ ["fail"] = 35,
+ ["stat"] = A_CHR,
+ ["random"] = SKILL_MUSIC,
+ ["pval"] = 2,
+ ["lasting"] = function()
+ hp_player(7 + get_level(MUSIC_HEAL, 100))
+ return get_mana(MUSIC_HEAL)
+ end,
+ ["spell"] = function()
+ player.start_lasting_spell(MUSIC_HEAL)
+ return TRUE
+ end,
+ ["info"] = function()
+ return "heal "..(7 + get_level(MUSIC_HEAL, 100)).."/turn"
+ end,
+ ["desc"] = {
+ "Heals you as long as you sing.",
+ "Consumes the amount of mana each turn.",
+ }
+}
+
+MUSIC_HERO = add_spell
+{
+ ["name"] = "Heroic Ballad(II)",
+ ["school"] = {SCHOOL_MUSIC},
+ ["level"] = 10,
+ ["mana"] = 4,
+ ["mana_max"] = 14,
+ ["fail"] = 45,
+ ["stat"] = A_CHR,
+ ["random"] = SKILL_MUSIC,
+ ["pval"] = 2,
+ ["lasting"] = function()
+ set_hero(5)
+ if get_level(MUSIC_HERO) >= 10 then
+ set_shero(5)
+ end
+ if get_level(MUSIC_HERO) >= 20 then
+ set_strike(5)
+ end
+ if get_level(MUSIC_HERO) >= 25 then
+ set_oppose_cc(5)
+ end
+ return get_mana(MUSIC_HERO)
+ end,
+ ["spell"] = function()
+ player.start_lasting_spell(MUSIC_HERO)
+ return TRUE
+ end,
+ ["info"] = function()
+ return ""
+ end,
+ ["desc"] = {
+ "Increases melee accuracy",
+ "At level 10 it increases it even more and reduces armour a bit",
+ "At level 20 it increases it again",
+ "At level 25 it grants protection against chaos and confusion",
+ "Consumes the amount of mana each turn.",
+ }
+}
+
+MUSIC_TIME = add_spell
+{
+ ["name"] = "Hobbit Melodies(III)",
+ ["school"] = {SCHOOL_MUSIC},
+ ["level"] = 20,
+ ["mana"] = 10,
+ ["mana_max"] = 30,
+ ["fail"] = 70,
+ ["stat"] = A_CHR,
+ ["random"] = SKILL_MUSIC,
+ ["pval"] = 3,
+ ["lasting"] = function()
+ set_shield(5, 10 + get_level(MUSIC_TIME, 50), 0, 0, 0)
+ if get_level(MUSIC_TIME) >= 15 then
+ set_fast(5, 7 + get_level(MUSIC_TIME, 10))
+ end
+ return get_mana(MUSIC_TIME)
+ end,
+ ["spell"] = function()
+ player.start_lasting_spell(MUSIC_TIME)
+ return TRUE
+ end,
+ ["info"] = function()
+ if get_level(MUSIC_TIME) >= 15 then
+ return "AC "..(10 + get_level(MUSIC_TIME, 50)).." speed "..(7 + get_level(MUSIC_TIME, 10))
+ else
+ return "AC "..(10 + get_level(MUSIC_TIME, 50))
+ end
+ end,
+ ["desc"] = {
+ "Greatly increases your reflexes allowing you to block more melee blows.",
+ "At level 15 it also makes you faster.",
+ "Consumes the amount of mana each turn.",
+ }
+}
+
+MUSIC_MIND = add_spell
+{
+ ["name"] = "Clairaudience(IV)",
+ ["school"] = {SCHOOL_MUSIC},
+ ["level"] = 25,
+ ["mana"] = 15,
+ ["mana_max"] = 30,
+ ["fail"] = 75,
+ ["stat"] = A_CHR,
+ ["random"] = SKILL_MUSIC,
+ ["pval"] = 4,
+ ["lasting"] = function()
+ set_tim_esp(5)
+ if get_level(MUSIC_MIND) >= 10 then
+ fire_ball(GF_IDENTIFY, 0, 1, 1 + get_level(MUSIC_MIND, 3, 0))
+ end
+ return get_mana(MUSIC_MIND)
+ end,
+ ["spell"] = function()
+ player.start_lasting_spell(MUSIC_MIND)
+ return TRUE
+ end,
+ ["info"] = function()
+ if get_level(MUSIC_MIND) >= 10 then
+ return "rad "..(1 + get_level(MUSIC_MIND, 3, 0))
+ else
+ return ""
+ end
+ end,
+ ["desc"] = {
+ "Allows you to sense monster minds as long as you sing.",
+ "At level 10 it identifies all objects in a radius on the floor,",
+ "as well as probing monsters in that radius.",
+ "Consumes the amount of mana each turn.",
+ }
+}
+
+--- Horns
+
+MUSIC_BLOW = add_spell
+{
+ ["name"] = "Blow(I)",
+ ["school"] = {SCHOOL_MUSIC},
+ ["level"] = 4,
+ ["mana"] = 3,
+ ["mana_max"] = 30,
+ ["fail"] = 20,
+ ["stat"] = A_CHR,
+ ["random"] = SKILL_MUSIC,
+ ["pval"] = 1,
+ ["spell"] = function()
+ fire_ball(GF_SOUND,
+ 0,
+ damroll(2 + get_level(MUSIC_BLOW, 10, 0), 4 + get_level(MUSIC_BLOW, 40, 0)),
+ 1 + get_level(MUSIC_BLOW, 12, 0)
+ )
+ return TRUE
+ end,
+ ["info"] = function()
+ return "dam "..(2 + get_level(MUSIC_BLOW, 10, 0)).."d"..(4 + get_level(MUSIC_BLOW, 40, 0)).." rad "..(1 + get_level(MUSIC_BLOW, 12, 0))
+ end,
+ ["desc"] = {
+ "Produces a powerful, blowing, sound all around you.",
+ }
+}
+
+MUSIC_WIND = add_spell
+{
+ ["name"] = "Gush of Wind(II)",
+ ["school"] = {SCHOOL_MUSIC},
+ ["level"] = 14,
+ ["mana"] = 15,
+ ["mana_max"] = 45,
+ ["fail"] = 30,
+ ["stat"] = A_CHR,
+ ["random"] = SKILL_MUSIC,
+ ["pval"] = 2,
+ ["spell"] = function()
+ fire_ball(GF_AWAY_ALL,
+ 0,
+ 10 + get_level(MUSIC_BLOW, 40, 0),
+ 1 + get_level(MUSIC_BLOW, 12, 0)
+ )
+ return TRUE
+ end,
+ ["info"] = function()
+ return "dist "..(10 + get_level(MUSIC_BLOW, 40, 0)).." rad "..(1 + get_level(MUSIC_BLOW, 12, 0))
+ end,
+ ["desc"] = {
+ "Produces a outgoing gush of wind that sends monsters away.",
+ }
+}
+
+MUSIC_YLMIR = add_spell
+{
+ ["name"] = "Horns of Ylmir(III)",
+ ["school"] = {SCHOOL_MUSIC},
+ ["level"] = 20,
+ ["mana"] = 25,
+ ["mana_max"] = 30,
+ ["fail"] = 20,
+ ["stat"] = A_CHR,
+ ["random"] = SKILL_MUSIC,
+ ["pval"] = 3,
+ ["spell"] = function()
+ earthquake(player.py, player.px, 2 + get_level(SHAKE, 10))
+ return TRUE
+ end,
+ ["info"] = function()
+ return "rad "..(2 + get_level(SHAKE, 10))
+ end,
+ ["desc"] = {
+ "Produces an earth shaking sound.",
+ }
+}
+
+MUSIC_AMBARKANTA = add_spell
+{
+ ["name"] = "Ambarkanta(IV)",
+ ["school"] = {SCHOOL_MUSIC},
+ ["level"] = 25,
+ ["mana"] = 70,
+ ["mana_max"] = 70,
+ ["fail"] = 60,
+ ["stat"] = A_CHR,
+ ["random"] = SKILL_MUSIC,
+ ["pval"] = 4,
+ ["spell"] = function()
+ alter_reality()
+ return TRUE
+ end,
+ ["info"] = function()
+ return ""
+ end,
+ ["desc"] = {
+ "Produces a reality shaking sound that transports you to a nearly",
+ "identical reality.",
+ }
+}
+
+
+--[[
+MUSIC_ = add_spell
+{
+ ["name"] = "(I)",
+ ["school"] = {SCHOOL_MUSIC},
+ ["level"] = 1,
+ ["mana"] = 0,
+ ["mana_max"] = 0,
+ ["fail"] = 20,
+ ["stat"] = A_CHR,
+ ["random"] = SKILL_MUSIC,
+ ["pval"] = 1,
+ ["lasting"] = function()
+ return get_mana(MUSIC_)
+ end,
+ ["spell"] = function()
+ player.start_lasting_spell(MUSIC_)
+ return TRUE
+ end,
+ ["info"] = function()
+ return ""
+ end,
+ ["desc"] = {
+ "",
+ "Consumes the amount of mana each turn.",
+ }
+}
+
+or
+
+MUSIC_ = add_spell
+{
+ ["name"] = "(I)",
+ ["school"] = {SCHOOL_MUSIC},
+ ["level"] = 1,
+ ["mana"] = 0,
+ ["mana_max"] = 0,
+ ["fail"] = 20,
+ ["stat"] = A_CHR,
+ ["random"] = SKILL_MUSIC,
+ ["pval"] = 1,
+ ["spell"] = function()
+
+ return TRUE
+ end,
+ ["info"] = function()
+ return ""
+ end,
+ ["desc"] = {
+ "",
+ }
+}
+]]
diff --git a/lib/mods/theme/scpt/s_nature.lua b/lib/mods/theme/scpt/s_nature.lua
new file mode 100644
index 00000000..3d44c569
--- /dev/null
+++ b/lib/mods/theme/scpt/s_nature.lua
@@ -0,0 +1,184 @@
+-- handle the nature school
+
+GROWTREE = add_spell
+{
+ ["name"] = "Grow Trees",
+ ["school"] = {SCHOOL_NATURE, SCHOOL_TEMPORAL},
+ ["level"] = 6,
+ ["mana"] = 6,
+ ["mana_max"] = 30,
+ ["fail"] = 35,
+ ["inertia"] = { 5, 50 },
+ ["spell"] = function()
+ grow_trees(2 + get_level(GROWTREE, 7))
+ return TRUE
+ end,
+ ["info"] = function()
+ return "rad "..(2 + get_level(GROWTREE, 7))
+ end,
+ ["desc"] = {
+ "Makes trees grow extremely quickly around you",
+ }
+}
+
+HEALING = add_spell
+{
+ ["name"] = "Healing",
+ ["school"] = {SCHOOL_NATURE},
+ ["level"] = 10,
+ ["mana"] = 15,
+ ["mana_max"] = 50,
+ ["fail"] = 45,
+ ["stick"] =
+ {
+ ["charge"] = { 2, 3 },
+ [TV_STAFF] =
+ {
+ ["rarity"] = 90,
+ ["base_level"] = { 1, 5 },
+ ["max_level"] = { 20, 40 },
+ },
+ },
+ ["spell"] = function()
+ return hp_player(player.mhp * (15 + get_level(HEALING, 35)) / 100)
+ end,
+ ["info"] = function()
+ return "heal "..(15 + get_level(HEALING, 35)).."% = "..(player.mhp * (15 + get_level(HEALING, 35)) / 100).."hp"
+ end,
+ ["desc"] = {
+ "Heals a percent of hitpoints",
+ }
+}
+
+RECOVERY = add_spell
+{
+ ["name"] = "Recovery",
+ ["school"] = {SCHOOL_NATURE},
+ ["level"] = 15,
+ ["mana"] = 10,
+ ["mana_max"] = 25,
+ ["fail"] = 60,
+ ["stick"] =
+ {
+ ["charge"] = { 5, 10 },
+ [TV_STAFF] =
+ {
+ ["rarity"] = 50,
+ ["base_level"] = { 1, 5 },
+ ["max_level"] = { 10, 30 },
+ },
+ },
+ ["inertia"] = { 2, 100 },
+ ["spell"] = function()
+ local obvious
+ obvious = set_poisoned(player.poisoned / 2)
+ if get_level(RECOVERY, 50) >= 5 then
+ obvious = is_obvious(set_poisoned(0), obvious)
+ obvious = is_obvious(set_cut(0), obvious)
+ end
+ if get_level(RECOVERY, 50) >= 10 then
+ obvious = is_obvious(do_res_stat(A_STR, TRUE), obvious)
+ obvious = is_obvious(do_res_stat(A_CON, TRUE), obvious)
+ obvious = is_obvious(do_res_stat(A_DEX, TRUE), obvious)
+ obvious = is_obvious(do_res_stat(A_WIS, TRUE), obvious)
+ obvious = is_obvious(do_res_stat(A_INT, TRUE), obvious)
+ obvious = is_obvious(do_res_stat(A_CHR, TRUE), obvious)
+ end
+ if get_level(RECOVERY, 50) >= 15 then
+ obvious = is_obvious(restore_level(), obvious)
+ end
+ return obvious
+ end,
+ ["info"] = function()
+ return ""
+ end,
+ ["desc"] = {
+ "Reduces the length of time that you are poisoned",
+ "At level 5 it cures poison and cuts",
+ "At level 10 it restores drained stats",
+ "At level 15 it restores lost experience"
+ }
+}
+
+REGENERATION = add_spell
+{
+ ["name"] = "Regeneration",
+ ["school"] = {SCHOOL_NATURE},
+ ["level"] = 20,
+ ["mana"] = 30,
+ ["mana_max"] = 55,
+ ["fail"] = 70,
+ ["inertia"] = { 4, 40 },
+ ["spell"] = function()
+ if player.tim_regen == 0 then return set_tim_regen(randint(10) + 5 + get_level(REGENERATION, 50), 300 + get_level(REGENERATION, 700)) end
+ end,
+ ["info"] = function()
+ return "dur "..(5 + get_level(REGENERATION, 50)).."+d10 power "..(300 + get_level(REGENERATION, 700))
+ end,
+ ["desc"] = {
+ "Increases your body's regeneration rate",
+ }
+}
+
+
+SUMMONANNIMAL = add_spell
+{
+ ["name"] = "Summon Animal",
+ ["school"] = {SCHOOL_NATURE},
+ ["level"] = 25,
+ ["mana"] = 25,
+ ["mana_max"] = 50,
+ ["fail"] = 90,
+ ["stick"] =
+ {
+ ["charge"] = { 1, 3 },
+ [TV_WAND] =
+ {
+ ["rarity"] = 85,
+ ["base_level"] = { 1, 5 },
+ ["max_level"] = { 15, 45 },
+ },
+ },
+ ["spell"] = function()
+ summon_specific_level = 25 + get_level(SUMMONANNIMAL, 50)
+ return summon_monster(player.py, player.px, dun_level, TRUE, SUMMON_ANIMAL)
+ end,
+ ["info"] = function()
+ return "level "..(25 + get_level(SUMMONANNIMAL, 50))
+ end,
+ ["desc"] = {
+ "Summons a leveled animal to your aid",
+ }
+}
+
+-- From T-Plus
+GROW_ATHELAS = add_spell {
+ ["name"] = "Grow Athelas",
+ ["school"] = {SCHOOL_NATURE},
+ ["level"] = 30,
+ ["mana"] = 60,
+ ["mana_max"] = 100,
+ ["fail"] = 95,
+ ["stick"] =
+ {
+ ["charge"] = { 1, 3 },
+ [TV_WAND] =
+ {
+ ["rarity"] = 85,
+ ["base_level"] = { 1, 5 },
+ ["max_level"] = { 15, 45 },
+ },
+ },
+ ["spell"] = function()
+ if (player.black_breath == TRUE) then
+ msg_print("The hold of the Black Breath on you is broken!")
+ player.black_breath = FALSE
+ end
+ end,
+ ["info"] = function()
+ return ""
+ end,
+ ["desc"] = {
+ "Cures the Black Breath",
+ }
+}
diff --git a/lib/mods/theme/scpt/s_stick.lua b/lib/mods/theme/scpt/s_stick.lua
new file mode 100644
index 00000000..9bbd641a
--- /dev/null
+++ b/lib/mods/theme/scpt/s_stick.lua
@@ -0,0 +1,494 @@
+-- Spells that are stick or artifacts/... only
+
+DEVICE_HEAL_MONSTER = add_spell
+{
+ ["name"] = "Heal Monster",
+ ["school"] = {SCHOOL_DEVICE},
+ ["level"] = 3,
+ ["mana"] = 5,
+ ["mana_max"] = 20,
+ ["fail"] = 15,
+ ["random"] = -1,
+ ["stick"] =
+ {
+ ["charge"] = { 10, 10 },
+ [TV_WAND] =
+ {
+ ["rarity"] = 17,
+ ["base_level"] = { 1, 15 },
+ ["max_level"] = { 20, 50 },
+ },
+ },
+ ["spell"] = function()
+ local ret, dir = get_aim_dir()
+ if ret == FALSE then return end
+
+ return fire_ball(GF_OLD_HEAL, dir, 20 + get_level(DEVICE_HEAL_MONSTER, 380), 0)
+ end,
+ ["info"] = function()
+ return "heal "..(20 + get_level(DEVICE_HEAL_MONSTER, 380))
+ end,
+ ["desc"] = {
+ "Heals a monster",
+ }
+}
+
+DEVICE_SPEED_MONSTER = add_spell
+{
+ ["name"] = "Haste Monster",
+ ["school"] = {SCHOOL_DEVICE},
+ ["level"] = 10,
+ ["mana"] = 10,
+ ["mana_max"] = 10,
+ ["fail"] = 30,
+ ["random"] = -1,
+ ["stick"] =
+ {
+ ["charge"] = { 10, 5 },
+ [TV_WAND] =
+ {
+ ["rarity"] = 7,
+ ["base_level"] = { 1, 1 },
+ ["max_level"] = { 20, 50 },
+ },
+ },
+ ["spell"] = function()
+ local ret, dir = get_aim_dir()
+ if ret == FALSE then return end
+
+ return fire_ball(GF_OLD_SPEED, dir, 1, 0)
+ end,
+ ["info"] = function()
+ return "speed +10"
+ end,
+ ["desc"] = {
+ "Haste a monster",
+ }
+}
+
+DEVICE_WISH = add_spell
+{
+ ["name"] = "Wish",
+ ["school"] = {SCHOOL_DEVICE},
+ ["level"] = 50,
+ ["mana"] = 400,
+ ["mana_max"] = 400,
+ ["fail"] = 99,
+ ["random"] = -1,
+ ["stick"] =
+ {
+ ["charge"] = { 1, 2 },
+ [TV_STAFF] =
+ {
+ ["rarity"] = 98,
+ ["base_level"] = { 1, 1 },
+ ["max_level"] = { 1, 1 },
+ },
+ },
+ ["spell"] = function()
+ make_wish()
+ return TRUE
+ end,
+ ["info"] = function()
+ return ""
+ end,
+ ["desc"] = {
+ "This grants you a wish, beware of what you ask for!",
+ }
+}
+
+DEVICE_SUMMON = add_spell
+{
+ ["name"] = "Summon",
+ ["school"] = {SCHOOL_DEVICE},
+ ["level"] = 5,
+ ["mana"] = 5,
+ ["mana_max"] = 25,
+ ["fail"] = 20,
+ ["random"] = -1,
+ ["stick"] =
+ {
+ ["charge"] = { 1, 20 },
+ [TV_STAFF] =
+ {
+ ["rarity"] = 13,
+ ["base_level"] = { 1, 40 },
+ ["max_level"] = { 25, 50 },
+ },
+ },
+ ["spell"] = function()
+ local i, obvious
+ obvious = nil
+ for i = 1, 4 + get_level(DEVICE_SUMMON, 30) do
+ obvious = is_obvious(summon_specific(player.py, player.px, dun_level, 0), obvious)
+ end
+ return obvious
+ end,
+ ["info"] = function()
+ return ""
+ end,
+ ["desc"] = {
+ "Summons hostile monsters near you",
+ }
+}
+
+DEVICE_MANA = add_spell
+{
+ ["name"] = "Mana",
+ ["school"] = {SCHOOL_DEVICE},
+ ["level"] = 30,
+ ["mana"] = 1,
+ ["mana_max"] = 1,
+ ["fail"] = 80,
+ ["random"] = -1,
+ ["stick"] =
+ {
+ ["charge"] = { 2, 3 },
+ [TV_STAFF] =
+ {
+ ["rarity"] = 78,
+ ["base_level"] = { 1, 5 },
+ ["max_level"] = { 20, 35 },
+ },
+ },
+ ["spell"] = function()
+ increase_mana((player.msp * (20 + get_level(DEVICE_MANA, 50))) / 100)
+ return TRUE
+ end,
+ ["info"] = function()
+ return "restore "..(20 + get_level(DEVICE_MANA, 50)).."%"
+ end,
+ ["desc"] = {
+ "Restores a part(or all) of your mana",
+ }
+}
+
+DEVICE_NOTHING = add_spell
+{
+ ["name"] = "Nothing",
+ ["school"] = {SCHOOL_DEVICE},
+ ["level"] = 1,
+ ["mana"] = 0,
+ ["mana_max"] = 0,
+ ["fail"] = 0,
+ ["random"] = -1,
+ ["stick"] =
+ {
+ ["charge"] = { 0, 0 },
+ [TV_WAND] =
+ {
+ ["rarity"] = 3,
+ ["base_level"] = { 1, 1 },
+ ["max_level"] = { 1, 1 },
+ },
+ [TV_STAFF] =
+ {
+ ["rarity"] = 3,
+ ["base_level"] = { 1, 1 },
+ ["max_level"] = { 1, 1},
+ },
+ },
+ ["spell"] = function()
+ return FALSE
+ end,
+ ["info"] = function()
+ return ""
+ end,
+ ["desc"] = {
+ "It does nothing.",
+ }
+}
+
+DEVICE_MAGGOT = add_spell
+{
+ ["name"] = "Artifact Maggot",
+ ["school"] = {SCHOOL_DEVICE},
+ ["level"] = 1,
+ ["mana"] = 7,
+ ["mana_max"] = 7,
+ ["fail"] = 20,
+ ["random"] = -1,
+ ["activate"] = { 10, 50 },
+ ["spell"] = function()
+ local ret, dir = get_aim_dir()
+ if ret == FALSE then return end
+ return fire_ball(GF_TURN_ALL, dir, 40, 2)
+ end,
+ ["info"] = function()
+ return "power 40 rad 2"
+ end,
+ ["desc"] = {
+ "terrify",
+ }
+}
+
+DEVICE_HOLY_FIRE = add_spell
+{
+ ["name"] = "Holy Fire of Mithrandir",
+ ["school"] = {SCHOOL_DEVICE},
+ ["level"] = 30,
+ ["mana"] = 50,
+ ["mana_max"] = 150,
+ ["fail"] = 75,
+ ["random"] = -1,
+ ["stick"] =
+ {
+ ["charge"] = { 2, 5 },
+ [TV_STAFF] =
+ {
+ -- Rarity higher than 100 to be sure to not have it generated randomly
+ ["rarity"] = 999,
+ ["base_level"] = { 1, 1 },
+ ["max_level"] = { 35, 35 },
+ },
+ },
+ ["spell"] = function()
+ return project_los(GF_HOLY_FIRE, 50 + get_level(DEVICE_HOLY_FIRE, 300))
+ end,
+ ["info"] = function()
+ return "dam "..(50 + get_level(DEVICE_HOLY_FIRE, 250))
+ end,
+ ["desc"] = {
+ "The Holy Fire created by this staff will deeply(double damage) burn",
+ "all that is evil.",
+ }
+}
+
+-- Ok the Eternal Flame, to craete one of the 4 ultimate arts
+-- needed to enter the last level of the Void
+DEVICE_ETERNAL_FLAME = add_spell
+{
+ ["name"] = "Artifact Eternal Flame",
+ ["school"] = {SCHOOL_DEVICE},
+ ["level"] = 1,
+ ["mana"] = 0,
+ ["mana_max"] = 0,
+ ["fail"] = 0,
+ ["random"] = -1,
+ ["activate"] = { 0, 0 },
+ ["spell"] = function(flame_item)
+ local ret, item, obj
+
+ ret, item = get_item("Which object do you want to imbue?",
+ "You have no objects to imbue.",
+ bor(USE_INVEN),
+ function (obj)
+ if obj.name1 > 0 or obj.name2 > 0 then return FALSE end
+ if (obj.tval == TV_SWORD) and (obj.sval == SV_LONG_SWORD) then
+ return TRUE
+ elseif (obj.tval == TV_MSTAFF) and (obj.sval == SV_MSTAFF) then
+ return TRUE
+ elseif (obj.tval == TV_BOW) and (obj.sval == SV_HEAVY_XBOW) then
+ return TRUE
+ elseif (obj.tval == TV_DRAG_ARMOR) and (obj.sval == SV_DRAGON_POWER) then
+ return TRUE
+ elseif (obj.tval == TV_HAFTED) and (obj.sval == SV_LUCERN_HAMMER) then
+ return TRUE
+ elseif (obj.tval == TV_POLEARM) and (obj.sval == SV_TRIDENT) then
+ return TRUE
+ elseif (obj.tval == TV_AXE) and (obj.sval == SV_BATTLE_AXE) then
+ return TRUE
+ elseif (obj.tval == TV_BOW) and (obj.sval == SV_LONG_BOW) then
+ return TRUE
+ elseif (obj.tval == TV_BOOMERANG) and (obj.sval == SV_BOOM_METAL) then
+ return TRUE
+ elseif (obj.tval == TV_BOW) and (obj.sval == SV_SLING) then
+ return TRUE
+ elseif (obj.tval == TV_SWORD) and (obj.sval == SV_RAPIER) then
+ return TRUE
+ elseif (obj.tval == TV_AMULET) and (obj.sval == SV_AMULET_SPELL) then
+ return TRUE
+ end
+ return FALSE
+ end
+ )
+ if ret == FALSE then return FALSE end
+
+ obj = get_object(item)
+
+ if (obj.tval == TV_SWORD) and (obj.sval == SV_LONG_SWORD) then
+ obj.name1 = 147
+ elseif (obj.tval == TV_MSTAFF) and (obj.sval == SV_MSTAFF) then
+ obj.name1 = 127
+ elseif (obj.tval == TV_BOW) and (obj.sval == SV_HEAVY_XBOW) then
+ obj.name1 = 152
+ elseif (obj.tval == TV_DRAG_ARMOR) and (obj.sval == SV_DRAGON_POWER) then
+ obj.name1 = 17
+ elseif (obj.tval == TV_HAFTED) and (obj.sval == SV_LUCERN_HAMMER) then
+ obj.name1 = 241
+ elseif (obj.tval == TV_POLEARM) and (obj.sval == SV_TRIDENT) then
+ obj.name1 = 242
+ elseif (obj.tval == TV_AXE) and (obj.sval == SV_BROAD_AXE) then
+ obj.name1 = 243
+ elseif (obj.tval == TV_BOW) and (obj.sval == SV_LONG_BOW) then
+ obj.name1 = 245
+ elseif (obj.tval == TV_BOOMERANG) and (obj.sval == SV_BOOM_METAL) then
+ obj.name1 = 247
+ elseif (obj.tval == TV_BOW) and (obj.sval == SV_SLING) then
+ obj.name1 = 246
+ elseif (obj.tval == TV_SWORD) and (obj.sval == SV_RAPIER) then
+ obj.name1 = 244
+ elseif (obj.tval == TV_AMULET) and (obj.sval == SV_AMULET_SPELL) then
+ obj.name1 = 248
+ end
+ apply_magic(obj, -1, TRUE, TRUE, TRUE)
+
+ obj.found = OBJ_FOUND_SELFMADE
+
+ inven_item_increase(flame_item, -1)
+ inven_item_describe(flame_item)
+ inven_item_optimize(flame_item)
+
+ return TRUE
+ end,
+ ["info"] = function()
+ return ""
+ end,
+ ["desc"] = {
+ "Imbuing an object with the eternal fire",
+ }
+}
+
+DEVICE_THUNDERLORDS = add_spell
+{
+ ["name"] = "Artifact Thunderlords",
+ ["school"] = {SCHOOL_DEVICE},
+ ["level"] = 1,
+ ["mana"] = 1,
+ ["mana_max"] = 1,
+ ["fail"] = 20,
+ ["random"] = -1,
+ ["stick"] =
+ {
+ ["charge"] = { 5, 5 },
+ [TV_STAFF] =
+ {
+ -- Rarity higher than 100 to be sure to not have it generated randomly
+ ["rarity"] = 999,
+ ["base_level"] = { 1, 1 },
+ ["max_level"] = { 1, 1 },
+ },
+ },
+ ["spell"] = function()
+ if dun_level > 0 then
+ msg_print("As you blow the horn, an Eagle of Manwe appears overhead.")
+ recall_player(0, 1)
+ else
+ msg_print("You cannot use it there.")
+ end
+ return TRUE
+ end,
+ ["info"] = function()
+ return ""
+ end,
+ ["desc"] = {
+ "An Eagle of Manwe will appear to transport you quickly to the town.",
+ }
+}
+
+-- Two new spells from T-Plus by Ingeborg S. Norden, for artifact activations:
+
+DEVICE_RADAGAST = add_spell
+{
+ ["name"] = "Artifact Radagast",
+ ["school"] = {SCHOOL_DEVICE},
+ ["level"] = 1,
+ ["mana"] = 0,
+ ["mana_max"] = 0,
+ ["fail"] = 10,
+ ["random"] = -1,
+ ["activate"] = 15000,
+ ["spell"] = function()
+ msg_print(TERM_GREEN, "The staff's power cleanses you completely!")
+ remove_all_curse()
+ do_res_stat(A_STR, TRUE)
+ do_res_stat(A_CON, TRUE)
+ do_res_stat(A_DEX, TRUE)
+ do_res_stat(A_WIS, TRUE)
+ do_res_stat(A_INT, TRUE)
+ do_res_stat(A_CHR, TRUE)
+ restore_level()
+ clean_corruptions()
+ hp_player(5000)
+ heal_insanity(5000)
+ set_poisoned(0)
+ set_blind(0)
+ set_confused(0)
+ set_image(0)
+ set_stun(0)
+ set_cut(0)
+ set_parasite(0, 0)
+
+ if (player.black_breath) == TRUE then
+ msg_print("The hold of the Black Breath on you is broken!")
+ end
+ player.black_breath = FALSE
+
+ player.update = bor(player.update, PU_BONUS)
+ player.window = bor(player.window, PW_PLAYER)
+
+ return TRUE
+ end,
+
+ ["info"] = function()
+ return ""
+ end,
+
+ ["desc"] = {
+ "purity and health",
+ }
+}
+
+DEVICE_VALAROMA = add_spell
+{
+ ["name"] = "Artifact Valaroma",
+ ["school"] = {SCHOOL_DEVICE},
+ ["level"] = 1,
+ ["mana"] = 0,
+ ["mana_max"] = 0,
+ ["fail"] = 25,
+ ["random"] = -1,
+ ["activate"] = 250,
+ ["spell"] = function()
+ local power = 5 * player.lev
+ banish_evil(power)
+ return FALSE
+ end,
+ ["info"] = function()
+ return ""
+ end,
+ ["desc"] = {
+ "banish evil (level x5)",
+ }
+}
+--[[ Template
+DEVICE_ = add_spell
+{
+ ["name"] = "",
+ ["school"] = {SCHOOL_DEVICE},
+ ["level"] = 1,
+ ["mana"] = 2,
+ ["mana_max"] = 15,
+ ["fail"] = 10,
+ ["random"] = -1,
+ ["stick"] =
+ {
+ ["charge"] = { 10, 5 },
+ [TV_STAFF] =
+ {
+ ["rarity"] = 7,
+ ["base_level"] = { 1, 15 },
+ ["max_level"] = { 25, 50 },
+ },
+ },
+ ["spell"] = function()
+ return FALSE
+ end,
+ ["info"] = function()
+ return ""
+ end,
+ ["desc"] = {
+ "",
+ }
+}
+]]
diff --git a/lib/mods/theme/scpt/s_tempo.lua b/lib/mods/theme/scpt/s_tempo.lua
new file mode 100644
index 00000000..d3d2fbb5
--- /dev/null
+++ b/lib/mods/theme/scpt/s_tempo.lua
@@ -0,0 +1,162 @@
+-- Handles thhe temporal school
+
+
+MAGELOCK = add_spell
+{
+ ["name"] = "Magelock",
+ ["school"] = {SCHOOL_TEMPORAL},
+ ["level"] = 1,
+ ["mana"] = 1,
+ ["mana_max"] = 35,
+ ["fail"] = 10,
+ ["stick"] =
+ {
+ ["charge"] = { 7, 5 },
+ [TV_WAND] =
+ {
+ ["rarity"] = 30,
+ ["base_level"] = { 1, 5 },
+ ["max_level"] = { 15, 45 },
+ },
+ },
+ ["spell"] = function()
+ if get_level(MAGELOCK, 50) >= 30 then
+ local ret, x, y, c_ptr
+
+ if get_level(MAGELOCK, 50) >= 40 then
+ ret, x, y = tgt_pt()
+ if ret == FALSE then return end
+ if cave_is(cave(y, x), FF1_FLOOR) == FALSE or cave_is(cave(y, x), FF1_PERMANENT) == TRUE or los(player.py, player.px, y, x) == FALSE then
+ msg_print("You cannot place it there.")
+ return TRUE
+ end
+ else
+ y = player.py
+ x = player.px
+ end
+ cave_set_feat(y, x, 3)
+ return TRUE
+ else
+ ret, dir = get_aim_dir()
+ if ret == FALSE then return end
+ return wizard_lock(dir)
+ end
+ end,
+ ["info"] = function()
+ return ""
+ end,
+ ["desc"] = {
+ "Magically locks a door",
+ "At level 30 it creates a glyph of warding",
+ "At level 40 the glyph can be placed anywhere in the field of vision"
+ }
+}
+
+SLOWMONSTER = add_spell
+{
+ ["name"] = "Slow Monster",
+ ["school"] = {SCHOOL_TEMPORAL},
+ ["level"] = 10,
+ ["mana"] = 10,
+ ["mana_max"] = 15,
+ ["fail"] = 35,
+ ["stick"] =
+ {
+ ["charge"] = { 5, 5 },
+ [TV_WAND] =
+ {
+ ["rarity"] = 23,
+ ["base_level"] = { 1, 15 },
+ ["max_level"] = { 20, 50 },
+ },
+ },
+ ["spell"] = function()
+ local ret, dir
+
+ ret, dir = get_aim_dir()
+ if ret == FALSE then return end
+ if get_level(SLOWMONSTER, 50) >= 20 then
+ return fire_ball(GF_OLD_SLOW, dir, 40 + get_level(SLOWMONSTER, 160), 1)
+ else
+ return fire_bolt(GF_OLD_SLOW, dir, 40 + get_level(SLOWMONSTER, 160))
+ end
+ end,
+ ["info"] = function()
+ if get_level(SLOWMONSTER, 50) >= 20 then
+ return "power "..(40 + get_level(SLOWMONSTER, 160)).." rad 1"
+ else
+ return "power "..(40 + get_level(SLOWMONSTER, 160))
+ end
+ end,
+ ["desc"] = {
+ "Magically slows down the passing of time around a monster",
+ "At level 20 it affects a zone"
+ }
+}
+
+ESSENCESPEED = add_spell
+{
+ ["name"] = "Essence of Speed",
+ ["school"] = {SCHOOL_TEMPORAL},
+ ["level"] = 15,
+ ["mana"] = 20,
+ ["mana_max"] = 40,
+ ["fail"] = 50,
+ ["stick"] =
+ {
+ ["charge"] = { 3, 3 },
+ [TV_WAND] =
+ {
+ ["rarity"] = 80,
+ ["base_level"] = { 1, 1 },
+ ["max_level"] = { 10, 39 },
+ },
+ },
+ ["inertia"] = { 5, 20 },
+ ["spell"] = function()
+ if player.fast == 0 then return set_fast(10 + randint(10) + get_level(ESSENCESPEED, 50), 5 + get_level(ESSENCESPEED, 20)) end
+ end,
+ ["info"] = function()
+ return "dur "..(10 + get_level(ESSENCESPEED, 50)).."+d10 speed "..(5 + get_level(ESSENCESPEED, 20))
+ end,
+ ["desc"] = {
+ "Magically decreases the passing of time around you, making you move faster with",
+ "respect to the rest of the universe."
+ }
+}
+
+BANISHMENT = add_spell
+{
+ ["name"] = "Banishment",
+ ["school"] = {SCHOOL_TEMPORAL, SCHOOL_CONVEYANCE},
+ ["level"] = 30,
+ ["mana"] = 30,
+ ["mana_max"] = 40,
+ ["fail"] = 95,
+ ["stick"] =
+ {
+ ["charge"] = { 1, 3 },
+ [TV_WAND] =
+ {
+ ["rarity"] = 98,
+ ["base_level"] = { 1, 15 },
+ ["max_level"] = { 10, 36 },
+ },
+ },
+ ["inertia"] = { 5, 50 },
+ ["spell"] = function()
+ local obvious
+ obvious = project_los(GF_AWAY_ALL, 40 + get_level(BANISHMENT, 160))
+ if get_level(BANISHMENT, 50) >= 15 then
+ obvious = is_obvious(project_los(GF_STASIS, 20 + get_level(BANISHMENT, 120)), obvious)
+ end
+ return obvious
+ end,
+ ["info"] = function()
+ return "power "..(40 + get_level(BANISHMENT, 160))
+ end,
+ ["desc"] = {
+ "Disrupts the space/time continuum in your area and teleports all monsters away.",
+ "At level 15 it may also lock them in a time bubble for a while."
+ }
+}
diff --git a/lib/mods/theme/scpt/s_tulkas.lua b/lib/mods/theme/scpt/s_tulkas.lua
new file mode 100644
index 00000000..4afa8082
--- /dev/null
+++ b/lib/mods/theme/scpt/s_tulkas.lua
@@ -0,0 +1,81 @@
+-- Handle Tulkas magic school
+
+TULKAS_AIM = add_spell
+{
+ ["name"] = "Divine Aim",
+ ["school"] = {SCHOOL_TULKAS},
+ ["level"] = 1,
+ ["mana"] = 30,
+ ["mana_max"] = 500,
+ ["fail"] = 20,
+ -- Uses piety to cast
+ ["piety"] = TRUE,
+ ["stat"] = A_WIS,
+ ["random"] = SKILL_SPIRITUALITY,
+ ["spell"] = function()
+ local dur = get_level(TULKAS_AIM, 50) + randint(10)
+ local obvious
+
+ obvious = set_strike(dur)
+ if get_level(TULKAS_AIM) >= 20 then
+ obvious = is_obvious(set_tim_deadly(dur), obvious)
+ end
+ return obvious
+ end,
+ ["info"] = function()
+ return "dur "..(get_level(TULKAS_AIM, 50)).."+d10"
+ end,
+ ["desc"] = {
+ "It makes you more accurate in combat",
+ "At level 20 all your blows are critical hits",
+ }
+}
+
+TULKAS_WAVE = add_spell
+{
+ ["name"] = "Wave of Power",
+ ["school"] = {SCHOOL_TULKAS},
+ ["level"] = 20,
+ ["mana"] = 200,
+ ["mana_max"] = 200,
+ ["fail"] = 75,
+ -- Uses piety to cast
+ ["piety"] = TRUE,
+ ["stat"] = A_WIS,
+ ["random"] = SKILL_SPIRITUALITY,
+ ["spell"] = function()
+ local ret, dir = get_aim_dir()
+ if ret == FALSE then return end
+
+ return fire_bolt(GF_ATTACK, dir, get_level(TULKAS_WAVE, player.num_blow))
+ end,
+ ["info"] = function()
+ return "blows "..(get_level(TULKAS_WAVE, player.num_blow))
+ end,
+ ["desc"] = {
+ "It allows you to project a number of melee blows across a distance",
+ }
+}
+
+TULKAS_SPIN = add_spell
+{
+ ["name"] = "Whirlwind",
+ ["school"] = {SCHOOL_TULKAS},
+ ["level"] = 10,
+ ["mana"] = 100,
+ ["mana_max"] = 100,
+ ["fail"] = 45,
+ -- Uses piety to cast
+ ["piety"] = TRUE,
+ ["stat"] = A_WIS,
+ ["random"] = SKILL_SPIRITUALITY,
+ ["spell"] = function()
+ return fire_ball(GF_ATTACK, 0, 1, 1)
+ end,
+ ["info"] = function()
+ return ""
+ end,
+ ["desc"] = {
+ "It allows you to spin around and hit all monsters nearby",
+ }
+}
diff --git a/lib/mods/theme/scpt/s_udun.lua b/lib/mods/theme/scpt/s_udun.lua
new file mode 100644
index 00000000..c4266239
--- /dev/null
+++ b/lib/mods/theme/scpt/s_udun.lua
@@ -0,0 +1,180 @@
+-- handle the udun school
+
+DRAIN = add_spell
+{
+ ["name"] = "Drain",
+ ["school"] = {SCHOOL_UDUN, SCHOOL_MANA},
+ ["level"] = 1,
+ ["mana"] = 0,
+ ["mana_max"] = 0,
+ ["fail"] = 20,
+ ["spell"] = function()
+ local ret, item, obj, o_name, add
+
+ -- Ask for an item
+ ret, item = get_item("What item to drain?", "You have nothing you can drain", USE_INVEN,
+ function (obj)
+ if (obj.tval == TV_WAND) or (obj.tval == TV_ROD_MAIN) or (obj.tval == TV_STAFF) then
+ return TRUE
+ end
+ return FALSE
+ end
+ )
+
+ if ret == TRUE then
+ -- get the item
+ obj = get_object(item)
+
+ add = 0
+ if (obj.tval == TV_STAFF) or (obj.tval == TV_WAND) then
+ local kind = get_kind(obj)
+
+ add = kind.level * obj.pval * obj.number
+
+ -- Destroy it!
+ inven_item_increase(item, -99)
+ inven_item_describe(item)
+ inven_item_optimize(item)
+ end
+ if obj.tval == TV_ROD_MAIN then
+ add = obj.timeout
+ obj.timeout = 0;
+
+ --Combine / Reorder the pack (later)
+ player.notice = bor(player.notice, PN_COMBINE, PN_REORDER)
+ player.window = bor(player.window, PW_INVEN, PW_EQUIP, PW_PLAYER)
+ end
+ increase_mana(add)
+ end
+ return TRUE
+ end,
+ ["info"] = function()
+ return ""
+ end,
+ ["desc"] = {
+ "Drains the mana contained in wands, staves and rods to increase yours",
+ }
+}
+
+GENOCIDE = add_spell
+{
+ ["name"] = "Genocide",
+ ["school"] = {SCHOOL_UDUN, SCHOOL_NATURE},
+ ["level"] = 25,
+ ["mana"] = 50,
+ ["mana_max"] = 50,
+ ["fail"] = 90,
+ ["stick"] =
+ {
+ ["charge"] = { 2, 2 },
+ [TV_STAFF] =
+ {
+ ["rarity"] = 85,
+ ["base_level"] = { 1, 1 },
+ ["max_level"] = { 5, 15 },
+ },
+ },
+ ["spell"] = function()
+ local type
+
+ type = 0
+ if get_level(GENOCIDE) >= 10 then type = 1 end
+ if type == 0 then
+ genocide(TRUE)
+ return TRUE
+ else
+ if get_check("Genocide all monsters near you? ") == TRUE then
+ mass_genocide(TRUE)
+ else
+ genocide(TRUE)
+ end
+ return TRUE
+ end
+ end,
+ ["info"] = function()
+ return ""
+ end,
+ ["desc"] = {
+ "Genocides all monsters of a race on the level",
+ "At level 10 it can genocide all monsters near you"
+ }
+}
+
+WRAITHFORM = add_spell
+{
+ ["name"] = "Wraithform",
+ ["school"] = {SCHOOL_UDUN, SCHOOL_CONVEYANCE},
+ ["level"] = 30,
+ ["mana"] = 20,
+ ["mana_max"] = 40,
+ ["fail"] = 95,
+ ["inertia"] = { 4, 30 },
+ ["spell"] = function()
+ return set_shadow(randint(30) + 20 + get_level(WRAITHFORM, 40))
+ end,
+ ["info"] = function()
+ return "dur "..(20 + get_level(WRAITHFORM, 40)).."+d30"
+ end,
+ ["desc"] = {
+ "Turns you into an immaterial being",
+ }
+}
+
+FLAMEOFUDUN = add_spell
+{
+ ["name"] = "Flame of Udun",
+ ["school"] = {SCHOOL_UDUN, SCHOOL_FIRE},
+ ["level"] = 35,
+ ["mana"] = 70,
+ ["mana_max"] = 100,
+ ["fail"] = 95,
+ ["inertia"] = { 7, 15 },
+ ["spell"] = function()
+ return set_mimic(randint(15) + 5 + get_level(FLAMEOFUDUN, 30), resolve_mimic_name("Balrog"), get_level(FLAMEOFUDUN))
+ end,
+ ["info"] = function()
+ return "dur "..(5 + get_level(FLAMEOFUDUN, 30)).."+d15"
+ end,
+ ["desc"] = {
+ "Turns you into a powerful Balrog",
+ }
+}
+
+
+-- Return the number of Udun/Melkor spells in a given book
+function udun_in_book(sval, pval)
+ local i, y, index, sch, s
+
+ i = 0
+
+ -- Hack if the book is 255 it is a random book
+ if sval == 255 then
+ school_book[sval] = {pval}
+ end
+ -- Parse all spells
+ for index, s in school_book[sval] do
+ for index, sch in __spell_school[s] do
+ if sch == SCHOOL_UDUN then i = i + 1 end
+ if sch == SCHOOL_MELKOR then i = i + 1 end
+ end
+ end
+ return i
+end
+
+-- Return the total level of spells
+function levels_in_book(sval, pval)
+ local i, y, index, sch, s
+
+ i = 0
+
+ -- Hack if the book is 255 it is a random book
+ if sval == 255 then
+ school_book[sval] = {pval}
+ end
+
+ -- Parse all spells
+ for index, s in school_book[sval] do
+ i = i + __tmp_spells[s].level
+ end
+ return i
+end
diff --git a/lib/mods/theme/scpt/s_ulmo.lua b/lib/mods/theme/scpt/s_ulmo.lua
new file mode 100644
index 00000000..a2c24b29
--- /dev/null
+++ b/lib/mods/theme/scpt/s_ulmo.lua
@@ -0,0 +1,147 @@
+-- Spells for Ulmo's school
+
+BOOK_ULMO = 65
+
+-- "Song of Belegaer" copied from Geyser
+ULMO_BELEGAER = add_spell
+{
+ ["name"] = "Song of Belegaer",
+ ["school"] = SCHOOL_ULMO,
+ ["level"] = 1,
+ ["mana"] = 1,
+ ["mana_max"] = 100,
+ ["fail"] = 25,
+ ["piety"] = TRUE,
+ ["stat"] = A_WIS,
+ ["random"] = SKILL_SPIRITUALITY,
+ ["spell"] = function()
+ local ret, dir
+ ret, dir = get_aim_dir()
+ if ret == FALSE then return end
+ return fire_bolt_or_beam(2 * get_level(ULMO_BELEGAER, 85), GF_WATER, dir, damroll(get_geyser_damage()))
+ end,
+ ["info"] = function()
+ local n, d
+ n, d = get_geyser_damage()
+ return "dam "..n.."d"..d
+ end,
+ ["desc"] =
+ {
+ "Channels the power of the Great Sea into your fingertips.",
+ "Sometimes it can blast through its first target."
+ },
+}
+
+-- "Draught of Ulmonan" copied with tweaks from T-Plus Nature spell "Restore Body"
+ULMO_DRAUGHT_ULMONAN = add_spell
+{
+ ["name"] = "Draught of Ulmonan",
+ ["school"] = {SCHOOL_ULMO},
+ ["level"] = 15,
+ ["mana"] = 25,
+ ["mana_max"] = 200,
+ ["fail"] = 50,
+ ["piety"] = TRUE,
+ ["stat"] = A_WIS,
+ ["random"] = SKILL_SPIRITUALITY,
+ ["spell"] = function()
+ local level = get_level(ULMO_DRAUGHT_ULMONAN, 50)
+ local obvious = hp_player(5 * level)
+ obvious = is_obvious(set_poisoned(0), obvious)
+ obvious = is_obvious(set_cut(0), obvious)
+ obvious = is_obvious(set_stun(0), obvious)
+ obvious = is_obvious(set_blind(0), obvious)
+ if level >= 10 then
+ obvious = is_obvious(do_res_stat(A_STR, TRUE), obvious)
+ obvious = is_obvious(do_res_stat(A_CON, TRUE), obvious)
+ obvious = is_obvious(do_res_stat(A_DEX, TRUE), obvious)
+ end
+ if level >= 20 then
+ obvious = is_obvious(set_parasite(0, 0), obvious)
+ obvious = is_obvious(set_mimic(0, 0, 0), obvious)
+ end
+ return obvious
+ end,
+ ["info"] = function()
+ local level = get_level(ULMO_DRAUGHT_ULMONAN, 50)
+ return "cure "..(5 * level)
+ end,
+ ["desc"] = {
+ "Fills you with a draught with powerful curing effects,",
+ "prepared by Ulmo himself.",
+ "Level 1: blindness, poison, cuts and stunning",
+ "Level 10: drained STR, DEX and CON",
+ "Level 20: parasites and mimicry",
+ },
+}
+
+-- "Call of the Ulumuri" based on Call Blessed Soul from T-Plus
+ULMO_CALL_ULUMURI = add_spell
+
+{
+ ["name"] = "Call of the Ulumuri",
+ ["school"] = {SCHOOL_ULMO},
+ ["level"] = 20,
+ ["mana"] = 50,
+ ["mana_max"] = 300,
+ ["fail"] = 75,
+ ["piety"] = TRUE,
+ ["stat"] = A_WIS,
+ ["random"] = SKILL_SPIRITUALITY,
+ ["spell"] = function()
+ local y, x, m_idx
+ local summons =
+ {
+ test_monster_name("Water spirit"),
+ test_monster_name("Water elemental"),
+ }
+ y, x = find_position(player.py, player.px)
+ m_idx = place_monster_one(y, x, summons[rand_range(1, 2)], 0, FALSE, MSTATUS_FRIEND)
+ if m_idx ~= 0 then
+ monster_set_level(m_idx, 30 + get_level(ULMO_CALL_ULUMURI, 70, 0))
+ return TRUE
+ end
+ end,
+
+ ["info"] = function()
+ return "level "..(get_level(ULMO_CALL_ULUMURI, 70))
+ end,
+ ["desc"] = {
+ "Summons a leveled water spirit or elemental",
+ "to fight for you",
+
+ },
+}
+
+-- "Wrath of Ulmo" based on Firewall
+ULMO_WRATH = add_spell
+{
+ ["name"] = "Wrath of Ulmo",
+ ["school"] = {SCHOOL_ULMO},
+ ["level"] = 30,
+ ["mana"] = 100,
+ ["mana_max"] = 400,
+ ["fail"] = 95,
+ ["piety"] = TRUE,
+ ["stat"] = A_WIS,
+ ["random"] = SKILL_SPIRITUALITY,
+ ["spell"] = function()
+ local ret, dir, type
+ if (get_level(ULMO_WRATH, 50) >= 30) then
+ type = GF_WAVE
+ else
+ type = GF_WATER
+ end
+ ret, dir = get_aim_dir()
+ if ret == FALSE then return end
+ fire_wall(type, dir, 40 + get_level(ULMO_WRATH, 150), 10 + get_level(ULMO_WRATH, 14))
+ return TRUE
+ end,
+ ["info"] = function()
+ return "dam "..(40 + get_level(ULMO_WRATH, 150)).." dur "..(10 + get_level(ULMO_WRATH, 14))
+ end,
+ ["desc"] = {
+ "Conjures up a sea storm.",
+ "At level 30 it turns into a more forceful storm."
+ }
+} \ No newline at end of file
diff --git a/lib/mods/theme/scpt/s_varda.lua b/lib/mods/theme/scpt/s_varda.lua
new file mode 100644
index 00000000..f4f46a83
--- /dev/null
+++ b/lib/mods/theme/scpt/s_varda.lua
@@ -0,0 +1,140 @@
+-- Spells for Varda school (From Annals of Ea module)
+
+BOOK_VARDA = 64
+
+-- Holy light spell copied from Globe of Light
+VARDA_LIGHT_VALINOR = add_spell
+{
+ ["name"] = "Light of Valinor",
+ ["school"] = {SCHOOL_VARDA},
+ ["level"] = 1,
+ ["mana"] = 1,
+ ["mana_max"] = 100,
+ ["fail"] = 20,
+ ["piety"] = TRUE,
+ ["stat"] = A_WIS,
+ ["random"] = SKILL_SPIRITUALITY,
+ ["spell"] = function()
+ local obvious
+ if get_level(VARDA_LIGHT_VALINOR, 50) >= 3 then
+ obvious = lite_area(10, 4)
+ else
+ lite_room(player.py, player.px)
+ obvious = TRUE
+ end
+ if get_level(VARDA_LIGHT_VALINOR, 50) >= 15 then
+ obvious = is_obvious(fire_ball(GF_LITE, 0, 10 + get_level(VARDA_LIGHT_VALINOR, 100), 5 + get_level(GLOBELIGHT, 6)), obvious)
+ end
+ return obvious
+ end,
+ ["info"] = function()
+ if get_level(VARDA_LIGHT_VALINOR, 50) >= 15 then
+ return "dam "..(10 + get_level(VARDA_LIGHT_VALINOR, 100)).." rad "..(5 + get_level(VARDA_LIGHT_VALINOR, 6))
+ else
+ return ""
+ end
+ end,
+ ["desc"] = {
+ "Lights a room",
+ "At level 3 it starts damaging monsters",
+ "At level 15 it starts creating a more powerful kind of light",
+ }
+}
+
+VARDA_CALL_ALMAREN = add_spell
+{
+ ["name"] = "Call of Almaren",
+ ["school"] = {SCHOOL_VARDA},
+ ["level"] = 10,
+ ["mana"] = 5,
+ ["mana_max"] = 150,
+ ["fail"] = 20,
+ ["piety"] = TRUE,
+ ["stat"] = A_WIS,
+ ["random"] = SKILL_SPIRITUALITY,
+ ["spell"] = function()
+ local power = 5 * player.lev
+ if (get_level(VARDA_CALL_ALMAREN) >= 20) then
+ dispel_evil(power)
+ else
+ banish_evil(power)
+ end
+ return FALSE
+ end,
+ ["info"] = function()
+ return ""
+ end,
+ ["desc"] = {
+ "Banishes evil beings",
+ "At level 20 it dispels evil beings",
+ }
+}
+
+VARDA_EVENSTAR = add_spell
+{
+ ["name"] = "Evenstar",
+ ["school"] = {SCHOOL_VARDA},
+ ["level"] = 20,
+ ["mana"] = 20,
+ ["mana_max"] = 200,
+ ["fail"] = 20,
+ ["piety"] = TRUE,
+ ["stat"] = A_WIS,
+ ["random"] = SKILL_SPIRITUALITY,
+ ["spell"] = function()
+ if (get_level(VARDA_EVENSTAR) >= 40) then
+ -- Enlightenment
+ wiz_lite_extra()
+ -- Identify
+ identify_pack()
+ -- Self knowledge
+ self_knowledge()
+ else
+ wiz_lite_extra()
+ end
+ return FALSE
+ end,
+ ["info"] = function()
+ return ""
+ end,
+ ["desc"] = {
+ "Maps and lights the whole level.",
+ "At level 40 it maps and lights the whole level,",
+ "in addition to letting you know yourself better",
+ "and identifying your whole pack.",
+ }
+}
+
+VARDA_STARKINDLER = add_spell
+{
+ ["name"] = "Star Kindler",
+ ["school"] = {SCHOOL_VARDA},
+ ["level"] = 30,
+ ["mana"] = 50,
+ ["mana_max"] = 250,
+ ["fail"] = 20,
+ ["piety"] = TRUE,
+ ["stat"] = A_WIS,
+ ["random"] = SKILL_SPIRITUALITY,
+ ["spell"] = function()
+ local power = player.lev / 5
+ local ret, dir
+
+ ret, dir = get_aim_dir()
+
+ if ret == FALSE then return end
+ for i = 1, power do
+ fire_ball(GF_LITE, dir, 20 + get_level(VARDA_STARKINDLER, 100), 10)
+ end
+
+ return FALSE
+ end,
+ ["info"] = function()
+ local power = player.lev / 5
+ return "dam "..(20 + get_level(VARDA_STARKINDLER, 100)).." rad 10"
+ end,
+ ["desc"] = {
+ "Does multiple bursts of light damage.",
+ "The damage increases with level.",
+ }
+} \ No newline at end of file
diff --git a/lib/mods/theme/scpt/s_water.lua b/lib/mods/theme/scpt/s_water.lua
new file mode 100644
index 00000000..739b066b
--- /dev/null
+++ b/lib/mods/theme/scpt/s_water.lua
@@ -0,0 +1,154 @@
+-- handle the water school
+
+TIDALWAVE = add_spell
+{
+ ["name"] = "Tidal Wave",
+ ["school"] = {SCHOOL_WATER},
+ ["level"] = 16,
+ ["mana"] = 16,
+ ["mana_max"] = 40,
+ ["fail"] = 65,
+ ["stick"] =
+ {
+ ["charge"] = { 6, 5 },
+ [TV_WAND] =
+ {
+ ["rarity"] = 54,
+ ["base_level"] = { 1, 10 },
+ ["max_level"] = { 20, 50 },
+ },
+ },
+ ["inertia"] = { 4, 100 },
+ ["spell"] = function()
+ fire_wave(GF_WAVE, 0, 40 + get_level(TIDALWAVE, 200), 0, 6 + get_level(TIDALWAVE, 10), EFF_WAVE)
+ return TRUE
+ end,
+ ["info"] = function()
+ return "dam "..(40 + get_level(TIDALWAVE, 200)).." rad "..(6 + get_level(TIDALWAVE, 10))
+ end,
+ ["desc"] = {
+ "Summons a monstrous tidal wave that will expand and crush the",
+ "monsters under its mighty waves."
+ }
+}
+
+ICESTORM = add_spell
+{
+ ["name"] = "Ice Storm",
+ ["school"] = {SCHOOL_WATER},
+ ["level"] = 22,
+ ["mana"] = 30,
+ ["mana_max"] = 60,
+ ["fail"] = 80,
+ ["stick"] =
+ {
+ ["charge"] = { 3, 7 },
+ [TV_WAND] =
+ {
+ ["rarity"] = 65,
+ ["base_level"] = { 1, 5 },
+ ["max_level"] = { 25, 45 },
+ },
+ },
+ ["inertia"] = { 3, 40 },
+ ["spell"] = function()
+ local type
+
+ if get_level(ICESTORM, 50) >= 10 then type = GF_ICE
+ else type = GF_COLD end
+ fire_wave(type, 0, 80 + get_level(ICESTORM, 200), 1 + get_level(ICESTORM, 3, 0), 20 + get_level(ICESTORM, 70), EFF_STORM)
+ return TRUE
+ end,
+ ["info"] = function()
+ return "dam "..(80 + get_level(ICESTORM, 200)).." rad "..(1 + get_level(ICESTORM, 3, 0)).." dur "..(20 + get_level(ICESTORM, 70))
+ end,
+ ["desc"] = {
+ "Engulfs you in a storm of roaring cold that strikes your foes.",
+ "At level 10 it turns into shards of ice."
+ }
+}
+
+ENTPOTION = add_spell
+{
+ ["name"] = "Ent's Potion",
+ ["school"] = {SCHOOL_WATER},
+ ["level"] = 6,
+ ["mana"] = 7,
+ ["mana_max"] = 15,
+ ["fail"] = 35,
+ ["inertia"] = { 1, 30 },
+ ["spell"] = function()
+ set_food(PY_FOOD_MAX - 1)
+ msg_print("The Ent's Potion fills your stomach.")
+ if get_level(ENTPOTION, 50) >= 5 then
+ set_afraid(0)
+ end
+ if get_level(ENTPOTION, 50) >= 12 then
+ set_hero(player.hero + randint(25) + 25 + get_level(ENTPOTION, 40))
+ end
+ return TRUE
+ end,
+ ["info"] = function()
+ if get_level(ENTPOTION, 50) >= 12 then
+ return "dur "..(25 + get_level(ENTPOTION, 40)).."+d25"
+ else
+ return ""
+ end
+ end,
+ ["desc"] = {
+ "Fills up your stomach.",
+ "At level 5 it boldens your heart.",
+ "At level 12 it makes you heroic."
+ }
+}
+
+VAPOR = add_spell
+{
+ ["name"] = "Vapor",
+ ["school"] = {SCHOOL_WATER},
+ ["level"] = 2,
+ ["mana"] = 2,
+ ["mana_max"] = 12,
+ ["fail"] = 20,
+ ["inertia"] = { 1, 30 },
+ ["spell"] = function()
+ fire_cloud(GF_WATER, 0, 3 + get_level(VAPOR, 20), 3 + get_level(VAPOR, 9, 0), 5)
+ return TRUE
+ end,
+ ["info"] = function()
+ return "dam "..(3 + get_level(VAPOR, 20)).." rad "..(3 + get_level(VAPOR, 9, 0)).." dur 5"
+ end,
+ ["desc"] = {
+ "Fills the air with toxic moisture to eradicate annoying critters."
+ }
+}
+
+function get_geyser_damage()
+ return get_level(GEYSER, 10), 3 + get_level(GEYSER, 35)
+end
+
+GEYSER = add_spell
+{
+ ["name"] = "Geyser",
+ ["school"] = SCHOOL_WATER,
+ ["level"] = 1,
+ ["mana"] = 1,
+ ["mana_max"] = 35,
+ ["fail"] = 5,
+ ["spell"] = function()
+ local ret, dir
+ ret, dir = get_aim_dir()
+ if ret == FALSE then return end
+ return fire_bolt_or_beam(2 * get_level(GEYSER, 85), GF_WATER, dir, damroll(get_geyser_damage()))
+ end,
+ ["info"] = function()
+ local n, d
+ n, d = get_geyser_damage()
+ return "dam "..n.."d"..d
+ end,
+ ["desc"] =
+ {
+ "Shoots a geyser of water from your fingertips.",
+ "Sometimes it can blast through its first target."
+ },
+}
diff --git a/lib/mods/theme/scpt/s_yavann.lua b/lib/mods/theme/scpt/s_yavann.lua
new file mode 100644
index 00000000..2f594e85
--- /dev/null
+++ b/lib/mods/theme/scpt/s_yavann.lua
@@ -0,0 +1,157 @@
+-- Handle Yavanna kementari magic school
+
+YAVANNA_CHARM_ANIMAL = add_spell
+{
+ ["name"] = "Charm Animal",
+ ["school"] = {SCHOOL_YAVANNA},
+ ["level"] = 1,
+ ["mana"] = 10,
+ ["mana_max"] = 100,
+ ["fail"] = 30,
+ -- Uses piety to cast
+ ["piety"] = TRUE,
+ ["stat"] = A_WIS,
+ ["random"] = SKILL_SPIRITUALITY,
+ ["spell"] = function()
+ local ret, dir = get_aim_dir()
+ if ret == FALSE then return end
+
+ return fire_ball(GF_CONTROL_ANIMAL, dir, 10 + get_level(YAVANNA_CHARM_ANIMAL, 170), get_level(YAVANNA_CHARM_ANIMAL, 2))
+ end,
+ ["info"] = function()
+ return "power "..(10 + get_level(YAVANNA_CHARM_ANIMAL, 170)).." rad "..(get_level(YAVANNA_CHARM_ANIMAL, 2))
+ end,
+ ["desc"] = {
+ "It tries to tame an animal",
+ }
+}
+
+YAVANNA_GROW_GRASS = add_spell
+{
+ ["name"] = "Grow Grass",
+ ["school"] = {SCHOOL_YAVANNA},
+ ["level"] = 10,
+ ["mana"] = 70,
+ ["mana_max"] = 150,
+ ["fail"] = 65,
+ -- Uses piety to cast
+ ["piety"] = TRUE,
+ ["stat"] = A_WIS,
+ ["random"] = SKILL_SPIRITUALITY,
+ ["spell"] = function()
+ grow_grass(get_level(YAVANNA_GROW_GRASS, 4))
+ return TRUE
+ end,
+ ["info"] = function()
+ return "rad "..(get_level(YAVANNA_GROW_GRASS, 4))
+ end,
+ ["desc"] = {
+ "Create a floor of grass around you. While on grass and praying",
+ "a worshipper of Yavanna will know a greater regeneration rate"
+ }
+}
+
+YAVANNA_TREE_ROOTS = add_spell
+{
+ ["name"] = "Tree Roots",
+ ["school"] = {SCHOOL_YAVANNA},
+ ["level"] = 15,
+ ["mana"] = 50,
+ ["mana_max"] = 1000,
+ ["fail"] = 70,
+ -- Uses piety to cast
+ ["piety"] = TRUE,
+ ["stat"] = A_WIS,
+ ["random"] = SKILL_SPIRITUALITY,
+ ["spell"] = function()
+ return set_roots(10 + get_level(YAVANNA_TREE_ROOTS, 30), 10 + get_level(YAVANNA_TREE_ROOTS, 60), 10 + get_level(YAVANNA_TREE_ROOTS, 20))
+ end,
+ ["info"] = function()
+ return "dur "..(10 + get_level(YAVANNA_TREE_ROOTS, 30)).." AC "..(10 + get_level(YAVANNA_TREE_ROOTS, 60)).." dam "..(10 + get_level(YAVANNA_TREE_ROOTS, 20))
+ end,
+ ["desc"] = {
+ "Creates roots deep in the floor from your feet, making you more stable and able",
+ "to make stronger attacks, but prevents any movement (even teleportation).",
+ "It also makes you recover from stunning almost immediately."
+ }
+}
+
+YAVANNA_WATER_BITE = add_spell
+{
+ ["name"] = "Water Bite",
+ ["school"] = {SCHOOL_YAVANNA},
+ ["level"] = 20,
+ ["mana"] = 150,
+ ["mana_max"] = 300,
+ ["fail"] = 90,
+ -- Uses piety to cast
+ ["piety"] = TRUE,
+ ["stat"] = A_WIS,
+ ["random"] = SKILL_SPIRITUALITY,
+ ["spell"] = function()
+ local rad
+
+ rad = 0
+ if get_level(YAVANNA_WATER_BITE) >= 25 then rad = 1 end
+
+ return set_project(randint(30) + 30 + get_level(YAVANNA_WATER_BITE, 150),
+ GF_WATER,
+ 10 + get_level(YAVANNA_WATER_BITE),
+ rad,
+ bor(PROJECT_STOP, PROJECT_KILL))
+ end,
+ ["info"] = function()
+ return "dur "..(30 + get_level(YAVANNA_WATER_BITE, 150)).."+d30 dam "..(10 + get_level(YAVANNA_WATER_BITE)).."/blow"
+ end,
+ ["desc"] = {
+ "Imbues your melee weapon with a natural stream of water",
+ "At level 25, it spreads over a 1 radius zone around your target"
+ }
+}
+
+YAVANNA_UPROOT = add_spell
+{
+ ["name"] = "Uproot",
+ ["school"] = {SCHOOL_YAVANNA},
+ ["level"] = 35,
+ ["mana"] = 250,
+ ["mana_max"] = 350,
+ ["fail"] = 95,
+ -- Uses piety to cast
+ ["piety"] = TRUE,
+ ["stat"] = A_WIS,
+ ["random"] = SKILL_SPIRITUALITY,
+ ["spell"] = function()
+ local m_idx, x, y, c_ptr, ret, dir
+
+ ret, dir = get_rep_dir()
+ if ret == FALSE then return end
+ y, x = explode_dir(dir)
+ y, x = y + player.py, x + player.px
+ c_ptr = cave(y, x)
+
+ if c_ptr.feat == FEAT_TREES then
+ cave_set_feat(y, x, FEAT_GRASS);
+
+ -- Summon it
+ y, x = find_position(y, x)
+ m_idx = place_monster_one(y, x, test_monster_name("Ent"), 0, FALSE, MSTATUS_FRIEND)
+
+ -- level it
+ if m_idx ~= 0 then
+ monster_set_level(m_idx, 30 + get_level(YAVANNA_UPROOT, 70))
+ end
+
+ msg_print("The tree awakes!");
+ else
+ msg_print("There is no tree there.")
+ end
+ return TRUE
+ end,
+ ["info"] = function()
+ return "lev "..(30 + get_level(YAVANNA_UPROOT, 70))
+ end,
+ ["desc"] = {
+ "Awakes a tree to help you battle the forces of Morgoth",
+ }
+}
diff --git a/lib/mods/theme/scpt/spells.lua b/lib/mods/theme/scpt/spells.lua
new file mode 100644
index 00000000..838240a3
--- /dev/null
+++ b/lib/mods/theme/scpt/spells.lua
@@ -0,0 +1,627 @@
+--
+-- This file takes care of the schools of magic
+--
+
+-- Create the schools
+SCHOOL_MANA = add_school
+{
+ ["name"] = "Mana",
+ ["skill"] = SKILL_MANA,
+ ["spell_power"] = TRUE,
+ ["sorcery"] = TRUE,
+ ["gods"] =
+ {
+ -- Varda provides the Mana school at 1/4 the prayer skill
+ [GOD_VARDA] =
+ {
+ ["skill"] = SKILL_PRAY,
+ ["mul"] = 1,
+ ["div"] = 4,
+ },
+ -- Eru Iluvatar provides the Mana school at half the prayer skill
+ [GOD_ERU] =
+ {
+ ["skill"] = SKILL_PRAY,
+ ["mul"] = 1,
+ ["div"] = 2,
+ },
+ },
+ ["hooks"] =
+ {
+ [HOOK_CALC_MANA] = function(msp)
+ if get_skill(SKILL_MANA) >= 35 then
+ msp = msp + (msp * ((get_skill(SKILL_MANA) - 34)) / 100)
+ return TRUE, msp
+ end
+ end
+ },
+}
+SCHOOL_FIRE = add_school
+{
+ ["name"] = "Fire",
+ ["skill"] = SKILL_FIRE,
+ ["spell_power"] = TRUE,
+ ["sorcery"] = TRUE,
+ ["hooks"] =
+ {
+ [HOOK_CALC_BONUS] = function()
+ if get_skill(SKILL_FIRE) >= 35 then
+ end
+ end,
+ [HOOK_CALC_POWERS] = function()
+ if get_skill(SKILL_FIRE) >= 50 then
+-- player.add_power(PWR_FIRE_SHAPE)
+ end
+ end,
+ },
+ ["gods"] =
+ {
+ -- Aule provides the Fire school at 3/5 the prayer skill
+ [GOD_AULE] =
+ {
+ ["skill"] = SKILL_PRAY,
+ ["mul"] = 3,
+ ["div"] = 5,
+ },
+ },
+}
+SCHOOL_AIR = add_school
+{
+ ["name"] = "Air",
+ ["skill"] = SKILL_AIR,
+ ["spell_power"] = TRUE,
+ ["sorcery"] = TRUE,
+ ["hooks"] =
+ {
+ [HOOK_CALC_BONUS] = function()
+ if get_skill(SKILL_AIR) >= 50 then
+ player.magical_breath = TRUE
+ end
+ end,
+ [HOOK_CALC_POWERS] = function()
+ if get_skill(SKILL_AIR) >= 50 then
+-- player.add_powe(PWR_AIR_SHAPE)
+ end
+ end,
+ },
+ ["gods"] =
+ {
+ -- Manwe Sulimo provides the Air school at 2/3 the prayer skill
+ [GOD_MANWE] =
+ {
+ ["skill"] = SKILL_PRAY,
+ ["mul"] = 2,
+ ["div"] = 3,
+ },
+ },
+}
+SCHOOL_WATER = add_school
+{
+ ["name"] = "Water",
+ ["skill"] = SKILL_WATER,
+ ["spell_power"] = TRUE,
+ ["sorcery"] = TRUE,
+ ["hooks"] =
+ {
+ [HOOK_CALC_BONUS] = function()
+ if get_skill(SKILL_WATER) >= 30 then
+ player.water_breath = TRUE
+ end
+ end,
+ [HOOK_CALC_POWERS] = function()
+ if get_skill(SKILL_WATER) >= 50 then
+-- player.add_powe(PWR_WATER_SHAPE)
+ end
+ end,
+ },
+ ["gods"] =
+ {
+ -- Yavanna Kementari provides the Water school at 1/2 the prayer skill
+ [GOD_YAVANNA] =
+ {
+ ["skill"] = SKILL_PRAY,
+ ["mul"] = 1,
+ ["div"] = 2,
+ },
+ -- Ulmo provides the Water school at 3/5 the prayer skill
+ [GOD_ULMO] =
+ {
+ ["skill"] = SKILL_PRAY,
+ ["mul"] = 3,
+ ["div"] = 5,
+ },
+ },
+}
+SCHOOL_EARTH = add_school
+{
+ ["name"] = "Earth",
+ ["skill"] = SKILL_EARTH,
+ ["spell_power"] = TRUE,
+ ["sorcery"] = TRUE,
+ ["hooks"] =
+ {
+ [HOOK_CALC_POWERS] = function()
+ if get_skill(SKILL_EARTH) >= 50 then
+-- player.add_powe(PWR_EARTH_SHAPE)
+ end
+ end,
+ },
+ ["gods"] =
+ {
+ -- Tulkas provides the Earth school at 4/5 the prayer skill
+ [GOD_TULKAS] =
+ {
+ ["skill"] = SKILL_PRAY,
+ ["mul"] = 4,
+ ["div"] = 5,
+ },
+ -- Yavanna Kementari provides the Earth school at 1/2 the prayer skill
+ [GOD_YAVANNA] =
+ {
+ ["skill"] = SKILL_PRAY,
+ ["mul"] = 1,
+ ["div"] = 2,
+ },
+
+ -- Aule provides the Earth school at 1/3 the prayer skill
+ [GOD_AULE] =
+ {
+ ["skill"] = SKILL_PRAY,
+ ["mul"] = 1,
+ ["div"] = 3,
+ },
+ },
+}
+SCHOOL_CONVEYANCE = add_school
+{
+ ["name"] = "Conveyance",
+ ["skill"] = SKILL_CONVEYANCE,
+ ["spell_power"] = TRUE,
+ ["sorcery"] = TRUE,
+ ["gods"] =
+ {
+ -- Manwe Sulimo provides the Conveyance school at 1/2 the prayer skill
+ [GOD_MANWE] =
+ {
+ ["skill"] = SKILL_PRAY,
+ ["mul"] = 1,
+ ["div"] = 2,
+ },
+ },
+}
+SCHOOL_GEOMANCY = add_school
+{
+ ["name"] = "Geomancy",
+ ["skill"] = SKILL_GEOMANCY,
+ ["spell_power"] = TRUE,
+ -- Require to wield a Mage Staff, as the spells requries the caster to stomp the floor with it
+ ["depend"] = function()
+ -- Require at least one point in each school
+ if get_skill(SKILL_FIRE) == 0 then return end
+ if get_skill(SKILL_AIR) == 0 then return end
+ if get_skill(SKILL_EARTH) == 0 then return end
+ if get_skill(SKILL_WATER) == 0 then return end
+
+ local obj = get_object(INVEN_WIELD)
+ if (obj.k_idx > 0) and (obj.tval == TV_MSTAFF) then return TRUE end
+ end,
+}
+SCHOOL_DIVINATION = add_school
+{
+ ["name"] = "Divination",
+ ["skill"] = SKILL_DIVINATION,
+ ["spell_power"] = TRUE,
+ ["sorcery"] = TRUE,
+ ["gods"] =
+ {
+ -- Eru Iluvatar provides the Divination school at 2/3 the prayer skill
+ [GOD_ERU] =
+ {
+ ["skill"] = SKILL_PRAY,
+ ["mul"] = 2,
+ ["div"] = 3,
+ },
+ -- Mandos the Divination school at 1/3 the prayer skill
+ [GOD_MANDOS] =
+ {
+ ["skill"] = SKILL_PRAY,
+ ["mul"] = 1,
+ ["div"] = 3,
+ },
+ },
+}
+SCHOOL_TEMPORAL = add_school
+{
+ ["name"] = "Temporal",
+ ["skill"] = SKILL_TEMPORAL,
+ ["spell_power"] = TRUE,
+ ["sorcery"] = TRUE,
+ ["gods"] =
+ {
+ -- Yavanna Kementari provides the Temporal school at 1/6 the prayer skill
+ [GOD_YAVANNA] =
+ {
+ ["skill"] = SKILL_PRAY,
+ ["mul"] = 1,
+ ["div"] = 6,
+ },
+ -- Mandos provides the Temporal school at 1/4 the prayer skill
+ [GOD_MANDOS] =
+ {
+ ["skill"] = SKILL_PRAY,
+ ["mul"] = 1,
+ ["div"] = 4,
+ },
+ },
+}
+SCHOOL_NATURE = add_school
+{
+ ["name"] = "Nature",
+ ["skill"] = SKILL_NATURE,
+ ["spell_power"] = TRUE,
+ ["sorcery"] = TRUE,
+ ["gods"] =
+ {
+ -- Yavanna Kementari provides the Nature school at 1/2 the prayer skill
+ [GOD_YAVANNA] =
+ {
+ ["skill"] = SKILL_PRAY,
+ ["mul"] = 1,
+ ["div"] = 2,
+ },
+ -- Ulmo provides the Nature school at 1/2 the prayer skill
+ [GOD_ULMO] =
+ {
+ ["skill"] = SKILL_PRAY,
+ ["mul"] = 1,
+ ["div"] = 2,
+ },
+ },
+}
+SCHOOL_META = add_school
+{
+ ["name"] = "Meta",
+ ["skill"] = SKILL_META,
+ ["spell_power"] = TRUE,
+ ["sorcery"] = TRUE,
+ ["gods"] =
+ {
+ -- Manwe Sulimo provides the Meta school at 1/3 the prayer skill
+ [GOD_MANWE] =
+ {
+ ["skill"] = SKILL_PRAY,
+ ["mul"] = 1,
+ ["div"] = 3,
+ },
+ -- Varda provides the Meta school at 1/2 the prayer skill
+ [GOD_VARDA] =
+ {
+ ["skill"] = SKILL_PRAY,
+ ["mul"] = 1,
+ ["div"] = 2,
+ },
+ },
+}
+SCHOOL_MIND = add_school
+{
+ ["name"] = "Mind",
+ ["skill"] = SKILL_MIND,
+ ["spell_power"] = TRUE,
+ ["sorcery"] = TRUE,
+ ["gods"] =
+ {
+ -- Eru Iluvatar provides the Mind school at 1/3 the prayer skill
+ [GOD_ERU] =
+ {
+ ["skill"] = SKILL_PRAY,
+ ["mul"] = 1,
+ ["div"] = 3,
+ },
+ -- Melkor Bauglir provides the Mind school at 1/3 the prayer skill
+ [GOD_MELKOR] =
+ {
+ ["skill"] = SKILL_PRAY,
+ ["mul"] = 1,
+ ["div"] = 3,
+ },
+ },
+}
+SCHOOL_UDUN = add_school
+{
+ ["name"] = "Udun",
+ ["skill"] = SKILL_UDUN,
+ ["bonus_level"] = function()
+ return ((player.lev * 2) / 3)
+ end,
+}
+SCHOOL_DEMON = add_school
+{
+ ["name"] = "Demon",
+ ["skill"] = SKILL_DAEMON,
+ ["no_random"] = TRUE,
+}
+
+-- The God specific schools, all tied to the prayer skill
+SCHOOL_ERU = add_school
+{
+ ["name"] = "Eru Iluvatar",
+ ["skill"] = SKILL_PRAY,
+ ["spell_power"] = TRUE,
+ ["god"] = GOD_ERU,
+}
+SCHOOL_MANWE = add_school
+{
+ ["name"] = "Manwe Sulimo",
+ ["skill"] = SKILL_PRAY,
+ ["spell_power"] = TRUE,
+ ["god"] = GOD_MANWE,
+}
+SCHOOL_TULKAS = add_school
+{
+ ["name"] = "Tulkas",
+ ["skill"] = SKILL_PRAY,
+ ["spell_power"] = TRUE,
+ ["god"] = GOD_TULKAS,
+}
+SCHOOL_MELKOR = add_school
+{
+ ["name"] = "Melkor Bauglir",
+ ["skill"] = SKILL_PRAY,
+ ["spell_power"] = TRUE,
+ ["god"] = GOD_MELKOR,
+}
+SCHOOL_YAVANNA = add_school
+{
+ ["name"] = "Yavanna Kementari",
+ ["skill"] = SKILL_PRAY,
+ ["spell_power"] = TRUE,
+ ["god"] = GOD_YAVANNA,
+}
+
+-- New schools
+SCHOOL_AULE = add_school
+{
+ ["name"] = "Aule the Smith",
+ ["skill"] = SKILL_PRAY,
+ ["spell_power"] = TRUE,
+ ["god"] = GOD_AULE,
+}
+SCHOOL_VARDA = add_school
+{
+ ["name"] = "Varda Elentari",
+ ["skill"] = SKILL_PRAY,
+ ["spell_power"] = TRUE,
+ ["god"] = GOD_VARDA,
+}
+
+SCHOOL_ULMO = add_school
+{
+ ["name"] = "Ulmo",
+ ["skill"] = SKILL_PRAY,
+ ["spell_power"] = TRUE,
+ ["god"] = GOD_ULMO,
+}
+
+SCHOOL_MANDOS = add_school
+{
+ ["name"] = "Mandos",
+ ["skill"] = SKILL_PRAY,
+ ["spell_power"] = TRUE,
+ ["god"] = GOD_MANDOS,
+}
+
+-- Not a real school, rather a palcehodler for stick only spells
+SCHOOL_DEVICE = add_school
+{
+ ["name"] = "Device",
+ ["skill"] = SKILL_DEVICE,
+}
+
+-- Music "spells"
+SCHOOL_MUSIC = add_school
+{
+ ["name"] = "Music",
+ ["skill"] = SKILL_MUSIC,
+}
+
+-- Put some spells
+tome_dofile("s_fire.lua")
+tome_dofile("s_mana.lua")
+tome_dofile("s_water.lua")
+tome_dofile("s_air.lua")
+tome_dofile("s_earth.lua")
+tome_dofile("s_convey.lua")
+tome_dofile("s_nature.lua")
+tome_dofile("s_divin.lua")
+tome_dofile("s_tempo.lua")
+tome_dofile("s_meta.lua")
+tome_dofile("s_mind.lua")
+tome_dofile("s_udun.lua")
+tome_dofile("s_geom.lua")
+
+-- God's specific spells
+tome_dofile("s_eru.lua")
+tome_dofile("s_manwe.lua")
+tome_dofile("s_tulkas.lua")
+tome_dofile("s_melkor.lua")
+tome_dofile("s_yavann.lua")
+
+-- New gods' spells
+tome_dofile("s_aule.lua")
+tome_dofile("s_varda.lua")
+tome_dofile("s_ulmo.lua")
+tome_dofile("s_mandos.lua")
+
+-- Specific schools
+tome_dofile("s_demon.lua")
+
+-- Device spells
+tome_dofile("s_stick.lua")
+
+-- Musics
+tome_dofile("s_music.lua")
+
+-- List of spellbooks
+
+-- Create the crystal of mana
+school_book[0] = {
+ MANATHRUST, DELCURSES, RESISTS, MANASHIELD,
+}
+
+-- The book of the eternal flame
+school_book[1] = {
+ GLOBELIGHT, FIREGOLEM, FIREFLASH, FIREWALL, FIERYAURA,
+}
+
+-- The book of the blowing winds
+school_book[2] = {
+ NOXIOUSCLOUD, POISONBLOOD, INVISIBILITY, STERILIZE, AIRWINGS, THUNDERSTORM,
+}
+
+-- The book of the impenetrable earth
+school_book[3] = {
+ STONESKIN, DIG, STONEPRISON, SHAKE, STRIKE,
+}
+
+-- The book of the unstopable wave
+school_book[4] = {
+ GEYSER, VAPOR, ENTPOTION, TIDALWAVE, ICESTORM
+}
+
+-- Create the book of translocation
+school_book[5] = {
+ BLINK, DISARM, TELEPORT, TELEAWAY, RECALL, PROBABILITY_TRAVEL,
+}
+
+-- Create the book of the tree
+school_book[6] = {
+ GROWTREE, HEALING, RECOVERY, REGENERATION, SUMMONANNIMAL, GROW_ATHELAS,
+}
+
+-- Create the book of Knowledge
+school_book[7] = {
+ SENSEMONSTERS, SENSEHIDDEN, REVEALWAYS, IDENTIFY, VISION, STARIDENTIFY,
+}
+
+-- Create the book of the Time
+school_book[8] = {
+ MAGELOCK, SLOWMONSTER, ESSENCESPEED, BANISHMENT,
+}
+
+-- Create the book of meta spells
+school_book[9] = {
+ RECHARGE, DISPERSEMAGIC, SPELLBINDER, TRACKER, INERTIA_CONTROL,
+}
+
+-- Create the book of the mind
+school_book[10] = {
+ CHARM, CONFUSE, ARMOROFFEAR, STUN,
+}
+
+-- Create the book of hellflame
+school_book[11] = {
+ DRAIN, GENOCIDE, WRAITHFORM, FLAMEOFUDUN,
+}
+
+-- Create the book of eru
+school_book[20] = {
+ ERU_SEE, ERU_LISTEN, ERU_UNDERSTAND, ERU_PROT,
+}
+
+-- Create the book of manwe
+school_book[21] = {
+ MANWE_BLESS, MANWE_SHIELD, MANWE_CALL, MANWE_AVATAR,
+}
+
+-- Create the book of tulkas
+school_book[22] = {
+ TULKAS_AIM, TULKAS_SPIN, TULKAS_WAVE,
+}
+
+-- Create the book of melkor
+school_book[23] = {
+ MELKOR_CURSE, MELKOR_CORPSE_EXPLOSION, MELKOR_MIND_STEAL,
+}
+
+-- Create the book of yavanna
+school_book[24] = {
+ YAVANNA_CHARM_ANIMAL, YAVANNA_GROW_GRASS, YAVANNA_TREE_ROOTS, YAVANNA_WATER_BITE, YAVANNA_UPROOT,
+}
+
+-- Create the book of beginner's cantrip
+school_book[50] = {
+ MANATHRUST, GLOBELIGHT, ENTPOTION, BLINK, SENSEMONSTERS, SENSEHIDDEN,
+}
+
+-- Create the book of teleporatation
+school_book[51] = {
+ BLINK, TELEPORT, TELEAWAY
+}
+
+-- Create the book of summoning
+school_book[52] = {
+ FIREGOLEM, SUMMONANNIMAL
+}
+
+
+-- Create the Armageddon Demonblade
+school_book[55] = {
+ DEMON_BLADE, DEMON_MADNESS, DEMON_FIELD,
+}
+
+-- Create the Shield Demonblade
+school_book[56] = {
+ DOOM_SHIELD, DEMON_CLOAK, UNHOLY_WORD,
+}
+
+-- Create the Control Demonblade
+school_book[57] = {
+ DEMON_SUMMON, DISCHARGE_MINION, CONTROL_DEMON,
+}
+
+-- Create the Drums
+school_book[58] = {
+ MUSIC_STOP, MUSIC_HOLD, MUSIC_CONF, MUSIC_STUN,
+}
+
+-- Create the Harps
+school_book[59] = {
+ MUSIC_STOP, MUSIC_LITE, MUSIC_HERO, MUSIC_HEAL, MUSIC_TIME, MUSIC_MIND,
+}
+
+-- Create the Horns
+school_book[60] = {
+ MUSIC_STOP, MUSIC_BLOW, MUSIC_WIND, MUSIC_YLMIR, MUSIC_AMBARKANTA,
+}
+
+-- Book of the Player, filled in by the Library Quest
+school_book[61] = { }
+
+-- Geomancy spells, not a real book
+school_book[62] = {
+ CALL_THE_ELEMENTS, CHANNEL_ELEMENTS, ELEMENTAL_WAVE, VAPORIZE, GEOLYSIS, DRIPPING_TREAD, GROW_BARRIER, ELEMENTAL_MINION
+}
+
+-- Aule book [63]
+school_book[BOOK_AULE] =
+{
+ AULE_FIREBRAND, AULE_ENCHANT_WEAPON, AULE_ENCHANT_ARMOUR, AULE_CHILD,
+}
+
+-- Varda book [64]
+school_book[BOOK_VARDA] =
+{
+ VARDA_LIGHT_VALINOR, VARDA_CALL_ALMAREN, VARDA_EVENSTAR, VARDA_STARKINDLER,
+}
+
+-- Ulmo book [65]
+school_book[BOOK_ULMO] =
+{
+ ULMO_BELEGAER, ULMO_DRAUGHT_ULMONAN, ULMO_CALL_ULUMURI, ULMO_WRATH,
+}
+
+-- Mandos book [66]
+school_book[BOOK_MANDOS] =
+{
+ MANDOS_TEARS_LUTHIEN, MANDOS_SPIRIT_FEANTURI, MANDOS_TALE_DOOM, MANDOS_CALL_HALLS
+} \ No newline at end of file
diff --git a/lib/mods/theme/scpt/stores.lua b/lib/mods/theme/scpt/stores.lua
new file mode 100644
index 00000000..4902c4d0
--- /dev/null
+++ b/lib/mods/theme/scpt/stores.lua
@@ -0,0 +1,161 @@
+-- Whats shops can buy what
+store_buy_list
+{
+ ["General Store"] =
+ {
+ TV_CORPSE,
+ TV_FOOD,
+ TV_LITE,
+ TV_FLASK,
+ TV_SPIKE,
+ TV_SHOT,
+ TV_ARROW,
+ TV_BOLT,
+ TV_DIGGING,
+ TV_CLOAK,
+ TV_BOTTLE,
+ },
+ ["Armoury"] =
+ {
+ TV_BOOTS,
+ TV_GLOVES,
+ TV_CROWN,
+ TV_HELM,
+ TV_SHIELD,
+ TV_CLOAK,
+ TV_SOFT_ARMOR,
+ TV_HARD_ARMOR,
+ TV_DRAG_ARMOR,
+ },
+ ["Weaponsmith"] =
+ {
+ TV_SHOT,
+ TV_BOLT,
+ TV_ARROW,
+ TV_BOOMERANG,
+ TV_BOW,
+ TV_DIGGING,
+ TV_HAFTED,
+ TV_POLEARM,
+ TV_SWORD,
+ TV_AXE,
+ TV_MSTAFF,
+ },
+ -- We use a function because we want to restrict to blessed weapons and god spells
+ ["Temple"] = function (obj)
+ if obj.tval == TV_DRUID_BOOK then return TRUE
+ elseif obj.tval == TV_BOOK and obj.sval == 255 and (can_spell_random(obj.pval) == SKILL_SPIRITUALITY) then return TRUE
+ elseif obj.tval == TV_SCROLL then return TRUE
+ elseif obj.tval == TV_POTION2 then return TRUE
+ elseif obj.tval == TV_POTION then return TRUE
+ elseif obj.tval == TV_HAFTED then return TRUE
+ elseif obj.tval == TV_POLEARM and is_blessed(obj) == TRUE then return TRUE
+ elseif obj.tval == TV_SWORD and is_blessed(obj) == TRUE then return TRUE
+ elseif obj.tval == TV_AXE and is_blessed(obj) == TRUE then return TRUE
+ elseif obj.tval == TV_BOOMERANG and is_blessed(obj) == TRUE then return TRUE
+ end
+ end,
+ ["Alchemy shop"] =
+ {
+ TV_SCROLL,
+ TV_POTION2,
+ TV_POTION,
+ TV_BATERIE,
+ TV_BOTTLE,
+ },
+ -- We use a function because we dont want god spells
+ ["Magic shop"] = function (obj)
+ local buy =
+ {
+ [TV_SYMBIOTIC_BOOK] = TRUE,
+ [TV_AMULET] = TRUE,
+ [TV_RING] = TRUE,
+ [TV_STAFF] = TRUE,
+ [TV_WAND] = TRUE,
+ [TV_ROD] = TRUE,
+ [TV_ROD_MAIN] = TRUE,
+ [TV_SCROLL] = TRUE,
+ [TV_POTION2] = TRUE,
+ [TV_POTION] = TRUE,
+ [TV_MSTAFF] = TRUE,
+ [TV_RANDART] = TRUE,
+ }
+
+ if obj.tval == TV_BOOK and obj.sval == 255 and (can_spell_random(obj.pval) == SKILL_MAGIC) then return TRUE
+ elseif obj.tval == TV_BOOK and obj.sval ~= 255 then return TRUE
+ elseif buy[obj.tval] == TRUE then return TRUE
+ end
+ end,
+ -- Black markets wants ALL!
+ ["Black Market"] = function (obj)
+ return TRUE
+ end,
+ ["Book Store"] =
+ {
+ TV_BOOK,
+ TV_SYMBIOTIC_BOOK,
+ TV_MUSIC_BOOK,
+ TV_DAEMON_BOOK,
+ TV_DRUID_BOOK,
+ },
+ ["Pet Shop"] =
+ {
+ TV_EGG,
+ },
+-- Theme stores
+
+ ["Hunting Supply Store"] =
+ {
+ TV_TRAPKIT,
+ TV_BOOMERANG,
+ TV_SHOT,
+ TV_BOLT,
+ TV_ARROW,
+ TV_BOW,
+ TV_POTION2,
+ },
+
+ ["Runic Magic Shop"] =
+ {
+ TV_RUNE1,
+ TV_RUNE2,
+ },
+
+ ["Construction Supply Store"] =
+ {
+ TV_LITE,
+ TV_DIGGING,
+ },
+
+ ["Music Store"] =
+ {
+ TV_INSTRUMENT,
+ },
+}
+
+-- Take care to have Magic shop/Temple have specific spells only
+add_hooks
+{
+ [HOOK_STORE_STOCK] = function (index, name, level)
+ if name == "Magic shop" then
+ -- Books
+ if magik(20) == TRUE then
+ object_prep(obj_forge, lookup_kind(TV_BOOK, 255))
+ local spell = get_random_spell(SKILL_MAGIC, 20)
+ if spell > -1 then
+ obj_forge.pval = spell
+ return TRUE, obj_forge
+ end
+ end
+ elseif name == "Temple" then
+ if magik(20) == TRUE then
+ object_prep(obj_forge, lookup_kind(TV_BOOK, 255))
+ local spell = get_random_spell(SKILL_SPIRITUALITY, 20)
+ if spell > -1 then
+ obj_forge.pval = spell
+ return TRUE, obj_forge
+ end
+ end
+ end
+ end,
+}
diff --git a/lib/mods/theme/theme.txt b/lib/mods/theme/theme.txt
new file mode 100644
index 00000000..f85ba157
--- /dev/null
+++ b/lib/mods/theme/theme.txt
@@ -0,0 +1,313 @@
+Chronological list of changes made in Theme module.
+
+Detailed list: http://www.zionmainframe.ca/tome/theme/changes.html
+Known bugs: http://www.zionmainframe.ca/tome/theme/bugs.html
+Credits: http://www.zionmainframe.ca/tome/theme/credits.html
+
+Theme 0.0.1 AKA "The Beginning"
+
+ - 20 new terrain features
+ - removed Alchemy [the class, the skill, and the Artifact Creation ability]
+ - removed DeathMolds [replaced with Dragons from Annals of Ea]
+ - Morgoth's corrupted races may no longer play as Lost Souls
+ - changed the intro screen and wording
+ - removed access to the Lost Hobbit quest (NEVER_GENE to both Proudfoots)
+
+Theme 0.0.2 AKA "Object Mayhem"
+
+ - removed all items relating to alchemy and portable hole
+ - changed many descriptions and item names
+ - fountainized more potions
+ - Greater Ration of Health and the Potion of Learning are no longer artifacts, but more rare.
+ - rings and amulets are all indestructible now
+ - amulets of Devotion are blessed
+ - Adamantite rods are now Tilkal rods and more rare
+ - Espadons must be wielded two-handed
+ - the Bardiche replaces the Basillard
+ - Adamantite armour is now Galvorn
+ - Paper Armour makes wearer sensitive to fire; Fur cloaks grant cold resistance.
+ - Rhino Hide Armour became Mumak Hide Armour
+ - Golden Ring Mail replaces Stone and Hide Armour
+ - adjusted leather jacket, renamed to leather jerkin
+
+Theme 0.0.3 AKA "Wordsmith"
+
+ - new rumours
+ - revamped list of silly monster names
+ - junkarts got a total facelift
+ - monster speech made more thematic all across the board
+ - more thematic last words (both monsters and player)
+
+Theme 0.0.4 AKA "Monstervore"
+(veteran *banders beware: many, many changes to monsters. Read the detailed list, the starting parchment, or take extra time to look around. 'Monstervore' is about right for the version name, in fact.)
+
+ - more neutral monsters all across the board
+ - Zangband and CthAngband monsters are gone, joke monsters greatly revamped.
+ - Angels, icky things, centipedes, and kobolds are gone.
+ - many colour changes to reduce confusion, different monsters should be easier to, uh, differentiate
+ - gnomes, leprechauns, and lizard men are now using the 'l' symbol instead of 'h'
+ - dwarves use the 'k' symbol instead of 'h'
+ - wainriders, black numenoreans, and oathbreakers are in, knights of all kinds are out.
+ - none of the 'cold' variety dragons have flight
+ - mature non-aquatic dragons have been renamed to drakes
+ - great wyrms are now great worms
+ - baby dragons are hatchling dragons
+ - Smaug no longer erroneously described as an 'uruloki' - uruloki can't fly.
+ - Nazgul are all represented by the letter N now (too many dark gray Ws as it is)
+ - renamed some uniques to be more in-theme
+ - Huan and Shadowfax are now neutral
+ - brought back aquatic elven warriors (friend), aquatic elven mages (friend), Headless, and mermaids from Z.
+ - completely new set of demons (major and minor) all in-theme, replacing the old D&D demons.
+ - the White Balrog renamed and re-described to avoid confusion due to the above.
+ - minotaurs, maulotaurs, and hippocampi are gone. The unique Maze guardian stays.
+
+Theme 0.0.5 AKA "Artifactual"
+
+ - removed joke artifacts, many ammo artifacts, the phial of undeath, and toris mejistos
+ - changed many artifact names
+ - broadened some descriptions
+ - Gurthang renamed to Angalachel (detailed explanation in changelog.txt)
+ - The sword formerly known as Vorpal Blade is sentient
+ - Sting is a short sword, not small sword
+ - Anduril now resists being shattered by Morgul beings.
+ - Angrist is a broken dagger and gives a luck bonus.
+ - Theoden King had a sword, not an axe. That axe is now of Dain Ironfoot.
+
+Theme 0.0.6 AKA "Brave New World"
+
+ - wilderness map corrected a lot to fit the Middle-Earth map, dungeon locations have changed considerably.
+ - some places on the map have names now, so you can wander through Rivendell, the Brown Lands, Udun, etc.
+ - three words: the Dead Marshes. Avoid 'em.
+ - some dungeons renamed; many new terrain features.
+ - in general, the wilderness is a lot more dangerous to travel (thanks to BlackSmurf for the inspiration).
+ - Angband levels 101-127 separated out into Utumno.
+ - 7 new dungeons, all with a final guardian and guaranteed artifact or randart.
+ - random towns in Cirith Ungol, Blue Mountains, Dol Amroth, Near Harad.
+ - Gondolin map tweaked a bit to suit new location.
+ - Lothlorien has been renamed to Caras Galadhon.
+
+Theme 0.0.7 AKA "The Forge"
+
+ - 16 new item types, some from T-Plus, some as suggested in the forum, others my own - mostly for 'game flavour' [no pun intended :-)]
+ - 37 new ego-types, many from T-Plus and Annals of Ea
+ - 35 new artifacts, many from T-Plus, some from Annals of Ea, some implemented based on forum suggestions
+ - 6 new item sets, one of my own, one from T-Plus, others as suggested in the forum
+ - over 200 new monsters:
+ - centipedes replaced by 9 types of cattle and one unique (Boar of Everholt)
+ - icky things replaced by mewlips (undead things of hobbit-lore), 14 types
+ - 59 new uniques (8 are unkillable, wilderness-only Valar, 8 are joke monsters)
+
+Theme 0.0.8 AKA "Gone to Town"
+
+ - numerous bug fixes, refer to changelog.txt for details
+ - 4 new artifacts, 4 new sets, 3 new ego types, some item and monster tweaks
+ - 14 new terrain features for town use
+ - 12 new towns, of these 7 are not visible on the wilderness map (all have parchments)
+ - Caras Galadhon map redone completely, Gondolin map tweaked to suit new location
+ - 'Rest for the night' option available for free in player home and some thematic locations
+ - 8 new store types
+ - rewritten store owner list
+
+Theme 0.0.9 AKA "Out, Out, Damned Spot!"
+
+ - a bugfix release on the heels of ToME 2.2.7; see changelog.txt for details
+ - Player can now push past neutral monsters, thanks to a lua script written by BauMog
+ - Bjorn (a joke unique based on a DiTLer) replaces Varda
+ - Player can get free dinner at some thematic locations where player race is liked
+ - Increased quality of rods at the magic rod market
+ - The Valar have an equal number of non-spoiler lines now.
+ - Renumbered the planned releases (see below)
+ - From now on bugfix releases will always come separately.
+
+Theme 0.1.0 AKA "A Farewell to Kobolds"
+
+ - several bugfixes, see changelog.txt for details
+ - only in-theme races can now be Lost Souls: Eldar and Maiar. I put half-elves among them too, as there's conflicting information on whether half-elves made it to the Halls of Mandos or not.
+ - thematised Maiar, Ents, Hobbits, Dwarves, and Wood Elves.
+ - 4 new races: Druedain (replace Kobolds), Easterlings, Roeg (minor demons), Eagles (replace Thunderlords)
+ - 6 dragon subraces
+ - 10 demon subraces
+ - Beefed up Rangers and removed ability to worship anyone but Melkor from Demonologists and Necromancers.
+ - 7 new subclasses
+
+Theme 0.1.1 AKA "Sleeping Awake"
+
+ - several bugfixes, see changelog.txt for details
+ - some tweaks to the Clairvoyants, Ascetics, and Mercenaries
+ - a new joke monster, and more monspeak.txt lines
+ - 3 new ego types
+ - some preliminary changes to lua scripts, mostly stuff from the ToME Script library and T-Plus
+
+Theme 0.1.2 AKA "Friends and Neighbours"
+
+ - a player/monster race alignment scheme based on the T-Plus code for Angel alignments
+
+Theme 0.1.3 AKA "Odds and Ends"
+
+ - tweaks to various info files
+ - added 6 Dwarven Rings of Power
+
+Theme 0.1.4 AKA "Milk and Bones"
+
+ - two lua scriptlets for players who like Ammo creation but don't like scumming for junk
+ - two lua scriptlets for some thematic fun
+
+Theme 0.5.0 AKA "Eternity of Stars"
+
+ - removed weapons belonging to the Valar from a_info (changed names)
+ - renamed existing Eternity items
+ - added 8 new Ultimate items for the Void-divers
+
+Theme 1.0.0 AKA "Shiny and New"
+
+ - Four new Valar: Varda, Aule, Ulmo, Mandos. All with their own magic schools, priest classes, and quest temples.
+ - Fully documented all the changes so far for the ingame help.
+ - Some monster and item tweaks.
+ - Numerous tweaks to the new races and classes.
+ - The Pacifists are now a class alongside warriors, mages, and priests - there are two subclasses.
+
+Theme 1.0.1. AKA "Khazad aimenu!"
+
+ - Fixed some God-related issues
+ - Some miscellaneous cosmetic fixes
+ - Updated automatiser file to work regardless of object flavour display
+ - 4 new axe types from T-Plus
+ - New ego magestaff
+
+Theme 1.0.2. AKA "Order of the Swan"
+
+ - Fixed the Elemental Mastery ego-type
+ - God quest fixes
+ - 3 new ego types, 2 new artifacts, and 1 new item set
+ - Fog on the Barrow-Downs is back, toned down.
+ - New monster: Knight of the Swan (white 'p')
+ - Mithril armour adapted from T-Plus
+
+Theme 1.0.3 AKA "Old and New"
+
+ - New special level in Erebor
+ - New amulet ego-type
+ - Axed the Rustproof and of Valour ego-types
+ - Tweaked Ranger class further
+ - (2.3.0 CVS) Axed several out-of-theme artifacts to make room for new ones from ToME3
+ - (2.3.0 CVS) War-mage class (T-Plus) is useless with the new Mage class, removed
+
+Theme 1.0.4 AKA "Jocos Et Dii Amant"
+
+ - Ulmo now dislikes the player using fire magic and Orc players (Thanks to LogrusMage)
+ - Fixed the monster flag problem which caused lua errors in Ulmo's temple dungeon
+ - Commented out Nienna and Orome in r_info
+
+Theme 1.0.5 AKA "As You Like It"
+
+ - New tiles for terrain and objects
+ - Pref file for 16x16 tileset uses ASCII characters for the *missing* monsters
+ - Pref file for 8x8 tileset uses ASCII characters for *all* monsters.
+
+Theme 1.0.6 AKA "Flame of Udun"
+
+ - Fixed a bug that prevented Ulmo from working properly
+ - Re-added the Maia restrictions for corruptions
+ - Added some new corruptions (from MM's script)
+
+Theme 1.0.7 AKA "All Shall Wait"
+
+ - Monster tiles and pref files done
+ - Renamed *thanc daggers
+ - Renamed Halls of Mandos and lifted the elves-only restrictions.
+ - Thror's map is now actually a map
+ - More corruptions from MM's script
+ - Added NO_TARGET to monsters that start out neutral
+
+Theme 1.0.8 AKA "To The Keep!"
+
+ - Several small bugfixes
+ - Some documentation updates
+ - Fixed Aule's spells to prevent insane pval increases
+ - (2.3.0 CVS) Several documentation tweaks
+ - (2.3.0 CVS) misc.lua was not called from init.lua
+
+Theme 1.0.9 AKA "Through the Darkness"
+
+ - Several small bugfixes
+ - Several documentation and in-game parchment updates
+ - Pippin's dagger (former *thanc) is now part of another set, too
+ - Graphics package updated, plus .gif files as in 2.3.0
+ - (2.3.0 CVS) Removed museums from all towns but three
+
+Theme 1.1.0 AKA "Forever There"
+
+ - Minor piety-gain tweaks to Ulmo and Melkor
+ - Took away 'normal' magic schools from Thaumaturgists
+ - Mages got .400 in Disarming
+ - Trolls got a bonus to hafted-mastery
+
+Theme 1.1.1 AKA "I Amar Prestar Aen"
+
+ - New special level by Burb Lulls
+ - Some item, monster, artifact, class, and ego tweaks
+ - Fireproofing quest is now for a rune, not potion
+ - Tweaked the Tears of Luthien spell
+
+Theme 1.1.2 AKA "Serpensortia"
+
+ - minor bugfixes/tweaks: items, races, classes
+ - (2.3.0 CVS) fixed the new jewelry crashing bug
+ - (2.3.0 CVS) removed several types of old rings and amulets
+
+Theme 1.1.3 AKA "Phoenix Song"
+
+ - Updated all files from the 2.3.0 (CVS) version to 2.3.1
+ - Removed Peregrin's dagger from the Peregrin's Gear set.
+ - Aule followers should be able to sacrifice self-made items now.
+ - The coordinates for Melkor's god quests have been fixed.
+ - Added more text to the Erebor map and key to make sure player keeps them.
+
+Theme 1.1.4 AKA "Release the River"
+
+ - Updated all files from the 2.3.1 version to 2.3.3
+ - Fixed bugs with maps, sets, jumpgates and quests.
+ - Updated a number of help files on gods and magic.
+ - Retired two ego types and reworked some others.
+ - Retired the Polymorph corruption.
+ - Replaced Carlammas with a new artifact and added a new ring ego type.
+
+Theme 1.1.5 AKA "Angles and Corners"
+
+ - Some feature flag tweaks.
+ - Orc Cave now leads out on the other side of the Misty Mountains.
+ - Two new special levels to accomodate Erebor quest items; new special final level in Isengard.
+ - Eagles' nest in Khazad-dum.
+
+Theme 1.1.6 AKA "Curses to This Mirage"
+
+ - Some monster flag tweaks.
+ - Neutral monsters forced into wilderness.
+ - Fixed player-related bugs with stat gain and starting equipment.
+
+Theme 1.1.7 AKA "Poor Madeleine"
+
+ - Some item tweaks.
+ - Removed several miscellaneous food items.
+ - 5 new item types.
+
+Theme 1.1.8 AKA "Little White Candle"
+
+ - Numerous ego item tweaks.
+ - Renamed several ego types to be more in-theme.
+ - Removed Rings of the Elements to avoid redundancy.
+ - 3 new ego types.
+
+Theme 1.1.9 AKA "Kit Bag Full of Marbles"
+
+ - Several randart tweaks.
+ - FF now offers three additional skills.
+ - Non-elves can no longer be LostSouls.
+ - Flight at birth now means mountain climbing at clvl50
+
+Theme 1.2.0 AKA "Twining Light"
+
+ - Several artifact tweaks.
+ - Removed the dwarven rings of power.
+ - 3 new artifacts.
+ - 1 new item set. \ No newline at end of file
diff --git a/lib/mods/theme/user/all.prf b/lib/mods/theme/user/all.prf
new file mode 100644
index 00000000..4e9dead3
--- /dev/null
+++ b/lib/mods/theme/user/all.prf
@@ -0,0 +1,520 @@
+
+
+# Automatic option dump
+
+# Option 'Rogue-like commands'
+X:rogue_like_commands
+
+# Option 'Activate quick messages'
+Y:quick_messages
+
+# Option 'Prompt for various information'
+X:other_query_flag
+
+# Option 'Prompt before picking things up'
+X:carry_query_flag
+
+# Option 'Use old target by default'
+X:use_old_target
+
+# Option 'Pick things up by default'
+X:always_pickup
+
+# Option 'Prompt before picking up heavy objects'
+Y:prompt_pickup_heavy
+
+# Option 'Repeat obvious commands'
+Y:always_repeat
+
+# Option 'Show dungeon level in feet'
+X:depth_in_feet
+
+# Option 'Merge inscriptions when stacking'
+Y:stack_force_notes
+
+# Option 'Merge discounts when stacking'
+Y:stack_force_costs
+
+# Option 'Show labels in object listings'
+Y:show_labels
+
+# Option 'Show weights in object listings'
+Y:show_weights
+
+# Option 'Show graphics in inventory list'
+Y:show_inven_graph
+
+# Option 'Show graphics in equipment list'
+Y:show_equip_graph
+
+# Option 'Show graphics in stores'
+Y:show_store_graph
+
+# Option 'Show choices in certain sub-windows'
+Y:show_choices
+
+# Option 'Show details in certain sub-windows'
+Y:show_details
+
+# Option 'Audible bell (on errors, etc)'
+X:ring_bell
+
+# Option 'Use color if possible (slow)'
+Y:use_color
+
+# Option 'Run past stairs'
+Y:find_ignore_stairs
+
+# Option 'Run through open doors'
+Y:find_ignore_doors
+
+# Option 'Run past known corners'
+Y:find_cut
+
+# Option 'Run into potential corners'
+Y:find_examine
+
+# Option 'Disturb whenever any monster moves'
+X:disturb_move
+
+# Option 'Disturb whenever viewable monster moves'
+Y:disturb_near
+
+# Option 'Disturb whenever map panel changes'
+Y:disturb_panel
+
+# Option 'Disturb whenever leaving trap-detected area'
+Y:disturb_detect
+
+# Option 'Disturb whenever player state changes'
+Y:disturb_state
+
+# Option 'Disturb whenever boring things happen'
+X:disturb_minor
+
+# Option 'Disturb whenever random things happen'
+X:disturb_other
+
+# Option 'Alert user to critical hitpoints'
+Y:alert_hitpoint
+
+# Option 'Alert user to various failures'
+Y:alert_failure
+
+# Option 'Get last words when the character dies'
+Y:last_words
+
+# Option 'Allow shopkeepers and uniques to speak'
+Y:speak_unique
+
+# Option 'No query to destroy known worthless items'
+Y:auto_destroy
+
+# Option 'Confirm to wear/wield known cursed items'
+Y:confirm_wear
+
+# Option 'Prompt before exiting a dungeon level'
+X:confirm_stairs
+
+# Option 'Disturb when visible pets move'
+X:disturb_pets
+
+# Option 'Automatically open doors'
+Y:easy_open
+
+# Option 'Automatically disarm traps'
+Y:easy_disarm
+
+# Option 'Automatically tunnel walls'
+Y:easy_tunnel
+
+# Option 'Auto-haggle in stores'
+Y:auto_haggle
+
+# Option 'Auto-scum for good levels'
+Y:auto_scum
+
+# Option 'Allow weapons and armour to stack'
+Y:stack_allow_items
+
+# Option 'Allow wands/staffs/rods to stack'
+Y:stack_allow_wands
+
+# Option 'Expand the power of the look command'
+Y:expand_look
+
+# Option 'Expand the power of the list commands'
+Y:expand_list
+
+# Option 'Map remembers all perma-lit grids'
+Y:view_perma_grids
+
+# Option 'Map remembers all torch-lit grids'
+Y:view_torch_grids
+
+# Option 'Allow some monsters to carry light'
+Y:monster_lite
+
+# Option 'Generate dungeons with aligned rooms'
+Y:dungeon_align
+
+# Option 'Generate dungeons with connected stairs'
+Y:dungeon_stair
+
+# Option 'Monsters chase current location (v.slow)'
+X:flow_by_sound
+
+# Option 'Use special symbols for the player char'
+X:player_symbols
+
+# Option 'Plain object descriptions'
+Y:plain_descriptions
+
+# Option 'Monsters learn from their mistakes'
+X:smart_learn
+
+# Option 'Monsters exploit players weaknesses'
+X:smart_cheat
+
+# Option 'Monsters behave stupidly'
+X:stupid_monsters
+
+# Option 'Allow unusually small dungeon levels'
+Y:small_levels
+
+# Option 'Allow empty 'arena' levels'
+Y:empty_levels
+
+# Option 'Reduce lite-radius when running'
+X:view_reduce_lite
+
+# Option 'Reduce view-radius in town'
+X:view_reduce_view
+
+# Option 'Avoid checking for user abort'
+X:avoid_abort
+
+# Option 'Avoid extra shimmering (fast)'
+Y:avoid_shimmer
+
+# Option 'Avoid processing special colors (fast)'
+X:avoid_other
+
+# Option 'Flush input on various failures'
+Y:flush_failure
+
+# Option 'Flush input whenever disturbed'
+X:flush_disturb
+
+# Option 'Flush input before every command'
+X:flush_command
+
+# Option 'Flush output before every command'
+Y:fresh_before
+
+# Option 'Flush output after every command'
+X:fresh_after
+
+# Option 'Flush output after every message'
+X:fresh_message
+
+# Option 'Compress messages in savefiles'
+Y:compress_savefile
+
+# Option 'Hilite the player with the cursor'
+X:hilite_player
+
+# Option 'Use special colors for torch-lit grids'
+X:view_yellow_lite
+
+# Option 'Use special colors for 'viewable' grids'
+X:view_bright_lite
+
+# Option 'Use special colors for wall grids (slow)'
+X:view_granite_lite
+
+# Option 'Use special colors for floor grids (slow)'
+X:view_special_lite
+
+# Option 'Center the view on the player (very slow)'
+X:center_player
+
+# Option 'Ingame contextual help'
+X:ingame_help
+
+# Option 'Show the experience needed for next level'
+X:exp_need
+
+# Option 'Use the old(Z) coloring scheme(reload the game)'
+X:old_colors
+
+# Option 'Automatically clear '-more-' prompts'
+X:auto_more
+
+# Option 'Player char represent his/her health'
+Y:player_char_health
+
+# Option 'Stats are represented in a linear way'
+Y:linear_stats
+
+# Option 'In option windows, just omit the select char'
+X:inventory_no_move
+
+# Option 'Allow objects to stack on floor'
+Y:testing_stack
+
+# Option 'Allow monsters to carry objects'
+Y:testing_carry
+
+# Window 'Mirror', Flag 'Display inven/equip'
+W:1:0:0
+
+# Window 'Mirror', Flag 'Display equip/inven'
+W:1:1:0
+
+# Window 'Mirror', Flag 'Display character'
+W:1:3:0
+
+# Window 'Mirror', Flag 'Show visible monsters'
+W:1:4:0
+
+# Window 'Mirror', Flag 'Display IRC messages'
+W:1:5:0
+
+# Window 'Mirror', Flag 'Display messages'
+W:1:6:0
+
+# Window 'Mirror', Flag 'Display overhead view'
+W:1:7:0
+
+# Window 'Mirror', Flag 'Display monster recall'
+W:1:8:0
+
+# Window 'Mirror', Flag 'Display object recall'
+W:1:9:0
+
+# Window 'Mirror', Flag 'Display snap-shot'
+W:1:11:0
+
+# Window 'Mirror', Flag 'Display borg messages'
+W:1:14:0
+
+# Window 'Mirror', Flag 'Display borg status'
+W:1:15:0
+
+# Window 'Recall', Flag 'Display inven/equip'
+W:2:0:0
+
+# Window 'Recall', Flag 'Display equip/inven'
+W:2:1:0
+
+# Window 'Recall', Flag 'Display character'
+W:2:3:0
+
+# Window 'Recall', Flag 'Show visible monsters'
+W:2:4:0
+
+# Window 'Recall', Flag 'Display IRC messages'
+W:2:5:0
+
+# Window 'Recall', Flag 'Display messages'
+W:2:6:0
+
+# Window 'Recall', Flag 'Display overhead view'
+W:2:7:0
+
+# Window 'Recall', Flag 'Display monster recall'
+W:2:8:0
+
+# Window 'Recall', Flag 'Display object recall'
+W:2:9:0
+
+# Window 'Recall', Flag 'Display snap-shot'
+W:2:11:0
+
+# Window 'Recall', Flag 'Display borg messages'
+W:2:14:0
+
+# Window 'Recall', Flag 'Display borg status'
+W:2:15:0
+
+# Window 'Choice', Flag 'Display inven/equip'
+W:3:0:0
+
+# Window 'Choice', Flag 'Display equip/inven'
+W:3:1:0
+
+# Window 'Choice', Flag 'Display character'
+W:3:3:0
+
+# Window 'Choice', Flag 'Show visible monsters'
+W:3:4:0
+
+# Window 'Choice', Flag 'Display IRC messages'
+W:3:5:0
+
+# Window 'Choice', Flag 'Display messages'
+W:3:6:0
+
+# Window 'Choice', Flag 'Display overhead view'
+W:3:7:0
+
+# Window 'Choice', Flag 'Display monster recall'
+W:3:8:0
+
+# Window 'Choice', Flag 'Display object recall'
+W:3:9:0
+
+# Window 'Choice', Flag 'Display snap-shot'
+W:3:11:0
+
+# Window 'Choice', Flag 'Display borg messages'
+W:3:14:0
+
+# Window 'Choice', Flag 'Display borg status'
+W:3:15:0
+
+# Window 'Term-4', Flag 'Display inven/equip'
+W:4:0:0
+
+# Window 'Term-4', Flag 'Display equip/inven'
+W:4:1:0
+
+# Window 'Term-4', Flag 'Display character'
+W:4:3:0
+
+# Window 'Term-4', Flag 'Show visible monsters'
+W:4:4:0
+
+# Window 'Term-4', Flag 'Display IRC messages'
+W:4:5:0
+
+# Window 'Term-4', Flag 'Display messages'
+W:4:6:0
+
+# Window 'Term-4', Flag 'Display overhead view'
+W:4:7:0
+
+# Window 'Term-4', Flag 'Display monster recall'
+W:4:8:0
+
+# Window 'Term-4', Flag 'Display object recall'
+W:4:9:0
+
+# Window 'Term-4', Flag 'Display snap-shot'
+W:4:11:0
+
+# Window 'Term-4', Flag 'Display borg messages'
+W:4:14:0
+
+# Window 'Term-4', Flag 'Display borg status'
+W:4:15:0
+
+# Window 'Term-5', Flag 'Display inven/equip'
+W:5:0:0
+
+# Window 'Term-5', Flag 'Display equip/inven'
+W:5:1:0
+
+# Window 'Term-5', Flag 'Display character'
+W:5:3:0
+
+# Window 'Term-5', Flag 'Show visible monsters'
+W:5:4:0
+
+# Window 'Term-5', Flag 'Display IRC messages'
+W:5:5:0
+
+# Window 'Term-5', Flag 'Display messages'
+W:5:6:0
+
+# Window 'Term-5', Flag 'Display overhead view'
+W:5:7:0
+
+# Window 'Term-5', Flag 'Display monster recall'
+W:5:8:0
+
+# Window 'Term-5', Flag 'Display object recall'
+W:5:9:0
+
+# Window 'Term-5', Flag 'Display snap-shot'
+W:5:11:0
+
+# Window 'Term-5', Flag 'Display borg messages'
+W:5:14:0
+
+# Window 'Term-5', Flag 'Display borg status'
+W:5:15:0
+
+# Window 'Term-6', Flag 'Display inven/equip'
+W:6:0:0
+
+# Window 'Term-6', Flag 'Display equip/inven'
+W:6:1:0
+
+# Window 'Term-6', Flag 'Display character'
+W:6:3:0
+
+# Window 'Term-6', Flag 'Show visible monsters'
+W:6:4:0
+
+# Window 'Term-6', Flag 'Display IRC messages'
+W:6:5:0
+
+# Window 'Term-6', Flag 'Display messages'
+W:6:6:0
+
+# Window 'Term-6', Flag 'Display overhead view'
+W:6:7:0
+
+# Window 'Term-6', Flag 'Display monster recall'
+W:6:8:0
+
+# Window 'Term-6', Flag 'Display object recall'
+W:6:9:0
+
+# Window 'Term-6', Flag 'Display snap-shot'
+W:6:11:0
+
+# Window 'Term-6', Flag 'Display borg messages'
+W:6:14:0
+
+# Window 'Term-6', Flag 'Display borg status'
+W:6:15:0
+
+# Window 'Term-7', Flag 'Display inven/equip'
+W:7:0:0
+
+# Window 'Term-7', Flag 'Display equip/inven'
+W:7:1:0
+
+# Window 'Term-7', Flag 'Display character'
+W:7:3:0
+
+# Window 'Term-7', Flag 'Show visible monsters'
+W:7:4:0
+
+# Window 'Term-7', Flag 'Display IRC messages'
+W:7:5:0
+
+# Window 'Term-7', Flag 'Display messages'
+W:7:6:0
+
+# Window 'Term-7', Flag 'Display overhead view'
+W:7:7:0
+
+# Window 'Term-7', Flag 'Display monster recall'
+W:7:8:0
+
+# Window 'Term-7', Flag 'Display object recall'
+W:7:9:0
+
+# Window 'Term-7', Flag 'Display snap-shot'
+W:7:11:0
+
+# Window 'Term-7', Flag 'Display borg messages'
+W:7:14:0
+
+# Window 'Term-7', Flag 'Display borg status'
+W:7:15:0
+
diff --git a/lib/mods/theme/user/automat.atm b/lib/mods/theme/user/automat.atm
new file mode 100644
index 00000000..03e31974
--- /dev/null
+++ b/lib/mods/theme/user/automat.atm
@@ -0,0 +1,667 @@
+-- This automatiser file was created by Feanor for the Annals of Ea module.
+clean_ruleset()
+add_ruleset
+[[
+<rule name="emptychest" type="destroy" module="Theme">
+ <and>
+ <and>
+ <tval>7</tval>
+ </and>
+ <status>empty</status>
+ </and>
+</rule>
+<rule name="junkmushrooms" type="destroy" module="Theme">
+ <and>
+ <tval>80</tval>
+ <sval min="0" max="11"></sval>
+ </and>
+</rule>
+<rule name="junkjewelry" type="destroy" module="Theme">
+ <and>
+ <or>
+ <and>
+ <tval>40</tval>
+ <sval min="0" max="0"></sval>
+ </and>
+ <and>
+ <tval>45</tval>
+ <sval min="0" max="4"></sval>
+ </and>
+ <and>
+ <tval>40</tval>
+ <status>bad</status>
+ </and>
+ <and>
+ <tval>45</tval>
+ <status>bad</status>
+ </and>
+ </or>
+ </and>
+</rule>
+<rule name="junkpotions" type="destroy" module="Theme">
+ <and>
+ <not>
+ <ability>Trapping</ability>
+ </not>
+ <or>
+ <and>
+ <tval>71</tval>
+ <sval min="4" max="7"></sval>
+ </and>
+ <and>
+ <tval>71</tval>
+ <sval min="9" max="11"></sval>
+ </and>
+ <and>
+ <tval>71</tval>
+ <sval min="13" max="13">13</sval>
+ </and>
+ <and>
+ <tval>71</tval>
+ <sval min="15" max="21"></sval>
+ </and>
+ </or>
+ </and>
+</rule>
+<rule name="junkwands" type="destroy" module="Theme">
+ <and>
+ <tval>65</tval>
+ <sval min="24" max="25"></sval>
+ </and>
+</rule>
+<rule name="junkscrolls" type="destroy" module="Theme">
+ <and>
+ <not>
+ <ability>Trapping</ability>
+ </not>
+ <or>
+ <and>
+ <tval>70</tval>
+ <sval min="0" max="0"></sval>
+ <not>
+ <subrace>Vampire</subrace>
+ </not>
+ </and>
+ <and>
+ <tval>70</tval>
+ <sval min="1" max="5"></sval>
+ </and>
+ <and>
+ <tval>70</tval>
+ <sval min="7" max="7"></sval>
+ </and>
+ </or>
+ </and>
+</rule>
+<rule name="brokendagger" type="destroy" module="Theme">
+ <and>
+ <name>Broken Dagger</name>
+ <or>
+ <status>average</status>
+ <status>bad</status>
+ <status>very bad</status>
+ </or>
+ </and>
+</rule>
+<rule name="magestaffs" type="destroy" module="Theme">
+ <and>
+ <tval>6</tval>
+ <or>
+ <and>
+ <level min="0" max="50"></level>
+ <or>
+ <status>very bad</status>
+ <status>bad</status>
+ </or>
+ </and>
+ <and>
+ <level min="15" max="50"></level>
+ <status>average</status>
+ </and>
+ <and>
+ <level min="25" max="50"></level>
+ <status>good</status>
+ </and>
+ </or>
+ </and>
+</rule>
+<rule name="instruments" type="destroy" module="Theme">
+ <and>
+ <tval>14</tval>
+ <or>
+ <and>
+ <level min="0" max="50"></level>
+ <or>
+ <status>very bad</status>
+ <status>bad</status>
+ </or>
+ </and>
+ <and>
+ <level min="15" max="50"></level>
+ <status>average</status>
+ </and>
+ <and>
+ <level min="25" max="50"></level>
+ <status>good</status>
+ </and>
+ </or>
+ </and>
+</rule>
+<rule name="boomerangs" type="destroy" module="Theme">
+ <and>
+ <tval>15</tval>
+ <or>
+ <and>
+ <level min="0" max="50"></level>
+ <or>
+ <status>very bad</status>
+ <status>bad</status>
+ </or>
+ </and>
+ <and>
+ <level min="15" max="50"></level>
+ <status>average</status>
+ </and>
+ <and>
+ <level min="25" max="50"></level>
+ <status>good</status>
+ </and>
+ </or>
+ </and>
+</rule>
+<rule name="shots" type="destroy" module="Theme">
+ <and>
+ <tval>16</tval>
+ <or>
+ <and>
+ <level min="0" max="50"></level>
+ <or>
+ <status>very bad</status>
+ <status>bad</status>
+ </or>
+ </and>
+ <and>
+ <level min="35" max="50"></level>
+ <status>average</status>
+ </and>
+ <and>
+ <level min="45" max="50"></level>
+ <status>good</status>
+ </and>
+ </or>
+ </and>
+</rule>
+<rule name="arrows" type="destroy" module="Theme">
+ <and>
+ <tval>17</tval>
+ <or>
+ <and>
+ <level min="0" max="50"></level>
+ <or>
+ <status>very bad</status>
+ <status>bad</status>
+ </or>
+ </and>
+ <and>
+ <level min="35" max="50"></level>
+ <status>average</status>
+ </and>
+ <and>
+ <level min="45" max="50"></level>
+ <status>good</status>
+ </and>
+ </or>
+ </and>
+</rule>
+<rule name="bolts" type="destroy" module="Theme">
+ <and>
+ <tval>18</tval>
+ <or>
+ <and>
+ <level min="0" max="50"></level>
+ <or>
+ <status>very bad</status>
+ <status>bad</status>
+ </or>
+ </and>
+ <and>
+ <level min="35" max="50"></level>
+ <status>average</status>
+ </and>
+ <and>
+ <level min="45" max="50"></level>
+ <status>good</status>
+ </and>
+ </or>
+ </and>
+</rule>
+<rule name="missile" type="destroy" module="Theme">
+ <and>
+ <tval>19</tval>
+ <or>
+ <and>
+ <level min="0" max="50"></level>
+ <or>
+ <status>very bad</status>
+ <status>bad</status>
+ </or>
+ </and>
+ <and>
+ <level min="15" max="50"></level>
+ <status>average</status>
+ </and>
+ <and>
+ <level min="25" max="50"></level>
+ <status>good</status>
+ </and>
+ </or>
+ </and>
+</rule>
+<rule name="diggers" type="destroy" module="Theme">
+ <and>
+ <tval>20</tval>
+ <or>
+ <and>
+ <level min="0" max="50"></level>
+ <or>
+ <status>very bad</status>
+ <status>bad</status>
+ </or>
+ </and>
+ <and>
+ <level min="15" max="50"></level>
+ <status>average</status>
+ </and>
+ <and>
+ <level min="25" max="50"></level>
+ <status>good</status>
+ </and>
+ </or>
+ </and>
+</rule>
+<rule name="hafted" type="destroy" module="Theme">
+ <and>
+ <tval>21</tval>
+ <or>
+ <and>
+ <level min="0" max="50"></level>
+ <or>
+ <status>very bad</status>
+ <status>bad</status>
+ </or>
+ </and>
+ <and>
+ <level min="15" max="50"></level>
+ <status>average</status>
+ </and>
+ <and>
+ <level min="25" max="50"></level>
+ <status>good</status>
+ </and>
+ </or>
+ </and>
+</rule>
+<rule name="polearm" type="destroy" module="Theme">
+ <and>
+ <tval>22</tval>
+ <or>
+ <and>
+ <level min="0" max="50"></level>
+ <or>
+ <status>very bad</status>
+ <status>bad</status>
+ </or>
+ </and>
+ <and>
+ <level min="15" max="50"></level>
+ <status>average</status>
+ </and>
+ <and>
+ <level min="25" max="50"></level>
+ <status>good</status>
+ </and>
+ </or>
+ </and>
+</rule>
+<rule name="swords" type="destroy" module="Theme">
+ <and>
+ <tval>23</tval>
+ <or>
+ <and>
+ <level min="0" max="50"></level>
+ <or>
+ <status>very bad</status>
+ <status>bad</status>
+ </or>
+ </and>
+ <and>
+ <level min="15" max="50"></level>
+ <status>average</status>
+ </and>
+ <and>
+ <level min="25" max="50"></level>
+ <status>good</status>
+ </and>
+ </or>
+ </and>
+</rule>
+<rule name="axes" type="destroy" module="Theme">
+ <and>
+ <tval>24</tval>
+ <or>
+ <and>
+ <level min="0" max="50"></level>
+ <or>
+ <status>very bad</status>
+ <status>bad</status>
+ </or>
+ </and>
+ <and>
+ <level min="15" max="50"></level>
+ <status>average</status>
+ </and>
+ <and>
+ <level min="25" max="50"></level>
+ <status>good</status>
+ </and>
+ </or>
+ </and>
+</rule>
+<rule name="boots" type="destroy" module="Theme">
+ <and>
+ <tval>30</tval>
+ <or>
+ <and>
+ <level min="0" max="50"></level>
+ <or>
+ <status>very bad</status>
+ <status>bad</status>
+ </or>
+ </and>
+ <and>
+ <level min="15" max="50"></level>
+ <status>average</status>
+ </and>
+ <and>
+ <level min="25" max="50"></level>
+ <status>good</status>
+ </and>
+ </or>
+ </and>
+</rule>
+<rule name="gloves" type="destroy" module="Theme">
+ <and>
+ <tval>31</tval>
+ <or>
+ <and>
+ <level min="0" max="50"></level>
+ <or>
+ <status>very bad</status>
+ <status>bad</status>
+ </or>
+ </and>
+ <and>
+ <level min="15" max="50"></level>
+ <status>average</status>
+ </and>
+ <and>
+ <level min="25" max="50"></level>
+ <status>good</status>
+ </and>
+ </or>
+ </and>
+</rule>
+<rule name="helms" type="destroy" module="Theme">
+ <and>
+ <tval>32</tval>
+ <or>
+ <and>
+ <level min="0" max="50"></level>
+ <or>
+ <status>very bad</status>
+ <status>bad</status>
+ </or>
+ </and>
+ <and>
+ <level min="15" max="50"></level>
+ <status>average</status>
+ </and>
+ <and>
+ <level min="25" max="50"></level>
+ <status>good</status>
+ </and>
+ </or>
+ </and>
+</rule>
+<rule name="crowns" type="destroy" module="Theme">
+ <and>
+ <tval>33</tval>
+ <or>
+ <and>
+ <level min="0" max="50"></level>
+ <or>
+ <status>very bad</status>
+ <status>bad</status>
+ </or>
+ </and>
+ <and>
+ <level min="15" max="50"></level>
+ <status>average</status>
+ </and>
+ <and>
+ <level min="25" max="50"></level>
+ <status>good</status>
+ </and>
+ </or>
+ </and>
+</rule>
+<rule name="shields" type="destroy" module="Theme">
+ <and>
+ <tval>34</tval>
+ <or>
+ <and>
+ <level min="0" max="50"></level>
+ <or>
+ <status>very bad</status>
+ <status>bad</status>
+ </or>
+ </and>
+ <and>
+ <level min="15" max="50"></level>
+ <status>average</status>
+ </and>
+ <and>
+ <level min="25" max="50"></level>
+ <status>good</status>
+ </and>
+ </or>
+ </and>
+</rule>
+<rule name="cloaks" type="destroy" module="Theme">
+ <and>
+ <tval>35</tval>
+ <or>
+ <and>
+ <level min="0" max="50"></level>
+ <or>
+ <status>very bad</status>
+ <status>bad</status>
+ </or>
+ </and>
+ <and>
+ <level min="15" max="50"></level>
+ <status>average</status>
+ </and>
+ <and>
+ <level min="25" max="50"></level>
+ <status>good</status>
+ </and>
+ </or>
+ </and>
+</rule>
+<rule name="softarmour" type="destroy" module="Theme">
+ <and>
+ <tval>36</tval>
+ <or>
+ <and>
+ <level min="0" max="50"></level>
+ <or>
+ <status>very bad</status>
+ <status>bad</status>
+ </or>
+ </and>
+ <and>
+ <level min="15" max="50"></level>
+ <status>average</status>
+ </and>
+ <and>
+ <level min="25" max="50"></level>
+ <status>good</status>
+ </and>
+ </or>
+ </and>
+</rule>
+<rule name="hardarmour" type="destroy" module="Theme">
+ <and>
+ <tval>37</tval>
+ <or>
+ <and>
+ <level min="0" max="50"></level>
+ <or>
+ <status>very bad</status>
+ <status>bad</status>
+ </or>
+ </and>
+ <and>
+ <level min="15" max="50"></level>
+ <status>average</status>
+ </and>
+ <and>
+ <level min="25" max="50"></level>
+ <status>good</status>
+ </and>
+ </or>
+ </and>
+</rule>
+<rule name="dragonarmour" type="destroy" module="Theme">
+ <and>
+ <tval>38</tval>
+ <or>
+ <and>
+ <level min="0" max="50"></level>
+ <or>
+ <status>very bad</status>
+ <status>bad</status>
+ </or>
+ </and>
+ <and>
+ <level min="40" max="50"></level>
+ <status>average</status>
+ </and>
+ <and>
+ <level min="45" max="50"></level>
+ <status>good</status>
+ </and>
+ </or>
+ </and>
+</rule>
+<rule name="daemonbooks" type="destroy" module="Theme">
+ <and>
+ <and>
+ <tval>115</tval>
+ <sval min="55" max="57"></sval>
+ </and>
+ <or>
+ <and>
+ <level min="0" max="50"></level>
+ <or>
+ <status>very bad</status>
+ <status>bad</status>
+ </or>
+ </and>
+ <and>
+ <level min="15" max="50"></level>
+ <status>average</status>
+ </and>
+ <and>
+ <level min="25" max="50"></level>
+ <status>good</status>
+ </and>
+ </or>
+ </and>
+</rule>
+<rule name="trapkits" type="destroy" module="Theme">
+ <and>
+ <tval>46</tval>
+ <or>
+ <status>bad</status>
+ <status>very bad</status>
+ </or>
+ </and>
+</rule>
+<rule name="classitems" type="destroy" module="Theme">
+ <or>
+ <and>
+ <tval>9</tval>
+ <and>
+ <not>
+ <skill min="1" max="50">Corpse-preservation</skill>
+ </not>
+ <not>
+ <skill min="1" max="50">Possession</skill>
+ </not>
+ <not>
+ <skill min="1" max="50">Summoning</skill>
+ </not>
+ </and>
+ </and>
+ <and>
+ <or>
+ <tval>104</tval>
+ <tval>105</tval>
+ </or>
+ <not>
+ <skill min="1" max="50">Runecraft</skill>
+ </not>
+ </and>
+ <and>
+ <tval>46</tval>
+ <not>
+ <ability>Trapping</ability>
+ </not>
+ <or>
+ <status>average</status>
+ <status>good</status>
+ </or>
+ </and>
+ <and>
+ <and>
+ <not>
+ <class>Archer</class>
+ </not>
+ <not>
+ <class>Ranger</class>
+ </not>
+ <not>
+ <class>Sniper</class>
+ </not>
+ </and>
+ <tval>11</tval>
+ </and>
+ <and>
+ <and>
+ <not>
+ <class>Archer</class>
+ </not>
+ <not>
+ <class>Ranger</class>
+ </not>
+ <not>
+ <class>Sniper</class>
+ </not>
+ </and>
+ <tval>1</tval>
+ </and>
+ </or>
+</rule>
+]]
diff --git a/lib/mods/theme/user/fierce.atm b/lib/mods/theme/user/fierce.atm
new file mode 100644
index 00000000..c49f7de3
--- /dev/null
+++ b/lib/mods/theme/user/fierce.atm
@@ -0,0 +1,761 @@
+clean_ruleset()
+add_ruleset
+[[
+<rule name="oilflask" type="destroy" module="Theme">
+ <name>flask of oil</name>
+</rule>
+<rule name="emptychest" type="destroy" module="Theme">
+ <and>
+ <and>
+ <tval>7</tval>
+ </and>
+ <status>empty</status>
+ </and>
+</rule>
+<rule name="junkmushrooms" type="destroy" module="Theme">
+ <and>
+ <tval>80</tval>
+ <sval min="0" max="11"></sval>
+ </and>
+</rule>
+<rule name="junkjewelry" type="destroy" module="Theme">
+ <and>
+ <or>
+ <and>
+ <tval>40</tval>
+ <sval min="0" max="0"></sval>
+ </and>
+ <and>
+ <tval>45</tval>
+ <sval min="0" max="4"></sval>
+ </and>
+ <and>
+ <tval>40</tval>
+ <status>bad</status>
+ </and>
+ <and>
+ <tval>45</tval>
+ <status>bad</status>
+ </and>
+ </or>
+ </and>
+</rule>
+<rule name="junkpotions" type="destroy" module="Theme">
+ <and>
+ <not>
+ <ability>Trapping</ability>
+ </not>
+ <or>
+ <and>
+ <tval>71</tval>
+ <sval min="4" max="7"></sval>
+ </and>
+ <and>
+ <tval>71</tval>
+ <sval min="9" max="11"></sval>
+ </and>
+ <and>
+ <tval>71</tval>
+ <sval min="13" max="13">13</sval>
+ </and>
+ <and>
+ <tval>71</tval>
+ <sval min="15" max="21"></sval>
+ </and>
+ </or>
+ </and>
+</rule>
+<rule name="junkwands" type="destroy" module="Theme">
+ <and>
+ <tval>65</tval>
+ <sval min="24" max="25"></sval>
+ </and>
+</rule>
+<rule name="junkscrolls" type="destroy" module="Theme">
+ <and>
+ <not>
+ <ability>Trapping</ability>
+ </not>
+ <or>
+ <and>
+ <tval>70</tval>
+ <sval min="0" max="0"></sval>
+ <not>
+ <subrace>Vampire</subrace>
+ </not>
+ </and>
+ <and>
+ <tval>70</tval>
+ <sval min="1" max="5"></sval>
+ </and>
+ <and>
+ <tval>70</tval>
+ <sval min="7" max="7"></sval>
+ </and>
+ </or>
+ </and>
+</rule>
+<rule name="brokendagger" type="destroy" module="Theme">
+ <and>
+ <name>Broken Dagger</name>
+ <or>
+ <status>average</status>
+ <status>bad</status>
+ <status>very bad</status>
+ <and>
+ <level min="40" max="50"></level>
+ <status>very good</status>
+ </and>
+ </or>
+ </and>
+</rule>
+<rule name="magestaffs" type="destroy" module="Theme">
+ <and>
+ <tval>6</tval>
+ <or>
+ <and>
+ <level min="0" max="50"></level>
+ <or>
+ <status>very bad</status>
+ <status>bad</status>
+ </or>
+ </and>
+ <and>
+ <level min="15" max="50"></level>
+ <status>average</status>
+ </and>
+ <and>
+ <level min="25" max="50"></level>
+ <status>good</status>
+ </and>
+ <and>
+ <level min="40" max="50"></level>
+ <status>very good</status>
+ </and>
+ </or>
+ </and>
+</rule>
+<rule name="instruments" type="destroy" module="Theme">
+ <and>
+ <tval>14</tval>
+ <or>
+ <and>
+ <level min="0" max="50"></level>
+ <or>
+ <status>very bad</status>
+ <status>bad</status>
+ </or>
+ </and>
+ <and>
+ <level min="15" max="50"></level>
+ <status>average</status>
+ </and>
+ <and>
+ <level min="25" max="50"></level>
+ <status>good</status>
+ </and>
+ <and>
+ <level min="40" max="50"></level>
+ <status>very good</status>
+ </and>
+ </or>
+ </and>
+</rule>
+<rule name="boomerangs" type="destroy" module="Theme">
+ <and>
+ <tval>15</tval>
+ <or>
+ <and>
+ <level min="0" max="50"></level>
+ <or>
+ <status>very bad</status>
+ <status>bad</status>
+ </or>
+ </and>
+ <and>
+ <level min="15" max="50"></level>
+ <status>average</status>
+ </and>
+ <and>
+ <level min="25" max="50"></level>
+ <status>good</status>
+ </and>
+ <and>
+ <level min="40" max="50"></level>
+ <status>very good</status>
+ </and>
+ </or>
+ </and>
+</rule>
+<rule name="shots" type="destroy" module="Theme">
+ <and>
+ <tval>16</tval>
+ <or>
+ <and>
+ <level min="0" max="50"></level>
+ <or>
+ <status>very bad</status>
+ <status>bad</status>
+ </or>
+ </and>
+ <and>
+ <level min="25" max="50"></level>
+ <status>average</status>
+ </and>
+ <and>
+ <level min="35" max="50"></level>
+ <status>good</status>
+ </and>
+ <and>
+ <level min="40" max="50"></level>
+ <status>very good</status>
+ </and>
+ </or>
+ </and>
+</rule>
+<rule name="arrows" type="destroy" module="Theme">
+ <and>
+ <tval>17</tval>
+ <or>
+ <and>
+ <level min="0" max="50"></level>
+ <or>
+ <status>very bad</status>
+ <status>bad</status>
+ </or>
+ </and>
+ <and>
+ <level min="25" max="50"></level>
+ <status>average</status>
+ </and>
+ <and>
+ <level min="35" max="50"></level>
+ <status>good</status>
+ </and>
+ <and>
+ <level min="40" max="50"></level>
+ <status>very good</status>
+ </and>
+ </or>
+ </and>
+</rule>
+<rule name="bolts" type="destroy" module="Theme">
+ <and>
+ <tval>18</tval>
+ <or>
+ <and>
+ <level min="0" max="50"></level>
+ <or>
+ <status>very bad</status>
+ <status>bad</status>
+ </or>
+ </and>
+ <and>
+ <level min="25" max="50"></level>
+ <status>average</status>
+ </and>
+ <and>
+ <level min="35" max="50"></level>
+ <status>good</status>
+ </and>
+ <and>
+ <level min="40" max="50"></level>
+ <status>very good</status>
+ </and>
+ </or>
+ </and>
+</rule>
+<rule name="missile" type="destroy" module="Theme">
+ <and>
+ <tval>19</tval>
+ <or>
+ <and>
+ <level min="0" max="50"></level>
+ <or>
+ <status>very bad</status>
+ <status>bad</status>
+ </or>
+ </and>
+ <and>
+ <level min="15" max="50"></level>
+ <status>average</status>
+ </and>
+ <and>
+ <level min="25" max="50"></level>
+ <status>good</status>
+ </and>
+ <and>
+ <level min="40" max="50"></level>
+ <status>very good</status>
+ </and>
+ </or>
+ </and>
+</rule>
+<rule name="diggers" type="destroy" module="Theme">
+ <and>
+ <tval>20</tval>
+ <or>
+ <and>
+ <level min="0" max="50"></level>
+ <or>
+ <status>very bad</status>
+ <status>bad</status>
+ </or>
+ </and>
+ <and>
+ <level min="15" max="50"></level>
+ <status>average</status>
+ </and>
+ <and>
+ <level min="25" max="50"></level>
+ <status>good</status>
+ </and>
+ <and>
+ <level min="40" max="50"></level>
+ <status>very good</status>
+ </and>
+ </or>
+ </and>
+</rule>
+<rule name="hafted" type="destroy" module="Theme">
+ <and>
+ <tval>21</tval>
+ <or>
+ <and>
+ <level min="0" max="50"></level>
+ <or>
+ <status>very bad</status>
+ <status>bad</status>
+ </or>
+ </and>
+ <and>
+ <level min="15" max="50"></level>
+ <status>average</status>
+ </and>
+ <and>
+ <level min="25" max="50"></level>
+ <status>good</status>
+ </and>
+ <and>
+ <level min="40" max="50"></level>
+ <status>very good</status>
+ </and>
+ </or>
+ </and>
+</rule>
+<rule name="polearm" type="destroy" module="Theme">
+ <and>
+ <tval>22</tval>
+ <or>
+ <and>
+ <level min="0" max="50"></level>
+ <or>
+ <status>very bad</status>
+ <status>bad</status>
+ </or>
+ </and>
+ <and>
+ <level min="15" max="50"></level>
+ <status>average</status>
+ </and>
+ <and>
+ <level min="25" max="50"></level>
+ <status>good</status>
+ </and>
+ <and>
+ <level min="40" max="50"></level>
+ <status>very good</status>
+ </and>
+ </or>
+ </and>
+</rule>
+<rule name="swords" type="destroy" module="Theme">
+ <and>
+ <tval>23</tval>
+ <or>
+ <and>
+ <level min="0" max="50"></level>
+ <or>
+ <status>very bad</status>
+ <status>bad</status>
+ </or>
+ </and>
+ <and>
+ <level min="15" max="50"></level>
+ <status>average</status>
+ </and>
+ <and>
+ <level min="25" max="50"></level>
+ <status>good</status>
+ </and>
+ <and>
+ <level min="40" max="50"></level>
+ <status>very good</status>
+ </and>
+ </or>
+ </and>
+</rule>
+<rule name="axes" type="destroy" module="Theme">
+ <and>
+ <tval>24</tval>
+ <or>
+ <and>
+ <level min="0" max="50"></level>
+ <or>
+ <status>very bad</status>
+ <status>bad</status>
+ </or>
+ </and>
+ <and>
+ <level min="15" max="50"></level>
+ <status>average</status>
+ </and>
+ <and>
+ <level min="25" max="50"></level>
+ <status>good</status>
+ </and>
+ <and>
+ <level min="40" max="50"></level>
+ <status>very good</status>
+ </and>
+ </or>
+ </and>
+</rule>
+<rule name="boots" type="destroy" module="Theme">
+ <and>
+ <tval>30</tval>
+ <or>
+ <and>
+ <level min="0" max="50"></level>
+ <or>
+ <status>very bad</status>
+ <status>bad</status>
+ </or>
+ </and>
+ <and>
+ <level min="15" max="50"></level>
+ <status>average</status>
+ </and>
+ <and>
+ <level min="25" max="50"></level>
+ <status>good</status>
+ </and>
+ <and>
+ <level min="40" max="50"></level>
+ <status>very good</status>
+ </and>
+ </or>
+ </and>
+</rule>
+<rule name="gloves" type="destroy" module="Theme">
+ <and>
+ <tval>31</tval>
+ <or>
+ <and>
+ <level min="0" max="50"></level>
+ <or>
+ <status>very bad</status>
+ <status>bad</status>
+ </or>
+ </and>
+ <and>
+ <level min="15" max="50"></level>
+ <status>average</status>
+ </and>
+ <and>
+ <level min="25" max="50"></level>
+ <status>good</status>
+ </and>
+ <and>
+ <level min="40" max="50"></level>
+ <status>very good</status>
+ </and>
+ </or>
+ </and>
+</rule>
+<rule name="helms" type="destroy" module="Theme">
+ <and>
+ <tval>32</tval>
+ <or>
+ <and>
+ <level min="0" max="50"></level>
+ <or>
+ <status>very bad</status>
+ <status>bad</status>
+ </or>
+ </and>
+ <and>
+ <level min="15" max="50"></level>
+ <status>average</status>
+ </and>
+ <and>
+ <level min="25" max="50"></level>
+ <status>good</status>
+ </and>
+ <and>
+ <level min="40" max="50"></level>
+ <status>very good</status>
+ </and>
+ </or>
+ </and>
+</rule>
+<rule name="crowns" type="destroy" module="Theme">
+ <and>
+ <tval>33</tval>
+ <or>
+ <and>
+ <level min="0" max="50"></level>
+ <or>
+ <status>very bad</status>
+ <status>bad</status>
+ </or>
+ </and>
+ <and>
+ <level min="15" max="50"></level>
+ <status>average</status>
+ </and>
+ <and>
+ <level min="25" max="50"></level>
+ <status>good</status>
+ </and>
+ <and>
+ <level min="40" max="50"></level>
+ <status>very good</status>
+ </and>
+ </or>
+ </and>
+</rule>
+<rule name="shields" type="destroy" module="Theme">
+ <and>
+ <tval>34</tval>
+ <or>
+ <and>
+ <level min="0" max="50"></level>
+ <or>
+ <status>very bad</status>
+ <status>bad</status>
+ </or>
+ </and>
+ <and>
+ <level min="15" max="50"></level>
+ <status>average</status>
+ </and>
+ <and>
+ <level min="25" max="50"></level>
+ <status>good</status>
+ </and>
+ <and>
+ <level min="40" max="50"></level>
+ <status>very good</status>
+ </and>
+ </or>
+ </and>
+</rule>
+<rule name="cloaks" type="destroy" module="Theme">
+ <and>
+ <tval>35</tval>
+ <or>
+ <and>
+ <level min="0" max="50"></level>
+ <or>
+ <status>very bad</status>
+ <status>bad</status>
+ </or>
+ </and>
+ <and>
+ <level min="15" max="50"></level>
+ <status>average</status>
+ </and>
+ <and>
+ <level min="25" max="50"></level>
+ <status>good</status>
+ </and>
+ <and>
+ <level min="40" max="50"></level>
+ <status>very good</status>
+ </and>
+ </or>
+ </and>
+</rule>
+<rule name="softarmour" type="destroy" module="Theme">
+ <and>
+ <tval>36</tval>
+ <or>
+ <and>
+ <level min="0" max="50"></level>
+ <or>
+ <status>very bad</status>
+ <status>bad</status>
+ </or>
+ </and>
+ <and>
+ <level min="15" max="50"></level>
+ <status>average</status>
+ </and>
+ <and>
+ <level min="25" max="50"></level>
+ <status>good</status>
+ </and>
+ <and>
+ <level min="40" max="50"></level>
+ <status>very good</status>
+ </and>
+ </or>
+ </and>
+</rule>
+<rule name="hardarmour" type="destroy" module="Theme">
+ <and>
+ <tval>37</tval>
+ <or>
+ <and>
+ <level min="0" max="50"></level>
+ <or>
+ <status>very bad</status>
+ <status>bad</status>
+ </or>
+ </and>
+ <and>
+ <level min="15" max="50"></level>
+ <status>average</status>
+ </and>
+ <and>
+ <level min="25" max="50"></level>
+ <status>good</status>
+ </and>
+ <and>
+ <level min="40" max="50"></level>
+ <status>very good</status>
+ </and>
+ </or>
+ </and>
+</rule>
+<rule name="dragonarmour" type="destroy" module="Theme">
+ <and>
+ <tval>38</tval>
+ <or>
+ <and>
+ <level min="0" max="50"></level>
+ <or>
+ <status>very bad</status>
+ <status>bad</status>
+ </or>
+ </and>
+ <and>
+ <level min="40" max="50"></level>
+ <status>average</status>
+ </and>
+ <and>
+ <level min="45" max="50"></level>
+ <status>good</status>
+ </and>
+ <and>
+ <level min="49" max="50"></level>
+ <status>very good</status>
+ </and>
+ </or>
+ </and>
+</rule>
+<rule name="daemonbooks" type="destroy" module="Theme">
+ <and>
+ <and>
+ <tval>115</tval>
+ <sval min="55" max="57"></sval>
+ </and>
+ <or>
+ <and>
+ <level min="0" max="50"></level>
+ <or>
+ <status>very bad</status>
+ <status>bad</status>
+ </or>
+ </and>
+ <and>
+ <level min="15" max="50"></level>
+ <status>average</status>
+ </and>
+ <and>
+ <level min="25" max="50"></level>
+ <status>good</status>
+ </and>
+ <and>
+ <level min="49" max="50"></level>
+ <status>very good</status>
+ </and>
+ </or>
+ </and>
+</rule>
+<rule name="trapkits" type="destroy" module="Theme">
+ <and>
+ <tval>46</tval>
+ <or>
+ <status>bad</status>
+ <status>very bad</status>
+ </or>
+ </and>
+</rule>
+<rule name="classitems" type="destroy" module="Theme">
+ <or>
+ <and>
+ <tval>9</tval>
+ <and>
+ <not>
+ <skill min="1" max="50">Corpse-preservation</skill>
+ </not>
+ <not>
+ <skill min="1" max="50">Possession</skill>
+ </not>
+ <not>
+ <skill min="1" max="50">Summoning</skill>
+ </not>
+ </and>
+ </and>
+ <and>
+ <or>
+ <tval>104</tval>
+ <tval>105</tval>
+ </or>
+ <not>
+ <skill min="1" max="50">Runecraft</skill>
+ </not>
+ </and>
+ <and>
+ <tval>46</tval>
+ <not>
+ <ability>Trapping</ability>
+ </not>
+ <or>
+ <status>average</status>
+ <status>good</status>
+ </or>
+ </and>
+ <and>
+ <and>
+ <not>
+ <class>Archer</class>
+ </not>
+ <not>
+ <class>Ranger</class>
+ </not>
+ <not>
+ <class>Sniper</class>
+ </not>
+ </and>
+ <tval>11</tval>
+ </and>
+ <and>
+ <and>
+ <not>
+ <class>Archer</class>
+ </not>
+ <not>
+ <class>Ranger</class>
+ </not>
+ <not>
+ <class>Sniper</class>
+ </not>
+ </and>
+ <tval>1</tval>
+ </and>
+ </or>
+</rule>
+]]
diff --git a/lib/module.lua b/lib/module.lua
index edbaa34b..ea8be613 100644
--- a/lib/module.lua
+++ b/lib/module.lua
@@ -1,7 +1,7 @@
add_module
{
["name"] = "ToME",
- ["version"] = { 2, 3, 9 },
+ ["version"] = { 2, 3, 10 },
["author"] = { "DarkGod", "darkgod@t-o-m-e.net" },
["desc"] = {
"The Tales of Middle-earth, the standard and official game.",
diff --git a/lib/scpt/fireprof.lua b/lib/scpt/fireprof.lua
index 79a0747b..0a3aad28 100644
--- a/lib/scpt/fireprof.lua
+++ b/lib/scpt/fireprof.lua
@@ -2,71 +2,6 @@
fireproof_quest = {}
--- The map definition itself
-fireproof_quest.MAP =
-[[#!map
-# Created by fearoffours (fearoffours@moppy.co.uk)
-# Made for ToME 2.1.x on 03/09/02
-
-# Permanent wall
-F:X:63:3
-
-# Floor with dirt
-F:.:88:3
-
-# shallow lava
-F:f:86:3
-
-# Deep lava
-F:F:85:3
-
-### Random Monsters and/or Items
-# Random object (upto 3 levels ood)
-F:!:88:5:0:*21
-
-# red mold
-F:m:88:5:324
-
-# Chimaera
-F:H:88:5:341
-
-# Red dragon bat
-F:b:88:5:377
-
-# Hellhound and
-# Random object (upto 7 levels ood) on normal floor
-F:C:88:5:613:*25
-
-# Quest exit
-F:<:6:3
-
-D:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
-D:X......m.................H.........b...m......X
-D:X.............b...............................X
-D:X.......................m.....m.......H...b.C.X
-D:X...............m.!........b.............FFFf.X
-D:X.........m!............H....!........fffFFFffX
-D:X..................................fffFFFFFFfFX
-D:XFFf..............................fFFFFff..fffX
-D:XFFFff........FFFFFF...........fffFFFfff......X
-D:XfFFFFfff....FFFFFFFf.......fffFFFFFf.........X
-D:X.fFFFFFFff.FFFFFFFFFfF..fffFFFFFFff..........X
-D:X..fFFFFFFFffFFFfffFFFfffFFFFFFFFf............X
-D:X...fFFFFFFFFFFff.ffFFFFFFFFFFFff.............X
-D:X....fffFFFFFFff...ffFFFFFFFFFf...............X
-D:X.......ffFFFf.......ffffFFfff................X
-D:X.........fff.................................X
-D:X.............................................X
-D:X.............................................X
-D:X.............................................X
-D:X..................................<..........X
-D:X.............................................X
-D:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
-
-# Starting position
-P:22:26
-]]
-
-- change this constant (and the FOO_POINTS ones) to adjust the no of items fire-proofed as a reward
fireproof_quest.TOTAL_ITEM_POINTS = 12
@@ -129,7 +64,7 @@ add_quest
return FALSE
else
-- load the map
- load_map(fireproof_quest.MAP, 2, 2)
+ load_map("fireprof.map", 2, 2)
-- no teleport
level_flags2 = DF2_NO_TELEPORT
diff --git a/lib/scpt/intro.lua b/lib/scpt/intro.lua
index 2c4d3def..ef6041a5 100644
--- a/lib/scpt/intro.lua
+++ b/lib/scpt/intro.lua
@@ -1,69 +1,3 @@
-function drop_text_left(c, str, y, o)
- local i = strlen(str)
- local x = 39 - (strlen(str) / 2) + o
- while (i > 0)
- do
- local a = 0
- local time = 0
-
- if (strbyte(str, i) ~= strbyte(" ", 1)) then
- while (a < x + i - 1)
- do
- Term_putch(a - 1, y, c, 32)
- Term_putch(a, y, c, strbyte(str, i))
- time = time + 1
- if time >= 4 then
- Term_xtra(TERM_XTRA_DELAY, 1)
- time = 0
- end
- Term_redraw_section(a - 1, y, a, y)
- a = a + 1
-
- inkey_scan = TRUE
- if (inkey() ~= 0) then
- return TRUE
- end
- end
- end
-
- i = i - 1
- end
- return FALSE
-end
-
-function drop_text_right(c, str, y, o)
- local x = 39 - (strlen(str) / 2) + o
- local i = 1
- while (i <= strlen(str))
- do
- local a = 79
- local time = 0
-
- if (strbyte(str, i) ~= strbyte(" ", 1)) then
- while (a >= x + i - 1)
- do
- Term_putch(a + 1, y, c, 32)
- Term_putch(a, y, c, strbyte(str, i))
- time = time + 1
- if time >= 4 then
- Term_xtra(TERM_XTRA_DELAY, 1)
- time = 0
- end
- Term_redraw_section(a, y, a + 1, y)
- a = a - 1
-
- inkey_scan = TRUE
- if (inkey() ~= 0) then
- return TRUE
- end
- end
- end
-
- i = i + 1
- end
- return FALSE
-end
-
function tome_intro()
screen_save()
Term_clear()
diff --git a/lib/scpt/library.lua b/lib/scpt/library.lua
index 99c2c0f4..1433e47f 100644
--- a/lib/scpt/library.lua
+++ b/lib/scpt/library.lua
@@ -4,74 +4,6 @@
library_quest = {}
--- The map definition itself
-library_quest.MAP =
-[[#!map
-
-# Permanent wall
-F:X:63:3
-
-# Granite Wall
-F:#:57:3
-
-# Cobblestone Road
-F:O:200:3
-
-# Floor
-F:.:1:3
-
-# Lich
-F:l:200:3:518
-
-# Master lich
-F:L:200:3:658
-
-# Quest exit
-F:<:6:3
-
-D:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
-D:X###############################################################X
-D:X#<OlOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO#X
-D:X#O#.###.#.###.#.###.#.###.#.###.O.###.#.###.#.###.#.###.#.###O#X
-D:X#O#.###.#.###.#.###.#.###.#.###.O.###.#.###.#.###.#.###.#.###O#X
-D:X#O#.###.#.###.#.###.#.###.#.###.O.###.#.###.#.###.#.###.#.###O#X
-D:X#O#.###.#.###.#.###.#.###.#.###.O.###.#.###.#.###.#.###.#.###O#X
-D:X#O#.###.#.###.#.###.#.###.#.###.O.###.#.###.#.###.#.###.#.###O#X
-D:X#O#.###.#.###.#.###.#.###.#.###.O.###.#.###.#.###.#.###.#.###O#X
-D:X#O#.###.#.###.#.###.#.###.#.###.O.###.#.###.#.###.#.###.#.###O#X
-D:X#O#.###.#.###.#.###.#.###.#.###.O.###.#.###.#.###.#.###.#.###O#X
-D:X#O#.###.#.###.#.###.#.###.#.###.O.###.#.###.#.###.#.###.#.###O#X
-D:X#O#.###.#.###.#.###.#.###.#.###.O.###.#.###.#.###.#.###.#.###O#X
-D:X#OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO#X
-D:X#O#.###.#.###.#.###.#.###.#.###.O.###.#.###.#.###.#.###.#.###O#X
-D:X#O#.###.#.###.#.###.#.###.#.###.O.###.#.###.#.###.#.###.#.###O#X
-D:X#O#.###.#.###.#.###.#.###.#.###.O.###.#.###.#.###.#.###.#.###O#X
-D:X#O#.###.#.###.#.###.#.###.#.###.O.###.#.###.#.###.#.###.#.###O#X
-D:X#O#.###.#.###.#.###.#.###.#.###.O.###.#.###.#.###.#.###.#.###O#X
-D:X#O#.###.#.###.#.###.#.###.#.###.O.###.#.###.#.###.#.###.#.###O#X
-D:X#O#.###.#.###.#.###.#.###.#.###.O.###.#.###.#.###.#.###.#.###O#X
-D:X#O#.###.#.###.#.###.#.###.#.###.O.###.#.###.#.###.#.###.#.###O#X
-D:X#O#.###.#.###.#.###.#.###.#.###.O.###.#.###.#.###.#.###.#.###O#X
-D:X#O#.###.#.###.#.###.#.###.#.###.O.###.#.###.#.###.#.###.#.###O#X
-D:X#OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO#X
-D:X#O#.###.#.###.#.###.#.###.#.###.O.###.#.###.#.###.#.###.#.###O#X
-D:X#O#.###.#.###.#.###.#.###.#.###.O.###.#.###.#.###.#.###.#.###O#X
-D:X#O#.###.#.###.#.###.#.###.#.###.O.###.#.###.#.###.#.###.#.###O#X
-D:X#O#.###.#.###.#.###.#.###.#.###.O.###.#.###.#.###.#.###.#.###O#X
-D:X#O#.###.#.###.#.###.#.###.#.###.O.###.#.###.#.###.#.###.#.###O#X
-D:X#O#.###.#.###.#.###.#.###.#.###.O.###.#.###.#.###.#.###.#.###O#X
-D:X#O#.###.#.###.#.###.#.###.#.###.O.###.#.###.#.###.#.###.#.###O#X
-D:X#O#.###.#.###.#.###.#.###.#.###.O.###.#.###.#.###.#.###.#.###O#X
-D:X#O#.###.#.###.#.###.#.###.#.###.O.###.#.###.#.###.#.###.#.###O#X
-D:X#O#.###.#.###.#.###.#.###.#.###.O.###.#.###.#.###.#.###.#.###O#X
-D:X#OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOL#X
-D:X###############################################################X
-D:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
-
-# Starting position
-P:4:4
-]]
-
-- Map helper
library_quest.place_random = function(minY, minX, maxY, maxX, monster)
y = randint(maxY - minY + 1) + minY
@@ -184,16 +116,7 @@ function library_quest.print_spell(color, y, spl)
local lvl, na = get_level_school(s, 50, -50)
local xx, sch_str
- xx = nil
- sch_str = ""
- for index, sch in __spell_school[s] do
- if xx then
- sch_str = sch_str.."/"..school(sch).name
- else
- xx = 1
- sch_str = sch_str..school(sch).name
- end
- end
+ sch_str = spell_school_name(s)
if s == spl then
if na then
@@ -349,7 +272,7 @@ add_quest
return FALSE
end
- load_map(library_quest.MAP, 2, 2)
+ load_map("library.map", 2, 2)
level_flags2 = DF2_NO_GENO
-- generate the Liches 518
diff --git a/lib/scpt/stores.lua b/lib/scpt/stores.lua
index 713b3c01..03d29e6e 100644
--- a/lib/scpt/stores.lua
+++ b/lib/scpt/stores.lua
@@ -104,25 +104,6 @@ store_buy_list
},
}
--- Test only
-function out_sticks()
- local i
- for i = 0, __tmp_spells_num - 1 do
- if __tmp_spells[i].stick then
- if __tmp_spells[i].stick[TV_WAND] then
- print("Wand: " .. __tmp_spells[i].name)
- end
- end
- end
- for i = 0, __tmp_spells_num - 1 do
- if __tmp_spells[i].stick then
- if __tmp_spells[i].stick[TV_STAFF] then
- print("Staff: " .. __tmp_spells[i].name)
- end
- end
- end
-end
-
-- Take care to have Magic shop/Temple have specific spells only
add_hooks
{
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 4bfad7ef..e2e62644 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -3,7 +3,7 @@ ADD_SUBDIRECTORY(lua)
SET(SRCS
main-gcu.c main-x11.c main-xaw.c main-sdl.c main-gtk2.c
- z-rand.c z-util.c z-form.c z-virt.c z-term.c z-sock.c
+ z-rand.c z-util.c z-form.c z-virt.c z-term.c
variable.c tables.c plots.c util.c cave.c dungeon.c
melee1.c melee2.c modules.c
object1.c object2.c randart.c squeltch.c traps.c
@@ -14,7 +14,7 @@ SET(SRCS
cmd1.c cmd2.c cmd3.c cmd4.c cmd5.c cmd6.c cmd7.c
help.c
generate.c gen_maze.c gen_evol.c wild.c levels.c store.c bldg.c
- cmovie.c irc.c
+ cmovie.c
wizard2.c init2.c birth.c wizard1.c init1.c main.c
# Lua bits:
lua_bind.c script.c w_mnster.c w_player.c w_play_c.c w_z_pack.c
diff --git a/src/angband.h b/src/angband.h
index 8e0ad1f9..cac38122 100644
--- a/src/angband.h
+++ b/src/angband.h
@@ -14,6 +14,12 @@
*/
+/*
+ * C++ guard.
+ */
+#ifdef __cplusplus
+extern "C" {
+#endif
/*
* First, include the low-level includes. Be sure to edit "h-config.h"
@@ -30,7 +36,6 @@
#include "z-form.h"
#include "z-rand.h"
#include "z-term.h"
-#include "z-sock.h"
/*
@@ -95,6 +100,9 @@
* of the author Robert Alan Koeneke.
*/
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
#endif
diff --git a/src/birth.c b/src/birth.c
index fa74c5e2..f073b2f6 100644
--- a/src/birth.c
+++ b/src/birth.c
@@ -200,7 +200,7 @@ static void save_prev_data(void)
/*
* Load the previous data
*/
-static void load_prev_data(bool save)
+static void load_prev_data(bool_ save)
{
int i;
@@ -822,8 +822,8 @@ static void player_wipe(void)
{
int i, j;
- bool *powers;
- bool *corruptions;
+ bool_ *powers;
+ bool_ *corruptions;
/* Wipe special levels */
@@ -844,7 +844,7 @@ static void player_wipe(void)
p_ptr->lives = 0;
/* Wipe the corruptions */
- (void)C_WIPE(p_ptr->corruptions, max_corruptions, bool);
+ (void)C_WIPE(p_ptr->corruptions, max_corruptions, bool_);
/* Wipe the history */
for (i = 0; i < 4; i++)
@@ -975,9 +975,6 @@ static void player_wipe(void)
total_winner = 0;
has_won = FALSE;
- /* Assume no panic save */
- panic_save = 0;
-
/* Assume no cheating */
noscore = 0;
wizard = 0;
@@ -1075,17 +1072,6 @@ void outfit_obj(int tv, int sv, int pval, int dd, int ds)
if (pval)
q_ptr->pval = pval;
- /* Merchants get a chest which is currently empty */
-#if 0 /* DGDGDGDG -- use a skill */
- if ((tv == TV_CHEST) && (cp_ptr->magic_key == MKEY_TELEKINESIS))
- {
- /* Put items into the chest */
- q_ptr->pval = -5;
-
- /* Set the number of items in the chest */
- q_ptr->pval2 = 6;
- }
-#endif
/* These objects are "storebought" */
q_ptr->ident |= IDENT_MENTAL;
q_ptr->number = damroll(dd, ds);
@@ -1105,20 +1091,13 @@ static void player_outfit(void)
{
int i;
- object_type forge;
-
- object_type *q_ptr;
-
-
/*
* Get an adventurer guide describing a bit of the
- * wilderness(useless for vanilla town)
+ * wilderness.
*/
- if (!vanilla_town)
{
- /* Get local object */
- q_ptr = &forge;
-
+ object_type forge;
+ object_type *q_ptr = &forge;
/* Hack -- Give the player an adventurer guide */
object_prep(q_ptr, lookup_kind(TV_PARCHMENT, 20));
q_ptr->number = 1;
@@ -1129,13 +1108,9 @@ static void player_outfit(void)
process_hooks(HOOK_BIRTH_OBJECTS, "()");
- /* Get local object */
- q_ptr = &forge;
-
- /* Get local object */
- q_ptr = &forge;
-
{
+ object_type forge;
+ object_type *q_ptr = &forge;
/* Hack -- Give the player some food */
object_prep(q_ptr, lookup_kind(TV_FOOD, SV_FOOD_RATION));
q_ptr->number = (byte)rand_range(3, 7);
@@ -1144,10 +1119,9 @@ static void player_outfit(void)
(void)inven_carry(q_ptr, FALSE);
}
- /* Get local object */
- q_ptr = &forge;
-
{
+ object_type forge;
+ object_type *q_ptr = &forge;
/* Hack -- Give the player some torches */
object_prep(q_ptr, lookup_kind(TV_LITE, SV_LITE_TORCH));
q_ptr->number = (byte)rand_range(3, 7);
@@ -1157,9 +1131,6 @@ static void player_outfit(void)
(void)inven_carry(q_ptr, FALSE);
}
- /* Get local object */
- q_ptr = &forge;
-
/* Rogues have a better knowledge of traps */
if (has_ability(AB_TRAPPING))
{
@@ -1171,6 +1142,8 @@ static void player_outfit(void)
t_info[TRAP_OF_FIRE_BOLT].ident = TRUE;
/* Hack -- Give the player a some ammo for the traps */
+ object_type forge;
+ object_type *q_ptr = &forge;
object_prep(q_ptr, lookup_kind(TV_SHOT, SV_AMMO_NORMAL));
q_ptr->number = (byte)rand_range(5, 15);
object_aware(q_ptr);
@@ -1252,7 +1225,7 @@ static void gen_random_quests(int n)
/* XXX XXX XXX Try until valid choice is found */
while (tries)
{
- bool ok;
+ bool_ ok;
tries--;
@@ -1636,9 +1609,9 @@ int dump_gods(int sel, int *choice, int max)
/* Ask questions */
-static bool do_quick_start = FALSE;
+static bool_ do_quick_start = FALSE;
-static bool player_birth_aux_ask()
+static bool_ player_birth_aux_ask()
{
int i, k, n, v, sel;
@@ -2131,20 +2104,6 @@ static bool player_birth_aux_ask()
}
/* Set class */
-#ifdef RESTRICT_COMBINATIONS
- if (!(restrictions & BIT(k)))
- {
- noscore |= 0x0020;
- message_add(MESSAGE_MSG, " ", TERM_VIOLET);
- message_add(MESSAGE_MSG, " ", TERM_VIOLET);
- message_add(MESSAGE_MSG, " ", TERM_VIOLET);
- message_add(MESSAGE_MSG, "***************************", TERM_VIOLET);
- message_add(MESSAGE_MSG, "***************************", TERM_VIOLET);
- message_add(MESSAGE_MSG, "********* Cheater *********", TERM_VIOLET);
- message_add(MESSAGE_MSG, "***************************", TERM_VIOLET);
- message_add(MESSAGE_MSG, "***************************", TERM_VIOLET);
- }
-#endif
p_ptr->pclass = class_types[k];
/* Choose class spec */
@@ -2542,7 +2501,7 @@ static const int birth_stat_costs[(18-10) + 1] =
*
* Taken from V 2.9.0
*/
-static bool player_birth_aux_point(void)
+static bool_ player_birth_aux_point(void)
{
int i;
@@ -2720,15 +2679,15 @@ static bool player_birth_aux_point(void)
/*
* Use the autoroller or not to generate a char
*/
-static bool player_birth_aux_auto()
+static bool_ player_birth_aux_auto()
{
int i, j, m, v;
int mode = 0;
- bool flag = FALSE;
+ bool_ flag = FALSE;
- bool prev = FALSE;
+ bool_ prev = FALSE;
char c;
@@ -2892,7 +2851,7 @@ static bool player_birth_aux_auto()
/* Auto-roll */
while (autoroll)
{
- bool accept = TRUE;
+ bool_ accept = TRUE;
/* Get a new character */
get_stats();
@@ -3070,7 +3029,7 @@ static bool player_birth_aux_auto()
* from continuously rolling up characters, which can be VERY
* expensive CPU wise. And it cuts down on player stupidity.
*/
-static bool player_birth_aux()
+static bool_ player_birth_aux()
{
char c;
@@ -3245,7 +3204,7 @@ static bool player_birth_aux()
/*
* Helper function for validate_bg().
*/
-static void validate_bg_aux(int chart, bool chart_checked[], char *buf)
+static void validate_bg_aux(int chart, bool_ chart_checked[], char *buf)
{
char *s;
@@ -3253,10 +3212,10 @@ static void validate_bg_aux(int chart, bool chart_checked[], char *buf)
/* Assume the chart does not exist */
- bool chart_exists = FALSE;
+ bool_ chart_exists = FALSE;
/* Assume the chart is not complete */
- bool chart_complete = FALSE;
+ bool_ chart_complete = FALSE;
int bg_max = max_bg_idx;
@@ -3318,7 +3277,7 @@ static void validate_bg(void)
{
int i, race;
- bool chart_checked[512];
+ bool_ chart_checked[512];
char buf[1024];
@@ -3413,14 +3372,6 @@ void player_birth(void)
message_add(MESSAGE_MSG, " ", TERM_L_BLUE);
message_add(MESSAGE_MSG, " ", TERM_L_BLUE);
- /* Verify autoskiller */
-#if 0
- if (validate_autoskiller(spp_ptr->skill_ideal) < 0)
- {
- message_add(MESSAGE_MSG, "WARNING: Bad autoskill chart", TERM_VIOLET);
- }
-#endif
-
/* Hack -- outfit the player */
player_outfit();
@@ -3449,7 +3400,7 @@ void player_birth(void)
while (TRUE)
{
int j;
- bool ok = TRUE;
+ bool_ ok = TRUE;
lev = rand_range(d_ptr->mindepth, d_ptr->maxdepth - 1);
@@ -3518,7 +3469,7 @@ void player_birth(void)
char savefile_module[46][80];
char savefile_names[46][30];
char savefile_desc[46][80];
-bool savefile_alive[46];
+bool_ savefile_alive[46];
int savefile_idx[46];
/*
@@ -3534,25 +3485,15 @@ int load_savefile_names()
/* Build the filename */
-#ifdef SAVEFILE_USE_UID
- strnfmt(tmp, 50, "user.%d.svg", player_uid);
-#else
strcpy(tmp, "global.svg");
-#endif /* SAVEFILE_USE_UID */
path_build(buf, 1024, ANGBAND_DIR_SAVE, tmp);
/* File type is "TEXT" */
FILE_TYPE(FILE_TYPE_TEXT);
- /* Grab permission */
- if (savefile_setuid) safe_setuid_grab();
-
/* Read the file */
fff = my_fopen(buf, "r");
- /* Drop permission */
- if (savefile_setuid) safe_setuid_drop();
-
/* Failure */
if (!fff) return (0);
@@ -3623,15 +3564,9 @@ int load_savefile_names()
/* File type is 'SAVE' */
FILE_TYPE(FILE_TYPE_SAVE);
- /* Grab permission */
- if (savefile_setuid) safe_setuid_grab();
-
/* Try to open the savefile */
fd = fd_open(savefile, O_RDONLY);
- /* Drop permission */
- if (savefile_setuid) safe_setuid_drop();
-
/* Still existing ? */
if (fd >= 0)
{
@@ -3662,25 +3597,15 @@ void save_savefile_names()
/* Build the filename */
-#ifdef SAVEFILE_USE_UID
- strnfmt(tmp, 50, "user.%d.svg", player_uid);
-#else
strcpy(tmp, "global.svg");
-#endif /* SAVEFILE_USE_UID */
path_build(buf, 1024, ANGBAND_DIR_SAVE, tmp);
/* File type is "TEXT" */
FILE_TYPE(FILE_TYPE_TEXT);
- /* Grab permission */
- if (savefile_setuid) safe_setuid_grab();
-
/* Read the file */
fff = my_fopen(buf, "w");
- /* Drop permission */
- if (savefile_setuid) safe_setuid_drop();
-
/* Failure */
if (!fff) return;
@@ -3752,9 +3677,9 @@ static void dump_savefiles(int sel, int max)
/* Asks for new game or load game */
-bool no_begin_screen = FALSE;
+bool_ no_begin_screen = FALSE;
-bool begin_screen()
+bool_ begin_screen()
{
int m, k, sel, max;
@@ -3838,15 +3763,9 @@ savefile_try_again:
strncpy(player_base, savefile_names[savefile_idx[sel - 2]], 32);
process_player_name(TRUE);
- /* Grab permission */
- if (savefile_setuid) safe_setuid_grab();
-
/* Remove the savefile */
fd_kill(savefile);
- /* Drop permission */
- if (savefile_setuid) safe_setuid_drop();
-
/* Restore 'player_base' and 'savefile' */
strncpy(player_base, player_base_save, 32);
process_player_name(TRUE);
diff --git a/src/bldg.c b/src/bldg.c
index 6a10a0f2..48e94e9f 100644
--- a/src/bldg.c
+++ b/src/bldg.c
@@ -16,7 +16,7 @@
#include "angband.h"
/* hack as in leave_store in store.c */
-static bool leave_bldg = FALSE;
+static bool_ leave_bldg = FALSE;
/* remember building location */
static int building_loc = 0;
@@ -25,7 +25,7 @@ static int building_loc = 0;
/*
* A helper function for is_state
*/
-bool is_state_aux(store_type *s_ptr, int state)
+bool_ is_state_aux(store_type *s_ptr, int state)
{
owner_type *ow_ptr = &ow_info[s_ptr->owner];
@@ -50,7 +50,7 @@ bool is_state_aux(store_type *s_ptr, int state)
/*
* Test if the state accords with the player
*/
-bool is_state(store_type *s_ptr, int state)
+bool_ is_state(store_type *s_ptr, int state)
{
if (state == STORE_NORMAL)
{
@@ -403,7 +403,7 @@ static void display_fruit(int row, int col, int fruit)
/*
* gamble_comm
*/
-static bool gamble_comm(int cmd)
+static bool_ gamble_comm(int cmd)
{
int roll1, roll2, roll3, choice, odds, win;
@@ -664,9 +664,9 @@ static bool gamble_comm(int cmd)
* ghost code does become a reality again. Does help to avoid filthy urchins.
* Resting at night is also a quick way to restock stores -KMW-
*/
-static bool inn_comm(int cmd)
+static bool_ inn_comm(int cmd)
{
- bool vampire;
+ bool_ vampire;
/* Extract race info */
@@ -694,7 +694,7 @@ static bool inn_comm(int cmd)
*/
case BACT_REST: /* Rest for the night */
{
- bool nighttime;
+ bool_ nighttime;
/* Extract the current time */
nighttime = ((bst(HOUR, turn) < 6) || (bst(HOUR, turn) >= 18));
@@ -782,24 +782,6 @@ static bool inn_comm(int cmd)
}
-#if 0 /* removes compiler warning */
-
-/*
- * share gold for thieves
- */
-static void share_gold(void)
-{
- int i;
-
-
- i = (p_ptr->lev * 2) * 10;
- msg_format("You collect %d gold pieces", i);
- msg_print(NULL);
- p_ptr->au += i;
-}
-
-#endif
-
/*
* Display quest information
*/
@@ -825,7 +807,7 @@ static void get_questinfo(int questnum)
/*
* Request a quest from the Lord.
*/
-static bool castle_quest(int y, int x)
+static bool_ castle_quest(int y, int x)
{
int plot = 0;
@@ -1041,7 +1023,7 @@ static void list_weapon(object_type *o_ptr, int row, int col)
/*
* Select melee weapons
*/
-static bool item_tester_hook_melee_weapon(object_type *o_ptr)
+static bool_ item_tester_hook_melee_weapon(object_type *o_ptr)
{
return (wield_slot(o_ptr) == INVEN_WIELD);
}
@@ -1049,7 +1031,7 @@ static bool item_tester_hook_melee_weapon(object_type *o_ptr)
/*
* compare_weapons -KMW-
*/
-static bool compare_weapons(void)
+static bool_ compare_weapons(void)
{
int item, item2, i;
@@ -1139,8 +1121,8 @@ static bool compare_weapons(void)
* sharpen arrows, repair armor, repair weapon
* -KMW-
*/
-static bool fix_item(int istart, int iend, int ispecific, bool iac,
- int ireward, bool set_reward)
+static bool_ fix_item(int istart, int iend, int ispecific, bool_ iac,
+ int ireward, bool_ set_reward)
{
int i;
@@ -1152,17 +1134,8 @@ static bool fix_item(int istart, int iend, int ispecific, bool iac,
char out_val[80], tmp_str[80];
- bool repaired = FALSE;
+ bool_ repaired = FALSE;
-#if 0
- if (set_reward && p_ptr->rewards[ireward])
- {
- msg_print("You already have been rewarded today.");
- msg_print(NULL);
-
- return (FALSE);
- }
-#endif
clear_bldg(5, 18);
strnfmt(tmp_str, 80, " Based on your skill, we can improve up to +%d", maxenchant);
prt(tmp_str, 5, 0);
@@ -1227,10 +1200,6 @@ static bool fix_item(int istart, int iend, int ispecific, bool iac,
}
else
{
-#if 0
- if (set_reward)
- p_ptr->rewards[ireward] = TRUE;
-#endif
msg_print("Press the spacebar to continue");
msg_print(NULL);
@@ -1247,7 +1216,7 @@ static bool fix_item(int istart, int iend, int ispecific, bool iac,
/*
* Research Item
*/
-static bool research_item(void)
+static bool_ research_item(void)
{
clear_bldg(5, 18);
return (identify_fully());
@@ -1309,7 +1278,7 @@ static void show_bounties(void)
/*
* Filter for corpses that currently have a bounty on them.
*/
-static bool item_tester_hook_bounty(object_type* o_ptr)
+static bool_ item_tester_hook_bounty(object_type* o_ptr)
{
int i;
@@ -1326,7 +1295,7 @@ static bool item_tester_hook_bounty(object_type* o_ptr)
}
/* Filter to match the quest monster's corpse. */
-static bool item_tester_hook_quest_monster(object_type* o_ptr)
+static bool_ item_tester_hook_quest_monster(object_type* o_ptr)
{
if ((o_ptr->tval == TV_CORPSE) &&
(o_ptr->pval2 == bounties[0][0])) return (TRUE);
@@ -1396,9 +1365,7 @@ static void sell_corpses(void)
/* Increase the number of collected bounties */
total_bounties++;
- inven_item_increase(item, -1);
- inven_item_describe(item);
- inven_item_optimize(item);
+ inc_stack_size(item, -1);
return;
}
@@ -1413,7 +1380,7 @@ static void sell_corpses(void)
/*
* Hook for bounty monster selection.
*/
-static bool mon_hook_bounty(int r_idx)
+static bool_ mon_hook_bounty(int r_idx)
{
monster_race* r_ptr = &r_info[r_idx];
@@ -1569,9 +1536,7 @@ static void sell_quest_monster(void)
msg_print(NULL);
}
- inven_item_increase(item, -1);
- inven_item_describe(item);
- inven_item_optimize(item);
+ inc_stack_size(item, -1);
}
@@ -1636,7 +1601,7 @@ void select_bounties(void)
/*
* Execute a building command
*/
-bool bldg_process_command(store_type *s_ptr, int i)
+bool_ bldg_process_command(store_type *s_ptr, int i)
{
store_action_type *ba_ptr = &ba_info[st_info[s_ptr->st_idx].actions[i]];
@@ -1644,11 +1609,11 @@ bool bldg_process_command(store_type *s_ptr, int i)
int bcost;
- bool paid = FALSE;
+ bool_ paid = FALSE;
- bool set_reward = FALSE;
+ bool_ set_reward = FALSE;
- bool recreate = FALSE;
+ bool_ recreate = FALSE;
if (is_state(s_ptr, STORE_LIKED))
@@ -1719,22 +1684,13 @@ bool bldg_process_command(store_type *s_ptr, int i)
break;
}
-#if 0
- case BACT_GREET_KING:
- {
- castle_greet();
- break;
- }
-
-#endif
-
case BACT_QUEST1:
case BACT_QUEST2:
case BACT_QUEST3:
case BACT_QUEST4:
{
int y = 1, x = 1;
- bool ok = FALSE;
+ bool_ ok = FALSE;
while ((x < cur_wid - 1) && !ok)
{
@@ -1810,16 +1766,6 @@ bool bldg_process_command(store_type *s_ptr, int i)
break;
}
-#if 0
-
- case BACT_GREET:
- {
- greet_char();
- break;
- }
-
-#endif
-
case BACT_ENCHANT_WEAPON:
{
paid = fix_item(INVEN_WIELD, INVEN_WIELD, 0, FALSE,
@@ -1894,24 +1840,6 @@ bool bldg_process_command(store_type *s_ptr, int i)
break;
}
- /* set timed reward flag */
- case BACT_GOLD:
- {
-#if 0
- if (!p_ptr->rewards[BACT_GOLD])
- {
- share_gold();
- p_ptr->rewards[BACT_GOLD] = TRUE;
- }
- else
- {
- msg_print("You just had your daily allowance!");
- msg_print(NULL);
- }
-#endif
- break;
- }
-
case BACT_ENCHANT_ARROWS:
{
paid = fix_item(0, INVEN_WIELD, TV_ARROW, FALSE,
@@ -1979,7 +1907,7 @@ bool bldg_process_command(store_type *s_ptr, int i)
case BACT_DIVINATION:
{
int i, count = 0;
- bool something = FALSE;
+ bool_ something = FALSE;
while (count < 1000)
{
@@ -2161,12 +2089,10 @@ void do_cmd_bldg(void)
char command;
- bool validcmd;
+ bool_ validcmd;
store_type *s_ptr;
- store_info_type *st_ptr;
-
store_action_type *ba_ptr;
@@ -2180,7 +2106,6 @@ void do_cmd_bldg(void)
building_loc = which;
s_ptr = &town_info[p_ptr->town_num].store[which];
- st_ptr = &st_info[which];
p_ptr->oldpy = p_ptr->py;
p_ptr->oldpx = p_ptr->px;
diff --git a/src/cave.c b/src/cave.c
index 1c229780..d23fc44c 100644
--- a/src/cave.c
+++ b/src/cave.c
@@ -42,7 +42,7 @@ int distance(int y1, int x1, int y2, int x2)
* Returns TRUE if a grid is considered to be a wall for the purpose
* of magic mapping / clairvoyance
*/
-static bool is_wall(cave_type *c_ptr)
+static bool_ is_wall(cave_type *c_ptr)
{
byte feat;
@@ -106,7 +106,7 @@ static bool is_wall(cave_type *c_ptr)
*
* Use the "update_view()" function to determine player line-of-sight.
*/
-bool los(int y1, int x1, int y2, int x2)
+bool_ los(int y1, int x1, int y2, int x2)
{
/* Delta */
int dx, dy;
@@ -333,7 +333,7 @@ bool los(int y1, int x1, int y2, int x2)
/*
* Returns true if the player's grid is dark
*/
-bool no_lite(void)
+bool_ no_lite(void)
{
return (!player_can_see_bold(p_ptr->py, p_ptr->px));
}
@@ -345,7 +345,7 @@ bool no_lite(void)
*
* Used by destruction spells, and for placing stairs, etc.
*/
-bool cave_valid_bold(int y, int x)
+bool_ cave_valid_bold(int y, int x)
{
cave_type *c_ptr = &cave[y][x];
@@ -508,7 +508,7 @@ static void image_random(byte *ap, char *cp)
#else
-static bool feat_supports_lighting(byte feat)
+static bool_ feat_supports_lighting(byte feat)
{
if (f_info[feat].flags1 & FF1_SUPPORT_LIGHT) return TRUE;
else return FALSE;
@@ -615,7 +615,7 @@ static byte multi_hued_attr(monster_race *r_ptr)
/* Check breaths */
for (i = 0; i < 32; i++)
{
- bool stored = FALSE;
+ bool_ stored = FALSE;
/* Don't have that breath */
if (!(r_ptr->flags4 & (1L << i))) continue;
@@ -866,16 +866,8 @@ static byte darker_attrs[16] =
};
-#ifdef USE_TRANSPARENCY
-#ifdef USE_EGO_GRAPHICS
void map_info(int y, int x, byte *ap, char *cp, byte *tap, char *tcp,
byte *eap, char *ecp)
-#else /* USE_EGO_GRAPHICS */
-void map_info(int y, int x, byte *ap, char *cp, byte *tap, char *tcp)
-#endif /* USE_EGO_GRAPHICS */
-#else /* USE_TRANSPARENCY */
-void map_info(int y, int x, byte *ap, char *cp)
-#endif /* USE_TRANSPARENCY */
{
cave_type *c_ptr;
@@ -902,7 +894,7 @@ void map_info(int y, int x, byte *ap, char *cp)
* col col+1 col+2
* row base darker brighter
*/
- bool graf_new = ((graphics_mode == GRAPHICS_ISO) ||
+ bool_ graf_new = ((graphics_mode == GRAPHICS_ISO) ||
(graphics_mode == GRAPHICS_NEW));
/*
@@ -911,7 +903,7 @@ void map_info(int y, int x, byte *ap, char *cp)
* go for better graphics support... Anyway this means a port allows
* changing attr independently from its char -- pelpel
*/
- bool attr_mutable = (!use_graphics ||
+ bool_ attr_mutable = (!use_graphics ||
(graphics_mode == GRAPHICS_IBM));
@@ -943,14 +935,10 @@ void map_info(int y, int x, byte *ap, char *cp)
f_ptr = &f_info[feat];
-#ifdef USE_EGO_GRAPHICS
-
/* Reset attr/char */
*eap = 0;
*ecp = 0;
-#endif /* USE_EGO_GRAPHICS */
-
/**** Layer 1 -- Terrain feature ****/
@@ -994,8 +982,6 @@ void map_info(int y, int x, byte *ap, char *cp)
(t_info[t_idx].g_char != 0))
{
-#ifdef USE_EGO_GRAPHICS
-
if (graf_new)
{
*eap = t_info[t_idx].g_attr;
@@ -1007,13 +993,6 @@ void map_info(int y, int x, byte *ap, char *cp)
c = t_info[t_idx].g_char;
}
-#else /* USE_EGO_GRAPHICS */
-
- a = t_info[t_idx].g_attr;
- c = t_info[t_idx].g_char;
-
-#endif /* USE_EGO_GRAPHICS */
-
}
else
{
@@ -1242,14 +1221,10 @@ void map_info(int y, int x, byte *ap, char *cp)
image_random(ap, cp);
}
-#ifdef USE_TRANSPARENCY
-
/* Save the terrain info for the transparency effects */
*tap = a;
*tcp = c;
-#endif /* USE_TRANSPARENCY */
-
/* Save the info */
*ap = a;
*cp = c;
@@ -1336,19 +1311,13 @@ void map_info(int y, int x, byte *ap, char *cp)
{
monster_race *r_ptr = race_inf(m_ptr);
-#ifdef USE_EGO_GRAPHICS
-
/* Reset attr/char */
*eap = 0;
*ecp = 0;
-#endif /* USE_EGO_GRAPHICS */
-
if (use_graphics)
{
-#ifdef USE_EGO_GRAPHICS
-
if (graf_new)
{
monster_ego *re_ptr = &re_info[m_ptr->ego];
@@ -1360,8 +1329,6 @@ void map_info(int y, int x, byte *ap, char *cp)
*ecp = re_ptr->g_char;
}
-#endif /* USE_EGO_GRAPHICS */
-
/* Use base monster */
r_ptr = &r_info[m_ptr->r_idx];
}
@@ -1469,14 +1436,10 @@ void map_info(int y, int x, byte *ap, char *cp)
{
monster_race *r_ptr = &r_info[p_ptr->body_monster];
-#ifdef USE_EGO_GRAPHICS
-
/* Reset attr/char */
*eap = 0;
*ecp = 0;
-#endif /* USE_EGO_GRAPHICS */
-
/* Get the "player" attr */
if (!avoid_other && attr_mutable && (r_ptr->flags1 & RF1_ATTR_MULTI))
{
@@ -1511,8 +1474,6 @@ void map_info(int y, int x, byte *ap, char *cp)
break;
}
-#ifdef VARIABLE_PLAYER_GRAPH
-
case GRAPHICS_OLD:
{
if (player_symbols)
@@ -1524,10 +1485,6 @@ void map_info(int y, int x, byte *ap, char *cp)
break;
}
-#endif /* VARIABLE_PLAYER_GRAPH */
-
-#ifdef USE_EGO_GRAPHICS
-
case GRAPHICS_ISO:
case GRAPHICS_NEW:
{
@@ -1557,8 +1514,6 @@ void map_info(int y, int x, byte *ap, char *cp)
break;
}
-#endif /* USE_EGO_GRAPHICS */
-
}
/* Save the info */
@@ -1591,7 +1546,7 @@ void map_info_default(int y, int x, byte *ap, char *cp)
byte c;
- bool use_graphics_hack = use_graphics;
+ bool_ use_graphics_hack = use_graphics;
byte graphics_mode_hack = graphics_mode;
@@ -2194,25 +2149,16 @@ void lite_spot(int y, int x)
byte a, a2;
byte c, c2;
-#ifdef USE_TRANSPARENCY
byte ta;
char tc;
-# ifdef USE_EGO_GRAPHICS
byte ea;
char ec;
-# endif /* USE_EGO_GRAPHICS */
-#endif /* USE_TRANSPARENCY */
-
/* Redraw if on screen */
if (panel_contains(y, x))
{
-#ifdef USE_TRANSPARENCY
-
-# ifdef USE_EGO_GRAPHICS
-
/* Examine the grid */
map_info(y, x, &a, (char*)&c, &ta, &tc, &ea, &ec);
@@ -2233,54 +2179,6 @@ void lite_spot(int y, int x)
Term_queue_char(panel_col_of(x) + 1, y - panel_row_prt, a2, c2, 0, 0, 0, 0);
}
-# else /* USE_EGO_GRAPHICS */
-
- /* Examine the grid */
- map_info(y, x, &a, &c, &ta, &tc);
-
- /* Hack -- Queue it */
- Term_queue_char(panel_col_of(x), y - panel_row_prt, a, c, ta, tc);
- if (use_bigtile)
- {
- if (a & 0x80)
- {
- a2 = 255;
- c2 = 255;
- }
- else
- {
- a2 = TERM_WHITE;
- c2 = ' ';
- }
- Term_queue_char(panel_col_of(x) + 1, y - panel_row_prt, a2, c2, 0, 0);
- }
-
-# endif /* USE_EGO_GRAPHICS */
-
-#else /* USE_TRANSPARENCY */
-
- /* Examine the grid */
- map_info(y, x, &a, (char *) &c);
-
- /* Hack -- Queue it */
- Term_queue_char(panel_col_of(x), y - panel_row_prt, a, c);
- if (use_bigtile)
- {
- if (a & 0x80)
- {
- a2 = 255;
- c2 = 255;
- }
- else
- {
- a2 = TERM_WHITE;
- c2 = ' ';
- }
- Term_queue_char(panel_col_of(x) + 1, y - panel_row_prt, a2, c2);
- }
-
-#endif /* USE_TRANSPARENCY */
-
}
}
@@ -2315,11 +2213,8 @@ void prt_map(void)
byte a, a2;
char c, c2;
-#ifdef USE_TRANSPARENCY
byte ta;
char tc;
-
-#ifdef USE_EGO_GRAPHICS
byte ea;
char ec;
@@ -2342,48 +2237,6 @@ void prt_map(void)
}
Term_queue_char(panel_col_of(x) + 1, y - panel_row_prt, a2, c2, 0, 0, 0, 0);
}
-#else /* USE_EGO_GRAPHICS */
-/* Determine what is there */
- map_info(y, x, &a, &c, &ta, &tc);
- /* Efficiency -- Redraw that grid of the map */
- Term_queue_char(panel_col_of(x), y - panel_row_prt, a, c, ta, tc);
- if (use_bigtile)
- {
- if (a & 0x80)
- {
- a2 = 255;
- c2 = 255;
- }
- else
- {
- a2 = TERM_WHITE;
- c2 = ' ';
- }
- Term_queue_char(panel_col_of(x) + 1, y - panel_row_prt, a2, c2, 0, 0);
- }
-
-#endif /* USE_EGO_GRAPHICS */
-#else /* USE_TRANSPARENCY */
- /* Determine what is there */
- map_info(y, x, &a, &c);
-
- /* Efficiency -- Redraw that grid of the map */
- Term_queue_char(panel_col_of(x), y - panel_row_prt, a, c);
- if (use_bigtile)
- {
- if (a & 0x80)
- {
- a2 = 255;
- c2 = 255;
- }
- else
- {
- a2 = TERM_WHITE;
- c2 = ' ';
- }
- Term_queue_char(panel_col_of(x) + 1, y - panel_row_prt, a2, c2);
- }
-#endif /* USE_TRANSPARENCY */
}
}
@@ -2544,8 +2397,8 @@ void display_map(int *cy, int *cx)
byte **mp;
- bool old_view_special_lite;
- bool old_view_granite_lite;
+ bool_ old_view_special_lite;
+ bool_ old_view_granite_lite;
int hgt, wid, yrat, xrat, yfactor, xfactor;
@@ -2626,15 +2479,7 @@ void display_map(int *cy, int *cx)
x = i * xfactor / xrat + 1;
/* Extract the current attr/char at that map location */
-#ifdef USE_TRANSPARENCY
-# ifdef USE_EGO_GRAPHICS
map_info(j, i, &ta, &tc, &ta, &tc, &ta, &tc);
-# else /* USE_EGO_GRAPHICS */
- map_info(j, i, &ta, &tc, &ta, &tc);
-# endif /* USE_EGO_GRAPHICS */
-#else /* USE_TRANSPARENCY */
- map_info(j, i, &ta, &tc);
-#endif /* USE_TRANSPARENCY */
/* Extract the priority of that attr/char */
tp = priority(ta, tc);
@@ -3362,7 +3207,7 @@ struct vinfo_hack
*
* We use "u" to point to an array of long integers.
*/
-static bool ang_sort_comp_hook_longs(vptr u, vptr v, int a, int b)
+static bool_ ang_sort_comp_hook_longs(vptr u, vptr v, int a, int b)
{
long *x = (long*)(u);
@@ -3543,14 +3388,11 @@ errr vinfo_init(void)
{
int e;
- vinfo_type *p;
-
-
/* Index */
e = queue_head;
/* Dequeue next grid */
- p = queue[queue_head++];
+ queue_head++;
/* Location of main grid */
y = vinfo[e].grid_y[0];
@@ -4197,7 +4039,7 @@ void update_mon_lite(void)
cave_type *c_ptr;
u16b info;
- bool invis;
+ bool_ invis;
s16b fast_lite_n = lite_n;
s16b fast_temp_n;
@@ -4927,29 +4769,6 @@ void mmove2(int *y, int *x, int y1, int x1, int y2, int x2)
/* Move mostly vertically */
if (dy > dx)
{
-
-#if 0
-
- int k;
-
- /* Starting shift factor */
- shift = dy >> 1;
-
- /* Extract a shift factor */
- for (k = 0; k < dist; k++)
- {
- if (shift <= 0) shift += dy;
- shift -= dx;
- }
-
- /* Sometimes move along minor axis */
- if (shift <= 0) (*x) = (x2 < x1) ? (*x - 1) : (*x + 1);
-
- /* Always move along major axis */
- (*y) = (y2 < y1) ? (*y - 1) : (*y + 1);
-
-#endif
-
/* Extract a shift factor */
shift = (dist * dx + (dy - 1) / 2) / dy;
@@ -4963,29 +4782,6 @@ void mmove2(int *y, int *x, int y1, int x1, int y2, int x2)
/* Move mostly horizontally */
else
{
-
-#if 0
-
- int k;
-
- /* Starting shift factor */
- shift = dx >> 1;
-
- /* Extract a shift factor */
- for (k = 0; k < dist; k++)
- {
- if (shift <= 0) shift += dx;
- shift -= dy;
- }
-
- /* Sometimes move along minor axis */
- if (shift <= 0) (*y) = (y2 < y1) ? (*y - 1) : (*y + 1);
-
- /* Always move along major axis */
- (*x) = (x2 < x1) ? (*x - 1) : (*x + 1);
-
-#endif
-
/* Extract a shift factor */
shift = (dist * dy + (dx - 1) / 2) / dx;
@@ -5005,7 +4801,7 @@ void mmove2(int *y, int *x, int y1, int x1, int y2, int x2)
*
* This is slightly (but significantly) different from "los(y1,x1,y2,x2)".
*/
-bool projectable(int y1, int x1, int y2, int x2)
+bool_ projectable(int y1, int x1, int y2, int x2)
{
int dist, y, x;
@@ -5050,15 +4846,11 @@ bool projectable(int y1, int x1, int y2, int x2)
*
* Currently the "m" parameter is unused.
*/
-void scatter(int *yp, int *xp, int y, int x, int d, int m)
+void scatter(int *yp, int *xp, int y, int x, int d)
{
int nx, ny;
int attempts_left = 5000;
- /* Unused */
- m = m;
-
-
/* Pick a location */
while (--attempts_left)
{
diff --git a/src/cmd1.c b/src/cmd1.c
index 12a30f48..49c0d38f 100644
--- a/src/cmd1.c
+++ b/src/cmd1.c
@@ -18,7 +18,7 @@
* Determine if the player "hits" a monster (normal combat).
* Note -- Always miss 5%, always hit 5%, otherwise random.
*/
-bool test_hit_fire(int chance, int ac, int vis)
+bool_ test_hit_fire(int chance, int ac, int vis)
{
int k;
@@ -49,7 +49,7 @@ bool test_hit_fire(int chance, int ac, int vis)
*
* Note -- Always miss 5%, always hit 5%, otherwise random.
*/
-bool test_hit_norm(int chance, int ac, int vis)
+bool_ test_hit_norm(int chance, int ac, int vis)
{
int k;
@@ -120,7 +120,7 @@ s16b critical_shot(int weight, int plus, int dam, int skill)
*
* Factor in weapon weight, total plusses, player level.
*/
-s16b critical_norm(int weight, int plus, int dam, int weapon_tval, bool *done_crit)
+s16b critical_norm(int weight, int plus, int dam, int weapon_tval, bool_ *done_crit)
{
int i, k, num = randint(5000);
@@ -635,7 +635,7 @@ void carry(int pickup)
*/
static void hit_trap(void)
{
- bool ident = FALSE;
+ bool_ ident = FALSE;
cave_type *c_ptr;
@@ -713,115 +713,12 @@ void touch_zap_player(monster_type *m_ptr)
}
}
-#if 0 /* not used, eliminates a compiler warning */
-static void natural_attack(s16b m_idx, int attack, bool *fear, bool *mdeath)
-{
- int k, bonus, chance;
-
- int n_weight = 0;
- bool done_crit;
-
- monster_type *m_ptr = &m_list[m_idx];
-
- char m_name[80];
-
- int dss, ddd;
-
- char *atk_desc;
-
-
- switch (attack)
- {
- default:
- {
- dss = ddd = n_weight = 1;
- atk_desc = "undefined body part";
-
- break;
- }
- }
-
- /* Extract monster name (or "it") */
- monster_desc(m_name, m_ptr, 0);
-
-
- /* Calculate the "attack quality" */
- bonus = p_ptr->to_h;
- chance = (p_ptr->skill_thn + (bonus * BTH_PLUS_ADJ));
-
- /* Test for hit */
- if (test_hit_norm(chance, m_ptr->ac, m_ptr->ml))
- {
- /* Sound */
- sound(SOUND_HIT);
-
- msg_format("You hit %s with your %s.", m_name, atk_desc);
-
- k = damroll(ddd, dss);
- k = critical_norm(n_weight, p_ptr->to_h, k, -1, &done_crit);
-
- /* Apply the player damage bonuses */
- k += p_ptr->to_d;
-
- /* No negative damage */
- if (k < 0) k = 0;
-
- /* Complex message */
- if (wizard)
- {
- msg_format("You do %d (out of %d) damage.", k, m_ptr->hp);
- }
-
- switch (is_friend(m_ptr))
- {
- case 1:
- {
- msg_format("%^s gets angry!", m_name);
- change_side(m_ptr);
-
- break;
- }
-
- case 0:
- {
- msg_format("%^s gets angry!", m_name);
- m_ptr->status = MSTATUS_NEUTRAL_M;
-
- break;
- }
- }
-
- /* Damage, check for fear and mdeath */
- switch (attack)
- {
- default:
- {
- *mdeath = mon_take_hit(m_idx, k, fear, NULL);
- break;
- }
- }
-
- touch_zap_player(m_ptr);
- }
-
- /* Player misses */
- else
- {
- /* Sound */
- sound(SOUND_MISS);
-
- /* Message */
- msg_format("You miss %s.", m_name);
- }
-}
-
-#endif
/*
* Carried monster can attack too.
* Based on monst_attack_monst.
*/
-static void carried_monster_attack(s16b m_idx, bool *fear, bool *mdeath,
+static void carried_monster_attack(s16b m_idx, bool_ *fear, bool_ *mdeath,
int x, int y)
{
monster_type *t_ptr = &m_list[m_idx];
@@ -830,8 +727,6 @@ static void carried_monster_attack(s16b m_idx, bool *fear, bool *mdeath,
monster_race *tr_ptr = race_inf(t_ptr);
- cave_type *c_ptr;
-
int ap_cnt;
int ac, rlev, pt;
@@ -842,7 +737,7 @@ static void carried_monster_attack(s16b m_idx, bool *fear, bool *mdeath,
char temp[80];
- bool blinked = FALSE, touched = FALSE;
+ bool_ blinked = FALSE, touched = FALSE;
byte y_saver = t_ptr->fy;
@@ -855,8 +750,6 @@ static void carried_monster_attack(s16b m_idx, bool *fear, bool *mdeath,
o_ptr = &p_ptr->inventory[INVEN_CARRY];
if (!o_ptr->k_idx) return;
- c_ptr = &cave[y][x];
-
r_ptr = &r_info[o_ptr->pval];
/* Not allowed to attack */
@@ -882,8 +775,8 @@ static void carried_monster_attack(s16b m_idx, bool *fear, bool *mdeath,
/* Scan through all four blows */
for (ap_cnt = 0; ap_cnt < 4; ap_cnt++)
{
- bool visible = FALSE;
- bool obvious = FALSE;
+ bool_ visible = FALSE;
+ bool_ obvious = FALSE;
int power = 0;
int damage = 0;
@@ -911,128 +804,8 @@ static void carried_monster_attack(s16b m_idx, bool *fear, bool *mdeath,
/* Extract visibility (before blink) */
visible = TRUE;
-#if 0
-
- /* Extract visibility from carrying lite */
- if (r_ptr->flags9 & RF9_HAS_LITE) visible = TRUE;
-
-#endif /* 0 */
-
/* 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;
- case RBE_DISEASE:
- power = 5;
- break;
- case RBE_TIME:
- power = 5;
- break;
- case RBE_SANITY:
- power = 60;
- break;
- case RBE_HALLU:
- power = 10;
- break;
- case RBE_PARASITE:
- power = 5;
- break;
- case RBE_ABOMINATION:
- power = 20;
- break;
- }
-
+ power = get_attack_power(effect);
/* Monster hits */
if (!effect || check_hit2(power, rlev, ac))
@@ -1469,7 +1242,7 @@ static void carried_monster_attack(s16b m_idx, bool *fear, bool *mdeath,
* Carried monster can attack too.
* Based on monst_attack_monst.
*/
-static void incarnate_monster_attack(s16b m_idx, bool *fear, bool *mdeath,
+static void incarnate_monster_attack(s16b m_idx, bool_ *fear, bool_ *mdeath,
int x, int y)
{
monster_type *t_ptr = &m_list[m_idx];
@@ -1478,8 +1251,6 @@ static void incarnate_monster_attack(s16b m_idx, bool *fear, bool *mdeath,
monster_race *tr_ptr = race_inf(t_ptr);
- cave_type *c_ptr;
-
int ap_cnt;
int ac, rlev, pt;
@@ -1488,7 +1259,7 @@ static void incarnate_monster_attack(s16b m_idx, bool *fear, bool *mdeath,
char temp[80];
- bool blinked = FALSE, touched = FALSE;
+ bool_ blinked = FALSE, touched = FALSE;
byte y_saver = t_ptr->fy;
@@ -1497,8 +1268,6 @@ static void incarnate_monster_attack(s16b m_idx, bool *fear, bool *mdeath,
if (!p_ptr->body_monster) return;
- c_ptr = &cave[y][x];
-
r_ptr = race_info_idx(p_ptr->body_monster, 0);
/* Not allowed to attack */
@@ -1525,8 +1294,8 @@ static void incarnate_monster_attack(s16b m_idx, bool *fear, bool *mdeath,
for (ap_cnt = 0; ap_cnt < (p_ptr->num_blow > 4) ? 4 : p_ptr->num_blow;
ap_cnt++)
{
- bool visible = FALSE;
- bool obvious = FALSE;
+ bool_ visible = FALSE;
+ bool_ obvious = FALSE;
int power = 0;
int damage = 0;
@@ -1554,117 +1323,8 @@ static void incarnate_monster_attack(s16b m_idx, bool *fear, bool *mdeath,
/* Extract visibility (before blink) */
visible = TRUE;
-#if 0
-
- /* Extract visibility from carrying lite */
- if (r_ptr->flags9 & RF9_HAS_LITE) visible = TRUE;
-
-#endif /* 0 */
-
/* 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;
- case RBE_DISEASE:
- power = 5;
- break;
- case RBE_TIME:
- power = 5;
- break;
- case RBE_SANITY:
- power = 60;
- break;
- case RBE_HALLU:
- power = 10;
- break;
- case RBE_PARASITE:
- power = 5;
- break;
- }
-
+ effect = get_attack_power(effect);
/* Monster hits */
if (!effect || check_hit2(power, rlev, ac))
@@ -2106,7 +1766,7 @@ static void incarnate_monster_attack(s16b m_idx, bool *fear, bool *mdeath,
static void flavored_attack(int percent, char *output)
{
int insanity = (p_ptr->msane - p_ptr->csane) * 100 / p_ptr->msane;
- bool insane = (rand_int(100) < insanity);
+ bool_ insane = (rand_int(100) < insanity);
if (percent < 5)
{
@@ -2235,8 +1895,8 @@ static void py_attack_hand(int *k, monster_type *m_ptr, s32b *special)
int resist_stun = 0, max = MAX_MA;
monster_race *r_ptr = race_inf(m_ptr);
char m_name[80];
- bool desc = FALSE;
- bool done_crit;
+ bool_ desc = FALSE;
+ bool_ done_crit;
int plev = p_ptr->lev;
if ((!p_ptr->body_monster) && (p_ptr->mimic_form == resolve_mimic_name("Bear")) &&
@@ -2389,8 +2049,8 @@ void do_nazgul(int *k, int *num, int num_blow, int weap, monster_race *r_ptr,
{
u32b f1, f2, f3, f4, f5, esp;
- bool mundane;
- bool allow_shatter = TRUE;
+ bool_ mundane;
+ bool_ allow_shatter = TRUE;
/* Extract mundane-ness of the current weapon */
object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp);
@@ -2410,8 +2070,8 @@ void do_nazgul(int *k, int *num, int num_blow, int weap, monster_race *r_ptr,
{
msg_print("Your weapon *DISINTEGRATES*!");
*k = 0;
- inven_item_increase(INVEN_WIELD + weap, -1);
- inven_item_optimize(INVEN_WIELD + weap);
+
+ inc_stack_size_ex(INVEN_WIELD + weap, -1, OPTIMIZE, NO_DESCRIBE);
/* To stop attacking */
*num = num_blow;
@@ -2429,8 +2089,8 @@ void do_nazgul(int *k, int *num, int num_blow, int weap, monster_race *r_ptr,
if (magik(25) && allow_shatter)
{
msg_print("Your weapon is destroyed!");
- inven_item_increase(INVEN_WIELD + weap, -1);
- inven_item_optimize(INVEN_WIELD + weap);
+
+ inc_stack_size_ex(INVEN_WIELD + weap, -1, OPTIMIZE, NO_DESCRIBE);
/* To stop attacking */
*num = num_blow;
@@ -2451,8 +2111,8 @@ void do_nazgul(int *k, int *num, int num_blow, int weap, monster_race *r_ptr,
if (!rand_int(1000) && allow_shatter)
{
msg_print("Your weapon is destroyed!");
- inven_item_increase(INVEN_WIELD + weap, -1);
- inven_item_optimize(INVEN_WIELD + weap);
+
+ inc_stack_size_ex(INVEN_WIELD + weap, -1, OPTIMIZE, NO_DESCRIBE);
/* To stop attacking */
*num = num_blow;
@@ -2495,23 +2155,23 @@ void py_attack(int y, int x, int max_blow)
char m_name[80];
- bool fear = FALSE;
+ bool_ fear = FALSE;
- bool mdeath = FALSE;
+ bool_ mdeath = FALSE;
- bool backstab = FALSE;
+ bool_ backstab = FALSE;
- bool vorpal_cut = FALSE;
+ bool_ vorpal_cut = FALSE;
int chaos_effect = 0;
- bool stab_fleeing = FALSE;
+ bool_ stab_fleeing = FALSE;
- bool do_quake = FALSE;
+ bool_ do_quake = FALSE;
- bool done_crit = FALSE;
+ bool_ done_crit = FALSE;
- bool drain_msg = TRUE;
+ bool_ drain_msg = TRUE;
int drain_result = 0, drain_heal = 0;
@@ -2520,8 +2180,6 @@ void py_attack(int y, int x, int max_blow)
/* A massive hack -- life-draining weapons */
u32b f1, f2, f3, f4, f5, esp;
- bool no_extra = FALSE;
-
int weap;
/* Disturb the player */
@@ -2992,7 +2650,6 @@ void py_attack(int y, int x, int max_blow)
msg_format("%^s disappears!", m_name);
teleport_away(c_ptr->m_idx, 50);
num = num_blow + 1; /* Can't hit it anymore! */
- no_extra = TRUE;
}
else if ((chaos_effect == 5) && cave_floor_bold(y, x) &&
@@ -3076,14 +2733,14 @@ void py_attack(int y, int x, int max_blow)
-static bool pattern_tile(int y, int x)
+static bool_ pattern_tile(int y, int x)
{
return ((cave[y][x].feat <= FEAT_PATTERN_XTRA2) &&
(cave[y][x].feat >= FEAT_PATTERN_START));
}
-static bool pattern_seq(int c_y, int c_x, int n_y, int n_x)
+static bool_ pattern_seq(int c_y, int c_x, int n_y, int n_x)
{
if (!(pattern_tile(c_y, c_x)) && !(pattern_tile(n_y, n_x)))
return TRUE;
@@ -3197,11 +2854,11 @@ static bool pattern_seq(int c_y, int c_x, int n_y, int n_x)
-bool player_can_enter(byte feature)
+bool_ player_can_enter(byte feature)
{
- bool pass_wall;
+ bool_ pass_wall;
- bool only_wall = FALSE;
+ bool_ only_wall = FALSE;
/* Player can not walk through "walls" unless in Shadow Form */
@@ -3279,7 +2936,7 @@ bool player_can_enter(byte feature)
* any monster which might be in the destination grid. Previously,
* moving into walls was "free" and did NOT hit invisible monsters.
*/
-void move_player_aux(int dir, int do_pickup, int run, bool disarm)
+void move_player_aux(int dir, int do_pickup, int run, bool_ disarm)
{
int y, x, tmp;
@@ -3291,11 +2948,11 @@ void move_player_aux(int dir, int do_pickup, int run, bool disarm)
char m_name[80];
- bool stormbringer = FALSE;
+ bool_ stormbringer = FALSE;
- bool old_dtrap, new_dtrap;
+ bool_ old_dtrap, new_dtrap;
- bool oktomove = TRUE;
+ bool_ oktomove = TRUE;
/* Hack - random movement */
@@ -3510,8 +3167,6 @@ void move_player_aux(int dir, int do_pickup, int run, bool disarm)
oktomove = FALSE;
}
-#ifdef ALLOW_EASY_DISARM /* TNB */
-
/* Disarm a visible trap */
else if (easy_disarm && disarm && (c_ptr->info & (CAVE_TRDT)))
{
@@ -3527,8 +3182,6 @@ void move_player_aux(int dir, int do_pickup, int run, bool disarm)
oktomove = FALSE;
}
-#endif /* ALLOW_EASY_DISARM -- TNB */
-
/* Player can't enter ? soo bad for him/her ... */
else if (!player_can_enter(c_ptr->feat))
{
@@ -3603,15 +3256,11 @@ void move_player_aux(int dir, int do_pickup, int run, bool disarm)
/* Closed doors */
else if ((c_ptr->feat >= FEAT_DOOR_HEAD) && (c_ptr->feat <= FEAT_DOOR_TAIL))
{
-#ifdef ALLOW_EASY_OPEN
-
if (easy_open)
{
if (easy_open_door(y, x)) return;
}
else
-#endif /* ALLOW_EASY_OPEN */
-
{
msg_print("There is a closed door blocking your way.");
@@ -3794,31 +3443,6 @@ void move_player_aux(int dir, int do_pickup, int run, bool disarm)
command_new = '_';
}
-#if 0 /* These are noxious -- pelpel */
-
- /* Handle quest areas -KMW- */
- else if (cave[y][x].feat == FEAT_QUEST_ENTER)
- {
- /* Disturb */
- disturb(0, 0);
-
- /* Hack -- Enter quest level */
- command_new = '[';
- }
-
- else if (cave[y][x].feat == FEAT_QUEST_EXIT)
- {
- leaving_quest = p_ptr->inside_quest;
-
- p_ptr->inside_quest = cave[y][x].special;
- dun_level = 0;
- p_ptr->oldpx = 0;
- p_ptr->oldpy = 0;
- p_ptr->leaving = TRUE;
- }
-
-#endif /* 0 */
-
else if (cave[y][x].feat >= FEAT_ALTAR_HEAD &&
cave[y][x].feat <= FEAT_ALTAR_TAIL)
{
@@ -3879,7 +3503,7 @@ void move_player_aux(int dir, int do_pickup, int run, bool disarm)
}
}
-void move_player(int dir, int do_pickup, bool disarm)
+void move_player(int dir, int do_pickup, bool_ disarm)
{
move_player_aux(dir, do_pickup, 0, disarm);
}
@@ -4129,13 +3753,13 @@ static byte find_prevdir;
/*
* We are looking for open area
*/
-static bool find_openarea;
+static bool_ find_openarea;
/*
* We are looking for a break
*/
-static bool find_breakright;
-static bool find_breakleft;
+static bool_ find_breakright;
+static bool_ find_breakleft;
@@ -4247,7 +3871,7 @@ static void run_init(int dir)
*
* Return TRUE if the running should be stopped
*/
-static bool run_test(void)
+static bool_ run_test(void)
{
int prev_dir, new_dir, check_dir = 0;
@@ -4316,7 +3940,7 @@ static bool run_test(void)
/* Check memorized grids */
if (c_ptr->info & (CAVE_MARK))
{
- bool notice = TRUE;
+ bool_ notice = TRUE;
/*
* Examine the terrain -- conditional disturbance
@@ -4729,7 +4353,7 @@ void do_cmd_pet(void)
char power_desc[36][80];
- bool flag, redraw;
+ bool_ flag, redraw;
int ask;
@@ -4739,7 +4363,7 @@ void do_cmd_pet(void)
int pets = 0, pet_ctr = 0;
- bool all_pets = FALSE;
+ bool_ all_pets = FALSE;
monster_type *m_ptr;
@@ -5017,9 +4641,9 @@ void do_cmd_pet(void)
if ((!(r_ptr->flags7 & RF7_NO_DEATH)) && ((m_ptr->status == MSTATUS_PET) || (m_ptr->status == MSTATUS_FRIEND))) /* Get rid of it! */
{
- bool checked = FALSE;
+ bool_ checked = FALSE;
char command;
- bool delete_this = FALSE;
+ bool_ delete_this = FALSE;
if (all_pets)
{
@@ -5086,7 +4710,7 @@ void do_cmd_pet(void)
if ((!(r_ptr->flags7 & RF7_NO_DEATH)) && ((m_ptr->status == MSTATUS_COMPANION))) /* Get rid of it! */
{
- bool delete_this = FALSE;
+ bool_ delete_this = FALSE;
if (all_pets)
delete_this = TRUE;
@@ -5164,7 +4788,7 @@ void do_cmd_pet(void)
/*
* Incarnate into a body
*/
-bool do_cmd_integrate_body()
+bool_ do_cmd_integrate_body()
{
cptr q, s;
@@ -5213,7 +4837,7 @@ bool do_cmd_integrate_body()
/*
* Leave a body
*/
-bool do_cmd_leave_body(bool drop_body)
+bool_ do_cmd_leave_body(bool_ drop_body)
{
object_type *o_ptr, forge;
@@ -5277,7 +4901,7 @@ bool do_cmd_leave_body(bool drop_body)
}
-bool execute_inscription(byte i, byte y, byte x)
+bool_ execute_inscription(byte i, byte y, byte x)
{
cave_type *c_ptr = &cave[y][x];
@@ -5329,7 +4953,7 @@ bool execute_inscription(byte i, byte y, byte x)
{
int yy = y, xx = x;
- scatter(&yy, &xx, y, x, 3, 0);
+ scatter(&yy, &xx, y, x, 3);
place_monster_one(yy, xx, test_monster_name("Dwarven Warrior"),
0, FALSE, MSTATUS_FRIEND);
@@ -5376,7 +5000,7 @@ bool execute_inscription(byte i, byte y, byte x)
this_o_idx = next_o_idx)
{
object_type * o_ptr;
- bool plural = FALSE;
+ bool_ plural = FALSE;
char o_name[80];
diff --git a/src/cmd2.c b/src/cmd2.c
index 532245d6..2d05c125 100644
--- a/src/cmd2.c
+++ b/src/cmd2.c
@@ -17,7 +17,7 @@ void do_cmd_immovable_special(void);
/*
* Try to bash an altar
*/
-static bool do_cmd_bash_altar(int y, int x)
+static bool_ do_cmd_bash_altar(int y, int x)
{
msg_print("Are you mad? You want to anger the gods?");
return (FALSE);
@@ -27,13 +27,11 @@ static bool do_cmd_bash_altar(int y, int x)
/*
* Try to bash a fountain
*/
-static bool do_cmd_bash_fountain(int y, int x)
+static bool_ do_cmd_bash_fountain(int y, int x)
{
int bash, temp;
- cave_type *c_ptr;
-
- bool more = TRUE;
+ bool_ more = TRUE;
monster_race *r_ptr = &r_info[p_ptr->body_monster];
@@ -48,9 +46,6 @@ static bool do_cmd_bash_fountain(int y, int x)
/* Take a turn */
energy_use = 100;
- /* Get grid */
- c_ptr = &cave[y][x];
-
/* Message */
msg_print("You smash into the fountain!");
@@ -85,7 +80,7 @@ static bool do_cmd_bash_fountain(int y, int x)
*/
void do_cmd_go_up(void)
{
- bool go_up = FALSE, go_up_many = FALSE, prob_traveling = FALSE;
+ bool_ go_up = FALSE, go_up_many = FALSE, prob_traveling = FALSE;
cave_type *c_ptr;
@@ -193,17 +188,7 @@ void do_cmd_go_up(void)
if (go_up || go_up_many)
{
-#if 0
- /*
- * I'm experimenting without this... otherwise the monsters get to
- * act first when we go up stairs, theoretically resulting in a possible
- * insta-death.
- */
- /* Hack -- take a turn */
- energy_use = 100;
-#else
-energy_use = 0;
-#endif
+ energy_use = 0;
/* Success */
if (c_ptr->feat == FEAT_WAY_LESS)
@@ -211,13 +196,7 @@ energy_use = 0;
else
msg_print("You enter a maze of up staircases.");
- if (autosave_l)
- {
- is_autosave = TRUE;
- msg_print("Autosaving the game...");
- do_cmd_save_game();
- is_autosave = FALSE;
- }
+ autosave_checkpoint();
if (p_ptr->inside_quest)
{
@@ -259,22 +238,13 @@ energy_use = 0;
/*
* Returns TRUE if we are in the Between...
*/
-static bool between_effect(void)
+static bool_ between_effect(void)
{
byte bx, by;
if (cave[p_ptr->py][p_ptr->px].feat == FEAT_BETWEEN)
{
-#if 0 /* The Between is out of the space-time continuum anyway */
-
- if (p_ptr->resist_continuum)
- {
- msg_print("The space-time continuum can't be disrupted.");
- return (TRUE);
- }
-
-#endif
bx = cave[p_ptr->py][p_ptr->px].special & 255;
by = cave[p_ptr->py][p_ptr->px].special >> 8;
@@ -316,9 +286,9 @@ void do_cmd_go_down(void)
{
cave_type *c_ptr;
- bool go_down = FALSE, go_down_many = FALSE, prob_traveling = FALSE;
+ bool_ go_down = FALSE, go_down_many = FALSE, prob_traveling = FALSE;
- bool fall_trap = FALSE;
+ bool_ fall_trap = FALSE;
char i;
@@ -445,13 +415,7 @@ void do_cmd_go_down(void)
if (go_down || go_down_many)
{
-
-#if 0
- /* Hack -- take a turn */
- energy_use = 100;
-#else
energy_use = 0;
-#endif
if (fall_trap)
msg_print("You deliberately jump through the trap door.");
@@ -463,13 +427,7 @@ void do_cmd_go_down(void)
msg_print("You enter a maze of down staircases.");
}
- if (autosave_l)
- {
- is_autosave = TRUE;
- msg_print("Autosaving the game...");
- do_cmd_save_game();
- is_autosave = FALSE;
- }
+ autosave_checkpoint();
/* Go down */
if (go_down)
@@ -657,7 +615,7 @@ static void chest_death(int y, int x, s16b o_idx)
{
int number;
- bool small;
+ bool_ small;
object_type forge;
object_type *q_ptr;
@@ -735,7 +693,7 @@ static void chest_trap(int y, int x, s16b o_idx)
object_type *o_ptr = &o_list[o_idx];
- bool ident = FALSE;
+ bool_ ident = FALSE;
/* Ignore disarmed chests */
@@ -765,13 +723,13 @@ static void chest_trap(int y, int x, s16b o_idx)
*
* Returns TRUE if repeated commands may continue
*/
-static bool do_cmd_open_chest(int y, int x, s16b o_idx)
+static bool_ do_cmd_open_chest(int y, int x, s16b o_idx)
{
int i, j;
- bool flag = TRUE;
+ bool_ flag = TRUE;
- bool more = FALSE;
+ bool_ more = FALSE;
object_type *o_ptr = &o_list[o_idx];
@@ -842,8 +800,6 @@ static bool do_cmd_open_chest(int y, int x, s16b o_idx)
}
-#if defined(ALLOW_EASY_OPEN) || defined(ALLOW_EASY_DISARM)
-
/*
* Original code by TNB, improvement for Angband 2.9.3 by rr9
* Slightly modified for ToME because of its trap implementation
@@ -852,7 +808,7 @@ static bool do_cmd_open_chest(int y, int x, s16b o_idx)
/*
* Return TRUE if the given grid is an open door
*/
-static bool is_open(cave_type *c_ptr)
+static bool_ is_open(cave_type *c_ptr)
{
return (c_ptr->feat == FEAT_OPEN);
}
@@ -861,7 +817,7 @@ static bool is_open(cave_type *c_ptr)
/*
* Return TRUE if the given grid is a closed door
*/
-static bool is_closed(cave_type *c_ptr)
+static bool_ is_closed(cave_type *c_ptr)
{
byte feat;
@@ -875,7 +831,7 @@ static bool is_closed(cave_type *c_ptr)
/*
* Return TRUE if the given grid has a trap
*/
-static bool is_trap(cave_type *c_ptr)
+static bool_ is_trap(cave_type *c_ptr)
{
return ((c_ptr->info & (CAVE_TRDT)) != 0);
}
@@ -885,8 +841,8 @@ static bool is_trap(cave_type *c_ptr)
* Return the number of doors/traps around (or under)
* the character using the filter function 'test'
*/
-static int count_feats(int *y, int *x, bool (*test) (cave_type *c_ptr),
- bool under)
+static int count_feats(int *y, int *x, bool_ (*test) (cave_type *c_ptr),
+ bool_ under)
{
int d;
@@ -935,7 +891,7 @@ static int count_feats(int *y, int *x, bool (*test) (cave_type *c_ptr),
* Return the number of chests around (or under) the character.
* If requested, count only trapped chests.
*/
-static int count_chests(int *y, int *x, bool trapped)
+static int count_chests(int *y, int *x, bool_ trapped)
{
int d, count, o_idx;
@@ -1001,8 +957,6 @@ static int coords_to_dir(int y, int x)
return d[dx + 1][dy + 1];
}
-#endif /* defined(ALLOW_EASY_OPEN) || defined(ALLOW_EASY_DISARM) -- TNB */
-
/*
* Perform the basic "open" command on doors
@@ -1013,13 +967,13 @@ static int coords_to_dir(int y, int x)
*
* Returns TRUE if repeated commands may continue
*/
-static bool do_cmd_open_aux(int y, int x, int dir)
+static bool_ do_cmd_open_aux(int y, int x, int dir)
{
int i, j;
cave_type *c_ptr;
- bool more = FALSE;
+ bool_ more = FALSE;
monster_race *r_ptr = &r_info[p_ptr->body_monster];
@@ -1134,7 +1088,7 @@ void do_cmd_open(void)
cave_type *c_ptr;
- bool more = FALSE;
+ bool_ more = FALSE;
monster_race *r_ptr = &r_info[p_ptr->body_monster];
@@ -1146,8 +1100,6 @@ void do_cmd_open(void)
return;
}
-#ifdef ALLOW_EASY_OPEN /* TNB */
-
/* Option: Pick a direction */
if (easy_open)
{
@@ -1176,8 +1128,6 @@ void do_cmd_open(void)
}
}
-#endif /* ALLOW_EASY_OPEN -- TNB */
-
/* Allow repeated command */
if (command_arg)
{
@@ -1258,11 +1208,11 @@ void do_cmd_open(void)
*
* Returns TRUE if repeated commands may continue
*/
-static bool do_cmd_close_aux(int y, int x, int dir)
+static bool_ do_cmd_close_aux(int y, int x, int dir)
{
cave_type *c_ptr;
- bool more = FALSE;
+ bool_ more = FALSE;
monster_race *r_ptr = &r_info[p_ptr->body_monster];
@@ -1317,10 +1267,8 @@ void do_cmd_close(void)
cave_type *c_ptr;
- bool more = FALSE;
-
+ bool_ more = FALSE;
-#ifdef ALLOW_EASY_OPEN /* TNB */
/* Option: Pick a direction */
if (easy_open)
@@ -1347,8 +1295,6 @@ void do_cmd_close(void)
}
}
-#endif /* ALLOW_EASY_OPEN -- TNB */
-
/* Allow repeated command */
if (command_arg)
{
@@ -1408,7 +1354,7 @@ void do_cmd_close(void)
/*
* Determine if a given grid may be "tunneled"
*/
-static bool do_cmd_tunnel_test(int y, int x)
+static bool_ do_cmd_tunnel_test(int y, int x)
{
/* Must have knowledge(execpt on "forget" levels) */
if (!(cave[y][x].info & (CAVE_MARK)))
@@ -1455,7 +1401,7 @@ static bool do_cmd_tunnel_test(int y, int x)
* This will, however, produce grids which are NOT illuminated
* (or darkened) along with the rest of the room.
*/
-static bool twall(int y, int x, byte feat)
+static bool_ twall(int y, int x, byte feat)
{
cave_type *c_ptr = &cave[y][x];
@@ -1488,14 +1434,14 @@ static bool twall(int y, int x, byte feat)
*
* Returns TRUE if repeated commands may continue
*/
-bool do_cmd_tunnel_aux(int y, int x, int dir)
+bool_ do_cmd_tunnel_aux(int y, int x, int dir)
{
int skill_req = 0, skill_req_1pct = 0;
cave_type *c_ptr = &cave[y][x];
feature_type *f_ptr = &f_info[c_ptr->feat];
- bool more = FALSE;
+ bool_ more = FALSE;
/* Must be have something to dig with (except for sandwalls) */
@@ -1579,10 +1525,10 @@ bool do_cmd_tunnel_aux(int y, int x, int dir)
((c_ptr->feat >= FEAT_SANDWALL) &&
(c_ptr->feat <= FEAT_SANDWALL_K)))
{
- bool okay = FALSE;
- bool gold = FALSE;
- bool hard = FALSE;
- bool soft = FALSE;
+ bool_ okay = FALSE;
+ bool_ gold = FALSE;
+ bool_ hard = FALSE;
+ bool_ soft = FALSE;
/* Found gold */
if ((c_ptr->feat >= FEAT_MAGMA_H) &&
@@ -1780,7 +1726,7 @@ void do_cmd_tunnel(void)
cave_type *c_ptr;
- bool more = FALSE;
+ bool_ more = FALSE;
if (p_ptr->wild_mode) return;
@@ -1849,8 +1795,6 @@ void do_cmd_tunnel(void)
}
-#ifdef ALLOW_EASY_OPEN /* TNB */
-
/*
* easy_open_door --
*
@@ -1862,7 +1806,7 @@ void do_cmd_tunnel(void)
* do_cmd_open_test() and do_cmd_open_aux().
*/
-bool easy_open_door(int y, int x)
+bool_ easy_open_door(int y, int x)
{
int i, j;
@@ -1967,8 +1911,6 @@ bool easy_open_door(int y, int x)
return (TRUE);
}
-#endif /* ALLOW_EASY_OPEN -- TNB */
-
/*
* Perform the basic "disarm" command
@@ -1979,11 +1921,11 @@ bool easy_open_door(int y, int x)
*
* Returns TRUE if repeated commands may continue
*/
-static bool do_cmd_disarm_chest(int y, int x, s16b o_idx)
+static bool_ do_cmd_disarm_chest(int y, int x, s16b o_idx)
{
int i, j;
- bool more = FALSE;
+ bool_ more = FALSE;
object_type *o_ptr = &o_list[o_idx];
@@ -2057,11 +1999,7 @@ static bool do_cmd_disarm_chest(int y, int x, s16b o_idx)
*
* Returns TRUE if repeated commands may continue
*/
-#ifdef ALLOW_EASY_DISARM /* TNB */
-bool do_cmd_disarm_aux(int y, int x, int dir, int do_pickup)
-#else /* ALLOW_EASY_DISARM -- TNB */
-static bool do_cmd_disarm_aux(int y, int x, int dir, int do_pickup)
-#endif /* ALLOW_EASY_DISARM -- TNB */
+bool_ do_cmd_disarm_aux(int y, int x, int dir, int do_pickup)
{
int i, j, power;
@@ -2069,7 +2007,7 @@ static bool do_cmd_disarm_aux(int y, int x, int dir, int do_pickup)
cptr name;
- bool more = FALSE;
+ bool_ more = FALSE;
/* Take a turn */
@@ -2178,10 +2116,8 @@ void do_cmd_disarm(void)
cave_type *c_ptr;
- bool more = FALSE;
-
+ bool_ more = FALSE;
-#ifdef ALLOW_EASY_DISARM /* TNB */
/* Option: Pick a direction */
if (easy_disarm)
@@ -2202,8 +2138,6 @@ void do_cmd_disarm(void)
}
}
-#endif /* ALLOW_EASY_DISARM -- TNB */
-
/* Allow repeated command */
if (command_arg)
{
@@ -2283,13 +2217,13 @@ void do_cmd_disarm(void)
*
* Returns TRUE if repeated commands may continue
*/
-static bool do_cmd_bash_aux(int y, int x, int dir)
+static bool_ do_cmd_bash_aux(int y, int x, int dir)
{
int bash, temp;
cave_type *c_ptr;
- bool more = FALSE;
+ bool_ more = FALSE;
monster_race *r_ptr = &r_info[p_ptr->body_monster];
@@ -2403,7 +2337,7 @@ void do_cmd_bash(void)
cave_type *c_ptr;
- bool more = FALSE;
+ bool_ more = FALSE;
monster_race *r_ptr = &r_info[p_ptr->body_monster];
@@ -2500,7 +2434,7 @@ void do_cmd_alter(void)
cave_type *c_ptr;
- bool more = FALSE;
+ bool_ more = FALSE;
/* Allow repeated command */
@@ -2536,15 +2470,6 @@ void do_cmd_alter(void)
py_attack(y, x, -1);
}
-#if 0
- /* Bash jammed doors */
- else if ((c_ptr->feat >= FEAT_DOOR_HEAD + 0x08) &&
- (c_ptr->feat <= FEAT_DOOR_TAIL))
- {
- /* Tunnel */
- more = do_cmd_bash_aux(y, x, dir);
- }
-#endif
/* Open closed doors */
else if ((c_ptr->feat >= FEAT_DOOR_HEAD) &&
(c_ptr->feat <= FEAT_DOOR_TAIL))
@@ -2585,7 +2510,7 @@ void do_cmd_alter(void)
*
* XXX XXX XXX Let user choose a pile of spikes, perhaps?
*/
-static bool get_spike(int *ip)
+static bool_ get_spike(int *ip)
{
int i;
@@ -2681,19 +2606,17 @@ void do_cmd_spike(void)
if (c_ptr->feat < FEAT_DOOR_TAIL) c_ptr->feat++;
/* Use up, and describe, a single spike, from the bottom */
- inven_item_increase(item, -1);
- inven_item_describe(item);
- inven_item_optimize(item);
+ inc_stack_size(item, -1);
}
}
}
-static void do_cmd_walk_jump(int pickup, bool disarm)
+static void do_cmd_walk_jump(int pickup, bool_ disarm)
{
int dir;
- bool more = FALSE;
+ bool_ more = FALSE;
/* Allow repeated command */
@@ -2752,7 +2675,7 @@ static void do_cmd_walk_jump(int pickup, bool disarm)
/*
* Support code for the "Walk" and "Jump" commands
*/
-void do_cmd_walk(int pickup, bool disarm)
+void do_cmd_walk(int pickup, bool_ disarm)
{
/* Move (usually pickup) */
@@ -3121,7 +3044,7 @@ void do_cmd_fire(void)
object_type *j_ptr;
- bool hit_body = FALSE;
+ bool_ hit_body = FALSE;
byte missile_attr;
@@ -3151,29 +3074,6 @@ void do_cmd_fire(void)
return;
}
-#if 0 /* Old code without the quiver slot */
-
- /* Require proper missile */
- item_tester_tval = p_ptr->tval_ammo;
-
- /* Get an item */
- q = "Fire which item? ";
- s = "You have nothing to fire.";
- if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR))) return;
-
-
- /* Access the item (if in the pack) */
- if (item >= 0)
- {
- o_ptr = &p_ptr->inventory[item];
- }
- else
- {
- o_ptr = &o_list[0 - item];
- }
-
-#else /* New code with the quiver slot */
-
/* Get the "ammo" (if any) */
o_ptr = &p_ptr->inventory[INVEN_AMMO];
@@ -3191,18 +3091,10 @@ void do_cmd_fire(void)
if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR))) return;
- /* Access the item (if in the pack) */
- if (item >= 0)
- {
- o_ptr = &p_ptr->inventory[item];
- }
- else
- {
- o_ptr = &o_list[0 - item];
- }
+ /* Access the item */
+ o_ptr = get_object(item);
}
-#endif
/* Get a direction (or cancel) */
if (!get_aim_dir(&dir)) return;
@@ -3217,20 +3109,8 @@ void do_cmd_fire(void)
/* Single object */
q_ptr->number = 1;
- /* Reduce and describe p_ptr->inventory */
- if (item >= 0)
- {
- inven_item_increase(item, -1);
- inven_item_describe(item);
- inven_item_optimize(item);
- }
-
- /* Reduce and describe floor item */
- else
- {
- floor_item_increase(0 - item, -1);
- floor_item_optimize(0 - item);
- }
+ /* Reduce stack and describe */
+ inc_stack_size(item, -1);
/* Break goi/manashield */
if (p_ptr->invuln)
@@ -3381,7 +3261,7 @@ void do_cmd_fire(void)
/* Did we hit it (penalize range) */
if (test_hit_fire(chance - cur_dis, m_ptr->ac, m_ptr->ml))
{
- bool fear = FALSE;
+ bool_ fear = FALSE;
/* Assume a default death */
cptr note_dies = " dies.";
@@ -3602,9 +3482,9 @@ void do_cmd_throw(void)
object_type *o_ptr;
- bool hit_body = FALSE;
+ bool_ hit_body = FALSE;
- bool hit_wall = FALSE;
+ bool_ hit_wall = FALSE;
byte missile_attr;
@@ -3624,15 +3504,8 @@ void do_cmd_throw(void)
s = "You have nothing to throw.";
if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR))) return;
- /* Access the item (if in the pack) */
- if (item >= 0)
- {
- o_ptr = &p_ptr->inventory[item];
- }
- else
- {
- o_ptr = &o_list[0 - item];
- }
+ /* Access the item */
+ o_ptr = get_object(item);
object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp);
@@ -3677,7 +3550,7 @@ void do_cmd_throw(void)
* Hack -- If rods or wands are thrown, the total maximum timeout or
* charges need to be allocated between the two stacks.
*/
- if ((o_ptr->tval == TV_WAND))
+ if (o_ptr->tval == TV_WAND)
{
q_ptr->pval = o_ptr->pval / o_ptr->number;
@@ -3687,21 +3560,8 @@ void do_cmd_throw(void)
/* Single object */
q_ptr->number = 1;
- /* Reduce and describe p_ptr->inventory */
- if (item >= 0)
- {
- inven_item_increase(item, -1);
- inven_item_describe(item);
- inven_item_optimize(item);
- }
-
- /* Reduce and describe floor item */
- else
- {
- floor_item_increase(0 - item, -1);
- floor_item_optimize(0 - item);
- }
-
+ /* Reduce stack and describe */
+ inc_stack_size(item, -1);
/* Description */
object_desc(o_name, q_ptr, FALSE, 3);
@@ -3817,7 +3677,7 @@ void do_cmd_throw(void)
/* Did we hit it (penalize range) */
if (test_hit_fire(chance - cur_dis, m_ptr->ac, m_ptr->ml))
{
- bool fear = FALSE;
+ bool_ fear = FALSE;
/* Assume a default death */
cptr note_dies = " dies.";
@@ -3997,9 +3857,7 @@ void do_cmd_boomerang(void)
object_type *o_ptr;
- bool hit_body = FALSE;
-
- bool hit_wall = FALSE;
+ bool_ hit_body = FALSE;
byte missile_attr;
@@ -4098,7 +3956,6 @@ void do_cmd_boomerang(void)
/* Stopped by walls/doors */
if (!cave_floor_bold(ny, nx))
{
- hit_wall = TRUE;
break;
}
@@ -4147,7 +4004,7 @@ void do_cmd_boomerang(void)
/* Did we hit it (penalize range) */
if (test_hit_fire(chance - cur_dis, m_ptr->ac, m_ptr->ml))
{
- bool fear = FALSE;
+ bool_ fear = FALSE;
/* Assume a default death */
cptr note_dies = " dies.";
@@ -4258,8 +4115,7 @@ void do_cmd_boomerang(void)
(rand_int(100) < j))
{
msg_print(format("Your %s is destroyed.", o_name));
- inven_item_increase(INVEN_BOW, -1);
- inven_item_optimize(INVEN_BOW);
+ inc_stack_size_ex(INVEN_BOW, -1, OPTIMIZE, NO_DESCRIBE);
}
}
@@ -4318,22 +4174,11 @@ void do_cmd_unwalk()
cave_type *c_ptr;
- bool more = FALSE;
+ bool_ more = FALSE;
if (!get_rep_dir(&dir)) return;
-#if 0 /* No more, but there are penalities */
-
- /* A mold can't blink in small scale mode */
- if (p_ptr->wild_mode)
- {
- msg_print("You cannot move in the overview display.");
- return;
- }
-
-#endif
-
y = p_ptr->py + ddy[dir];
x = p_ptr->px + ddx[dir];
@@ -4492,7 +4337,7 @@ void do_cmd_unwalk()
}
-static bool tport_vertically(bool how)
+static bool_ tport_vertically(bool_ how)
{
/* arena or quest -KMW- */
if ((p_ptr->inside_arena) || (p_ptr->inside_quest))
@@ -4551,9 +4396,9 @@ void do_cmd_immovable_special(void)
int lose_hp = 0;
- bool did_act = FALSE;
+ bool_ did_act = FALSE;
- bool did_load = FALSE;
+ bool_ did_load = FALSE;
if (foo > 1)
@@ -4711,7 +4556,7 @@ void do_cmd_immovable_special(void)
}
/* Can we sacrifice it ? */
-static bool item_tester_hook_sacrifiable(object_type *o_ptr)
+static bool_ item_tester_hook_sacrifiable(object_type *o_ptr)
{
GOD(GOD_MELKOR)
{
@@ -4818,9 +4663,7 @@ void do_cmd_sacrifice(void)
}
/* Remove the item */
- inven_item_increase(item, -1);
- inven_item_describe(item);
- inven_item_optimize(item);
+ inc_stack_size(item, -1);
}
}
else
@@ -4837,7 +4680,7 @@ void do_cmd_sacrifice(void)
*
* Return a list of o_list[] indexes of items of the given monster
*/
-bool scan_monst(int *items, int *item_num, int m_idx)
+bool_ scan_monst(int *items, int *item_num, int m_idx)
{
int this_o_idx, next_o_idx;
@@ -4997,7 +4840,7 @@ void do_cmd_steal()
byte num = 0;
- bool done = FALSE;
+ bool_ done = FALSE;
int monst_list[23];
diff --git a/src/cmd3.c b/src/cmd3.c
index 120d72f4..02dbc1c4 100644
--- a/src/cmd3.c
+++ b/src/cmd3.c
@@ -32,7 +32,7 @@ void do_cmd_inven(void)
item_tester_full = TRUE;
/* Display the p_ptr->inventory */
- show_inven(FALSE);
+ show_inven();
/* Hack -- hide empty slots */
item_tester_full = FALSE;
@@ -68,9 +68,6 @@ void do_cmd_inven(void)
/* Process normal keys */
else
{
- /* Hack -- Use "display" mode */
- command_see = TRUE;
-
/* Mega-Hack -- Don't disable keymaps for this key */
request_command_inven_mode = TRUE;
}
@@ -96,7 +93,7 @@ void do_cmd_equip(void)
item_tester_full = TRUE;
/* Display the equipment */
- show_equip(FALSE);
+ show_equip();
/* Hack -- undo the hack above */
item_tester_full = FALSE;
@@ -133,9 +130,6 @@ void do_cmd_equip(void)
/* Process normal keys */
else
{
- /* Enter "display" mode */
- command_see = TRUE;
-
/* Mega-Hack -- Don't disable keymaps for this key */
request_command_inven_mode = TRUE;
}
@@ -145,7 +139,7 @@ void do_cmd_equip(void)
/*
* The "wearable" tester
*/
-static bool item_tester_hook_wear(object_type *o_ptr)
+static bool_ item_tester_hook_wear(object_type *o_ptr)
{
u32b f1, f2, f3, f4, f5, esp;
int slot = wield_slot(o_ptr);
@@ -183,7 +177,7 @@ static bool item_tester_hook_wear(object_type *o_ptr)
}
-bool is_slot_ok(int slot)
+bool_ is_slot_ok(int slot)
{
if ((slot >= INVEN_WIELD) && (slot < INVEN_TOTAL))
{
@@ -226,17 +220,8 @@ void do_cmd_wield(void)
s = "You have nothing you can wear or wield.";
if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR))) return;
- /* Get the item (in the pack) */
- if (item >= 0)
- {
- o_ptr = &p_ptr->inventory[item];
- }
-
- /* Get the item (on the floor) */
- else
- {
- o_ptr = &o_list[0 - item];
- }
+ /* Get the item */
+ o_ptr = get_object(item);
/* Check the slot */
slot = wield_slot(o_ptr);
@@ -351,19 +336,8 @@ void do_cmd_wield(void)
/* Modify quantity */
q_ptr->number = num;
- /* Decrease the item (from the pack) */
- if (item >= 0)
- {
- inven_item_increase(item, -num);
- inven_item_optimize(item);
- }
-
- /* Decrease the item (from the floor) */
- else
- {
- floor_item_increase(0 - item, -num);
- floor_item_optimize(0 - item);
- }
+ /* Decrease the item */
+ inc_stack_size_ex(item, -num, OPTIMIZE, NO_DESCRIBE);
/* Access the wield slot */
o_ptr = &p_ptr->inventory[slot];
@@ -490,17 +464,8 @@ void do_cmd_takeoff(void)
s = "You are not wearing anything to take off.";
if (!get_item(&item, q, s, (USE_EQUIP))) return;
- /* Get the item (in the pack) */
- if (item >= 0)
- {
- o_ptr = &p_ptr->inventory[item];
- }
-
- /* Get the item (on the floor) */
- else
- {
- o_ptr = &o_list[0 - item];
- }
+ /* Get the item */
+ o_ptr = get_object(item);
/* Can we take it off */
if (process_hooks(HOOK_TAKEOFF, "(d)", item)) return;
@@ -548,17 +513,8 @@ void do_cmd_drop(void)
s = "You have nothing to drop.";
if (!get_item(&item, q, s, (USE_EQUIP | USE_INVEN))) return;
- /* Get the item (in the pack) */
- if (item >= 0)
- {
- o_ptr = &p_ptr->inventory[item];
- }
-
- /* Get the item (on the floor) */
- else
- {
- o_ptr = &o_list[0 - item];
- }
+ /* Get the item */
+ o_ptr = get_object(item);
object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp);
@@ -617,7 +573,7 @@ void do_cmd_destroy(void)
int old_number;
- bool force = FALSE;
+ bool_ force = FALSE;
object_type *o_ptr;
@@ -639,17 +595,8 @@ void do_cmd_destroy(void)
s = "You have nothing to destroy.";
if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR | USE_AUTO))) return;
- /* Get the item (in the pack) */
- if (item >= 0)
- {
- o_ptr = &p_ptr->inventory[item];
- }
-
- /* Get the item (on the floor) */
- else
- {
- o_ptr = &o_list[0 - item];
- }
+ /* Get the item */
+ o_ptr = get_object(item);
/* See how many items */
@@ -734,22 +681,6 @@ void do_cmd_destroy(void)
automatizer_add_rule(o_ptr, TRUE);
}
-#if 0 /* DGDGDGDG -- use a skill */
- if (cp_ptr->magic_key == MKEY_TELEKINESIS)
- {
- /* Good merchants don't break anything... */
- s32b value = object_value_real(o_ptr);
-
- if (value < 0) value = -value;
-
- /* ... otherwise they lose some experience */
- value = value * amt / 10;
- if (value == 0) value = 1;
-
- lose_exp(value);
- msg_print("Good merchants should not break anything...");
- }
-#endif
/*
* Hack -- If rods or wand are destroyed, the total maximum timeout or
* charges of the stack needs to be reduced, unless all the items are
@@ -764,21 +695,8 @@ void do_cmd_destroy(void)
if (f3 & TR3_BLESSED)
inc_piety(GOD_ERU, -10 * k_info[o_ptr->k_idx].level);
- /* Eliminate the item (from the pack) */
- if (item >= 0)
- {
- inven_item_increase(item, -amt);
- inven_item_describe(item);
- inven_item_optimize(item);
- }
-
- /* Eliminate the item (from the floor) */
- else
- {
- floor_item_increase(0 - item, -amt);
- floor_item_describe(0 - item);
- floor_item_optimize(0 - item);
- }
+ /* Eliminate the item */
+ inc_stack_size(item, -amt);
}
@@ -801,17 +719,8 @@ void do_cmd_observe(void)
s = "You have nothing to examine.";
if (!get_item(&item, q, s, (USE_EQUIP | USE_INVEN | USE_FLOOR))) return;
- /* Get the item (in the pack) */
- if (item >= 0)
- {
- o_ptr = &p_ptr->inventory[item];
- }
-
- /* Get the item (on the floor) */
- else
- {
- o_ptr = &o_list[0 - item];
- }
+ /* Get the item */
+ o_ptr = get_object(item);
/* Description */
object_desc(o_name, o_ptr, TRUE, 3);
@@ -843,17 +752,8 @@ void do_cmd_uninscribe(void)
s = "You have nothing to un-inscribe.";
if (!get_item(&item, q, s, (USE_EQUIP | USE_INVEN | USE_FLOOR))) return;
- /* Get the item (in the pack) */
- if (item >= 0)
- {
- o_ptr = &p_ptr->inventory[item];
- }
-
- /* Get the item (on the floor) */
- else
- {
- o_ptr = &o_list[0 - item];
- }
+ /* Get the item */
+ o_ptr = get_object(item);
/* Nothing to remove */
if (!o_ptr->note)
@@ -897,17 +797,8 @@ void do_cmd_inscribe(void)
s = "You have nothing to inscribe.";
if (!get_item(&item, q, s, (USE_EQUIP | USE_INVEN | USE_FLOOR))) return;
- /* Get the item (in the pack) */
- if (item >= 0)
- {
- o_ptr = &p_ptr->inventory[item];
- }
-
- /* Get the item (on the floor) */
- else
- {
- o_ptr = &o_list[0 - item];
- }
+ /* Get the item */
+ o_ptr = get_object(item);
/* Describe the activity */
object_desc(o_name, o_ptr, TRUE, 3);
@@ -945,7 +836,7 @@ void do_cmd_inscribe(void)
/*
* An "item_tester_hook" for refilling lanterns
*/
-static bool item_tester_refill_lantern(object_type *o_ptr)
+static bool_ item_tester_refill_lantern(object_type *o_ptr)
{
/* Flasks of oil are okay */
if (o_ptr->tval == TV_FLASK) return (TRUE);
@@ -980,18 +871,8 @@ static void do_cmd_refill_lamp(void)
s = "You have no flasks of oil.";
if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR))) return;
- /* Get the item (in the pack) */
- if (item >= 0)
- {
- o_ptr = &p_ptr->inventory[item];
- }
-
- /* Get the item (on the floor) */
- else
- {
- o_ptr = &o_list[0 - item];
- }
-
+ /* Get the item */
+ o_ptr = get_object(item);
/* Take a partial turn */
energy_use = 50;
@@ -1015,21 +896,8 @@ static void do_cmd_refill_lamp(void)
msg_print("Your lamp is full.");
}
- /* Decrease the item (from the pack) */
- if (item >= 0)
- {
- inven_item_increase(item, -1);
- inven_item_describe(item);
- inven_item_optimize(item);
- }
-
- /* Decrease the item (from the floor) */
- else
- {
- floor_item_increase(0 - item, -1);
- floor_item_describe(0 - item);
- floor_item_optimize(0 - item);
- }
+ /* Decrease the item stack */
+ inc_stack_size(item, -1);
/* Recalculate torch */
p_ptr->update |= (PU_TORCH);
@@ -1039,7 +907,7 @@ static void do_cmd_refill_lamp(void)
/*
* An "item_tester_hook" for refilling torches
*/
-static bool item_tester_refill_torch(object_type *o_ptr)
+static bool_ item_tester_refill_torch(object_type *o_ptr)
{
/* Torches are okay */
if ((o_ptr->tval == TV_LITE) &&
@@ -1072,18 +940,8 @@ static void do_cmd_refill_torch(void)
s = "You have no extra torches.";
if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR))) return;
- /* Get the item (in the pack) */
- if (item >= 0)
- {
- o_ptr = &p_ptr->inventory[item];
- }
-
- /* Get the item (on the floor) */
- else
- {
- o_ptr = &o_list[0 - item];
- }
-
+ /* Get the item */
+ o_ptr = get_object(item);
/* Take a partial turn */
energy_use = 50;
@@ -1110,21 +968,8 @@ static void do_cmd_refill_torch(void)
msg_print("Your torch glows more brightly.");
}
- /* Decrease the item (from the pack) */
- if (item >= 0)
- {
- inven_item_increase(item, -1);
- inven_item_describe(item);
- inven_item_optimize(item);
- }
-
- /* Decrease the item (from the floor) */
- else
- {
- floor_item_increase(0 - item, -1);
- floor_item_describe(0 - item);
- floor_item_optimize(0 - item);
- }
+ /* Decrease the item stack */
+ inc_stack_size(item, -1);
/* Recalculate torch */
p_ptr->update |= (PU_TORCH);
@@ -1431,7 +1276,7 @@ static cptr ident_info[] =
* We use "u" to point to array of monster indexes,
* and "v" to select the type of sorting to perform on "u".
*/
-static bool ang_sort_comp_hook(vptr u, vptr v, int a, int b)
+static bool_ ang_sort_comp_hook(vptr u, vptr v, int a, int b)
{
u16b *who = (u16b*)(u);
@@ -1597,19 +1442,19 @@ void do_cmd_query_symbol(void)
char buf[128];
- bool all = FALSE;
+ bool_ all = FALSE;
- bool uniq = FALSE;
+ bool_ uniq = FALSE;
- bool norm = FALSE;
+ bool_ norm = FALSE;
- bool name = FALSE;
+ bool_ name = FALSE;
char temp[80] = "";
- bool recall = FALSE;
+ bool_ recall = FALSE;
u16b why = 0;
@@ -1842,7 +1687,7 @@ void do_cmd_query_symbol(void)
* research_mon
* -KMW-
*/
-bool research_mon()
+bool_ research_mon()
{
int i, n, r_idx;
@@ -1855,19 +1700,19 @@ bool research_mon()
byte oldwake;
- bool oldcheat;
+ bool_ oldcheat;
- bool all = FALSE;
+ bool_ all = FALSE;
- bool uniq = FALSE;
+ bool_ uniq = FALSE;
- bool norm = FALSE;
+ bool_ norm = FALSE;
- bool notpicked;
+ bool_ notpicked;
- bool recall = FALSE;
+ bool_ recall = FALSE;
u16b why = 0;
@@ -2062,7 +1907,7 @@ bool research_mon()
/*
* Try to "sense" the grid's mana
*/
-bool do_cmd_sense_grid_mana()
+bool_ do_cmd_sense_grid_mana()
{
int chance, i;
@@ -2143,12 +1988,6 @@ void set_portable_hole_weight(void)
{
s32b weight, i, j;
-
- /* Portable holes can be used only by merchants */
-#if 0 /* DGDGDGDG -- use a skill */
- if (cp_ptr->magic_key == MKEY_TELEKINESIS) return;
-#endif
-
/* Calculate the weight of items in home */
weight = portable_hole_weight();
@@ -2201,12 +2040,6 @@ void do_cmd_portable_hole(void)
int feat, special, town_num;
-
- /* Portable holes can be used only by merchants */
-#if 0 /* DGDGDGDG -- use a skill */
- if (cp_ptr->magic_key != MKEY_TELEKINESIS) return;
-#endif
-
/* Is it currently wielded? */
if (!p_ptr->inventory[INVEN_TOOL].k_idx ||
(p_ptr->inventory[INVEN_TOOL].tval != TV_TOOL) ||
@@ -2329,9 +2162,9 @@ void cli_add(cptr active, cptr trigger, cptr descr)
/*
* Get a string using CLI completion.
*/
-bool get_string_cli(cptr prompt, char *buf, int len)
+bool_ get_string_cli(cptr prompt, char *buf, int len)
{
- bool res;
+ bool_ res;
/* Paranoia XXX XXX XXX */
@@ -2450,7 +2283,7 @@ void do_cmd_cli_help()
void do_cmd_html_dump()
{
char tmp_val[81];
- bool html = TRUE;
+ bool_ html = TRUE;
term_win *save;
/* Save the screen */
diff --git a/src/cmd4.c b/src/cmd4.c
index 6575b162..c4440428 100644
--- a/src/cmd4.c
+++ b/src/cmd4.c
@@ -65,7 +65,7 @@ void do_cmd_redraw(void)
p_ptr->window |= (PW_INVEN | PW_EQUIP | PW_PLAYER | PW_M_LIST);
/* Window stuff */
- p_ptr->window |= (PW_MESSAGE | PW_IRC | PW_OVERHEAD | PW_MONSTER | PW_OBJECT);
+ p_ptr->window |= (PW_MESSAGE | PW_OVERHEAD | PW_MONSTER | PW_OBJECT);
/* Hack -- update */
handle_stuff();
@@ -728,7 +728,7 @@ static void do_cmd_options_autosave(cptr info)
}
/* Switch an option by only knowing its name */
-bool change_option(cptr name, bool value)
+bool_ change_option(cptr name, bool_ value)
{
int i;
@@ -737,7 +737,7 @@ bool change_option(cptr name, bool value)
{
if (!strcmp(option_info[i].o_text, name))
{
- bool old = (*option_info[i].o_var);
+ bool_ old = (*option_info[i].o_var);
(*option_info[i].o_var) = value;
@@ -752,7 +752,7 @@ bool change_option(cptr name, bool value)
/*
* Interact with some options
*/
-void do_cmd_options_aux(int page, cptr info, bool read_only)
+void do_cmd_options_aux(int page, cptr info, bool_ read_only)
{
char ch;
@@ -889,7 +889,7 @@ static void do_cmd_options_win(void)
char ch;
- bool go = TRUE;
+ bool_ go = TRUE;
u32b old_flag[8];
@@ -919,7 +919,7 @@ static void do_cmd_options_win(void)
cptr s = angband_term_name[j];
/* Use color */
- if ((j == x)) a = TERM_L_BLUE;
+ if (j == x) a = TERM_L_BLUE;
/* Window name, staggered, centered */
Term_putstr(35 + j * 5 - strlen(s) / 2, 2 + j % 2, -1, a, s);
@@ -933,7 +933,7 @@ static void do_cmd_options_win(void)
cptr str = window_flag_desc[i];
/* Use color */
- if ((i == y)) a = TERM_L_BLUE;
+ if (i == y) a = TERM_L_BLUE;
/* Unused option */
if (!str) str = "(Unused option)";
@@ -1346,17 +1346,6 @@ void do_cmd_options(void)
break;
}
-#if 0 /* DGDGDG -- has if anyone used those */
- /* Stacking Options */
- case 'S':
- case 's':
- {
- /* Spawn */
- do_cmd_options_aux(7, "Stacking Options", FALSE);
-
- break;
- }
-#endif
/* Cheating Options */
case 'C':
{
@@ -1553,7 +1542,7 @@ static errr macro_dump(cptr fname)
*
* Note that both "flush()" calls are extremely important.
*/
-static void do_cmd_macro_aux(char *buf, bool macro_screen)
+static void do_cmd_macro_aux(char *buf, bool_ macro_screen)
{
int i, n = 0;
@@ -1649,18 +1638,8 @@ static errr keymap_dump(cptr fname)
int mode;
- /* Roguelike */
- if (rogue_like_commands)
- {
- mode = KEYMAP_MODE_ROGUE;
- }
-
- /* Original */
- else
- {
- mode = KEYMAP_MODE_ORIG;
- }
-
+ /* Keymap mode */
+ mode = get_keymap_mode();
/* Build the filename */
path_build(buf, 1024, ANGBAND_DIR_USER, fname);
@@ -1736,17 +1715,8 @@ void do_cmd_macros(void)
int mode;
- /* Roguelike */
- if (rogue_like_commands)
- {
- mode = KEYMAP_MODE_ROGUE;
- }
-
- /* Original */
- else
- {
- mode = KEYMAP_MODE_ORIG;
- }
+ /* Keymap mode */
+ mode = get_keymap_mode();
/* File type is "TEXT" */
FILE_TYPE(FILE_TYPE_TEXT);
@@ -2616,9 +2586,6 @@ void do_cmd_colors(void)
prt("(1) Load a user pref file", 4, 5);
prt("(2) Dump colors", 5, 5);
prt("(3) Modify colors", 6, 5);
-# ifdef SUPPORT_GAMMA
- prt("(4) Gamma correction", 7, 5);
-# endif /* SUPPORT_GAMMA */
/* Prompt */
prt("Command: ", 8, 0);
@@ -2787,73 +2754,6 @@ void do_cmd_colors(void)
}
}
-# ifdef SUPPORT_GAMMA
-
- /* Gamma correction */
- else if (i == '4')
- {
- int gamma;
-
- /* Prompt */
- prt("Command: Gamma correction", 8, 0);
-
- /* gamma_val isn't set - assume 1.0 */
- if (gamma_val == 0) gamma = 10;
-
- /* It's set - convert to usual notation (times 10) */
- else gamma = 2560 / gamma_val;
-
- /* Hack -- query until done */
- while (1)
- {
- /* Clear */
- clear_from(10);
-
- /* Exhibit the normal colors */
- for (i = 0; i < 16; i++)
- {
- /* Exhibit all colors */
- Term_putstr(i*4, 22, -1, i, format("%3d", i));
- }
-
- /* Describe the gamma */
- Term_putstr(5, 10, -1, TERM_WHITE,
- format("Gamma = %d.%d", gamma / 10, gamma % 10));
-
- /* Prompt */
- Term_putstr(0, 12, -1, TERM_WHITE, "Command (g/G): ");
-
- /* Get a command */
- i = inkey();
-
- /* All done */
- if (i == ESCAPE) break;
-
- /* Analyze */
- if (i == 'g') gamma = (byte)(gamma + 1);
- else if (i == 'G') gamma = (byte)(gamma - 1);
- else continue;
-
- /* Force limits ([1.0, 2.5]) */
- if (gamma < 10) gamma = 10;
- if (gamma > 25) gamma = 25;
-
- /* Hack - 1.0 means no correction */
- if (gamma == 10) gamma_val = 0;
-
- /* otherwise, calculate gamma_val */
- else gamma_val = 2560 / gamma;
-
- /* Hack -- react to changes */
- Term_xtra(TERM_XTRA_REACT, 0);
-
- /* Hack -- redraw */
- Term_redraw();
- }
- }
-
-# endif /* SUPPORT_GAMMA */
-
/* Unknown option */
else
{
@@ -3025,7 +2925,7 @@ void do_cmd_load_screen(void)
byte a = 0;
char c = ' ';
- bool okay = TRUE;
+ bool_ okay = TRUE;
FILE *fff;
@@ -3274,12 +3174,12 @@ void do_cmd_knowledge_artifacts(void)
char base_name[80];
- bool *okay, *okayk;
+ bool_ *okay, *okayk;
/* Allocate the "okay" array */
- C_MAKE(okay, max_a_idx, bool);
- C_MAKE(okayk, max_k_idx, bool);
+ C_MAKE(okay, max_a_idx, bool_);
+ C_MAKE(okayk, max_k_idx, bool_);
/* Temporary file */
if (path_temp(file_name, 1024)) return;
@@ -3511,8 +3411,8 @@ void do_cmd_knowledge_artifacts(void)
/* Remove the file */
fd_kill(file_name);
- C_FREE(okay, max_a_idx, bool);
- C_FREE(okayk, max_k_idx, bool);
+ C_FREE(okay, max_a_idx, bool_);
+ C_FREE(okayk, max_k_idx, bool_);
}
@@ -3646,7 +3546,7 @@ static void do_cmd_knowledge_uniques(void)
/* Only print Uniques */
if (r_ptr->flags1 & (RF1_UNIQUE))
{
- bool dead = (r_ptr->max_num == 0);
+ bool_ dead = (r_ptr->max_num == 0);
/* Only display "known" uniques */
if (dead || cheat_know || r_ptr->r_sights)
@@ -3803,8 +3703,6 @@ static void do_cmd_knowledge_pets(void)
monster_type *m_ptr;
- monster_race *r_ptr;
-
int t_friends = 0;
int t_levels = 0;
@@ -3829,7 +3727,6 @@ static void do_cmd_knowledge_pets(void)
{
/* Access the monster */
m_ptr = &m_list[i];
- r_ptr = &r_info[m_ptr->r_idx];
/* Ignore "dead" monsters */
if (!m_ptr->r_idx) continue;
@@ -3909,7 +3806,7 @@ static void do_cmd_knowledge_kill_count(void)
if (r_ptr->flags1 & (RF1_UNIQUE))
{
- bool dead = (r_ptr->max_num == 0);
+ bool_ dead = (r_ptr->max_num == 0);
if (dead)
{
@@ -3950,7 +3847,7 @@ static void do_cmd_knowledge_kill_count(void)
if (r_ptr->flags1 & (RF1_UNIQUE))
{
- bool dead = (r_ptr->max_num == 0);
+ bool_ dead = (r_ptr->max_num == 0);
if (dead)
{
@@ -4258,34 +4155,13 @@ static void do_cmd_knowledge_quests(void)
/* Dynamic quests */
if (quest[i].dynamic_desc)
{
- /* Random quests */
- if (i == QUEST_RANDOM)
+ /* C type quests */
+ if (quest[i].type == HOOK_TYPE_C)
{
- /**/
- if (!(dungeon_flags1 & DF1_PRINCIPAL)) continue;
- if ((dun_level < 1) || (dun_level >= MAX_RANDOM_QUEST)) continue;
- if (!random_quests[dun_level].type) continue;
- if (random_quests[dun_level].done) continue;
- if (p_ptr->inside_quest) continue;
- if (!dun_level) continue;
-
- if (!is_randhero(dun_level))
+ if (!quest[i].gen_desc(fff))
{
- fprintf(fff, "#####yCaptured princess!\n");
- fprintf(fff, "A princess is being held prisoner and tortured here!\n");
- fprintf(fff, "Save her from the horrible %s.\n",
- r_info[random_quests[dun_level].r_idx].name + r_name);
+ continue;
}
- else
- {
- fprintf(fff, "#####yLost sword!\n");
- fprintf(fff, "An adventurer lost his sword to a bunch of %s!\n",
- r_info[random_quests[dun_level].r_idx].name + r_name);
- fprintf(fff, "Kill them all to get it back.\n");
- }
- fprintf(fff, "Number: %d, Killed: %ld.\n",
- random_quests[dun_level].type, (long int) quest[QUEST_RANDOM].data[0]);
- fprintf(fff, "\n");
}
/* MUST be a lua quest */
else
diff --git a/src/cmd5.c b/src/cmd5.c
index eef65a68..b415b166 100644
--- a/src/cmd5.c
+++ b/src/cmd5.c
@@ -21,7 +21,7 @@ extern lua_State *L;
/* Maximum number of tries for teleporting */
#define MAX_TRIES 300
-bool is_school_book(object_type *o_ptr)
+bool_ is_school_book(object_type *o_ptr)
{
if (o_ptr->tval == TV_BOOK)
{
@@ -42,7 +42,7 @@ bool is_school_book(object_type *o_ptr)
}
/* Does it contains a schooled spell ? */
-static bool hook_school_spellable(object_type *o_ptr)
+static bool_ hook_school_spellable(object_type *o_ptr)
{
if (is_school_book(o_ptr))
return TRUE;
@@ -60,7 +60,7 @@ static bool hook_school_spellable(object_type *o_ptr)
}
/* Is it a book */
-bool item_tester_hook_browsable(object_type *o_ptr)
+bool_ item_tester_hook_browsable(object_type *o_ptr)
{
if (hook_school_spellable(o_ptr)) return TRUE;
if (o_ptr->tval >= TV_BOOK) return TRUE;
@@ -70,7 +70,7 @@ bool item_tester_hook_browsable(object_type *o_ptr)
/*
* Are we using a mage staff
*/
-bool is_magestaff()
+bool_ is_magestaff()
{
int i;
@@ -131,17 +131,8 @@ void do_cmd_browse(void)
s = "You have no books that you can read.";
if (!get_item(&item, q, s, (USE_INVEN | USE_EQUIP | USE_FLOOR))) return;
- /* Get the item (in the pack) */
- if (item >= 0)
- {
- o_ptr = &p_ptr->inventory[item];
- }
-
- /* Get the item (on the floor) */
- else
- {
- o_ptr = &o_list[0 - item];
- }
+ /* Get the item */
+ o_ptr = get_object(item);
do_cmd_browse_aux(o_ptr);
}
@@ -155,7 +146,7 @@ void do_poly_wounds(void)
s16b change = damroll(p_ptr->lev, 5);
- bool Nasty_effect = (randint(5) == 1);
+ bool_ Nasty_effect = (randint(5) == 1);
if (!(wounds || hit_p || Nasty_effect)) return;
@@ -461,12 +452,10 @@ void brand_weapon(int brand_type)
/*
* Fetch an item (teleport it right underneath the caster)
*/
-void fetch(int dir, int wgt, bool require_los)
+void fetch(int dir, int wgt, bool_ require_los)
{
int ty, tx, i;
- bool flag;
-
cave_type *c_ptr;
object_type *o_ptr;
@@ -512,7 +501,6 @@ void fetch(int dir, int wgt, bool require_los)
/* Use a direction */
ty = p_ptr->py; /* Where to drop the item */
tx = p_ptr->px;
- flag = FALSE;
while (1)
{
@@ -788,7 +776,7 @@ void wild_magic(int spell)
* Hack -- Determine if the player is wearing an artefact ring
* specified by art_type, that should be an index into a_info
*/
-bool check_ring(int art_type)
+bool_ check_ring(int art_type)
{
int i;
@@ -816,7 +804,7 @@ bool check_ring(int art_type)
/*
* Return the symbiote's name or description.
*/
-cptr symbiote_name(bool capitalize)
+cptr symbiote_name(bool_ capitalize)
{
object_type *o_ptr = &p_ptr->inventory[INVEN_CARRY];
static char buf[80];
@@ -859,7 +847,7 @@ cptr symbiote_name(bool capitalize)
/*
* Use a power of the monster in symbiosis
*/
-int use_symbiotic_power(int r_idx, bool great, bool only_number, bool no_cost)
+int use_symbiotic_power(int r_idx, bool_ great, bool_ only_number, bool_ no_cost)
{
int power = -1;
@@ -867,7 +855,7 @@ int use_symbiotic_power(int r_idx, bool great, bool only_number, bool no_cost)
int powers[96];
- bool flag, redraw;
+ bool_ flag, redraw;
int ask, plev = p_ptr->lev;
@@ -2108,7 +2096,7 @@ int use_symbiotic_power(int r_idx, bool great, bool only_number, bool no_cost)
*/
static int hack_force_spell = -1;
static object_type *hack_force_spell_obj = NULL;
-bool get_item_hook_find_spell(int *item)
+bool_ get_item_hook_find_spell(int *item)
{
int i, spell;
char buf[80];
@@ -2179,7 +2167,7 @@ s32b get_school_spell(cptr do_what, cptr check_fct, s16b force_book)
int num = 0;
s32b where = 1;
int ask;
- bool flag, redraw;
+ bool_ flag, redraw;
char choice;
char out_val[160];
char buf2[40];
@@ -2201,17 +2189,8 @@ s32b get_school_spell(cptr do_what, cptr check_fct, s16b force_book)
sprintf(buf3, "%s from which book?", do_what);
if (!get_item(&item, buf3, buf2, USE_INVEN | USE_EQUIP | USE_EXTRA )) return -1;
- /* Get the item (in the pack) */
- if (item >= 0)
- {
- o_ptr = &p_ptr->inventory[item];
- }
-
- /* Get the item (on the floor) */
- else
- {
- o_ptr = &o_list[0 - item];
- }
+ /* Get the item */
+ o_ptr = get_object(item);
object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp);
@@ -2517,7 +2496,7 @@ void browse_school_spell(int book, int pval, object_type *o_ptr)
}
/* Can it contains a schooled spell ? */
-static bool hook_school_can_spellable(object_type *o_ptr)
+static bool_ hook_school_can_spellable(object_type *o_ptr)
{
u32b f1, f2, f3, f4, f5, esp;
diff --git a/src/cmd6.c b/src/cmd6.c
index 5511f6db..db89c465 100644
--- a/src/cmd6.c
+++ b/src/cmd6.c
@@ -16,14 +16,14 @@
/*
* Forward declare
*/
-static bool activate_spell(object_type * o_ptr, byte choice);
+static bool_ activate_spell(object_type * o_ptr, byte choice);
/*
* General function to find an item by its name
*/
cptr get_item_hook_find_obj_what;
-bool get_item_hook_find_obj(int *item)
+bool_ get_item_hook_find_obj(int *item)
{
int i;
char buf[80];
@@ -95,12 +95,12 @@ bool get_item_hook_find_obj(int *item)
* Determine the effects of eating a corpse. A corpse can be
* eaten whole or cut into pieces for later.
*/
-static void corpse_effect(object_type *o_ptr, bool cutting)
+static void corpse_effect(object_type *o_ptr, bool_ cutting)
{
monster_race *r_ptr = &r_info[o_ptr->pval2];
/* Assume no bad effects */
- bool harmful = FALSE;
+ bool_ harmful = FALSE;
byte method, effect, d_dice, d_side;
@@ -803,17 +803,17 @@ static void corpse_effect(object_type *o_ptr, bool cutting)
}
if (r_ptr->flags2 & RF2_SHAPECHANGER)
{
- // DGDGDG (void)set_mimic(20 , rand_int(MIMIC_VALAR));
+ /* DGDGDG (void)set_mimic(20 , rand_int(MIMIC_VALAR)); */
}
if (r_ptr->flags3 & RF3_DEMON)
{
- // DGDGDG (void)set_mimic(30 , MIMIC_DEMON);
+ /* DGDGDG (void)set_mimic(30 , MIMIC_DEMON); */
}
if (r_ptr->flags3 & RF3_UNDEAD)
{
- // DGDGDG (void)set_mimic(30 , MIMIC_VAMPIRE);
+ /* DGDGDG (void)set_mimic(30 , MIMIC_VAMPIRE); */
}
if (r_ptr->flags3 & RF3_NO_FEAR)
@@ -907,7 +907,7 @@ static void corpse_effect(object_type *o_ptr, bool cutting)
/*
* Hook to determine if an object is eatable
*/
-static bool item_tester_hook_eatable(object_type *o_ptr)
+static bool_ item_tester_hook_eatable(object_type *o_ptr)
{
/* Foods and, well, corpses are edible */
if ((o_ptr->tval == TV_FOOD) || (o_ptr->tval == TV_CORPSE)) return (TRUE);
@@ -931,7 +931,7 @@ void do_cmd_eat_food(void)
cptr q, s;
- bool destroy = TRUE;
+ bool_ destroy = TRUE;
/* Restrict choices to food */
@@ -946,17 +946,8 @@ void do_cmd_eat_food(void)
s = "You have nothing to eat.";
if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR | USE_EXTRA))) return;
- /* Get the item (in the pack) */
- if (item >= 0)
- {
- o_ptr = &p_ptr->inventory[item];
- }
-
- /* Get the item (on the floor) */
- else
- {
- o_ptr = &o_list[0 - item];
- }
+ /* Get the item */
+ o_ptr = get_object(item);
/* Sound */
sound(SOUND_EAT);
@@ -1324,7 +1315,7 @@ void do_cmd_eat_food(void)
{
case SV_CORPSE_CORPSE:
{
- bool no_meat = FALSE;
+ bool_ no_meat = FALSE;
/* Not all is edible. Apologies if messy. */
@@ -1483,23 +1474,10 @@ void do_cmd_eat_food(void)
}
- /* Destroy a food in the pack */
+ /* Destroy food? */
if (destroy)
{
- if (item >= 0)
- {
- inven_item_increase(item, -1);
- inven_item_describe(item);
- inven_item_optimize(item);
- }
-
- /* Destroy a food on the floor */
- else
- {
- floor_item_increase(0 - item, -1);
- floor_item_describe(0 - item);
- floor_item_optimize(0 - item);
- }
+ inc_stack_size(item, -1);
}
}
@@ -1530,17 +1508,8 @@ void do_cmd_cut_corpse(void)
s = "You have no corpses.";
if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR))) return;
- /* Get the item (in the pack) */
- if (item >= 0)
- {
- o_ptr = &p_ptr->inventory[item];
- }
-
- /* Get the item (on the floor) */
- else
- {
- o_ptr = &o_list[0 - item];
- }
+ /* Get the item */
+ o_ptr = get_object(item);
r_ptr = &r_info[o_ptr->pval2];
@@ -1643,17 +1612,8 @@ void do_cmd_cure_meat(void)
s = "You have no meat to cure.";
if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR))) return;
- /* Get the item (in the pack) */
- if (item >= 0)
- {
- o_ptr = &p_ptr->inventory[item];
- }
-
- /* Get the item (on the floor) */
- else
- {
- o_ptr = &o_list[0 - item];
- }
+ /* Get the item */
+ o_ptr = get_object(item);
/* Restrict choices to potions */
item_tester_tval = TV_POTION;
@@ -1663,17 +1623,8 @@ void do_cmd_cure_meat(void)
s = "You have no potions to use.";
if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR))) return;
- /* Get the item (in the pack) */
- if (item >= 0)
- {
- i_ptr = &p_ptr->inventory[item];
- }
-
- /* Get the item (on the floor) */
- else
- {
- i_ptr = &o_list[0 - item];
- }
+ /* Get the item */
+ i_ptr = get_object(item);
if (i_ptr->number > 1)
{
@@ -1771,28 +1722,15 @@ void do_cmd_cure_meat(void)
if (o_ptr->timeout > o_ptr->pval) o_ptr->timeout = o_ptr->pval;
- /* Use up the potions in the pack */
- if (item >= 0)
- {
- inven_item_increase(item, 0 - num);
- inven_item_describe(item);
- inven_item_optimize(item);
- }
-
- /* Use up the potions on the floor */
- else
- {
- floor_item_increase(0 - item, 0 - num);
- floor_item_describe(0 - item);
- floor_item_optimize(0 - item);
- }
+ /* Use up the potions */
+ inc_stack_size(item, -num);
}
/*
* Hook to determine if an object is quaffable
*/
-static bool item_tester_hook_quaffable(object_type *o_ptr)
+static bool_ item_tester_hook_quaffable(object_type *o_ptr)
{
if ((o_ptr->tval == TV_POTION) || (o_ptr->tval == TV_POTION2)) return (TRUE);
@@ -1801,7 +1739,7 @@ static bool item_tester_hook_quaffable(object_type *o_ptr)
}
-static bool quaff_potion(int tval, int sval, int pval, int pval2)
+static bool_ quaff_potion(int tval, int sval, int pval, int pval2)
{
int ident = FALSE;
@@ -2381,9 +2319,6 @@ static bool quaff_potion(int tval, int sval, int pval, int pval2)
case SV_POTION_NEW_LIFE:
{
do_cmd_rerate();
-#if 0 /* DGDGDGDG -- No, losing corruption should be near impossible, maybe a quest to do it once but thats it */
- lose_all_corruptions();
-#endif
ident = TRUE;
break;
@@ -2526,17 +2461,8 @@ void do_cmd_quaff_potion(void)
s = "You have no potions to quaff.";
if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR | USE_EXTRA))) return;
- /* Get the item (in the pack) */
- if (item >= 0)
- {
- o_ptr = &p_ptr->inventory[item];
- }
-
- /* Get the item (on the floor) */
- else
- {
- o_ptr = &o_list[0 - item];
- }
+ /* Get the item */
+ o_ptr = get_object(item);
/* Sound */
@@ -2599,21 +2525,8 @@ void do_cmd_quaff_potion(void)
(void)set_food(p_ptr->food + o_ptr->pval);
- /* Destroy a potion in the pack */
- if (item >= 0)
- {
- inven_item_increase(item, -1);
- inven_item_describe(item);
- inven_item_optimize(item);
- }
-
- /* Destroy a potion on the floor */
- else
- {
- floor_item_increase(0 - item, -1);
- floor_item_describe(0 - item);
- floor_item_optimize(0 - item);
- }
+ /* Destroy potion */
+ inc_stack_size(item, -1);
}
@@ -2624,7 +2537,7 @@ void do_cmd_drink_fountain(void)
{
cave_type *c_ptr = &cave[p_ptr->py][p_ptr->px];
- bool ident;
+ bool_ ident;
int tval, sval, pval = 0;
@@ -2750,21 +2663,8 @@ void do_cmd_fill_bottle(void)
if (amt > c_ptr->special2) amt = c_ptr->special2;
- /* Destroy bottles in the pack */
- if (item >= 0)
- {
- inven_item_increase(item, -amt);
- inven_item_describe(item);
- inven_item_optimize(item);
- }
-
- /* Destroy bottles on the floor */
- else
- {
- floor_item_increase(0 - item, -amt);
- floor_item_describe(0 - item);
- floor_item_optimize(0 - item);
- }
+ /* Destroy bottles */
+ inc_stack_size(item, -amt);
/* Create the potion */
q_ptr = &forge;
@@ -2793,7 +2693,7 @@ void do_cmd_fill_bottle(void)
/*
* Curse the players armor
*/
-bool curse_armor(void)
+bool_ curse_armor(void)
{
object_type *o_ptr;
@@ -2858,7 +2758,7 @@ bool curse_armor(void)
/*
* Curse the players weapon
*/
-bool curse_weapon(void)
+bool_ curse_weapon(void)
{
object_type *o_ptr;
@@ -2925,7 +2825,7 @@ bool curse_weapon(void)
/*
* Hook to determine if an object is readable
*/
-static bool item_tester_hook_readable(object_type *o_ptr)
+static bool_ item_tester_hook_readable(object_type *o_ptr)
{
if ((o_ptr->tval == TV_SCROLL) || (o_ptr->tval == TV_PARCHMENT)) return (TRUE);
@@ -2984,18 +2884,8 @@ void do_cmd_read_scroll(void)
s = "You have no scrolls to read.";
if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR | USE_EXTRA))) return;
- /* Get the item (in the pack) */
- if (item >= 0)
- {
- o_ptr = &p_ptr->inventory[item];
- }
-
- /* Get the item (on the floor) */
- else
- {
- o_ptr = &o_list[0 - item];
- }
-
+ /* Get the item */
+ o_ptr = get_object(item);
/* Take a turn */
energy_use = 100;
@@ -3699,21 +3589,8 @@ void do_cmd_read_scroll(void)
sound(SOUND_SCROLL);
- /* Destroy a scroll in the pack */
- if (item >= 0)
- {
- inven_item_increase(item, -1);
- inven_item_describe(item);
- inven_item_optimize(item);
- }
-
- /* Destroy a scroll on the floor */
- else
- {
- floor_item_increase(0 - item, -1);
- floor_item_describe(0 - item);
- floor_item_optimize(0 - item);
- }
+ /* Destroy scroll */
+ inc_stack_size(item, -1);
if (get_skill(SKILL_ALCHEMY))
{
@@ -3786,18 +3663,8 @@ void do_cmd_use_staff(void)
s = "You have no staff to use.";
if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR | USE_EXTRA))) return;
- /* Get the item (in the pack) */
- if (item >= 0)
- {
- o_ptr = &p_ptr->inventory[item];
- }
-
- /* Get the item (on the floor) */
- else
- {
- o_ptr = &o_list[0 - item];
- }
-
+ /* Get the item */
+ o_ptr = get_object(item);
/* Mega-Hack -- refuse to use a pile from the ground */
if ((item < 0) && (o_ptr->number > 1))
@@ -3989,17 +3856,8 @@ void do_cmd_aim_wand(void)
s = "You have no wand to aim.";
if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR | USE_EXTRA))) return;
- /* Get the item (in the pack) */
- if (item >= 0)
- {
- o_ptr = &p_ptr->inventory[item];
- }
-
- /* Get the item (on the floor) */
- else
- {
- o_ptr = &o_list[0 - item];
- }
+ /* Get the item */
+ o_ptr = get_object(item);
/* Mega-Hack -- refuse to aim a pile from the ground */
@@ -4127,7 +3985,7 @@ void do_cmd_aim_wand(void)
/*
* Hook to determine if an object is zapable
*/
-static bool item_tester_hook_zapable(object_type *o_ptr)
+static bool_ item_tester_hook_zapable(object_type *o_ptr)
{
if ((o_ptr->tval == TV_ROD) || (o_ptr->tval == TV_ROD_MAIN)) return (TRUE);
@@ -4139,7 +3997,7 @@ static bool item_tester_hook_zapable(object_type *o_ptr)
/*
* Hook to determine if an object is attachable
*/
-static bool item_tester_hook_attachable(object_type *o_ptr)
+static bool_ item_tester_hook_attachable(object_type *o_ptr)
{
if ((o_ptr->tval == TV_ROD_MAIN) &&
(o_ptr->pval == SV_ROD_NOTHING)) return (TRUE);
@@ -4158,8 +4016,6 @@ void zap_combine_rod_tip(object_type *q_ptr, int tip_item)
object_type *o_ptr;
- object_kind *k_ptr;
-
cptr q, s;
u32b f1, f2, f3, f4, f5, esp;
@@ -4181,19 +4037,8 @@ void zap_combine_rod_tip(object_type *q_ptr, int tip_item)
s = "You have no rod to attach to.";
if (!get_item(&item, q, s, (USE_INVEN))) return;
- /* Get the item (in the pack) */
- if (item >= 0)
- {
- o_ptr = &p_ptr->inventory[item];
- k_ptr = &k_info[o_ptr->k_idx];
- }
-
- /* Get the item (on the floor) */
- else
- {
- o_ptr = &o_list[0 - item];
- k_ptr = &k_info[o_ptr->k_idx];
- }
+ /* Get the item */
+ o_ptr = get_object(item);
/* Examine the rod */
object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp);
@@ -4219,20 +4064,8 @@ void zap_combine_rod_tip(object_type *q_ptr, int tip_item)
/* Attach the tip to the rod */
o_ptr->pval = q_ptr->sval;
- /* Destroy a rod tip in the pack */
- if (tip_item >= 0)
- {
- inven_item_increase(tip_item, -1);
- inven_item_describe(tip_item);
- inven_item_optimize(tip_item);
- }
- /* Destroy a rod tip on the floor */
- else
- {
- floor_item_increase(0 - tip_item, -1);
- floor_item_describe(0 - tip_item);
- floor_item_optimize(0 - tip_item);
- }
+ /* Destroy rod tip */
+ inc_stack_size(tip_item, -1);
}
@@ -4245,12 +4078,10 @@ void do_cmd_zap_rod(void)
int cost;
- bool require_dir;
+ bool_ require_dir;
object_type *o_ptr;
- object_kind *k_ptr;
-
object_kind *tip_ptr;
u32b f1, f2, f3, f4, f5, esp;
@@ -4258,7 +4089,7 @@ void do_cmd_zap_rod(void)
cptr q, s;
/* Hack -- let perception get aborted */
- bool use_charge = TRUE;
+ bool_ use_charge = TRUE;
/* No magic */
@@ -4281,19 +4112,8 @@ void do_cmd_zap_rod(void)
s = "You have no rod to zap.";
if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR | USE_EXTRA))) return;
- /* Get the item (in the pack) */
- if (item >= 0)
- {
- o_ptr = &p_ptr->inventory[item];
- k_ptr = &k_info[o_ptr->k_idx];
- }
-
- /* Get the item (on the floor) */
- else
- {
- o_ptr = &o_list[0 - item];
- k_ptr = &k_info[o_ptr->k_idx];
- }
+ /* Get the item */
+ o_ptr = get_object(item);
/* "Zapping" a Rod Tip on rod of nothing will attach it */
@@ -4732,7 +4552,7 @@ void do_cmd_zap_rod(void)
/*
* Hook to determine if an object is activable
*/
-static bool item_tester_hook_activate(object_type *o_ptr)
+static bool_ item_tester_hook_activate(object_type *o_ptr)
{
u32b f1, f2, f3, f4, f5, esp;
@@ -4796,7 +4616,7 @@ int ring_of_power()
/* Rewrite this -- pelpel */
if (summon_specific_friendly(p_ptr->py, p_ptr->px, ((plev * 3) / 2),
(plev > 47 ? SUMMON_HI_UNDEAD_NO_UNIQUES : SUMMON_UNDEAD),
- (bool)(((plev > 24) && (randint(3) == 1)) ? TRUE : FALSE)))
+ (bool_)(((plev > 24) && (randint(3) == 1)) ? TRUE : FALSE)))
{
msg_print("Cold winds begin to blow around you, "
"carrying with them the stench of decay...");
@@ -4812,13 +4632,7 @@ int ring_of_power()
msg_print("The power of the ring destroys the world!");
msg_print("The world changes!");
- if (autosave_l)
- {
- is_autosave = TRUE;
- msg_print("Autosaving the game...");
- do_cmd_save_game();
- is_autosave = FALSE;
- }
+ autosave_checkpoint();
/* Leaving */
p_ptr->leaving = TRUE;
@@ -4854,7 +4668,7 @@ int ring_of_power()
/*
* Enchant some bolts
*/
-bool brand_bolts(void)
+bool_ brand_bolts(void)
{
int i;
@@ -4930,23 +4744,13 @@ void do_cmd_activate(void)
item_tester_hook = item_tester_hook_activate;
/* Get an item */
- command_see = TRUE;
command_wrk = USE_EQUIP;
q = "Activate which item? ";
s = "You have nothing to activate.";
if (!get_item(&item, q, s, (USE_EQUIP | USE_INVEN))) return;
- /* Get the item (in the pack) */
- if (item >= 0)
- {
- o_ptr = &p_ptr->inventory[item];
- }
-
- /* Get the item (on the floor) */
- else
- {
- o_ptr = &o_list[0 - item];
- }
+ /* Get the item */
+ o_ptr = get_object(item);
/* Extract object flags */
object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp);
@@ -5162,13 +4966,13 @@ void do_cmd_activate(void)
-const char *activation_aux(object_type * o_ptr, bool doit, int item)
+const char *activation_aux(object_type * o_ptr, bool_ doit, int item)
{
int plev = get_skill(SKILL_DEVICE);
int i = 0, ii = 0, ij = 0, k, dir, dummy = 0;
int chance;
- bool is_junkart = (o_ptr->tval == TV_RANDART);
+ bool_ is_junkart = (o_ptr->tval == TV_RANDART);
int spell = 0;
@@ -5686,13 +5490,7 @@ const char *activation_aux(object_type * o_ptr, bool doit, int item)
{
if (get_check("Leave this level? "))
{
- if (autosave_l)
- {
- is_autosave = TRUE;
- msg_print("Autosaving the game...");
- do_cmd_save_game();
- is_autosave = FALSE;
- }
+ autosave_checkpoint();
/* Leaving */
p_ptr->leaving = TRUE;
@@ -5818,7 +5616,7 @@ const char *activation_aux(object_type * o_ptr, bool doit, int item)
else
{
if (summon_specific_friendly(p_ptr->py, p_ptr->px, ((plev * 3) / 2),
- SUMMON_THUNDERLORD, (bool)(plev == 50 ? TRUE : FALSE)))
+ SUMMON_THUNDERLORD, (bool_)(plev == 50 ? TRUE : FALSE)))
{
msg_print("A Thunderlord comes from thin air!");
msg_print("'I will help you in your difficult task.'");
@@ -6370,11 +6168,7 @@ const char *activation_aux(object_type * o_ptr, bool doit, int item)
case ACT_TERROR:
{
if (!doit) return "terror every 3 * (level+10) turns";
-#if 0
- for (i = 0; i < 8; i++) fear_monster(ddd[i], (p_ptr->lev) + 10);
-#else
-turn_monsters(40 + p_ptr->lev);
-#endif
+ turn_monsters(40 + p_ptr->lev);
o_ptr->timeout = 3 * (p_ptr->lev + 10);
@@ -6517,7 +6311,7 @@ turn_monsters(40 + p_ptr->lev);
else
{
if (summon_specific_friendly(p_ptr->py, p_ptr->px, ((plev * 3) / 2),
- SUMMON_ELEMENTAL, (bool)(plev == 50 ? TRUE : FALSE)))
+ SUMMON_ELEMENTAL, (bool_)(plev == 50 ? TRUE : FALSE)))
{
msg_print("An elemental materialises...");
msg_print("It seems obedient to you.");
@@ -6543,7 +6337,7 @@ turn_monsters(40 + p_ptr->lev);
else
{
if (summon_specific_friendly(p_ptr->py, p_ptr->px, ((plev * 3) / 2),
- SUMMON_DEMON, (bool)(plev == 50 ? TRUE : FALSE)))
+ SUMMON_DEMON, (bool_)(plev == 50 ? TRUE : FALSE)))
{
msg_print("The area fills with a stench of sulphur and brimstone.");
msg_print("'What is thy bidding... Master?'");
@@ -6571,7 +6365,7 @@ turn_monsters(40 + p_ptr->lev);
{
if (summon_specific_friendly(p_ptr->py, p_ptr->px, ((plev * 3) / 2),
(plev > 47 ? SUMMON_HI_UNDEAD_NO_UNIQUES : SUMMON_UNDEAD),
- (bool)(((plev > 24) && (randint(3) == 1)) ? TRUE : FALSE)))
+ (bool_)(((plev > 24) && (randint(3) == 1)) ? TRUE : FALSE)))
{
msg_print("Cold winds begin to blow around you, carrying with them the stench of decay...");
msg_print("Ancient, long-dead forms arise from the ground to serve you!");
@@ -7418,10 +7212,7 @@ turn_monsters(40 + p_ptr->lev);
case ACT_CURE_MUT:
{
-#if 0 // DGDGDGD
-#else
msg_print("Ahah, you wish.");
-#endif
/* Timeout is set before return */
break;
@@ -7611,16 +7402,8 @@ turn_monsters(40 + p_ptr->lev);
/* It explodes, doesn't it ? */
take_hit(damroll(2, 10), "an exploding ring");
- if ( item > 0)
- {
- inven_item_increase(item, -255);
- inven_item_optimize(item);
- }
- else
- {
- floor_item_increase( -item, -255);
- floor_item_optimize( -item);
- }
+
+ inc_stack_size_ex(item, -255, OPTIMIZE, NO_DESCRIBE);
}
break;
@@ -7914,7 +7697,7 @@ turn_monsters(40 + p_ptr->lev);
}
-static bool activate_spell(object_type * o_ptr, byte choice)
+static bool_ activate_spell(object_type * o_ptr, byte choice)
{
int mana = 0, gf = 0, mod = 0;
diff --git a/src/cmd7.c b/src/cmd7.c
index ed2d8293..aca14dcd 100644
--- a/src/cmd7.c
+++ b/src/cmd7.c
@@ -124,7 +124,7 @@ void mimic_info(char *p, int power)
* when you run it. It's probably easy to fix but I haven't tried,
* sorry.
*/
-bool get_magic_power(int *sn, magic_power *powers, int max_powers,
+bool_ get_magic_power(int *sn, magic_power *powers, int max_powers,
void (*power_info)(char *p, int power), int plev, int cast_stat)
{
int i;
@@ -151,14 +151,12 @@ bool get_magic_power(int *sn, magic_power *powers, int max_powers,
magic_power spell;
- bool flag, redraw;
+ bool_ flag, redraw;
/* Assume cancelled */
*sn = ( -1);
-#ifdef ALLOW_REPEAT /* TNB */
-
/* Get the spell, if available */
if (repeat_pull(sn))
{
@@ -170,8 +168,6 @@ bool get_magic_power(int *sn, magic_power *powers, int max_powers,
}
}
-#endif /* ALLOW_REPEAT -- TNB */
-
/* Nothing chosen yet */
flag = FALSE;
@@ -238,15 +234,8 @@ bool get_magic_power(int *sn, magic_power *powers, int max_powers,
/* Extract the minimum failure rate */
minfail = adj_mag_fail[p_ptr->stat_ind[cast_stat]];
- /* Minimum failure rate */
- if (chance < minfail) chance = minfail;
-
- /* Stunning makes spells harder */
- if (p_ptr->stun > 50) chance += 25;
- else if (p_ptr->stun) chance += 15;
-
- /* Always a 5 percent chance of working */
- if (chance > 95) chance = 95;
+ /* Failure rate */
+ chance = clamp_failure_chance(chance, minfail);
/* Get info */
power_info(comment, i);
@@ -325,12 +314,9 @@ bool get_magic_power(int *sn, magic_power *powers, int max_powers,
/* Save the choice */
(*sn) = i;
-#ifdef ALLOW_REPEAT /* TNB */
repeat_push(*sn);
-#endif /* ALLOW_REPEAT -- TNB */
-
/* Success */
return (TRUE);
}
@@ -411,15 +397,8 @@ void do_cmd_mindcraft(void)
/* Extract the minimum failure rate */
minfail = adj_mag_fail[p_ptr->stat_ind[A_WIS]];
- /* Minimum failure rate */
- if (chance < minfail) chance = minfail;
-
- /* Stunning makes spells harder */
- if (p_ptr->stun > 50) chance += 25;
- else if (p_ptr->stun) chance += 15;
-
- /* Always a 5 percent chance of working */
- if (chance > 95) chance = 95;
+ /* Failure rate */
+ chance = clamp_failure_chance(chance, minfail);
/* Failed spell */
if (rand_int(100) < chance)
@@ -734,7 +713,7 @@ void do_cmd_mindcraft(void)
/* Damage WIS (possibly permanently) */
if (rand_int(100) < 50)
{
- bool perm = (rand_int(100) < 25);
+ bool_ perm = (rand_int(100) < 25);
/* Message */
msg_print("You have damaged your mind!");
@@ -762,17 +741,8 @@ static int get_mimic_chance(int mimic)
chance -= get_skill_scale(SKILL_MIMICRY, 150);
chance -= 3 * adj_mag_stat[p_ptr->stat_ind[A_DEX]];
- if (chance < 2) chance = 2;
-
- /* Stunning makes spells harder */
- if (p_ptr->stun > 50) chance += 25;
- else if (p_ptr->stun) chance += 15;
-
- /* Always a 5 percent chance of working */
- if (chance > 95) chance = 95;
-
/* Return the chance */
- return (chance);
+ return clamp_failure_chance(chance, 2);
}
@@ -856,7 +826,7 @@ void do_cmd_mimic_lore()
p_ptr->update |= (PU_BONUS);
}
-static bool mimic_forbid_travel(char *fmt)
+static bool_ mimic_forbid_travel(char *fmt)
{
u32b value = p_ptr->mimic_extra >> 16;
u32b att = p_ptr->mimic_extra & 0xFFFF;
@@ -886,7 +856,7 @@ void do_cmd_mimic(void)
magic_power spell;
- static bool added_hooks = FALSE;
+ static bool_ added_hooks = FALSE;
if(!added_hooks)
{
add_hook(HOOK_FORBID_TRAVEL, mimic_forbid_travel, "mimic_forbid_travel");
@@ -1152,7 +1122,7 @@ void do_cmd_mimic(void)
/* Damage WIS (possibly permanently) */
if (rand_int(100) < 50)
{
- bool perm = (rand_int(100) < 25);
+ bool_ perm = (rand_int(100) < 25);
/* Message */
msg_print("You have damaged your mind!");
@@ -1232,7 +1202,7 @@ int activation_select;
/* Return true if the player is wielding the philosopher's stone
*/
-bool alchemist_has_stone(void)
+bool_ alchemist_has_stone(void)
{
if (p_ptr->inventory[INVEN_LITE].name1 == 209)
return TRUE;
@@ -1443,7 +1413,7 @@ int calc_rqty(int i, int pval, int oldpval)
int check_artifact_items(int pval, int oldpval, int mode)
{
int i, j, k, row = 1 , col = 15, rqty, orqty, trqty;
- bool good = TRUE;
+ bool_ good = TRUE;
int temporary = -1;
char ch;
@@ -1487,7 +1457,7 @@ int check_artifact_items(int pval, int oldpval, int mode)
*/
if ( a_select_flags[i].rtval == TV_CORPSE )
{
- bool itemgood = TRUE;
+ bool_ itemgood = TRUE;
/*Specified race not this one */
if ( o_ptr->pval2 != a_select_flags[i].rpval && a_select_flags[i].rpval)
@@ -1552,15 +1522,7 @@ int check_artifact_items(int pval, int oldpval, int mode)
if ( mode == 1 )
{
- inven_item_increase(k, -trqty);
- inven_item_describe(k);
- /*
- if we optimize this now, it moves everything after it
- in the p_ptr->inventory up one, and the pointer to the item
- being artifactized now points to something else.
- DON'T DO IT!
- inven_item_optimize(k);
- */
+ inc_stack_size_ex(k, -trqty, NO_OPTIMIZE, DESCRIBE);
}
}/* if p_ptr->inventory item is acceptable */
@@ -1646,12 +1608,12 @@ int check_artifact_items(int pval, int oldpval, int mode)
/* Display a list of required essences,
* and/or use up the essences. */
-bool artifact_display_or_use(int pval, int oldpval, bool use)
+bool_ artifact_display_or_use(int pval, int oldpval, bool_ use)
{
int essence[MAX_BATERIE_SVAL];
int essenceh[MAX_BATERIE_SVAL];
int al_idx, i, j, k;
- bool enough;
+ bool_ enough;
/* Temporary Items require only one item, and no essences. */
for ( i = 0 ; a_select_flags[i].group ; i++)
@@ -1713,7 +1675,7 @@ bool artifact_display_or_use(int pval, int oldpval, bool use)
if (!enough || !use )
{
int row = 1 , col = 15;
- bool good = FALSE;
+ bool_ good = FALSE;
char ch;
/* display of list of required essences */
@@ -1763,13 +1725,8 @@ bool artifact_display_or_use(int pval, int oldpval, bool use)
{
int num = p_ptr->inventory[k].number;
- inven_item_increase(k, MAX( -essence[i], -num));
- inven_item_describe(k);
- /*
- messy bug, don't optimize here because it
- rearanges the p_ptr->inventory.
- inven_item_optimize(k);
- */
+ inc_stack_size_ex(k, MAX( -essence[i], -num), NO_OPTIMIZE, DESCRIBE);
+
essence[i] -= MIN(num, essence[i]);
}
@@ -1891,7 +1848,7 @@ void select_an_activation(void)
/* Consume 'num' magic essences and return true.
* If there aren't enough essences, return false */
-bool magic_essence(int num)
+bool_ magic_essence(int num)
{
int i;
int j = 0;
@@ -1921,9 +1878,7 @@ bool magic_essence(int num)
* artifactable object should come before the essences.
*/
j -= o_ptr->number;
- inven_item_increase(i, -num);
- inven_item_describe(i);
- inven_item_optimize(i);
+ inc_stack_size(i, -num);
num = j;
if (num <= 0) break;
/* Stay on this slot; do not increment i. */
@@ -1954,7 +1909,7 @@ void do_cmd_create_artifact(object_type *q_ptr)
char out_val[160];
char choice = 0;
- bool lockpval = FALSE;
+ bool_ lockpval = FALSE;
int pval;
int oldpval;
energy_use = 100;
@@ -2385,7 +2340,7 @@ void do_cmd_create_artifact(object_type *q_ptr)
* recipes as a createable item. Used to determine if we
* should extract from it.
*/
-bool alchemist_exists(int tval, int sval, int ego, int artifact)
+bool_ alchemist_exists(int tval, int sval, int ego, int artifact)
{
int al_idx;
@@ -2414,7 +2369,7 @@ bool alchemist_exists(int tval, int sval, int ego, int artifact)
/*
* Hook to determine if an object can have things extracted from it.
*/
-bool item_tester_hook_extractable(object_type *o_ptr)
+bool_ item_tester_hook_extractable(object_type *o_ptr)
{
/* No artifacts */
@@ -2434,7 +2389,7 @@ bool item_tester_hook_extractable(object_type *o_ptr)
/*
* Hook to determine if an object is empowerable (NOT rechargeable)
*/
-bool item_tester_hook_empower(object_type *o_ptr)
+bool_ item_tester_hook_empower(object_type *o_ptr)
{
int sval = -1;
int lev = get_skill(SKILL_ALCHEMY);
@@ -2608,7 +2563,7 @@ void do_cmd_toggle_artifact(object_type *o_ptr)
if (!(o_ptr->art_flags4 & TR4_ART_EXP))
{
- bool okay = TRUE;
+ bool_ okay = TRUE;
if ( !alchemist_has_stone())
{
@@ -2677,10 +2632,10 @@ void do_cmd_toggle_artifact(object_type *o_ptr)
* if tocreate=0, will return true if the player has enough
* in their p_ptr->inventory to empower that item.
*/
-bool alchemist_items_check(int tval, int sval, int ego, int tocreate, bool message)
+bool_ alchemist_items_check(int tval, int sval, int ego, int tocreate, bool_ message)
{
int al_idx, j;
- bool exists = FALSE;
+ bool_ exists = FALSE;
for ( al_idx = 0 ; al_idx < max_al_idx ; al_idx++ )
@@ -2753,10 +2708,7 @@ bool alchemist_items_check(int tval, int sval, int ego, int tocreate, bool messa
/* At this point, the item is required, destroy it. */
if ( tocreate )
{
- inven_item_increase(j, 0 - rqty);
- if ( message)
- inven_item_describe(j);
- inven_item_optimize(j);
+ inc_stack_size_ex(j, 0 - rqty, OPTIMIZE, message ? DESCRIBE : NO_DESCRIBE);
}
/* When we find enough of the item, break out of the
@@ -2897,7 +2849,7 @@ void alchemist_recipe_book(void)
int num, max_num, i, al_idx, bat, kidx;
int choice[61], choice2[61];
int mod40;
- bool essence[MAX_BATERIE_SVAL + 1];
+ bool_ essence[MAX_BATERIE_SVAL + 1];
char ch;
/* Save and clear the screen */
@@ -3178,13 +3130,13 @@ void alchemist_recipe_book(void)
* This function needs to be able to scroll a list, because
* there are SO MANY potions. :)
*/
-int alchemist_recipe_select(int *tval, int sval, int ego, bool recipe)
+int alchemist_recipe_select(int *tval, int sval, int ego, bool_ recipe)
{
int i, mod40 = 0, num, max_num = 0;
cptr tval_desc2 = "";
char ch;
- bool done = FALSE;
+ bool_ done = FALSE;
int choice[60];
int validc[60];
@@ -3611,7 +3563,7 @@ void do_cmd_alchemist(void)
int item, ext = 0;
int value, basechance;
int askill;
- bool repeat = 0;
+ bool_ repeat = 0;
char ch;
object_type *o_ptr, *q_ptr;
@@ -3697,16 +3649,9 @@ void do_cmd_alchemist(void)
if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR))) return;
- /* Get the item (in the pack) */
- if (item >= 0)
- {
- o_ptr = &p_ptr->inventory[item];
- }
- /* Get the item (on the floor) */
- else
- {
- o_ptr = &o_list[0 - item];
- }
+ /* Get the item */
+ o_ptr = get_object(item);
+
/* Create an artifact from an ego or double ego item,
* from a previous artifact, or finish an artifact
*/
@@ -3825,19 +3770,7 @@ void do_cmd_alchemist(void)
carry_o_ptr = TRUE;
/* Destroy the initial object */
- if (item >= 0)
- {
- /* Destroy an item in the pack */
- inven_item_increase(item, -qty);
- inven_item_describe(item);
- }
- else
- {
- /* Destroy an item on the floor */
- floor_item_increase(0 - item, -qty);
- floor_item_describe(0 - item);
- floor_item_optimize(0 - item);
- }
+ inc_stack_size(item, -qty);
if ( ego )
@@ -3919,9 +3852,6 @@ void do_cmd_alchemist(void)
if (o_ptr->tval == TV_POTION && o_ptr->sval == SV_POTION_DETONATIONS)
{
basechance /= 10;
-#if 0 /* Let's see how it works */
- o_ptr->discount = 100;
-#endif
}
}
@@ -4037,11 +3967,11 @@ void do_cmd_alchemist(void)
else if (ext == 2)
{
int ego;
- bool discharge_stick = FALSE;
+ bool_ discharge_stick = FALSE;
/* s_ptr holds the empty items */
object_type *s_ptr = NULL;
- bool carry_s_ptr = FALSE;
+ bool_ carry_s_ptr = FALSE;
item_tester_hook = item_tester_hook_extractable;
@@ -4050,15 +3980,8 @@ void do_cmd_alchemist(void)
s = "You have no item to extract power from.";
if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR))) return;
- /* Get the item (in the pack) */
- if (item >= 0)
- {
- o_ptr = &p_ptr->inventory[item];
- }
- else
- {
- o_ptr = &o_list[0 - item];
- }
+ /* Get the item */
+ o_ptr = get_object(item);
/* This is to prevent creating magic essences by extracting
* from a recharged wand of dragon breath or something.
@@ -4170,7 +4093,7 @@ void do_cmd_alchemist(void)
{
/* Otherwise we must create a local copy of the empty item */
int tval, sval;
- bool create_item = TRUE;
+ bool_ create_item = TRUE;
tval = o_ptr->tval;
if ( !ego && (tval == TV_POTION || tval == TV_POTION2))
@@ -4270,18 +4193,7 @@ void do_cmd_alchemist(void)
if (o_ptr->number == 1)
repeat = 0;
- if (item >= 0)
- {
- inven_item_increase(item, ( -1));
- inven_item_describe(item);
- inven_item_optimize(item);
- }
- else
- {
- floor_item_increase(0 - item, ( -1));
- floor_item_describe(0 - item);
- floor_item_optimize(0 - item);
- }
+ inc_stack_size(item, -1);
}
else
{
@@ -4290,14 +4202,7 @@ void do_cmd_alchemist(void)
/* reset o_ptr to the original stack,
* which contains at least another item */
- if (item >= 0)
- {
- o_ptr = &p_ptr->inventory[item];
- }
- else
- {
- o_ptr = &o_list[0 - item];
- }
+ o_ptr = get_object(item);
}
}
}
@@ -4328,17 +4233,8 @@ void do_cmd_alchemist(void)
s = "You have no rechargable items.";
if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR ))) return;
- /* Get the item (in the pack) */
- if (item >= 0)
- {
- o_ptr = &p_ptr->inventory[item];
- }
-
- /* Get the item (on the floor) */
- else
- {
- o_ptr = &o_list[0 - item];
- }
+ /* Get the item */
+ o_ptr = get_object(item);
/* Make sure we have enough essences to recharge this */
if (!alchemist_items_check(o_ptr->tval, o_ptr->sval, 0, 0, TRUE))
@@ -4427,7 +4323,7 @@ int spell_chance_random(random_spell* rspell)
/* Extract the base spell failure rate */
- chance = rspell->level + 25;
+ chance = rspell->level + 10;
/* Reduce failure rate by "effective" level adjustment */
chance -= 3 * (get_skill(SKILL_THAUMATURGY) - rspell->level);
@@ -4444,18 +4340,8 @@ int spell_chance_random(random_spell* rspell)
/* Extract the minimum failure rate */
minfail = adj_mag_fail[p_ptr->stat_ind[A_INT]];
- /* Minimum failure rate */
- if (chance < minfail) chance = minfail;
-
- /* Stunning makes spells harder */
- if (p_ptr->stun > 50) chance += 25;
- else if (p_ptr->stun) chance += 15;
-
- /* Always a 5 percent chance of working */
- if (chance > 95) chance = 95;
-
- /* Return the chance */
- return (chance);
+ /* Failure rate */
+ return clamp_failure_chance(chance, minfail);
}
@@ -4504,7 +4390,7 @@ static void print_spell_batch(int batch, int max)
/*
* List ten random spells and ask to pick one.
*/
-static random_spell* select_spell_from_batch(int batch, bool quick)
+static random_spell* select_spell_from_batch(int batch, bool_ quick)
{
char tmp[160];
@@ -4666,7 +4552,7 @@ static random_spell* select_spell_from_batch(int batch, bool quick)
/*
* Pick a random spell from a menu
*/
-random_spell* select_spell(bool quick)
+random_spell* select_spell(bool_ quick)
{
char tmp[160];
@@ -4893,82 +4779,6 @@ void do_cmd_powermage(void)
}
-
-#if 0
-
-/*
- * Incremental sleep spell -KMW-
- */
-static void do_sleep_monster(void)
-{
- int dir;
-
- if (p_ptr->lev < 15)
- {
- if (!get_aim_dir(&dir)) return;
- sleep_monster(dir);
- }
- else if (p_ptr->lev < 30)
- {
- sleep_monsters_touch();
- }
- else
- {
- sleep_monsters();
- }
-}
-
-#endif /* 0 */
-
-
-#if 0
-
-/*
- * Multiple Monster Fear -KMW-
- */
-static bool fear_monsters(void)
-{
- return (project_hack(GF_TURN_ALL, p_ptr->lev));
-}
-
-
-/*
- * Close to Player Monster Fear -KMW-
- */
-static bool fear_monsters_touch(void)
-{
- int flg = PROJECT_KILL | PROJECT_HIDE;
-
- return (project(0, 1, p_ptr->py, p_ptr->px, p_ptr->lev,
- GF_TURN_ALL, flg));
-}
-
-
-/*
- * Incremental fear spell -KMW-
- */
-static void do_fear_monster(void)
-{
- int dir;
-
- if (p_ptr->lev < 15)
- {
- if (!get_aim_dir(&dir)) return;
- fear_monster(dir, p_ptr->lev);
- }
- else if (p_ptr->lev < 30)
- {
- fear_monsters_touch();
- }
- else
- {
- fear_monsters();
- }
-}
-
-#endif /* 0 */
-
-
/*
* Brand some ammunition. Used by Cubragol and a mage spell. The spell was
* moved here from cmd6.c where it used to be for Cubragol only. I've also
@@ -4978,18 +4788,6 @@ void brand_ammo(int brand_type, int bolts_only)
{
int a;
- int allowable;
-
-
- if (bolts_only)
- {
- allowable = TV_BOLT;
- }
- else
- {
- allowable = TV_BOLT | TV_ARROW | TV_SHOT;
- }
-
for (a = 0; a < INVEN_PACK; a++)
{
object_type *o_ptr = &p_ptr->inventory[a];
@@ -5138,7 +4936,7 @@ void do_cmd_possessor()
if (ext == 1)
{
- bool use_great = FALSE;
+ bool_ use_great = FALSE;
if (p_ptr->disembodied)
{
@@ -5192,7 +4990,7 @@ void do_cmd_possessor()
/*
* Hook to determine if an object is contertible in an arrow/bolt
*/
-static bool item_tester_hook_convertible(object_type *o_ptr)
+static bool_ item_tester_hook_convertible(object_type *o_ptr)
{
if ((o_ptr->tval == TV_JUNK) || (o_ptr->tval == TV_SKELETON)) return TRUE;
@@ -5321,18 +5119,6 @@ void do_cmd_archer(void)
s = "You have no item to convert.";
if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR))) return;
- /* Get the item (in the pack) */
- if (item >= 0)
- {
- q_ptr = &p_ptr->inventory[item];
- }
-
- /* Get the item (on the floor) */
- else
- {
- q_ptr = &o_list[0 - item];
- }
-
/* Get local object */
q_ptr = &forge;
@@ -5352,18 +5138,7 @@ void do_cmd_archer(void)
msg_print("You make some ammo.");
- if (item >= 0)
- {
- inven_item_increase(item, -1);
- inven_item_describe(item);
- inven_item_optimize(item);
- }
- else
- {
- floor_item_increase(0 - item, -1);
- floor_item_describe(0 - item);
- floor_item_optimize(0 - item);
- }
+ inc_stack_size(item, -1);
(void)inven_carry(q_ptr, FALSE);
}
@@ -5382,18 +5157,6 @@ void do_cmd_archer(void)
s = "You have no item to convert.";
if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR))) return;
- /* Get the item (in the pack) */
- if (item >= 0)
- {
- q_ptr = &p_ptr->inventory[item];
- }
-
- /* Get the item (on the floor) */
- else
- {
- q_ptr = &o_list[0 - item];
- }
-
/* Get local object */
q_ptr = &forge;
@@ -5413,18 +5176,7 @@ void do_cmd_archer(void)
msg_print("You make some ammo.");
- if (item >= 0)
- {
- inven_item_increase(item, -1);
- inven_item_describe(item);
- inven_item_optimize(item);
- }
- else
- {
- floor_item_increase(0 - item, -1);
- floor_item_describe(0 - item);
- floor_item_optimize(0 - item);
- }
+ inc_stack_size(item, -1);
(void)inven_carry(q_ptr, FALSE);
}
@@ -5435,7 +5187,6 @@ void do_cmd_archer(void)
*/
void do_cmd_set_piercing(void)
{
- int ext = 0;
char ch;
char com[80];
@@ -5452,7 +5203,6 @@ void do_cmd_set_piercing(void)
{
if (!get_com(com, &ch))
{
- ext = 0;
break;
}
if ((ch == 'Y') || (ch == 'y'))
@@ -5574,15 +5324,8 @@ void do_cmd_necromancer(void)
/* Extract the minimum failure rate */
minfail = adj_mag_fail[p_ptr->stat_ind[A_CON]];
- /* Minimum failure rate */
- if (chance < minfail) chance = minfail;
-
- /* Stunning makes spells harder */
- if (p_ptr->stun > 50) chance += 25;
- else if (p_ptr->stun) chance += 15;
-
- /* Always a 5 percent chance of working */
- if (chance > 95) chance = 95;
+ /* Failure rate */
+ chance = clamp_failure_chance(chance, minfail);
/* Failed spell */
if (rand_int(100) < chance)
@@ -5794,7 +5537,7 @@ void do_cmd_necromancer(void)
/* Damage CON (possibly permanently) */
if (rand_int(100) < 50)
{
- bool perm = (rand_int(100) < 25);
+ bool_ perm = (rand_int(100) < 25);
/* Message */
msg_print("You have damaged your body!");
@@ -5817,7 +5560,7 @@ static s32b rune_combine = 0;
/*
* Hook to determine if an object is "runestone"
*/
-static bool item_tester_hook_runestone(object_type *o_ptr)
+static bool_ item_tester_hook_runestone(object_type *o_ptr)
{
if (o_ptr->tval != TV_RUNE2) return (FALSE);
@@ -5830,7 +5573,7 @@ static bool item_tester_hook_runestone(object_type *o_ptr)
}
-static bool item_tester_hook_runestone_full(object_type *o_ptr)
+static bool_ item_tester_hook_runestone_full(object_type *o_ptr)
{
if (o_ptr->tval != TV_RUNE2) return (FALSE);
@@ -5846,7 +5589,7 @@ static bool item_tester_hook_runestone_full(object_type *o_ptr)
/*
* Hook to determine if an object is "rune-able"
*/
-static bool item_tester_hook_runeable1(object_type *o_ptr)
+static bool_ item_tester_hook_runeable1(object_type *o_ptr)
{
if (o_ptr->tval != TV_RUNE1) return (FALSE);
@@ -5858,7 +5601,7 @@ static bool item_tester_hook_runeable1(object_type *o_ptr)
/*
* Hook to determine if an object is "rune-able"
*/
-static bool item_tester_hook_runeable2(object_type *o_ptr)
+static bool_ item_tester_hook_runeable2(object_type *o_ptr)
{
if (o_ptr->tval != TV_RUNE2) return (FALSE);
@@ -5950,18 +5693,8 @@ int spell_chance_rune(rune_spell* spell)
/* Extract the minimum failure rate */
minfail = adj_mag_fail[p_ptr->stat_ind[A_DEX]];
- /* Minimum failure rate */
- if (chance < minfail) chance = minfail;
-
- /* Stunning makes spells harder */
- if (p_ptr->stun > 50) chance += 25;
- else if (p_ptr->stun) chance += 15;
-
- /* Always a 5 percent chance of working */
- if (chance > 95) chance = 95;
-
/* Return the chance */
- return (chance);
+ return clamp_failure_chance(chance, minfail);
}
@@ -6148,13 +5881,13 @@ int rune_exec(rune_spell *spell, int cost)
/*
* Test if all runes needed at in the player p_ptr->inventory
*/
-bool test_runespell(rune_spell *spell)
+bool_ test_runespell(rune_spell *spell)
{
int i;
object_type *o_ptr;
- bool typeok = FALSE;
+ bool_ typeok = FALSE;
int rune2 = 0;
@@ -6186,7 +5919,7 @@ bool test_runespell(rune_spell *spell)
/*
* Ask for rune, rune2 and mana
*/
-bool get_runespell(rune_spell *spell)
+bool_ get_runespell(rune_spell *spell)
{
int item, power_rune = 0, rune2 = 0, plev = get_skill(SKILL_RUNECRAFT);
@@ -6198,7 +5931,7 @@ bool get_runespell(rune_spell *spell)
cptr q, s;
- bool OK = FALSE;
+ bool_ OK = FALSE;
rune_combine = 0;
@@ -6211,17 +5944,8 @@ bool get_runespell(rune_spell *spell)
s = "You have no rune to use.";
if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR))) return FALSE;
- /* Get the item (in the pack) */
- if (item >= 0)
- {
- o_ptr = &p_ptr->inventory[item];
- }
-
- /* Get the item (on the floor) */
- else
- {
- o_ptr = &o_list[0 - item];
- }
+ /* Get the item */
+ o_ptr = get_object(item);
type = o_ptr->sval;
while (1)
@@ -6233,17 +5957,9 @@ bool get_runespell(rune_spell *spell)
if (OK) break;
- /* Get the item (in the pack) */
- if (item >= 0)
- {
- o_ptr = &p_ptr->inventory[item];
- }
+ /* Get the item */
+ o_ptr = get_object(item);
- /* Get the item (on the floor) */
- else
- {
- o_ptr = &o_list[0 - item];
- }
rune_combine |= 1 << o_ptr->sval;
rune2 |= 1 << o_ptr->sval;
}
@@ -6351,7 +6067,7 @@ static void print_runespell_batch(int batch, int max)
* List ten random spells and ask to pick one.
*/
-static rune_spell* select_runespell_from_batch(int batch, bool quick,
+static rune_spell* select_runespell_from_batch(int batch, bool_ quick,
int *s_idx)
{
char tmp[160];
@@ -6450,7 +6166,7 @@ static rune_spell* select_runespell_from_batch(int batch, bool quick,
* Pick a random spell from a menu
*/
-rune_spell* select_runespell(bool quick, int *s_idx)
+rune_spell* select_runespell(bool_ quick, int *s_idx)
{
char tmp[160];
@@ -6629,16 +6345,8 @@ void do_cmd_runestone()
s = "You have no runestone to cast from.";
if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR))) return;
- /* Get the item (in the pack) */
- if (item >= 0)
- {
- o_ptr = &p_ptr->inventory[item];
- }
- /* Get the item (on the floor) */
- else
- {
- o_ptr = &o_list[0 - item];
- }
+ /* Get the item */
+ o_ptr = get_object(item);
s_ptr.type = o_ptr->pval;
s_ptr.rune2 = o_ptr->pval2;
@@ -6748,16 +6456,8 @@ void do_cmd_rune_carve()
s = "You have no runestone to use.";
if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR))) return;
- /* Get the item (in the pack) */
- if (item >= 0)
- {
- o_ptr = &p_ptr->inventory[item];
- }
- /* Get the item (on the floor) */
- else
- {
- o_ptr = &o_list[0 - item];
- }
+ /* Get the item */
+ o_ptr = get_object(item);
o_ptr->pval = s_ptr.type;
o_ptr->pval2 = s_ptr.rune2;
@@ -6793,15 +6493,14 @@ void do_cmd_rune_carve()
if (o_ptr->k_idx)
{
- bool do_del = FALSE;
+ bool_ do_del = FALSE;
if ((o_ptr->tval == TV_RUNE1) && (o_ptr->sval == s_ptr.type)) do_del = TRUE;
if ((o_ptr->tval == TV_RUNE2) && (BIT(o_ptr->sval) & s_ptr.rune2)) do_del = TRUE;
if (do_del)
{
- inven_item_increase(i, -1);
- inven_item_optimize(i);
+ inc_stack_size_ex(i, -1, OPTIMIZE, NO_DESCRIBE);
}
}
}
@@ -7074,7 +6773,7 @@ void do_cmd_unbeliever()
/*
* Hook to determine if an object is totemable
*/
-static bool item_tester_hook_totemable(object_type *o_ptr)
+static bool_ item_tester_hook_totemable(object_type *o_ptr)
{
/* Only full corpse */
if ((o_ptr->tval == TV_CORPSE) &&
@@ -7097,9 +6796,9 @@ void do_cmd_summoner_extract()
cptr q, s;
- int item, r, e;
+ int item, r;
- bool partial;
+ bool_ partial;
/* Not when confused */
@@ -7123,17 +6822,9 @@ void do_cmd_summoner_extract()
s = "You have no corpse to use.";
if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR))) return;
- /* Get the item (in the pack) */
- if (item >= 0)
- {
- o_ptr = &p_ptr->inventory[item];
- }
+ /* Get the item */
+ o_ptr = get_object(item);
- /* Get the item (on the floor) */
- else
- {
- o_ptr = &o_list[0 - item];
- }
if (r_info[o_ptr->pval2].flags1 & RF1_UNIQUE)
{
@@ -7145,20 +6836,8 @@ void do_cmd_summoner_extract()
}
r = o_ptr->pval2;
- e = o_ptr->pval3;
- if (item > 0)
- {
- inven_item_increase(item, -1);
- inven_item_describe(item);
- inven_item_optimize(item);
- }
- else
- {
- floor_item_increase( -item, -1);
- floor_item_describe( -item);
- floor_item_optimize( -item);
- }
+ inc_stack_size(item, -1);
if (magik(r_info[o_ptr->pval2].level - get_skill(SKILL_SUMMON)))
{
@@ -7190,7 +6869,7 @@ void summon_true(int r_idx, int item)
{
int i, status, x = 1, y = 1, rx, ry = 0, chance;
- bool used;
+ bool_ used;
monster_race *r_ptr = &r_info[r_idx];
@@ -7279,21 +6958,8 @@ void summon_true(int r_idx, int item)
/* Destroy the totem if the used flag is set */
if (used)
{
- /* Eliminate the totem (from the pack) */
- if (item >= 0)
- {
- inven_item_increase(item, -1);
- inven_item_describe(item);
- inven_item_optimize(item);
- }
-
- /* Eliminate the totem (from the floor) */
- else
- {
- floor_item_increase(0 - item, -1);
- floor_item_describe(0 - item);
- floor_item_optimize(0 - item);
- }
+ /* Eliminate the totem */
+ inc_stack_size(item, -1);
}
/* Done */
@@ -7320,14 +6986,7 @@ void do_cmd_summoner_summon()
if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR))) return;
/* Access the item */
- if (item >= 0)
- {
- o_ptr = &p_ptr->inventory[item];
- }
- else
- {
- o_ptr = &o_list[0 - item];
- }
+ o_ptr = get_object(item);
/* Take a turn */
energy_use = 100;
@@ -7547,8 +7206,6 @@ void do_cmd_symbiotic(void)
int plev = get_skill(SKILL_SYMBIOTIC);
magic_power spell;
- monster_race *r_ptr;
-
/* Get the carried monster */
object_type *o_ptr = &p_ptr->inventory[INVEN_CARRY];
@@ -7607,15 +7264,8 @@ void do_cmd_symbiotic(void)
/* Extract the minimum failure rate */
minfail = adj_mag_fail[p_ptr->stat_ind[A_INT]];
- /* Minimum failure rate */
- if (chance < minfail) chance = minfail;
-
- /* Stunning makes spells harder */
- if (p_ptr->stun > 50) chance += 25;
- else if (p_ptr->stun) chance += 15;
-
- /* Always a 5 percent chance of working */
- if (chance > 95) chance = 95;
+ /* Failure rate */
+ chance = clamp_failure_chance(chance, minfail);
/* Failed spell */
if (rand_int(100) < chance)
@@ -7715,7 +7365,7 @@ void do_cmd_symbiotic(void)
d = 2;
while (d < 100)
{
- scatter(&y, &x, p_ptr->py, p_ptr->px, d, 0);
+ scatter(&y, &x, p_ptr->py, p_ptr->px, d);
if (cave_floor_bold(y, x) && (!cave[y][x].m_idx)) break;
@@ -7772,8 +7422,6 @@ void do_cmd_symbiotic(void)
break;
}
- r_ptr = &r_info[o_ptr->pval];
-
percent1 = p_ptr->chp;
percent1 = (percent1 * 100) / p_ptr->mhp;
@@ -7825,7 +7473,6 @@ void do_cmd_symbiotic(void)
break;
}
- r_ptr = &r_info[o_ptr->pval];
hp = o_ptr->pval3 * (15 + get_skill_scale(SKILL_SYMBIOTIC, 35)) / 100;
o_ptr->pval2 += hp;
if (o_ptr->pval2 > o_ptr->pval3) o_ptr->pval2 = o_ptr->pval3;
@@ -7919,7 +7566,7 @@ void do_cmd_symbiotic(void)
/* Damage CON (possibly permanently) */
if (rand_int(100) < 50)
{
- bool perm = (rand_int(100) < 25);
+ bool_ perm = (rand_int(100) < 25);
/* Message */
msg_print("You have damaged your body!");
@@ -7983,3 +7630,23 @@ void do_cmd_create_boulder()
energy_use = 100;
}
}
+
+/*
+ * Clamp failure chance
+ */
+extern int clamp_failure_chance(int chance, int minfail)
+{
+ if (minfail < 0) minfail = 0;
+
+ /* Minimum failure rate */
+ if (chance < minfail) chance = minfail;
+
+ /* Stunning makes spells harder */
+ if (p_ptr->stun > 50) chance += 25;
+ else if (p_ptr->stun) chance += 15;
+
+ /* Always a 5 percent chance of working */
+ if (chance > 95) chance = 95;
+
+ return chance;
+}
diff --git a/src/cmovie.c b/src/cmovie.c
index d7a3fa17..d1459e02 100644
--- a/src/cmovie.c
+++ b/src/cmovie.c
@@ -31,15 +31,9 @@ s16b do_play_cmovie(cptr cmov_file)
/* File type is "TEXT" */
FILE_TYPE(FILE_TYPE_TEXT);
- /* Grab permission */
- /* safe_setuid_grab(); */
-
/* Read the file */
fff = my_fopen(buf, "r");
- /* Drop permission */
- /* safe_setuid_drop(); */
-
/* Failure */
if (!fff) return ( -1);
@@ -167,7 +161,7 @@ s16b do_play_cmovie(cptr cmov_file)
}
else
{
- bool stop = FALSE;
+ bool_ stop = FALSE;
while (TRUE)
{
@@ -320,15 +314,9 @@ void do_record_cmovie(cptr cmovie)
/* File type is "TEXT" */
FILE_TYPE(FILE_TYPE_TEXT);
- /* Grab permission */
- /* safe_setuid_grab(); */
-
/* Check for existing file */
fd = fd_open(buf, O_RDONLY);
- /* Drop permission */
- /* safe_setuid_drop(); */
-
/* Existing file */
if (fd >= 0)
{
@@ -347,15 +335,9 @@ void do_record_cmovie(cptr cmovie)
/* Be sure */
if (!get_check("Ready to record(Press ctrl+D to enter a textual note while recording)?")) return;
- /* Grab privs */
- /* safe_setuid_grab(); */
-
/* Open the non-existing file */
if (fd < 0) movfile = my_fopen(buf, "w");
- /* And drop them */
- /* safe_setuid_drop(); */
-
/* Invalid file */
if (movfile == NULL)
{
diff --git a/src/config.h b/src/config.h
index 8892a143..c9f460e7 100644
--- a/src/config.h
+++ b/src/config.h
@@ -30,9 +30,8 @@
* OPTION: See the Makefile(s), where several options may be declared.
*
* Some popular options include "USE_GCU" (allow use with Unix "curses"),
- * "USE_X11" (allow basic use with Unix X11), "USE_XAW" (allow use with
- * Unix X11 plus the Athena Widget set), and "USE_CAP" (allow use with
- * the "termcap" library, or with hard-coded vt100 terminals).
+ * "USE_X11" (allow basic use with Unix X11) and "USE_XAW" (allow use with
+ * Unix X11 plus the Athena Widget set).
*
* The old "USE_NCU" option has been replaced with "USE_GCU".
*
@@ -114,37 +113,6 @@
/*
- * OPTION: Verify savefile Checksums (Angband 2.7.0 and up)
- * This option can help prevent "corruption" of savefiles, and also
- * stop intentional modification by amateur users.
- */
-#define VERIFY_CHECKSUMS
-
-
-/*
- * OPTION: Forbid the use of "fiddled" savefiles. As far as I can tell,
- * a fiddled savefile is one with an internal timestamp different from
- * the actual timestamp. Thus, turning this option on forbids one from
- * copying a savefile to a different name. Combined with disabling the
- * ability to save the game without quitting, and with some method of
- * stopping the user from killing the process at the tombstone screen,
- * this should prevent the use of backup savefiles. It may also stop
- * the use of savefiles from other platforms, so be careful.
- */
-/* #define VERIFY_TIMESTAMP */
-
-
-/*
- * OPTION: Forbid the "savefile over-write" cheat, in which you simply
- * run another copy of the game, loading a previously saved savefile,
- * and let that copy over-write the "dead" savefile later. This option
- * either locks the savefile, or creates a fake "xxx.lok" file to prevent
- * the use of the savefile until the file is deleted. Not ready yet.
- */
-/* #define VERIFY_SAVEFILE */
-
-
-/*
* OPTION: Allow characteres to be "auto-rolled"
*/
#define ALLOW_AUTOROLLER
@@ -237,17 +205,6 @@
/*
- * OPTION: Hack -- EMX stuff
- */
-#ifdef USE_EMX
-
-/* Do not handle signals */
-# undef HANDLE_SIGNALS
-
-#endif
-
-
-/*
* OPTION: Set the "default" path to the angband "lib" directory.
*
* See "main.c" for usage, and note that this value is only used on
@@ -274,44 +231,19 @@
/*
- * OPTION: Create and use a hidden directory in the user's home directory
- * for storing pref-files and character-dumps.
- */
-#if defined(SET_UID) && !defined(MACH_O_CARBON) && !defined(NO_HOME_TOME)
-#define PRIVATE_USER_PATH "~/.tome"
-#endif /* SET_UID && !MACH_O_CARBON */
-
-/*
- * Where to put the user's files on the Mac
+ * Where to put the user's files.
*/
#if defined(MACH_O_CARBON)
#define PRIVATE_USER_PATH "~/Library/Application Support/ToME"
#define PRIVATE_USER_PATH_DATA
#define PRIVATE_USER_PATH_APEX
#define PRIVATE_USER_PATH_MODULES
+#else
+#define PRIVATE_USER_PATH "~/.tome"
+#define PRIVATE_USER_PATH_APEX
#endif
/*
- * On multiuser systems, add the "uid" to savefile names
- */
-#if defined(SET_UID) && !defined(MACH_O_CARBON)
-# define SAVEFILE_USE_UID
-#endif /* SET_UID && !MACH_O_CARBON */
-
-
-/*
- * OPTION: Check the "time" against "lib/file/hours.txt"
- */
-/* #define CHECK_TIME */
-
-/*
- * OPTION: Check the "load" against "lib/file/load.txt"
- * This may require the 'rpcsvs' library
- */
-/* #define CHECK_LOAD */
-
-
-/*
* OPTION: For some brain-dead computers with no command line interface,
* namely Macintosh, there has to be some way of "naming" your savefiles.
* The current "Macintosh" hack is to make it so whenever the character
@@ -319,8 +251,7 @@
* machines, once you manage to "load" a savefile, it stays that way.
* Macintosh is particularly weird because you can load savefiles that
* are not contained in the "lib:save:" folder, and if you change the
- * player's name, it will then save the savefile elsewhere. Note that
- * this also gives a method of "bypassing" the "VERIFY_TIMESTAMP" code.
+ * player's name, it will then save the savefile elsewhere.
*/
#if defined(MACINTOSH) || defined(WINDOWS)
/* #define SAVEFILE_MUTABLE */
@@ -328,14 +259,6 @@
/*
- * OPTION: Capitalize the "user_name" (for "default" player name)
- * This option is only relevant on SET_UID machines.
- */
-#define CAPITALIZE_USER_NAME
-
-
-
-/*
* OPTION: Person to bother if something goes wrong.
*/
#define MAINTAINER "tome@packages.debian.org"
@@ -356,29 +279,11 @@
-/*
- * OPTION: Attempt to prevent all "cheating"
- */
-/* #define VERIFY_HONOR */
-
-
-/*
- * React to the "VERIFY_HONOR" flag
- */
-#ifdef VERIFY_HONOR
-# define VERIFY_SAVEFILE
-# define VERIFY_CHECKSUMS
-# define VERIFY_TIMESTAMPS
-#endif
-
/* ToME options: */
/* Should the player know his / her starting life rate? */
#define SHOW_LIFE_RATE
-/* Do we want different characters for different races? */
-#define VARIABLE_PLAYER_GRAPH
-
/* Allow hordes of 'similar' monsters */
#define MONSTER_HORDES
@@ -391,42 +296,17 @@
/* # define TRACK_FRIENDS */
/*
- * OPTION: Repeat last command -- TNB
- */
-#define ALLOW_REPEAT
-
-/*
- * OPTION: Make opening and closing things easy -- TNB
- */
-#define ALLOW_EASY_OPEN
-
-/*
- * OPTION: Make disarming traps easy -- TNB
- */
-#define ALLOW_EASY_DISARM
-
-/*
* Using the fast autoroller can be considered as cheating
*/
#define USE_FAST_AUTOROLLER
/*
- * Forbid the use of some race/class combinations
- */
-/* #define RESTRICT_COMBINATIONS */
-
-/*
* Enable the CTRL + L command to quit without saving
* Only use for debugging purpose, otherwise you are a CHEATER
*/
/* #define ALLOW_QUITTING */
/*
- * Panic saves have a different name
- */
-#define SAFER_PANICS
-
-/*
* Allow makefiles to override the default file mode
*/
#ifndef FILE_MODE
diff --git a/src/defines.h b/src/defines.h
index e434e461..850bbc7a 100644
--- a/src/defines.h
+++ b/src/defines.h
@@ -318,7 +318,6 @@
#define MESSAGE_NONE 0
#define MESSAGE_MSG 1
-#define MESSAGE_IRC 2
/*
* OPTION: Maximum space for the message text buffer (see "io.c")
@@ -2317,7 +2316,7 @@
/* xxx */
#define PW_PLAYER 0x00000008L /* Display character */
#define PW_M_LIST 0x00000010L /* Show monster list */
-#define PW_IRC 0x00000020L /* Display irc messages */
+/* xxx */
#define PW_MESSAGE 0x00000040L /* Display messages */
#define PW_OVERHEAD 0x00000080L /* Display overhead view */
#define PW_MONSTER 0x00000100L /* Display monster recall */
@@ -3851,17 +3850,6 @@
-/*
- * Hack -- Prepare to use the "Secure" routines
- */
-#if defined(SET_UID) && defined(SECURE)
-extern int PlayerUID;
-# define getuid() PlayerUID
-# define geteuid() PlayerUID
-#endif
-
-
-
/*** Color constants ***/
@@ -4005,7 +3993,6 @@ extern int PlayerUID;
#define BACT_GREET_KING 4
#define BACT_KING_LEGENDS 5
#define BACT_QUEST1 6
-#define BACT_GOLD 7
#define BACT_POSTER 8
#define BACT_ARENA_RULES 9
#define BACT_ARENA 10
@@ -4052,7 +4039,7 @@ extern int PlayerUID;
#define BACT_REQUEST_ITEM 51
#define BACT_GET_LOAN 52
#define BACT_PAY_BACK_LOAN 53
-// If one adds new BACT_ do NOT forget to increase max_bact in variables.c
+/* If one adds new BACT_ do NOT forget to increase max_bact in variables.c */
/*
@@ -4624,6 +4611,9 @@ extern int PlayerUID;
/* Ugly but needed */
#define MAX_SKILLS 200
+/* Number of skill choices for Lost Sword quests. */
+#define LOST_SWORD_NSKILLS 4
+
/* SKill flags */
#define SKF1_HIDDEN 0x00000001 /* Starts hidden */
#define SKF1_AUTO_HIDE 0x00000002 /* Tries to rehide at calc_bonus */
@@ -4672,9 +4662,6 @@ extern int PlayerUID;
* end may have a system-specific encoding
*/
#define CMD_CLI_HELP -8192
-#define CMD_IRC_CONNECT -8191
-#define CMD_IRC_CHAT -8190
-#define CMD_IRC_DISCON -8189
#define CMD_SHOW_TIME -8188
#define CMD_SHOW_SKILL -8187
#define CMD_DUMP_HTML -8186
diff --git a/src/dungeon.c b/src/dungeon.c
index 26c27c78..6d732f00 100644
--- a/src/dungeon.c
+++ b/src/dungeon.c
@@ -20,17 +20,6 @@ extern lua_State* L;
#define AUTO_CURSE_CHANCE 15
#define CHAINSWORD_NOISE 100
-/*
- * I created this when a bug misplaced my character and the game wasn't able
- * to load it again.. very frustrating.
- * So this hack will generate a new level without calling dungeon(), and
- * then the normal behavior will apply.
- */
-/* #define SAVE_HACK */
-#ifdef SAVE_HACK
-bool save_hack = TRUE;
-#endif
-
/*
* Return a "feeling" (or NULL) about an item. Method 1 (Heavy).
@@ -226,7 +215,7 @@ byte value_check_aux2_magic(object_type *o_ptr)
/*
* Can a player be resurrected?
*/
-static bool granted_resurrection(void)
+static bool_ granted_resurrection(void)
{
PRAY_GOD(GOD_ERU)
{
@@ -309,7 +298,7 @@ void sense_inventory(void)
{
int i, combat_lev, magic_lev;
- bool heavy_combat, heavy_magic;
+ bool_ heavy_combat, heavy_magic;
byte feel;
@@ -476,13 +465,7 @@ static void pattern_teleport(void)
/* Accept request */
msg_format("You teleport to dungeon level %d.", command_arg);
- if (autosave_l)
- {
- is_autosave = TRUE;
- msg_print("Autosaving the game...");
- do_cmd_save_game();
- is_autosave = FALSE;
- }
+ autosave_checkpoint();
/* Change level */
dun_level = command_arg;
@@ -495,7 +478,7 @@ static void pattern_teleport(void)
/*
* Returns TRUE if we are on the Straight Road...
*/
-static bool pattern_effect(void)
+static bool_ pattern_effect(void)
{
if ((cave[p_ptr->py][p_ptr->px].feat < FEAT_PATTERN_START) ||
(cave[p_ptr->py][p_ptr->px].feat > FEAT_PATTERN_XTRA2)) return (FALSE);
@@ -800,7 +783,7 @@ static void regen_monsters(void)
*
* Should belong to object1.c, renamed to object_decays() -- pelpel
*/
-bool decays(object_type *o_ptr)
+bool_ decays(object_type *o_ptr)
{
u32b f1, f2, f3, f4, f5, esp;
@@ -1027,132 +1010,9 @@ void apply_effect(int y, int x)
}
-#if 0
-/*
- * Activate corruptions' effects on player
- *
- * All the rolls against arbitrarily chosen numbers are normalised
- * (i.e. zero). They might have some cabalistic(?) significance,
- * but I seriously doubt if processors take care of the Judeo-Christian
- * tradition :) -- pelpel
- */
-static void process_corruption_effects(void)
-{}
-
-#endif
-
-
-
-#ifdef pelpel
-
-/*
- * Handle staying spell effects once every 10 game turns
- */
-static void process_effects(void)
-{
- int i, j;
-
- /* Every 10 game turns */
- if (turn % 10) return;
-
- /* Not in the small-scale wilderness map */
- if (p_ptr->wild_mode) return;
-
-
- /* Handle spell effects */
- for (j = 0; j < cur_hgt - 1; j++)
- {
- for (i = 0; i < cur_wid - 1; i++)
- {
- int e = cave[j][i].effect;
-
- if (e)
- {
- effect_type *e_ptr = &effects[e];
-
- if (e_ptr->time)
- {
- /* Apply damage */
- project(0, 0, j, i, e_ptr->dam, e_ptr->type,
- PROJECT_KILL | PROJECT_ITEM | PROJECT_HIDE);
- }
- else
- {
- cave[j][i].effect = 0;
- }
-
- /* Hack -- notice death */
- if (!alive || death) return;
-
- if (((e_ptr->flags & EFF_WAVE) && !(e_ptr->flags & EFF_LAST)) || ((e_ptr->flags & EFF_STORM) && !(e_ptr->flags & EFF_LAST)))
- {
- if (distance(e_ptr->cy, e_ptr->cx, j, i) < e_ptr->rad - 1)
- cave[j][i].effect = 0;
- }
- }
- }
- }
-
-
- /* Reduce & handle effects */
- for (i = 0; i < MAX_EFFECTS; i++)
- {
- /* Skip empty slots */
- if (effects[i].time == 0) continue;
-
- /* Reduce duration */
- effects[i].time--;
-
- /* Creates a "wave" effect*/
- if (effects[i].flags & EFF_WAVE)
- {
- effect_type *e_ptr = &effects[i];
- int x, y;
-
- e_ptr->rad++;
- for (y = e_ptr->cy - e_ptr->rad; y <= e_ptr->cy + e_ptr->rad; y++)
- {
- for (x = e_ptr->cx - e_ptr->rad; x <= e_ptr->cx + e_ptr->rad; x++)
- {
- if (!in_bounds(y, x)) continue;
-
- if (los(e_ptr->cy, e_ptr->cx, y, x) &&
- (distance(e_ptr->cy, e_ptr->cx, y, x) == e_ptr->rad))
- cave[y][x].effect = i;
- }
- }
- }
- /* Creates a "storm" effect*/
- else if (effects[i].flags & EFF_STORM)
- {
- effect_type *e_ptr = &effects[i];
- int x, y;
-
- e_ptr->cy = p_ptr->py;
- e_ptr->cx = p_ptr->px;
- for (y = e_ptr->cy - e_ptr->rad; y <= e_ptr->cy + e_ptr->rad; y++)
- {
- for (x = e_ptr->cx - e_ptr->rad; x <= e_ptr->cx + e_ptr->rad; x++)
- {
- if (!in_bounds(y, x)) continue;
-
- if (los(e_ptr->cy, e_ptr->cx, y, x) &&
- (distance(e_ptr->cy, e_ptr->cx, y, x) == e_ptr->rad))
- cave[y][x].effect = i;
- }
- }
- }
- }
-
- /* Apply sustained effect in the player grid, if any */
- apply_effect(p_ptr->py, p_ptr->px);
-}
-
-#endif /* pelpel */
-
/* XXX XXX XXX */
-bool is_recall = FALSE;
+bool_ is_recall = FALSE;
/*
@@ -1168,7 +1028,7 @@ static void process_world(void)
int x, y, i, j;
int regen_amount;
- bool cave_no_regen = FALSE;
+ bool_ cave_no_regen = FALSE;
int upkeep_factor = 0;
dungeon_info_type *d_ptr = &d_info[dungeon_type];
@@ -1176,7 +1036,6 @@ static void process_world(void)
cave_type *c_ptr;
object_type *o_ptr;
- object_kind *k_ptr;
u32b f1 = 0 , f2 = 0 , f3 = 0, f4 = 0, f5 = 0, esp = 0;
@@ -1249,47 +1108,6 @@ static void process_world(void)
}
}
- /*** Check the Time and Load ***/
-
- /*
- * Every 1000 game turns -- which means this section is invoked every
- * 100 player turns under the normal speed, and slightly more than
- * one per move in the reduced map.
- */
- if ((turn % 1000) == 0)
- {
- /* Check time and load */
- if ((0 != check_time()) || (0 != check_load()))
- {
- /* Warning */
- if (closing_flag <= 2)
- {
- /* Disturb */
- disturb(0, 0);
-
- /* Count warnings */
- closing_flag++;
-
- /* Message */
- msg_print("The gates to Middle Earth are closing...");
- msg_print("Please finish up and/or save your game.");
- }
-
- /* Slam the gate */
- else
- {
- /* Message */
- msg_print("The gates to Middle Earth are now closed.");
-
- /* Stop playing */
- alive = FALSE;
-
- /* Leaving */
- p_ptr->leaving = TRUE;
- }
- }
- }
-
/*** Attempt timed autosave ***/
if (autosave_t && autosave_freq)
{
@@ -1311,7 +1129,7 @@ static void process_world(void)
/* Hack -- Daybreak/Nighfall in town */
if ((turn % ((10L * DAY) / 2)) == 0)
{
- bool dawn;
+ bool_ dawn;
/* Check for dawn */
dawn = ((turn % (10L * DAY)) == 0);
@@ -1455,7 +1273,7 @@ static void process_world(void)
/* Summon */
while (1)
{
- scatter(&yy, &xx, p_ptr->py, p_ptr->px, 6, 0);
+ scatter(&yy, &xx, p_ptr->py, p_ptr->px, 6);
/* Accept an empty grid within the boundary */
if (in_bounds(yy, xx) && cave_floor_bold(yy, xx)) break;
@@ -1960,7 +1778,7 @@ static void process_world(void)
/* Dead player */
if (p_ptr->chp < 0)
{
- bool old_quick = quick_messages;
+ bool_ old_quick = quick_messages;
/* Sound */
sound(SOUND_DEATH);
@@ -2482,8 +2300,6 @@ static void process_world(void)
}
}
-#ifndef pelpel
-
/* handle spell effects */
if (!p_ptr->wild_mode)
{
@@ -2691,8 +2507,6 @@ static void process_world(void)
apply_effect(p_ptr->py, p_ptr->px);
}
-#endif /* !pelpel */
-
/* Arg cannot breath? */
if ((dungeon_flags2 & DF2_WATER_BREATH) && (!p_ptr->water_breath))
{
@@ -2715,7 +2529,7 @@ static void process_world(void)
{
u32b f1, f2, f3, f4, f5;
- bool be_silent = FALSE;
+ bool_ be_silent = FALSE;
/* check all equipment for the Black Breath flag. */
for (i = INVEN_WIELD; i < INVEN_TOTAL; i++)
@@ -2997,7 +2811,6 @@ static void process_world(void)
for (j = 0, i = 0; i < INVEN_TOTAL; i++)
{
o_ptr = &p_ptr->inventory[i];
- k_ptr = &k_info[o_ptr->k_idx];
/* Skip non-objects */
if (!o_ptr->k_idx) continue;
@@ -3012,9 +2825,7 @@ static void process_world(void)
if (o_ptr->timeout <= 0)
{
- inven_item_increase(i, -99);
- inven_item_describe(i);
- inven_item_optimize(i);
+ inc_stack_size(i, -99);
/* Combine and Reorder pack */
p_ptr->notice |= (PN_COMBINE | PN_REORDER);
@@ -3116,9 +2927,8 @@ static void process_world(void)
m_ptr->status = MSTATUS_COMPANION;
}
- inven_item_increase(i, -1);
- inven_item_describe(i);
- inven_item_optimize(i);
+ inc_stack_size(i, -1);
+
j++;
}
}
@@ -3273,12 +3083,9 @@ static void process_world(void)
* The player is yanked up/down as soon as
* he loads the autosaved game.
*/
- if (autosave_l && (p_ptr->word_recall == 1))
+ if (p_ptr->word_recall == 1)
{
- is_autosave = TRUE;
- msg_print("Autosaving the game...");
- do_cmd_save_game();
- is_autosave = FALSE;
+ autosave_checkpoint();
}
/* Make SURE that persistent levels are saved
@@ -3345,7 +3152,7 @@ static void process_world(void)
/*
* Verify use of "wizard" mode
*/
-static bool enter_wizard_mode(void)
+static bool_ enter_wizard_mode(void)
{
/* Ask first time, but not while loading a dead char with the -w option */
if (!noscore && !(p_ptr->chp < 0))
@@ -3373,7 +3180,7 @@ static bool enter_wizard_mode(void)
/*
* Verify use of "debug" commands
*/
-static bool enter_debug_mode(void)
+static bool_ enter_debug_mode(void)
{
/* Ask first time */
if (!noscore && !wizard)
@@ -3414,13 +3221,9 @@ static void process_command(void)
{
char error_m[80];
-#ifdef ALLOW_REPEAT /* TNB */
-
/* Handle repeating the last command */
repeat_check();
-#endif /* ALLOW_REPEAT -- TNB */
-
/* Process the appropriate hooks */
if (process_hooks(HOOK_KEYPRESS, "(d)", command_cmd)) return;
@@ -3658,18 +3461,6 @@ static void process_command(void)
break;
}
-#if 0 /* Merged with the '>' command -- pelpel */
-
- /* Enter quest level -KMW- */
- case '[':
- {
- if (p_ptr->control) break;
- if (!p_ptr->wild_mode) do_cmd_quest();
- break;
- }
-
-#endif /* 0 */
-
/* Go up staircase */
case '<':
{
@@ -3693,10 +3484,6 @@ static void process_command(void)
{
do_cmd_go_up();
}
- else if (vanilla_town)
- {
- /* Do nothing */
- }
/* Don't let the player < when he'd just drop right back down */
else if (p_ptr->food < PY_FOOD_ALERT)
{
@@ -4361,8 +4148,6 @@ static void process_command(void)
break;
}
-#ifndef VERIFY_SAVEFILE
-
/* Hack -- Save and don't quit */
case KTRL('S'):
{
@@ -4371,8 +4156,6 @@ static void process_command(void)
break;
}
-#endif /* VERIFY_SAVEFILE */
-
case KTRL('T'):
{
do_cmd_time();
@@ -4436,27 +4219,6 @@ static void process_command(void)
break;
}
- /* Connect to IRC. */
- case CMD_IRC_CONNECT:
- {
- irc_connect();
- break;
- }
-
- /* Speak on IRC. */
- case CMD_IRC_CHAT:
- {
- irc_chat();
- break;
- }
-
- /* Disconnect from IRC. */
- case CMD_IRC_DISCON:
- {
- irc_disconnect();
- break;
- }
-
/* Game time. */
case CMD_SHOW_TIME:
{
@@ -4586,13 +4348,11 @@ void process_player(void)
/* Complete resting */
else if (resting == -2)
{
- bool stop = TRUE;
+ bool_ stop = TRUE;
object_type *o_ptr;
- monster_race *r_ptr;
/* Get the carried monster */
o_ptr = &p_ptr->inventory[INVEN_CARRY];
- r_ptr = &r_info[o_ptr->pval];
/* Stop resting */
if ((!p_ptr->drain_life) && (p_ptr->chp != p_ptr->mhp)) stop = FALSE;
@@ -4699,9 +4459,7 @@ void process_player(void)
drop_near(o_ptr, 0, p_ptr->py, p_ptr->px);
/* Modify, Describe, Optimize */
- inven_item_increase(item, -255);
- inven_item_describe(item);
- inven_item_optimize(item);
+ inc_stack_size(item, -255);
/* Notice stuff (if needed) */
if (p_ptr->notice) notice_stuff();
@@ -4717,10 +4475,6 @@ void process_player(void)
}
- /* Hack -- cancel "lurking browse mode" */
- if (!command_new) command_see = FALSE;
-
-
/* Assume free turn */
energy_use = 0;
@@ -5276,35 +5030,6 @@ static void dungeon(void)
if (!alive || death) break;
-#ifdef pelpel
-
- /* Process spell effects */
- process_effects();
-
- /* Notice stuff */
- if (p_ptr->notice) notice_stuff();
-
- /* Update stuff */
- if (p_ptr->update) update_stuff();
-
- /* Redraw stuff */
- if (p_ptr->redraw) redraw_stuff();
-
- /* Redraw stuff */
- if (p_ptr->window) window_stuff();
-
- /* Hack -- Hilite the player */
- move_cursor_relative(p_ptr->py, p_ptr->px);
-
- /* Optional fresh */
- if (fresh_after) Term_fresh();
-
- /* Hack -- Notice death or departure */
- if (!alive || death) break;
-
-#endif /* pelpel */
-
-
total_friends = 0;
total_friend_levels = 0;
@@ -5443,11 +5168,11 @@ static void load_all_pref_files(void)
* savefile, we will commit suicide, if necessary, to allow the
* player to start a new game.
*/
-void play_game(bool new_game)
+void play_game(bool_ new_game)
{
int i, tmp_dun;
- bool cheat_death = FALSE;
+ bool_ cheat_death = FALSE;
hack_corruption = FALSE;
@@ -5722,29 +5447,9 @@ void play_game(bool new_game)
/* Update monster list window */
p_ptr->window |= (PW_M_LIST);
-#ifdef SAVE_HACK
-
- /* Process the level */
- if (!save_hack)
- {
- dungeon();
- }
- else
- {
- generate_cave();
- }
-
- save_hack = FALSE;
-
- p_ptr->leaving = TRUE;
-
-#else
-
/* Process the level */
dungeon();
-#endif
-
/* Save the current level if in a persistent level */
tmp_dun = dun_level;
dun_level = old_dun_level;
diff --git a/src/dungeon.pkg b/src/dungeon.pkg
index 3e11338d..f5e4045f 100644
--- a/src/dungeon.pkg
+++ b/src/dungeon.pkg
@@ -1496,17 +1496,6 @@ extern void place_floor(int y, int x);
*/
extern void place_filler(int y, int x);
-/** @fn add_scripted_generator(cptr name, bool stairs, bool monsters, bool objects, bool miscs)
- * @dgonly
- * @param name String \n Name of generator
- * @param stairs Boolean \n TRUE if stairs can be generated, otherwise FALSE
- * @param monsters Boolean \n TRUE if monsters can be generated, otherwise FALSE
- * @param objects Boolean \n TRUE if objects can be generated, otherwise FALSE
- * @param miscs Boolean \n TRUE if other stuff can be generated, otherwise FALSE
- * @note (defined in file lua_bind.c)
- */
-extern void add_scripted_generator(cptr name, bool stairs, bool monsters, bool objects, bool miscs);
-
/** @fn new_player_spot(int branch)
* @brief Places player in a new location.\n
* @param branch Number \n branch is the dungeon branch (if any).
diff --git a/src/externs.h b/src/externs.h
index 4022dace..197c1c8a 100644
--- a/src/externs.h
+++ b/src/externs.h
@@ -7,6 +7,12 @@
* (z-virt.h, z-util.h, z-form.h, term.h, random.h)
*/
+/*
+ * Options for inc_stack_size_ex
+ */
+typedef enum { OPTIMIZE, NO_OPTIMIZE } optimize_flag;
+typedef enum { DESCRIBE, NO_DESCRIBE } describe_flag;
+
/*
* Automatically generated "variable" declarations
@@ -108,36 +114,35 @@ extern u32b sf_when;
extern u16b sf_lives;
extern u16b sf_saves;
extern u32b vernum; /* Version flag */
-extern bool arg_fiddle;
-extern bool arg_wizard;
-extern bool arg_sound;
-extern bool arg_graphics;
-extern bool arg_force_original;
-extern bool arg_force_roguelike;
-extern bool arg_bigtile;
-extern bool character_generated;
-extern bool character_dungeon;
-extern bool character_loaded;
-extern bool character_saved;
-extern bool character_icky;
-extern bool character_xtra;
+extern bool_ arg_fiddle;
+extern bool_ arg_wizard;
+extern bool_ arg_sound;
+extern bool_ arg_graphics;
+extern bool_ arg_force_original;
+extern bool_ arg_force_roguelike;
+extern bool_ arg_bigtile;
+extern bool_ character_generated;
+extern bool_ character_dungeon;
+extern bool_ character_loaded;
+extern bool_ character_saved;
+extern bool_ character_icky;
+extern bool_ character_xtra;
extern u32b seed_flavor;
extern s16b command_cmd;
extern s16b command_arg;
extern s16b command_rep;
extern s16b command_dir;
-extern s16b command_see;
extern s16b command_wrk;
extern s16b command_new;
extern s32b energy_use;
extern s16b choose_default;
-extern bool create_up_stair;
-extern bool create_down_stair;
-extern bool create_up_shaft;
-extern bool create_down_shaft;
-extern bool msg_flag;
-extern bool alive;
-extern bool death;
+extern bool_ create_up_stair;
+extern bool_ create_down_stair;
+extern bool_ create_up_shaft;
+extern bool_ create_down_shaft;
+extern bool_ msg_flag;
+extern bool_ alive;
+extern bool_ death;
extern s16b running;
extern s16b resting;
extern s16b cur_hgt;
@@ -149,26 +154,25 @@ extern s16b object_level;
extern s16b monster_level;
extern s32b turn;
extern s32b old_turn;
-extern bool wizard;
-extern bool use_sound;
-extern bool use_graphics;
-extern bool use_bigtile;
+extern bool_ wizard;
+extern bool_ use_sound;
+extern bool_ use_graphics;
+extern bool_ use_bigtile;
extern byte graphics_mode;
extern u16b total_winner;
extern u16b has_won;
-extern u16b panic_save;
extern u16b noscore;
extern s16b signal_count;
-extern bool inkey_base;
-extern bool inkey_xtra;
-extern bool inkey_scan;
-extern bool inkey_flag;
+extern bool_ inkey_base;
+extern bool_ inkey_xtra;
+extern bool_ inkey_scan;
+extern bool_ inkey_flag;
extern s16b coin_type;
-extern bool opening_chest;
-extern bool shimmer_monsters;
-extern bool shimmer_objects;
-extern bool repair_monsters;
-extern bool repair_objects;
+extern bool_ opening_chest;
+extern bool_ shimmer_monsters;
+extern bool_ shimmer_objects;
+extern bool_ repair_monsters;
+extern bool_ repair_objects;
extern s16b inven_nxt;
extern s16b inven_cnt;
extern s16b equip_cnt;
@@ -181,110 +185,110 @@ extern s16b hack_m_idx_ii;
extern int total_friends;
extern s32b total_friend_levels;
extern int leaving_quest;
-extern bool multi_rew;
+extern bool_ multi_rew;
extern char summon_kin_type;
-extern bool hack_mind;
-extern bool hack_corruption;
-extern bool is_autosave;
+extern bool_ hack_mind;
+extern bool_ hack_corruption;
+extern bool_ is_autosave;
extern int artifact_bias;
extern FILE *text_out_file;
extern void (*text_out_hook)(byte a, cptr str);
extern int text_out_wrap;
extern int text_out_indent;
extern int highscore_fd;
-extern bool show_inven_graph;
-extern bool show_store_graph;
-extern bool show_equip_graph;
-extern bool rogue_like_commands;
-extern bool quick_messages;
-extern bool other_query_flag;
-extern bool carry_query_flag;
-extern bool always_pickup;
-extern bool prompt_pickup_heavy;
-extern bool always_repeat;
-extern bool use_old_target;
-extern bool depth_in_feet;
-extern bool hilite_player;
-extern bool ring_bell;
-extern bool find_ignore_stairs;
-extern bool find_ignore_doors;
-extern bool find_cut;
-extern bool find_examine;
-extern bool disturb_near;
-extern bool disturb_move;
-extern bool disturb_panel;
-extern bool disturb_detect;
-extern bool disturb_state;
-extern bool disturb_minor;
-extern bool disturb_other;
-extern bool avoid_abort;
-extern bool avoid_shimmer;
-extern bool avoid_other;
-extern bool flush_disturb;
-extern bool flush_failure;
-extern bool flush_command;
-extern bool fresh_before;
-extern bool fresh_after;
-extern bool fresh_message;
-extern bool alert_hitpoint;
-extern bool alert_failure;
-extern bool view_yellow_lite;
-extern bool view_bright_lite;
-extern bool view_granite_lite;
-extern bool view_special_lite;
-extern bool plain_descriptions;
-extern bool stupid_monsters;
-extern bool auto_destroy;
-extern bool wear_confirm;
-extern bool confirm_stairs;
-extern bool disturb_pets;
-extern bool view_perma_grids;
-extern bool view_torch_grids;
-extern bool monster_lite;
-extern bool flow_by_sound;
-extern bool track_follow;
-extern bool track_target;
-extern bool stack_allow_items;
-extern bool stack_allow_wands;
-extern bool stack_force_notes;
-extern bool stack_force_costs;
-extern bool view_reduce_lite;
-extern bool view_reduce_view;
-extern bool auto_haggle;
-extern bool auto_scum;
-extern bool expand_look;
-extern bool expand_list;
-extern bool dungeon_align;
-extern bool dungeon_stair;
-extern bool smart_learn;
-extern bool smart_cheat;
-extern bool show_labels;
-extern bool show_weights;
-extern bool show_choices;
-extern bool show_details;
-extern bool testing_stack;
-extern bool testing_carry;
-extern bool cheat_peek;
-extern bool cheat_hear;
-extern bool cheat_room;
-extern bool cheat_xtra;
-extern bool cheat_know;
-extern bool cheat_live;
-extern bool last_words; /* Zangband options */
-extern bool speak_unique;
-extern bool small_levels;
-extern bool empty_levels;
-extern bool always_small_level;
-extern bool player_symbols;
+extern bool_ show_inven_graph;
+extern bool_ show_store_graph;
+extern bool_ show_equip_graph;
+extern bool_ rogue_like_commands;
+extern bool_ quick_messages;
+extern bool_ other_query_flag;
+extern bool_ carry_query_flag;
+extern bool_ always_pickup;
+extern bool_ prompt_pickup_heavy;
+extern bool_ always_repeat;
+extern bool_ use_old_target;
+extern bool_ depth_in_feet;
+extern bool_ hilite_player;
+extern bool_ ring_bell;
+extern bool_ find_ignore_stairs;
+extern bool_ find_ignore_doors;
+extern bool_ find_cut;
+extern bool_ find_examine;
+extern bool_ disturb_near;
+extern bool_ disturb_move;
+extern bool_ disturb_panel;
+extern bool_ disturb_detect;
+extern bool_ disturb_state;
+extern bool_ disturb_minor;
+extern bool_ disturb_other;
+extern bool_ avoid_abort;
+extern bool_ avoid_shimmer;
+extern bool_ avoid_other;
+extern bool_ flush_disturb;
+extern bool_ flush_failure;
+extern bool_ flush_command;
+extern bool_ fresh_before;
+extern bool_ fresh_after;
+extern bool_ fresh_message;
+extern bool_ alert_hitpoint;
+extern bool_ alert_failure;
+extern bool_ view_yellow_lite;
+extern bool_ view_bright_lite;
+extern bool_ view_granite_lite;
+extern bool_ view_special_lite;
+extern bool_ plain_descriptions;
+extern bool_ stupid_monsters;
+extern bool_ auto_destroy;
+extern bool_ wear_confirm;
+extern bool_ confirm_stairs;
+extern bool_ disturb_pets;
+extern bool_ view_perma_grids;
+extern bool_ view_torch_grids;
+extern bool_ monster_lite;
+extern bool_ flow_by_sound;
+extern bool_ track_follow;
+extern bool_ track_target;
+extern bool_ stack_allow_items;
+extern bool_ stack_allow_wands;
+extern bool_ stack_force_notes;
+extern bool_ stack_force_costs;
+extern bool_ view_reduce_lite;
+extern bool_ view_reduce_view;
+extern bool_ auto_haggle;
+extern bool_ auto_scum;
+extern bool_ expand_look;
+extern bool_ expand_list;
+extern bool_ dungeon_align;
+extern bool_ dungeon_stair;
+extern bool_ smart_learn;
+extern bool_ smart_cheat;
+extern bool_ show_labels;
+extern bool_ show_weights;
+extern bool_ show_choices;
+extern bool_ show_details;
+extern bool_ testing_stack;
+extern bool_ testing_carry;
+extern bool_ cheat_peek;
+extern bool_ cheat_hear;
+extern bool_ cheat_room;
+extern bool_ cheat_xtra;
+extern bool_ cheat_know;
+extern bool_ cheat_live;
+extern bool_ last_words; /* Zangband options */
+extern bool_ speak_unique;
+extern bool_ small_levels;
+extern bool_ empty_levels;
+extern bool_ always_small_level;
+extern bool_ player_symbols;
extern byte hitpoint_warn;
extern byte delay_factor;
extern s16b autosave_freq;
-extern bool autosave_t;
-extern bool autosave_l;
+extern bool_ autosave_t;
+extern bool_ autosave_l;
extern s16b feeling;
extern s16b rating;
-extern bool good_item_flag;
-extern bool closing_flag;
+extern bool_ good_item_flag;
+extern bool_ closing_flag;
extern s16b max_panel_rows, max_panel_cols;
extern s16b panel_row_min, panel_row_max;
extern s16b panel_col_min, panel_col_max;
@@ -303,14 +307,11 @@ extern s16b monster_race_idx;
extern s16b monster_ego_idx;
extern object_type *tracked_object;
extern int player_uid;
-extern int player_euid;
-extern int player_egid;
extern char player_name[32];
extern char player_base[32];
extern char died_from[80];
extern char history[4][60];
extern char savefile[1024];
-extern bool savefile_setuid;
extern s16b lite_n;
extern s16b lite_y[LITE_MAX];
extern s16b lite_x[LITE_MAX];
@@ -323,7 +324,7 @@ extern byte temp_x[TEMP_MAX];
extern s16b macro__num;
extern cptr *macro__pat;
extern cptr *macro__act;
-extern bool *macro__cmd;
+extern bool_ *macro__cmd;
extern char *macro__buf;
extern s16b quark__num;
extern cptr *quark__str;
@@ -353,7 +354,7 @@ extern u16b max_towns;
extern town_type *town_info;
extern s16b alloc_kind_size;
extern alloc_entry *alloc_kind_table;
-extern bool alloc_kind_table_valid;
+extern bool_ alloc_kind_table_valid;
extern s16b alloc_race_size;
extern alloc_entry *alloc_race_table;
extern byte misc_to_attr[256];
@@ -478,16 +479,16 @@ extern cptr ANGBAND_DIR_USER;
extern cptr ANGBAND_DIR_XTRA;
extern cptr ANGBAND_DIR_CMOV;
extern char pref_tmp_value[8];
-extern bool item_tester_full;
+extern bool_ item_tester_full;
extern byte item_tester_tval;
-extern bool (*item_tester_hook)(object_type *o_ptr);
-extern bool (*ang_sort_comp)(vptr u, vptr v, int a, int b);
+extern bool_ (*item_tester_hook)(object_type *o_ptr);
+extern bool_ (*ang_sort_comp)(vptr u, vptr v, int a, int b);
extern void (*ang_sort_swap)(vptr u, vptr v, int a, int b);
-extern bool (*get_mon_num_hook)(int r_idx);
-extern bool (*get_mon_num2_hook)(int r_idx);
-extern bool (*get_obj_num_hook)(int k_idx);
-extern bool monk_armour_aux;
-extern bool monk_notify_aux;
+extern bool_ (*get_mon_num_hook)(int r_idx);
+extern bool_ (*get_mon_num2_hook)(int r_idx);
+extern bool_ (*get_obj_num_hook)(int k_idx);
+extern bool_ monk_armour_aux;
+extern bool_ monk_notify_aux;
extern u16b max_wild_x;
extern u16b max_wild_y;
extern wilderness_map **wild_map;
@@ -517,10 +518,10 @@ extern u16b max_ow_idx;
extern u16b max_wf_idx;
extern s16b max_set_idx;
extern int init_flags;
-extern bool ambush_flag;
-extern bool fate_flag;
-extern u16b no_breeds;
-extern bool carried_monster_hit;
+extern bool_ ambush_flag;
+extern bool_ fate_flag;
+extern s16b no_breeds;
+extern bool_ carried_monster_hit;
extern random_artifact random_artifacts[MAX_RANDARTS];
extern s32b RANDART_WEAPON;
extern s32b RANDART_ARMOR;
@@ -531,36 +532,32 @@ extern s16b spell_num;
extern rune_spell rune_spells[MAX_RUNES];
extern s16b rune_num;
extern fate fates[MAX_FATES];
-extern byte vanilla_town;
extern byte dungeon_type;
extern s16b *max_dlv;
extern u32b total_bounties;
extern s16b doppleganger;
-extern bool generate_encounter;
-extern bool autoroll;
-extern bool point_based;
-extern bool maximize, preserve, special_lvls, ironman_rooms;
-extern bool inventory_no_move;
-extern bool take_notes, auto_notes;
-extern bool *m_allow_special;
-extern bool *k_allow_special;
-extern bool *a_allow_special;
-extern bool rand_birth;
-extern bool fast_autoroller;
-extern bool joke_monsters;
-extern bool munchkin_multipliers;
-extern bool center_player;
-#ifdef SAFER_PANICS
-extern bool panicload;
-#endif
+extern bool_ generate_encounter;
+extern bool_ autoroll;
+extern bool_ point_based;
+extern bool_ maximize, preserve, special_lvls, ironman_rooms;
+extern bool_ inventory_no_move;
+extern bool_ take_notes, auto_notes;
+extern bool_ *m_allow_special;
+extern bool_ *k_allow_special;
+extern bool_ *a_allow_special;
+extern bool_ rand_birth;
+extern bool_ fast_autoroller;
+extern bool_ joke_monsters;
+extern bool_ munchkin_multipliers;
+extern bool_ center_player;
extern s16b plots[MAX_PLOTS];
extern random_quest random_quests[MAX_RANDOM_QUEST];
-extern bool exp_need;
-extern bool autoload_old_colors;
-extern bool fate_option;
-extern bool *special_lvl[MAX_DUNGEON_DEPTH];
-extern bool generate_special_feeling;
-extern bool auto_more;
+extern bool_ exp_need;
+extern bool_ autoload_old_colors;
+extern bool_ fate_option;
+extern bool_ *special_lvl[MAX_DUNGEON_DEPTH];
+extern bool_ generate_special_feeling;
+extern bool_ auto_more;
extern u32b dungeon_flags1;
extern u32b dungeon_flags2;
extern birther previous_char;
@@ -571,7 +568,7 @@ extern s16b power_max;
extern s32b extra_savefile_parts;
extern s16b max_q_idx;
extern quest_type *quest;
-extern bool player_char_health;
+extern bool_ player_char_health;
extern s16b max_spells;
extern spell_type *school_spells;
extern s16b max_schools;
@@ -583,11 +580,11 @@ extern char gen_skill_basem[MAX_SKILLS];
extern u32b gen_skill_base[MAX_SKILLS];
extern char gen_skill_modm[MAX_SKILLS];
extern s16b gen_skill_mod[MAX_SKILLS];
-extern bool linear_stats;
+extern bool_ linear_stats;
extern int max_bact;
extern s16b max_corruptions;
-extern bool option_ingame_help;
-extern bool automatizer_enabled;
+extern bool_ option_ingame_help;
+extern bool_ automatizer_enabled;
extern s16b last_teleportation_y;
extern s16b last_teleportation_x;
extern cptr game_module;
@@ -603,7 +600,7 @@ extern const char *get_version_string();
/* plots.c */
extern FILE *hook_file;
-extern bool check_hook(int h_idx);
+extern bool_ check_hook(int h_idx);
extern void wipe_hooks(void);
extern void dump_hooks(int h_idx);
extern void init_hooks(void);
@@ -614,35 +611,27 @@ extern void del_hook_name(int h_idx, cptr name);
extern s32b get_next_arg(char *fmt);
extern int process_hooks_restart;
extern hook_return process_hooks_return[20];
-extern bool process_hooks_ret(int h_idx, char *ret, char *fmt, ...);
-extern bool process_hooks(int h_idx, char *fmt, ...);
+extern bool_ process_hooks_ret(int h_idx, char *ret, char *fmt, ...);
+extern bool_ process_hooks(int h_idx, char *fmt, ...);
/* help.c */
-extern void ingame_help(bool enable);
+extern void ingame_help(bool_ enable);
/* birth.c */
extern void print_desc_aux(cptr txt, int y, int x);
extern void save_savefile_names(void);
-extern bool no_begin_screen;
-extern bool begin_screen(void);
+extern bool_ no_begin_screen;
+extern bool_ begin_screen(void);
extern errr init_randart(void);
extern void get_height_weight(void);
extern void player_birth(void);
/* cave.c */
extern int distance(int y1, int x1, int y2, int x2);
-extern bool los(int y1, int x1, int y2, int x2);
-extern bool cave_valid_bold(int y, int x);
-extern bool no_lite(void);
-#ifdef USE_TRANSPARENCY
-#ifdef USE_EGO_GRAPHICS
+extern bool_ los(int y1, int x1, int y2, int x2);
+extern bool_ cave_valid_bold(int y, int x);
+extern bool_ no_lite(void);
extern void map_info(int y, int x, byte *ap, char *cp, byte *tap, char *tcp, byte *eap, char *ecp);
-#else /* USE_EGO_GRAPHICS */
-extern void map_info(int y, int x, byte *ap, char *cp, byte *tap, char *tcp);
-#endif /* USE_EGO_GRAPHICS */
-#else /* USE_TRANSPARENCY */
-extern void map_info(int y, int x, byte *ap, char *cp);
-#endif /* USE_TRANSPARENCY */
extern void map_info_default(int y, int x, byte *ap, char *cp);
extern void move_cursor_relative(int row, int col);
extern void print_rel(char c, byte a, int y, int x);
@@ -667,8 +656,8 @@ extern void place_floor(int y, int x);
extern void place_floor_convert_glass(int y, int x);
extern void place_filler(int y, int x);
extern void mmove2(int *y, int *x, int y1, int x1, int y2, int x2);
-extern bool projectable(int y1, int x1, int y2, int x2);
-extern void scatter(int *yp, int *xp, int y, int x, int d, int m);
+extern bool_ projectable(int y1, int x1, int y2, int x2);
+extern void scatter(int *yp, int *xp, int y, int x, int d);
extern void health_track(int m_idx);
extern void monster_race_track(int r_idx, int ego);
extern void object_track(object_type *o_ptr);
@@ -689,23 +678,23 @@ extern void do_cmovie_insert(void);
/* cmd1.c */
extern void attack_special(monster_type *m_ptr, s32b special, int dam);
-extern bool test_hit_fire(int chance, int ac, int vis);
-extern bool test_hit_norm(int chance, int ac, int vis);
+extern bool_ test_hit_fire(int chance, int ac, int vis);
+extern bool_ test_hit_norm(int chance, int ac, int vis);
extern s16b critical_shot(int weight, int plus, int dam, int skill);
-extern s16b critical_norm(int weight, int plus, int dam, int weapon_tval, bool *done_crit);
+extern s16b critical_norm(int weight, int plus, int dam, int weapon_tval, bool_ *done_crit);
extern s16b tot_dam_aux(object_type *o_ptr, int tdam, monster_type *m_ptr, s32b *special);
extern void search(void);
extern void carry(int pickup);
extern void py_attack(int y, int x, int max_blow);
-extern bool player_can_enter(byte feature);
-extern void move_player(int dir, int do_pickup, bool disarm);
-extern void move_player_aux(int dir, int do_pickup, int run, bool disarm);
+extern bool_ player_can_enter(byte feature);
+extern void move_player(int dir, int do_pickup, bool_ disarm);
+extern void move_player_aux(int dir, int do_pickup, int run, bool_ disarm);
extern void run_step(int dir);
extern void step_effects(int y, int x, int do_pickup);
extern void do_cmd_pet(void);
-extern bool do_cmd_integrate_body(void);
-extern bool do_cmd_leave_body(bool drop_body);
-extern bool execute_inscription(byte i, byte y, byte x);
+extern bool_ do_cmd_integrate_body(void);
+extern bool_ do_cmd_leave_body(bool_ drop_body);
+extern bool_ execute_inscription(byte i, byte y, byte x);
extern void do_cmd_engrave(void);
extern void do_spin(void);
@@ -720,14 +709,14 @@ extern void do_cmd_open(void);
extern void do_cmd_close(void);
extern void do_cmd_chat(void);
extern void do_cmd_give(void);
-extern bool do_cmd_tunnel_aux(int y, int x, int dir);
+extern bool_ do_cmd_tunnel_aux(int y, int x, int dir);
extern void do_cmd_tunnel(void);
extern void do_cmd_disarm(void);
extern void do_cmd_disarm(void);
extern void do_cmd_bash(void);
extern void do_cmd_alter(void);
extern void do_cmd_spike(void);
-extern void do_cmd_walk(int pickup, bool disarm);
+extern void do_cmd_walk(int pickup, bool_ disarm);
extern void do_cmd_stay(int pickup);
extern void do_cmd_run(void);
extern void do_cmd_rest(void);
@@ -737,7 +726,7 @@ extern void do_cmd_throw(void);
extern void do_cmd_boomerang(void);
extern void do_cmd_unwalk(void);
extern void do_cmd_immovable_special(void);
-extern void fetch(int dir, int wgt, bool require_los);
+extern void fetch(int dir, int wgt, bool_ require_los);
extern void do_cmd_sacrifice(void);
extern void do_cmd_create_artifact(object_type *q_ptr);
extern void do_cmd_steal(void);
@@ -762,14 +751,14 @@ extern void do_cmd_target(void);
extern void do_cmd_look(void);
extern void do_cmd_locate(void);
extern void do_cmd_query_symbol(void);
-extern bool do_cmd_sense_grid_mana(void);
-extern bool research_mon(void);
+extern bool_ do_cmd_sense_grid_mana(void);
+extern bool_ research_mon(void);
extern s32b portable_hole_weight(void);
extern void set_portable_hole_weight(void);
extern void do_cmd_portable_hole(void);
/* cmd4.c */
-extern bool change_option(cptr name, bool value);
+extern bool_ change_option(cptr name, bool_ value);
extern void macro_recorder_start(void);
extern void macro_recorder_add(char c);
extern void macro_recorder_stop(void);
@@ -794,11 +783,11 @@ extern void do_cmd_checkquest(void);
extern void do_cmd_change_tactic(int i);
extern void do_cmd_change_movement(int i);
extern void do_cmd_time(void);
-extern void do_cmd_options_aux(int page, cptr info, bool read_only);
+extern void do_cmd_options_aux(int page, cptr info, bool_ read_only);
/* cmd5.c */
-extern bool is_magestaff(void);
+extern bool_ is_magestaff(void);
extern void calc_magic_bonus(void);
extern void do_cmd_browse_aux(object_type *o_ptr);
extern void do_cmd_browse(void);
@@ -806,18 +795,18 @@ extern void do_cmd_cast(void);
extern void do_cmd_pray(void);
extern void do_cmd_rerate(void);
extern void corrupt_player(void);
-extern bool item_tester_hook_armour(object_type *o_ptr);
-extern void fetch(int dir, int wgt, bool require_los);
+extern bool_ item_tester_hook_armour(object_type *o_ptr);
+extern void fetch(int dir, int wgt, bool_ require_los);
extern void do_poly_self(void);
extern void brand_weapon(int brand_type);
-extern cptr symbiote_name(bool capitalize);
-extern int use_symbiotic_power(int r_idx, bool great, bool only_number, bool no_cost);
+extern cptr symbiote_name(bool_ capitalize);
+extern int use_symbiotic_power(int r_idx, bool_ great, bool_ only_number, bool_ no_cost);
extern s32b get_school_spell(cptr do_what, cptr check_fct, s16b force_book);
extern void do_cmd_copy_spell(void);
extern void cast_school_spell(void);
extern void browse_school_spell(int book, int pval, object_type *o_ptr);
extern int find_spell(char *name);
-extern bool is_school_book(object_type *o_ptr);
+extern bool_ is_school_book(object_type *o_ptr);
/* cmd6.c */
extern void set_stick_mode(object_type *o_ptr);
@@ -828,7 +817,7 @@ extern void do_cmd_read_scroll(void);
extern void do_cmd_aim_wand(void);
extern void do_cmd_use_staff(void);
extern void do_cmd_zap_rod(void);
-extern const char *activation_aux(object_type *o_ptr, bool desc, int item);
+extern const char *activation_aux(object_type *o_ptr, bool_ desc, int item);
extern void do_cmd_activate(void);
extern void do_cmd_rerate(void);
extern void do_cmd_cut_corpse(void);
@@ -843,20 +832,20 @@ extern void necro_info(char *p, int power);
extern void mindcraft_info(char *p, int power);
extern void symbiotic_info(char *p, int power);
extern void mimic_info(char *p, int power);
-extern random_spell* select_spell(bool quick);
+extern random_spell* select_spell(bool_ quick);
extern void cast_magic_spell(int spell, byte level);
extern void do_cmd_summoner(void);
extern void do_cmd_mindcraft(void);
extern void do_cmd_mimic(void);
extern void do_cmd_blade(void);
extern void use_ability_blade(void);
-extern bool alchemist_exists(int tval, int sval, int ego, int artifact);
+extern bool_ alchemist_exists(int tval, int sval, int ego, int artifact);
extern void rod_tip_extract(object_type *o_ptr);
extern void do_cmd_toggle_artifact(object_type *o_ptr);
-extern bool alchemist_items_check(int tval, int sval, int ego, int tocreate, bool message);
+extern bool_ alchemist_items_check(int tval, int sval, int ego, int tocreate, bool_ message);
extern void alchemist_display_recipe(int tval, int sval, int ego);
extern void alchemist_recipe_book(void);
-extern int alchemist_recipe_select(int *tval, int sval, int ego, bool recipe);
+extern int alchemist_recipe_select(int *tval, int sval, int ego, bool_ recipe);
extern int alchemist_learn_object(object_type *o_ptr);
extern void alchemist_gain_level(int lev);
extern void do_cmd_alchemist(void);
@@ -872,13 +861,14 @@ extern void do_cmd_unbeliever(void);
extern void do_cmd_runecrafter(void);
extern void do_cmd_symbiotic(void);
extern s32b sroot(s32b n);
+extern int clamp_failure_chance(int chance, int minfail);
/* dungeon.c */
extern byte value_check_aux1(object_type *o_ptr);
extern byte value_check_aux1_magic(object_type *o_ptr);
extern byte value_check_aux2(object_type *o_ptr);
extern byte value_check_aux2_magic(object_type *o_ptr);
-extern void play_game(bool new_game);
+extern void play_game(bool_ new_game);
extern void sense_inventory();
/* files.c */
@@ -886,32 +876,26 @@ extern void html_screenshot(cptr name);
extern void help_file_screenshot(cptr name);
extern void player_flags(u32b* f1, u32b* f2, u32b* f3, u32b* f4, u32b* f5, u32b* esp);
extern void wipe_saved(void);
-extern void safe_setuid_drop(void);
-extern void safe_setuid_grab(void);
extern s16b tokenize(char *buf, s16b num, char **tokens, char delim1, char delim2);
extern void display_player(int mode);
extern cptr describe_player_location(void);
-extern errr file_character(cptr name, bool full);
+extern errr file_character(cptr name, bool_ full);
extern errr process_pref_file_aux(char *buf);
extern errr process_pref_file(cptr name);
-extern errr check_time_init(void);
-extern errr check_load_init(void);
-extern errr check_time(void);
-extern errr check_load(void);
extern void read_times(void);
-extern bool txt_to_html(cptr head, cptr food, cptr base, cptr ext, bool force, bool recur);
-extern bool show_file(cptr name, cptr what, int line, int mode);
+extern bool_ txt_to_html(cptr head, cptr food, cptr base, cptr ext, bool_ force, bool_ recur);
+extern bool_ show_file(cptr name, cptr what, int line, int mode);
extern void do_cmd_help(void);
extern void process_player_base(void);
-extern void process_player_name(bool sf);
+extern void process_player_name(bool_ sf);
extern void get_name(void);
extern void do_cmd_suicide(void);
extern void do_cmd_save_game(void);
+extern void autosave_checkpoint();
extern long total_points(void);
extern void display_scores(int from, int to);
extern errr predict_score(void);
extern void close_game(void);
-extern void exit_game_panic(void);
extern void signals_ignore_tstp(void);
extern void signals_handle_tstp(void);
extern void signals_init(void);
@@ -923,19 +907,19 @@ extern void show_highclass(int building);
extern errr get_xtra_line(char * file_name, monster_type *m_ptr, char * output);
/* gen_maze.c */
-extern bool level_generate_maze(cptr name);
+extern bool_ level_generate_maze();
/* gen_life.c */
-extern bool level_generate_life(cptr name);
-extern void evolve_level(bool noise);
+extern bool_ level_generate_life();
+extern void evolve_level(bool_ noise);
/* generate.c */
-extern bool new_player_spot(int branch);
-extern void add_level_generator(cptr name, bool (*generator)(cptr), bool stairs, bool monsters, bool objects, bool miscs);
-extern bool level_generate_dungeon(cptr name);
-extern bool generate_fracave(int y0, int x0,int xsize,int ysize,int cutoff,bool light,bool room);
+extern bool_ new_player_spot(int branch);
+extern void add_level_generator(cptr name, bool_ (*generator)(), bool_ stairs, bool_ monsters, bool_ objects, bool_ miscs);
+extern bool_ level_generate_dungeon();
+extern bool_ generate_fracave(int y0, int x0,int xsize,int ysize,int cutoff,bool_ light,bool_ room);
extern void generate_hmap(int y0, int x0,int xsiz,int ysiz,int grd,int roug,int cutoff);
-extern bool room_alloc(int x,int y,bool crowded,int by0,int bx0,int *xx,int *yy);
+extern bool_ room_alloc(int x,int y,bool_ crowded,int by0,int bx0,int *xx,int *yy);
extern void generate_grid_mana(void);
extern byte calc_dungeon_type(void);
extern void generate_cave(void);
@@ -943,7 +927,7 @@ extern void build_rectangle(int y1, int x1, int y2, int x2, int feat, int info);
/* wild.c */
-extern int generate_area(int y, int x, bool border, bool corner, bool refresh);
+extern int generate_area(int y, int x, bool_ border, bool_ corner, bool_ refresh);
extern void wilderness_gen(int refresh);
extern void wilderness_gen_small(void);
extern void reveal_wilderness_around_player(int y, int x, int h, int w);
@@ -957,7 +941,7 @@ extern errr init_player_info_txt(FILE *fp, char *buf);
extern errr init_ab_info_txt(FILE *fp, char *buf);
extern errr init_s_info_txt(FILE *fp, char *buf);
extern errr init_set_info_txt(FILE *fp, char *buf);
-extern errr init_v_info_txt(FILE *fp, char *buf, bool start);
+extern errr init_v_info_txt(FILE *fp, char *buf, bool_ start);
extern errr init_f_info_txt(FILE *fp, char *buf);
extern errr init_k_info_txt(FILE *fp, char *buf);
extern errr init_a_info_txt(FILE *fp, char *buf);
@@ -973,8 +957,7 @@ extern errr init_ba_info_txt(FILE *fp, char *buf);
extern errr init_st_info_txt(FILE *fp, char *buf);
extern errr init_ow_info_txt(FILE *fp, char *buf);
extern errr init_wf_info_txt(FILE *fp, char *buf);
-extern bool process_dungeon_file_full;
-extern errr process_dungeon_file(cptr full_text, cptr name, int *yval, int *xval, int ymax, int xmax, bool init);
+extern errr process_dungeon_file(cptr name, int *yval, int *xval, int ymax, int xmax, bool_ init, bool_ full);
/* init2.c */
extern void init_corruptions(s16b new_size);
@@ -995,14 +978,14 @@ extern u32b fake_text_size;
/* loadsave.c */
extern void register_savefile(int num);
-extern bool file_exist(char *buf);
+extern bool_ file_exist(char *buf);
extern s16b rd_variable(void);
extern void wr_variable(s16b *var);
extern void wr_scripts(void);
-extern bool load_dungeon(char *ext);
+extern bool_ load_dungeon(char *ext);
extern void save_dungeon(void);
-extern bool save_player(void);
-extern bool load_player(void);
+extern bool_ save_player(void);
+extern bool_ load_player(void);
extern errr rd_savefile_new(void);
extern void load_number_key(char *key, u32b *val);
extern void save_number_key(char *key, u32b val);
@@ -1010,11 +993,12 @@ extern void save_number_key(char *key, u32b val);
/* melee1.c */
/* melee2.c */
extern int monst_spell_monst_spell;
-extern bool mon_take_hit_mon(int s_idx, int m_idx, int dam, bool *fear, cptr note);
+extern bool_ mon_take_hit_mon(int s_idx, int m_idx, int dam, bool_ *fear, cptr note);
extern int check_hit2(int power, int level, int ac);
-extern bool carried_make_attack_normal(int r_idx);
-extern bool make_attack_normal(int m_idx, byte divis);
-extern bool make_attack_spell(int m_idx);
+extern int get_attack_power(int effect);
+extern bool_ carried_make_attack_normal(int r_idx);
+extern bool_ make_attack_normal(int m_idx, byte divis);
+extern bool_ make_attack_spell(int m_idx);
extern void process_monsters(void);
extern void curse_equipment(int chance, int heavy_chance);
extern void curse_equipment_dg(int chance, int heavy_chance);
@@ -1029,12 +1013,12 @@ extern void monster_set_level(int m_idx, int level);
extern s32b modify_aux(s32b a, s32b b, char mod);
extern void monster_msg(cptr fmt, ...);
extern void cmonster_msg(char a, cptr fmt, ...);
-extern bool mego_ok(int r_idx, int ego);
-extern void monster_check_experience(int m_idx, bool silent);
-extern void monster_gain_exp(int m_idx, u32b exp, bool silent);
+extern bool_ mego_ok(int r_idx, int ego);
+extern void monster_check_experience(int m_idx, bool_ silent);
+extern void monster_gain_exp(int m_idx, u32b exp, bool_ silent);
extern monster_race* race_info_idx(int r_idx, int ego);
extern int get_wilderness_flag(void);
-extern void sanity_blast(monster_type * m_ptr, bool necro);
+extern void sanity_blast(monster_type * m_ptr, bool_ necro);
extern void delete_monster_idx(int i);
extern void delete_monster(int y, int x);
extern void compact_monsters(int size);
@@ -1046,119 +1030,122 @@ extern void monster_desc(char *desc, monster_type *m_ptr, int mode);
extern void monster_race_desc(char *desc, int r_idx, int ego);
extern void lore_do_probe(int m_idx);
extern void lore_treasure(int m_idx, int num_item, int num_gold);
-extern void update_mon(int m_idx, bool full);
-extern void update_monsters(bool full);
+extern void update_mon(int m_idx, bool_ full);
+extern void update_monsters(bool_ full);
extern void monster_carry(monster_type *m_ptr, int m_idx, object_type *q_ptr);
-extern bool bypass_r_ptr_max_num ;
-extern bool place_monster_aux(int y, int x, int r_idx, bool slp, bool grp, int status);
-extern bool place_monster(int y, int x, bool slp, bool grp);
-extern bool alloc_horde(int y, int x);
-extern bool alloc_monster(int dis, bool slp);
-extern bool summon_specific_okay(int r_idx);
+extern bool_ bypass_r_ptr_max_num ;
+extern bool_ place_monster_aux(int y, int x, int r_idx, bool_ slp, bool_ grp, int status);
+extern bool_ place_monster(int y, int x, bool_ slp, bool_ grp);
+extern bool_ alloc_horde(int y, int x);
+extern bool_ alloc_monster(int dis, bool_ slp);
+extern bool_ summon_specific_okay(int r_idx);
extern int summon_specific_level;
-extern bool summon_specific(int y1, int x1, int lev, int type);
+extern bool_ summon_specific(int y1, int x1, int lev, int type);
extern void monster_swap(int y1, int x1, int y2, int x2);
-extern bool multiply_monster(int m_idx, bool charm, bool clone);
-extern bool hack_message_pain_may_silent;
+extern bool_ multiply_monster(int m_idx, bool_ charm, bool_ clone);
+extern bool_ hack_message_pain_may_silent;
extern void message_pain(int m_idx, int dam);
extern void update_smart_learn(int m_idx, int what);
-extern bool summon_specific_friendly(int y1, int x1, int lev, int type, bool Group_ok);
-extern bool place_monster_one_no_drop;
+extern bool_ summon_specific_friendly(int y1, int x1, int lev, int type, bool_ Group_ok);
+extern bool_ place_monster_one_no_drop;
extern monster_race *place_monster_one_race;
-extern s16b place_monster_one(int y, int x, int r_idx, int ego, bool slp, int status);
+extern s16b place_monster_one(int y, int x, int r_idx, int ego, bool_ slp, int status);
extern s16b player_place(int y, int x);
extern void monster_drop_carried_objects(monster_type *m_ptr);
-extern bool monster_dungeon(int r_idx);
-extern bool monster_quest(int r_idx);
-extern bool monster_ocean(int r_idx);
-extern bool monster_shore(int r_idx);
-extern bool monster_town(int r_idx);
-extern bool monster_wood(int r_idx);
-extern bool monster_volcano(int r_idx);
-extern bool monster_mountain(int r_idx);
-extern bool monster_grass(int r_idx);
-extern bool monster_deep_water(int r_idx);
-extern bool monster_shallow_water(int r_idx);
-extern bool monster_lava(int r_idx);
+extern bool_ monster_dungeon(int r_idx);
+extern bool_ monster_quest(int r_idx);
+extern bool_ monster_ocean(int r_idx);
+extern bool_ monster_shore(int r_idx);
+extern bool_ monster_town(int r_idx);
+extern bool_ monster_wood(int r_idx);
+extern bool_ monster_volcano(int r_idx);
+extern bool_ monster_mountain(int r_idx);
+extern bool_ monster_grass(int r_idx);
+extern bool_ monster_deep_water(int r_idx);
+extern bool_ monster_shallow_water(int r_idx);
+extern bool_ monster_lava(int r_idx);
extern void set_mon_num_hook(void);
extern void set_mon_num2_hook(int y, int x);
-extern bool monster_can_cross_terrain(byte feat, monster_race *r_ptr);
+extern bool_ monster_can_cross_terrain(byte feat, monster_race *r_ptr);
extern void corrupt_corrupted(void);
/* monster3.c */
+extern void dump_companions(FILE *outfile);
extern void do_cmd_companion(void);
-extern bool do_control_reconnect(void);
-extern bool do_control_drop(void);
-extern bool do_control_magic(void);
-extern bool do_control_pickup(void);
-extern bool do_control_inven(void);
-extern bool do_control_walk(void);
-extern bool can_create_companion(void);
+extern bool_ do_control_reconnect(void);
+extern bool_ do_control_drop(void);
+extern bool_ do_control_magic(void);
+extern bool_ do_control_pickup(void);
+extern bool_ do_control_inven(void);
+extern bool_ do_control_walk(void);
+extern bool_ can_create_companion(void);
extern void ai_deincarnate(int m_idx);
-extern bool ai_possessor(int m_idx, int o_idx);
-extern bool ai_multiply(int m_idx);
-extern bool change_side(monster_type *m_ptr);
+extern bool_ ai_possessor(int m_idx, int o_idx);
+extern bool_ ai_multiply(int m_idx);
+extern bool_ change_side(monster_type *m_ptr);
extern int is_friend(monster_type *m_ptr);
-extern bool is_enemy(monster_type *m_ptr, monster_type *t_ptr);
+extern bool_ is_enemy(monster_type *m_ptr, monster_type *t_ptr);
/* object1.c */
/* object2.c */
extern byte get_item_letter_color(object_type *o_ptr);
extern void describe_device(object_type *o_ptr);
+extern void inc_stack_size(int item, int delta);
+extern void inc_stack_size_ex(int item, int delta, optimize_flag opt, describe_flag desc);
extern void object_pickup(int this_o_idx);
extern int get_slot(int slot);
-extern bool apply_flags_set(s16b a_idx, s16b set_idx, u32b *f1, u32b *f2, u32b *f3, u32b *f4, u32b *f5, u32b *esp);
-extern bool apply_set(s16b a_idx, s16b set_idx);
-extern bool takeoff_set(s16b a_idx, s16b set_idx);
-extern bool wield_set(s16b a_idx, s16b set_idx, bool silent);
+extern bool_ apply_flags_set(s16b a_idx, s16b set_idx, u32b *f1, u32b *f2, u32b *f3, u32b *f4, u32b *f5, u32b *esp);
+extern bool_ apply_set(s16b a_idx, s16b set_idx);
+extern bool_ takeoff_set(s16b a_idx, s16b set_idx);
+extern bool_ wield_set(s16b a_idx, s16b set_idx, bool_ silent);
extern object_type *get_object(int item);
extern s32b calc_total_weight(void);
-extern void add_random_ego_flag(object_type *o_ptr, int fego, bool *limit_blows);
-extern bool info_spell;
+extern void add_random_ego_flag(object_type *o_ptr, int fego, bool_ *limit_blows);
+extern bool_ info_spell;
extern char spell_txt[50];
-extern bool grab_tval_desc(int tval);
+extern bool_ grab_tval_desc(int tval);
extern void init_match_theme(obj_theme theme);
-extern bool kind_is_artifactable(int k_idx);
-extern bool kind_is_good(int k_idx);
+extern bool_ kind_is_artifactable(int k_idx);
+extern bool_ kind_is_good(int k_idx);
extern int kind_is_legal_special;
-extern bool kind_is_legal(int k_idx);
-extern bool verify(cptr prompt, int item);
+extern bool_ kind_is_legal(int k_idx);
+extern bool_ verify(cptr prompt, int item);
extern void flavor_init(void);
extern void reset_visuals(void);
extern int object_power(object_type *o_ptr);
-extern bool object_flags_no_set;
+extern bool_ object_flags_no_set;
extern void object_flags(object_type *o_ptr, u32b *f1, u32b *f2, u32b *f3, u32b *f4, u32b *f5, u32b *esp);
extern void object_flags_known(object_type *o_ptr, u32b *f1, u32b *f2, u32b *f3, u32b *f4, u32b *f5, u32b *esp);
extern void object_desc(char *buf, object_type *o_ptr, int pref, int mode);
extern void object_desc_store(char *buf, object_type *o_ptr, int pref, int mode);
-extern bool object_out_desc(object_type *o_ptr, FILE *fff, bool trim_down, bool wait_for_it);
+extern bool_ object_out_desc(object_type *o_ptr, FILE *fff, bool_ trim_down, bool_ wait_for_it);
extern char index_to_label(int i);
extern s16b label_to_inven(int c);
extern s16b label_to_equip(int c);
-extern s16b wield_slot_ideal(object_type *o_ptr, bool ideal);
+extern s16b wield_slot_ideal(object_type *o_ptr, bool_ ideal);
extern s16b wield_slot(object_type *o_ptr);
extern cptr mention_use(int i);
extern cptr describe_use(int i);
extern void inven_item_charges(int item);
extern void inven_item_describe(int item);
extern void inven_item_increase(int item, int num);
-extern bool inven_item_optimize(int item);
+extern bool_ inven_item_optimize(int item);
extern void floor_item_charges(int item);
extern void floor_item_describe(int item);
extern void floor_item_increase(int item, int num);
extern void floor_item_optimize(int item);
-extern bool inven_carry_okay(object_type *o_ptr);
-extern s16b inven_carry(object_type *o_ptr, bool final);
-extern s16b inven_takeoff(int item, int amt, bool force_drop);
-extern void inven_drop(int item, int amt, int dy, int dx, bool silent);
-extern bool item_tester_okay(object_type *o_ptr);
+extern bool_ inven_carry_okay(object_type *o_ptr);
+extern s16b inven_carry(object_type *o_ptr, bool_ final);
+extern s16b inven_takeoff(int item, int amt, bool_ force_drop);
+extern void inven_drop(int item, int amt, int dy, int dx, bool_ silent);
+extern bool_ item_tester_okay(object_type *o_ptr);
extern void display_inven(void);
extern void display_equip(void);
-extern void show_inven(bool mirror);
-extern void show_equip(bool mirror);
+extern void show_inven();
+extern void show_equip();
extern void toggle_inven_equip(void);
-extern bool (*get_item_extra_hook)(int *cp);
-extern bool get_item(int *cp, cptr pmt, cptr str, int mode);
+extern bool_ (*get_item_extra_hook)(int *cp);
+extern bool_ get_item(int *cp, cptr pmt, cptr str, int mode);
extern void excise_object_idx(int o_idx);
extern void delete_object_idx(int o_idx);
extern void delete_object(int y, int x);
@@ -1172,39 +1159,39 @@ extern void object_aware(object_type *o_ptr);
extern void object_tried(object_type *o_ptr);
extern s32b object_value(object_type *o_ptr);
extern s32b object_value_real(object_type *o_ptr);
-extern bool object_similar(object_type *o_ptr, object_type *j_ptr);
+extern bool_ object_similar(object_type *o_ptr, object_type *j_ptr);
extern void object_absorb(object_type *o_ptr, object_type *j_ptr);
extern s16b lookup_kind(int tval, int sval);
extern void object_wipe(object_type *o_ptr);
extern void object_prep(object_type *o_ptr, int k_idx);
extern void object_copy(object_type *o_ptr, object_type *j_ptr);
extern int hack_apply_magic_power;
-extern void apply_magic(object_type *o_ptr, int lev, bool okay, bool good, bool great);
-extern bool make_object(object_type *j_ptr, bool good, bool great, obj_theme theme);
-extern void place_object(int y, int x, bool good, bool great, int where);
-extern bool make_gold(object_type *j_ptr);
+extern void apply_magic(object_type *o_ptr, int lev, bool_ okay, bool_ good, bool_ great);
+extern bool_ make_object(object_type *j_ptr, bool_ good, bool_ great, obj_theme theme);
+extern void place_object(int y, int x, bool_ good, bool_ great, int where);
+extern bool_ make_gold(object_type *j_ptr);
extern void place_gold(int y, int x);
extern void process_objects(void);
extern s16b drop_near(object_type *o_ptr, int chance, int y, int x);
-extern void acquirement(int y1, int x1, int num, bool great, bool known);
+extern void acquirement(int y1, int x1, int num, bool_ great, bool_ known);
extern void pick_trap(int y, int x);
extern cptr item_activation(object_type *o_ptr,byte num);
extern void combine_pack(void);
extern void reorder_pack(void);
extern void display_koff(int k_idx);
extern void random_artifact_resistance (object_type * o_ptr);
-extern void random_resistance (object_type * o_ptr, bool is_scroll, int specific);
+extern void random_resistance (object_type * o_ptr, bool_ is_scroll, int specific);
extern s16b floor_carry(int y, int x, object_type *j_ptr);
extern void pack_decay(int item);
extern void floor_decay(int item);
-extern bool scan_floor(int *items, int *item_num, int y, int x, int mode);
+extern bool_ scan_floor(int *items, int *item_num, int y, int x, int mode);
extern void show_floor(int y, int x);
-extern bool get_item_floor(int *cp, cptr pmt, cptr str, int mode);
+extern bool_ get_item_floor(int *cp, cptr pmt, cptr str, int mode);
extern void py_pickup_floor(int pickup);
extern s16b m_bonus(int max, int level);
extern void object_gain_level(object_type *o_ptr);
-extern void gain_flag_group_flag(object_type *o_ptr, bool silent);
-extern void gain_flag_group(object_type *o_ptr, bool silent);
+extern void gain_flag_group_flag(object_type *o_ptr, bool_ silent);
+extern void gain_flag_group(object_type *o_ptr, bool_ silent);
extern void get_table_name(char * out_string);
extern s32b flag_cost(object_type * o_ptr, int plusses);
@@ -1212,19 +1199,19 @@ extern s32b flag_cost(object_type * o_ptr, int plusses);
extern void do_cmd_power(void);
/* traps.c */
-extern bool player_activate_trap_type(s16b y, s16b x, object_type *i_ptr, s16b item);
+extern bool_ player_activate_trap_type(s16b y, s16b x, object_type *i_ptr, s16b item);
extern void player_activate_door_trap(s16b y, s16b x);
extern void place_trap(int y, int x);
extern void place_trap_object(object_type *o_ptr);
extern void wiz_place_trap(int y, int x, int idx);
extern void do_cmd_set_trap(void);
-extern bool mon_hit_trap(int);
+extern bool_ mon_hit_trap(int);
/* spells1.c */
extern byte spell_color(int type);
extern s16b poly_r_idx(int r_idx);
extern void get_pos_player(int dis, int *ny, int *nx);
-extern bool teleport_player_bypass;
+extern bool_ teleport_player_bypass;
extern void teleport_to_player(int m_idx);
extern void teleport_player_directed(int rad, int dir);
extern void teleport_away(int m_idx, int dis);
@@ -1239,177 +1226,177 @@ extern void acid_dam(int dam, cptr kb_str);
extern void elec_dam(int dam, cptr kb_str);
extern void fire_dam(int dam, cptr kb_str);
extern void cold_dam(int dam, cptr kb_str);
-extern bool inc_stat(int stat);
-extern bool dec_stat(int stat, int amount, int mode);
-extern bool res_stat(int stat, bool full);
-extern bool apply_disenchant(int mode);
-extern bool project_m(int who, int r, int y, int x, int dam, int typ);
+extern bool_ inc_stat(int stat);
+extern bool_ dec_stat(int stat, int amount, int mode);
+extern bool_ res_stat(int stat, bool_ full);
+extern bool_ apply_disenchant(int mode);
+extern bool_ project_m(int who, int r, int y, int x, int dam, int typ);
extern sint project_path(u16b *gp, int range, int y1, int x1, int y2, int x2, int flg);
-extern bool project(int who, int rad, int y, int x, int dam, int typ, int flg);
-extern bool potion_smash_effect(int who, int y, int x, int o_sval);
+extern bool_ project(int who, int rad, int y, int x, int dam, int typ, int flg);
+extern bool_ potion_smash_effect(int who, int y, int x, int o_sval);
extern void do_poly_self(void);
extern void corrupt_player(void);
extern void generate_spell(int plev);
-extern bool unsafe;
+extern bool_ unsafe;
extern void describe_attack_fully(int type, char* r);
extern s16b do_poly_monster(int y, int x);
/* spells2.c */
-extern bool remove_curse_object(object_type *o_ptr, bool all);
+extern bool_ remove_curse_object(object_type *o_ptr, bool_ all);
extern void curse_artifact(object_type * o_ptr);
extern void grow_things(s16b type, int rad);
extern void grow_grass(int rad);
extern void grow_trees(int rad);
-extern bool hp_player(int num);
-extern bool heal_insanity(int val);
+extern bool_ hp_player(int num);
+extern bool_ heal_insanity(int val);
extern void warding_glyph(void);
extern void explosive_rune(void);
-extern bool do_dec_stat(int stat, int mode);
-extern bool do_res_stat(int stat, bool full);
-extern bool do_inc_stat(int stat);
+extern bool_ do_dec_stat(int stat, int mode);
+extern bool_ do_res_stat(int stat, bool_ full);
+extern bool_ do_inc_stat(int stat);
extern void identify_pack(void);
extern void identify_pack_fully(void);
-extern bool remove_curse(void);
-extern bool remove_all_curse(void);
-extern bool restore_level(void);
+extern bool_ remove_curse(void);
+extern bool_ remove_all_curse(void);
+extern bool_ restore_level(void);
extern void self_knowledge(FILE *fff);
-extern bool lose_all_info(void);
-extern bool detect_traps(int rad);
-extern bool detect_doors(int rad);
-extern bool detect_stairs(int rad);
-extern bool detect_treasure(int rad);
-extern bool hack_no_detect_message;
-extern bool detect_objects_gold(int rad);
-extern bool detect_objects_normal(int rad);
-extern bool detect_objects_magic(int rad);
-extern bool detect_monsters_normal(int rad);
-extern bool detect_monsters_invis(int rad);
-extern bool detect_monsters_evil(int rad);
-extern bool detect_monsters_good(int rad);
-extern bool detect_monsters_xxx(u32b match_flag, int rad);
-extern bool detect_monsters_string(cptr chars, int rad);
-extern bool detect_monsters_nonliving(int rad);
-extern bool detect_all(int rad);
+extern bool_ lose_all_info(void);
+extern bool_ detect_traps(int rad);
+extern bool_ detect_doors(int rad);
+extern bool_ detect_stairs(int rad);
+extern bool_ detect_treasure(int rad);
+extern bool_ hack_no_detect_message;
+extern bool_ detect_objects_gold(int rad);
+extern bool_ detect_objects_normal(int rad);
+extern bool_ detect_objects_magic(int rad);
+extern bool_ detect_monsters_normal(int rad);
+extern bool_ detect_monsters_invis(int rad);
+extern bool_ detect_monsters_evil(int rad);
+extern bool_ detect_monsters_good(int rad);
+extern bool_ detect_monsters_xxx(u32b match_flag, int rad);
+extern bool_ detect_monsters_string(cptr chars, int rad);
+extern bool_ detect_monsters_nonliving(int rad);
+extern bool_ detect_all(int rad);
extern void stair_creation(void);
-extern bool wall_stone(int y, int x);
-extern bool enchant(object_type *o_ptr, int n, int eflag);
-extern bool enchant_spell(int num_hit, int num_dam, int num_ac, int num_pval);
-extern bool ident_spell(void);
-extern bool ident_all(void);
-extern bool identify_fully(void);
-extern bool recharge(int num);
-extern bool speed_monsters(void);
-extern bool slow_monsters(void);
-extern bool sleep_monsters(void);
-extern bool conf_monsters(void);
+extern bool_ wall_stone(int y, int x);
+extern bool_ enchant(object_type *o_ptr, int n, int eflag);
+extern bool_ enchant_spell(int num_hit, int num_dam, int num_ac, int num_pval);
+extern bool_ ident_spell(void);
+extern bool_ ident_all(void);
+extern bool_ identify_fully(void);
+extern bool_ recharge(int num);
+extern bool_ speed_monsters(void);
+extern bool_ slow_monsters(void);
+extern bool_ sleep_monsters(void);
+extern bool_ conf_monsters(void);
extern void aggravate_monsters(int who);
-extern bool genocide_aux(bool player_cast, char typ);
-extern bool genocide(bool player_cast);
-extern bool mass_genocide(bool player_cast);
+extern bool_ genocide_aux(bool_ player_cast, char typ);
+extern bool_ genocide(bool_ player_cast);
+extern bool_ mass_genocide(bool_ player_cast);
extern void do_probe(int m_idx);
-extern bool probing(void);
+extern bool_ probing(void);
extern void change_wild_mode(void);
-extern bool banish_evil(int dist);
-extern bool dispel_evil(int dam);
-extern bool dispel_good(int dam);
-extern bool dispel_undead(int dam);
-extern bool dispel_monsters(int dam);
-extern bool dispel_living(int dam);
-extern bool dispel_demons(int dam);
-extern bool turn_undead(void);
+extern bool_ banish_evil(int dist);
+extern bool_ dispel_evil(int dam);
+extern bool_ dispel_good(int dam);
+extern bool_ dispel_undead(int dam);
+extern bool_ dispel_monsters(int dam);
+extern bool_ dispel_living(int dam);
+extern bool_ dispel_demons(int dam);
+extern bool_ turn_undead(void);
extern void wipe(int y1, int x1, int r);
-extern void destroy_area(int y1, int x1, int r, bool full, bool bypass);
+extern void destroy_area(int y1, int x1, int r, bool_ full, bool_ bypass);
extern void earthquake(int cy, int cx, int r);
extern void lite_room(int y1, int x1);
extern void unlite_room(int y1, int x1);
-extern bool lite_area(int dam, int rad);
-extern bool unlite_area(int dam, int rad);
-extern bool fire_ball_beam(int typ, int dir, int dam, int rad);
-extern bool fire_cloud(int typ, int dir, int dam, int rad, int time);
-extern bool fire_wave(int typ, int dir, int dam, int rad, int time, s32b eff);
-extern bool fire_wall(int typ, int dir, int dam, int time);
-extern bool fire_ball(int typ, int dir, int dam, int rad);
-extern bool fire_bolt(int typ, int dir, int dam);
-extern bool fire_beam(int typ, int dir, int dam);
-extern bool fire_druid_ball(int typ, int dir, int dam, int rad);
-extern bool fire_druid_bolt(int typ, int dir, int dam);
-extern bool fire_druid_beam(int typ, int dir, int dam);
+extern bool_ lite_area(int dam, int rad);
+extern bool_ unlite_area(int dam, int rad);
+extern bool_ fire_ball_beam(int typ, int dir, int dam, int rad);
+extern bool_ fire_cloud(int typ, int dir, int dam, int rad, int time);
+extern bool_ fire_wave(int typ, int dir, int dam, int rad, int time, s32b eff);
+extern bool_ fire_wall(int typ, int dir, int dam, int time);
+extern bool_ fire_ball(int typ, int dir, int dam, int rad);
+extern bool_ fire_bolt(int typ, int dir, int dam);
+extern bool_ fire_beam(int typ, int dir, int dam);
+extern bool_ fire_druid_ball(int typ, int dir, int dam, int rad);
+extern bool_ fire_druid_bolt(int typ, int dir, int dam);
+extern bool_ fire_druid_beam(int typ, int dir, int dam);
extern void call_chaos(void);
-extern bool fire_bolt_or_beam(int prob, int typ, int dir, int dam);
-extern bool lite_line(int dir);
-extern bool drain_life(int dir, int dam);
-extern bool death_ray(int dir, int plev);
-extern bool wall_to_mud(int dir);
-extern bool destroy_door(int dir);
-extern bool disarm_trap(int dir);
-extern bool wizard_lock(int dir);
-extern bool heal_monster(int dir);
-extern bool speed_monster(int dir);
-extern bool slow_monster(int dir);
-extern bool sleep_monster(int dir);
-extern bool stasis_monster(int dir);
-extern bool confuse_monster(int dir, int plev);
-extern bool stun_monster(int dir, int plev);
-extern bool fear_monster(int dir, int plev);
-extern bool scare_monsters(void);
-extern bool poly_monster(int dir);
-extern bool clone_monster(int dir);
-extern bool teleport_monster(int dir);
-extern bool door_creation(void);
-extern bool trap_creation(void);
-extern bool glyph_creation(void);
-extern bool destroy_doors_touch(void);
-extern bool destroy_traps_touch(void);
-extern bool sleep_monsters_touch(void);
-extern bool alchemy(void);
+extern bool_ fire_bolt_or_beam(int prob, int typ, int dir, int dam);
+extern bool_ lite_line(int dir);
+extern bool_ drain_life(int dir, int dam);
+extern bool_ death_ray(int dir, int plev);
+extern bool_ wall_to_mud(int dir);
+extern bool_ destroy_door(int dir);
+extern bool_ disarm_trap(int dir);
+extern bool_ wizard_lock(int dir);
+extern bool_ heal_monster(int dir);
+extern bool_ speed_monster(int dir);
+extern bool_ slow_monster(int dir);
+extern bool_ sleep_monster(int dir);
+extern bool_ stasis_monster(int dir);
+extern bool_ confuse_monster(int dir, int plev);
+extern bool_ stun_monster(int dir, int plev);
+extern bool_ fear_monster(int dir, int plev);
+extern bool_ scare_monsters(void);
+extern bool_ poly_monster(int dir);
+extern bool_ clone_monster(int dir);
+extern bool_ teleport_monster(int dir);
+extern bool_ door_creation(void);
+extern bool_ trap_creation(void);
+extern bool_ glyph_creation(void);
+extern bool_ destroy_doors_touch(void);
+extern bool_ destroy_traps_touch(void);
+extern bool_ sleep_monsters_touch(void);
+extern bool_ alchemy(void);
extern void activate_ty_curse(void);
extern void activate_dg_curse(void);
extern void activate_hi_summon(void);
extern void summon_cyber(void);
extern void wall_breaker(void);
extern void bless_weapon(void);
-extern bool confuse_monsters(int dam);
-extern bool charm_monsters(int dam);
-extern bool charm_animals(int dam);
-extern bool charm_demons(int dam);
-extern bool stun_monsters(int dam);
-extern bool stasis_monsters(int dam);
-extern bool banish_monsters(int dist);
-extern bool turn_monsters(int dam);
-extern bool turn_evil(int dam);
-extern bool deathray_monsters(void);
-extern bool charm_monster(int dir, int plev);
-extern bool star_charm_monster(int dir, int plev);
-extern bool control_one_undead(int dir, int plev);
-extern bool charm_animal(int dir, int plev);
-extern bool mindblast_monsters(int dam);
+extern bool_ confuse_monsters(int dam);
+extern bool_ charm_monsters(int dam);
+extern bool_ charm_animals(int dam);
+extern bool_ charm_demons(int dam);
+extern bool_ stun_monsters(int dam);
+extern bool_ stasis_monsters(int dam);
+extern bool_ banish_monsters(int dist);
+extern bool_ turn_monsters(int dam);
+extern bool_ turn_evil(int dam);
+extern bool_ deathray_monsters(void);
+extern bool_ charm_monster(int dir, int plev);
+extern bool_ star_charm_monster(int dir, int plev);
+extern bool_ control_one_undead(int dir, int plev);
+extern bool_ charm_animal(int dir, int plev);
+extern bool_ mindblast_monsters(int dam);
extern void alter_reality(void);
extern void report_magics(void);
extern void teleport_swap(int dir);
extern void swap_position(int lty, int ltx);
-extern bool item_tester_hook_recharge(object_type *o_ptr);
-extern bool fire_explosion(int y, int x, int typ, int rad, int dam);
-extern bool fire_godly_wrath(int y, int x, int typ, int dir, int dam);
-extern bool invoke(int dam, int typ);
-extern bool project_hack(int typ, int dam);
+extern bool_ item_tester_hook_recharge(object_type *o_ptr);
+extern bool_ fire_explosion(int y, int x, int typ, int rad, int dam);
+extern bool_ fire_godly_wrath(int y, int x, int typ, int dir, int dam);
+extern bool_ invoke(int dam, int typ);
+extern bool_ project_hack(int typ, int dam);
extern void project_meteor(int radius, int typ, int dam, u32b flg);
-extern bool item_tester_hook_artifactable(object_type *o_ptr);
-extern bool passwall(int dir, bool safe);
-extern bool project_hook(int typ, int dir, int dam, int flg);
-extern void random_misc (object_type * o_ptr, bool is_scroll);
-extern void random_plus(object_type * o_ptr, bool is_scroll);
-extern bool reset_recall(bool no_trepas_max_depth);
+extern bool_ item_tester_hook_artifactable(object_type *o_ptr);
+extern bool_ passwall(int dir, bool_ safe);
+extern bool_ project_hook(int typ, int dir, int dam, int flg);
+extern void random_misc (object_type * o_ptr, bool_ is_scroll);
+extern void random_plus(object_type * o_ptr, bool_ is_scroll);
+extern bool_ reset_recall(bool_ no_trepas_max_depth);
extern void remove_dg_curse(void);
/* randart.c */
extern int get_activation_power(void);
extern void build_prob(cptr learn);
-extern bool create_artifact(object_type *o_ptr, bool a_scroll, bool get_name);
-extern bool artifact_scroll(void);
+extern bool_ create_artifact(object_type *o_ptr, bool_ a_scroll, bool_ get_name);
+extern bool_ artifact_scroll(void);
/* store.c */
-extern bool is_blessed(object_type *o_ptr);
+extern bool_ is_blessed(object_type *o_ptr);
extern void do_cmd_store(void);
extern void store_shuffle(int which);
extern void store_maint(int town_num, int store_num);
@@ -1424,31 +1411,30 @@ extern void store_prt_gold(void);
extern void store_request_item(void);
/* bldg.c -KMW- */
-extern bool bldg_process_command(store_type *s_ptr, int i);
+extern bool_ bldg_process_command(store_type *s_ptr, int i);
extern void show_building(store_type *s_ptr);
-extern bool is_state(store_type *s_ptr, int state);
+extern bool_ is_state(store_type *s_ptr, int state);
extern void do_cmd_bldg(void);
-extern bool show_god_info(bool ext);
+extern bool_ show_god_info(bool_ ext);
extern void enter_quest(void);
extern void select_bounties(void);
/* util.c */
extern void scansubdir(cptr dir);
extern s32b rescale(s32b x, s32b max, s32b new_max);
-extern bool input_box(cptr text, int y, int x, char *buf, int max);
+extern bool_ input_box(cptr text, int y, int x, char *buf, int max);
extern void draw_box(int y, int x, int h, int w);
extern void display_list(int y, int x, int h, int w, cptr title, cptr *list, int max, int begin, int sel, byte sel_color);
extern s32b value_scale(int value, int vmax, int max, int min);
extern int ask_menu(cptr ask, char **items, int max);
extern cptr get_player_race_name(int pr, int ps);
-extern cptr get_month_name(int month, bool full, bool compact);
+extern cptr get_month_name(int month, bool_ full, bool_ compact);
extern cptr get_day(int day);
extern s32b bst(s32b what, s32b t);
extern errr path_parse(char *buf, int max, cptr file);
extern errr path_temp(char *buf, int max);
extern errr path_build(char *buf, int max, cptr path, cptr file);
extern FILE *my_fopen(cptr file, cptr mode);
-extern errr my_str_fgets(cptr full_text, char *buf, huge n);
extern errr my_fgets(FILE *fff, char *buf, huge n);
extern errr my_fputs(FILE *fff, cptr buf, huge n);
extern errr my_fclose(FILE *fff);
@@ -1459,7 +1445,6 @@ extern int fd_make(cptr file, int mode);
extern int fd_open(cptr file, int flags);
extern errr fd_lock(int fd, int what);
extern errr fd_seek(int fd, huge n);
-extern errr fd_chop(int fd, huge n);
extern errr fd_read(int fd, char *buf, huge n);
extern errr fd_write(int fd, cptr buf, huge n);
extern errr fd_close(int fd);
@@ -1497,17 +1482,17 @@ extern void text_out(cptr str);
extern void text_out_c(byte a, cptr str);
extern void clear_screen(void);
extern void clear_from(int row);
-extern bool askfor_aux_complete;
-extern bool askfor_aux(char *buf, int len);
-extern bool get_string(cptr prompt, char *buf, int len);
-extern bool get_check(cptr prompt);
-extern bool get_com(cptr prompt, char *command);
+extern bool_ askfor_aux_complete;
+extern bool_ askfor_aux(char *buf, int len);
+extern bool_ get_string(cptr prompt, char *buf, int len);
+extern bool_ get_check(cptr prompt);
+extern bool_ get_com(cptr prompt, char *command);
extern s32b get_quantity(cptr prompt, s32b max);
extern void pause_line(int row);
extern char request_command_ignore_keymaps[];
-extern bool request_command_inven_mode;
+extern bool_ request_command_inven_mode;
extern void request_command(int shopping);
-extern bool is_a_vowel(int ch);
+extern bool_ is_a_vowel(int ch);
extern int get_keymap_dir(char ch);
extern byte count_bits(u32b array);
extern void strlower(char *buf);
@@ -1517,19 +1502,17 @@ extern int test_item_name(cptr name);
extern char msg_box(cptr text, int y, int x);
extern timer_type *new_timer(cptr callback, s32b delay);
extern void del_timer(timer_type *t_ptr);
+extern int get_keymap_mode();
/* main.c */
-#ifdef PRIVATE_USER_PATH
-extern bool private_check_user_directory(cptr dirpath);
-#endif
+extern bool_ private_check_user_directory(cptr dirpath);
/* xtra1.c */
-extern void fix_irc_message(void);
extern void fix_message(void);
extern void apply_flags(u32b f1, u32b f2, u32b f3, u32b f4, u32b f5, u32b esp, s16b pval, s16b tval, s16b to_h, s16b to_d, s16b to_a);
extern int luck(int min, int max);
extern int weight_limit(void);
-extern bool calc_powers_silent;
+extern bool_ calc_powers_silent;
extern void cnv_stat(int i, char *out_val);
extern s16b modify_stat_value(int value, int amount);
extern void calc_hitpoints(void);
@@ -1538,10 +1521,10 @@ extern void update_stuff(void);
extern void redraw_stuff(void);
extern void window_stuff(void);
extern void handle_stuff(void);
-extern bool monk_empty_hands(void);
-extern bool monk_heavy_armor(void);
-extern bool beastmaster_whip(void);
-extern void calc_bonuses(bool silent);
+extern bool_ monk_empty_hands(void);
+extern bool_ monk_heavy_armor(void);
+extern bool_ beastmaster_whip(void);
+extern void calc_bonuses(bool_ silent);
extern void calc_sanity(void);
extern void gain_fate(byte fate);
extern void fate_desc(char *desc, int fate);
@@ -1552,131 +1535,131 @@ extern int resolve_mimic_name(cptr name);
extern void do_rebirth(void);
extern cptr get_subrace_title(int racem);
extern void set_subrace_title(int racem, cptr name);
-extern void switch_subrace(int racem, bool copy_old);
+extern void switch_subrace(int racem, bool_ copy_old);
extern void switch_class(int sclass);
extern void switch_subclass(int sclass);
extern void drop_from_wild(void);
extern void clean_wish_name(char *buf, char *name);
-extern bool test_object_wish(char *name, object_type *o_ptr, object_type *forge, char *what);
-extern bool set_roots(int v, s16b ac, s16b dam);
-extern bool set_project(int v, s16b gf, s16b dam, s16b rad, s16b flag);
-extern bool set_rush(int v);
-extern bool set_parasite(int v, int r);
-extern bool set_disrupt_shield(int v);
-extern bool set_prob_travel(int v);
-extern bool set_absorb_soul(int v);
-extern bool set_tim_breath(int v, bool magical);
-extern bool set_tim_deadly(int v);
-extern bool set_tim_res_time(int v);
-extern bool set_tim_reflect(int v);
-extern bool set_tim_thunder(int v, int p1, int p2);
-extern bool set_meditation(int v);
-extern bool set_strike(int v);
-extern bool set_walk_water(int v);
-extern bool set_tim_regen(int v, int p);
-extern bool set_tim_ffall(int v);
-extern bool set_tim_fly(int v);
-extern bool set_poison(int v);
-extern bool set_tim_fire_aura(int v);
-extern bool set_holy(int v);
+extern bool_ test_object_wish(char *name, object_type *o_ptr, object_type *forge, char *what);
+extern bool_ set_roots(int v, s16b ac, s16b dam);
+extern bool_ set_project(int v, s16b gf, s16b dam, s16b rad, s16b flag);
+extern bool_ set_rush(int v);
+extern bool_ set_parasite(int v, int r);
+extern bool_ set_disrupt_shield(int v);
+extern bool_ set_prob_travel(int v);
+extern bool_ set_absorb_soul(int v);
+extern bool_ set_tim_breath(int v, bool_ magical);
+extern bool_ set_tim_deadly(int v);
+extern bool_ set_tim_res_time(int v);
+extern bool_ set_tim_reflect(int v);
+extern bool_ set_tim_thunder(int v, int p1, int p2);
+extern bool_ set_meditation(int v);
+extern bool_ set_strike(int v);
+extern bool_ set_walk_water(int v);
+extern bool_ set_tim_regen(int v, int p);
+extern bool_ set_tim_ffall(int v);
+extern bool_ set_tim_fly(int v);
+extern bool_ set_poison(int v);
+extern bool_ set_tim_fire_aura(int v);
+extern bool_ set_holy(int v);
extern void set_grace(s32b v);
-extern bool set_mimic(int v, int p, int level);
-extern bool set_no_breeders(int v);
-extern bool set_invis(int v,int p);
-extern bool set_lite(int v);
-extern bool set_blind(int v);
-extern bool set_confused(int v);
-extern bool set_poisoned(int v);
-extern bool set_afraid(int v);
-extern bool set_paralyzed(int v);
-extern bool set_image(int v);
-extern bool set_fast(int v, int p);
-extern bool set_light_speed(int v);
-extern bool set_slow(int v);
-extern bool set_shield(int v, int p, s16b o, s16b d1, s16b d2);
-extern bool set_blessed(int v);
-extern bool set_hero(int v);
-extern bool set_shero(int v);
-extern bool set_protevil(int v);
-extern bool set_protgood(int v);
-extern bool set_protundead(int v);
-extern bool set_invuln(int v);
-extern bool set_tim_invis(int v);
-extern bool set_tim_infra(int v);
-extern bool set_mental_barrier(int v);
-extern bool set_oppose_acid(int v);
-extern bool set_oppose_elec(int v);
-extern bool set_oppose_fire(int v);
-extern bool set_oppose_cold(int v);
-extern bool set_oppose_pois(int v);
-extern bool set_oppose_ld(int v);
-extern bool set_oppose_cc(int v);
-extern bool set_oppose_ss(int v);
-extern bool set_oppose_nex(int v);
-extern bool set_stun(int v);
-extern bool set_cut(int v);
-extern bool set_food(int v);
+extern bool_ set_mimic(int v, int p, int level);
+extern bool_ set_no_breeders(int v);
+extern bool_ set_invis(int v,int p);
+extern bool_ set_lite(int v);
+extern bool_ set_blind(int v);
+extern bool_ set_confused(int v);
+extern bool_ set_poisoned(int v);
+extern bool_ set_afraid(int v);
+extern bool_ set_paralyzed(int v);
+extern bool_ set_image(int v);
+extern bool_ set_fast(int v, int p);
+extern bool_ set_light_speed(int v);
+extern bool_ set_slow(int v);
+extern bool_ set_shield(int v, int p, s16b o, s16b d1, s16b d2);
+extern bool_ set_blessed(int v);
+extern bool_ set_hero(int v);
+extern bool_ set_shero(int v);
+extern bool_ set_protevil(int v);
+extern bool_ set_protgood(int v);
+extern bool_ set_protundead(int v);
+extern bool_ set_invuln(int v);
+extern bool_ set_tim_invis(int v);
+extern bool_ set_tim_infra(int v);
+extern bool_ set_mental_barrier(int v);
+extern bool_ set_oppose_acid(int v);
+extern bool_ set_oppose_elec(int v);
+extern bool_ set_oppose_fire(int v);
+extern bool_ set_oppose_cold(int v);
+extern bool_ set_oppose_pois(int v);
+extern bool_ set_oppose_ld(int v);
+extern bool_ set_oppose_cc(int v);
+extern bool_ set_oppose_ss(int v);
+extern bool_ set_oppose_nex(int v);
+extern bool_ set_stun(int v);
+extern bool_ set_cut(int v);
+extern bool_ set_food(int v);
extern void check_experience(void);
extern void check_experience_obj(object_type *o_ptr);
extern void gain_exp(s32b amount);
extern void lose_exp(s32b amount);
extern int get_coin_type(monster_race *r_ptr);
extern void monster_death(int m_idx);
-extern bool mon_take_hit(int m_idx, int dam, bool *fear, cptr note);
-extern bool change_panel(int dy, int dx);
+extern bool_ mon_take_hit(int m_idx, int dam, bool_ *fear, cptr note);
+extern bool_ change_panel(int dy, int dx);
extern void verify_panel(void);
extern void resize_map(void);
extern void resize_window(void);
extern cptr look_mon_desc(int m_idx);
extern void ang_sort_aux(vptr u, vptr v, int p, int q);
extern void ang_sort(vptr u, vptr v, int n);
-extern bool target_able(int m_idx);
-extern bool target_okay(void);
-extern bool target_set(int mode);
-extern bool get_aim_dir(int *dp);
-extern bool get_hack_dir(int *dp);
-extern bool get_rep_dir(int *dp);
+extern bool_ target_able(int m_idx);
+extern bool_ target_okay(void);
+extern bool_ target_set(int mode);
+extern bool_ get_aim_dir(int *dp);
+extern bool_ get_hack_dir(int *dp);
+extern bool_ get_rep_dir(int *dp);
extern int get_chaos_patron(void);
extern void gain_level_reward(int chosen_reward);
-extern bool set_shadow(int v);
-extern bool set_tim_esp(int v);
-extern bool tgp_pt(int *x, int * y);
-extern bool tgt_pt (int *x, int *y);
-extern bool gain_random_corruption(int choose_mut);
-extern bool got_corruptions(void);
-extern void dump_corruptions(FILE *OutFile, bool color);
+extern bool_ set_shadow(int v);
+extern bool_ set_tim_esp(int v);
+extern bool_ tgp_pt(int *x, int * y);
+extern bool_ tgt_pt (int *x, int *y);
+extern bool_ gain_random_corruption(int choose_mut);
+extern bool_ got_corruptions(void);
+extern void dump_corruptions(FILE *OutFile, bool_ color);
extern void do_poly_self(void);
extern void do_poly_wounds(void);
-extern bool curse_weapon(void);
-extern bool curse_armor(void);
-extern void random_resistance(object_type * q_ptr, bool is_scroll, int specific);
-extern bool lose_corruption(int choose_mut);
-extern bool lose_all_corruptions(void);
+extern bool_ curse_weapon(void);
+extern bool_ curse_armor(void);
+extern void random_resistance(object_type * q_ptr, bool_ is_scroll, int specific);
+extern bool_ lose_corruption(int choose_mut);
+extern bool_ lose_all_corruptions(void);
extern void great_side_effect(void);
extern void nasty_side_effect(void);
-extern void deadly_side_effect(bool god);
+extern void deadly_side_effect(bool_ god);
extern void godly_wrath_blast(void);
extern int interpret_grace(void);
extern int interpret_favor(void);
extern void make_wish(void);
-extern bool set_sliding(s16b v);
+extern bool_ set_sliding(s16b v);
extern void create_between_gate(int dist, int y, int x);
/* levels.c */
-extern bool get_dungeon_generator(char *buf);
-extern bool get_level_desc(char *buf);
+extern bool_ get_dungeon_generator(char *buf);
+extern bool_ get_level_desc(char *buf);
extern void get_level_flags(void);
-extern bool get_dungeon_name(char *buf);
-extern bool get_dungeon_special(char *buf);
-extern bool get_command(const char *file, char comm, char *param);
+extern bool_ get_dungeon_name(char *buf);
+extern bool_ get_dungeon_special(char *buf);
+extern bool_ get_command(const char *file, char comm, char *param);
extern int get_branch(void);
extern int get_fbranch(void);
extern int get_flevel(void);
-extern bool get_dungeon_save(char *buf);
+extern bool_ get_dungeon_save(char *buf);
/* wizard2.c */
extern void do_cmd_wiz_cure_all(void);
-extern void do_cmd_wiz_named_friendly(int r_idx, bool slp);
+extern void do_cmd_wiz_named_friendly(int r_idx, bool_ slp);
extern tval_desc2 tvals[];
/* notes.c */
@@ -1689,8 +1672,8 @@ extern void add_note_type(int note_number);
extern void squeltch_inventory(void);
extern void squeltch_grid(void);
extern void do_cmd_automatizer(void);
-extern void automatizer_add_rule(object_type *o_ptr, bool destroy);
-extern bool automatizer_create;
+extern void automatizer_add_rule(object_type *o_ptr, bool_ destroy);
+extern bool_ automatizer_create;
@@ -1718,15 +1701,6 @@ extern int stricmp(cptr a, cptr b);
extern int usleep(huge usecs);
#endif
-#ifdef SUPPORT_GAMMA
-/* util.c */
-extern void build_gamma_table(int gamma);
-extern byte gamma_table[256];
-
-/* variable.c */
-extern u16b gamma_val;
-#endif
-
#ifdef MACINTOSH
/* main-mac.c */
/* extern void main(void); */
@@ -1746,50 +1720,27 @@ extern u32b _ftype;
#if !defined(WINDOWS) && !defined(MACINTOSH)
/* files.c */
-extern bool chg_to_txt(cptr base, cptr newname);
+extern bool_ chg_to_txt(cptr base, cptr newname);
#endif /* !WINDOWS && !MACINTOSH */
-#ifdef ALLOW_REPEAT /* TNB */
-
/* util.c */
extern void repeat_push(int what);
-extern bool repeat_pull(int *what);
+extern bool_ repeat_pull(int *what);
extern void repeat_check(void);
extern void get_count(int number, int max);
-#endif /* ALLOW_REPEAT -- TNB */
-
-#ifdef ALLOW_EASY_OPEN /* TNB */
-
/* variable.c */
-extern bool easy_open;
-extern bool easy_tunnel;
+extern bool_ easy_open;
+extern bool_ easy_tunnel;
+extern bool_ easy_disarm;
/* cmd2.c */
-extern bool easy_open_door(int y, int x);
-
-#endif /* ALLOW_EASY_OPEN -- TNB */
-
-#ifdef ALLOW_EASY_DISARM /* TNB */
-
-/* variable.c */
-extern bool easy_disarm;
+extern bool_ easy_open_door(int y, int x);
/* cmd2.c */
-extern bool do_cmd_disarm_aux(int y, int x, int dir, int do_pickup);
-
-#endif /* ALLOW_EASY_DISARM -- TNB */
-
-extern bool easy_floor;
-
+extern bool_ do_cmd_disarm_aux(int y, int x, int dir, int do_pickup);
-extern void irc_poll(void);
-extern void irc_connect(void);
-extern void irc_emote(char *buf);
-extern void irc_chat(void);
-extern void irc_disconnect(void);
-extern void irc_disconnect_aux(char *str, bool message);
-extern void irc_quit(char *str);
+extern bool_ easy_floor;
/* script.c */
@@ -1797,24 +1748,22 @@ extern void init_lua(void);
extern void init_lua_init(void);
extern int exec_lua(char *file);
extern cptr string_exec_lua(char *file);
-extern bool tome_dofile(char *file);
-extern bool tome_dofile_anywhere(cptr dir, char *file, bool test_exist);
+extern bool_ tome_dofile(char *file);
+extern bool_ tome_dofile_anywhere(cptr dir, char *file, bool_ test_exist);
extern void dump_lua_stack(int min, int max);
-extern bool call_lua(cptr function, cptr args, cptr ret, ...);
-extern bool get_lua_var(cptr name, char type, void *arg);
+extern bool_ call_lua(cptr function, cptr args, cptr ret, ...);
+extern bool_ get_lua_var(cptr name, char type, void *arg);
/* modules.c */
extern void module_reset_dir(cptr dir, cptr new_path);
extern cptr force_module;
-extern bool select_module(void);
+extern bool_ select_module(void);
/* lua_bind.c */
extern magic_power *grab_magic_power(magic_power *m_ptr, int num);
-extern bool get_magic_power(int *sn, magic_power *powers, int max_powers, void (*power_info)(char *p, int power), int plev, int cast_stat);
-extern magic_power *new_magic_power(int num);
-extern bool get_magic_power_lua(int *sn, magic_power *powers, int max_powers, char *info_fct, int plev, int cast_stat);
-extern bool lua_spell_success(magic_power *spell, int stat, char *oups_fct);
+extern bool_ get_magic_power(int *sn, magic_power *powers, int max_powers, void (*power_info)(char *p, int power), int plev, int cast_stat);
+extern bool_ lua_spell_success(magic_power *spell, int stat, char *oups_fct);
extern object_type *new_object(void);
extern void end_object(object_type *o_ptr);
@@ -1824,8 +1773,8 @@ extern char *lua_object_desc(object_type *o_ptr, int pref, int mode);
extern s16b add_new_power(cptr name, cptr desc, cptr gain, cptr lose, byte level, byte cost, byte stat, byte diff);
extern void find_position(int y, int x, int *yy, int *xx);
-extern bool summon_lua_okay(int r_idx);
-extern bool lua_summon_monster(int y, int x, int lev, bool ffriend, char *fct);
+extern bool_ summon_lua_okay(int r_idx);
+extern bool_ lua_summon_monster(int y, int x, int lev, bool_ ffriend, char *fct);
extern s16b add_new_quest(char *name);
extern void desc_quest(int q_idx, int d, char *desc);
@@ -1833,7 +1782,7 @@ extern void desc_quest(int q_idx, int d, char *desc);
extern s16b add_new_gods(char *name);
extern void desc_god(int g_idx, int d, char *desc);
-extern bool get_com_lua(cptr promtp, int *com);
+extern bool_ get_com_lua(cptr promtp, int *com);
extern s16b new_school(int i, cptr name, s16b skill);
extern s16b new_spell(int i, cptr name);
@@ -1847,9 +1796,9 @@ extern cave_type *lua_get_cave(int y, int x);
extern void set_target(int y, int x);
extern void get_target(int dir, int *y, int *x);
-extern void get_map_size(bool full_text, char *name, int *ysize, int *xsize);
-extern void load_map(bool full_text, char *name, int *y, int *x);
-extern bool alloc_room(int by0, int bx0, int ysize, int xsize, int *y1, int *x1, int *y2, int *x2);
+extern void get_map_size(char *name, int *ysize, int *xsize);
+extern void load_map(char *name, int *y, int *x);
+extern bool_ alloc_room(int by0, int bx0, int ysize, int xsize, int *y1, int *x1, int *y2, int *x2);
extern void lua_print_hook(cptr str);
@@ -1863,12 +1812,11 @@ extern void lua_delete_list(list_type *, int size);
extern void lua_add_to_list(list_type *, int idx, cptr str);
extern void lua_display_list(int y, int x, int h, int w, cptr title, list_type *list, int max, int begin, int sel, byte sel_color);
-extern void lua_make_temp_file(void);
-extern void lua_close_temp_file(void);
-extern void lua_end_temp_file(void);
-extern cptr lua_get_temp_name(void);
+extern cptr compass(int y, int x, int y2, int x2);
+extern cptr approximate_distance(int y, int x, int y2, int x2);
-extern void add_scripted_generator(cptr name, bool stairs, bool monsters, bool objects, bool miscs);
+extern bool_ drop_text_left(byte c, cptr s, int y, int o);
+extern bool_ drop_text_right(byte c, cptr s, int y, int o);
/* skills.c */
extern void dump_skills(FILE *fff);
@@ -1882,9 +1830,8 @@ extern s16b melee_skills[MAX_MELEE];
extern char *melee_names[MAX_MELEE];
extern s16b get_melee_skills(void);
extern s16b get_melee_skill(void);
-extern bool forbid_gloves(void);
-extern bool forbid_non_blessed(void);
-extern int validate_autoskiller(s32b *ideal);
+extern bool_ forbid_gloves(void);
+extern bool_ forbid_non_blessed(void);
extern void compute_skills(s32b *v, s32b *m, int i);
extern void select_default_melee(void);
extern void do_get_new_skill(void);
@@ -1892,13 +1839,13 @@ extern void init_skill(s32b value, s32b mod, int i);
extern s16b find_ability(cptr name);
extern void dump_abilities(FILE *fff);
extern void do_cmd_ability(void);
-extern bool has_ability(int ab);
+extern bool_ has_ability(int ab);
extern void apply_level_abilities(int level);
-extern void recalc_skills(bool init);
+extern void recalc_skills(bool_ init);
/* gods.c */
extern void inc_piety(int god, s32b amt);
extern void abandon_god(int god);
extern int wisdom_scale(int max);
extern int find_god(cptr name);
-extern void follow_god(int god, bool silent);
+extern void follow_god(int god, bool_ silent);
diff --git a/src/files.c b/src/files.c
index 95237b16..56e57975 100644
--- a/src/files.c
+++ b/src/files.c
@@ -13,103 +13,6 @@
#include "angband.h"
-static bool setuid_grabbed = TRUE;
-
-
-/*
- * You may or may not want to use the following "#undef".
- */
-/* #undef _POSIX_SAVED_IDS */
-
-
-/*
- * Hack -- drop permissions
- */
-void safe_setuid_drop(void)
-{
- if (setuid_grabbed)
- {
- setuid_grabbed = FALSE;
-#ifdef SET_UID
-
-# ifdef SAFE_SETUID
-
-# ifdef SAFE_SETUID_POSIX
-
- if (setuid(getuid()) != 0)
- {
- quit("setuid(): cannot set permissions correctly!");
- }
- if (setgid(getgid()) != 0)
- {
- quit("setgid(): cannot set permissions correctly!");
- }
-
-# else
-
- if (setreuid(geteuid(), getuid()) != 0)
- {
- quit("setreuid(): cannot set permissions correctly!");
- }
- if (setregid(getegid(), getgid()) != 0)
- {
- quit("setregid(): cannot set permissions correctly!");
- }
-
-# endif
-
-# endif
-
-#endif
- }
-
-}
-
-
-/*
- * Hack -- grab permissions
- */
-void safe_setuid_grab(void)
-{
- if (!setuid_grabbed)
- {
- setuid_grabbed = TRUE;
-#ifdef SET_UID
-
-# ifdef SAFE_SETUID
-
-# ifdef SAFE_SETUID_POSIX
-
- if (setuid(player_euid) != 0)
- {
- quit("setuid(): cannot set permissions correctly!");
- }
- if (setgid(player_egid) != 0)
- {
- quit("setgid(): cannot set permissions correctly!");
- }
-
-# else
-
- if (setreuid(geteuid(), getuid()) != 0)
- {
- quit("setreuid(): cannot set permissions correctly!");
- }
- if (setregid(getegid(), getgid()) != 0)
- {
- quit("setregid(): cannot set permissions correctly!");
- }
-
-# endif /* SAFE_SETUID_POSIX */
-
-# endif /* SAFE_SETUID */
-
-#endif /* SET_UID */
- }
-
-}
-
-
/*
* Extract the first few "tokens" from a buffer
*
@@ -1005,7 +908,7 @@ errr process_pref_file(cptr name)
errr err = 0;
- bool bypass = FALSE;
+ bool_ bypass = FALSE;
/* Build the filename -- Allow users to override system pref files */
path_build(buf, 1024, ANGBAND_DIR_USER, name);
@@ -1019,15 +922,9 @@ errr process_pref_file(cptr name)
/* Build the pathname, this time using the system pref directory */
path_build(buf, 1024, ANGBAND_DIR_PREF, name);
- /* Grab permission */
- safe_setuid_grab();
-
/* Open the file */
fp = my_fopen(buf, "r");
- /* Drop permission */
- safe_setuid_drop();
-
/* Failed again */
if (!fp) return ( -1);
}
@@ -1111,263 +1008,6 @@ errr process_pref_file(cptr name)
-
-
-
-#ifdef CHECK_TIME
-
-/*
- * Operating hours for ANGBAND (defaults to non-work hours)
- */
-static char days[7][29] =
- {
- "SUN:XXXXXXXXXXXXXXXXXXXXXXXX",
- "MON:XXXXXXXX.........XXXXXXX",
- "TUE:XXXXXXXX.........XXXXXXX",
- "WED:XXXXXXXX.........XXXXXXX",
- "THU:XXXXXXXX.........XXXXXXX",
- "FRI:XXXXXXXX.........XXXXXXX",
- "SAT:XXXXXXXXXXXXXXXXXXXXXXXX"
- };
-
-/*
- * Restict usage (defaults to no restrictions)
- */
-static bool check_time_flag = FALSE;
-
-#endif
-
-
-/*
- * Handle CHECK_TIME
- */
-errr check_time(void)
-{
-
-#ifdef CHECK_TIME
-
- time_t c;
-
- struct tm *tp;
-
-
- /* No restrictions */
- if (!check_time_flag) return (0);
-
- /* Check for time violation */
- c = time((time_t *)0);
- tp = localtime(&c);
-
- /* Violation */
- if (days[tp->tm_wday][tp->tm_hour + 4] != 'X') return (1);
-
-#endif
-
- /* Success */
- return (0);
-}
-
-
-
-/*
- * !Ran under the game's permission!
- *
- * Initialize CHECK_TIME
- */
-errr check_time_init(void)
-{
-
-#ifdef CHECK_TIME
-
- FILE *fp;
-
- char buf[1024];
-
-
- /* Build the filename */
- path_build(buf, 1024, ANGBAND_DIR_FILE, "time.txt");
-
- /*
- * XXX No need to grab permission here because this function is called
- * only once before the game drops "game" permission
- */
-
- /* Open the file */
- fp = my_fopen(buf, "r");
-
- /* No file, no restrictions */
- if (!fp) return (0);
-
- /* Assume restrictions */
- check_time_flag = TRUE;
-
- /* Parse the file */
- while (0 == my_fgets(fp, buf, 80))
- {
- /* Skip comments and blank lines */
- if (!buf[0] || (buf[0] == '#')) continue;
-
- /* Chop the buffer */
- buf[29] = '\0';
-
- /* Extract the info */
- if (prefix(buf, "SUN:")) strcpy(days[0], buf);
- if (prefix(buf, "MON:")) strcpy(days[1], buf);
- if (prefix(buf, "TUE:")) strcpy(days[2], buf);
- if (prefix(buf, "WED:")) strcpy(days[3], buf);
- if (prefix(buf, "THU:")) strcpy(days[4], buf);
- if (prefix(buf, "FRI:")) strcpy(days[5], buf);
- if (prefix(buf, "SAT:")) strcpy(days[6], buf);
- }
-
- /* Close it */
- my_fclose(fp);
-
-#endif
-
- /* Success */
- return (0);
-}
-
-
-
-#ifdef CHECK_LOAD
-
-#ifndef MAXHOSTNAMELEN
-# define MAXHOSTNAMELEN 64
-#endif
-
-typedef struct statstime statstime;
-
-struct statstime
-{
- int cp_time[4];
- int dk_xfer[4];
- unsigned int v_pgpgin;
- unsigned int v_pgpgout;
- unsigned int v_pswpin;
- unsigned int v_pswpout;
- unsigned int v_intr;
- int if_ipackets;
- int if_ierrors;
- int if_opackets;
- int if_oerrors;
- int if_collisions;
- unsigned int v_swtch;
- long avenrun[3];
- struct timeval boottime;
- struct timeval curtime;
-};
-
-/*
- * Maximal load (if any).
- */
-static int check_load_value = 0;
-
-#endif
-
-
-/*
- * Handle CHECK_LOAD
- */
-errr check_load(void)
-{
-
-#ifdef CHECK_LOAD
-
- struct statstime st;
-
-
- /* Success if not checking */
- if (!check_load_value) return (0);
-
- /* Check the load */
- if (0 == rstat("localhost", &st))
- {
- long val1 = (long)(st.avenrun[2]);
- long val2 = (long)(check_load_value) * FSCALE;
-
- /* Check for violation */
- if (val1 >= val2) return (1);
- }
-
-#endif
-
- /* Success */
- return (0);
-}
-
-
-/*
- * !Ran under the game's permission!
- *
- * Initialize CHECK_LOAD
- */
-errr check_load_init(void)
-{
-
-#ifdef CHECK_LOAD
-
- FILE *fp;
-
- char buf[1024];
-
- char temphost[MAXHOSTNAMELEN + 1];
- char thishost[MAXHOSTNAMELEN + 1];
-
-
- /* Build the filename */
- path_build(buf, 1024, ANGBAND_DIR_FILE, "load.txt");
-
- /*
- * XXX No need to grab permission here because this function is called
- * only once before the game drops "game" permission
- */
-
- /* Open the "load" file */
- fp = my_fopen(buf, "r");
-
- /* No file, no restrictions */
- if (!fp) return (0);
-
- /* Default load */
- check_load_value = 100;
-
- /* Get the host name */
- (void)gethostname(thishost, (sizeof thishost) - 1);
-
- /* Parse it */
- while (0 == my_fgets(fp, buf, 1024))
- {
- int value;
-
- /* Skip comments and blank lines */
- if (!buf[0] || (buf[0] == '#')) continue;
-
- /* Parse, or ignore */
- if (sscanf(buf, "%s%d", temphost, &value) != 2) continue;
-
- /* Skip other hosts */
- if (!streq(temphost, thishost) &&
- !streq(temphost, "localhost")) continue;
-
- /* Use that value */
- check_load_value = value;
-
- /* Done */
- break;
- }
-
- /* Close the file */
- my_fclose(fp);
-
-#endif
-
- /* Success */
- return (0);
-}
-
-
/*
* Print long number with header at given row, column
* Use the color for the number, not the header
@@ -1986,250 +1626,6 @@ void player_flags(u32b *f1, u32b *f2, u32b *f3, u32b *f4, u32b *f5, u32b *esp)
(*esp) |= rmp_ptr->oesp[i];
}
}
-#if 0 /* DGDGDG? */
- else if (p_ptr->mimic_form)
- {
- switch (p_ptr->mimic_form)
- {
- case MIMIC_GOAT:
- {
- (*f3) |= (TR3_SLOW_DIGEST);
- break;
- }
- case MIMIC_INSECT:
- {
- (*esp) |= (ESP_ANIMAL);
- break;
- }
- case MIMIC_SPARROW:
- {
- (*f3) |= (TR3_FEATHER);
- break;
- }
- case MIMIC_VAMPIRE:
- {
- (*f3) |= (TR2_HOLD_LIFE);
- (*f3) |= (TR2_RES_DARK);
- (*f3) |= (TR2_RES_NEXUS);
- (*f3) |= (TR2_RES_BLIND);
- (*f3) |= (TR3_LITE1);
- break;
- }
- case MIMIC_SPIDER:
- {
- (*f3) |= (TR2_RES_FEAR);
- (*f3) |= (TR2_RES_POIS);
- break;
- }
- case MIMIC_MANA_BALL:
- {
- (*f3) |= (TR3_FEATHER);
- (*f2) |= (TR2_INVIS);
- (*f3) |= (TR3_TELEPORT);
- (*f3) |= (TR2_RES_DISEN);
- break;
- }
- case MIMIC_FIRE_CLOUD:
- {
- (*f3) |= (TR2_RES_LITE);
- (*f3) |= (TR2_IM_FIRE);
- (*f3) |= (TR3_SH_FIRE);
- break;
- }
- case MIMIC_COLD_CLOUD:
- {
- (*f3) |= (TR2_RES_LITE);
- (*f3) |= (TR2_IM_COLD);
- (*f3) |= (TR3_SH_ELEC);
- (*esp) |= (ESP_EVIL);
- (*f3) |= (TR3_REGEN);
- break;
- }
- case MIMIC_CHAOS_CLOUD:
- {
- (*f3) |= (TR2_RES_DISEN);
- (*f3) |= (TR2_RES_CHAOS);
- (*f3) |= (TR2_RES_LITE);
- (*f3) |= (TR2_IM_FIRE);
- (*f3) |= (TR2_IM_COLD);
- (*f3) |= (TR3_SH_FIRE);
- (*f3) |= (TR3_SH_ELEC);
- break;
- }
- case MIMIC_GOST:
- {
- (*f3) |= (TR3_WRAITH);
- (*f2) |= TR2_HOLD_LIFE;
- break;
- }
- case MIMIC_ENT:
- {
- (*f2) |= TR2_SENS_FIRE;
- break;
- }
- case MIMIC_KOBOLD:
- {
- (*f2) |= TR2_RES_POIS;
- break;
- }
- case MIMIC_DRAGON:
- {
- (*f3) |= TR3_FEATHER;
- (*f2) |= TR2_RES_FIRE;
- (*f2) |= TR2_RES_COLD;
- (*f2) |= TR2_RES_ELEC;
- (*f2) |= TR2_RES_DARK;
- break;
- }
- case MIMIC_DEMON:
- {
- (*f2) |= TR2_RES_CHAOS;
- (*f2) |= TR2_RES_NETHER;
- (*f2) |= TR2_HOLD_LIFE;
- break;
- }
- case MIMIC_HOUND:
- {
- (*f1) |= TR1_SPEED;
- (*f2) |= TR2_RES_LITE;
- (*f2) |= TR2_RES_DARK;
- break;
- }
- case MIMIC_QUYLTHULG:
- {
- (*f3) |= TR3_SEE_INVIS;
- break;
- }
- case MIMIC_MAIAR:
- {
- (*f2) |= TR2_IM_ACID;
- (*f2) |= TR2_IM_ELEC;
- (*f2) |= TR2_IM_FIRE;
- (*f2) |= TR2_IM_COLD;
- (*f2) |= TR2_RES_POIS;
- (*f2) |= TR2_RES_LITE;
- (*f2) |= TR2_RES_DARK;
- (*f2) |= TR2_RES_CHAOS;
- (*f2) |= TR2_HOLD_LIFE;
- (*f3) |= TR3_FEATHER;
- (*f3) |= TR3_REGEN;
- break;
- }
- case MIMIC_SERPENT:
- {
- (*f1) |= TR1_SPEED;
- break;
- }
- case MIMIC_GIANT:
- {
- (*f2) |= TR2_RES_ACID;
- (*f2) |= TR2_RES_ELEC;
- (*f2) |= TR2_RES_FIRE;
- (*f2) |= TR2_RES_COLD;
- (*f2) |= TR2_RES_POIS;
- (*f2) |= TR2_RES_CONF;
- (*f2) |= TR2_RES_SOUND;
- (*f2) |= TR2_RES_LITE;
- (*f2) |= TR2_RES_DARK;
- (*f2) |= TR2_RES_NEXUS;
- (*f2) |= TR2_RES_FEAR;
- (*f2) |= TR2_REFLECT;
- break;
- }
- case MIMIC_VALAR:
- {
- (*f3) |= TR3_SEE_INVIS;
- (*f2) |= TR2_FREE_ACT;
- (*f3) |= TR3_SLOW_DIGEST;
- (*f3) |= TR3_REGEN;
- (*f3) |= TR3_FEATHER;
- (*f2) |= TR2_HOLD_LIFE;
- (*esp) |= ESP_ALL;
- (*f3) |= TR3_LITE1;
- (*f2) |= TR2_SUST_STR;
- (*f1) |= TR1_INT;
- (*f1) |= TR1_WIS;
- (*f1) |= TR1_DEX;
- (*f1) |= TR1_CON;
- (*f1) |= TR1_CHR;
- (*f2) |= TR2_RES_ACID;
- (*f2) |= TR2_RES_ELEC;
- (*f2) |= TR2_RES_FIRE;
- (*f2) |= TR2_RES_COLD;
- (*f2) |= TR2_RES_POIS;
- (*f2) |= TR2_RES_CONF;
- (*f2) |= TR2_RES_SOUND;
- (*f2) |= TR2_RES_LITE;
- (*f2) |= TR2_RES_DARK;
- (*f2) |= TR2_RES_CHAOS;
- (*f2) |= TR2_RES_DISEN;
- (*f2) |= TR2_RES_SHARDS;
- (*f2) |= TR2_RES_NEXUS;
- (*f2) |= TR2_RES_BLIND;
- (*f2) |= TR2_RES_NETHER;
- (*f2) |= TR2_RES_FEAR;
- (*f2) |= TR2_REFLECT;
- (*f3) |= TR3_SH_FIRE;
- (*f3) |= TR3_SH_ELEC;
- (*f2) |= TR2_IM_FIRE;
- (*f2) |= TR2_IM_COLD;
- (*f2) |= TR2_IM_ELEC;
- (*f2) |= TR2_IM_ACID;
- break;
- }
-
- case MIMIC_WEREWOLF:
- {
- (*f3) |= TR3_REGEN;
- (*f3) |= TR3_AGGRAVATE;
- break;
- }
- case MIMIC_BALROG:
- {
- (*f2) |= TR2_IM_ACID;
- (*f2) |= TR2_IM_ELEC;
- (*f2) |= TR2_IM_FIRE;
- (*f2) |= TR2_RES_POIS;
- (*f2) |= TR2_RES_DARK;
- (*f2) |= TR2_RES_CHAOS;
- (*f2) |= TR2_HOLD_LIFE;
- (*f3) |= TR3_FEATHER;
- (*f3) |= TR3_REGEN;
- break;
- }
- case MIMIC_DEMON_LORD:
- {
- (*f3) |= TR3_SEE_INVIS;
- (*f2) |= TR2_FREE_ACT;
- (*f3) |= TR3_REGEN;
- (*f3) |= TR3_FEATHER;
- (*f2) |= TR2_HOLD_LIFE;
- (*esp) |= ESP_EVIL | ESP_GOOD | ESP_DEMON;
- (*f2) |= TR2_RES_ACID;
- (*f2) |= TR2_RES_ELEC;
- (*f2) |= TR2_RES_FIRE;
- (*f2) |= TR2_RES_POIS;
- (*f2) |= TR2_RES_CONF;
- (*f2) |= TR2_RES_SOUND;
- (*f2) |= TR2_RES_LITE;
- (*f2) |= TR2_RES_DARK;
- (*f2) |= TR2_RES_CHAOS;
- (*f2) |= TR2_RES_DISEN;
- (*f2) |= TR2_RES_SHARDS;
- (*f2) |= TR2_RES_NEXUS;
- (*f2) |= TR2_RES_BLIND;
- (*f2) |= TR2_RES_NETHER;
- (*f2) |= TR2_RES_FEAR;
- (*f2) |= TR2_REFLECT;
- (*f3) |= TR3_SH_FIRE;
- (*f2) |= TR2_IM_FIRE;
- (*f2) |= TR2_IM_ELEC;
- (*f2) |= TR2_IM_ACID;
- break;
- }
- }
- }
-#endif
else
{
monster_race *r_ptr = &r_info[p_ptr->body_monster];
@@ -2462,7 +1858,7 @@ static void display_player_ben_one(int mode)
int d[INVEN_TOTAL - INVEN_WIELD + 1];
- bool got;
+ bool_ got;
byte a;
@@ -2582,7 +1978,7 @@ static void display_player_ben_one(int mode)
for (n = 0; n < INVEN_TOTAL - INVEN_WIELD + 1; n++)
{
/* Change colour every two columns */
- bool is_green = (dispx & 0x02);
+ bool_ is_green = (dispx & 0x02);
a = (is_green ? TERM_GREEN : TERM_SLATE);
c = '.';
@@ -2925,7 +2321,7 @@ cptr describe_player_location()
*
* Figure out if a row on the grid is empty
*/
-static bool file_character_print_grid_check_row(const char *buf)
+static bool_ file_character_print_grid_check_row(const char *buf)
{
if (strstr(buf + 12, "+")) return TRUE;
if (strstr(buf + 12, "*")) return TRUE;
@@ -2946,7 +2342,7 @@ static bool file_character_print_grid_check_row(const char *buf)
*
* Prints the big ugly grid
*/
-static void file_character_print_grid(FILE *fff, bool show_gaps, bool show_legend)
+static void file_character_print_grid(FILE *fff, bool_ show_gaps, bool_ show_legend)
{
static cptr blank_line = " ";
static char buf[1024];
@@ -2988,7 +2384,7 @@ static void file_character_print_grid(FILE *fff, bool show_gaps, bool show_legen
*
* Outputs one item (for Inventory, Equipment, Home, and Mathom-house)
*/
-void file_character_print_item(FILE *fff, char label, object_type *obj, bool full)
+void file_character_print_item(FILE *fff, char label, object_type *obj, bool_ full)
{
static char o_name[80];
static cptr paren = ")";
@@ -3007,7 +2403,7 @@ void file_character_print_item(FILE *fff, char label, object_type *obj, bool ful
*
* Prints out one "store" (for Home and Mathom-house)
*/
-void file_character_print_store(FILE *fff, wilderness_type_info *place, int store, bool full)
+void file_character_print_store(FILE *fff, wilderness_type_info *place, int store, bool_ full)
{
int i;
town_type *town = &town_info[place->entrance];
@@ -3038,7 +2434,7 @@ void file_character_print_store(FILE *fff, wilderness_type_info *place, int stor
*
* Beware of the ugly pointer gymnastics.
*/
-bool file_character_check_stores(store_type ***store_list, int *store_list_count, wilderness_type_info *place, int store)
+bool_ file_character_check_stores(store_type ***store_list, int *store_list_count, wilderness_type_info *place, int store)
{
town_type *town = &town_info[place->entrance];
store_type *st_ptr = &town->store[store];
@@ -3078,7 +2474,7 @@ bool file_character_check_stores(store_type ***store_list, int *store_list_count
* XXX XXX XXX Allow the "full" flag to dump additional info,
* and trigger its usage from various places in the code.
*/
-errr file_character(cptr name, bool full)
+errr file_character(cptr name, bool_ full)
{
int i, j, x, y;
byte a;
@@ -3267,7 +2663,7 @@ errr file_character(cptr name, bool full)
if (r_ptr->flags1 & (RF1_UNIQUE))
{
- bool dead = (r_ptr->max_num == 0);
+ bool_ dead = (r_ptr->max_num == 0);
if (dead)
{
Total++;
@@ -3350,6 +2746,9 @@ errr file_character(cptr name, bool full)
dump_skills(fff);
dump_abilities(fff);
+ /* Dump companions. */
+ dump_companions(fff);
+
if (p_ptr->companion_killed)
{
if (p_ptr->companion_killed == 1)
@@ -3471,7 +2870,7 @@ struct hyperlink
typedef struct hyperlink hyperlink_type;
-bool show_file(cptr name, cptr what, int line, int mode)
+bool_ show_file(cptr name, cptr what, int line, int mode)
{
int i, k, x;
@@ -3490,7 +2889,7 @@ bool show_file(cptr name, cptr what, int line, int mode)
byte color = TERM_WHITE;
/* This screen has sub-screens */
- bool menu = FALSE;
+ bool_ menu = FALSE;
/* Current help file */
FILE *fff = NULL;
@@ -3530,14 +2929,8 @@ bool show_file(cptr name, cptr what, int line, int mode)
/* Access the "file" */
strcpy(h_ptr->path, name);
- /* Grab permission */
- safe_setuid_grab();
-
/* Open */
fff = my_fopen(h_ptr->path, "r");
-
- /* Drop permission */
- safe_setuid_drop();
}
/* Look in "help" */
@@ -3549,14 +2942,8 @@ bool show_file(cptr name, cptr what, int line, int mode)
/* Build the filename */
path_build(h_ptr->path, 1024, ANGBAND_DIR_HELP, name);
- /* Grab permission */
- safe_setuid_grab();
-
/* Open the file */
fff = my_fopen(h_ptr->path, "r");
-
- /* Drop permission */
- safe_setuid_drop();
}
/* Look in "info" */
@@ -3568,14 +2955,8 @@ bool show_file(cptr name, cptr what, int line, int mode)
/* Build the filename */
path_build(h_ptr->path, 1024, ANGBAND_DIR_INFO, name);
- /* Grab permission */
- safe_setuid_grab();
-
/* Open the file */
fff = my_fopen(h_ptr->path, "r");
-
- /* Drop permission */
- safe_setuid_drop();
}
/* Look in "file" */
@@ -3587,14 +2968,8 @@ bool show_file(cptr name, cptr what, int line, int mode)
/* Build the filename */
path_build(h_ptr->path, 1024, ANGBAND_DIR_FILE, name);
- /* Grab permission */
- safe_setuid_grab();
-
/* Open the file */
fff = my_fopen(h_ptr->path, "r");
-
- /* Drop permission */
- safe_setuid_drop();
}
/* Oops */
@@ -3728,16 +3103,9 @@ bool show_file(cptr name, cptr what, int line, int mode)
/* Close it */
my_fclose(fff);
- /* Grab permission */
- safe_setuid_grab();
-
/* Hack -- Re-Open the file */
fff = my_fopen(h_ptr->path, "r");
- /* Drop permission */
- safe_setuid_drop();
-
-
/* Oops */
if (!fff)
{
@@ -4094,16 +3462,13 @@ bool show_file(cptr name, cptr what, int line, int mode)
return (TRUE);
}
-bool txt_to_html(cptr head, cptr foot, cptr base, cptr ext, bool force, bool recur)
+bool_ txt_to_html(cptr head, cptr foot, cptr base, cptr ext, bool_ force, bool_ recur)
{
int i, x;
/* Number of "real" lines passed by */
int next = 0;
- /* Number of "real" lines in the file */
- int size = 0;
-
char buf_name[80];
/* Color of the next line */
@@ -4155,15 +3520,9 @@ bool txt_to_html(cptr head, cptr foot, cptr base, cptr ext, bool force, bool rec
/* Build the filename */
path_build(h_ptr->path, 1024, ANGBAND_DIR_HELP, buf_name);
- /* Grab permission */
- safe_setuid_grab();
-
/* Open the file */
htm = my_fopen(h_ptr->path, "w");
- /* Drop permission */
- safe_setuid_drop();
-
sprintf(buf_name, "%s.%s", base, ext);
/* h_ptr->caption */
@@ -4172,15 +3531,9 @@ bool txt_to_html(cptr head, cptr foot, cptr base, cptr ext, bool force, bool rec
/* Build the filename */
path_build(h_ptr->path, 1024, ANGBAND_DIR_HELP, buf_name);
- /* Grab permission */
- safe_setuid_grab();
-
/* Open the file */
fff = my_fopen(h_ptr->path, "r");
- /* Drop permission */
- safe_setuid_drop();
-
/* Oops */
if (!fff || !htm)
{
@@ -4194,21 +3547,12 @@ bool txt_to_html(cptr head, cptr foot, cptr base, cptr ext, bool force, bool rec
return (TRUE);
}
- /* Save the number of "real" lines */
- size = next;
-
/* Build the filename */
path_build(h_ptr->path, 1024, ANGBAND_DIR_HELP, head);
- /* Grab permission */
- safe_setuid_grab();
-
/* Open the file */
aux = my_fopen(h_ptr->path, "r");
- /* Drop permission */
- safe_setuid_drop();
-
/* Copy the header */
if (aux)
{
@@ -4235,7 +3579,7 @@ bool txt_to_html(cptr head, cptr foot, cptr base, cptr ext, bool force, bool rec
/* Display the file */
while (TRUE)
{
- bool do_color = FALSE;
+ bool_ do_color = FALSE;
/* Skip a line */
if (my_fgets(fff, h_ptr->rbuf, 1024)) break;
@@ -4421,15 +3765,9 @@ bool txt_to_html(cptr head, cptr foot, cptr base, cptr ext, bool force, bool rec
/* Build the filename */
path_build(h_ptr->path, 1024, ANGBAND_DIR_HELP, foot);
- /* Grab permission */
- safe_setuid_grab();
-
/* Open the file */
aux = my_fopen(h_ptr->path, "r");
- /* Drop permission */
- safe_setuid_drop();
-
/* Copy the footer */
if (aux)
{
@@ -4594,149 +3932,6 @@ void html_screenshot(cptr name)
my_fclose(htm);
}
-/*
- * Because this is dead code and hardly anyone but DG needs it.
- * IMHO this should never been included in the game code -- pelpel
- */
-#if !defined(WINDOWS) && !defined(MACINTOSH)
-
-#define KEY_NUM 9
-static int keys_tab[KEY_NUM] =
-{
- 'I', 'G', 'M', 'O', 'P', 'm', 'D', 'B', 'V',
-};
-
-static cptr keys_desc[KEY_NUM] =
-{
- "Interface changes:",
- "Gameplay changes:",
- "Monster changes:",
- "Object changes:",
- "Player changes:",
- "Misc changes:",
- "Dungeon changes:",
- "Bug fixes:",
- "Version:",
-};
-
-static int get_key(char c)
-{
- int i;
-
- i = 0;
- while (keys_tab[i] != c)
- i++;
- return ((i > KEY_NUM) ? KEY_NUM : i);
-}
-
-/*
- * Some ports don't like huge stacks
- */
-typedef char chg_type[500][100];
-
-bool chg_to_txt(cptr base, cptr newname)
-{
- int i, j, key = 0;
-
- char buf[1024];
-
- int lens[KEY_NUM] = {0, 0, 0, 0, 0, 0, 0, 0};
- chg_type *strs;
-
- /* Current chg file */
- FILE *fff = NULL;
-
- /* Current txt file */
- FILE *txt = NULL;
-
- /* Open the file */
- fff = my_fopen(base, "r");
-
- /* Oops */
- if (!fff)
- {
- my_fclose(fff);
- my_fclose(txt);
-
- /* Oops */
- return (TRUE);
- }
-
- /* Count the file */
- while (TRUE)
- {
- /* Skip a line */
- if (my_fgets(fff, buf, 1024)) break;
-
- if ((!(*buf)) ||
- ((buf[0] >= '0') && (buf[0] <= '9')) || (buf[0] == '#')) continue;
-
- if (buf[1] != ' ')
- lens[get_key(buf[1])]++;
- }
-
- /* Open the file */
- txt = my_fopen(newname, "w");
-
- /* Open the file */
- fff = my_fopen(base, "r");
-
- /* Oops */
- if (!fff || !txt)
- {
- my_fclose(fff);
- my_fclose(txt);
-
- /* Oops */
- return (TRUE);
- }
-
- for (i = 0; i < KEY_NUM; i++) lens[i] = 0;
-
- /* Allocate big amount of temporary storage */
- C_MAKE(strs, KEY_NUM, chg_type);
-
- /* Display the file */
- while (TRUE)
- {
- /* Skip a line */
- if (my_fgets(fff, buf, 1024)) break;
-
- if ((!(*buf)) ||
- ((buf[0] >= '0') && (buf[0] <= '9')) || (buf[0] == '#')) continue;
-
- if (buf[1] != ' ') key = get_key(buf[1]);
-
- if (key == KEY_NUM - 1)
- strcpy(strs[key][lens[key]++], buf + 5);
- else
- strcpy(strs[key][lens[key]++], buf + 3);
- }
-
- fprintf(txt, "%s changes\n", strs[KEY_NUM - 1][0]);
-
- for (i = 0; i < KEY_NUM - 1; i++)
- {
- if (lens[i]) fprintf(txt, "\n%s\n", keys_desc[i]);
-
- for (j = 0; j < lens[i]; j++)
- {
- fprintf(txt, "%s\n", strs[i][j]);
- }
- }
-
- /* Close the file */
- my_fclose(txt);
- my_fclose(fff);
-
- /* Free temporary memory */
- C_FREE(strs, KEY_NUM, chg_type);
-
- /* Normal return */
- return (TRUE);
-}
-
-#endif /* !WINDOWS && !MACINTOSH */
/*
* Peruse the On-Line-Help
@@ -4765,19 +3960,14 @@ void process_player_base()
{
char temp[128];
-#if defined(SAVEFILE_USE_UID) && !defined(PRIVATE_USER_PATH)
- /* Rename the savefile, using the player_uid and player_base */
- (void)sprintf(temp, "%d.%s", player_uid, player_base);
-#else
/* Rename the savefile, using the player_base */
(void)sprintf(temp, "%s", player_base);
-#endif
/* Build the filename */
path_build(savefile, 1024, ANGBAND_DIR_SAVE, temp);
}
-void process_player_name(bool sf)
+void process_player_name(bool_ sf)
{
int i, k = 0;
char tmp[50];
@@ -4966,7 +4156,7 @@ void do_cmd_suicide(void)
* when the game is loaded again
* Alternatively forget_view() and update_view() can be used
*/
-void remove_cave_view(bool remove)
+void remove_cave_view(bool_ remove)
{
int i;
cave_type *c_ptr;
@@ -4995,8 +4185,6 @@ void remove_cave_view(bool remove)
*/
void do_cmd_save_game(void)
{
- panic_save = 0; /* Fixes an apparently long-lived bug */
-
remove_cave_view(TRUE);
/* Save the current level if in a persistent level */
@@ -5051,22 +4239,25 @@ void do_cmd_save_game(void)
(void)strcpy(died_from, "(alive and well)");
}
-
+/*
+ * Auto-save depending on whether the auto save flag is set.
+ */
+void autosave_checkpoint()
+{
+ if (autosave_l)
+ {
+ is_autosave = TRUE;
+ msg_print("Autosaving the game...");
+ do_cmd_save_game();
+ is_autosave = FALSE;
+ }
+}
/*
* Hack -- Calculates the total number of points earned -JWT-
*/
long total_points(void)
{
-#if 0 /* Old calculation */
- s16b max_dl = 0, i;
-
- for (i = 0; i < max_d_idx; i++)
- if (max_dlv[i] > max_dl)
- max_dl = max_dlv[i];
-
- return (p_ptr->max_exp + (100 * max_dl));
-#else /* New calculation */
s16b max_dl = 0, i, k;
long temp, Total = 0;
long mult = 20; /* was 100. Divided values by 5 because of an overflow error */
@@ -5143,7 +4334,7 @@ long total_points(void)
if (r_ptr->flags1 & (RF1_UNIQUE))
{
- bool dead = (r_ptr->max_num == 0);
+ bool_ dead = (r_ptr->max_num == 0);
if (dead)
{
@@ -5170,7 +4361,6 @@ long total_points(void)
return (temp);
-#endif
}
@@ -5196,7 +4386,7 @@ static void center_string(char *buf, cptr str)
/*
* Redefinable "print_tombstone" action
*/
-bool (*tombstone_aux)(void) = NULL;
+bool_ (*tombstone_aux)(void) = NULL;
/*
@@ -5204,7 +4394,7 @@ bool (*tombstone_aux)(void) = NULL;
*/
static void print_tomb(void)
{
- bool done = FALSE;
+ bool_ done = FALSE;
/* Do we use a special tombstone ? */
if (tombstone_aux)
@@ -5234,15 +4424,9 @@ static void print_tomb(void)
/* Build the filename */
path_build(buf, 1024, ANGBAND_DIR_FILE, "dead.txt");
- /* Grab permission */
- safe_setuid_grab();
-
/* Open the News file */
fp = my_fopen(buf, "r");
- /* Drop permission */
- safe_setuid_drop();
-
/* Dump */
if (fp)
{
@@ -5426,7 +4610,7 @@ static void show_info(void)
{
Term_clear();
item_tester_full = TRUE;
- show_equip(FALSE);
+ show_equip();
prt("You are using: -more-", 0, 0);
if (inkey() == ESCAPE) return;
}
@@ -5436,7 +4620,7 @@ static void show_info(void)
{
Term_clear();
item_tester_full = TRUE;
- show_inven(FALSE);
+ show_inven();
prt("You are carrying: -more-", 0, 0);
if (inkey() == ESCAPE) return;
}
@@ -5446,11 +4630,6 @@ static void show_info(void)
{
st_ptr = &town_info[k].store[7];
-#if 0 /* TODO -- actualy somewhere set the real variable */
- /* Step to the real towns */
- if (!(town_info[k].flags & (TOWN_REAL))) continue;
-#endif
-
/* Home -- if anything there */
if (st_ptr->stock_num)
{
@@ -5609,7 +4788,7 @@ static int highscore_where(high_score *score)
static int highscore_add(high_score *score)
{
int i, slot;
- bool done = FALSE;
+ bool_ done = FALSE;
high_score the_score, tmpscore;
@@ -5830,15 +5009,9 @@ void display_scores(int from, int to)
/* Build the filename */
path_build(buf, 1024, ANGBAND_DIR_APEX, "scores.raw");
- /* Grab permission */
- safe_setuid_grab();
-
/* Open the binary high score file, for reading */
highscore_fd = fd_open(buf, O_RDONLY);
- /* Drop permission */
- safe_setuid_drop();
-
/* Paranoia -- No score file */
if (highscore_fd < 0) quit("Score file unavailable.");
@@ -5867,7 +5040,7 @@ void show_highclass(int building)
{
register int i = 0, j, m = 0;
- int pcs, pr, ps, pc, clev, al;
+ int pr, pc, clev, al;
high_score the_score;
char buf[1024], out_val[256];
@@ -5908,14 +5081,9 @@ void show_highclass(int building)
/* Build the filename */
path_build(buf, 1024, ANGBAND_DIR_APEX, "scores.raw");
- /* Grab permission */
- safe_setuid_grab();
-
+ /* Open file */
highscore_fd = fd_open(buf, O_RDONLY);
- /* Drop permission */
- safe_setuid_drop();
-
if (highscore_fd < 0)
{
msg_print("Score file unavailable.");
@@ -5937,9 +5105,7 @@ void show_highclass(int building)
if (highscore_seek(j)) break;
if (highscore_read(&the_score)) break;
pr = atoi(the_score.p_r);
- ps = atoi(the_score.p_s);
pc = atoi(the_score.p_c);
- pcs = atoi(the_score.p_cs);
clev = atoi(the_score.cur_lev);
al = atoi(the_score.arena_number);
if (((pc == (building - 10)) && (building != 1) && (building != 2)) ||
@@ -5993,7 +5159,7 @@ void show_highclass(int building)
void race_score(int race_num)
{
register int i = 0, j, m = 0;
- int pr, ps, pc, clev, pcs, al, lastlev;
+ int pr, clev, lastlev;
high_score the_score;
char buf[1024], out_val[256], tmp_str[80];
@@ -6006,15 +5172,9 @@ void race_score(int race_num)
/* Build the filename */
path_build(buf, 1024, ANGBAND_DIR_APEX, "scores.raw");
- /* Grab permission */
- safe_setuid_grab();
-
/* Open the highscore file */
highscore_fd = fd_open(buf, O_RDONLY);
- /* Drop permission */
- safe_setuid_drop();
-
if (highscore_fd < 0)
{
msg_print("Score file unavailable.");
@@ -6037,11 +5197,7 @@ void race_score(int race_num)
if (highscore_seek(j)) break;
if (highscore_read(&the_score)) break;
pr = atoi(the_score.p_r);
- ps = atoi(the_score.p_s);
- pc = atoi(the_score.p_c);
- pcs = atoi(the_score.p_cs);
clev = atoi(the_score.cur_lev);
- al = atoi(the_score.arena_number);
if (pr == race_num)
{
sprintf(out_val, "%3d) %s the %s (Level %3d)",
@@ -6098,7 +5254,7 @@ static errr top_twenty(void)
{
int j;
- high_score the_score, *tmp;
+ high_score the_score;
time_t ct = time((time_t*)0);
@@ -6167,7 +5323,7 @@ static errr top_twenty(void)
/* Clear the record */
- tmp = WIPE(&the_score, high_score);
+ WIPE(&the_score, high_score);
/* Save the version */
sprintf(the_score.what, "%ld.%ld.%ld",
@@ -6412,14 +5568,8 @@ void wipe_saved()
sprintf(tmp, "%s.%s", player_base, buf);
path_build(name, 1024, ANGBAND_DIR_SAVE, tmp);
- /* Grab permission */
- safe_setuid_grab();
-
/* Remove the dungeon save file */
fd_kill(name);
-
- /* Drop permission */
- safe_setuid_drop();
}
}
}
@@ -6459,15 +5609,9 @@ void close_game(void)
/* Build the filename */
path_build(buf, 1024, ANGBAND_DIR_APEX, "scores.raw");
- /* Grab permission */
- safe_setuid_grab();
-
/* Open the high score file, for reading/writing */
highscore_fd = fd_open(buf, O_RDWR);
- /* Drop permission */
- safe_setuid_drop();
-
/* Handle death */
if (death)
{
@@ -6480,16 +5624,8 @@ void close_game(void)
add_note_type(NOTE_WINNER);
}
- irc_disconnect_aux(format("Retired; %s rules",
- get_version_string()), FALSE);
kingly();
}
- else
- {
- irc_disconnect_aux(format("Killed by %s; %s rules",
- died_from, get_version_string()),
- FALSE);
- }
/* Wipe the saved levels */
wipe_saved();
@@ -6540,10 +5676,6 @@ void close_game(void)
add_note_type(NOTE_SAVE_GAME);
}
- irc_disconnect_aux(format("Alive... for the time being; %s rules",
- get_version_string()),
- FALSE);
-
/* Prompt for scores XXX XXX XXX */
prt("Press Return (or Escape).", 0, 40);
@@ -6564,49 +5696,6 @@ void close_game(void)
/*
- * Handle abrupt death of the visual system
- *
- * This routine is called only in very rare situations, and only
- * by certain visual systems, when they experience fatal errors.
- *
- * XXX XXX Hack -- clear the death flag when creating a HANGUP
- * save file so that player can see tombstone when restart.
- */
-void exit_game_panic(void)
-{
- /* If nothing important has happened, just quit */
- if (!character_generated || character_saved) quit("panic");
-
- /* Mega-Hack -- see "msg_print()" */
- msg_flag = FALSE;
-
- /* Clear the top line */
- prt("", 0, 0);
-
- /* Hack -- turn off some things */
- disturb(1, 0);
-
- /* Mega-Hack -- Delay death */
- if (p_ptr->chp < 0) death = FALSE;
-
- /* Hardcode panic save */
- panic_save = 1;
-
- /* Forbid suspend */
- signals_ignore_tstp();
-
- /* Indicate panic save */
- (void)strcpy(died_from, "(panic save)");
-
- /* Panic save, or get worried */
- if (!save_player()) quit("panic save failed!");
-
- /* Successful panic save */
- quit("panic save succeeded!");
-}
-
-
-/*
* Grab a randomly selected line in lib/file/file_name
*/
errr get_rnd_line(char *file_name, char *output)
@@ -6631,15 +5720,9 @@ errr get_rnd_line(char *file_name, char *output)
/* Build the filename */
path_build(buf, 1024, ANGBAND_DIR_FILE, file_name);
- /* Grab permission */
- safe_setuid_grab();
-
/* Open the file */
fp = my_fopen(buf, "r");
- /* Drop permission */
- safe_setuid_drop();
-
/* Failed */
if (!fp) return ( -1);
@@ -6705,15 +5788,9 @@ char *get_line(char* fname, cptr fdir, char *linbuf, int line)
/* Build the filename */
path_build(buf, 1024, fdir, fname);
- /* Grab permission */
- safe_setuid_grab();
-
/* Open the file */
fp = my_fopen(buf, "r");
- /* Drop permission */
- safe_setuid_drop();
-
/* Failed */
if (!fp) return (NULL);
@@ -6768,15 +5845,9 @@ errr get_xtra_line(char *file_name, monster_type *m_ptr, char *output)
/* Build the filename */
path_build(buf, 1024, ANGBAND_DIR_FILE, file_name);
- /* Grab permission */
- safe_setuid_grab();
-
/* Open the file */
fp = my_fopen(buf, "r");
- /* Drop permission */
- safe_setuid_drop();
-
/* Failed */
if (!fp) return ( -1);
@@ -6920,154 +5991,6 @@ static void handle_signal_suspend(int sig)
/*
- * Handle signals -- simple (interrupt and quit)
- *
- * This function was causing a *huge* number of problems, so it has
- * been simplified greatly. We keep a global variable which counts
- * the number of times the user attempts to kill the process, and
- * we commit suicide if the user does this a certain number of times.
- *
- * We attempt to give "feedback" to the user as he approaches the
- * suicide thresh-hold, but without penalizing accidental keypresses.
- *
- * To prevent messy accidents, we should reset this global variable
- * whenever the user enters a keypress, or something like that.
- */
-static void handle_signal_simple(int sig)
-{
- /* Disable handler */
- (void)signal(sig, SIG_IGN);
-
-
- /* Nothing to save, just quit */
- if (!character_generated || character_saved) quit(NULL);
-
-
- /* Count the signals */
- signal_count++;
-
-
- /* Terminate dead characters */
- if (death)
- {
- /* Mark the savefile */
- (void)strcpy(died_from, "Abortion");
-
- /* Close stuff */
- close_game();
-
- /* Quit */
- quit("interrupt");
- }
-
- /* Allow suicide (after 5) */
- else if (signal_count >= 5)
- {
- /* Cause of "death" */
- (void)strcpy(died_from, "Interrupting");
-
- /* Stop playing */
- alive = FALSE;
-
- /* Suicide */
- death = TRUE;
-
- /* Leaving */
- p_ptr->leaving = TRUE;
-
- /* Close stuff */
- close_game();
-
- /* Quit */
- quit("interrupt");
- }
-
- /* Give warning (after 4) */
- else if (signal_count >= 4)
- {
- /* Make a noise */
- Term_xtra(TERM_XTRA_NOISE, 0);
-
- /* Clear the top line */
- Term_erase(0, 0, 255);
-
- /* Display the cause */
- Term_putstr(0, 0, -1, TERM_WHITE, "Contemplating suicide!");
-
- /* Flush */
- Term_fresh();
- }
-
- /* Give warning (after 2) */
- else if (signal_count >= 2)
- {
- /* Make a noise */
- Term_xtra(TERM_XTRA_NOISE, 0);
- }
-
- /* Restore handler */
- (void)signal(sig, handle_signal_simple);
-}
-
-
-/*
- * Handle signal -- abort, kill, etc
- */
-static void handle_signal_abort(int sig)
-{
- /* Disable handler */
- (void)signal(sig, SIG_IGN);
-
-
- /* Nothing to save, just quit */
- if (!character_generated || character_saved) quit(NULL);
-
-
- /* Clear the bottom line */
- Term_erase(0, 23, 255);
-
- /* Give a warning */
- Term_putstr(0, 23, -1, TERM_RED,
- "A gruesome software bug LEAPS out at you!");
-
- /* Message */
- Term_putstr(45, 23, -1, TERM_RED, "Panic save...");
-
- /* Flush output */
- Term_fresh();
-
- /* Panic Save */
- panic_save = 1;
-
- /* Panic save */
- (void)strcpy(died_from, "(panic save)");
-
- /* Forbid suspend */
- signals_ignore_tstp();
-
- /* Attempt to save */
- if (save_player())
- {
- Term_putstr(45, 23, -1, TERM_RED, "Panic save succeeded!");
- }
-
- /* Save failed */
- else
- {
- Term_putstr(45, 23, -1, TERM_RED, "Panic save failed!");
- }
-
- /* Flush output */
- Term_fresh();
-
- /* Quit */
- quit(format("software bug %d %d", p_ptr->px, p_ptr->py));
-}
-
-
-
-
-/*
* Ignore SIGTSTP signals (keyboard suspend)
*/
void signals_ignore_tstp(void)
@@ -7107,72 +6030,6 @@ void signals_init(void)
(void)signal(SIGTSTP, handle_signal_suspend);
#endif
-
-#ifdef SIGINT
- (void)signal(SIGINT, handle_signal_simple);
-#endif
-
-#ifdef SIGQUIT
- (void)signal(SIGQUIT, handle_signal_simple);
-#endif
-
-
-#ifdef SIGFPE
- (void)signal(SIGFPE, handle_signal_abort);
-#endif
-
-#ifdef SIGILL
- (void)signal(SIGILL, handle_signal_abort);
-#endif
-
-#ifdef SIGTRAP
- (void)signal(SIGTRAP, handle_signal_abort);
-#endif
-
-#ifdef SIGIOT
- (void)signal(SIGIOT, handle_signal_abort);
-#endif
-
-#ifdef SIGKILL
- (void)signal(SIGKILL, handle_signal_abort);
-#endif
-
-#ifdef SIGBUS
- (void)signal(SIGBUS, handle_signal_abort);
-#endif
-
-#ifdef SIGSEGV
- (void)signal(SIGSEGV, handle_signal_abort);
-#endif
-
-#ifdef SIGTERM
- (void)signal(SIGTERM, handle_signal_abort);
-#endif
-
-#ifdef SIGPIPE
- (void)signal(SIGPIPE, handle_signal_abort);
-#endif
-
-#ifdef SIGEMT
- (void)signal(SIGEMT, handle_signal_abort);
-#endif
-
-#ifdef SIGDANGER
- (void)signal(SIGDANGER, handle_signal_abort);
-#endif
-
-#ifdef SIGSYS
- (void)signal(SIGSYS, handle_signal_abort);
-#endif
-
-#ifdef SIGXCPU
- (void)signal(SIGXCPU, handle_signal_abort);
-#endif
-
-#ifdef SIGPWR
- (void)signal(SIGPWR, handle_signal_abort);
-#endif
-
}
diff --git a/src/gen_evol.c b/src/gen_evol.c
index 8779f22f..bfdfbd68 100644
--- a/src/gen_evol.c
+++ b/src/gen_evol.c
@@ -16,7 +16,7 @@
/*
* Generate a game of life level :) and make it evolve
*/
-void evolve_level(bool noise)
+void evolve_level(bool_ noise)
{
int i, j;
@@ -130,13 +130,10 @@ void evolve_level(bool noise)
}
-bool level_generate_life(cptr name)
+bool_ level_generate_life()
{
int i, j;
- /* unused */
- name = name;
-
for (i = 1; i < cur_wid - 1; i++)
{
for (j = 1; j < cur_hgt - 1; j++)
diff --git a/src/gen_maze.c b/src/gen_maze.c
index 03941f01..92cb482f 100644
--- a/src/gen_maze.c
+++ b/src/gen_maze.c
@@ -139,7 +139,7 @@ void dig(maze_row *maze, int y, int x, int d)
}
-bool level_generate_maze(cptr name)
+bool_ level_generate_maze()
{
int i, j, d;
int y, dy = 0;
@@ -147,9 +147,6 @@ bool level_generate_maze(cptr name)
int m_1 = 0, m_2 = 0;
maze_row *maze;
- /* unused */
- name = name;
-
/* Allocate temporary memory */
C_MAKE(maze, (MAX_HGT / 2) + 2, maze_row);
diff --git a/src/generate.c b/src/generate.c
index ca9f58b0..6d83c321 100644
--- a/src/generate.c
+++ b/src/generate.c
@@ -259,10 +259,10 @@ struct dun_data
int col_rooms;
/* Array of which blocks are used */
- bool room_map[MAX_ROOMS_ROW][MAX_ROOMS_COL];
+ bool_ room_map[MAX_ROOMS_ROW][MAX_ROOMS_COL];
/* Hack -- there is a pit/nest on this level */
- bool crowded;
+ bool_ crowded;
};
/*
@@ -273,12 +273,12 @@ typedef struct level_generator_type level_generator_type;
struct level_generator_type
{
cptr name;
- bool (*generator)(cptr);
+ bool_ (*generator)(cptr);
- bool default_stairs;
- bool default_monsters;
- bool default_objects;
- bool default_miscs;
+ bool_ default_stairs;
+ bool_ default_monsters;
+ bool_ default_objects;
+ bool_ default_miscs;
struct level_generator_type *next;
};
@@ -288,7 +288,7 @@ static level_generator_type *level_generators = NULL;
/*
* Add a new generator
*/
-void add_level_generator(cptr name, bool (*generator)(cptr name), bool stairs, bool monsters, bool objects, bool miscs)
+void add_level_generator(cptr name, bool_ (*generator)(), bool_ stairs, bool_ monsters, bool_ objects, bool_ miscs)
{
level_generator_type *g;
@@ -440,7 +440,7 @@ static void place_down_stairs(int y, int x)
* Helper function for place_new_way. Determine if y, x is one of
* floor features of the current dungeon
*/
-static bool is_safe_floor(int y, int x)
+static bool_ is_safe_floor(int y, int x)
{
dungeon_info_type *d_ptr = &d_info[dungeon_type];
byte feat = cave[y][x].feat;
@@ -464,7 +464,7 @@ void place_new_way(int *y, int *x)
int x0, x1, x2;
int y0, y1, y2;
cave_type *c_ptr;
- bool ok;
+ bool_ ok;
int i, way_n;
byte way_x[MAX_WID], way_y[MAX_WID];
@@ -709,7 +709,7 @@ void place_new_way(int *y, int *x)
/*
* Returns random co-ordinates for player/monster/object
*/
-bool new_player_spot(int branch)
+bool_ new_player_spot(int branch)
{
int y, x;
int max_attempts = 5000;
@@ -1133,7 +1133,7 @@ static void alloc_object(int set, int typ, int num)
/* Pick a "legal" spot */
while (dummy < SAFE_MAX_ATTEMPTS)
{
- bool room;
+ bool_ room;
dummy++;
@@ -1721,7 +1721,7 @@ static void destroy_level(void)
/*
* Function that sees if a square is a floor (Includes range checking)
*/
-static bool get_is_floor(int x, int y)
+static bool_ get_is_floor(int x, int y)
{
/* Out of bounds */
if (!in_bounds(y, x)) return (FALSE);
@@ -1739,7 +1739,7 @@ static bool get_is_floor(int x, int y)
static void check_room_boundary(int x1, int y1, int x2, int y2)
{
int count, x, y;
- bool old_is_floor, new_is_floor;
+ bool_ old_is_floor, new_is_floor;
/* Avoid doing this in irrelevant places -- pelpel */
if (!(dungeon_flags1 & DF1_CAVERN)) return;
@@ -1943,7 +1943,7 @@ static void vault_monsters(int y1, int x1, int num)
int d = 1;
/* Pick a nearby location */
- scatter(&y, &x, y1, x1, d, 0);
+ scatter(&y, &x, y1, x1, d);
/* Require "empty" floor grids */
if (!cave_empty_bold(y, x)) continue;
@@ -1966,7 +1966,7 @@ static void vault_monsters(int y1, int x1, int num)
* cx, cy are the returned center of the allocated room in coordinates for
* cave.feat and cave.info etc.
*/
-bool room_alloc(int width, int height, bool crowded, int by0, int bx0, int *cx, int *cy)
+bool_ room_alloc(int width, int height, bool_ crowded, int by0, int bx0, int *cx, int *cy)
{
int temp, eby, ebx, by, bx;
@@ -2683,7 +2683,7 @@ static void build_type4(int by0, int bx0)
/*
* Helper function for "monster nest (jelly)"
*/
-static bool vault_aux_jelly(int r_idx)
+static bool_ vault_aux_jelly(int r_idx)
{
monster_race *r_ptr = &r_info[r_idx];
@@ -2704,7 +2704,7 @@ static bool vault_aux_jelly(int r_idx)
/*
* Helper function for "monster nest (animal)"
*/
-static bool vault_aux_animal(int r_idx)
+static bool_ vault_aux_animal(int r_idx)
{
monster_race *r_ptr = &r_info[r_idx];
@@ -2722,7 +2722,7 @@ static bool vault_aux_animal(int r_idx)
/*
* Helper function for "monster nest (undead)"
*/
-static bool vault_aux_undead(int r_idx)
+static bool_ vault_aux_undead(int r_idx)
{
monster_race *r_ptr = &r_info[r_idx];
@@ -2740,7 +2740,7 @@ static bool vault_aux_undead(int r_idx)
/*
* Helper function for "monster nest (chapel)"
*/
-static bool vault_aux_chapel(int r_idx)
+static bool_ vault_aux_chapel(int r_idx)
{
monster_race *r_ptr = &r_info[r_idx];
@@ -2762,7 +2762,7 @@ static bool vault_aux_chapel(int r_idx)
/*
* Helper function for "monster nest (kennel)"
*/
-static bool vault_aux_kennel(int r_idx)
+static bool_ vault_aux_kennel(int r_idx)
{
monster_race *r_ptr = &r_info[r_idx];
@@ -2778,7 +2778,7 @@ static bool vault_aux_kennel(int r_idx)
/*
* Helper function for "monster nest (treasure)"
*/
-static bool vault_aux_treasure(int r_idx)
+static bool_ vault_aux_treasure(int r_idx)
{
monster_race *r_ptr = &r_info[r_idx];
@@ -2801,7 +2801,7 @@ static bool vault_aux_treasure(int r_idx)
/*
* Helper function for "monster nest (clone)"
*/
-static bool vault_aux_clone(int r_idx)
+static bool_ vault_aux_clone(int r_idx)
{
return (r_idx == template_race);
}
@@ -2810,7 +2810,7 @@ static bool vault_aux_clone(int r_idx)
/*
* Helper function for "monster nest (symbol clone)"
*/
-static bool vault_aux_symbol(int r_idx)
+static bool_ vault_aux_symbol(int r_idx)
{
return ((r_info[r_idx].d_char == (r_info[template_race].d_char))
&& !(r_info[r_idx].flags1 & RF1_UNIQUE));
@@ -2820,7 +2820,7 @@ static bool vault_aux_symbol(int r_idx)
/*
* Helper function for "monster pit (orc)"
*/
-static bool vault_aux_orc(int r_idx)
+static bool_ vault_aux_orc(int r_idx)
{
monster_race *r_ptr = &r_info[r_idx];
@@ -2839,7 +2839,7 @@ static bool vault_aux_orc(int r_idx)
/*
* Helper function for "monster pit (troll)"
*/
-static bool vault_aux_troll(int r_idx)
+static bool_ vault_aux_troll(int r_idx)
{
monster_race *r_ptr = &r_info[r_idx];
@@ -2857,7 +2857,7 @@ static bool vault_aux_troll(int r_idx)
/*
* Helper function for "monster pit (giant)"
*/
-static bool vault_aux_giant(int r_idx)
+static bool_ vault_aux_giant(int r_idx)
{
monster_race *r_ptr = &r_info[r_idx];
@@ -2881,7 +2881,7 @@ static u32b vault_aux_dragon_mask4;
/*
* Helper function for "monster pit (dragon)"
*/
-static bool vault_aux_dragon(int r_idx)
+static bool_ vault_aux_dragon(int r_idx)
{
monster_race *r_ptr = &r_info[r_idx];
@@ -2902,7 +2902,7 @@ static bool vault_aux_dragon(int r_idx)
/*
* Helper function for "monster pit (demon)"
*/
-static bool vault_aux_demon(int r_idx)
+static bool_ vault_aux_demon(int r_idx)
{
monster_race *r_ptr = &r_info[r_idx];
@@ -2946,8 +2946,8 @@ static void build_type5(int by0, int bx0)
int y, x, y1, x1, y2, x2, xval, yval;
int tmp, i;
cptr name;
- bool empty = FALSE;
- bool (*old_get_mon_num_hook)(int r_idx);
+ bool_ empty = FALSE;
+ bool_ (*old_get_mon_num_hook)(int r_idx);
s16b what[64];
/* Try to allocate space for room. If fails, exit */
@@ -3183,9 +3183,9 @@ static void build_type6(int by0, int bx0)
{
int tmp, what[16];
int i, j, y, x, y1, x1, y2, x2, xval, yval;
- bool empty = FALSE;
+ bool_ empty = FALSE;
cptr name;
- bool (*old_get_mon_num_hook)(int r_idx);
+ bool_ (*old_get_mon_num_hook)(int r_idx);
/* Try to allocate space for room. If fails, exit */
if (!room_alloc(25, 11, TRUE, by0, bx0, &xval, &yval)) return;
@@ -4228,7 +4228,7 @@ void generate_hmap(int y0, int x0, int xsiz, int ysiz, int grd,
/*
* Convert from height-map back to the normal Angband cave format
*/
-static bool hack_isnt_wall(int y, int x, int cutoff)
+static bool_ hack_isnt_wall(int y, int x, int cutoff)
{
/* Already done */
if (cave[y][x].info & CAVE_ICKY)
@@ -4299,8 +4299,8 @@ static void fill_hack(int y0, int x0, int y, int x, int xsize, int ysize,
}
-bool generate_fracave(int y0, int x0, int xsize, int ysize,
- int cutoff, bool light, bool room)
+bool_ generate_fracave(int y0, int x0, int xsize, int ysize,
+ int cutoff, bool_ light, bool_ room)
{
int x, y, i, amount, xhsize, yhsize;
cave_type *c_ptr;
@@ -4535,7 +4535,7 @@ bool generate_fracave(int y0, int x0, int xsize, int ysize,
static void build_cavern(void)
{
int grd, roug, cutoff, xsize, ysize, x0, y0;
- bool done, light, room;
+ bool_ done, light, room;
light = done = room = FALSE;
if (dun_level <= randint(25)) light = TRUE;
@@ -4576,7 +4576,7 @@ static void build_type10(int by0, int bx0)
{
int grd, roug, cutoff, xsize, ysize, y0, x0;
- bool done, light, room;
+ bool_ done, light, room;
/* Get size: note 'Evenness'*/
xsize = randint(22) * 2 + 6;
@@ -4885,7 +4885,7 @@ static void build_bubble_vault(int x0, int y0, int xsize, int ysize)
int i, j, k, x = 0, y = 0;
u16b min1, min2, temp;
- bool done;
+ bool_ done;
/* Offset from center to top left hand corner */
int xhsize = xsize / 2;
@@ -5143,7 +5143,7 @@ static void build_room_vault(int x0, int y0, int xsize, int ysize)
static void build_cave_vault(int x0, int y0, int xsiz, int ysiz)
{
int grd, roug, cutoff, xhsize, yhsize, xsize, ysize, x, y;
- bool done, light, room;
+ bool_ done, light, room;
/* Round to make sizes even */
xhsize = xsiz / 2;
@@ -5314,7 +5314,7 @@ static void build_maze_vault(int x0, int y0, int xsize, int ysize)
int y, x, dy, dx;
int y1, x1, y2, x2;
int i, m, n, num_vertices, *visited;
- bool light;
+ bool_ light;
cave_type *c_ptr;
@@ -6046,7 +6046,7 @@ static void build_type11(int by0, int bx0)
static void build_type12(int by0, int bx0)
{
int light, rad, x, y, x0, y0;
- bool emptyflag = TRUE;
+ bool_ emptyflag = TRUE;
int h1, h2, h3, h4;
/* Make a random metric */
@@ -6164,7 +6164,7 @@ static void build_type12(int by0, int bx0)
* FEAT_PERM_OUTER -- outer room walls (perma)
* FEAT_PERM_SOLID -- dungeon border (perma)
*/
-static void build_tunnel(int row1, int col1, int row2, int col2, bool water)
+static void build_tunnel(int row1, int col1, int row2, int col2, bool_ water)
{
int i, y, x;
int tmp_row, tmp_col;
@@ -6172,7 +6172,7 @@ static void build_tunnel(int row1, int col1, int row2, int col2, bool water)
int start_row, start_col;
int main_loop_count = 0;
- bool door_flag = FALSE;
+ bool_ door_flag = FALSE;
cave_type *c_ptr;
@@ -6463,7 +6463,7 @@ static int next_to_corr(int y1, int x1)
*
* Assumes "in_bounds(y,x)"
*/
-static bool possible_doorway(int y, int x)
+static bool_ possible_doorway(int y, int x)
{
/* Count the adjacent corridors */
if (next_to_corr(y, x) >= 2)
@@ -6488,42 +6488,12 @@ static bool possible_doorway(int y, int x)
}
-#if 0
-
-/*
- * Places door at y, x position if at least 2 walls found
- */
-static void try_door(int y, int x)
-{
- /* Paranoia */
- if (!in_bounds(y, x)) return;
-
- /* Some dungeons don't have doors at all */
- if (dungeon_flags1 & (DF1_NO_DOORS)) return;
-
- /* Ignore walls */
- if (f_info[cave[y][x].feat].flags1 & FF1_WALL) return;
-
- /* Ignore room grids */
- if (cave[y][x].info & (CAVE_ROOM)) return;
-
- /* Occasional door (if allowed) */
- if (possible_doorway(y, x) && (rand_int(100) < DUN_TUN_JCT))
- {
- /* Place a door */
- place_random_door(y, x);
- }
-}
-
-#endif /* 0 */
-
-
/*
* Places doors around y, x position
*/
static void try_doors(int y, int x)
{
- bool dir_ok[4];
+ bool_ dir_ok[4];
int i, k, n;
int yy, xx;
@@ -6636,7 +6606,7 @@ static void try_doors(int y, int x)
* Note that we restrict the number of "crowded" rooms to reduce
* the chance of overflowing the monster list during level creation.
*/
-static bool room_build(int y, int x, int typ)
+static bool_ room_build(int y, int x, int typ)
{
/* Restrict level */
if ((dun_level < roomdep[typ]) && !ironman_rooms) return (FALSE);
@@ -6697,7 +6667,7 @@ static bool room_build(int y, int x, int typ)
/*
* Set level boundaries
*/
-void set_bounders(bool empty_level)
+void set_bounders(bool_ empty_level)
{
int y, x;
@@ -6747,21 +6717,21 @@ void set_bounders(bool empty_level)
}
/* Needed to refill empty levels */
-static void fill_level(bool use_floor, byte smooth);
+static void fill_level(bool_ use_floor, byte smooth);
/*
* Generate a normal dungeon level
*/
-bool level_generate_dungeon(cptr name)
+bool_ level_generate_dungeon()
{
int i, k, y, x, y1, x1, branch = get_branch();
dungeon_info_type *d_ptr = &d_info[dungeon_type];
int max_vault_ok = 2;
- bool destroyed = FALSE;
- bool empty_level = FALSE;
- bool cavern = FALSE;
+ bool_ destroyed = FALSE;
+ bool_ empty_level = FALSE;
+ bool_ cavern = FALSE;
s16b town_level = 0;
/* Is it a town level ? */
@@ -6770,9 +6740,6 @@ bool level_generate_dungeon(cptr name)
if (d_ptr->t_level[i] == dun_level) town_level = d_ptr->t_idx[i];
}
- /* unused */
- name = name;
-
/* Check for arena level */
if ((dungeon_flags1 & (DF1_EMPTY)) ||
(empty_levels && (rand_int(EMPTY_LEVEL) == 0)))
@@ -7095,7 +7062,7 @@ bool level_generate_dungeon(cptr name)
if (dungeon_flags1 & DF1_WATER_RIVERS)
{
int max = 3 + rand_int(2);
- bool said = FALSE;
+ bool_ said = FALSE;
for (i = 0; i < max; i++)
{
@@ -7111,7 +7078,7 @@ bool level_generate_dungeon(cptr name)
if (dungeon_flags1 & DF1_LAVA_RIVERS)
{
int max = 2 + rand_int(2);
- bool said = FALSE;
+ bool_ said = FALSE;
for (i = 0; i < max; i++)
{
@@ -7314,8 +7281,8 @@ static void init_feat_info(void)
int i;
int cur_depth, max_depth;
int p1, p2;
- int floor_lim1, floor_lim2, floor_lim3;
- int fill_lim1, fill_lim2, fill_lim3;
+ int floor_lim1, floor_lim2;
+ int fill_lim1, fill_lim2;
/* Retrieve dungeon depth info (base 1, to avoid zero divide errors) */
@@ -7337,8 +7304,6 @@ static void init_feat_info(void)
p2 = d_ptr->floor_percent2[1];
floor_lim2 = floor_lim1 + p1 + (p2 - p1) * cur_depth / max_depth;
- floor_lim3 = 100;
-
/* Setup probability info -- Fillers */
p1 = d_ptr->fill_percent1[0];
p2 = d_ptr->fill_percent1[1];
@@ -7348,8 +7313,6 @@ static void init_feat_info(void)
p2 = d_ptr->fill_percent2[1];
fill_lim2 = fill_lim1 + p1 + (p2 - p1) * cur_depth / max_depth;
- fill_lim3 = 100;
-
/* Fill the arrays of floors and walls in the good proportions */
for (i = 0; i < 100; i++)
@@ -7418,7 +7381,7 @@ static void init_feat_info(void)
*/
#define MAX_SHIFTS 14
-static void fill_level(bool use_floor, byte smooth)
+static void fill_level(bool_ use_floor, byte smooth)
{
int y, x;
int step;
@@ -7507,7 +7470,7 @@ static void fill_level(bool use_floor, byte smooth)
/* Repeat subdivision until all the grids are filled in */
while ((step = step >> 1) > 0)
{
- bool y_even, x_even;
+ bool_ y_even, x_even;
s16b y_wrap, x_wrap;
s16b y_sel, x_sel;
u32b selector = 0;
@@ -7589,15 +7552,14 @@ static void fill_level(bool use_floor, byte smooth)
*
* Note that "dun_body" adds about 4000 bytes of memory to the stack.
*/
-static bool cave_gen(void)
+static bool_ cave_gen(void)
{
int i, k, y, x, y1, x1, branch;
dungeon_info_type *d_ptr = &d_info[dungeon_type];
int max_vault_ok = 2;
- bool empty_level = FALSE;
- s16b town_level = 0;
+ bool_ empty_level = FALSE;
level_generator_type *generator;
@@ -7619,13 +7581,6 @@ static bool cave_gen(void)
cur_hgt /= 2;
}
- /* Is it a town level ? */
- for (i = 0; i < TOWN_DUNGEON; i++)
- {
- if (d_ptr->t_level[i] == dun_level) town_level = d_ptr->t_idx[i];
- }
-
-
/* Fill the arrays of floors and walls in the good proportions */
init_feat_info();
@@ -7935,10 +7890,10 @@ static bool cave_gen(void)
{
int oy;
int ox;
- int m_idx, try = 10000;
+ int m_idx, tries = 10000;
/* Find a good position */
- while (try)
+ while (tries)
{
/* Get a random spot */
oy = randint(cur_hgt - 4) + 2;
@@ -7948,7 +7903,7 @@ static bool cave_gen(void)
if (cave_empty_bold(oy, ox)) break;
/* One less try */
- try--;
+ tries--;
}
/* Place the guardian */
@@ -8228,7 +8183,7 @@ static void arena_gen(void)
int y, x;
int qy = SCREEN_HGT;
int qx = SCREEN_WID;
- bool daytime;
+ bool_ daytime;
/* Day time */
if ((turn % (10L * DAY)) < ((10L * DAY) / 2))
@@ -8296,7 +8251,7 @@ static void quest_gen(void)
/* Mega-Hack */
#define REGEN_HACK 0x02
-bool build_special_level(void)
+bool_ build_special_level(void)
{
char buf[80];
int y, x, ystart = 2, xstart = 2;
@@ -8336,9 +8291,7 @@ bool build_special_level(void)
get_mon_num_prep();
init_flags = INIT_CREATE_DUNGEON | INIT_POSITION;
- process_dungeon_file_full = TRUE;
- process_dungeon_file(NULL, buf, &ystart, &xstart, cur_hgt, cur_wid, TRUE);
- process_dungeon_file_full = FALSE;
+ process_dungeon_file(buf, &ystart, &xstart, cur_hgt, cur_wid, TRUE, TRUE);
special_lvl[level][dungeon_type] = REGEN_HACK;
generate_special_feeling = TRUE;
@@ -8414,7 +8367,7 @@ static void finalise_special_level(void)
void generate_grid_mana()
{
int y, x, mana, mult;
- bool xtra_magic = FALSE;
+ bool_ xtra_magic = FALSE;
if (randint(XTRA_MAGIC) == 1)
{
@@ -8460,7 +8413,7 @@ void generate_cave(void)
dungeon_info_type *d_ptr = &d_info[dungeon_type];
int tester_1, tester_2;
int y, x, num, i;
- bool loaded = FALSE;
+ bool_ loaded = FALSE;
char buf[80];
s16b town_level = 0;
@@ -8558,7 +8511,7 @@ void generate_cave(void)
/* Generate */
for (num = 0; TRUE; num++)
{
- bool okay = TRUE;
+ bool_ okay = TRUE;
cptr why = NULL;
@@ -8660,47 +8613,34 @@ void generate_cave(void)
/* Build the town */
else if (!dun_level)
{
- /* Big wilderness mode */
- if (!p_ptr->wild_mode)
- {
- /* Big town */
- cur_hgt = MAX_HGT;
- cur_wid = MAX_WID;
+ /* Big town */
+ cur_hgt = MAX_HGT;
+ cur_wid = MAX_WID;
- /* Determine number of panels */
- max_panel_rows = (cur_hgt / SCREEN_HGT) * 2 - 2;
- max_panel_cols = (cur_wid / SCREEN_WID) * 2 - 2;
+ /* Determine number of panels */
+ max_panel_rows = (cur_hgt / SCREEN_HGT) * 2 - 2;
+ max_panel_cols = (cur_wid / SCREEN_WID) * 2 - 2;
- /* Assume illegal panel */
- panel_row_min = max_panel_rows * (SCREEN_HGT / 2);
- panel_col_min = max_panel_cols * (SCREEN_WID / 2);
+ /* Assume illegal panel */
+ panel_row_min = max_panel_rows * (SCREEN_HGT / 2);
+ panel_col_min = max_panel_cols * (SCREEN_WID / 2);
+ /* Big wilderness mode */
+ if (!p_ptr->wild_mode)
+ {
/* Make the wilderness */
wilderness_gen(0);
-
- okay = TRUE;
}
/* Small wilderness mode */
else
{
- /* Big screen */
- cur_hgt = MAX_HGT;
- cur_wid = MAX_WID;
-
- /* Determine number of panels */
- max_panel_rows = (cur_hgt / SCREEN_HGT) * 2 - 2;
- max_panel_cols = (cur_wid / SCREEN_WID) * 2 - 2;
-
- /* Assume illegal panel */
- panel_row_min = max_panel_rows * (SCREEN_HGT / 2);
- panel_col_min = max_panel_cols * (SCREEN_WID / 2);
-
/* Make the wilderness */
wilderness_gen_small();
-
- okay = TRUE;
}
+
+
+ okay = TRUE;
}
/* Build a dungeon level */
diff --git a/src/gods.c b/src/gods.c
index 8d0b1791..b8b8fd3a 100644
--- a/src/gods.c
+++ b/src/gods.c
@@ -46,7 +46,7 @@ void abandon_god(int god)
/*
* Get a religion
*/
-void follow_god(int god, bool silent)
+void follow_god(int god, bool_ silent)
{
/* Poor unbelievers, i'm so mean ... BOUHAHAHA */
if (get_skill(SKILL_ANTIMAGIC))
@@ -78,10 +78,9 @@ void follow_god(int god, bool silent)
/*
* Show religious info.
*/
-bool show_god_info(bool ext)
+bool_ show_god_info(bool_ ext)
{
int pgod = p_ptr->pgod;
- int tmp;
deity_type *d_ptr;
@@ -107,7 +106,7 @@ bool show_god_info(bool ext)
text_out(d_ptr->desc[i]);
text_out("\n");
- tmp = inkey();
+ inkey();
Term_load();
character_icky = FALSE;
diff --git a/src/h-config.h b/src/h-config.h
index d69876cc..53670e8f 100644
--- a/src/h-config.h
+++ b/src/h-config.h
@@ -165,7 +165,7 @@
* or for the "Atari" platform which is Unix-like, apparently
*/
#if !defined(MACINTOSH) && !defined(WINDOWS) && \
- !defined(MSDOS) && !defined(USE_EMX)
+ !defined(MSDOS)
# define SET_UID
#endif
@@ -204,7 +204,7 @@
# undef PATH_SEP
# define PATH_SEP "\\"
#endif
-#if defined(MSDOS) || defined(OS2) || defined(USE_EMX)
+#if defined(MSDOS) || defined(OS2)
# undef PATH_SEP
# define PATH_SEP "\\"
#endif
diff --git a/src/h-system.h b/src/h-system.h
index 465c3170..50cc0af8 100644
--- a/src/h-system.h
+++ b/src/h-system.h
@@ -51,7 +51,7 @@
# include <unix.h>
#endif
-#if defined(WINDOWS) || defined(MSDOS) || defined(USE_EMX)
+#if defined(WINDOWS) || defined(MSDOS)
# include <io.h>
#endif
diff --git a/src/h-type.h b/src/h-type.h
index eb865892..5dbb4975 100644
--- a/src/h-type.h
+++ b/src/h-type.h
@@ -78,13 +78,6 @@ typedef int errr;
#undef byte
#define byte byte_hack
-/*
- * Hack -- prevent problems with C++
- */
-#undef bool
-#define bool bool_hack
-
-
/* Note that "signed char" is not always "defined" */
/* So always use "s16b" to hold small signed values */
/* A signed byte of memory */
@@ -96,7 +89,7 @@ typedef unsigned char byte;
/* Note that a bool is smaller than a full "int" */
/* Simple True/False type */
-typedef char bool;
+typedef char bool_;
/* A signed, standard integer (at least 2 bytes) */
@@ -133,7 +126,7 @@ typedef real *real_ptr;
typedef errr *errr_ptr;
typedef char *char_ptr;
typedef byte *byte_ptr;
-typedef bool *bool_ptr;
+typedef bool_ *bool_ptr;
typedef sint *sint_ptr;
typedef uint *uint_ptr;
typedef long *long_ptr;
@@ -153,7 +146,7 @@ typedef void (*func_void)();
typedef errr (*func_errr)();
typedef char (*func_char)();
typedef byte (*func_byte)();
-typedef bool (*func_bool)();
+typedef bool_ (*func_bool)();
typedef sint (*func_sint)();
typedef uint (*func_uint)();
typedef real (*func_real)();
@@ -168,7 +161,7 @@ typedef cptr (*func_cptr)();
typedef errr (*func_gen)(vptr, vptr);
/* An equality testing function takes two things to compare (bool) */
-typedef bool (*func_eql)(vptr, vptr);
+typedef bool_ (*func_eql)(vptr, vptr);
/* A comparison function takes two things and to compare (-1,0,+1) */
typedef sint (*func_cmp)(vptr, vptr);
diff --git a/src/help.c b/src/help.c
index 73475387..d0bdbedf 100644
--- a/src/help.c
+++ b/src/help.c
@@ -19,5 +19,5 @@
/*
* Driver for the context-sensitive help system
*/
-void ingame_help(bool enable)
+void ingame_help(bool_ enable)
{}
diff --git a/src/init1.c b/src/init1.c
index ded9a281..9715831d 100644
--- a/src/init1.c
+++ b/src/init1.c
@@ -1513,15 +1513,9 @@ static void fp_stack_push(cptr name)
/* Build the filename */
path_build(buf, 1024, ANGBAND_DIR_EDIT, name);
- /* Grab permission */
- safe_setuid_grab();
-
/* Open the file */
fp = my_fopen(buf, "r");
- /* Drop permission */
- safe_setuid_drop();
-
/* Parse it */
if (!fp) quit(format("Cannot open '%s' file.", name));
@@ -1531,7 +1525,7 @@ static void fp_stack_push(cptr name)
}
}
-static bool fp_stack_pop()
+static bool_ fp_stack_pop()
{
if (fp_stack_idx > 0)
{
@@ -1570,7 +1564,7 @@ static int my_fgets_dostack(char *buf, int len)
/*
* Grab one race flag from a textual string
*/
-static bool unknown_shut_up = FALSE;
+static bool_ unknown_shut_up = FALSE;
static errr grab_one_class_flag(u32b *choice, cptr what)
{
int i;
@@ -1782,7 +1776,7 @@ errr init_player_info_txt(FILE *fp, char *buf)
char *s, *t;
/* Not ready yet */
- bool okay = FALSE;
+ bool_ okay = FALSE;
/* Current entry */
player_race *rp_ptr = NULL;
@@ -3412,13 +3406,13 @@ errr init_player_info_txt(FILE *fp, char *buf)
/*
* Initialize the "v_info" array, by parsing an ascii "template" file
*/
-errr init_v_info_txt(FILE *fp, char *buf, bool start)
+errr init_v_info_txt(FILE *fp, char *buf, bool_ start)
{
int i;
char *s;
/* Not ready yet */
- bool okay = FALSE;
+ bool_ okay = FALSE;
/* Current entry */
vault_type *v_ptr = NULL;
@@ -3660,7 +3654,7 @@ errr init_f_info_txt(FILE *fp, char *buf)
char *s, *t;
/* Not ready yet */
- bool okay = FALSE;
+ bool_ okay = FALSE;
u32b default_desc = 0, default_tunnel = 0, default_block = 0;
/* Current entry */
@@ -3995,7 +3989,7 @@ errr init_f_info_txt(FILE *fp, char *buf)
/*
* Grab one flag in an object_kind from a textual string
*/
-static errr grab_one_kind_flag(object_kind *k_ptr, cptr what, bool obvious)
+static errr grab_one_kind_flag(object_kind *k_ptr, cptr what, bool_ obvious)
{
int i;
@@ -4107,7 +4101,7 @@ errr init_k_info_txt(FILE *fp, char *buf)
char *s, *t;
/* Not ready yet */
- bool okay = FALSE;
+ bool_ okay = FALSE;
/* Current entry */
object_kind *k_ptr = NULL;
@@ -4605,7 +4599,7 @@ errr init_al_info_txt(FILE *fp, char *buf)
struct artifact_select_flag *a_ptr = NULL;
/* Not ready yet */
- bool okay = FALSE;
+ bool_ okay = FALSE;
/* Just before the first record */
error_idx = -1;
@@ -4906,7 +4900,7 @@ errr init_al_info_txt(FILE *fp, char *buf)
/*
* Grab one flag in an artifact_type from a textual string
*/
-static errr grab_one_artifact_flag(artifact_type *a_ptr, cptr what, bool obvious)
+static errr grab_one_artifact_flag(artifact_type *a_ptr, cptr what, bool_ obvious)
{
int i;
@@ -5021,7 +5015,7 @@ errr init_a_info_txt(FILE *fp, char *buf)
char *s, *t;
/* Not ready yet */
- bool okay = FALSE;
+ bool_ okay = FALSE;
/* Current entry */
artifact_type *a_ptr = NULL;
@@ -5361,7 +5355,7 @@ errr init_set_info_txt(FILE *fp, char *buf)
char *s, *t;
/* Not ready yet */
- bool okay = FALSE;
+ bool_ okay = FALSE;
/* Current entry */
set_type *set_ptr = NULL;
@@ -5598,7 +5592,7 @@ errr init_s_info_txt(FILE *fp, char *buf)
char *s;
/* Not ready yet */
- bool okay = FALSE;
+ bool_ okay = FALSE;
/* Current entry */
skill_type *s_ptr = NULL;
@@ -5977,7 +5971,7 @@ errr init_ab_info_txt(FILE *fp, char *buf)
char *s;
/* Not ready yet */
- bool okay = FALSE;
+ bool_ okay = FALSE;
/* Current entry */
ability_type *ab_ptr = NULL;
@@ -6187,7 +6181,7 @@ errr init_ab_info_txt(FILE *fp, char *buf)
level = atoi(buf + 2);
skill = find_skill(sec);
- if ((skill == -1)) return (1);
+ if (skill == -1) return (1);
for (z = 0; z < 10; z++)
if (ab_ptr->skills[z] == -1) break;
@@ -6209,7 +6203,7 @@ errr init_ab_info_txt(FILE *fp, char *buf)
ab = find_ability(buf + 2);
- if ((ab == -1)) return (1);
+ if (ab == -1) return (1);
for (z = 0; z < 10; z++)
if (ab_ptr->need_abilities[z] == -1) break;
@@ -6244,7 +6238,7 @@ errr init_ab_info_txt(FILE *fp, char *buf)
break;
}
- if ((stat == 6)) return (1);
+ if (stat == 6) return (1);
ab_ptr->stat[stat] = atoi(buf + 2);
@@ -6312,7 +6306,7 @@ errr init_ab_info_txt(FILE *fp, char *buf)
/*
* Grab one flag in a ego-item_type from a textual string
*/
-static bool grab_one_ego_item_flag(ego_item_type *e_ptr, cptr what, int n, bool obvious)
+static bool_ grab_one_ego_item_flag(ego_item_type *e_ptr, cptr what, int n, bool_ obvious)
{
int i;
@@ -6424,7 +6418,7 @@ static bool grab_one_ego_item_flag(ego_item_type *e_ptr, cptr what, int n, bool
return (1);
}
-static bool grab_one_ego_item_flag_restrict(ego_item_type *e_ptr, cptr what, bool need)
+static bool_ grab_one_ego_item_flag_restrict(ego_item_type *e_ptr, cptr what, bool_ need)
{
int i;
@@ -6539,7 +6533,7 @@ errr init_e_info_txt(FILE *fp, char *buf)
char *s, *t;
/* Not ready yet */
- bool okay = FALSE;
+ bool_ okay = FALSE;
/* Current entry */
ego_item_type *e_ptr = NULL;
@@ -6934,7 +6928,7 @@ errr init_e_info_txt(FILE *fp, char *buf)
/*
* Grab one flag in a randart_part_type from a textual string
*/
-static bool grab_one_randart_item_flag(randart_part_type *ra_ptr, cptr what, char c)
+static bool_ grab_one_randart_item_flag(randart_part_type *ra_ptr, cptr what, char c)
{
int i;
u32b *f1, *f2, *f3, *f4, *f5, *esp;
@@ -7061,7 +7055,7 @@ errr init_ra_info_txt(FILE *fp, char *buf)
char *s, *t;
/* Not ready yet */
- bool okay = FALSE;
+ bool_ okay = FALSE;
/* Current entry */
randart_part_type *ra_ptr = NULL;
@@ -7468,7 +7462,7 @@ errr init_r_info_txt(FILE *fp, char *buf)
char *s, *t;
/* Not ready yet */
- bool okay = FALSE;
+ bool_ okay = FALSE;
/* Current entry */
monster_race *r_ptr = NULL;
@@ -7875,7 +7869,7 @@ errr init_r_info_txt(FILE *fp, char *buf)
/*
* Grab one (basic) flag in a monster_race from a textual string
*/
-static errr grab_one_basic_ego_flag(monster_ego *re_ptr, cptr what, bool add)
+static errr grab_one_basic_ego_flag(monster_ego *re_ptr, cptr what, bool_ add)
{
int i;
@@ -7968,7 +7962,7 @@ static errr grab_one_basic_ego_flag(monster_ego *re_ptr, cptr what, bool add)
/*
* Grab one (spell) flag in a monster_race from a textual string
*/
-static errr grab_one_spell_ego_flag(monster_ego *re_ptr, cptr what, bool add)
+static errr grab_one_spell_ego_flag(monster_ego *re_ptr, cptr what, bool_ add)
{
int i;
@@ -8021,7 +8015,7 @@ static errr grab_one_spell_ego_flag(monster_ego *re_ptr, cptr what, bool add)
/*
* Grab one (basic) flag in a monster_race from a textual string
*/
-static errr grab_one_ego_flag(monster_ego *re_ptr, cptr what, bool must)
+static errr grab_one_ego_flag(monster_ego *re_ptr, cptr what, bool_ must)
{
int i;
@@ -8111,7 +8105,7 @@ errr init_re_info_txt(FILE *fp, char *buf)
char *s, *t;
/* Not ready yet */
- bool okay = FALSE;
+ bool_ okay = FALSE;
/* Current entry */
monster_ego *re_ptr = NULL;
@@ -8652,7 +8646,7 @@ errr init_t_info_txt(FILE *fp, char *buf)
char *s, *t;
/* Not ready yet */
- bool okay = FALSE;
+ bool_ okay = FALSE;
/* Current entry */
trap_type *t_ptr = NULL;
@@ -9025,7 +9019,7 @@ errr init_d_info_txt(FILE *fp, char *buf)
char *s, *t;
/* Not ready yet */
- bool okay = FALSE;
+ bool_ okay = FALSE;
/* Current entry */
dungeon_info_type *d_ptr = NULL;
@@ -9670,7 +9664,7 @@ errr init_st_info_txt(FILE *fp, char *buf)
char *s, *t;
/* Not ready yet */
- bool okay = FALSE;
+ bool_ okay = FALSE;
/* Current entry */
store_info_type *st_ptr = NULL;
@@ -9959,7 +9953,7 @@ errr init_ba_info_txt(FILE *fp, char *buf)
char *s;
/* Not ready yet */
- bool okay = FALSE;
+ bool_ okay = FALSE;
/* Current entry */
store_action_type *ba_ptr = NULL;
@@ -10129,7 +10123,7 @@ errr init_ow_info_txt(FILE *fp, char *buf)
char *s, *t;
/* Not ready yet */
- bool okay = FALSE;
+ bool_ okay = FALSE;
/* Current entry */
owner_type *ow_ptr = NULL;
@@ -10376,7 +10370,7 @@ errr init_wf_info_txt(FILE *fp, char *buf)
char *s, *t;
/* Not ready yet */
- bool okay = FALSE;
+ bool_ okay = FALSE;
/* Current entry */
wilderness_type_info *wf_ptr = NULL;
@@ -10622,18 +10616,17 @@ struct dungeon_grid
int bx, by; /* For between gates */
int mimic; /* Mimiced features */
s32b mflag; /* monster's mflag */
- bool ok;
- bool defined;
+ bool_ ok;
+ bool_ defined;
};
-static bool meta_sleep = TRUE;
+static bool_ meta_sleep = TRUE;
static dungeon_grid letter[255];
/*
* Parse a sub-file of the "extra info"
*/
-bool process_dungeon_file_full = FALSE;
-static errr process_dungeon_file_aux(char *buf, int *yval, int *xval, int xvalstart, int ymax, int xmax)
+static errr process_dungeon_file_aux(char *buf, int *yval, int *xval, int xvalstart, int ymax, int xmax, bool_ full)
{
int i;
@@ -10657,7 +10650,7 @@ static errr process_dungeon_file_aux(char *buf, int *yval, int *xval, int xvalst
if (buf[0] == '%')
{
/* Attempt to Process the given file */
- return (process_dungeon_file(NULL, buf + 2, yval, xval, ymax, xmax, FALSE));
+ return (process_dungeon_file(buf + 2, yval, xval, ymax, xmax, FALSE, full));
}
/* Process "N:<sleep>" */
@@ -11095,7 +11088,7 @@ static errr process_dungeon_file_aux(char *buf, int *yval, int *xval, int xvalst
c_ptr->special = letter[idx].special;
}
}
- if ((process_dungeon_file_full) && (*xval < x)) *xval = x;
+ if (full && (*xval < x)) *xval = x;
(*yval)++;
return (0);
@@ -11549,7 +11542,7 @@ static cptr process_dungeon_file_expr(char **sp, char *fp)
/* Other */
else
{
- bool text_mode = FALSE;
+ bool_ text_mode = FALSE;
/* Accept all printables except spaces and brackets */
while (isprint(*s))
@@ -11687,8 +11680,7 @@ static cptr process_dungeon_file_expr(char **sp, char *fp)
/* Wilderness */
else if (streq(b + 1, "WILDERNESS"))
{
- if (vanilla_town) v = "NONE";
- else v = "NORMAL";
+ v = "NORMAL";
}
}
@@ -11710,7 +11702,7 @@ static cptr process_dungeon_file_expr(char **sp, char *fp)
}
-errr process_dungeon_file(cptr full_text, cptr name, int *yval, int *xval, int ymax, int xmax, bool init)
+errr process_dungeon_file(cptr name, int *yval, int *xval, int ymax, int xmax, bool_ init, bool_ full)
{
FILE *fp = 0;
@@ -11720,7 +11712,7 @@ errr process_dungeon_file(cptr full_text, cptr name, int *yval, int *xval, int y
errr err = 0;
- bool bypass = FALSE;
+ bool_ bypass = FALSE;
/* Save the start since it ought to be modified */
int xmin = *xval;
@@ -11738,36 +11730,21 @@ errr process_dungeon_file(cptr full_text, cptr name, int *yval, int *xval, int y
}
}
- /* We dont need any files for full_text */
- if (full_text)
- {
- /* Init */
- my_str_fgets(full_text, NULL, 0);
- }
- else
- {
- /* Build the filename */
- path_build(buf, 1024, ANGBAND_DIR_EDIT, name);
-
- /* Grab permission */
- safe_setuid_grab();
+ /* Build the filename */
+ path_build(buf, 1024, ANGBAND_DIR_EDIT, name);
- /* Open the file */
- fp = my_fopen(buf, "r");
-
- /* Drop permission */
- safe_setuid_drop();
+ /* Open the file */
+ fp = my_fopen(buf, "r");
- /* No such file */
- if (!fp)
- {
- msg_format("Cannot find file %s at %s", name, buf);
- return ( -1);
- }
+ /* No such file */
+ if (!fp)
+ {
+ msg_format("Cannot find file %s at %s", name, buf);
+ return ( -1);
}
/* Process the file */
- while (0 == ((full_text) ? my_str_fgets(full_text, buf, 1024) : my_fgets(fp, buf, 1024)))
+ while (0 == my_fgets(fp, buf, 1024))
{
/* Count lines */
num++;
@@ -11811,7 +11788,7 @@ errr process_dungeon_file(cptr full_text, cptr name, int *yval, int *xval, int y
if (buf[0] == '%')
{
/* Process that file if allowed */
- (void)process_dungeon_file(NULL, buf + 2, yval, xval, ymax, xmax, FALSE);
+ (void)process_dungeon_file(buf + 2, yval, xval, ymax, xmax, FALSE, full);
/* Continue */
continue;
@@ -11819,7 +11796,7 @@ errr process_dungeon_file(cptr full_text, cptr name, int *yval, int *xval, int y
/* Process the line */
- err = process_dungeon_file_aux(buf, yval, xval, xmin, ymax, xmax);
+ err = process_dungeon_file_aux(buf, yval, xval, xmin, ymax, xmax, full);
/* Oops */
if (err) break;
@@ -11834,11 +11811,8 @@ errr process_dungeon_file(cptr full_text, cptr name, int *yval, int *xval, int y
msg_format("Parsing '%s'", buf);
}
- if (!full_text)
- {
- /* Close the file */
- my_fclose(fp);
- }
+ /* Close the file */
+ my_fclose(fp);
/* Result */
return (err);
diff --git a/src/init2.c b/src/init2.c
index 6db66d28..5239426c 100644
--- a/src/init2.c
+++ b/src/init2.c
@@ -169,8 +169,6 @@ void init_file_paths(char *path)
strcpy(tail, "pref");
ANGBAND_DIR_PREF = string_make(path);
-#ifdef PRIVATE_USER_PATH
-
/* synchronize with module_reset_dir */
{
char user_path[1024];
@@ -199,29 +197,8 @@ void init_file_paths(char *path)
/* Savefiles are in user directory */
strcat(user_path, "/save");
ANGBAND_DIR_SAVE = string_make(user_path);
- savefile_setuid = 0;
}
-#else /* PRIVATE_USER_PATH */
-
- /* Build a path name */
- strcpy(tail, "save");
- ANGBAND_DIR_SAVE = string_make(path);
-
- /* Build a path name */
- strcpy(tail, "user");
- ANGBAND_DIR_USER = string_make(path);
-
- /* Build a path name */
- strcpy(tail, "note");
- ANGBAND_DIR_NOTE = string_make(path);
-
- /* Build a .. blah blah -- Improv */
- strcpy(tail, "cmov");
- ANGBAND_DIR_CMOV = string_make(path);
-
-#endif /* PRIVATE_USER_PATH */
-
/* Build a path name */
strcpy(tail, "xtra");
ANGBAND_DIR_XTRA = string_make(path);
@@ -346,19 +323,8 @@ static errr init_f_info(void)
/* Allocate the "header" */
MAKE(f_head, header);
- /* Save the "version" */
- f_head->v_major = VERSION_MAJOR;
- f_head->v_minor = VERSION_MINOR;
- f_head->v_patch = VERSION_PATCH;
- f_head->v_extra = 0;
-
/* Save the "record" information */
f_head->info_num = max_f_idx;
- f_head->info_len = sizeof(feature_type);
-
- /* Save the size of "f_head" and "f_info" */
- f_head->head_size = sizeof(header);
- f_head->info_size = f_head->info_num * f_head->info_len;
/*** Make the fake arrays ***/
@@ -380,15 +346,9 @@ static errr init_f_info(void)
/* Build the filename */
path_build(buf, 1024, ANGBAND_DIR_EDIT, "f_info.txt");
- /* Grab permission */
- safe_setuid_grab();
-
/* Open the file */
fp = my_fopen(buf, "r");
- /* Drop permission */
- safe_setuid_drop();
-
/* Parse it */
if (!fp) quit("Cannot open 'f_info.txt' file.");
@@ -447,19 +407,8 @@ static errr init_k_info(void)
/* Allocate the "header" */
MAKE(k_head, header);
- /* Save the "version" */
- k_head->v_major = VERSION_MAJOR;
- k_head->v_minor = VERSION_MINOR;
- k_head->v_patch = VERSION_PATCH;
- k_head->v_extra = 0;
-
/* Save the "record" information */
k_head->info_num = max_k_idx;
- k_head->info_len = sizeof(object_kind);
-
- /* Save the size of "k_head" and "k_info" */
- k_head->head_size = sizeof(header);
- k_head->info_size = k_head->info_num * k_head->info_len;
/*** Make the fake arrays ***/
@@ -481,15 +430,9 @@ static errr init_k_info(void)
/* Build the filename */
path_build(buf, 1024, ANGBAND_DIR_EDIT, "k_info.txt");
- /* Grab permission */
- safe_setuid_grab();
-
/* Open the file */
fp = my_fopen(buf, "r");
- /* Drop permission */
- safe_setuid_drop();
-
/* Parse it */
if (!fp) quit("Cannot open 'k_info.txt' file.");
@@ -548,19 +491,8 @@ static errr init_set_info(void)
/* Allocate the "header" */
MAKE(set_head, header);
- /* Save the "version" */
- set_head->v_major = VERSION_MAJOR;
- set_head->v_minor = VERSION_MINOR;
- set_head->v_patch = VERSION_PATCH;
- set_head->v_extra = 0;
-
/* Save the "record" information */
set_head->info_num = max_set_idx;
- set_head->info_len = sizeof(set_type);
-
- /* Save the size of "set_head" and "set_info" */
- set_head->head_size = sizeof(header);
- set_head->info_size = set_head->info_num * set_head->info_len;
/*** Make the fake arrays ***/
@@ -582,15 +514,9 @@ static errr init_set_info(void)
/* Build the filename */
path_build(buf, 1024, ANGBAND_DIR_EDIT, "set_info.txt");
- /* Grab permission */
- safe_setuid_grab();
-
/* Open the file */
fp = my_fopen(buf, "r");
- /* Drop permission */
- safe_setuid_drop();
-
/* Parse it */
if (!fp) quit("Cannot open 'set_info.txt' file.");
@@ -648,19 +574,8 @@ static errr init_a_info(void)
/* Allocate the "header" */
MAKE(a_head, header);
- /* Save the "version" */
- a_head->v_major = VERSION_MAJOR;
- a_head->v_minor = VERSION_MINOR;
- a_head->v_patch = VERSION_PATCH;
- a_head->v_extra = 0;
-
/* Save the "record" information */
a_head->info_num = max_a_idx;
- a_head->info_len = sizeof(artifact_type);
-
- /* Save the size of "a_head" and "a_info" */
- a_head->head_size = sizeof(header);
- a_head->info_size = a_head->info_num * a_head->info_len;
/*** Make the fake arrays ***/
@@ -682,15 +597,9 @@ static errr init_a_info(void)
/* Build the filename */
path_build(buf, 1024, ANGBAND_DIR_EDIT, "a_info.txt");
- /* Grab permission */
- safe_setuid_grab();
-
/* Open the file */
fp = my_fopen(buf, "r");
- /* Drop permission */
- safe_setuid_drop();
-
/* Parse it */
if (!fp) quit("Cannot open 'a_info.txt' file.");
@@ -748,19 +657,9 @@ static errr init_s_info(void)
/* Allocate the "header" */
MAKE(s_head, header);
- /* Save the "version" */
- s_head->v_major = VERSION_MAJOR;
- s_head->v_minor = VERSION_MINOR;
- s_head->v_patch = VERSION_PATCH;
- s_head->v_extra = 0;
-
/* Save the "record" information */
s_head->info_num = max_s_idx;
- s_head->info_len = sizeof(skill_type);
- /* Save the size of "s_head" and "s_info" */
- s_head->head_size = sizeof(header);
- s_head->info_size = s_head->info_num * s_head->info_len;
/*** Make the fake arrays ***/
@@ -780,15 +679,9 @@ static errr init_s_info(void)
/* Build the filename */
path_build(buf, 1024, ANGBAND_DIR_EDIT, "s_info.txt");
- /* Grab permission */
- safe_setuid_grab();
-
/* Open the file */
fp = my_fopen(buf, "r");
- /* Drop permission */
- safe_setuid_drop();
-
/* Parse it */
if (!fp) quit("Cannot open 's_info.txt' file.");
@@ -846,19 +739,9 @@ static errr init_ab_info(void)
/* Allocate the "header" */
MAKE(ab_head, header);
- /* Save the "version" */
- ab_head->v_major = VERSION_MAJOR;
- ab_head->v_minor = VERSION_MINOR;
- ab_head->v_patch = VERSION_PATCH;
- ab_head->v_extra = 0;
-
/* Save the "record" information */
ab_head->info_num = max_ab_idx;
- ab_head->info_len = sizeof(ability_type);
- /* Save the size of "ab_head" and "ab_info" */
- ab_head->head_size = sizeof(header);
- ab_head->info_size = ab_head->info_num * ab_head->info_len;
/*** Make the fake arrays ***/
@@ -878,15 +761,9 @@ static errr init_ab_info(void)
/* Build the filename */
path_build(buf, 1024, ANGBAND_DIR_EDIT, "ab_info.txt");
- /* Grab permission */
- safe_setuid_grab();
-
/* Open the file */
fp = my_fopen(buf, "r");
- /* Drop permission */
- safe_setuid_drop();
-
/* Parse it */
if (!fp) quit("Cannot open 'ab_info.txt' file.");
@@ -945,19 +822,9 @@ static errr init_e_info(void)
/* Allocate the "header" */
MAKE(e_head, header);
- /* Save the "version" */
- e_head->v_major = VERSION_MAJOR;
- e_head->v_minor = VERSION_MINOR;
- e_head->v_patch = VERSION_PATCH;
- e_head->v_extra = 0;
-
/* Save the "record" information */
e_head->info_num = max_e_idx;
- e_head->info_len = sizeof(ego_item_type);
- /* Save the size of "e_head" and "e_info" */
- e_head->head_size = sizeof(header);
- e_head->info_size = e_head->info_num * e_head->info_len;
/*** Make the fake arrays ***/
@@ -978,15 +845,9 @@ static errr init_e_info(void)
/* Build the filename */
path_build(buf, 1024, ANGBAND_DIR_EDIT, "e_info.txt");
- /* Grab permission */
- safe_setuid_grab();
-
/* Open the file */
fp = my_fopen(buf, "r");
- /* Drop permission */
- safe_setuid_drop();
-
/* Parse it */
if (!fp) quit("Cannot open 'e_info.txt' file.");
@@ -1044,19 +905,8 @@ static errr init_ra_info(void)
/* Allocate the "header" */
MAKE(ra_head, header);
- /* Save the "version" */
- ra_head->v_major = VERSION_MAJOR;
- ra_head->v_minor = VERSION_MINOR;
- ra_head->v_patch = VERSION_PATCH;
- ra_head->v_extra = 0;
-
/* Save the "record" information */
ra_head->info_num = max_ra_idx;
- ra_head->info_len = sizeof(randart_part_type);
-
- /* Save the size of "ra_head" and "ra_info" */
- ra_head->head_size = sizeof(header);
- ra_head->info_size = ra_head->info_num * ra_head->info_len;
/*** Make the fake arrays ***/
@@ -1073,15 +923,9 @@ static errr init_ra_info(void)
/* Build the filename */
path_build(buf, 1024, ANGBAND_DIR_EDIT, "ra_info.txt");
- /* Grab permission */
- safe_setuid_grab();
-
/* Open the file */
fp = my_fopen(buf, "r");
- /* Drop permission */
- safe_setuid_drop();
-
/* Parse it */
if (!fp) quit("Cannot open 'ra_info.txt' file.");
@@ -1136,19 +980,9 @@ static errr init_r_info(void)
/* Allocate the "header" */
MAKE(r_head, header);
- /* Save the "version" */
- r_head->v_major = VERSION_MAJOR;
- r_head->v_minor = VERSION_MINOR;
- r_head->v_patch = VERSION_PATCH;
- r_head->v_extra = 0;
-
/* Save the "record" information */
r_head->info_num = max_r_idx;
- r_head->info_len = sizeof(monster_race);
- /* Save the size of "r_head" and "r_info" */
- r_head->head_size = sizeof(header);
- r_head->info_size = r_head->info_num * r_head->info_len;
/*** Make the fake arrays ***/
@@ -1169,15 +1003,9 @@ static errr init_r_info(void)
/* Build the filename */
path_build(buf, 1024, ANGBAND_DIR_EDIT, "r_info.txt");
- /* Grab permission */
- safe_setuid_grab();
-
/* Open the file */
fp = my_fopen(buf, "r");
- /* Drop permission */
- safe_setuid_drop();
-
/* Parse it */
if (!fp) quit("Cannot open 'r_info.txt' file.");
@@ -1235,19 +1063,9 @@ static errr init_re_info(void)
/* Allocate the "header" */
MAKE(re_head, header);
- /* Save the "version" */
- re_head->v_major = VERSION_MAJOR;
- re_head->v_minor = VERSION_MINOR;
- re_head->v_patch = VERSION_PATCH;
- re_head->v_extra = 0;
-
/* Save the "record" information */
re_head->info_num = max_re_idx;
- re_head->info_len = sizeof(monster_ego);
- /* Save the size of "re_head" and "re_info" */
- re_head->head_size = sizeof(header);
- re_head->info_size = re_head->info_num * re_head->info_len;
/*** Make the fake arrays ***/
@@ -1266,15 +1084,9 @@ static errr init_re_info(void)
/* Build the filename */
path_build(buf, 1024, ANGBAND_DIR_EDIT, "re_info.txt");
- /* Grab permission */
- safe_setuid_grab();
-
/* Open the file */
fp = my_fopen(buf, "r");
- /* Drop permission */
- safe_setuid_drop();
-
/* Parse it */
if (!fp) quit("Cannot open 're_info.txt' file.");
@@ -1331,19 +1143,9 @@ static errr init_d_info(void)
/* Allocate the "header" */
MAKE(d_head, header);
- /* Save the "version" */
- d_head->v_major = VERSION_MAJOR;
- d_head->v_minor = VERSION_MINOR;
- d_head->v_patch = VERSION_PATCH;
- d_head->v_extra = 0;
-
/* Save the "record" information */
d_head->info_num = max_d_idx;
- d_head->info_len = sizeof(dungeon_info_type);
- /* Save the size of "d_head" and "d_info" */
- d_head->head_size = sizeof(header);
- d_head->info_size = d_head->info_num * d_head->info_len;
/*** Make the fake arrays ***/
@@ -1364,15 +1166,9 @@ static errr init_d_info(void)
/* Build the filename */
path_build(buf, 1024, ANGBAND_DIR_EDIT, "d_info.txt");
- /* Grab permission */
- safe_setuid_grab();
-
/* Open the file */
fp = my_fopen(buf, "r");
- /* Drop permission */
- safe_setuid_drop();
-
/* Parse it */
if (!fp) quit("Cannot open 'd_info.txt' file.");
@@ -1432,57 +1228,27 @@ static errr init_player_info(void)
/* Allocate the "header" */
MAKE(rp_head, header);
- /* Save the "version" */
- rp_head->v_major = VERSION_MAJOR;
- rp_head->v_minor = VERSION_MINOR;
- rp_head->v_patch = VERSION_PATCH;
- rp_head->v_extra = 0;
-
/* Save the "record" information */
rp_head->info_num = max_rp_idx;
- rp_head->info_len = sizeof(player_race);
- /* Save the size of "rp_head" and "rp_info" */
- rp_head->head_size = sizeof(header);
- rp_head->info_size = rp_head->info_num * rp_head->info_len;
/*** Make the header ***/
/* Allocate the "header" */
MAKE(rmp_head, header);
- /* Save the "version" */
- rmp_head->v_major = VERSION_MAJOR;
- rmp_head->v_minor = VERSION_MINOR;
- rmp_head->v_patch = VERSION_PATCH;
- rmp_head->v_extra = 0;
-
/* Save the "record" information */
rmp_head->info_num = max_rmp_idx;
- rmp_head->info_len = sizeof(player_race_mod);
- /* Save the size of "rmp_head" and "rmp_info" */
- rmp_head->head_size = sizeof(header);
- rmp_head->info_size = rmp_head->info_num * rmp_head->info_len;
/*** Make the header ***/
/* Allocate the "header" */
MAKE(c_head, header);
- /* Save the "version" */
- c_head->v_major = VERSION_MAJOR;
- c_head->v_minor = VERSION_MINOR;
- c_head->v_patch = VERSION_PATCH;
- c_head->v_extra = 0;
-
/* Save the "record" information */
c_head->info_num = max_c_idx;
- c_head->info_len = sizeof(player_class);
- /* Save the size of "c_head" and "c_info" */
- c_head->head_size = sizeof(header);
- c_head->info_size = c_head->info_num * c_head->info_len;
/*** Make the fake arrays ***/
@@ -1526,15 +1292,9 @@ static errr init_player_info(void)
/* Build the filename */
path_build(buf, 1024, ANGBAND_DIR_EDIT, "p_info.txt");
- /* Grab permission */
- safe_setuid_grab();
-
/* Open the file */
fp = my_fopen(buf, "r");
- /* Drop permission */
- safe_setuid_drop();
-
/* Parse it */
if (!fp) quit("Cannot open 'p_info.txt' file.");
@@ -1595,19 +1355,9 @@ static errr init_st_info(void)
/* Allocate the "header" */
MAKE(st_head, header);
- /* Save the "version" */
- st_head->v_major = VERSION_MAJOR;
- st_head->v_minor = VERSION_MINOR;
- st_head->v_patch = VERSION_PATCH;
- st_head->v_extra = 0;
-
/* Save the "record" information */
st_head->info_num = max_st_idx;
- st_head->info_len = sizeof(store_info_type);
- /* Save the size of "st_head" and "st_info" */
- st_head->head_size = sizeof(header);
- st_head->info_size = st_head->info_num * st_head->info_len;
/*** Make the fake arrays ***/
@@ -1626,15 +1376,9 @@ static errr init_st_info(void)
/* Build the filename */
path_build(buf, 1024, ANGBAND_DIR_EDIT, "st_info.txt");
- /* Grab permission */
- safe_setuid_grab();
-
/* Open the file */
fp = my_fopen(buf, "r");
- /* Drop permission */
- safe_setuid_drop();
-
/* Parse it */
if (!fp) quit("Cannot open 'st_info.txt' file.");
@@ -1690,19 +1434,9 @@ static errr init_ow_info(void)
/* Allocate the "header" */
MAKE(ow_head, header);
- /* Save the "version" */
- ow_head->v_major = VERSION_MAJOR;
- ow_head->v_minor = VERSION_MINOR;
- ow_head->v_patch = VERSION_PATCH;
- ow_head->v_extra = 0;
-
/* Save the "record" information */
ow_head->info_num = max_ow_idx;
- ow_head->info_len = sizeof(owner_type);
- /* Save the size of "head" and "ow_info" */
- ow_head->head_size = sizeof(header);
- ow_head->info_size = ow_head->info_num * ow_head->info_len;
/*** Make the fake arrays ***/
@@ -1721,15 +1455,9 @@ static errr init_ow_info(void)
/* Build the filename */
path_build(buf, 1024, ANGBAND_DIR_EDIT, "ow_info.txt");
- /* Grab permission */
- safe_setuid_grab();
-
/* Open the file */
fp = my_fopen(buf, "r");
- /* Drop permission */
- safe_setuid_drop();
-
/* Parse it */
if (!fp) quit("Cannot open 'ow_info.txt' file.");
@@ -1785,19 +1513,9 @@ static errr init_ba_info(void)
/* Allocate the "header" */
MAKE(ba_head, header);
- /* Save the "version" */
- ba_head->v_major = VERSION_MAJOR;
- ba_head->v_minor = VERSION_MINOR;
- ba_head->v_patch = VERSION_PATCH;
- ba_head->v_extra = 0;
-
/* Save the "record" information */
ba_head->info_num = max_ba_idx;
- ba_head->info_len = sizeof(store_action_type);
- /* Save the size of "head" and "ba_info" */
- ba_head->head_size = sizeof(header);
- ba_head->info_size = ba_head->info_num * ba_head->info_len;
/*** Make the fake arrays ***/
@@ -1816,15 +1534,9 @@ static errr init_ba_info(void)
/* Build the filename */
path_build(buf, 1024, ANGBAND_DIR_EDIT, "ba_info.txt");
- /* Grab permission */
- safe_setuid_grab();
-
/* Open the file */
fp = my_fopen(buf, "r");
- /* Drop permission */
- safe_setuid_drop();
-
/* Parse it */
if (!fp) quit("Cannot open 'ba_info.txt' file.");
@@ -1880,19 +1592,9 @@ static errr init_wf_info(void)
/* Allocate the "header" */
MAKE(wf_head, header);
- /* Save the "version" */
- wf_head->v_major = VERSION_MAJOR;
- wf_head->v_minor = VERSION_MINOR;
- wf_head->v_patch = VERSION_PATCH;
- wf_head->v_extra = 0;
-
/* Save the "record" information */
wf_head->info_num = max_wf_idx;
- wf_head->info_len = sizeof(wilderness_type_info);
- /* Save the size of "wf_head" and "wf_info" */
- wf_head->head_size = sizeof(header);
- wf_head->info_size = wf_head->info_num * wf_head->info_len;
/*** Make the fake arrays ***/
@@ -1913,15 +1615,9 @@ static errr init_wf_info(void)
/* Build the filename */
path_build(buf, 1024, ANGBAND_DIR_EDIT, "wf_info.txt");
- /* Grab permission */
- safe_setuid_grab();
-
/* Open the file */
fp = my_fopen(buf, "r");
- /* Drop permission */
- safe_setuid_drop();
-
/* Parse it */
if (!fp) quit("Cannot open 'wf_info.txt' file.");
@@ -1979,19 +1675,9 @@ static errr init_t_info(void)
/* Allocate the "header" */
MAKE(t_head, header);
- /* Save the "version" */
- t_head->v_major = VERSION_MAJOR;
- t_head->v_minor = VERSION_MINOR;
- t_head->v_patch = VERSION_PATCH;
- t_head->v_extra = 0;
-
/* Save the "record" information */
t_head->info_num = max_t_idx;
- t_head->info_len = sizeof(trap_type);
- /* Save the size of "t_head" and "t_info" */
- t_head->head_size = sizeof(header);
- t_head->info_size = t_head->info_num * t_head->info_len;
/*** Make the fake arrays ***/
@@ -2012,15 +1698,9 @@ static errr init_t_info(void)
/* Build the filename */
path_build(buf, 1024, ANGBAND_DIR_EDIT, "tr_info.txt");
- /* Grab permission */
- safe_setuid_grab();
-
/* Open the file */
fp = my_fopen(buf, "r");
- /* Drop permission */
- safe_setuid_drop();
-
/* Parse it */
if (!fp) quit("Cannot open 'tr_info.txt' file.");
@@ -2076,20 +1756,9 @@ errr init_al_info(void)
/* Allocate the "header" */
MAKE(al_head, header);
- /* Save the "version" */
- al_head->v_major = VERSION_MAJOR;
- al_head->v_minor = VERSION_MINOR;
- al_head->v_patch = VERSION_PATCH;
- al_head->v_extra = 0;
-
/* Save the "record" information */
al_head->info_num = max_al_idx;
- al_head->info_len = sizeof(alchemist_recipe);
-
- /* Save the size of "al_head" and "al_info" */
- al_head->head_size = sizeof(header);
- al_head->info_size = al_head->info_num * al_head->info_len;
@@ -2119,15 +1788,9 @@ errr init_al_info(void)
/* Build the filename */
path_build(buf, 1024, ANGBAND_DIR_EDIT, "al_info.txt");
- /* Grab permission */
- safe_setuid_grab();
-
/* Open the file */
fp = my_fopen(buf, "r");
- /* Drop permission */
- safe_setuid_drop();
-
/* Parse it */
if (!fp) quit("Cannot open 'al_info.txt' file.");
@@ -2184,19 +1847,9 @@ errr init_v_info(void)
/* Allocate the "header" */
MAKE(v_head, header);
- /* Save the "version" */
- v_head->v_major = VERSION_MAJOR;
- v_head->v_minor = VERSION_MINOR;
- v_head->v_patch = VERSION_PATCH;
- v_head->v_extra = 0;
-
/* Save the "record" information */
v_head->info_num = max_v_idx;
- v_head->info_len = sizeof(vault_type);
- /* Save the size of "v_head" and "v_info" */
- v_head->head_size = sizeof(header);
- v_head->info_size = v_head->info_num * v_head->info_len;
/*** Make the fake arrays ***/
@@ -2217,15 +1870,9 @@ errr init_v_info(void)
/* Build the filename */
path_build(buf, 1024, ANGBAND_DIR_EDIT, "v_info.txt");
- /* Grab permission */
- safe_setuid_grab();
-
/* Open the file */
fp = my_fopen(buf, "r");
- /* Drop permission */
- safe_setuid_drop();
-
/* Parse it */
if (!fp) quit("Cannot open 'v_info.txt' file.");
@@ -2271,7 +1918,7 @@ static void init_basic()
/* Macro variables */
C_MAKE(macro__pat, MACRO_MAX, cptr);
C_MAKE(macro__act, MACRO_MAX, cptr);
- C_MAKE(macro__cmd, MACRO_MAX, bool);
+ C_MAKE(macro__cmd, MACRO_MAX, bool_);
/* Macro action buffer */
C_MAKE(macro__buf, 1024, char);
@@ -2289,7 +1936,7 @@ static void init_basic()
/*
* Pseudo, dummy quest initializer, to actualy disable them
*/
-static bool quest_disable_init_hook(int q_idx)
+static bool_ quest_disable_init_hook(int q_idx)
{
q_idx = q_idx;
return FALSE;
@@ -2366,7 +2013,7 @@ static errr init_misc(void)
process_hooks(HOOK_INIT_GAME, "(s)", "begin");
/* Initialise the values */
- process_dungeon_file(NULL, "misc.txt", &ystart, &xstart, 0, 0, TRUE);
+ process_dungeon_file("misc.txt", &ystart, &xstart, 0, 0, TRUE, FALSE);
/* Init the spell effects */
for (i = 0; i < MAX_EFFECTS; i++)
@@ -2464,19 +2111,19 @@ static errr init_wilderness(void)
void reinit_powers_type(s16b new_size)
{
power_type *new_powers_type;
- bool *new_powers;
+ bool_ *new_powers;
C_MAKE(new_powers_type, new_size, power_type);
- C_MAKE(new_powers, new_size, bool);
+ C_MAKE(new_powers, new_size, bool_);
/* Reallocate the extra memory */
if (powers_type && p_ptr->powers)
{
C_COPY(new_powers_type, powers_type, power_max, power_type);
- C_COPY(new_powers, p_ptr->powers, power_max, bool);
+ C_COPY(new_powers, p_ptr->powers, power_max, bool_);
C_FREE(powers_type, power_max, power_type);
- C_FREE(p_ptr->powers, power_max, bool);
+ C_FREE(p_ptr->powers, power_max, bool_);
}
powers_type = new_powers_type;
@@ -2540,7 +2187,7 @@ void init_schools(s16b new_size)
void init_corruptions(s16b new_size)
{
/* allocate the extra memory */
- C_MAKE(p_ptr->corruptions, new_size, bool);
+ C_MAKE(p_ptr->corruptions, new_size, bool_);
max_corruptions = new_size;
}
@@ -2554,9 +2201,9 @@ static errr init_other(void)
/*** Prepare the "dungeon" information ***/
/* Allocate and Wipe the special gene flags */
- C_MAKE(m_allow_special, max_r_idx, bool);
- C_MAKE(k_allow_special, max_k_idx, bool);
- C_MAKE(a_allow_special, max_a_idx, bool);
+ C_MAKE(m_allow_special, max_r_idx, bool_);
+ C_MAKE(k_allow_special, max_k_idx, bool_);
+ C_MAKE(a_allow_special, max_a_idx, bool_);
/*** Prepare "vinfo" array ***/
@@ -2580,7 +2227,7 @@ static errr init_other(void)
/* Allocate and Wipe the special levels */
for (i = 0; i < MAX_DUNGEON_DEPTH; i++)
{
- C_MAKE(special_lvl[i], max_d_idx, bool);
+ C_MAKE(special_lvl[i], max_d_idx, bool_);
}
/* Allocate and wipe each line of the cave */
@@ -2690,15 +2337,13 @@ static errr init_alloc(void)
s16b aux[MAX_DEPTH_MONSTER];
- s16b *tmp;
-
/*** Analyze object allocation info ***/
/* Clear the "aux" array */
- tmp = C_WIPE(&aux, MAX_DEPTH_MONSTER, s16b);
+ C_WIPE(&aux, MAX_DEPTH_MONSTER, s16b);
/* Clear the "num" array */
- tmp = C_WIPE(&num, MAX_DEPTH_MONSTER, s16b);
+ C_WIPE(&num, MAX_DEPTH_MONSTER, s16b);
/* Size of "alloc_kind_table" */
alloc_kind_size = 0;
@@ -2784,10 +2429,10 @@ static errr init_alloc(void)
/*** Analyze monster allocation info ***/
/* Clear the "aux" array */
- tmp = C_WIPE(&aux, MAX_DEPTH_MONSTER, s16b);
+ C_WIPE(&aux, MAX_DEPTH_MONSTER, s16b);
/* Clear the "num" array */
- tmp = C_WIPE(&num, MAX_DEPTH_MONSTER, s16b);
+ C_WIPE(&num, MAX_DEPTH_MONSTER, s16b);
/* Size of "alloc_race_table" */
alloc_race_size = 0;
@@ -3043,15 +2688,9 @@ void init_angband(void)
/* Build the filename */
path_build(buf, sizeof(buf), ANGBAND_DIR_FILE, news_file);
- /* Grab permission */
- safe_setuid_grab();
-
/* Attempt to open the file */
fd = fd_open(buf, O_RDONLY);
- /* Drop permission */
- safe_setuid_drop();
-
/* Failure */
if (fd < 0)
{
@@ -3076,15 +2715,9 @@ void init_angband(void)
/* Build the filename */
path_build(buf, sizeof(buf), ANGBAND_DIR_FILE, news_file);
- /* Grab permission */
- safe_setuid_grab();
-
/* Open the News file */
fp = my_fopen(buf, "r");
- /* Drop permission */
- safe_setuid_drop();
-
/* Dump */
if (fp)
{
@@ -3110,30 +2743,18 @@ void init_angband(void)
/* Build the filename */
path_build(buf, 1024, ANGBAND_DIR_APEX, "scores.raw");
- /* Grab permission */
- safe_setuid_grab();
-
/* Attempt to open the high score file */
fd = fd_open(buf, O_RDONLY);
- /* Drop permission */
- safe_setuid_drop();
-
/* Failure */
if (fd < 0)
{
/* File type is "DATA" */
FILE_TYPE(FILE_TYPE_DATA);
- /* Grab permission */
- safe_setuid_grab();
-
/* Create a new high score file */
fd = fd_make(buf, mode);
- /* Drop permission */
- safe_setuid_drop();
-
/* Failure */
if (fd < 0)
{
@@ -3153,9 +2774,6 @@ void init_angband(void)
/*** Initialise some arrays ***/
- /* Initilize the socket */
- zsock_init();
-
/* Initialise misc. values */
note("[Initialising values... (misc)]");
if (init_misc()) quit("Cannot initialise misc. values");
diff --git a/src/irc.c b/src/irc.c
deleted file mode 100644
index 7d87d38f..00000000
--- a/src/irc.c
+++ /dev/null
@@ -1,297 +0,0 @@
-/* File: irc.c */
-
-/* Purpose: irc chat */
-
-/*
- * Copyright (c) 2001 DarkGod, Andrew Sidwell
- *
- * This software may be copied and distributed for educational, research, and
- * not for profit purposes provided that this copyright and statement are
- * included in all such copies.
- */
-
-#include "angband.h"
-
-#define IRC_SERVER "irc.worldirc.org"
-#define IRC_PORT "6667"
-#define IRC_CHANNEL "#tome"
-
-/*
- * By the way, CTCP's for unique kills and artefact finds would be nice to
- * have, for example:
- *
- * *pelpel finds Long Sword 'Ringil' (4d5) (+22,+25) (+10 to speed) :)
- */
-
-ip_connection tome_irc_forge;
-ip_connection *tome_irc = &tome_irc_forge;
-bool irc_can_join = FALSE;
-char irc_nick[30];
-char irc_world[100];
-
-void irc_connect()
-{
- char buf[500], *s;
- int rnd_name = randint(999);
-
- if (tome_irc->connected) return;
-
- sprintf(irc_world, "%99s", IRC_CHANNEL);
- sprintf(irc_nick, "Dummy_%03d", rnd_name);
- get_string("Enter Nickname: ", irc_nick, 10);
-
- zsock.setup(tome_irc, IRC_SERVER, atoi(IRC_PORT), ZSOCK_TYPE_TCP, FALSE);
- zsock.open(tome_irc);
- zsock.write_simple(tome_irc, format("NICK %s\r\n", irc_nick));
- zsock.wait(tome_irc, 40);
- zsock.read_simple(tome_irc, buf, 500);
- s = strchr(buf, ':');
- zsock.write_simple(tome_irc, format("PONG %s\r\n", s));
- zsock.write_simple(tome_irc, format("USER tome 0 *BIRC :%s %d.%d.%d User\r\n",
- game_module, VERSION_MAJOR, VERSION_MINOR, VERSION_PATCH));
-#if 0 /* Pfft spoilsport */
- while (!irc_can_join)
- irc_poll();
-#endif
-
- zsock.write_simple(tome_irc, format("JOIN %s\r\n", irc_world));
-
- cmsg_print(TERM_L_GREEN, "Connected to IRC");
-
- zsock.add_timer(irc_poll);
-}
-
-void irc_change_nick()
-{
- return;
-}
-
-void irc_disconnect()
-{
- if (!tome_irc->connected) return;
- irc_can_join = FALSE;
-
- irc_quit(format("%s %d.%d.%d", game_module, VERSION_MAJOR, VERSION_MINOR, VERSION_PATCH));
-
- cmsg_print(TERM_L_RED, "Disconnected from IRC");
-}
-
-void irc_disconnect_aux(char *str, bool message)
-{
- if (!tome_irc->connected) return;
- irc_can_join = FALSE;
-
- irc_quit(str);
-
- if (message) cmsg_print(TERM_L_RED, "Disconnected from IRC");
-}
-
-void irc_emote(char *buf)
-{
- char *b;
- char *base = "PRIVMSG %s :%cACTION %s%c\r\n";
-
- if (!tome_irc->connected) return;
-
- C_MAKE(b, strlen(buf) + strlen(base) + 1, char);
- sprintf(b, base, irc_world, 1, buf, 1);
- zsock.write_simple(tome_irc, b);
- sprintf(b, "* %s %s", irc_nick, buf);
- message_add(MESSAGE_IRC, b, TERM_YELLOW);
- C_FREE(b, strlen(buf) + strlen(base) + 1, char);
- fix_irc_message();
-}
-
-void irc_chat()
-{
- char buf[80] = "";
-
- if (!tome_irc->connected) return;
- if (get_string("Say: ", buf, 80))
- {
- if (prefix(buf, "/me "))
- {
- irc_emote(buf + 4);
- }
- else if ((prefix(buf, "/join ")) && (buf[6] != '\0'))
- {
- zsock.write_simple(tome_irc, format("PART %s\r\n", irc_world));
- sprintf(irc_world, "%99s", buf + 6);
- zsock.write_simple(tome_irc, format("JOIN %s\r\n", irc_world));
- }
- else
- {
- zsock.write_simple(tome_irc, format("PRIVMSG %s :%s\r\n", irc_world, buf /*, 3, irc_world */));
- message_add(MESSAGE_IRC, format("<%s> #w%s", irc_nick, buf), TERM_L_BLUE);
- fix_irc_message();
- }
- }
-}
-
-#define TERM_CTCP TERM_L_GREEN
-#define TERM_SERVER TERM_L_BLUE
-#define TERM_CHAT1 TERM_YELLOW
-#define TERM_CHAT2 TERM_WHITE
-
-void irc_poll()
-{
- char buf[5000], *next, *nick, *space;
-
- if (tome_irc->connected && zsock.can_read(tome_irc))
- {
- zsock.read_simple(tome_irc, buf, 2500);
-
- if (prefix(buf, "PING "))
- {
- message_add(MESSAGE_IRC, format("*** Recieved a PING request from server %s.", buf + 6), TERM_SERVER);
- zsock.write_simple(tome_irc, format("PONG %s\r\n", buf + 5));
- return;
- }
- if (*buf != ':') return;
- nick = buf + 1;
-
- space = strchr(nick, ' ');
- if (space)
- {
- if (prefix(space + 1, "376"))
- irc_can_join = TRUE;
- }
-
- if (prefix(nick, "_"))
- {
- nick = buf + 6;
- }
-
- next = strchr(nick, '!');
- if (next == NULL) return;
- *next = '\0';
- next++;
- next = strchr(next, ' ');
- if (next == NULL) return;
- next++;
- if (prefix(next, "PRIVMSG"))
- {
- next = strchr(next, ':');
- if (next == NULL) return;
- *next = '\0';
- next++;
- if (*next == 1)
- {
- next++;
- if (prefix(next, "ACTION"))
- {
- u32b i = 0, j = 0, max = (79 - strlen(nick) - 3);
- bool nicked = FALSE;
- char tmp[90];
-
- next += 7;
- if (strlen(next)) next[strlen(next) - 1] = '\0';
-
- while (next[i])
- {
- tmp[j++] = next[i++];
- if (j > max)
- {
- tmp[j] = '\0';
- if (nicked)
- message_add(MESSAGE_IRC, format("%s", tmp), TERM_CHAT1);
- else
- message_add(MESSAGE_IRC, format("* %s %s", nick, tmp), TERM_CHAT1);
- nicked = TRUE;
- j = 0;
- }
- }
- if (j > 0)
- {
- tmp[j] = '\0';
- if (nicked)
- message_add(MESSAGE_IRC, format("%s", tmp), TERM_CHAT1);
- else
- message_add(MESSAGE_IRC, format("* %s %s", nick, tmp), TERM_CHAT1);
- }
-
- fix_irc_message();
- }
- else if (prefix(next, "PING"))
- {
- message_add(MESSAGE_IRC, format("*** PING request from %s", nick), TERM_CTCP);
- fix_irc_message();
-
- zsock.write_simple(tome_irc, format("NOTICE %s :%cPING %d%c\r\n", nick, 1, next, 1));
- }
- else if (prefix(next, "NICK"))
- {
- message_add(MESSAGE_IRC, format("*** NICK request from %s", nick), TERM_CTCP);
- fix_irc_message();
-
- zsock.write_simple(tome_irc, format("NOTICE %s :%cNICK %s%c\r\n", nick, 1, irc_nick, 1));
- }
- else if (prefix(next, "VERSION"))
- {
- message_add(MESSAGE_IRC, format("*** VERSION request from %s", nick), TERM_CTCP);
- fix_irc_message();
-
- zsock.write_simple(tome_irc, format("NOTICE %s :%cVERSION %s %d.%d.%d%c\r\n", nick, 1, game_module, VERSION_MAJOR, VERSION_MINOR, VERSION_PATCH, 1));
- }
- }
- else
- {
- u32b i = 0, j = 0, max = (79 - strlen(nick) - 3);
- bool nicked = FALSE;
- char tmp[90];
-
- while (next[i])
- {
- tmp[j++] = next[i++];
- if (j > max)
- {
- tmp[j] = '\0';
- if (nicked)
- message_add(MESSAGE_IRC, format("#w%s", tmp), TERM_CHAT1);
- else
- message_add(MESSAGE_IRC, format("#y<%s> #w%s", nick, tmp), TERM_CHAT1);
- nicked = TRUE;
- j = 0;
- }
- }
- if (j > 0)
- {
- tmp[j] = '\0';
- if (nicked)
- message_add(MESSAGE_IRC, format("#w%s", tmp), TERM_CHAT1);
- else
- message_add(MESSAGE_IRC, format("#y<%s> #w%s", nick, tmp), TERM_CHAT1);
- }
- fix_irc_message();
- }
- }
- if (prefix(next, "JOIN"))
- {
- message_add(MESSAGE_IRC, format("%s has entered the Chatroom", nick), TERM_YELLOW);
- fix_irc_message();
- }
- if (prefix(next, "QUIT"))
- {
- next = strchr(next, ':');
- if (next == NULL) return;
- *next = '\0';
- next++;
- message_add(MESSAGE_IRC, format("%s has quit the Chatroom (%s)", nick, next), TERM_YELLOW);
- fix_irc_message();
- }
- }
-}
-
-
-void irc_quit(char *str)
-{
- char buf[300];
-
- zsock.remove_timer(irc_poll);
-
- sprintf(buf, "QUIT :%s\r\n", str);
-
- zsock.write_simple(tome_irc, buf);
- zsock.close(tome_irc);
- zsock.unsetup(tome_irc);
-}
diff --git a/src/iso/hackdef.h b/src/iso/hackdef.h
deleted file mode 100644
index 413d77ad..00000000
--- a/src/iso/hackdef.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/* hackdef.h
- *
- * Copyright (c) 2001 Hansjörg Malthaner
- * hansjoerg.malthaner@gmx.de
- *
- * This file is part of the Simugraph<->Angband adaption code.
- *
- *
- * This file may be copied and modified freely so long as the above credits,
- * this paragraph, and the below disclaimer of warranty are retained; no
- * financial profit is derived from said modification or copying; and all
- * licensing rights to any modifications are granted to the original author,
- * Hansjörg Malthaner.
- *
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
- * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
- * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
- * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- */
-
-/* hackdef.c
- * definion of hacklevel for iso view
- *
- * Hj. Maltahner, Feb. 2001
- */
-
-
-/*
- * this enables somthing like a bigscreen mode but keeps a
- * resonable clean interfacing between iso-view and angband
- * this requires changes to map_info() to support clipping.
- *
- * Hj. Maltahner, Feb. 2001
- */
-#define USE_SMALL_ISO_HACK
diff --git a/src/iso/readme.txt b/src/iso/readme.txt
deleted file mode 100644
index ecef9638..00000000
--- a/src/iso/readme.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-The iso view sources will reside here.
-
-At the moment this is just a test for CVS access.
-
---
-Hansjoerg Malthaner
diff --git a/src/iso/simgraph.c b/src/iso/simgraph.c
deleted file mode 100644
index 1797f037..00000000
--- a/src/iso/simgraph.c
+++ /dev/null
@@ -1,1429 +0,0 @@
-/* simgraph.c
- *
- * Copyright (c) 2001 Hansjörg Malthaner
- * hansjoerg.malthaner@gmx.de
- *
- * This file is part of the Simugraph graphics engine.
- *
- *
- * This file may be copied and modified freely so long as the above credits,
- * this paragraph, and the below disclaimer of warranty are retained; no
- * financial profit is derived from said modification or copying; and all
- * licensing rights to any modifications are granted to the original author,
- * Hansjörg Malthaner.
- *
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
- * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
- * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
- * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- */
-
-
-/* simgraph.c
- *
- * Versuch einer Graphic fuer Simulationsspiele
- * Hj. Malthaner, Aug. 1997
- *
- * A try to create a graphics engine for simulation games.
- *
- * 3D, isometrische Darstellung
- *
- * 3D, isometric display
- *
- *
- * 18.11.97 lineare Speicherung fuer Images -> hoehere Performance
- * 22.03.00 run längen Speicherung fuer Images -> hoehere Performance
- * 15.08.00 dirty tile verwaltung fuer effizientere updates
- */
-
-//#define DEBUG 1
-
-
-#if defined(MSDOS) || defined(__MINGW32__)
-#define USE_SOFTPOINTER
-#endif
-
-#include <stdlib.h>
-#include <string.h>
-#include <stdio.h>
-#include <math.h>
-
-#include "simgraph.h"
-#include "simsys.h"
-
-extern unsigned int class;
-extern unsigned int code;
-extern int mx,my; /* es sind negative Koodinaten mgl */
-
-#ifdef USE_SOFTPOINTER
-static int softpointer = 261;
-static int old_my = -1; // die icon leiste muss neu gezeichnet werden wenn der
- // Mauszeiger darueber schwebt
-#endif
-
-static unsigned char dr_fonttab[2048]; /* Unser Zeichensatz sitzt hier */
-
-/*
- * pixel value type, RGB 555
- */
-typedef unsigned short PIXVAL;
-
-
-struct imd {
- int y; // offset top
- int h; // image height
- int len; // data length in entities of PIXVAL size
- PIXVAL * data; // iamge data
-};
-
-
-static int anz_images = 0;
-
-static int disp_width = 640;
-static int disp_height = 480;
-
-/**
- * Tile size in pixels
- *
- * @author Hj. Malthaner
- */
-static int tile_size = 32;
-
-static struct imd *images = NULL;
-static struct imd *images1 = NULL;
-static struct imd *images2 = NULL;
-
-
-static PIXVAL *textur = NULL;
-
-
-static struct clip_dimension clip_rect;
-
-
-// dirty tile management strcutures
-
-#define DIRTY_TILE_SIZE 32
-#define DIRTY_TILE_SHIFT 5
-
-static char *tile_dirty = NULL;
-static char *tile_dirty_old = NULL;
-
-static int tiles_per_line = 0;
-static int tile_lines = 0;
-
-
-// colormap management structures
-
-static unsigned char day_pal[256*3];
-static unsigned char night_pal[256*3];
-static unsigned char base_pal[256*3];
-
-static int light_level = 0;
-static int color_level = 1;
-
-
-// ------------ procedure like defines --------------------
-
-
-#define mark_tile_dirty(x,y) tile_dirty[(x) + (y)*tiles_per_line] = 1
-#define is_tile_dirty(x,y) ((tile_dirty[(x) + (y)*tiles_per_line]) || (tile_dirty_old[(x) + (y)*tiles_per_line]) )
-
-// ----------------- procedures ---------------------------
-
-
-/**
- * Markiert ein Tile as schmutzig, ohne Clipping
- * @author Hj. Malthaner
- */
-static void mark_rect_dirty_nc(int x1, int y1, int x2, int y2)
-{
- int x, y;
-
- // floor to tile size
-
- x1 >>= DIRTY_TILE_SHIFT;
- y1 >>= DIRTY_TILE_SHIFT;
- x2 >>= DIRTY_TILE_SHIFT;
- y2 >>= DIRTY_TILE_SHIFT;
-
- for(y=y1; y<=y2; y++) {
- for(x=x1; x<=x2; x++) {
- mark_tile_dirty(x, y);
- }
- }
-}
-
-/**
- * Markiert ein Tile as schmutzig, mit Clipping
- * @author Hj. Malthaner
- */
-void mark_rect_dirty_wc(int x1, int y1, int x2, int y2)
-{
- if(x1 < 0) x1 = 0;
- if(x1 >= disp_width) x1 = disp_width-1;
-
- if(y1 < 0) y1 = 0;
- if(y1 >= disp_height) y1 = disp_height-1;
-
- if(x2 < 0) x2 = 0;
- if(x2 >= disp_width) x2 = disp_width-1;
-
- if(y2 < 0) y2 = 0;
- if(y2 >= disp_height) y2 = disp_height-1;
-
- mark_rect_dirty_nc(x1, y1, x2, y2);
-}
-
-/**
- * Clipped einen Wert in Intervall
- * @author Hj. Malthaner
- */
-static int clip(int w, int u, int o)
-{
- return w < u ? u : w > o ? o : w;
-}
-
-
-/**
- * Laedt den Font
- * @author Hj. Malthaner
- */
-static void init_font()
-{
- FILE *f = NULL;
-
- // suche in ./draw.fnt
-
- if(f==NULL ) {
- f=fopen("./draw.fnt","rb");
- }
-
- if(f==NULL) {
- printf("Cannot open draw.fnt!\n");
- exit(1);
- } else {
- int i;
- for(i=0;i<2048;i++) dr_fonttab[i]=getc(f);
- fclose(f);
- }
-}
-
-/**
- * Laedt die Palette
- * @author Hj. Malthaner
- */
-static int
-load_palette(const char *fname, unsigned char *palette)
-{
- FILE *file = fopen(fname,"rb");
-
- if(file) {
-
- int x;
- int anzahl=256;
- int r,g,b;
-
- fscanf(file, "%d", &anzahl);
-
- for(x=0; x<anzahl; x++) {
- fscanf(file,"%d %d %d", &r, &g, &b);
-
- palette[x*3+0] = r;
- palette[x*3+1] = g;
- palette[x*3+2] = b;
- }
- dr_setRGB8multi(0, anzahl, palette);
-
- fclose(file);
-
- return TRUE;
- } else {
- fprintf(stderr, "Error: can't open file '%s' for reading\n", fname);
- return FALSE;
- }
-}
-
-
-/**
- * Dims (darkens) a color.
- * @return darkended color.
- * @author Hj. Malthaner
- */
-static inline int darken(const int dunkel, const PIXVAL farbe)
-{
- int r,g,b;
-
- r = (farbe & 0x7C00) - (dunkel << 10);
-
- if(r < 0) {
- r = 0;
- }
-
- g = (farbe & 0x03E0) - (dunkel << 5);
-
- if(g < 0) {
- g = 0;
- }
-
- b = (farbe & 0x001F) - dunkel;
-
- if(b < 0) {
- b = 0;
- }
-
- return (r & 0x7C00) + (g & 0x03E0) + b;
-}
-
-
-int display_get_width()
-{
- return disp_width;
-}
-
-int display_get_height()
-{
- return disp_height;
-}
-
-
-/**
- * returns the currently used tile size in pixels
- *
- * @author Hj. Malthaner
- */
-int display_get_tile_size()
-{
- return tile_size;
-}
-
-
-/**
- * selects a tile size
- *
- * @param n 0 means 64x64 tiles, 1 are 32x32 tiles
- * @author Hj. Malthaner
- */
-void display_select_tile_size(int n)
-{
- switch(n) {
- case 0:
- tile_size = 64;
- images = images1;
- break;
-
- case 1:
- tile_size = 32;
- images = images2;
- break;
-
- default:
- tile_size = 64;
- images = images1;
- }
-
- printf("Switching to tile size %d\n", tile_size);
-}
-
-
-/**
- * Holt Helligkeitseinstellungen
- * @author Hj. Malthaner
- */
-int display_get_light()
-{
- return light_level;
-}
-
-
-/**
- * Setzt Helligkeitseinstellungen
- * @author Hj. Malthaner
- */
-void display_set_light(int new_light_level)
-{
- unsigned char palette[256*3];
- const double ll = 1.0 - light_level/20.0;
- int i;
-
- light_level = new_light_level;
-
- for(i=0; i<256; i++) {
- const int n = i*3;
- palette[n+0] = clip(pow(base_pal[n+0]/255.0, ll)*255.0, 0, 255);
- palette[n+1] = clip(pow(base_pal[n+1]/255.0, ll)*255.0, 0, 255);
- palette[n+2] = clip(pow(base_pal[n+2]/255.0, ll)*255.0, 0, 255);
- }
-
- dr_setRGB8multi(0, 256, palette);
-}
-
-/**
- * Holt Farbeinstellungen
- * @author Hj. Malthaner
- */
-int display_get_color()
-{
- return color_level;
-}
-
-
-/**
- * Setzt Farbeinstellungen
- * @author Hj. Malthaner
- */
-void display_set_color(int new_color_level)
-{
- color_level = new_color_level;
-
- if(color_level < 0) {
- color_level = 0;
- }
-
- if(color_level > 3) {
- color_level = 3;
- }
-
- switch(color_level) {
- case 0:
- load_palette("./simud70.pal", day_pal);
- load_palette("./simun70.pal", night_pal);
- break;
- case 1:
- load_palette("./simud80.pal", day_pal);
- load_palette("./simun80.pal", night_pal);
- break;
- case 2:
- load_palette("./simud90.pal", day_pal);
- load_palette("./simun90.pal", night_pal);
- break;
- case 3:
- load_palette("./simud100.pal", day_pal);
- load_palette("./simun100.pal", night_pal);
- break;
- }
-
- memcpy(base_pal, day_pal, 256*3);
- display_set_light(display_get_light());
-}
-
-
-static int night_shift = -1;
-
-static void calc_base_pal_from_night_shift(const int night)
-{
- const int day = 4 - night;
- int i;
-
- for(i=0; i<256; i++) {
- base_pal[i*3+0] = (day_pal[i*3+0] * day + night_pal[i*3+0] * night) >> 2;
- base_pal[i*3+1] = (day_pal[i*3+1] * day + night_pal[i*3+1] * night) >> 2;
- base_pal[i*3+2] = (day_pal[i*3+2] * day + night_pal[i*3+2] * night) >> 2;
- }
-}
-
-
-void display_day_night_shift(int night)
-{
- if(night != night_shift) {
- night_shift = night;
-
- calc_base_pal_from_night_shift(night);
-
- display_set_light(light_level);
- mark_rect_dirty_nc(0,0, disp_width-1, disp_height-1);
- }
-}
-
-
-
-/**
- * Setzt Farbeintrag
- * @author Hj. Malthaner
- */
-void display_set_player_colors(const unsigned char *day, const unsigned char *night)
-{
- memcpy(day_pal, day, 12);
- memcpy(night_pal, night, 12);
-
- calc_base_pal_from_night_shift(night_shift);
-
- display_set_light(light_level);
- mark_rect_dirty_nc(0,0, disp_width-1, disp_height-1);
-}
-
-
-/**
- * Liest 32Bit wert Plattfromunabhängig
- * @author Hj. Malthaner
- */
-static int fread_int(FILE *f)
-{
- int i = 0;
-
- i += fgetc(f);
- i += fgetc(f) << 8;
- i += fgetc(f) << 16;
- i += fgetc(f) << 24;
-
- return i;
-}
-
-
-/**
- * Laedt daten.pak
- * @author Hj. Malthaner
- */
-static struct imd * init_images(const char *filename)
-{
- FILE *f = fopen(filename, "rb");
- struct imd * images = NULL;
-
- if( f ) {
- int i;
-
- anz_images = fread_int(f);
- images = malloc(sizeof(struct imd)*anz_images);
-
-
- for(i=0; i<anz_images; i++) {
- images[i].y = fread_int(f);
- images[i].h = fread_int(f);
- images[i].len = fread_int(f);
-
-// printf("len = %d\n", images[i].len);
-
- if(images[i].h > 0) {
- images[i].data = malloc(images[i].len*sizeof(PIXVAL));
- fread(images[i].data, images[i].len*sizeof(PIXVAL), 1, f);
-
- } else {
- images[i].data = NULL;
- }
- }
-
- fclose(f);
- } else {
- printf("Kann '%s' nicht lesen.\n", filename);
- exit(1);
- }
-
- return images;
-}
-
-/**
- * Holt Maus X-Position
- * @author Hj. Malthaner
- */
-int gib_maus_x()
-{
- return mx;
-}
-
-/**
- * Holt Maus y-Position
- * @author Hj. Malthaner
- */
-int gib_maus_y()
-{
- return my;
-}
-
-
-/**
- * this sets width < 0 if the range is out of bounds
- * so check the value after calling and before displaying
- * @author Hj. Malthaner
- */
-static int clip_wh(int *x, int *width, const int min_width, const int max_width)
-{
- // doesnt check "wider than image" case
-
- if(*x < min_width) {
- const int xoff = min_width - (*x);
-
- *width += *x;
- *x = min_width;
- return xoff;
- } else if(*x + *width >= max_width) {
- *width = max_width - *x;
- }
- return 0;
-}
-
-
-/**
- * Ermittelt Clipping Rechteck
- * @author Hj. Malthaner
- */
-struct clip_dimension display_gib_clip_wh(void)
-{
- return clip_rect;
-}
-
-
-/**
- * Setzt Clipping Rechteck
- * @author Hj. Malthaner
- */
-void display_setze_clip_wh(int x, int y, int w, int h)
-{
- clip_wh(&x, &w, 0, disp_width);
- clip_wh(&y, &h, 0, disp_height);
-
- clip_rect.x = x;
- clip_rect.y = y;
- clip_rect.w = w;
- clip_rect.h = h;
-
- clip_rect.xx = x+w-1;
- clip_rect.yy = y+h-1;
-}
-
-// ----------------- basic painting procedures ----------------
-
-
-/**
- * Kopiert Pixel von src nach dest
- * @author Hj. Malthaner
- */
-static void pixcopy(PIXVAL *dest,
- const PIXVAL *src,
- int len)
-{
- memcpy(dest, src, len*sizeof(PIXVAL));
-}
-
-
-/**
- * Zeichnet Bild mit Clipping
- * @author Hj. Malthaner
- */
-static void
-display_img_wc(const int n, const int xp, const int yp, const int dirty)
-{
- if(n >= 0 && n < anz_images) {
-
- int h = images[n].h;
- int y = yp + images[n].y;
-
- int yoff = clip_wh(&y, &h, 0, clip_rect.yy);
-
- if(h > 0) {
- const int width = disp_width;
- const PIXVAL *sp = images[n].data;
- PIXVAL *tp = textur + y*width;
-
- if(dirty) {
- mark_rect_dirty_wc(xp, y, xp+tile_size-1, y+h+1);
- }
-
- // oben clippen
-
- while(yoff) {
- yoff --;
- do {
- if(*(++sp)) {
- sp += *sp + 1;
- }
- } while(*sp);
- sp ++;
- }
-
- do { // zeilen dekodieren
- int xpos = xp;
-
- // bild darstellen
-
- int runlen = *sp++;
-
- do {
- // wir starten mit einem clear run
-
- xpos += runlen;
-
- // jetzt kommen farbige pixel
- runlen = *sp++;
-
- if(runlen) {
-
- if(xpos >= 0 && runlen+xpos < width) {
-// pixcopy(tp+xpos, sp, runlen);
- memcpy(tp+xpos, sp, runlen*sizeof(PIXVAL));
- } else if(xpos < 0) {
- if(runlen+xpos > 0) {
-// pixcopy(tp, sp-xpos, runlen+xpos);
- memcpy(tp, sp-xpos, (runlen+xpos)*sizeof(PIXVAL));
- }
- } else if(width > xpos) {
-// pixcopy(tp+xpos, sp, width-xpos);
- memcpy(tp+xpos, sp, (width-xpos)*sizeof(PIXVAL));
- }
- sp += runlen;
- xpos += runlen;
- runlen = *sp ++;
- }
- } while(runlen);
-
- tp += width;
-
- } while(--h > 0);
- }
- }
-}
-
-/**
- * Zeichnet Bild ohne Clipping
- * @author Hj. Malthaner
- */
-static void
-display_img_nc(const int n, const int xp, const int yp, const int dirty)
-{
- if(n >= 0 && n < anz_images) {
-
- int h = images[n].h;
-
- if(h > 0) {
- const PIXVAL *sp = images[n].data;
- PIXVAL *tp = textur + (yp + images[n].y)*disp_width + xp;
-
- if(dirty) {
- mark_rect_dirty_nc(xp, yp+images[n].y, xp+tile_size-1, yp+images[n].y+h-1);
- }
-
- do { // zeilen dekodieren
-
- // bild darstellen
-
- int runlen = *sp++;
-
- do {
-
- // wir starten mit einem clear run
- tp += runlen;
-
- // jetzt kommen farbige pixel
- runlen = *sp++;
-
- if(runlen) {
-// pixcopy(tp, sp, runlen);
- memcpy(tp, sp, runlen*sizeof(PIXVAL));
- sp += runlen;
- tp += runlen;
- runlen = *sp++;
- }
- } while(runlen);
-
- tp += (disp_width-tile_size);
-
- } while(--h);
- }
- }
-}
-
-/**
- * Zeichnet Bild
- * @author Hj. Malthaner
- */
-void
-display_img(const int n, const int xp, const int yp, const int dirty)
-{
- if(xp>=0 && yp>=0 && xp < disp_width-tile_size-1 && yp < disp_height-tile_size-1) {
- display_img_nc(n, xp, yp, dirty);
- } else {
- if(xp>-tile_size && yp>-tile_size && xp < disp_width && yp < disp_height) {
- display_img_wc(n, xp, yp, dirty);
- }
- }
-}
-
-
-
-/**
- * Copies and shades colors
- * @param shade the amount to darken the color
- * @author Hj. Malthaner
- */
-static void colorpixcpy(PIXVAL *dest, const PIXVAL *src,
- const PIXVAL * const end,
- const PIXVAL shade)
-{
- while(src < end) {
- *dest++ = darken(shade, *src++);
- }
-}
-
-
-/**
- * Zeichnet Bild, ersetzt Spielerfarben
- * @author Hj. Malthaner
- */
-static void
-display_color_img_aux(const int n, const int xp, const int yp, const int color, const int dirty)
-{
- if(n >= 0 && n < anz_images) {
-
- int h = images[n].h;
- int y = yp + images[n].y;
-
- int yoff = clip_wh(&y, &h, 0, clip_rect.yy);
-
- if(h > 0) {
- const int width = disp_width;
- const PIXVAL *sp = images[n].data;
- PIXVAL *tp = textur + y*width;
-
-// printf("textur = %p tp = %p\n", textur, tp);
-
- if(dirty) {
- mark_rect_dirty_wc(xp, y+yoff, xp+tile_size-1, y+yoff+h-1);
- }
-
- // oben clippen
-
- while(yoff) {
- yoff --;
- do {
- if(*(++sp)) {
- sp += *sp + 1;
- }
- } while(*sp);
- sp ++;
- }
-
- do { // zeilen dekodieren
- int xpos = xp;
-
- // bild darstellen
-
- do {
- // wir starten mit einem clear run
-
- xpos += *sp ++;
-
- // jetzt kommen farbige pixel
-
- if(*sp) {
- const int runlen = *sp++;
-
- if(xpos >= 0 && runlen+xpos < width) {
- colorpixcpy(tp+xpos, sp, sp+runlen, color);
- } else if(xpos < 0) {
- if(runlen+xpos > 0) {
- colorpixcpy(tp, sp-xpos, sp+runlen, color);
- }
- } else if(width > xpos) {
- colorpixcpy(tp+xpos, sp, sp+width-xpos, color);
- }
-
- sp += runlen;
- xpos += runlen;
- }
- } while(*sp);
-
- tp += width;
- sp ++;
-
- } while(--h);
- }
- }
-}
-
-
-/**
- * Zeichnet Bild, ersetzt Farben
- * @author Hj. Malthaner
- */
-void
-display_color_img(const int n, const int xp, const int yp, const int color, const int dirty)
-{
- // since the colors for player 0 are already right,
- // only use the expensive replacement routine for colored images
- // of other players
-
- // printf("color=%d\n", color);
-
- if(color) {
- display_color_img_aux(n, xp, yp, color, dirty);
- } else {
- display_img_wc(n, xp, yp, dirty);
- }
-}
-
-/**
- * Zeichnet ein Pixel
- * @author Hj. Malthaner
- */
-void
-display_pixel(int x, int y, const int color)
-{
- if(x >= clip_rect.x && x<=clip_rect.xx &&
- y >= clip_rect.y && y<clip_rect.yy) {
-
- PIXVAL * const p = textur + x + y*disp_width;
- *p = color;
-
- mark_tile_dirty(x >> DIRTY_TILE_SHIFT, y >> DIRTY_TILE_SHIFT);
- }
-}
-
-
-/**
- * Zeichnet einen Text, lowlevel Funktion
- * @author Hj. Malthaner
- */
-static void
-dr_textur_text(PIXVAL *textur,int x,int y,const char *txt,
- const int chars, const int fgpen, const int dirty)
-{
- int p;
-
- y+=4; /* Korektu amiga <-> pc */
-
- if(y < 0 || y+8 >= disp_height)
- return; /* out of clip */
-
-
- if(dirty) {
- mark_rect_dirty_nc(x, y, x+chars*8-1, y+8-1);
- }
-
-
- for(p=0; p<chars; p++) { /* Zeichen fuer Zeichen ausgeben */
- int base=((unsigned char *)txt)[p] << 3; /* 8 Byte je Zeichen */
- const int end = base+8;
- int screen_pos = x + (p << 3) + y*disp_width;
-
-
- do {
- const int c=dr_fonttab[base++]; /* Eine Zeile des Zeichens */
- int b;
-
- for(b=0; b<8; b++) {
- if(c & (128 >> b)) {
- textur[screen_pos+b] = fgpen;
- }
- }
- screen_pos += disp_width;
- }while(base < end);
- }
-}
-
-
-/**
- * Zeichnet Text, highlevel Funktion
- * @author Hj. Malthaner
- */
-void
-display_text(int x, int y, const char *txt, const int color, int dirty)
-{
- const int chars = strlen(txt);
- const int text_width = chars*8;
-
- if(y >= 8 && y < disp_height-12) {
-
- if(x >= 0 && x+text_width < disp_width) {
- dr_textur_text(textur, x, y, txt, chars, color, dirty);
- } else {
- if(x < 0 && x+text_width > 8) {
- const int left_chars = (-x+7)/8;
-
- dr_textur_text(textur, (x & 7), y, txt+left_chars, chars-left_chars, color, dirty);
- } else if(x > 0 && x < disp_width-7) {
- const int rest_chars = (disp_width-x-1) / 8;
-
- dr_textur_text(textur, x, y, txt, rest_chars, color, dirty);
- }
- }
- }
-}
-
-/**
- * Zeichnet gefuelltes Rechteck, ohne clipping
- * @author Hj. Malthaner
- */
-void display_fb_internal(int xp, int yp, int w, int h,
- const int color, const int dirty,
- int cL, int cR, int cT, int cB)
-{
- clip_wh(&xp, &w, cL, cR);
- clip_wh(&yp, &h, cT, cB);
-
- if(w > 0 && h > 0) {
- PIXVAL *p = textur + xp + yp*disp_width;
-
- if(dirty) {
- mark_rect_dirty_nc(xp, yp, xp+w-1, yp+h-1);
- }
-
- do {
- memset(p, color, w*sizeof(PIXVAL));
- p += disp_width;
- } while(--h);
- }
-}
-
-void
-display_fillbox_wh(int xp, int yp, int w, int h,
- const int color, const int dirty)
-{
- display_fb_internal(xp,yp,w,h,color,dirty,
- 0,disp_width-1,0,disp_height-1);
-}
-void
-display_fillbox_wh_clip(int xp, int yp, int w, int h,
- const int color, const int dirty)
-{
- display_fb_internal(xp,yp,w,h,color,dirty,
- clip_rect.x, clip_rect.xx, clip_rect.y, clip_rect.yy);
-}
-
-/**
- * Zeichnet vertikale Linie
- * @author Hj. Malthaner
- */
-void
-display_vl_internal(const int xp, int yp, int h, const int color, int dirty,
- int cL, int cR, int cT, int cB)
-{
- clip_wh(&yp, &h, cT, cB);
-
- if(xp >= cL && xp <= cR && h > 0) {
- PIXVAL *p = textur + xp + yp*disp_width;
-
- if (dirty) {
- mark_rect_dirty_nc(xp, yp, xp, yp+h-1);
- }
-
- do {
- *p = color;
- p += disp_width;
- } while(--h);
- }
-}
-
-void
-display_vline_wh(int xp, int yp, int h, const int color, const int dirty)
-{
- display_vl_internal(xp,yp,h,color,dirty,
- 0,disp_width-1,0,disp_height-1);
-}
-
-void
-display_vline_wh_clip(int xp, int yp, int h, const int color, const int dirty)
-{
- display_vl_internal(xp,yp,h,color,dirty,
- clip_rect.x, clip_rect.xx, clip_rect.y, clip_rect.yy);
-}
-
-/**
- * Zeichnet rohe Pixeldaten
- * @author Hj. Malthaner
- */
-void
-display_array_wh(int xp, int yp, int w, int h, const unsigned char *arr)
-{
- const int arr_w = w;
-
- clip_wh(&xp, &w, 0, disp_width);
- clip_wh(&yp, &h, 0, disp_height);
-
- if(w > 0 && h > 0) {
- PIXVAL *p = textur + xp + yp*disp_width;
-
- mark_rect_dirty_nc(xp, yp, xp+w-1, yp+h-1);
-
- if(xp == 0) {
- arr += arr_w - w;
- }
-
- do {
- // FIXME!!!
- memcpy(p, arr, w);
- p += disp_width;
- arr += arr_w;
- } while(--h);
- }
-}
-
-
-// --------------- compound painting procedures ---------------
-
-
-/**
- * Zeichnet schattiertes Rechteck
- * @author Hj. Malthaner
- */
-void
-display_ddd_box(int x1, int y1, int w, int h, int tl_color, int rd_color)
-{
- display_fillbox_wh(x1, y1, w, 1, tl_color, TRUE);
- display_fillbox_wh(x1, y1+h-1, w, 1, rd_color, TRUE);
-
- h-=2;
-
- display_vline_wh(x1, y1+1, h, tl_color, TRUE);
- display_vline_wh(x1+w-1, y1+1, h, rd_color, TRUE);
-}
-
-/**
- * Zeichnet schattierten Text
- * @author Hj. Malthaner
- */
-void
-display_ddd_text(int xpos, int ypos, int hgt,
- int ddd_farbe, int text_farbe,
- const char *text, int dirty)
-{
- const int len = strlen(text)*4;
-
- display_fillbox_wh(xpos-2-len,
- ypos-hgt-6,
- 4 + len*2, 1,
- ddd_farbe+1,
- dirty);
- display_fillbox_wh(xpos-2-len,
- ypos-hgt-5,
- 4 + len*2, 8,
- ddd_farbe,
- dirty);
- display_fillbox_wh(xpos-2-len,
- ypos-hgt+3,
- 4 + len*2, 1,
- ddd_farbe-1,
- dirty);
-
- display_text(xpos - len,
- ypos-hgt-9,
- text,
- text_farbe,
- dirty);
-}
-
-
-/**
- * Zaehlt Vorkommen eines Buchstabens in einem String
- * @author Hj. Malthaner
- */
-int
-count_char(const char *str, const char c)
-{
- int count = 0;
-
- while(*str) {
- count += (*str++ == c);
- }
- return count;
-}
-
-/**
- * Zeichnet einen mehrzeiligen Text
- * @author Hj. Malthaner
- */
-void
-display_multiline_text(int x, int y, const char *inbuf, int color)
-{
- char tmp[4096];
- char *buf = tmp;
- char *next;
- int y_off = 0;
-
- // be sure not to copy more than buffer size
- strncpy(buf, inbuf, 4095);
-
- // always close with a 0 byte
- buf[4095] = 0;
-
- while( (*buf != 0) && (next = strchr(buf,'\n')) ) {
- *next = 0;
- display_text(x,y+y_off, buf, color, TRUE);
- buf = next+1;
- y_off += LINESPACE;
- }
-}
-
-
-/**
- * Loescht den Bildschirm
- * @author Hj. Malthaner
- */
-void
-display_clear()
-{
- memset(textur+32*disp_width, 32, disp_width*(disp_height-17-32));
-
- mark_rect_dirty_nc(0, 0, disp_width-1, disp_height-1);
-}
-
-
-#if 0
-void display_flush_buffer()
-{
- int x, y;
- char * tmp;
-
-#ifdef USE_SOFTPOINTER
- display_img(softpointer, mx, my, TRUE);
- old_my = my;
-#endif
-
-#ifdef DEBUG
- // just for debugging
- int tile_count = 0;
-#endif
-
- for(y=0; y<tile_lines; y++) {
-#ifdef DEBUG
-
- for(x=0; x<tiles_per_line; x++) {
- if(is_tile_dirty(x, y)) {
- display_fillbox_wh(x << DIRTY_TILE_SHIFT,
- y << DIRTY_TILE_SHIFT,
- DIRTY_TILE_SIZE/4,
- DIRTY_TILE_SIZE/4,
- 3,
- FALSE);
-
-
-
- dr_textur(x << DIRTY_TILE_SHIFT,
- y << DIRTY_TILE_SHIFT,
- DIRTY_TILE_SIZE,
- DIRTY_TILE_SIZE);
-
- tile_count ++;
- } else {
- display_fillbox_wh(x << DIRTY_TILE_SHIFT,
- y << DIRTY_TILE_SHIFT,
- DIRTY_TILE_SIZE/4,
- DIRTY_TILE_SIZE/4,
- 0,
- FALSE);
-
-
-
- dr_textur(x << DIRTY_TILE_SHIFT,
- y << DIRTY_TILE_SHIFT,
- DIRTY_TILE_SIZE,
- DIRTY_TILE_SIZE);
-
- }
- }
-#else
- x = 0;
-
- do {
- if(is_tile_dirty(x, y)) {
- const int xl = x;
- do {
- x++;
- } while(x < tiles_per_line && is_tile_dirty(x, y));
-
- dr_textur(xl << DIRTY_TILE_SHIFT,
- y << DIRTY_TILE_SHIFT,
- (x-xl)<<DIRTY_TILE_SHIFT,
- DIRTY_TILE_SIZE);
-
- }
- x++;
- } while(x < tiles_per_line);
-#endif
- }
-
-#ifdef DEBUG
-// printf("%d von %d tiles wurden gezeichnet\n", tile_count, tile_lines*tiles_per_line);
-#endif
-
- dr_flush();
-
- // swap tile buffers
- tmp = tile_dirty_old;
- tile_dirty_old = tile_dirty;
-
- tile_dirty = tmp;
- memset(tile_dirty, 0, tile_lines*tiles_per_line);
-}
-#endif /* 0 */
-
-void display_flush_buffer()
-{
- dr_textur(0, 0, disp_width, disp_height);
-}
-
-/**
- * Bewegt Mauszeiger
- * @author Hj. Malthaner
- */
-void display_move_pointer(int dx, int dy)
-{
- move_pointer(dx, dy);
-}
-
-
-/**
- * Schaltet Mauszeiger sichtbar/unsichtbar
- * @author Hj. Malthaner
- */
-void display_show_pointer(int yesno)
-{
-#ifdef USE_SOFTPOINTER
- if(yesno) {
- softpointer = 261;
- } else {
- softpointer = 52;
- }
-#else
- show_pointer(yesno);
-#endif
-}
-
-/**
- * unbenutzt ?
- * @author Hj. Malthaner
- */
-void
-my_save_exit()
-{
- dr_os_close();
-}
-
-
-/**
- * Inits. Grafikmodul
- * @author Hj. Malthaner
- */
-int
-simgraph_init(int width, int height)
-{
- int parameter[2];
- int ok;
-
- dr_os_init(0, parameter);
-
- ok = dr_os_open(width, height);
-
- if(ok) {
-
- disp_width = dr_get_width();
- disp_height = dr_get_height();
-
- textur = dr_textur_init();
-
- // not needed for iso-band
- // init_font(".drawrc");
-
-
-// display_set_color(1);
-
-
- images1 = init_images("daten.pak");
-
- images2 = init_images("daten2.pak");
-
- display_select_tile_size(0);
-
- printf("Init. done.\n");
-
-// dr_use_color(rp, SCHWARZ);
-// dr_fillbox_wh(rp, 0, 0, disp_width, WIN_disp_height);
-
- } else {
- puts("Error : can't open window!");
- exit(-1);
- }
-
-
- // allocate dirty tile flags
- tiles_per_line = (disp_width + DIRTY_TILE_SIZE - 1) / DIRTY_TILE_SIZE;
- tile_lines = (disp_height + DIRTY_TILE_SIZE - 1) / DIRTY_TILE_SIZE;
-
- tile_dirty = malloc( tile_lines*tiles_per_line );
- tile_dirty_old = malloc( tile_lines*tiles_per_line );
-
- memset(tile_dirty, 1, tile_lines*tiles_per_line);
- memset(tile_dirty_old, 1, tile_lines*tiles_per_line);
-
- display_setze_clip_wh(0, 0, disp_width, disp_height);
-
- return TRUE;
-}
-
-/**
- * Prueft ob das Grafikmodul schon init. wurde
- * @author Hj. Malthaner
- */
-int is_display_init()
-{
- return textur != NULL;
-}
-
-/**
- * Schliest das Grafikmodul
- * @author Hj. Malthaner
- */
-int
-simgraph_exit()
-{
- free(tile_dirty);
- free(tile_dirty_old);
-
-
- return dr_os_close();
-}
-
-
-/**
- * Laedt Einstellungen
- * @author Hj. Malthaner
- */
-void display_laden(FILE* file)
-{
- int i,r,g,b;
-
- unsigned char day[12];
- unsigned char night[12];
-
- fscanf(file, "%d %d %d\n", &light_level, &color_level, &night_shift);
-
- display_set_light(light_level);
- display_set_color(color_level);
-
- for(i=0; i<4; i++) {
- fscanf(file, "%d %d %d\n", &r, &g, &b);
- day[i*3+0] = r;
- day[i*3+1] = g;
- day[i*3+2] = b;
-
- fscanf(file, "%d %d %d\n", &r, &g, &b);
- night[i*3+0] = r;
- night[i*3+1] = g;
- night[i*3+2] = b;
- }
-
- display_set_player_colors(day, night);
-}
-
-
-/**
- * Speichert Einstellungen
- * @author Hj. Malthaner
- */
-void display_speichern(FILE* file)
-{
- int i;
- fprintf(file, "%d %d %d\n", light_level, color_level, night_shift);
-
- for(i=0; i<4; i++) {
- fprintf(file, "%d %d %d\n", day_pal[i*3+0], day_pal[i*3+1], day_pal[i*3+2]);
- fprintf(file, "%d %d %d\n", night_pal[i*3+0], night_pal[i*3+1], night_pal[i*3+2]);
- }
-}
-
diff --git a/src/iso/simgraph.h b/src/iso/simgraph.h
deleted file mode 100644
index 938edb95..00000000
--- a/src/iso/simgraph.h
+++ /dev/null
@@ -1,159 +0,0 @@
-/* simgraph.h
- *
- * Copyright (c) 2001 Hansjörg Malthaner
- * hansjoerg.malthaner@gmx.de
- *
- * This file is part of the Simugraph graphics engine.
- *
- *
- * This file may be copied and modified freely so long as the above credits,
- * this paragraph, and the below disclaimer of warranty are retained; no
- * financial profit is derived from said modification or copying; and all
- * licensing rights to any modifications are granted to the original author,
- * Hansjörg Malthaner.
- *
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
- * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
- * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
- * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- */
-
-/* simgraph.h
- *
- * Versuch einer Graphic fuer Simulationsspiele
- * Hj. Malthaner, Aug. 1997
- *
- *
- * 3D, isometrische Darstellung
- *
- */
-
-#ifndef simgraph_h
-#define simgraph_h
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-
-#ifndef TRUE
-#define TRUE 1
-#define FALSE 0
-#endif
-
-#define LINESPACE 11
-
-
-struct clip_dimension {
- int x, xx, w, y, yy, h;
-};
-
-
-// helper macros
-
-// save the current clipping and set a new one
-#define PUSH_CLIP(x,y,w,h) \
-{\
-const struct clip_dimension p_cr = display_gib_clip_wh(); \
-display_setze_clip_wh(x, y, w, h);
-
-// restore a saved clipping rect
-#define POP_CLIP() \
-display_setze_clip_wh(p_cr.x, p_cr.y, p_cr.w, p_cr.h); \
-}
-
-
-// function prototypes
-
-int simgraph_init(int width, int height);
-int is_display_init();
-int simgraph_exit();
-
-int gib_maus_x();
-int gib_maus_y();
-
-void mark_rect_dirty_wc(int x1, int y1, int x2, int y2);
-
-
-/**
- * returns the currently used tile size in pixels
- *
- * @author Hj. Malthaner
- */
-int display_get_tile_size();
-
-
-/**
- * selects a tile size
- *
- * @param n 0 means 64x64 tiles, 1 are 32x32 tiles
- * @author Hj. Malthaner
- */
-void display_select_tile_size(int n);
-
-
-
-int display_get_width();
-int display_get_height();
-
-
-int display_get_light();
-void display_set_light(int new_light_level);
-
-int display_get_color();
-void display_set_color(int new_color_level);
-
-void display_day_night_shift(int night);
-
-//void display_set_rgb(int n, int r, int g, int b);
-void display_set_player_colors(const unsigned char *day, const unsigned char *night);
-
-void display_img(const int n, const int xp, const int yp, const int dirty);
-void display_color_img(const int n, const int xp, const int yp, const int color, const int dirty);
-void display_fillbox_wh(int xp, int yp, int w, int h, int color, int dirty);
-void display_fillbox_wh_clip(int xp, int yp, int w, int h, int color, int d);
-void display_vline_wh(const int xp, int yp, int h, const int color, int dirty);
-void display_vline_wh_clip(const int xp, int yp, int h, const int c, int d);
-void display_clear();
-
-void display_flush_buffer();
-
-void display_move_pointer(int dx, int dy);
-void display_show_pointer(int yesno);
-
-
-void display_pixel(int x, int y, int color);
-
-void display_ddd_text(int xpos, int ypos, int hgt,
- int ddd_farbe, int text_farbe,
- const char *text, int dirty);
-
-void display_text(int x, int y, const char *txt, const int color, int dirty);
-void display_array_wh(int xp, int yp, int w, int h, const unsigned char *arr);
-void display_ddd_box(int x1, int y1, int w, int h, int tl_color, int rd_color);
-
-// compound painting routines
-
-int count_char(const char *str, const char c);
-void display_multiline_text(int x, int y, const char *inbuf, int color);
-
-void zeige_banner(void);
-
-void display_setze_clip_wh(int x, int y, int w, int h);
-struct clip_dimension display_gib_clip_wh(void);
-
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/src/iso/simsys.h b/src/iso/simsys.h
deleted file mode 100644
index c4b7dd6c..00000000
--- a/src/iso/simsys.h
+++ /dev/null
@@ -1,197 +0,0 @@
-/* simsys.h
- *
- * Copyright (c) 2001 Hansjörg Malthaner
- * hansjoerg.malthaner@gmx.de
- *
- * This file is part of the Simugraph graphics engine.
- *
- *
- * This file may be copied and modified freely so long as the above credits,
- * this paragraph, and the below disclaimer of warranty are retained; no
- * financial profit is derived from said modification or copying; and all
- * licensing rights to any modifications are granted to the original author,
- * Hansjörg Malthaner.
- *
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
- * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
- * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
- * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- */
-
-#ifndef simsys_h
-#define simsys_h
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#ifndef TRUE
-#define TRUE 1
-#define FALSE 0
-#endif
-
-
-/* Variablen zur Messageverarbeitung */
-
-/* Klassen */
-
-#define SIM_NOEVENT 0
-#define SIM_MOUSE_BUTTONS 1
-#define SIM_KEYBOARD 2
-#define SIM_MOUSE_MOVE 3
-#define SIM_IGNORE_EVENT 255
-
-/* Aktionen */ /* added RIGHTUP and MIDUP */
-#define SIM_MOUSE_LEFTUP 1
-#define SIM_MOUSE_RIGHTUP 2
-#define SIM_MOUSE_MIDUP 3
-#define SIM_MOUSE_LEFTBUTTON 4
-#define SIM_MOUSE_RIGHTBUTTON 5
-#define SIM_MOUSE_MIDBUTTON 6
-#define SIM_MOUSE_MOVED 7
-
-
-/**
- * inits operating system stuff
- * @author Hj. Malthaner
- */
-int dr_os_init(int n, int *parameter);
-
-
-/**
- * opens graphics device/context/window of size w*h
- * @param w width
- * @param h height
- * @author Hj. Malthaner
- */
-int dr_os_open(int w, int h);
-
-
-/**
- * closes operating system stuff
- * @author Hj. Malthaner
- */
-int dr_os_close();
-
-
-/**
- * retrieve display width
- * @author Hj. Malthaner (hansjoerg.malthaner@gmx.de)
- */
-int dr_get_width();
-
-
-/**
- * retrieve display height
- * @author Hj. Malthaner (hansjoerg.malthaner@gmx.de)
- */
-int dr_get_height();
-
-
-/**
- * creates a (maybe virtual) array of graphics data
- * @author Hj. Malthaner
- */
-unsigned short * dr_textur_init();
-
-
-/**
- * displays the array of graphics data
- * @author Hj. Malthaner
- */
-void dr_textur(int xp, int yp, int w, int h);
-
-
-/**
- * use this method to flush graphics pipeline (undrawn stuff) onscreen.
- * @author Hj. Malthaner
- */
-void dr_flush();
-
-
-/**
- * set colormap entries
- * @author Hj. Malthaner
- */
-void dr_setRGB8multi(int first, int count, unsigned char * data);
-
-
-/**
- * display/hide mouse pointer
- * @author Hj. Malthaner (hansjoerg.malthaner@gmx.de)
- */
-void show_pointer(int yesno);
-
-
-/**
- * move mouse pointer
- * @author Hj. Malthaner (hansjoerg.malthaner@gmx.de)
- */
-void move_pointer(int x, int y);
-
-
-/**
- * update softpointer position
- * @author Hj. Malthaner (hansjoerg.malthaner@gmx.de)
- */
-void ex_ord_update_mx_my();
-
-
-/**
- * get events from the system
- * @author Hj. Malthaner (hansjoerg.malthaner@gmx.de)
- */
-void GetEvents();
-
-
-/**
- * get events from the system without waiting
- * @author Hj. Malthaner (hansjoerg.malthaner@gmx.de)
- */
-void GetEventsNoWait();
-
-
-/**
- * @returns time since progrma start in milliseconds
- * @author Hj. Malthaner
- */
-long long dr_time(void);
-
-
-/**
- * sleeps some microseconds
- * @author Hj. Malthaner
- */
-void dr_sleep(unsigned long usec);
-
-
-/**
- * loads a sample
- * @return a handle for that sample or -1 on failure
- * @author Hj. Malthaner
- */
-int dr_load_sample(const char *filename);
-
-
-/**
- * plays a sample
- * @param key the key for the sample to be played
- * @author Hj. Malthaner
- */
-void dr_play_sample(int key, int volume);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
-
diff --git a/src/iso/simview.c b/src/iso/simview.c
deleted file mode 100644
index 4e972841..00000000
--- a/src/iso/simview.c
+++ /dev/null
@@ -1,87 +0,0 @@
-/* simview.c
- *
- * Copyright (c) 2001,2002 Hansjörg Malthaner
- * hansjoerg.malthaner@gmx.de
- *
- *
- * This file may be copied and modified freely so long as the above credits,
- * this paragraph, and the below disclaimer of warranty are retained; no
- * financial profit is derived from said modification or copying; and all
- * licensing rights to any modifications are granted to the original author,
- * Hansjörg Malthaner.
- *
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
- * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
- * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
- * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- */
-
-
-#include "simview.h"
-#include "world_view.h"
-#include "world_adaptor.h"
-#include "simgraph.h"
-
-
-/**
- * Draws the full iso-view display
- * @author Hj. Malthaner
- */
-void display()
-{
- const int IMG_SIZE = display_get_tile_size();
-
- const int const_x_off = display_get_width()/2 + get_x_off();
- const int dpy_width = display_get_width()/IMG_SIZE + 2;
- const int dpy_height = (display_get_height()*4)/IMG_SIZE;
-
-
- const int i_off = get_i_off();
- const int j_off = get_j_off();
-
- int x,y;
-
-// puts("displaying");
-
-
- // Hajo: draw grounds first
-
- for(y=-5; y<dpy_height+10; y++) {
- const int ypos = y*IMG_SIZE/4+16 + get_y_off();
-
- for(x=-dpy_width + (y & 1); x<=dpy_width+2; x+=2) {
-
- const int i = ((y+x) >> 1) + i_off;
- const int j = ((y-x) >> 1) + j_off;
- const int xpos = x*IMG_SIZE/2 + const_x_off;
-
- display_boden(i, j, xpos, ypos);
- }
- }
-
- // Hajo: then draw the objects
-
- for(y=-5; y<dpy_height+10; y++) {
- const int ypos = y*IMG_SIZE/4+16 + get_y_off();
-
- for(x=-dpy_width + (y & 1); x<=dpy_width+2; x+=2) {
-
- const int i = ((y+x) >> 1) + i_off;
- const int j = ((y-x) >> 1) + j_off;
- const int xpos = x*IMG_SIZE/2 + const_x_off;
-
-
- display_dinge(i, j, xpos, ypos);
- }
- }
-}
-
diff --git a/src/iso/simview.h b/src/iso/simview.h
deleted file mode 100644
index a1cac864..00000000
--- a/src/iso/simview.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/* simview.h
- *
- * Copyright (c) 2001, 2002 Hansjörg Malthaner
- * hansjoerg.malthaner@gmx.de
- *
- * This file is part of the Simugraph graphics engine.
- *
- *
- * This file may be copied and modified freely so long as the above credits,
- * this paragraph, and the below disclaimer of warranty are retained; no
- * financial profit is derived from said modification or copying; and all
- * licensing rights to any modifications are granted to the original author,
- * Hansjörg Malthaner.
- *
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
- * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
- * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
- * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- */
-
-#ifndef simview_h
-#define simview_h
-
-
-/**
- * Draws the full iso-view display
- * @author Hj. Malthaner
- */
-void display();
-
-
-#endif
diff --git a/src/iso/walls4.h b/src/iso/walls4.h
deleted file mode 100644
index 5f57d09e..00000000
--- a/src/iso/walls4.h
+++ /dev/null
@@ -1,288 +0,0 @@
-/* walls4.h
- *
- * Copyright (c) 2001 Hansjörg Malthaner
- * hansjoerg.malthaner@gmx.de
- *
- * This file is part of the Simugraph<->Angband adaption code.
- *
- *
- * This file may be copied and modified freely so long as the above credits,
- * this paragraph, and the below disclaimer of warranty are retained; no
- * financial profit is derived from said modification or copying; and all
- * licensing rights to any modifications are granted to the original author,
- * Hansjörg Malthaner.
- *
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
- * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
- * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
- * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- */
-
-int wall_table[256] =
-{
-0, // 0
-0, // 1
-2, // 2
-0, // 3
-0, // 4
-0, // 5
-0, // 6
-0, // 7
-1, // 8
-0, // 9
-3, // 10
-3, // 11
-0, // 12
-0, // 13
-3, // 14
-3, // 15
-4, // 16
-0, // 17
-6, // 18
-6, // 19
-0, // 20
-0, // 21
-6, // 22
-0, // 23
-5, // 24
-5, // 25
-7, // 26
-0, // 27
-5, // 28
-0, // 29
-7, // 30
-5, // 31
-0, // 32
-0, // 33
-0, // 34
-0, // 35
-0, // 36
-0, // 37
-0, // 38
-0, // 39
-0, // 40
-0, // 41
-0, // 42
-0, // 43
-0, // 44
-0, // 45
-0, // 46
-0, // 47
-0, // 48
-0, // 49
-0, // 50
-0, // 51
-0, // 52
-0, // 53
-0, // 54
-0, // 55
-5, // 56
-5, // 57
-0, // 58
-0, // 59
-5, // 60
-0, // 61
-0, // 62
-0, // 63
-8, // 64
-0, // 65
-10, // 66
-10, // 67
-0, // 68
-0, // 69
-10, // 70
-10, // 71
-9, // 72
-9, // 73
-0, // 74
-10, // 75
-0, // 76
-0, // 77
-0, // 78
-0, // 79
-12, // 80
-0, // 81
-0, // 82
-0, // 83
-0, // 84
-0, // 85
-10, // 86
-0, // 87
-13, // 88
-0, // 89
-0, // 90
-0, // 91
-13, // 92
-0, // 93
-0, // 94
-0, // 95
-0, // 96
-0, // 97
-10, // 98
-0, // 99
-0, // 100
-0, // 101
-10, // 102
-0, // 103
-9, // 104
-0, // 105
-10, // 106
-10, // 107
-0, // 108
-0, // 109
-0, // 110
-10, // 111
-12, // 112
-0, // 113
-0, // 114
-0, // 115
-0, // 116
-0, // 117
-0, // 118
-0, // 119
-0, // 120
-12, // 121
-0, // 122
-0, // 123
-0, // 124
-0, // 125
-0, // 126
-0, // 127
-0, // 128
-0, // 129
-0, // 130
-0, // 131
-0, // 132
-0, // 133
-0, // 134
-0, // 135
-0, // 136
-0, // 137
-0, // 138
-0, // 139
-0, // 140
-0, // 141
-0, // 142
-0, // 143
-0, // 144
-0, // 145
-0, // 146
-6, // 147
-0, // 148
-0, // 149
-0, // 150
-0, // 151
-5, // 152
-5, // 153
-0, // 154
-0, // 155
-5, // 156
-0, // 157
-0, // 158
-0, // 159
-0, // 160
-0, // 161
-0, // 162
-0, // 163
-0, // 164
-0, // 165
-0, // 166
-0, // 167
-0, // 168
-0, // 169
-0, // 170
-0, // 171
-0, // 172
-0, // 173
-0, // 174
-0, // 175
-0, // 176
-0, // 177
-0, // 178
-0, // 179
-0, // 180
-0, // 181
-0, // 182
-0, // 183
-5, // 184
-0, // 185
-7, // 186
-0, // 187
-0, // 188
-0, // 189
-0, // 190
-0, // 191
-0, // 192
-0, // 193
-10, // 194
-10, // 195
-0, // 196
-0, // 197
-0, // 198
-0, // 199
-9, // 200
-0, // 201
-0, // 202
-0, // 203
-0, // 204
-0, // 205
-0, // 206
-0, // 207
-12, // 208
-0, // 209
-10, // 210
-0, // 211
-0, // 212
-0, // 213
-10, // 214
-10, // 215
-0, // 216
-0, // 217
-0, // 218
-0, // 219
-0, // 220
-0, // 221
-0, // 222
-0, // 223
-0, // 224
-0, // 225
-10, // 226
-0, // 227
-0, // 228
-0, // 229
-0, // 230
-0, // 231
-0, // 232
-0, // 233
-0, // 234
-10, // 235
-0, // 236
-0, // 237
-0, // 238
-0, // 239
-0, // 240
-0, // 241
-14, // 242
-0, // 243
-0, // 244
-0, // 245
-10, // 246
-0, // 247
-5, // 248
-0, // 249
-0, // 250
-0, // 251
-0, // 252
-0, // 253
-0, // 254
-0, // 255
-};
diff --git a/src/iso/walls9.h b/src/iso/walls9.h
deleted file mode 100644
index 038dadf1..00000000
--- a/src/iso/walls9.h
+++ /dev/null
@@ -1,288 +0,0 @@
-/* walls9.h
- *
- * Copyright (c) 2001 Hansjörg Malthaner
- * hansjoerg.malthaner@gmx.de
- *
- * This file is part of the Simugraph<->Angband adaption code.
- *
- *
- * This file may be copied and modified freely so long as the above credits,
- * this paragraph, and the below disclaimer of warranty are retained; no
- * financial profit is derived from said modification or copying; and all
- * licensing rights to any modifications are granted to the original author,
- * Hansjörg Malthaner.
- *
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
- * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
- * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
- * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- */
-
-int wall_table[256] =
-{
-0, // 0
-1, // 1
-2, // 2
-3, // 3
-4, // 4
-5, // 5
-2, // 6
-7, // 7
-8, // 8
-8, // 9
-10, // 10
-11, // 11
-12, // 12
-13, // 13
-10, // 14
-11, // 15
-16, // 16
-17, // 17
-18, // 18
-18, // 19
-16, // 20
-21, // 21
-22, // 22
-22, // 23
-24, // 24
-24, // 25
-26, // 26
-27, // 27
-24, // 28
-24, // 29
-30, // 30
-31, // 31
-32, // 32
-33, // 33
-34, // 34
-35, // 35
-36, // 36
-37, // 37
-38, // 38
-39, // 39
-40, // 40
-41, // 41
-10, // 42
-43, // 43
-44, // 44
-45, // 45
-46, // 46
-47, // 47
-48, // 48
-49, // 49
-50, // 50
-51, // 51
-52, // 52
-53, // 53
-54, // 54
-55, // 55
-24, // 56
-24, // 57
-58, // 58
-27, // 59
-24, // 60
-61, // 61
-62, // 62
-31, // 63
-64, // 64
-65, // 65
-66, // 66
-66, // 67
-68, // 68
-69, // 69
-66, // 70
-66, // 71
-72, // 72
-72, // 73
-74, // 74
-75, // 75
-76, // 76
-77, // 77
-74, // 78
-75, // 79
-80, // 80
-81, // 81
-82, // 82
-82, // 83
-80, // 84
-85, // 85
-86, // 86
-86, // 87
-88, // 88
-88, // 89
-90, // 90
-91, // 91
-88, // 92
-93, // 93
-94, // 94
-95, // 95
-64, // 96
-97, // 97
-66, // 98
-66, // 99
-100, // 100
-101, // 101
-66, // 102
-103, // 103
-104, // 104
-105, // 105
-106, // 106
-107, // 107
-108, // 108
-109, // 109
-106, // 110
-107, // 111
-80, // 112
-113, // 113
-82, // 114
-115, // 115
-116, // 116
-117, // 117
-118, // 118
-119, // 119
-120, // 120
-121, // 121
-122, // 122
-123, // 123
-124, // 124
-125, // 125
-126, // 126
-127, // 127
-128, // 128
-129, // 129
-130, // 130
-131, // 131
-132, // 132
-133, // 133
-134, // 134
-135, // 135
-136, // 136
-137, // 137
-138, // 138
-139, // 139
-140, // 140
-141, // 141
-142, // 142
-143, // 143
-16, // 144
-145, // 145
-18, // 146
-147, // 147
-148, // 148
-149, // 149
-22, // 150
-22, // 151
-24, // 152
-24, // 153
-154, // 154
-155, // 155
-24, // 156
-157, // 157
-158, // 158
-31, // 159
-160, // 160
-161, // 161
-66, // 162
-163, // 163
-164, // 164
-165, // 165
-166, // 166
-167, // 167
-168, // 168
-169, // 169
-170, // 170
-171, // 171
-172, // 172
-173, // 173
-174, // 174
-175, // 175
-176, // 176
-177, // 177
-178, // 178
-179, // 179
-180, // 180
-181, // 181
-182, // 182
-183, // 183
-24, // 184
-185, // 185
-26, // 186
-187, // 187
-24, // 188
-189, // 189
-190, // 190
-31, // 191
-64, // 192
-193, // 193
-66, // 194
-66, // 195
-196, // 196
-197, // 197
-66, // 198
-66, // 199
-72, // 200
-201, // 201
-74, // 202
-203, // 203
-204, // 204
-205, // 205
-206, // 206
-207, // 207
-208, // 208
-209, // 209
-210, // 210
-211, // 211
-208, // 212
-213, // 213
-214, // 214
-214, // 215
-216, // 216
-217, // 217
-218, // 218
-219, // 219
-220, // 220
-221, // 221
-222, // 222
-223, // 223
-224, // 224
-225, // 225
-66, // 226
-227, // 227
-228, // 228
-229, // 229
-230, // 230
-231, // 231
-104, // 232
-233, // 233
-234, // 234
-107, // 235
-236, // 236
-237, // 237
-238, // 238
-239, // 239
-208, // 240
-241, // 241
-210, // 242
-243, // 243
-244, // 244
-245, // 245
-214, // 246
-214, // 247
-248, // 248
-248, // 249
-250, // 250
-251, // 251
-248, // 252
-248, // 253
-254, // 254
-255, // 255
-};
diff --git a/src/iso/world_adaptor.c b/src/iso/world_adaptor.c
deleted file mode 100644
index a483780f..00000000
--- a/src/iso/world_adaptor.c
+++ /dev/null
@@ -1,226 +0,0 @@
-/* world_adaptor.cc
- *
- * Copyright (c) 2001, 2002 Hansjörg Malthaner
- * hansjoerg.malthaner@gmx.de
- *
- * This file is part of the Simugraph<->Angband adaption code.
- *
- *
- * This file may be copied and modified freely so long as the above credits,
- * this paragraph, and the below disclaimer of warranty are retained; no
- * financial profit is derived from said modification or copying; and all
- * licensing rights to any modifications are granted to the original author,
- * Hansjörg Malthaner.
- *
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
- * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
- * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
- * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- */
-
-/* world_adaptor.c
- *
- * adaption between angband world and simugraph data model
- * Hj. Maltahner, Jan. 2001
- */
-
-#include "hackdef.h"
-
-#include "world_adaptor.h"
-#include "world_view.h"
-#include "simview.h"
-#include "simgraph.h"
-
-#undef MIN
-#undef MAX
-
-#include "../angband.h"
-
-
-/*
- * Highlit location
- */
-int high_x = -1;
-int high_y = -1;
-
-/**
- * remember targetted location
- * (hook is ToME3 only, for now)
- * @author J. Frieling
- */
-bool iso_target_hook(char* fmt)
-{
- high_y = get_next_arg(fmt);
- high_x = get_next_arg(fmt);
-
- return FALSE;
-}
-
-/**
- * Highlite (mark) location x,y
- * @author Hj. Malthaner
- */
-void highlite_spot(int x, int y)
-{
- high_x = x;
- high_y = y;
-}
-
-
-/**
- * Grid type, default is grid for items and monsters
- * 0: No grid
- * 1: Item/monster grid
- * 2: Full grid
- * @author Hj. Malthaner
- */
-static int grid = 1;
-
-
-/**
- * Show shadow below items and monsters?
- * 0 = no
- * 1 = yes
- * @author Hj. Malthaner
- */
-//int shadow = 1;
-
-
-/**
- * Set a grid type (takes argument modulo 3)
- * @author Hj. Malthaner
- */
-void set_grid(int no)
-{
- grid = no % 3;
-}
-
-
-/**
- * Show which grid type ?
- * @author Hj. Malthaner
- */
-int get_grid()
-{
- return grid;
-}
-
-
-/**
- * Turn shadows on/off (0=off, 1=on)
- * @author Hj. Malthaner
- */
-/*void set_shadow(int yesno)
-{
- shadow = yesno;
-}
-*/
-
-
-/**
- * Determines i-offset of the watch point
- * @author Hj. Malthaner
- */
-int get_i_off()
-{
- const int p_off = display_get_width() >> 7;
- const int mult = display_get_tile_size() == 32 ? 2 : 1;
-
-#ifdef USE_SMALL_ISO_HACK
-
- int i_off;
-
- if(p_ptr) {
- i_off = p_ptr->px-p_off*mult;
- }
-
- return i_off;
-#else
-
- return 47-p_off;
-
-
-#endif
-}
-
-
-/**
- * Determines j-offset of the watch point
- * @author Hj. Malthaner
- */
-int get_j_off()
-{
- const int p_off = display_get_width() >> 7;
- const int mult = display_get_tile_size() == 32 ? 2 : 1;
-
-#ifdef USE_SMALL_ISO_HACK
-
- int j_off;
- if(p_ptr) {
- j_off = p_ptr->py-p_off*mult;
- }
-
- return j_off;
-#else
-
- return 10-p_off;
-
-#endif
-}
-
-
-
-/**
- * Ermittelt x-Offset gescrollter Karte
- * @author Hj. Malthaner
- */
-int get_x_off()
-{
- return 0;
-}
-
-
-/**
- * Ermittelt y-Offset gescrollter Karte
- * @author Hj. Malthaner
- */
-int get_y_off()
-{
- return 0;
-}
-
-
-
-int init_adaptor()
-{
- printf("Preparing display ...\n");
- simgraph_init(672, 480);
-
- return TRUE;
-}
-
-
-int refresh_display()
-{
- display();
- display_flush_buffer();
-
- return TRUE;
-}
-
-
-int close_adaptor()
-{
- simgraph_exit();
-
- return TRUE;
-}
diff --git a/src/iso/world_adaptor.h b/src/iso/world_adaptor.h
deleted file mode 100644
index d5b5b63e..00000000
--- a/src/iso/world_adaptor.h
+++ /dev/null
@@ -1,117 +0,0 @@
-/* world_adaptor.h
- *
- * Copyright (c) 2001 Hansjörg Malthaner
- * hansjoerg.malthaner@gmx.de
- *
- * This file is part of the Simugraph<->Angband adaption code.
- *
- *
- * This file may be copied and modified freely so long as the above credits,
- * this paragraph, and the below disclaimer of warranty are retained; no
- * financial profit is derived from said modification or copying; and all
- * licensing rights to any modifications are granted to the original author,
- * Hansjörg Malthaner.
- *
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
- * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
- * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
- * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- */
-
-
-#ifndef hajo_world_adaptor_h
-#define hajo_world_adaptor_h
-
-/* world_adapter.h
- *
- * adpater between angband code and simugraph engine
- * Hj. Malthaner, Jan 2001
- */
-
-// I need angband's bool
-#include "../h-type.h"
-
-/*
- * Highlit location - use read only!
- */
-extern int high_x;
-extern int high_y;
-
-int init_adaptor();
-int close_adaptor();
-
-int refresh_display();
-
-/**
- * remember targetted location
- * @author J. Frieling
- */
-bool iso_target_hook(char *fmt);
-
-/**
- * Highlite (mark) location x,y
- * @author Hj. Malthaner
- */
-void highlite_spot(int x, int y);
-
-/**
- * Set a grid type (takes argument modulo 3)
- * @author Hj. Malthaner
- */
-void set_grid(int no);
-
-
-/**
- * Show which grid type ?
- * @author Hj. Malthaner
- */
-int get_grid();
-
-
-/**
- * Turn shadows on/off (0=off, 1=on)
- * @author Hj. Malthaner
- */
-//void set_shadow(int yesno);
-
-
-
-/**
- * Ermittelt x-Offset gescrollter Karte
- * @author Hj. Malthaner
- */
-int get_x_off();
-
-
-/**
- * Ermittelt y-Offset gescrollter Karte
- * @author Hj. Malthaner
- */
-int get_y_off();
-
-
-/**
- * Determines i-offset of the watch point
- * @author Hj. Malthaner
- */
-int get_i_off();
-
-
-/**
- * Determines j-offset of the watch point
- * @author Hj. Malthaner
- */
-int get_j_off();
-
-
-#endif
-
diff --git a/src/iso/world_view.c b/src/iso/world_view.c
deleted file mode 100644
index 0a4b47fe..00000000
--- a/src/iso/world_view.c
+++ /dev/null
@@ -1,499 +0,0 @@
-/* world_view.c
- *
- * Copyright (c) 2001, 2002 Hansjörg Malthaner
- * hansjoerg.malthaner@gmx.de
- *
- * This file is part of the Simugraph<->Angband adaption code.
- *
- *
- * This file may be copied and modified freely so long as the above credits,
- * this paragraph, and the below disclaimer of warranty are retained; no
- * financial profit is derived from said modification or copying; and all
- * licensing rights to any modifications are granted to the original author,
- * Hansjörg Malthaner.
- *
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
- * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
- * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
- * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- */
-
-#include <stdio.h>
-#include "simgraph.h"
-#include "world_view.h"
-#include "world_adaptor.h"
-
-//#include "walls4.h"
-#include "walls9.h"
-
-#include "hackdef.h"
-
-
-#undef MIN
-#undef MAX
-
-
-#include "../angband.h"
-#include "../defines.h"
-
-
-/* from isov-x11.c */
-extern unsigned char **iso_ap;
-extern unsigned char **iso_cp;
-extern unsigned char **iso_atp;
-extern unsigned char **iso_ctp;
-# ifdef USE_EGO_GRAPHICS
-extern unsigned char **iso_aep;
-extern unsigned char **iso_cep;
-# endif /* USE_EGO_GRAPHICS */
-
-
-#ifdef USE_SMALL_ISO_HACK
-
-static bool is_valid_position(int x, int y) {
- return x >= 0 && y >= 0 && x<cur_wid && y<cur_hgt;
-}
-
-static bool is_valid_to_show(int x, int y) {
- return is_valid_position(x, y);
-}
-
-static int get_feat_nc(int x, int y)
-{
- /* this is for Angabdn 2.9.1
- return cave_feat[y][x];
- */
-
- /* Pernangband 4.1.5 */
- cave_type *c_ptr;
-
- /* Get the cave */
- c_ptr = &cave[y][x];
-
-
- /* Feature code */
- return c_ptr->feat;
-}
-
-
-static int get_feat_wc(int x, int y)
-{
- if(is_valid_position(x,y)) {
- return get_feat_nc(x,y);
- } else {
- return FEAT_PERM_SOLID;
- }
-}
-
-
-static int get_info_nc(int x, int y)
-{
- /* this is for Angabdn 2.9.1
- return cave_info[y][x];
- */
-
- /* Pernangband 4.1.5 */
- cave_type *c_ptr;
-
- /* Get the cave */
- c_ptr = &cave[y][x];
-
-
- /* Info code */
- return c_ptr->info;
-}
-
-
-static int get_info_wc(int x, int y)
-{
- if(is_valid_position(x,y)) {
- return get_info_nc(x,y);
- } else {
- return 0;
- }
-}
-
-
-static bool is_door(int feat)
-{
- return
- (feat == FEAT_OPEN) ||
- (feat == FEAT_BROKEN) ||
- (feat == FEAT_SECRET) ||
- (feat >= FEAT_DOOR_HEAD && feat <= FEAT_DOOR_TAIL) ||
- (feat == FEAT_SHOP);
-}
-
-
-static bool is_wall(int feat)
-{
- return
- (feat >= FEAT_MAGMA && feat <= FEAT_PERM_SOLID) ||
- (feat >= FEAT_TREES && feat <= FEAT_SANDWALL_K) ||
- (feat >= FEAT_QUEST1 && feat <= FEAT_QUEST4);
-}
-
-
-static int is_wall_or_door(int x, int y)
-{
- const int feat = get_feat_wc(x, y);
-
- return is_door(feat) || is_wall(feat);
-}
-
-
-static bool is_lit(int x, int y)
-{
- const int info = get_info_wc(x, y);
-
- return (info & CAVE_GLOW) && (info & CAVE_VIEW) && (info & CAVE_MARK);
-}
-
-
-static bool is_torch_lit(int x, int y)
-{
- const int info = get_info_wc(x, y);
-
- return (info & CAVE_PLIT) && (info & CAVE_VIEW) && (info & CAVE_MARK);
-}
-
-
-static bool is_only_torch_lit(int x, int y)
-{
- return is_torch_lit(x, y) & !is_lit(x, y);
-}
-
-
-static bool is_blind()
-{
- // PernAngband variant
- return p_ptr->blind;
-}
-
-
-/**
- * Calculates distance from player to point (x,y).
- * Uses the distance guess from cave.c
- * @author Hj. Malthaner
- */
-static int get_distance_to_player(int x, int y)
-{
- return distance(y, x, p_ptr->py, p_ptr->px);
-}
-
-#else
-
-
-static int iso_access(unsigned char **field, int x, int y)
-{
- if(x >= 0 && y >= 0 && x<80 && y<24) {
- return field[y][x] & 0x7f;
- } else {
- return 0;
- }
-}
-
-static int is_wall_or_door(int x, int y)
-{
- const int atp = iso_access(iso_atp, x, y);
- const int ctp = iso_access(iso_ctp, x, y);
-
- return (atp == 0x01 && (ctp >= 0x70 && ctp <= 0x75)) ||
- (atp == 0x00 && (ctp =='+' || ctp == '\'')) ;
-}
-
-#endif
-
-
-/**
- * Draw ground of location i,j onto screen position xpos,ypos
- * @author Hj. Malthaner
- */
-void display_boden(int x, int y, int xpos, int ypos)
-{
- // unused in Iso-Angband
-}
-
-
-static int check_wall(int x, int y)
-{
-
- int o = 0;
-
-#if 0
- o |= (is_wall_or_door(x-1, y-1)) << 0;
- o |= (is_wall_or_door(x , y-1)) << 1;
- o |= (is_wall_or_door(x+1, y-1)) << 2;
- o |= (is_wall_or_door(x-1, y )) << 3;
- o |= (is_wall_or_door(x+1, y )) << 4;
- o |= (is_wall_or_door(x-1, y+1)) << 5;
- o |= (is_wall_or_door(x , y+1)) << 6;
- o |= (is_wall_or_door(x+1, y+1)) << 7;
-
-
- return wall_table[o];
-#endif
- // jue: new algorithm as suggested by James Andrewartha
- //
- o |= (is_wall_or_door(x-1, y-1)
- && is_wall_or_door(x, y-1)
- && is_wall_or_door(x-1,y)) << 0;
-
- o |= (is_wall_or_door(x , y-1)) << 1;
-
- o |= (is_wall_or_door(x+1, y-1)
- && is_wall_or_door(x, y-1)
- && is_wall_or_door(x+1, y)) << 2;
-
- o |= (is_wall_or_door(x-1, y )) << 3;
-
- o |= (is_wall_or_door(x+1, y )) << 4;
-
- o |= (is_wall_or_door(x-1, y+1)
- && is_wall_or_door(x-1, y)
- && is_wall_or_door(x, y+1)) << 5;
-
- o |= (is_wall_or_door(x , y+1)) << 6;
-
- o |= (is_wall_or_door(x+1, y+1)
- && is_wall_or_door(x+1, y)
- && is_wall_or_door(x, y+1)) << 7;
-
- return o;
-}
-
-
-static int door_direction(int x, int y)
-{
- if(is_wall_or_door(x-1, y) && is_wall_or_door(x+1, y)) {
- return 1;
- } else {
- return 0;
- }
-}
-
-static int calc_nc(int c, int a)
-{
- return ((a & 0x7F) << 7) + (c & 0x7F);
-}
-
-
-/**
- * Draw objects of location i,j onto screen position xpos,ypos
- * @author Hj. Malthaner
- */
-void display_dinge(int x, int y, int xpos, int ypos)
-{
- const int grid = get_grid();
-
- int feat_nc = -1;
- int obj_nc = -1;
-#ifdef USE_EGO_GRAPHICS
- int ego_nc = -1;
-#endif
-
- int shade;
- int i;
-
- // relative to view position
-// int xoff = x - p_ptr->px + (SCREEN_WID/2 + 13);
-// int xoff = x - p_ptr->px + (SCREEN_WID/2 + 13);
-//
-// new (jue):
-// look at cave.c, panel_col_of and the places it's used...
- int xoff = x - panel_col_min + COL_MAP;
- int yoff = y - panel_row_prt;
-
- // try to use output of the term package
- if(xoff >= 0 && yoff >= 1 && xoff < 80 && yoff < 23) {
- // floor, walls
-
- const int c = iso_cp[yoff][xoff];
- const int a = iso_ap[yoff][xoff];
-
- // object/monster
- const int tc = iso_ctp[yoff][xoff];
- const int ta = iso_atp[yoff][xoff];
-
-#ifdef USE_EGO_GRAPHICS
- // transparent overlay
- const int ec = iso_cep[yoff][xoff];
- const int ea = iso_aep[yoff][xoff];
-
- ego_nc = calc_nc(ec, ea);
-#endif
- feat_nc = calc_nc(tc, ta);
- obj_nc = calc_nc(c, a);
-
- } else {
- // outside 80x24 view, try to read map
-
- if(is_valid_to_show(x,y)) {
-
- byte a, ta;
- char c, tc;
-#ifdef USE_EGO_GRAPHICS
- byte ea;
- char ec;
-
- map_info(y, x, &a, &c, &ta, &tc, &ea, &ec);
- ego_nc = calc_nc(ec, ea);
-#else
- map_info(y, x, &a, &c, &ta, &tc);
-#endif
- feat_nc = calc_nc(tc, ta);
- obj_nc = calc_nc(c, a);
- }
-
- }
-
-
-
- shade = 1;
-
- if(is_lit(x, y)) {
- shade = 2;
- } else if(is_torch_lit(x, y)) {
- shade = 0;
- }
-
-
- // did we get some data ?
- if(feat_nc != -1) {
-
- // check shading
- // printf("%d %d -> %d\n", x, y, shade);
-
- if(feat_nc >= 240 && feat_nc <= 245) {
- // old shading
- // const int shade = (feat_nc-240);
- const int set_base = 240+shade*9;
- const int bits = check_wall(x, y);
-
-
- display_img(316+(shade%3), xpos, ypos, TRUE);
-
- if(bits) {
- for(i=0; i<4; i++) {
- if(bits & (1 << i)) {
- display_img(set_base+i, xpos, ypos, TRUE);
- }
- }
-
- display_img(set_base+8, xpos, ypos, TRUE);
-
- for(i=4; i<8; i++) {
- if(bits & (1 << i)) {
- display_img(set_base+i, xpos, ypos, TRUE);
- }
- }
-
- } else {
- // a pillar
- display_img(set_base+8, xpos, ypos, TRUE);
- }
-
- // fields with walls never contain anything else
- // so we can quit now
- return;
-
- } else if(feat_nc == 0x27) {
- // open doors
- display_img(138+door_direction(x,y), xpos, ypos, TRUE);
-
-
- } else if(feat_nc == 0x2B) {
- // closed doors
- display_img(136+door_direction(x,y), xpos, ypos, TRUE);
-
- } else if(feat_nc == 0x8C || // a between gate
- feat_nc == 0x20 || // empty square
- feat_nc == 0x16E || // brick roof
- feat_nc == 0x16F || // brick roof top
- feat_nc == 0x176 || // grass roof
- feat_nc == 0x177 || // grass roof chimney
- feat_nc == 0x17E || // grass roof top
- (feat_nc >= 0x31 && feat_nc <= 0x39) || // shop with number
- (feat_nc >= 0x576 && feat_nc <= 0x57D) || // trap
- feat_nc == 0x3E || // down stairs
- feat_nc == 0x3C // up stairs
- ) {
- // this features should not be shaded
-
- display_img(feat_nc, xpos, ypos, TRUE);
-
- } else if(feat_nc > 2){
- // this features should be shaded
-
- // floor
- // known grids get shaded floors
- if(is_only_torch_lit(x,y)) {
- display_color_img(feat_nc+2,
- xpos, ypos,
- get_distance_to_player(x, y) << 1,
- TRUE);
- } else {
- display_img(feat_nc+shade, xpos, ypos, TRUE);
- }
- }
-
- // printf("%d a=%x c=%x (%c)\n", nc, a, c, c);
-
- /* Hajo: display a complete grid if the user wants to */
- if(grid == 2) {
- display_img(6, xpos, ypos, TRUE);
- }
-
-
-#ifdef USE_EGO_GRAPHICS
- if( ego_nc != feat_nc &&
- ego_nc > 2 &&
- ego_nc != 0x27 &&
- ego_nc != 0x2B ) {
-
- display_img(ego_nc, xpos, ypos, TRUE);
- }
-#endif
-
- if( obj_nc != feat_nc &&
- obj_nc > 2 &&
- obj_nc != 0x27 &&
- obj_nc != 0x2B ) {
-
- /* Hajo: display a grid below items/monsters if the user wants to */
- if(grid == 1) {
- display_img(5, xpos, ypos, TRUE);
- }
-
- display_img(obj_nc, xpos, ypos, TRUE);
-
- }
- } else {
-
- // outside of dungeon
- display_img(32, xpos, ypos, TRUE);
- }
-
- /* display cursor ? */
- if(
- high_x >= 1 &&
- high_y >= 1) {
- if(xoff == high_x &&
- yoff == high_y) {
- display_img(7, xpos, ypos, TRUE);
-
- /* only draw once, wait until next request */
- high_x = high_y = -1;
- }
- }
-}
-
diff --git a/src/iso/world_view.h b/src/iso/world_view.h
deleted file mode 100644
index 426627e2..00000000
--- a/src/iso/world_view.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/* world_view.h
- *
- * Copyright (c) 2001 Hansjörg Malthaner
- * hansjoerg.malthaner@gmx.de
- *
- * This file is part of the Simugraph<->Angband adaption code.
- *
- *
- * This file may be copied and modified freely so long as the above credits,
- * this paragraph, and the below disclaimer of warranty are retained; no
- * financial profit is derived from said modification or copying; and all
- * licensing rights to any modifications are granted to the original author,
- * Hansjörg Malthaner.
- *
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
- * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
- * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
- * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- */
-
-#ifndef hajo_world_view_h
-#define hajo_world_view_h
-
-
-
-/**
- * Draw ground of location i,j onto screen position xpos,ypos
- * @author Hj. Malthaner
- */
-void display_boden(int i, int j, int xpos, int ypos);
-
-
-/**
- * Draw objects of location i,j onto screen position xpos,ypos
- * @author Hj. Malthaner
- */
-void display_dinge(int i, int j, int xpos, int ypos);
-
-
-#endif
diff --git a/src/levels.c b/src/levels.c
index 8ecc6786..71148fc5 100644
--- a/src/levels.c
+++ b/src/levels.c
@@ -17,7 +17,7 @@
* Return the parameter of the given command in the given file
*/
static int start_line = 0;
-bool get_command(const char *file, char comm, char *param)
+bool_ get_command(const char *file, char comm, char *param)
{
char buf[1024];
int i = -1;
@@ -27,15 +27,9 @@ bool get_command(const char *file, char comm, char *param)
/* Build the filename */
path_build(buf, 1024, ANGBAND_DIR_DNGN, file);
- /* Grab permission */
- safe_setuid_grab();
-
/* Open the file */
fp = my_fopen(buf, "r");
- /* Drop permission */
- safe_setuid_drop();
-
/* The file exists ? */
/* no ? then command not found */
if (!fp) return FALSE;
@@ -130,7 +124,7 @@ int get_flevel()
/*
* Return the extension of the savefile for the level
*/
-bool get_dungeon_save(char *buf)
+bool_ get_dungeon_save(char *buf)
{
char file[20];
@@ -145,7 +139,7 @@ bool get_dungeon_save(char *buf)
/*
* Return the level generator
*/
-bool get_dungeon_generator(char *buf)
+bool_ get_dungeon_generator(char *buf)
{
char file[20];
@@ -160,7 +154,7 @@ bool get_dungeon_generator(char *buf)
/*
* Return the special level
*/
-bool get_dungeon_special(char *buf)
+bool_ get_dungeon_special(char *buf)
{
char file[20];
@@ -175,7 +169,7 @@ bool get_dungeon_special(char *buf)
/*
* Return the special level name
*/
-bool get_dungeon_name(char *buf)
+bool_ get_dungeon_name(char *buf)
{
char file[20];
@@ -227,7 +221,7 @@ void get_level_flags()
/*
* Return the special level desc
*/
-bool get_level_desc(char *buf)
+bool_ get_level_desc(char *buf)
{
char file[20];
diff --git a/src/load_gif.c b/src/load_gif.c
deleted file mode 100644
index a8cb6cc0..00000000
--- a/src/load_gif.c
+++ /dev/null
@@ -1,384 +0,0 @@
-/*
- * GIF Loader
- * by Paul Bartrum
- *
- * Comment by Eric Stevens (tome@eastevens.com):
- *
- * This file has been modified to work with Allegro 4.0.3 that comes with
- * DJGPP 2.0.3 for the use in compiling for ToME 2.2.7. This modification
- * changes a variable name to one that is not in conflict with Allegro
- * variable name. The variable 'empty_string' was changed to 'empty_str'.
- *
- */
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <stdarg.h>
-#include <allegro.h>
-#include <string.h>
-
-int _color_load_depth(int depth);
-
-struct LZW_STRING
-{
- short base;
- char new;
- short length;
-};
-
-PACKFILE *f;
-int empty_str, curr_bit_size, bit_overflow;
-int bit_pos, data_pos, data_len, entire, code;
-int cc, string_length, i, bit_size;
-unsigned char string[4096];
-struct LZW_STRING str[4096];
-BITMAP *bmp;
-int image_x, image_y, image_w, image_h, x, y;
-int interlace;
-
-
-void clear_table(void)
-{
- empty_str = cc + 2;
- curr_bit_size = bit_size + 1;
- bit_overflow = 0;
-}
-
-
-void get_code(void)
-{
- if (bit_pos + curr_bit_size > 8)
- {
- if (data_pos >= data_len)
- {
- data_len = pack_getc(f);
- data_pos = 0;
- }
- entire = (pack_getc(f) << 8) + entire;
- data_pos ++;
- }
- if (bit_pos + curr_bit_size > 16)
- {
- if (data_pos >= data_len)
- {
- data_len = pack_getc(f);
- data_pos = 0;
- }
- entire = (pack_getc(f) << 16) + entire;
- data_pos ++;
- }
- code = (entire >> bit_pos) & ((1 << curr_bit_size) - 1);
- if (bit_pos + curr_bit_size > 8)
- entire >>= 8;
- if (bit_pos + curr_bit_size > 16)
- entire >>= 8;
- bit_pos = (bit_pos + curr_bit_size) % 8;
- if (bit_pos == 0)
- {
- if (data_pos >= data_len)
- {
- data_len = pack_getc(f);
- data_pos = 0;
- }
- entire = pack_getc(f);
- data_pos ++;
- }
-}
-
-
-void input_string(int num)
-{
- if (num < cc)
- {
- string_length = 1;
- string[0] = str[num].new;
- }
- else
- {
- i = str[num].length;
- string_length = i;
- while (i > 0)
- {
- i --;
- string[i] = str[num].new;
- num = str[num].base;
- }
- /* if(num != -1) **-{[ERROR]}-** */
- }
-}
-
-
-void output_string(void)
-{
- for (i = 0; i < string_length; i ++)
- {
- putpixel(bmp, x, y, string[i]);
- x ++;
- if (x >= image_x + image_w)
- {
- x = image_x;
- y += interlace;
- if (interlace)
- {
- if (y >= image_y + image_h)
- {
- if (interlace == 8 && (y - image_y) % 8 == 0)
- {
- interlace = 8;
- y = image_y + 4;
- }
- else if (interlace == 8 && (y - image_y) % 8 == 4)
- {
- interlace = 4;
- y = image_y + 2;
- }
- else if (interlace == 4)
- {
- interlace = 2;
- y = image_y + 1;
- }
- }
- }
- }
- }
-}
-
-
-/* load_gif:
- * Loads a 2-256 colour GIF file onto a bitmap, returning the bitmap
- * structure and storing the pallete data in the specified pallete (this
- * should be an array of at least 256 RGB structures).
- */
-BITMAP *load_gif (char *filename, RGB *pal)
-{
- int width, height, depth;
- int old;
- BITMAP *bmp2;
- int dest_depth;
-
- f = pack_fopen(filename, F_READ);
- if (!f) /* can't open file */
- return NULL;
-
- i = pack_mgetw(f) << 8;
- i += pack_getc(f);
- if (i != 0x474946) /* is it really a GIF? */
- {
- pack_fclose(f);
- return NULL;
- }
- pack_fseek(f, 3); /* skip version */
-
- width = pack_igetw(f);
- height = pack_igetw(f);
-
- bmp = create_bitmap_ex(8, width, height);
- if (bmp == NULL)
- {
- pack_fclose(f);
- return NULL;
- }
- clear(bmp);
-
- i = pack_getc(f);
- if (i & 128) /* no global colour table? */
- depth = (i & 7) + 1;
- else
- depth = 0;
-
- pack_fseek(f, 2); /* skip background colour and aspect ratio */
-
- if (pal && depth) /* only read palette if pal and depth are not 0 */
- {
- for (i = 0; i < (1 << depth); i ++)
- {
- pal[i].r = pack_getc(f) / 4;
- pal[i].g = pack_getc(f) / 4;
- pal[i].b = pack_getc(f) / 4;
- }
- }
- else
- if (depth)
- pack_fseek(f, (1 << depth) * 3);
-
- do
- {
- i = pack_getc(f);
- switch (i)
- {
- case 0x2C: /* Image Descriptor */
- image_x = pack_igetw(f);
- image_y = pack_igetw(f); /* individual image dimensions */
- image_w = pack_igetw(f);
- image_h = pack_igetw(f);
-
- i = pack_getc(f);
- if (i & 64)
- interlace = 8;
- else
- interlace = 1;
-
- if (i & 128)
- {
- depth = (i & 7) + 1;
- if (pal)
- {
- for (i = 0; i < (1 << depth); i ++)
- {
- pal[i].r = pack_getc(f) / 4;
- pal[i].g = pack_getc(f) / 4;
- pal[i].b = pack_getc(f) / 4;
- }
- }
- else
- pack_fseek(f, (1 << depth) * 3);
- }
-
- /* lzw stream starts now */
- bit_size = pack_getc(f);
- cc = 1 << bit_size;
-
- /* initialise string table */
- for (i = 0; i < cc; i ++)
- {
- str[i].base = -1;
- str[i].new = i;
- str[i].length = 1;
- }
-
- /* initialise the variables */
- bit_pos = 0;
- data_len = pack_getc(f);
- data_pos = 0;
- entire = pack_getc(f);
- data_pos ++;
- string_length = 0;
- x = image_x;
- y = image_y;
-
- /* starting code */
- clear_table();
- get_code();
- if (code == cc)
- get_code();
- input_string(code);
- output_string();
- old = code;
-
- while (TRUE)
- {
- get_code();
-
- if (code == cc)
- {
- /* starting code */
- clear_table();
- get_code();
- input_string(code);
- output_string();
- old = code;
- }
- else if (code == cc + 1)
- {
- break;
- }
- else if (code < empty_str)
- {
- input_string(code);
- output_string();
-
- if (bit_overflow == 0)
- {
- str[empty_str].base = old;
- str[empty_str].new = string[0];
- str[empty_str].length = str[old].length + 1;
- empty_str ++;
- if (empty_str == (1 << curr_bit_size))
- curr_bit_size ++;
- if (curr_bit_size == 13)
- {
- curr_bit_size = 12;
- bit_overflow = 1;
- }
- }
-
- old = code;
- }
- else
- {
- input_string(old);
- string[str[old].length] = string[0];
- string_length ++;
-
- if (bit_overflow == 0)
- {
- str[empty_str].base = old;
- str[empty_str].new = string[0];
- str[empty_str].length = str[old].length + 1;
- empty_str ++;
- if (empty_str == (1 << curr_bit_size))
- curr_bit_size ++;
- if (curr_bit_size == 13)
- {
- curr_bit_size = 12;
- bit_overflow = 1;
- }
- }
-
- output_string();
- old = code;
- }
- }
- break;
- case 0x21: /* Extension Introducer */
- i = pack_getc(f);
- if (i == 0xF9) /* Graphic Control Extension */
- {
- pack_fseek(f, 1); /* skip size (it's 4) */
- i = pack_getc(f);
- if (i & 1) /* is transparency enabled? */
- {
- pack_fseek(f, 2);
- pack_getc(f); /* transparent colour */
- }
- else
- pack_fseek(f, 3);
- }
- i = pack_getc(f);
- while (i) /* skip Data Sub-blocks */
- {
- pack_fseek(f, i);
- i = pack_getc(f);
- }
- break;
- case 0x3B: /* Trailer - end of data */
- pack_fclose(f);
-
- /* convert to correct colour depth */
- dest_depth = _color_load_depth(8);
-
- if (dest_depth != 8)
- {
- bmp2 = create_bitmap_ex(dest_depth, bmp->w, bmp->h);
- if (!bmp2)
- {
- destroy_bitmap(bmp);
- return NULL;
- }
-
- select_palette(pal);
- blit(bmp, bmp2, 0, 0, 0, 0, bmp->w, bmp->h);
- unselect_palette();
-
- destroy_bitmap(bmp);
- bmp = bmp2;
- }
-
- return bmp;
- }
- }
- while (TRUE);
-
- /* this is never executed but DJGPP complains if you leave it out */
- return NULL;
-}
diff --git a/src/loadsave.c b/src/loadsave.c
index 7230d090..8cdb9f72 100644
--- a/src/loadsave.c
+++ b/src/loadsave.c
@@ -6,12 +6,6 @@
#include "angband.h"
-/* Don't play with this yet */
-/* #define BZ_SAVES */
-#ifdef BZ_SAVES
-#include <bzlib.h>
-#endif /* BZ_SAVES */
-
static void do_byte(byte *, int);
static void do_u16b(u16b *, int);
static void do_s16b(s16b *, int);
@@ -26,39 +20,25 @@ static void note(cptr);
static void do_fate(int, int);
static void do_item(object_type *, int);
static void do_options(int);
-static bool do_store(store_type *, int);
+static bool_ do_store(store_type *, int);
static void do_messages(int flag);
static void do_xtra(int, int);
-static bool do_savefile_aux(int);
+static bool_ do_savefile_aux(int);
static void junkinit(void);
static void morejunk(void);
-static bool do_inventory(int);
-static bool do_dungeon(int, bool);
+static bool_ do_inventory(int);
+static bool_ do_dungeon(int, bool_);
static void do_grid(int);
static void my_sentinel(char *, u16b, int);
-#ifdef BZ_SAVES
-static void bz_done(int);
-static void bz_prep(int);
-#endif
-
static void do_ver_s16b(s16b *, u32b, s16b, int);
static void skip_ver_byte(u32b, int);
errr rd_savefile(void);
-#ifdef SAFER_PANICS
-bool panicload;
-#endif
-
static FILE *fff; /* Local savefile ptr */
-#ifdef BZ_SAVES
-BZFILE *bzf;
-int bzerr;
-#endif /* BZ_SAVES */
-
/*
* Basic byte-level reading from savefile. This provides a single point
* of interface to the pseudoencryption that ToME (and Angband)
@@ -79,19 +59,7 @@ static byte sf_get(void)
byte c;
/* Get a character, decode the value */
-#ifndef BZ_SAVES
c = getc(fff) & 0xFF;
-#else
-BZ2_bzRead(&bzerr, bzf, &c, 1);
-
- if (bzerr != 0)
- {
- note(format("Compression error on read"));
- bz_done(LS_LOAD);
- printf("Died in sf_get\n");
- exit(0);
- }
-#endif /* BZ_SAVES */
/* Return the value */
return (c);
@@ -100,64 +68,8 @@ BZ2_bzRead(&bzerr, bzf, &c, 1);
static void sf_put(byte v)
{
-#ifndef BZ_SAVES
(void)putc((int)v, fff);
-#else
- BZ2_bzWrite(&bzerr, bzf, &v, 1);
-
- if (bzerr != 0)
- {
- note(format("Compression error on write"));
- bz_done(LS_SAVE);
- printf("Died in sf_put\n");
- exit(0);
- }
-#endif
-}
-
-/*
- * This function does nothing if BZ_SAVES in undefined.
- */
-#ifdef BZ_SAVES
-static void bz_prep(int flag)
-{
-
- if (flag == LS_LOAD)
- {
- bzf = BZ2_bzReadOpen(&bzerr, fff, 0, 0, NULL, 0);
- }
-
- if (flag == LS_SAVE)
- {
- bzf = BZ2_bzWriteOpen(&bzerr, fff, 9, 0, 30);
- }
-
- if (bzerr == 0)
- {
- return ; /* All is Good */
- }
-
- /* Otherwise, all is bad */
- note(format("Compression error on prep"));
- printf("Died in bz_prep\n");
- exit(0);
-
- /* Unreachable code */
- bz_done(flag);
-}
-
-static void bz_done(int flag)
-{
- if (flag == LS_LOAD)
- {
- BZ2_bzReadClose(&bzerr, bzf);
- }
- if (flag == LS_SAVE)
- {
- BZ2_bzWriteClose(&bzerr, bzf, 0, NULL, NULL);
- }
}
-#endif /* BZ_SAVES */
/*
* Do object memory and similar stuff
@@ -309,7 +221,7 @@ static void do_subrace(int flag)
* Misc. other data
*/
static char loaded_game_module[80];
-static bool do_extra(int flag)
+static bool_ do_extra(int flag)
{
int i, j;
byte tmp8u;
@@ -689,9 +601,9 @@ static bool do_extra(int flag)
do_byte(&p_ptr->allow_one_death, flag);
do_s16b(&p_ptr->xtra_spells, flag);
- do_byte(&vanilla_town, flag);
+ do_byte(&tmp8u, flag);
- do_u16b(&no_breeds, flag);
+ do_s16b(&no_breeds, flag);
do_s16b(&p_ptr->protgood, flag);
/* Auxilliary variables */
@@ -766,7 +678,7 @@ static bool do_extra(int flag)
do_u32b(&dummy32u, flag); /* Load-compatibility with old savefiles. */
/* Special stuff */
- do_u16b(&panic_save, flag);
+ do_u16b(&tmp16b, flag); /* Dummy */
do_u16b(&total_winner, flag);
do_u16b(&has_won, flag);
do_u16b(&noscore, flag);
@@ -818,35 +730,21 @@ void save_dungeon(void)
sprintf(tmp, "%s.%s", player_base, buf);
path_build(name, 1024, ANGBAND_DIR_SAVE, tmp);
- /* Grab permission */
- if (savefile_setuid) safe_setuid_grab();
-
/* Open the file */
fff = my_fopen(name, "wb");
- /* Drop permission */
- if (savefile_setuid) safe_setuid_drop();
-
-#ifdef BZ_SAVES
- bz_prep(LS_SAVE);
-#endif /* BZ_SAVES */
-
/* Save the dungeon */
do_dungeon(LS_SAVE, TRUE);
- /* Done */
-#ifdef BZ_SAVES
- bz_done(LS_SAVE);
-#endif /* BZ_SAVES */
my_fclose(fff);
}
/*
* Medium level player saver
*/
-static bool save_player_aux(char *name)
+static bool_ save_player_aux(char *name)
{
- bool ok = FALSE;
+ bool_ ok = FALSE;
int fd = -1;
int mode = 0644;
@@ -856,47 +754,24 @@ static bool save_player_aux(char *name)
/* File type is "SAVE" */
FILE_TYPE(FILE_TYPE_SAVE);
- /* Grab permission */
- if (savefile_setuid) safe_setuid_grab();
-
/* Create the savefile */
fd = fd_make(name, mode);
- /* Drop permission */
- if (savefile_setuid) safe_setuid_drop();
-
/* File is okay */
if (fd >= 0)
{
/* Close the "fd" */
(void)fd_close(fd);
- /* Grab permission */
- if (savefile_setuid) safe_setuid_grab();
-
/* Open the savefile */
fff = my_fopen(name, "wb");
- /* Drop permission */
- if (savefile_setuid) safe_setuid_drop();
-
-#ifdef BZ_SAVES
- bz_prep(LS_SAVE);
-#endif
-
/* Successful open */
if (fff)
{
-#ifdef BZ_SAVES
- bz_prep(LS_SAVE);
-#endif /* BZ_SAVES */
-
/* Write the savefile */
if (do_savefile_aux(LS_SAVE)) ok = TRUE;
-#ifdef BZ_SAVES
- bz_done(LS_SAVE);
-#endif /* BZ_SAVES */
/* Attempt to close it */
if (my_fclose(fff)) ok = FALSE;
}
@@ -904,14 +779,8 @@ static bool save_player_aux(char *name)
/* "broken" savefile */
if (!ok)
{
- /* Grab permission */
- if (savefile_setuid) safe_setuid_grab();
-
/* Remove "broken" files */
(void)fd_kill(name);
-
- /* Drop permission */
- if (savefile_setuid) safe_setuid_drop();
}
}
@@ -928,55 +797,18 @@ static bool save_player_aux(char *name)
/*
* Attempt to save the player in a savefile
*/
-bool save_player(void)
+bool_ save_player(void)
{
int result = FALSE;
char safe[1024];
-#ifdef SAFER_PANICS
- char panicsave[1024];
-#endif /* SAFER PANICS */
-
-
-#ifdef SAFER_PANICS
- if (panic_save)
- {
- /*
- * Not sure how to do this so it's nicely portable to brain-damaged
- * OS's with short filenames
- */
- strcpy(panicsave, savefile);
- strcat(panicsave, ".pnc");
-
- /* Grab permission */
- if (savefile_setuid) safe_setuid_grab();
-
- /* Remove any old panic saves */
- fd_kill(panicsave);
-
- /* Drop permission */
- if (savefile_setuid) safe_setuid_drop();
-
- /* Save character */
- save_player_aux(panicsave);
-
- return TRUE;
- }
-#endif /* SAFER_PANICS */
-
/* New savefile */
strcpy(safe, savefile);
strcat(safe, ".new");
- /* Grab permission */
- if (savefile_setuid) safe_setuid_grab();
-
/* Remove it */
fd_kill(safe);
- /* Drop permission */
- if (savefile_setuid) safe_setuid_drop();
-
/* Attempt to save the player */
if (save_player_aux(safe))
{
@@ -986,9 +818,6 @@ bool save_player(void)
strcpy(temp, savefile);
strcat(temp, ".old");
- /* Grab permission */
- if (savefile_setuid) safe_setuid_grab();
-
/* Remove it */
fd_kill(temp);
@@ -1001,29 +830,9 @@ bool save_player(void)
/* Remove preserved savefile */
fd_kill(temp);
- /* Drop permission */
- if (savefile_setuid) safe_setuid_drop();
-
/* Hack -- Pretend the character was loaded */
character_loaded = TRUE;
-#ifdef VERIFY_SAVEFILE
-
- /* Lock on savefile */
- strcpy(temp, savefile);
- strcat(temp, ".lok");
-
- /* Grab permission */
- if (savefile_setuid) safe_setuid_grab();
-
- /* Remove lock file */
- fd_kill(temp);
-
- /* Drop permission */
- if (savefile_setuid) safe_setuid_drop();
-
-#endif
-
/* Success */
result = TRUE;
}
@@ -1034,20 +843,14 @@ bool save_player(void)
return (result);
}
-bool file_exist(char *buf)
+bool_ file_exist(char *buf)
{
int fd;
- bool result;
-
- /* Grab permission */
- if (savefile_setuid) safe_setuid_grab();
+ bool_ result;
/* Open savefile */
fd = fd_open(buf, O_RDONLY);
- /* Drop permission */
- if (savefile_setuid) safe_setuid_drop();
-
/* File exists */
if (fd >= 0)
{
@@ -1074,37 +877,14 @@ bool file_exist(char *buf)
* Note that we always try to load the "current" savefile, even if
* there is no such file, so we must check for "empty" savefile names.
*/
-bool load_player(void)
+bool_ load_player(void)
{
int fd = -1;
errr err = 0;
-#ifdef SAFER_PANICS
- char panic_fname[1024]; /* Filename for panic savefiles */
- int testfd = -1;
-#endif /* SAFER_PANICS */
-
-#ifdef VERIFY_TIMESTAMP
- struct stat statbuf;
-#endif /* VERIFY_TIMESTAMP */
-
cptr what = "generic";
-#ifdef SAFER_PANICS
- panicload = FALSE;
- strncpy(panic_fname, savefile, 1024);
- strcat(panic_fname, ".pnc"); /* This might concievably cause a buffer
- overflow, but the rest of the code
- in this file does likewise. If someone
- ever audits pernband for security
- problems, well, don't blame me. The rest
- of the code was like this before I even
- got here -- Pat */
-
-#endif /* SAFER_PANICS */
-
-
/* Paranoia */
turn = 0;
@@ -1119,11 +899,7 @@ bool load_player(void)
/* XXX XXX XXX Fix this */
/* Verify the existance of the savefile */
- if ((!file_exist(savefile))
-#ifdef SAFER_PANICS
- && (!file_exist(panic_fname))
-#endif /* SAFER_PANICS */
- )
+ if (!file_exist(savefile))
{
/* Give a message */
msg_format("Savefile does not exist: %s", savefile);
@@ -1133,74 +909,12 @@ bool load_player(void)
return (TRUE);
}
-
-#ifdef VERIFY_SAVEFILE
-
- /* Verify savefile usage */
- if (!err)
- {
- FILE *fkk;
-
- char temp[1024];
-
- /* Extract name of lock file */
- strcpy(temp, savefile);
- strcat(temp, ".lok");
-
- /* Grab permission */
- if (savefile_setuid) safe_setuid_grab();
-
- /* Check for lock */
- fkk = my_fopen(temp, "r");
-
- /* Drop permission */
- if (savefile_setuid) safe_setuid_drop();
-
- /* Oops, lock exists */
- if (fkk)
- {
- /* Close the file */
- my_fclose(fkk);
-
- /* Message */
- msg_print("Savefile is currently in use.");
- msg_print(NULL);
-
- /* Oops */
- return (FALSE);
- }
-
- /* Grab permission */
- if (savefile_setuid) safe_setuid_grab();
-
- /* Create a lock file */
- fkk = my_fopen(temp, "w");
-
- /* Drop permission */
- if (savefile_setuid) safe_setuid_drop();
-
- /* Dump a line of info */
- fprintf(fkk, "Lock file for savefile '%s'\n", savefile);
-
- /* Close the lock file */
- my_fclose(fkk);
- }
-
-#endif
-
-
/* Okay */
if (!err)
{
- /* Grab permission */
- if (savefile_setuid) safe_setuid_grab();
-
/* Open the savefile */
fd = fd_open(savefile, O_RDONLY);
- /* Drop permission */
- if (savefile_setuid) safe_setuid_drop();
-
/* No file */
if (fd < 0) err = -1;
@@ -1208,75 +922,17 @@ bool load_player(void)
if (err) what = "Cannot open savefile";
}
-#ifdef SAFER_PANICS
-
- /* Grab permission */
- if (savefile_setuid) safe_setuid_grab();
-
- /* Open panic save file */
- testfd = fd_open(panic_fname, O_RDONLY);
-
- /* Drop permission */
- if (savefile_setuid) safe_setuid_drop();
-
- fd_close(testfd);
-
- /* A panic save exists, which is not normally the case */
- if (testfd > 0)
- {
- panicload = 1;
-
- /* Close the normal save file */
- fd_close(fd);
-
- /* Grab permission */
- if (savefile_setuid) safe_setuid_grab();
-
- /* Prefer panic saves over real saves */
- fd = fd_open(panic_fname, O_RDONLY);
-
- /* Drop permission */
- if (savefile_setuid) safe_setuid_drop();
-
- /* This is not the error if we're at this pt */
- what = "";
- err = 0;
- }
-
-#endif /* SAFER_PANICS */
-
/* Process file */
if (!err)
{
- /* Grab permission */
- if (savefile_setuid) safe_setuid_grab();
-
-#ifdef VERIFY_TIMESTAMP
-
- /* Get the timestamp */
- (void)fstat(fd, &statbuf);
-
-#endif
-
/* Open the file XXX XXX XXX XXX Should use Angband file interface */
fff = my_fopen(savefile, "rb");
/* fff = fdopen(fd, "r"); */
- /* Drop permission */
- if (savefile_setuid) safe_setuid_drop();
-
-#ifdef BZ_SAVES
- bz_prep(LS_LOAD);
-#endif /* BZ_SAVES */
-
/* Read the first four bytes */
do_u32b(&vernum, LS_LOAD);
do_byte(&sf_extra, LS_LOAD);
-#ifdef BZ_SAVES
- bz_done(LS_LOAD);
-#endif /* BZ_SAVES */
-
/* XXX XXX XXX XXX Should use Angband file interface */
my_fclose(fff);
/* fclose(fff) */
@@ -1315,25 +971,6 @@ bool load_player(void)
if (err) what = "Broken savefile";
}
-#ifdef VERIFY_TIMESTAMP
-
- /* Verify timestamp */
- if (!err && !arg_wizard)
- {
- /* Hack -- Verify the timestamp */
- if (sf_when > (statbuf.st_ctime + 100) ||
- sf_when < (statbuf.st_ctime - 100))
- {
- /* Message */
- what = "Invalid timestamp";
-
- /* Oops */
- err = -1;
- }
- }
-
-#endif
-
/* Okay */
if (!err)
@@ -1382,53 +1019,11 @@ bool load_player(void)
(void)strcpy(died_from, "(alive and well)");
}
-#ifdef SAFER_PANICS
- if (panicload)
- {
- /* Grab permission */
- if (savefile_setuid) safe_setuid_grab();
-
- /*
- * Done loading, it'll either immediately panic and re-save, or
- * we don't need the panicsave file anymore. Either way, it's safe
- * to zap the original panicsave
- */
- fd_kill(panic_fname);
-
- /* Drop permission */
- if (savefile_setuid) safe_setuid_drop();
- }
-#endif /* SAFER_PANICS */
-
/* Success */
return (TRUE);
}
-#ifdef VERIFY_SAVEFILE
-
- /* Verify savefile usage */
- if (TRUE)
- {
- char temp[1024];
-
- /* Extract name of lock file */
- strcpy(temp, savefile);
- strcat(temp, ".lok");
-
- /* Grab permission */
- if (savefile_setuid) safe_setuid_grab();
-
- /* Remove lock */
- fd_kill(temp);
-
- /* Drop permission */
- if (savefile_setuid) safe_setuid_drop();
- }
-
-#endif
-
-
/* Message */
msg_format("Error (%s) reading %d.%d.%d savefile.",
what, sf_major, sf_minor, sf_patch);
@@ -1492,8 +1087,6 @@ static void do_s16b(s16b *ip, int flag)
}
if (flag == LS_SAVE)
{
- s16b val;
- val = *ip;
do_u16b((u16b *)ip, flag);
return;
}
@@ -1626,7 +1219,7 @@ static void note(cptr msg)
/*
* Determine if an item can be wielded/worn (e.g. helmet, sword, bow, arrow)
*/
-static bool wearable_p(object_type *o_ptr)
+static bool_ wearable_p(object_type *o_ptr)
{
/* Valid "tval" codes */
switch (o_ptr->tval)
@@ -1836,14 +1429,6 @@ static void do_item(object_type *o_ptr, int flag)
o_ptr->dd = k_ptr->dd;
o_ptr->ds = k_ptr->ds;
-#if 0
- /* Acquire correct weight */
- if ((o_ptr->tval != TV_CORPSE) &&
- (o_ptr->tval != TV_EGG)) o_ptr->weight = k_ptr->weight;
-
- /* Paranoia */
- o_ptr->name1 = o_ptr->name2 = 0;
-#endif
/* All done */
return;
}
@@ -1902,12 +1487,6 @@ static void do_item(object_type *o_ptr, int flag)
/* Ego items */
if (o_ptr->name2)
{
- ego_item_type *e_ptr;
-
- /* Obtain the ego-item info */
- e_ptr = &e_info[o_ptr->name2];
-
-
o_ptr->dd = old_dd;
o_ptr->ds = old_ds;
}
@@ -1928,7 +1507,7 @@ static void do_item(object_type *o_ptr, int flag)
static void do_monster(monster_type *m_ptr, int flag)
{
int i;
- bool tmp;
+ bool_ tmp;
/* Read the monster race */
do_s16b(&m_ptr->r_idx, flag);
@@ -2121,7 +1700,7 @@ static void do_lore(int r_idx, int flag)
/*
* Read a store
*/
-static bool do_store(store_type *str, int flag)
+static bool_ do_store(store_type *str, int flag)
/* FIXME! Why does this return anything when
it always returns the same thing? */
{
@@ -2406,7 +1985,7 @@ static void do_spells(int i, int flag)
* FIXME! This function probably could be unified better
* Note that the inventory is "re-sorted" later by "dungeon()".
*/
-static bool do_inventory(int flag)
+static bool_ do_inventory(int flag)
{
if (flag == LS_LOAD)
{
@@ -2551,7 +2130,7 @@ static void do_messages(int flag) /* FIXME! We should be able to unify this be
* The monsters/objects must be loaded in the same order
* that they were stored, since the actual indexes matter.
*/
-static bool do_dungeon(int flag, bool no_companions)
+static bool_ do_dungeon(int flag, bool_ no_companions)
{
int i;
@@ -2612,15 +2191,15 @@ static bool do_dungeon(int flag, bool no_companions)
int xstart = 0;
int ystart = 0;
/* Init the wilderness */
- process_dungeon_file(NULL, "w_info.txt", &ystart, &xstart, cur_hgt, cur_wid,
- TRUE);
+ process_dungeon_file("w_info.txt", &ystart, &xstart, cur_hgt, cur_wid,
+ TRUE, FALSE);
/* Init the town */
xstart = 0;
ystart = 0;
init_flags = 0;
- process_dungeon_file(NULL, "t_info.txt", &ystart, &xstart, cur_hgt, cur_wid,
- TRUE);
+ process_dungeon_file("t_info.txt", &ystart, &xstart, cur_hgt, cur_wid,
+ TRUE, FALSE);
}
do_grid(flag);
@@ -2840,7 +2419,7 @@ static bool do_dungeon(int flag, bool no_companions)
}
/* Returns TRUE if we successfully load the dungeon */
-bool load_dungeon(char *ext)
+bool_ load_dungeon(char *ext)
{
char tmp[16];
char name[1024];
@@ -2851,15 +2430,9 @@ bool load_dungeon(char *ext)
sprintf(tmp, "%s.%s", player_base, ext);
path_build(name, 1024, ANGBAND_DIR_SAVE, tmp);
- /* Grab permission */
- if (savefile_setuid) safe_setuid_grab();
-
/* Open the file */
fff = my_fopen(name, "rb");
- /* Drop permission */
- if (savefile_setuid) safe_setuid_drop();
-
if (fff == NULL)
{
dun_level = old_dun;
@@ -2869,19 +2442,12 @@ bool load_dungeon(char *ext)
return (FALSE);
}
-#ifdef BZ_SAVES
- bz_prep(LS_LOAD);
-#endif /* BZ_SAVES */
-
/* Read the dungeon */
if (!do_dungeon(LS_LOAD, FALSE))
{
dun_level = old_dun;
dungeon_type = old_dungeon_type;
-#ifdef BZ_SAVES
- bz_done(LS_LOAD);
-#endif /* BZ_SAVES */
my_fclose(fff);
return (FALSE);
}
@@ -2890,9 +2456,6 @@ bool load_dungeon(char *ext)
dungeon_type = old_dungeon_type;
/* Done */
-#ifdef BZ_SAVES
- bz_done(LS_LOAD);
-#endif /* BZ_SAVES */
my_fclose(fff);
return (TRUE);
}
@@ -2934,7 +2497,7 @@ void do_fate(int i, int flag)
/*
* Actually read the savefile
*/
-static bool do_savefile_aux(int flag)
+static bool_ do_savefile_aux(int flag)
{
int i, j;
@@ -2942,7 +2505,7 @@ static bool do_savefile_aux(int flag)
u16b tmp16u;
u32b tmp32u;
- bool *reals;
+ bool_ *reals;
u16b real_max = 0;
/* Mention the savefile version */
@@ -3030,13 +2593,8 @@ static bool do_savefile_aux(int flag)
/* Read the available records */
for (i = 0; i < tmp16u; i++)
{
- monster_race *r_ptr;
-
/* Read the lore */
do_lore(i, flag);
-
- /* Access that monster */
- r_ptr = &r_info[i]; /* FIXME! Why the hell are we doing this? */
}
if ((flag == LS_LOAD) && (arg_fiddle)) note("Loaded Monster Memory");
@@ -3316,7 +2874,7 @@ static bool do_savefile_aux(int flag)
}
/* Note that this forbids max_towns from shrinking, but that is fine */
- C_MAKE(reals, max_towns, bool);
+ C_MAKE(reals, max_towns, bool_);
/* Find the real towns */
if (flag == LS_SAVE)
@@ -3349,7 +2907,7 @@ static bool do_savefile_aux(int flag)
do_store(&town_info[z].store[j], flag);
}
- C_FREE(reals, max_towns, bool);
+ C_FREE(reals, max_towns, bool_);
if (flag == LS_SAVE) tmp32u = extra_savefile_parts;
do_u32b(&tmp32u, flag);
@@ -3419,52 +2977,9 @@ errr rd_savefile(void)
{
errr err = 0;
-#ifdef SAFER_PANICS
- char panic_fname[1024];
- if (!panicload)
- {
-#endif /* SAFER_PANICS */
-
- /* Grab permission */
- if (savefile_setuid) safe_setuid_grab();
-
- /* The savefile is a binary file */
- fff = my_fopen(savefile, "rb");
-
- /* Drop permission */
- if (savefile_setuid) safe_setuid_drop();
-
-#ifdef BZ_SAVES
- bz_prep(LS_LOAD);
-#endif /* BZ_SAVES */
-
-#ifdef SAFER_PANICS
- }
- else
- {
- strcpy(panic_fname, savefile);
- strcat(panic_fname, ".pnc");
-
- /* Grab permission */
- if (savefile_setuid) safe_setuid_grab();
-
- /* Open panic save file */
- fff = my_fopen(panic_fname, "rb");
-
- /* Drop permission */
- if (savefile_setuid) safe_setuid_drop();
-
-#ifdef BZ_SAVES
- if (fff)
- {
- bz_prep(LS_LOAD);
- }
-#endif /* BZ_SAVES */
-
- }
-
-#endif /* SAFER_PANICS */
-
+ /* The savefile is a binary file */
+ fff = my_fopen(savefile, "rb");
+
/* Paranoia */
if (!fff) return ( -1);
@@ -3475,9 +2990,6 @@ errr rd_savefile(void)
if (ferror(fff)) err = -1;
/* Close the file */
-#ifdef BZ_SAVES
- bz_done(LS_LOAD);
-#endif /* BZ_SAVES */
my_fclose(fff);
/* Result */
@@ -3517,71 +3029,6 @@ static void morejunk(void)
spp_ptr = &class_info[p_ptr->pclass].spec[p_ptr->pspec];
}
-#ifdef BZ_SAVES
-static void do_grid(int flag)
-{
- int y = 0, x = 0;
- cave_type *c_ptr;
- int ymax = cur_hgt, xmax = cur_wid;
-
- int part; /* Which section of the grid we're on */
-
- my_sentinel("Before grid", 17, flag);
-
- for (part = 0; part < 9; part++) /* There are 8 fields to the grid, each stored
- in a seperate data structure */
- {
- for (y = 0; y < ymax; y++)
- {
- for (x = 0; x < xmax; x++)
- {
- c_ptr = &cave[y][x];
- switch (part)
- {
- case 0:
- do_u16b(&c_ptr->info, flag);
- break;
-
- case 1:
- do_byte(&c_ptr->feat, flag);
- break;
-
- case 2:
- do_byte(&c_ptr->mimic, flag);
- break;
-
- case 3:
- do_u16b(&c_ptr->special, flag);
- break;
-
- case 4:
- do_u16b(&c_ptr->special2, flag);
- break;
-
- case 5:
- do_u16b(&c_ptr->t_idx, flag);
- break;
-
- case 6:
- do_u16b(&c_ptr->inscription, flag);
- break;
-
- case 7:
- do_byte(&c_ptr->mana, flag);
- break;
-
- case 8:
- do_u16b(&c_ptr->effect, 12, 0, flag);
- break;
- }
- }
- }
- }
- my_sentinel("In grid", 36, flag);
-}
-#endif /* BZ_SAVES */
-
-#ifndef BZ_SAVES
static void do_grid(int flag)
/* Does the grid, RLE, blahblah. RLE sucks. I hate it. */
{
@@ -3779,8 +3226,6 @@ static void do_grid(int flag)
}
}
-#endif /* !BZ_SAVES */
-
static void my_sentinel(char *place, u16b value, int flag)
/* This function lets us know exactly where a savefile is
broken by reading/writing conveniently a sentinel at this
diff --git a/src/lua/tolua.h b/src/lua/tolua.h
index b4748f52..ab86976c 100644
--- a/src/lua/tolua.h
+++ b/src/lua/tolua.h
@@ -27,6 +27,10 @@ extern "C" {
#include "lua.h"
+/* Evil hack for C++ bool_ vs. C bool. */
+#ifndef __cplusplus
+typedef unsigned char bool;
+#endif
/*************************************** Exported functions */
diff --git a/src/lua_bind.c b/src/lua_bind.c
index 04ed8c97..67b75ee6 100644
--- a/src/lua_bind.c
+++ b/src/lua_bind.c
@@ -16,37 +16,12 @@
#include "tolua.h"
extern lua_State *L;
-/*
- * Get a new magic type
- */
-magic_power *new_magic_power(int num)
-{
- magic_power *m_ptr;
- C_MAKE(m_ptr, num, magic_power);
- return (m_ptr);
-}
magic_power *grab_magic_power(magic_power *m_ptr, int num)
{
return (&m_ptr[num]);
}
-static char *magic_power_info_lua_fct;
-static void magic_power_info_lua(char *p, int power)
-{
- int oldtop = lua_gettop(L);
-
- lua_getglobal(L, magic_power_info_lua_fct);
- tolua_pushnumber(L, power);
- lua_call(L, 1, 1);
- strcpy(p, lua_tostring(L, -1));
- lua_settop(L, oldtop);
-}
-bool get_magic_power_lua(int *sn, magic_power *powers, int max_powers, char *info_fct, int plev, int cast_stat)
-{
- magic_power_info_lua_fct = info_fct;
- return (get_magic_power(sn, powers, max_powers, magic_power_info_lua, plev, cast_stat));
-}
-bool lua_spell_success(magic_power *spell, int stat, char *oups_fct)
+bool_ lua_spell_success(magic_power *spell, int stat, char *oups_fct)
{
int chance;
int minfail = 0;
@@ -69,15 +44,8 @@ bool lua_spell_success(magic_power *spell, int stat, char *oups_fct)
/* Extract the minimum failure rate */
minfail = adj_mag_fail[p_ptr->stat_ind[stat]];
- /* Minimum failure rate */
- if (chance < minfail) chance = minfail;
-
- /* Stunning makes spells harder */
- if (p_ptr->stun > 50) chance += 25;
- else if (p_ptr->stun) chance += 15;
-
- /* Always a 5 percent chance of working */
- if (chance > 95) chance = 95;
+ /* Failure rate */
+ chance = clamp_failure_chance(chance, minfail);
/* Failed spell */
if (rand_int(100) < chance)
@@ -136,10 +104,10 @@ s16b add_new_power(cptr name, cptr desc, cptr gain, cptr lose, byte level, byte
}
static char *lua_item_tester_fct;
-static bool lua_item_tester(object_type* o_ptr)
+static bool_ lua_item_tester(object_type* o_ptr)
{
int oldtop = lua_gettop(L);
- bool ret;
+ bool_ ret;
lua_getglobal(L, lua_item_tester_fct);
tolua_pushusertype(L, o_ptr, tolua_tag(L, "object_type"));
@@ -180,16 +148,16 @@ void find_position(int y, int x, int *yy, int *xx)
do
{
- scatter(yy, xx, y, x, 6, 0);
+ scatter(yy, xx, y, x, 6);
}
while (!(in_bounds(*yy, *xx) && cave_floor_bold(*yy, *xx)) && --attempts);
}
static char *summon_lua_okay_fct;
-bool summon_lua_okay(int r_idx)
+bool_ summon_lua_okay(int r_idx)
{
int oldtop = lua_gettop(L);
- bool ret;
+ bool_ ret;
lua_getglobal(L, lua_item_tester_fct);
tolua_pushnumber(L, r_idx);
@@ -199,11 +167,11 @@ bool summon_lua_okay(int r_idx)
return (ret);
}
-bool lua_summon_monster(int y, int x, int lev, bool friend, char *fct)
+bool_ lua_summon_monster(int y, int x, int lev, bool_ friend_, char *fct)
{
summon_lua_okay_fct = fct;
- if (!friend)
+ if (!friend_)
return summon_specific(y, x, lev, SUMMON_LUA);
else
return summon_specific_friendly(y, x, lev, SUMMON_LUA, TRUE);
@@ -236,7 +204,7 @@ void desc_quest(int q_idx, int d, char *desc)
/*
* Misc
*/
-bool get_com_lua(cptr prompt, int *com)
+bool_ get_com_lua(cptr prompt, int *com)
{
char c;
@@ -325,18 +293,8 @@ s32b lua_spell_chance(s32b chance, int level, int skill_level, int mana, int cur
/* Hack -- Priest prayer penalty for "edged" weapons -DGK */
if ((forbid_non_blessed()) && (p_ptr->icky_wield)) chance += 25;
- /* Minimum failure rate */
- if (chance < minfail) chance = minfail;
-
- /* Stunning makes spells harder */
- if (p_ptr->stun > 50) chance += 25;
- else if (p_ptr->stun) chance += 15;
-
- /* Always a 5 percent chance of working */
- if (chance > 95) chance = 95;
-
/* Return the chance */
- return (chance);
+ return clamp_failure_chance(chance, minfail);
}
s32b lua_spell_device_chance(s32b chance, int level, int base_level)
@@ -348,20 +306,9 @@ s32b lua_spell_device_chance(s32b chance, int level, int base_level)
/* Extract the minimum failure rate */
minfail = 15 - get_skill_scale(SKILL_DEVICE, 25);
- if (minfail < 0) minfail = 0;
-
- /* Minimum failure rate */
- if (chance < minfail) chance = minfail;
-
- /* Stunning makes spells harder */
- if (p_ptr->stun > 50) chance += 25;
- else if (p_ptr->stun) chance += 15;
-
- /* Always a 5 percent chance of working */
- if (chance > 95) chance = 95;
/* Return the chance */
- return (chance);
+ return clamp_failure_chance(chance, minfail);
}
/* Cave */
@@ -396,21 +343,15 @@ void get_target(int dir, int *y, int *x)
}
/* Level gen */
-void get_map_size(bool full_text, char *name, int *ysize, int *xsize)
+void get_map_size(char *name, int *ysize, int *xsize)
{
*xsize = 0;
*ysize = 0;
init_flags = INIT_GET_SIZE;
- process_dungeon_file_full = TRUE;
- if (full_text)
- process_dungeon_file(name, "embeded map script", ysize, xsize, cur_hgt, cur_wid, TRUE);
- else
- process_dungeon_file(NULL, name, ysize, xsize, cur_hgt, cur_wid, TRUE);
- process_dungeon_file_full = FALSE;
-
+ process_dungeon_file(name, ysize, xsize, cur_hgt, cur_wid, TRUE, TRUE);
}
-void load_map(bool full_text, char *name, int *y, int *x)
+void load_map(char *name, int *y, int *x)
{
/* Set the correct monster hook */
set_mon_num_hook();
@@ -419,47 +360,10 @@ void load_map(bool full_text, char *name, int *y, int *x)
get_mon_num_prep();
init_flags = INIT_CREATE_DUNGEON;
- process_dungeon_file_full = TRUE;
- if (full_text)
- process_dungeon_file(name, "embeded map script", y, x, cur_hgt, cur_wid, TRUE);
- else
- process_dungeon_file(NULL, name, y, x, cur_hgt, cur_wid, TRUE);
- process_dungeon_file_full = FALSE;
+ process_dungeon_file(name, y, x, cur_hgt, cur_wid, TRUE, TRUE);
}
-/* Allow lua to use a temporary file */
-static char lua_temp_name[1025];
-static bool lua_temp_file_alloc = FALSE;
-void lua_make_temp_file()
-{
- if (lua_temp_file_alloc) return;
-
- if (path_temp(lua_temp_name, 1024)) return;
-
- /* Open a new file */
- hook_file = my_fopen(lua_temp_name, "w");
- lua_temp_file_alloc = TRUE;
-}
-
-void lua_close_temp_file()
-{
- /* Close the file */
- my_fclose(hook_file);
-}
-
-void lua_end_temp_file()
-{
- /* Remove the file */
- fd_kill(lua_temp_name);
- lua_temp_file_alloc = FALSE;
-}
-
-cptr lua_get_temp_name()
-{
- return lua_temp_name;
-}
-
-bool alloc_room(int by0, int bx0, int ysize, int xsize, int *y1, int *x1, int *y2, int *x2)
+bool_ alloc_room(int by0, int bx0, int ysize, int xsize, int *y1, int *x1, int *y2, int *x2)
{
int xval, yval, x, y;
@@ -502,7 +406,7 @@ void lua_print_hook(cptr str)
/*
* Hook for bounty monster selection.
*/
-static bool lua_mon_hook_bounty(int r_idx)
+static bool_ lua_mon_hook_bounty(int r_idx)
{
monster_race* r_ptr = &r_info[r_idx];
@@ -612,23 +516,6 @@ void lua_display_list(int y, int x, int h, int w, cptr title, list_type* list, i
}
/*
- * Level generators
- */
-bool level_generate_script(cptr name)
-{
- s32b ret = FALSE;
-
- call_lua("level_generate", "(s)", "d", name, &ret);
-
- return ret;
-}
-
-void add_scripted_generator(cptr name, bool stairs, bool monsters, bool objects, bool miscs)
-{
- add_level_generator(name, level_generate_script, stairs, monsters, objects, miscs);
-}
-
-/*
* Gods
*/
s16b add_new_gods(char *name)
@@ -650,3 +537,155 @@ void desc_god(int g_idx, int d, char *desc)
if (d >= 0 && d < 10)
strncpy(deity_info[g_idx].desc[d], desc, 79);
}
+
+/*
+ * Returns the direction of the compass that y2, x2 is from y, x
+ * the return value will be one of the following: north, south,
+ * east, west, north-east, south-east, south-west, north-west,
+ * or "close" if it is within 2 tiles.
+ */
+cptr compass(int y, int x, int y2, int x2)
+{
+ static char compass_dir[64];
+
+ // is it close to the north/south meridian?
+ int y_diff = y2 - y;
+
+ // determine if y2, x2 is to the north or south of y, x
+ const char *y_axis;
+ if ((y_diff > -3) && (y_diff < 3))
+ {
+ y_axis = 0;
+ }
+ else if (y2 > y)
+ {
+ y_axis = "south";
+ }
+ else
+ {
+ y_axis = "north";
+ }
+
+ // is it close to the east/west meridian?
+ int x_diff = x2 - x;
+
+ // determine if y2, x2 is to the east or west of y, x
+ const char *x_axis;
+ if ((x_diff > -3) && (x_diff < 3))
+ {
+ x_axis = 0;
+ }
+ else if (x2 > x)
+ {
+ x_axis = "east";
+ }
+ else
+ {
+ x_axis = "west";
+ }
+
+ // Maybe it is very close
+ if ((!x_axis) && (!y_axis)) { strcpy(compass_dir, "close"); }
+ // Maybe it is (almost) due N/S
+ else if (!x_axis) { strcpy(compass_dir, y_axis); }
+ // Maybe it is (almost) due E/W
+ else if (!y_axis) { strcpy(compass_dir, x_axis); }
+ // or if it is neither
+ else { sprintf(compass_dir, "%s-%s", y_axis, x_axis); }
+ return compass_dir;
+}
+
+/* Returns a relative approximation of the 'distance' of y2, x2 from y, x. */
+cptr approximate_distance(int y, int x, int y2, int x2)
+{
+ // how far to away to the north/south?
+ int y_diff = abs(y2 - y);
+ // how far to away to the east/west?
+ int x_diff = abs(x2 - x);
+ // find which one is the larger distance
+ int most_dist = x_diff;
+ if (y_diff > most_dist) {
+ most_dist = y_diff;
+ }
+
+ // how far away then?
+ if (most_dist >= 41) {
+ return "a very long way";
+ } else if (most_dist >= 25) {
+ return "a long way";
+ } else if (most_dist >= 8) {
+ return "quite some way";
+ } else {
+ return "not very far";
+ }
+}
+
+bool_ drop_text_left(byte c, cptr str, int y, int o)
+{
+ int i = strlen(str);
+ int x = 39 - (strlen(str) / 2) + o;
+ while (i > 0)
+ {
+ int a = 0;
+ int time = 0;
+
+ if (str[i-1] != ' ')
+ {
+ while (a < x + i - 1)
+ {
+ Term_putch(a - 1, y, c, 32);
+ Term_putch(a, y, c, str[i-1]);
+ time = time + 1;
+ if (time >= 4)
+ {
+ Term_xtra(TERM_XTRA_DELAY, 1);
+ time = 0;
+ }
+ Term_redraw_section(a - 1, y, a, y);
+ a = a + 1;
+
+ inkey_scan = TRUE;
+ if (inkey()) {
+ return TRUE;
+ }
+ }
+ }
+
+ i = i - 1;
+ }
+ return FALSE;
+}
+
+bool_ drop_text_right(byte c, cptr str, int y, int o)
+{
+ int x = 39 - (strlen(str) / 2) + o;
+ int i = 1;
+ while (i <= strlen(str))
+ {
+ int a = 79;
+ int time = 0;
+
+ if (str[i-1] != ' ') {
+ while (a >= x + i - 1)
+ {
+ Term_putch(a + 1, y, c, 32);
+ Term_putch(a, y, c, str[i-1]);
+ time = time + 1;
+ if (time >= 4) {
+ Term_xtra(TERM_XTRA_DELAY, 1);
+ time = 0;
+ }
+ Term_redraw_section(a, y, a + 1, y);
+ a = a - 1;
+
+ inkey_scan = TRUE;
+ if (inkey()) {
+ return TRUE;
+ }
+ }
+ }
+
+ i = i + 1;
+ }
+ return FALSE;
+}
diff --git a/src/maid-x11.c b/src/maid-x11.c
index 767413a7..86df2119 100755
--- a/src/maid-x11.c
+++ b/src/maid-x11.c
@@ -63,11 +63,6 @@
((unsigned)(keysym) >= 0xFF00)
-#ifdef SUPPORT_GAMMA
-static bool gamma_table_ready = FALSE;
-#endif /* SUPPORT_GAMMA */
-
-
/*
* Hack -- Convert an RGB value to an X11 Pixel, or die.
*/
@@ -79,40 +74,6 @@ static unsigned long create_pixel(Display *dpy, byte red, byte green, byte blue)
XColor xcolour;
-#ifdef SUPPORT_GAMMA
- static u16b old_gamma_val = 0;
-
-
- /* React to change in the gamma value */
- if (gamma_val != old_gamma_val)
- {
- /* Temporarily inactivate the gamma table */
- gamma_table_ready = FALSE;
-
- /* Only need to build the table if gamma exists */
- if (gamma_val)
- {
- /* Rebuild the table */
- build_gamma_table(gamma_val);
-
- /* We can use gamma_table[] now */
- gamma_table_ready = TRUE;
- }
-
- /* Remember the gamma value */
- old_gamma_val = gamma_val;
- }
-
- /* Hack -- Gamma Correction */
- if (gamma_table_ready)
- {
- red = gamma_table[red];
- green = gamma_table[green];
- blue = gamma_table[blue];
- }
-
-#endif /* SUPPORT_GAMMA */
-
/* Build the color */
xcolour.red = red * 255 + red;
@@ -383,7 +344,7 @@ static int redShift, greenShift, blueShift;
/*
* Use smooth rescaling?
*/
-static bool smoothRescaling = TRUE;
+static bool_ smoothRescaling = TRUE;
/*
@@ -401,7 +362,7 @@ static void GetScaledRow(XImage *Im, int x, int y, int iw, int ow,
int xi, si, sifrac, ci, cifrac, addWhole, addFrac;
unsigned long pix;
int prevRed, prevGreen, prevBlue, nextRed, nextGreen, nextBlue;
- bool getNextPix;
+ bool_ getNextPix;
if (iw == ow)
{
@@ -580,7 +541,7 @@ static void ScaleIcon(XImage *ImIn, XImage *ImOut,
unsigned long tempGreen [MAX_ICON_WIDTH];
unsigned long tempBlue [MAX_ICON_WIDTH];
- bool getNextRow;
+ bool_ getNextRow;
/* get divider value for the horizontal scaling: */
if (ix == ox)
diff --git a/src/maim-iso.c b/src/maim-iso.c
deleted file mode 100644
index c217ca84..00000000
--- a/src/maim-iso.c
+++ /dev/null
@@ -1,873 +0,0 @@
-/*
- *
- * This file contains routines for maiming bitmaps as well as other
- * supplemental routines, all for SDL.
- *
- * Copyright 2001 Gregory Velichansky (hmaon@bumba.net)
- * You may use it under the terms of the standard Angband license (below) or
- * the GNU General Public License (GPL) Version 2 or greater. (see below)
- *
- * The Angband license states:
- * This software may be copied and distributed for educational, research,
- * and not for profit purposes provided that this copyright and statement
- * are included in all such copies. Other copyrights may also apply.
- *
- * The GNU GPL notice:
- main-sdl.c - SDL (http://libsdl.org) Term implementation for Angband.
- Copyright (C) 2001 Gregory Velichansky (hmaon@bumba.net)
-
- This program is free software; you can redistribute it and/or
- modify it under the terms of the GNU General Public License
- as published by the Free Software Foundation; either version 2
- of the License, or (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, please see
- http://www.gnu.org/copyleft/gpl.html
-
-
- Please see the file COPYING for more detail regarding Angband's current
- license situation.
-*/
-
-
-#include "angband.h"
-
-#if defined(USE_ISO) || defined(USE_LUA_GUI)
-
-
-#include "SDL/SDL.h"
-#include <string.h>
-#include <math.h> /* for scaling blits */
-//#include "bits/nan.h"
-
-/*
- *
- * Supplemental SDL bitmap manipulation functions.
- *
- * These could be moved to a separate file. In mai?-x11.c, similar routines
- * are separate from the main display module implementation.
- *
- */
-
-
-/* The most pedantic-a%& getpixel and putpixel ever, hopefully. */
-/* There may still be endianness bugs! These will be fixed after adequte testing. XXX XXX XXX */
-inline errr SDL_GetPixel (SDL_Surface *f, Uint32 x, Uint32 y, Uint8 *r, Uint8 *g, Uint8 *b)
-{
- /*const Uint32 mask[] = {0x0, 0xff, 0xffff, 0xffffff, 0xffffffff};*/
- Uint32 pixel;
-
- Uint8 *pp;
-
- int n; /* general purpose 'n'. */
-
- if (f == NULL) return -1;
-
- pp = (Uint8 *) f->pixels;
-
- if (x >= f->w || y >= f->h) return -1;
-
- pp += (f->pitch * y);
-
- pp += (x * f->format->BytesPerPixel);
-
- /* we do not lock the surface here, it would be inefficient XXX */
- /* this reads the pixel as though it was a big-endian integer XXX */
- /* I'm trying to avoid reading part the end of the pixel data by
- * using a data-type that's larger than the pixels */
- for (n = 0, pixel = 0; n < f->format->BytesPerPixel; ++n, ++pp)
- {
-#if SDL_BYTEORDER == SDL_LIL_ENDIAN
- pixel >>= 8;
- pixel |= *pp << (f->format->BitsPerPixel - 8);
-#else
-pixel |= *pp;
- pixel <<= 8;
-#endif
- }
-
- SDL_GetRGB(pixel, f->format, r, g, b);
- return 0;
-}
-
-/* This function looks remarkably similar to the one above. Yes, it's cut
- * and paste. */
-inline errr SDL_PutPixel (SDL_Surface *f, Uint32 x, Uint32 y, Uint8 r, Uint8 g, Uint8 b)
-{
- Uint32 pixel;
-
- Uint8 *pp;
-
- int n;
-
- if (f == NULL) return -1;
-
- pp = (Uint8 *) f->pixels;
-
- if (x >= f->w || y >= f->h) return -1;
-
- pp += (f->pitch * y);
-
- pp += (x * f->format->BytesPerPixel);
-
- pixel = SDL_MapRGB(f->format, r, g, b);
-
- for (n = 0; n < f->format->BytesPerPixel; ++n, ++pp)
- {
- *pp = (Uint8) (pixel & 0xFF);
- pixel >>= 8;
- }
-
- return 0;
-}
-
-
-/* This routine performs a scaling blit. It will shrink and magnify. :) */
-/* It uses floating point arithmetic (because I am lazy) so it's not too fast
- * but I only intend for it to be used in pre-processing, that is image
- * processing at load time. It's fast enough for that, at least.
- * Actually on my machine it IS fast enough to scale fonts and bitmaps
- * in real-time. :)
- * This routine uses a weighted average, the weight being based on overlapping
- * pixel area.
- */
-inline errr SDL_ScaleBlit(SDL_Surface *src, SDL_Rect *sr, SDL_Surface *dst, SDL_Rect *dr)
-{
- Uint8 r, g, b;
-
- float rs, gs, bs; /* sums */
-
- float area;
-
- float sx, sy; /* current source x and y */
- float dsx, dsy; /* source increment, per increment of 1 in destination */
-
- float wsx, wsy;
- /* width of source box. Equal to dsx,dsy except when either of then are
- * smaller than 1. This is a hack for smoother magnification. XXX */
-
-
- float x, y; /* x and y in sub-area */
-
- Uint32 tx, ty; /* "to" x and y */
- Uint32 lx, ly;
-
- float w, e, n, s; /* some temporary variables, named after orientations */
-
-
- if (src == NULL || sr == NULL || dst == NULL || dr == NULL) return -1;
-
- /* these are meaningless and would cause a divide by zero: */
- if (!dr->w || !dr->h) return -1;
-
- wsx = dsx = ((float) sr->w) / dr->w;
- if (wsx < 1) wsx = 1;
- wsy = dsy = ((float) sr->h) / dr->h;
- if (wsy < 1) wsy = 1;
-
- lx = dr->x + dr->w;
- ly = dr->y + dr->h;
-
- area = wsx * wsy;
-
-
-
- for (ty = dr->y, sy = (float)sr->y; ty < ly; ++ty, sy += dsy)
- {
- for (tx = dr->x, sx = (float)sr->x; tx < lx; ++tx, sx += dsx)
- {
- rs = gs = bs = 0.0;
- for (y = floor(sy) - 1; ceil(sy + wsy) > y; ++y)
- {
- for (x = floor(sx) - 1; ceil(sx + wsx) > x; ++x)
- {
- w = (x > sx) ? 0 : sx - x;
- n = (y > sy) ? 0 : sy - y;
-
- e = (sx + wsx >= x + 1) ? 1 : sx + wsx - x;
- s = (sy + wsy >= y + 1) ? 1 : sy + wsy - y;
-
- if (w > e || s < n ) continue;
-
-#define gsx ((Uint32)x >= sr->x+sr->w ? sr->x+sr->w-1 : (Uint32)x)
-#define gsy ((Uint32)y >= sr->y+sr->h ? sr->y+sr->h-1 : (Uint32)y)
- SDL_GetPixel (src, gsx, gsy, &r, &g, &b);
-
-
-
- rs += (e - w) * (s - n) * (float)r;
- gs += (e - w) * (s - n) * (float)g;
- bs += (e - w) * (s - n) * (float)b;
- }
- }
- rs /= area;
- gs /= area;
- bs /= area;
-
- if (rs >= 256.0 || gs >= 256.0 || bs > 256.0)
- {
- plog("weighted average error!");
- plog(format("Values: %f, %f, %f\n", rs, gs, bs));
- /**((char *)0) = 0;*/
- }
- if (rs > 255.0) rs = 255.0;
- if (gs > 255.0) gs = 255.0;
- if (bs > 255.0) bs = 255.0;
-
- r = (Uint8)rs;
- g = (Uint8)gs;
- b = (Uint8)bs;
-
- SDL_PutPixel (dst, tx, ty, r, g, b);
- }
- }
-
- return 0;
-#undef gsx
-#undef gsy
-}
-
-
-/* Integer math version of SDL_ScaleBlit().
- * Where necessary, a number uses the 16 high bits for the integer
- * and the 16 low bits for the decimal portion.
- *
- * eg:
- * float a = (float) (b >> 16) + (b & 0xFFFF)/65536.0;
- */
-
-inline Uint32 ifloor(Uint32 i)
-{
- return i & 0xFFFF0000;
-}
-
-inline Uint32 iceil(Uint32 i)
-{
- return (i & 0xFFFF) ? i : ifloor(i) + (1 << 16);
-}
-
-
-errr SDL_FastScaleBlit(SDL_Surface *src, SDL_Rect *sr, SDL_Surface *dst, SDL_Rect *dr)
-{
- Uint8 r, g, b;
- Uint32 rs, gs, bs; /* sums. */
-
- /* temp storage for large int multiplies. Uint64 doen't exist anywhere */
- double farea;
- Uint32 area;
-
- Uint32 sx, sy;
- Uint32 dsx, dsy;
-
- Uint32 wsx, wsy;
-
- Uint32 x, y; /* x and y, for sub-area */
-
- Uint32 tx, ty; /* normal integers */
- Uint32 lx, ly; /* normal integers */
-
- Uint32 w, e, n, s; /* temp variables, named after compass directions */
-
- if (src == NULL || sr == NULL || dst == NULL || dr == NULL) return -1;
-
- if (!dr->w || !dr->h) return -1;
-
-
- /* TODO FIXME check for possible overflows! */
-
- wsx = dsx = (sr->w << 16) / dr->w;
- if (!(wsx & 0xFFFF0000)) wsx = 1 << 16;
- wsy = dsy = (sr->h << 16) / dr->h;
- if (!(wsy & 0xFFFF0000)) wsy = 1 << 16;
-
- lx = dr->x + dr->w;
- ly = dr->y + dr->h;
-
- /* lazy multiplication. Hey, it's only once per blit. :P */
- farea = ((double)wsx) * ((double)wsy);
- farea /= (double)(1 << 16);
- area = (Uint32) farea;
-
- /* For optimization, those setup routines should be moved into
- * SDL_ScaleTiledBitmap() for that function.
- */
-
- for (ty = dr->y, sy = sr->y << 16; ty < ly; ++ty, sy += dsy)
- {
- for (tx = dr->x, sx = sr->x << 16; tx < lx; ++tx, sx += dsx)
- {
- rs = gs = bs = 0;
- for (y = ifloor(sy); iceil(sy + wsy) > y; y += (1 << 16))
- {
- for (x = ifloor(sx); iceil(sx + wsx) > x; x += (1 << 16))
- {
- w = (x > sx) ? 0 : sx - x;
- n = (y > sy) ? 0 : sy - y;
-
- e = (sx + wsx >= x + (1 << 16)) ? 1 << 16 : sx + wsx - x;
- s = (sy + wsy >= y + (1 << 16)) ? 1 << 16 : sy + wsy - y;
-
- if (w > e || s < n) continue;
-
-#define gsx ((x >> 16) >= sr->x+sr->w ? sr->x+sr->w-1 : x >> 16)
-#define gsy ((y >> 16) >= sr->y+sr->h ? sr->y+sr->h-1 : y >> 16)
-
- SDL_GetPixel (src, gsx, gsy, &r, &g, &b);
-
- rs += ((e - w) >> 8) * ((s - n) >> 8) * r;
- gs += ((e - w) >> 8) * ((s - n) >> 8) * g;
- bs += ((e - w) >> 8) * ((s - n) >> 8) * b;
- }
- }
- rs /= area;
- gs /= area;
- bs /= area;
-
- if (rs >= 256 || gs >= 256 || bs >= 256)
- {
- plog("fixed point weighted average overflow!");
- plog(format("Values: %d, %d, %d\n", rs, gs, bs));
- }
-
- r = (Uint8) rs;
- g = (Uint8) gs;
- b = (Uint8) bs;
-
- SDL_PutPixel (dst, tx, ty, r, g, b);
- }
- }
-
- return 0;
-#undef gsx
-#undef gsy
-}
-
-
-
-#if 0 /* the procedure above is a more generalized version of the one below */
-
-/* The following is a function to perform a Blit while magnifying */
-/* Anti-aliasing is performed. :) */
-/* It is probably very SLOW on most systems. Use it for pre-processing. XXX */
-/* a Blit while shrinking is handled by a different function */
-errr SDL_StretchBlit(SDL_Surface *src, SDL_Rect *sr, SDL_Surface *dst, SDL_Rect *dr)
-{
- double sx, sy; /* current source x and y */
- Uint32 isx, isy; /* temp. values for convenience in calculation code */
- double dsx, dsy; /* source increment, per increment of 1 in destination */
- double wx, wy; /* temp. weight values for the color mixing calculations */
- double weight; /* temp. weight of pixel */
-
- /* coordinates to get pixels from: ... */
-#undef gsx
-#define gsx (isx >= sr->x+sr->w ? sr->x+sr->w-1 : isx)
-#undef gsy
-#define gsy (isy >= sr->y+sr->h ? sr->y+sr->h-1 : isy)
-
-
- Uint32 tx, ty; /* "to" x and y. "dx, dy" would be too confusing. */
- Uint32 lx, ly; /* end x and y in destination, not inclusive */
-
- double r, g, b; /* temporary values on which we perform calculations */
- /*double s;*/ /* scale factor calculation thing. gross hack. don't ask. */
- Uint8 ir, ig, ib; /* same here. */
-
- if (src == NULL || sr == NULL || dst == NULL || dr == NULL) return -1;
-
- /* these are meaningless and would cause a divide by zero: */
- if (!dr->w || !dr->h) return -1;
-
- dsx = ((double) sr->w) / dr->w;
- dsy = ((double) sr->h) / dr->h;
-
- lx = dr->x + dr->w;
- ly = dr->y + dr->h;
-
- for (ty = dr->y, sy = (double)sr->y; ty < ly; ++ty, sy += dsy)
- {
- for (tx = dr->x, sx = (double)sr->x; tx < lx; ++tx, sx += dsx)
- {
- /* here we must consider four pixels and mix them together */
- /* the further away we are from a pixel, the less weight it has
- * when we mix in its color. Hence the "1 - hypot(..." etc.
- * Actually, no. Let's not use hypot().
- */
- /*
- * upper left pixel
- */
- wx = ((floor(sx) + 1) - sx);
- wy = ((floor(sy) + 1) - sy);
-
- isx = (Uint32) floor(sx);
- isy = (Uint32) floor(sy);
-
- if (SDL_GetPixel(src, gsx, gsy, &ir, &ig, &ib)) return -1;
-
- weight = wx * wy;
- /* the area of the overlap of our hypothetical and real pixel!!! */
- if (weight < 1 / 1024.0) weight = 0;
- r = weight * (double)ir;
- g = weight * (double)ig;
- b = weight * (double)ib;
- /*s = weight * 255.0;*/
-
- /*
- * upper right pixel
- */
- wx = 1 - wx;
- isx += 1;
-
- if (SDL_GetPixel(src, gsx, gsy, &ir, &ig, &ib)) return -1;
-
- weight = wx * wy;
- if (weight < 1 / 1024.0) weight = 0;
- r += weight * (double)ir;
- g += weight * (double)ig;
- b += weight * (double)ib;
- /*s += weight * 255.0;*/
-
- /*
- * lower right pixel
- */
- wy = 1 - wy;
- isy += 1;
-
- if (SDL_GetPixel(src, gsx, gsy, &ir, &ig, &ib)) return -1;
-
- weight = wx * wy;
- if (weight < 1 / 1024.0) weight = 0;
- r += weight * (double)ir;
- g += weight * (double)ig;
- b += weight * (double)ib;
- /*s += weight * 255.0;*/
-
- /*
- * lower left pixel
- */
- wx = 1 - wx;
- isx -= 1;
-
- if (SDL_GetPixel(src, gsx, gsy, &ir, &ig, &ib)) return -1;
-
- weight = wx * wy;
- if (weight < 1 / 1024.0) weight = 0;
- r += weight * (double)ir;
- g += weight * (double)ig;
- b += weight * (double)ib;
- /*s += weight * 255.0;*/
-
-
- /*
- r = 255 * (r/s);
- g = 255 * (g/s);
- b = 255 * (b/s);
- */
-
- if (r >= 256.0 || g >= 256.0 || b > 256.0)
- {
- plog("mixing error!");
- plog(format("Values: %f, %f, %f\n", (double)r, (double)g, (double)b));
- /**((char *)0) = 0;*/
- }
- if (r > 255.0) r = 255.0;
- if (g > 255.0) g = 255.0;
- if (b > 255.0) b = 255.0;
- ir = (Uint8) r;
- ig = (Uint8) g;
- ib = (Uint8) b;
-
- SDL_PutPixel(dst, tx, ty, ir, ig, ib);
- }
- }
-
- return 0;
-}
-
-#endif
-
-
-
-
-/* This function will take an SDL_Surface, allocate a new surface to hold
- * the resized surface, perform the scaling operation, free the old surface
- * and return the new one. This behaviour is vaguely modeled after C library
- * string functions. Returns NULL on grievous errors!
- *
- * The scaling operation is performed one or more times to accomodate
- * images comprised by a number of sub-images whose edges must not be blurred
- * with the edges of adjacent sub-images. (Think fonts and tile sets.)
- *
- * If t_oldw and t_oldh are set to src->w and src->h respectively
- *
- * t_oldw, t_oldh are the size of the old tiles
- */
-SDL_Surface *SDL_ScaleTiledBitmap (SDL_Surface *src,
- Uint32 t_oldw,
- Uint32 t_oldh,
- Uint32 t_neww,
- Uint32 t_newh,
- int dealloc_src)
-
-{
- SDL_Surface *dst;
- SDL_Rect sr, dr;
- Uint32 x, y;
- Uint32 nx, ny;
-
- if (!t_oldw || !t_oldh || !t_neww || !t_newh || !src) return NULL; /*dummy!*/
-
- if (t_oldw == t_neww && t_oldh == t_newh) return src; /* OK... */
-
- /* Get the number of tiles in the image.
- * Any possible clipped tiles at the edges are ignored.
- */
- nx = src->w / t_oldw;
- ny = src->h / t_oldh;
-
- /* Allocate a new SDL_Surface of appropriate size, with settings otherwise
- * identical to src.
- */
- dst = SDL_CreateRGBSurface(src->flags,
- nx * t_neww,
- ny * t_newh,
- /*src->format->BitsPerPixel,*/
- 16,
- src->format->Rmask,
- src->format->Gmask,
- src->format->Bmask,
- src->format->Amask);
-
-
- for (y = 0; y < ny; ++y)
- {
- for (x = 0; x < nx; ++x)
- {
- sr.w = t_oldw;
- sr.h = t_oldh;
- sr.x = x * t_oldw;
- sr.y = y * t_oldh;
-
- dr.w = t_neww;
- dr.h = t_newh;
- dr.x = x * t_neww;
- dr.y = y * t_newh;
-
- /*printf("%d,%d -> %d,%d (%d,%d -> %d, %d)\n", sr.x, sr.y, dr.x, dr.y, sr.w, sr.h, dr.w, dr.h);*/
-
- /* scale-blit one tile and check for error
- * although SDl_ScaleBlit() might not have any errors to return.
- */
- if (SDL_FastScaleBlit(src, &sr, dst, &dr)) return NULL;
- }
- }
-
- if (dealloc_src) SDL_FreeSurface(src);
-
- return dst;
-}
-
-
-/* The following function will extract height and width info from a filename
- * such as 16x16.xyz or 8X13.bar or even argle8ook16.foo
- *
- * I realize now that it's also useful for reading integers out of an argument
- * such as --fooscale1=2
- */
-
-errr strtoii(const char *str, Uint32 *w, Uint32 *h)
-{
- char buf[1024];
- char *s = buf;
- char *tok;
- char *numeric = "0123456789";
-
- size_t l; /* length of numeric string */
-
- if (!str || !w || !h) return -1;
-
- if (strlen(str) < 3) return -1; /* must have room for at least "1x1" */
-
- strncpy(buf, str, 1023);
- buf[1023] = '\0';
-
- tok = strpbrk(buf, numeric);
- if (!tok) return -1;
-
- l = strspn(tok, numeric);
- if (!l) return -1;
-
- tok[l] = '\0';
-
- s = tok + l + 1;
-
- if (!sscanf(tok, "%d", w)) return -1;
-
- /* next token */
- tok = strpbrk(s, numeric);
- if (!tok) return -1;
-
- l = strspn(tok, numeric);
- if (!l) return -1;
-
- tok[l] = '\0';
- /* no need to set s since this is the last token */
-
- if (!sscanf(tok, "%d", h)) return -1;
-
- return 0;
-
-}
-
-
-
-
-char *formatsdlflags(Uint32 flags)
-{
- return format ("%s%s%s%s%s%s%s%s%s%s (%x)",
- (flags & SDL_HWSURFACE) ? "SDL_HWSURFACE " : "",
- (flags & SDL_ANYFORMAT) ? "SDL_ANYFORMAT " : "",
- (flags & SDL_HWPALETTE) ? "SDL_HWPALETTE " : "",
- (flags & SDL_DOUBLEBUF) ? "SDL_DOUBLEBUF " : "",
- (flags & SDL_FULLSCREEN) ? "SDL_FULLSCREEN " : "",
- (flags & SDL_RESIZABLE) ? "SDL_RESIZABLE " : "",
- (flags & SDL_HWACCEL) ? "SDL_HWACCEL " : "",
- (flags & SDL_SRCCOLORKEY) ? "SDL_SRCCOLRKEY " : "",
- (flags & SDL_RLEACCEL) ? "SDL_RLEACCEL " : "",
- (flags & SDL_SRCALPHA) ? "SDL_SRCALPHA " : "",
- flags);
-};
-
-
-
-
-
-
-/* A lot of code for handling keystrokes follow. */
-
-
-typedef struct sdl_keymapt sdl_keymapt;
-
-struct sdl_keymapt
-{
- SDLKey k; /* what we get from SDL */
- char *s; /* what we feed to the Term_keypress */
- char *ctrl; /* what if CTRL is pressed? (NULL if the same) */
- char *shift; /* what if SHIFT is pressed? */
-};
-
-/* XXX XXX XXX the following keymap sucks. More comments below. */
-sdl_keymapt sdl_keymap[] =
-{
- /*{SDLK_UP, "", "Oa", "Ox"},
- {SDLK_DOWN, "", "Ob", "Or"},
- {SDLK_RIGHT, "", "Oc", "Ot"},
- {SDLK_LEFT, "", "Od", "Ov"},
- {SDLK_INSERT, "[2~", "[2^", "Op"},
- {SDLK_HOME, "[1~", "[1^", "Ow"},
- {SDLK_END, "[4~", "[4^", "Oq"},
- {SDLK_PAGEUP, "[5~", "[5^", "Oy"},
- {SDLK_PAGEDOWN, "[6~", "[6^", "Os"},*/
- {SDLK_F1, "[[A", NULL, NULL},
- {SDLK_F2, "[[B", NULL, NULL},
- {SDLK_F3, "[[C", NULL, NULL},
- {SDLK_F4, "[[D", NULL, NULL},
- {SDLK_F5, "[[E", NULL, NULL},
- {SDLK_F6, "[[17~", NULL, NULL},
- {SDLK_F7, "[[18~", NULL, NULL},
- {SDLK_F8, "[[19~", NULL, NULL},
- {SDLK_F9, "[[20~", NULL, NULL},
- {SDLK_F10, "[[21~", NULL, NULL},
- {SDLK_F11, "[[23~", NULL, NULL},
- {SDLK_F12, "[[24~", NULL, NULL},
- /* I have no machines with F13, F14, F15. Is that a Sun thing? */
- {SDLK_F13, "", NULL, NULL},
- {SDLK_F14, "", NULL, NULL},
- {SDLK_F15, "", NULL, NULL},
- {SDLK_RSHIFT, "", NULL, NULL},
- {SDLK_LSHIFT, "", NULL, NULL},
- {SDLK_RALT, "", NULL, NULL},
- {SDLK_LALT, "", NULL, NULL},
- {SDLK_RCTRL, "", NULL, NULL},
- {SDLK_LCTRL, "", NULL, NULL},
- {SDLK_RMETA, "", NULL, NULL},
- {SDLK_LMETA, "", NULL, NULL},
- {SDLK_NUMLOCK, "", NULL, NULL},
- {SDLK_CAPSLOCK, "", NULL, NULL},
- {SDLK_SCROLLOCK, "", NULL, NULL},
- {SDLK_LSUPER, "", NULL, NULL},
- {SDLK_RSUPER, "", NULL, NULL},
- {SDLK_HELP, "?", NULL, NULL},
- {SDLK_PRINT, "", NULL, NULL},
- {SDLK_SYSREQ, "", NULL, NULL},
- {SDLK_BREAK, "", NULL, NULL},
- {SDLK_MENU, "", NULL, NULL},
- {SDLK_POWER, "", NULL, NULL},
- {SDLK_EURO, "", NULL, NULL},
- {SDLK_0, "0", NULL, ")"}, /* XXX XXX XXX The CTRL-number keys need to be */
- {SDLK_1, "1", NULL, "!"}, /* defined since they represent digging for */
- {SDLK_2, "2", NULL, "@"}, /* some people!. Really, this whole table */
- {SDLK_3, "3", NULL, "#"}, /* should be replaced with something cleaner */
- {SDLK_4, "4", NULL, "$"}, /* and an SDL pref file should be created. */
- {SDLK_5, "5", NULL, "%"},
- {SDLK_6, "6", NULL, "^"},
- {SDLK_7, "7", NULL, "&"},
- {SDLK_8, "8", NULL, "*"},
- {SDLK_9, "9", NULL, "("},
- {SDLK_SEMICOLON, ";", NULL, ":"},
- {SDLK_COMMA, ",", NULL, "<"},
- {SDLK_PERIOD, ".", NULL, ">"},
- {SDLK_BACKSLASH, "\\", NULL, "|"},
- {SDLK_BACKQUOTE, "`", NULL, "~"},
- {SDLK_LEFTBRACKET, "[", NULL, "{"},
- {SDLK_RIGHTBRACKET, "]", NULL, "}"},
- {SDLK_MINUS, "-", NULL, "_"},
- {SDLK_EQUALS, "=", NULL, "+"},
- {SDLK_SLASH, "/", NULL, "?"},
- {SDLK_UNKNOWN, NULL, NULL, NULL} /* terminator */
-};
-
-void Multikeypress(char *k)
-{
- printf("zog : '%s'\n", k);
- while (*k) Term_keypress(*k++);
-}
-
-int IsMovement(SDLKey k)
-{
- switch (k)
- {
- case SDLK_UP:
- case SDLK_DOWN:
- case SDLK_RIGHT:
- case SDLK_LEFT:
- case SDLK_INSERT:
- case SDLK_HOME:
- case SDLK_END:
- case SDLK_PAGEUP:
- case SDLK_PAGEDOWN:
- case SDLK_KP0:
- case SDLK_KP1:
- case SDLK_KP2:
- case SDLK_KP3:
- case SDLK_KP4:
- case SDLK_KP5:
- case SDLK_KP6:
- case SDLK_KP7:
- case SDLK_KP8:
- case SDLK_KP9:
- return TRUE;
-
- default:
- return FALSE;
- }
- return 1234567; /* all good children go to heaven */
-}
-
-
-char *SDL_keysymtostr(SDL_keysym *ks)
-{
-#ifdef bufsize
-#error bufsize steps on previous define!
-#endif
-#define bufsize 1024
- int bufused = 0;
-
- /* I am returning a pointer to the below variable.
- * I /think/ this is legal but I am not sure! XXX XXX XXX
- * It certainly seems to work fine, at least under GCC.
- * It can easily be changed to a pointer passed as an argument.
- */
- static char buf[bufsize];
- Uint8 ch;
-
- /* cat for strings and app[end] for characters */
-#define sdlkcat(a) strncat(buf,(a),bufsize-bufused-1); bufused+=strlen((a));
-#define sdlkapp(a) if(bufused<bufsize-1) { buf[bufused]=a; buf[bufused+1]='\0'; bufused++; }
-
- buf[0] = '\0';
-
- // printf("%c\n", ks->unicode);
-
-
- if (IsMovement(ks->sym))
- {
- sprintf(buf, "%c%s%s%s%s_%lX%c", 31,
- ks->mod & KMOD_CTRL ? "N" : "",
- ks->mod & KMOD_SHIFT ? "S" : "",
- "", /* for future expansion. */
- ks->mod & KMOD_ALT ? "M" : "",
- (unsigned long) ks->sym, 13);
- ch = 0;
- }
- else
- {
- if (ks->mod & KMOD_ALT)
- {
- sdlkapp('');
- }
- ch = ks->unicode;
-
- }
-
- if (ch) sdlkapp(ch);
-
- return buf;
-
-
-#undef bufsize
-#undef sdlkcat
-#undef sdlkapp
-
-} /* SDL_keystring */
-
-
-
-/* Cursor hack, for testing of ideas. XXX XXX XXX */
-
-SDL_Surface *sdl_screen_cursor = NULL;
-SDL_Rect sdl_screen_cursor_sr;
-
-
-/* it must be true that w * h * 4 <= maxUint32 */
-
-errr SDL_init_screen_cursor(Uint32 w, Uint32 h)
-{
- Uint32 i;
-
- sdl_screen_cursor_sr.x = sdl_screen_cursor_sr.y = 0;
- sdl_screen_cursor_sr.w = w;
- sdl_screen_cursor_sr.h = h;
-
- sdl_screen_cursor = NULL;
- sdl_screen_cursor = SDL_CreateRGBSurface(SDL_SRCALPHA, w, h, 32,
- 0xff000000,
- 0x00ff0000,
- 0x0000ff00,
- 0x00000000);
-
- if (!sdl_screen_cursor) return -1;
-
- SDL_SetAlpha(sdl_screen_cursor, SDL_SRCALPHA | SDL_RLEACCEL, 0x80);
- for (i = 0; i < w*h*4; ++i)
- {
- ((Uint8 *)(sdl_screen_cursor->pixels))[i] = !(i & 2) ? 0x80 : 0xFF;
- }
-
- return 0;
-}
-
-errr SDL_DrawCursor(SDL_Surface *dst, SDL_Rect *dr)
-{
- if (!dst || !dr || !sdl_screen_cursor) return -1;
- if (SDL_BlitSurface(sdl_screen_cursor, &sdl_screen_cursor_sr, dst, dr)) return -1;
- SDL_UpdateRect(dst, dr->x, dr->y, dr->w, dr->h);
- return 0;
-}
-
-#endif
diff --git a/src/main-cap.c b/src/main-cap.c
deleted file mode 100644
index 6d44af28..00000000
--- a/src/main-cap.c
+++ /dev/null
@@ -1,1075 +0,0 @@
-/* File: main-cap.c */
-
-/* Purpose: Support for "term.c" using "termcap" calls */
-
-#include "angband.h"
-
-
-#ifdef USE_CAP
-
-
-/*
- * This file is a total hack, but is often very helpful. :-)
- *
- * This file allows use of the terminal without requiring the
- * "curses" routines. In fact, if "USE_HARDCODE" is defined,
- * this file will attempt to use various hard-coded "vt100"
- * escape sequences to also avoid the use of the "termcap"
- * routines. I do not know if this will work on System V.
- *
- * This file is intended for use only on those machines which are
- * unable, for whatever reason, to compile the "main-gcu.c" file,
- * but which seem to be able to support the "termcap" library, or
- * which at least seem able to support "vt100" terminals.
- *
- * Large portions of this file were stolen from "main-gcu.c"
- *
- * This file incorrectly handles output to column 80, I think.
- */
-
-
-/*
- * Require a "system"
- */
-#if !defined(USE_TERMCAP) && !defined(USE_HARDCODE)
-# define USE_TERMCAP
-#endif
-
-/*
- * Hack -- try to guess which systems use what commands
- * Hack -- allow one of the "USE_Txxxxx" flags to be pre-set.
- * Mega-Hack -- try to guess when "POSIX" is available.
- * If the user defines two of these, we will probably crash.
- */
-#if !defined(USE_TPOSIX)
-# if !defined(USE_TERMIO) && !defined(USE_TCHARS)
-# if defined(_POSIX_VERSION)
-# define USE_TPOSIX
-# else
-# if defined(USG) || defined(linux) || defined(SOLARIS)
-# define USE_TERMIO
-# else
-# define USE_TCHARS
-# endif
-# endif
-# endif
-#endif
-
-
-
-/*
- * POSIX stuff
- */
-#ifdef USE_TPOSIX
-# include <sys/ioctl.h>
-# include <termios.h>
-#endif
-
-/*
- * One version needs these files
- */
-#ifdef USE_TERMIO
-# include <sys/ioctl.h>
-# include <termio.h>
-#endif
-
-/*
- * The other needs these files
- */
-#ifdef USE_TCHARS
-# include <sys/ioctl.h>
-# include <sys/resource.h>
-# include <sys/param.h>
-# include <sys/file.h>
-# include <sys/types.h>
-#endif
-
-
-/*
- * XXX XXX Hack -- POSIX uses "O_NONBLOCK" instead of "O_NDELAY"
- *
- * They should both work due to the "(i != 1)" test in the code
- * which checks for the result of the "read()" command.
- */
-#ifndef O_NDELAY
-# define O_NDELAY O_NONBLOCK
-#endif
-
-
-
-
-#ifdef USE_TERMCAP
-
-/*
- * Termcap string information
- */
-
-static char blob[1024]; /* The "termcap" entry */
-static char area[1024]; /* The string extraction buffer */
-static char *next = area; /* The current "index" into "area" */
-static char *desc; /* The terminal name */
-
-#endif
-
-
-/*
- * Pointers into the "area"
- */
-
-static char *cm; /* Move cursor */
-static char *ch; /* Move cursor to horizontal location */
-static char *cv; /* Move cursor to vertical location */
-static char *ho; /* Move cursor to top left */
-static char *ll; /* Move cursor to bottom left */
-static char *cs; /* Set scroll area */
-static char *cl; /* Clear screen */
-static char *cd; /* Clear to end of display */
-static char *ce; /* Clear to end of line */
-static char *cr; /* Move to start of line */
-static char *so; /* Turn on standout */
-static char *se; /* Turn off standout */
-static char *md; /* Turn on bold */
-static char *me; /* Turn off bold */
-static char *vi; /* Cursor - invisible */
-static char *ve; /* Cursor - normal */
-static char *vs; /* Cursor - bright */
-
-
-/*
- * State variables
- */
-
-static int rows; /* Screen size (Y) */
-static int cols; /* Screen size (X) */
-static int curx; /* Cursor location (X) */
-static int cury; /* Cursor location (Y) */
-static int curv; /* Cursor visibility */
-
-
-/*
- * Extern functions
- */
-extern char *getenv();
-extern char *tgoto();
-extern char *tgetstr();
-
-
-/*
- * Write some chars to the terminal
- */
-static void ewrite(char *str)
-{
- int numtowrite, numwritten;
-
- /* See how much work we have */
- numtowrite = strlen(str);
-
- /* Write until done */
- while (numtowrite > 0)
- {
- /* Try to write the chars */
- numwritten = write(1, str, numtowrite);
-
- /* Handle FIFOs and EINTR */
- if (numwritten < 0) numwritten = 0;
-
- /* See what we completed */
- numtowrite -= numwritten;
- str += numwritten;
-
- /* Hack -- sleep if not done */
- if (numtowrite > 0) sleep(1);
- }
-}
-
-
-
-#ifdef USE_TERMCAP
-
-static char write_buffer[128];
-static char *write_buffer_ptr;
-
-static void output_one(char c)
-{
- *write_buffer_ptr++ = c;
-}
-
-static void tp(char *s)
-{
- /* Dump the string into us */
- write_buffer_ptr = write_buffer;
-
- /* Write the string with padding */
- tputs (s, 1, output_one);
-
- /* Finish the string */
- *write_buffer_ptr = '\0';
-
- /* Dump the recorded buffer */
- ewrite (write_buffer);
-}
-
-#endif
-
-#ifdef USE_HARDCODE
-
-static void tp(char *s)
-{
- ewrite(s);
-}
-
-#endif
-
-
-
-
-
-
-
-/*
- * Clear the screen
- */
-static void do_cl(void)
-{
- if (cl) tp (cl);
-}
-
-/*
- * Clear to the end of the line
- */
-static void do_ce(void)
-{
- if (ce) tp(ce);
-}
-
-
-/*
- * Set the cursor visibility (0 = invis, 1 = normal, 2 = bright)
- */
-static void curs_set(int vis)
-{
- char *v = NULL;
-
- if (!vis)
- {
- v = vi;
- }
- else if (vis > 1)
- {
- v = vs ? vs : ve;
- }
- else
- {
- v = ve ? ve : vs;
- }
-
- if (v) tp(v);
-}
-
-
-
-/*
- * Restrict scrolling to within these rows
- */
-static void do_cs(int y1, int y2)
-{
-
-#ifdef USE_TERMCAP
- if (cs) tp(tgoto(cs, y2, y1));
-#endif
-
-#ifdef USE_HARDCODE
- char temp[64];
- sprintf(temp, cs, y1, y2);
- tp (temp);
-#endif
-
-}
-
-
-
-/*
- * Go to the given screen location directly
- */
-static void do_cm(int x, int y)
-{
-
-#ifdef USE_TERMCAP
- if (cm) tp(tgoto(cm, x, y));
-#endif
-
-#ifdef USE_HARDCODE
- char temp[64];
- sprintf(temp, cm, y + 1, x + 1);
- tp(temp);
-#endif
-
-}
-
-
-/*
- * Go to the given screen location in a "clever" manner
- *
- * XXX XXX XXX This function could use some work!
- */
-static void do_move(int x1, int y1, int x2, int y2)
-{
- /* Hack -- unknown start location */
- if ((x1 == x2) && (y1 == y2)) do_cm(x2, y2);
-
- /* Left edge */
- else if (x2 == 0)
- {
- if ((y2 <= 0) && ho) tp(ho);
- else if ((y2 >= rows - 1) && ll) tp(ll);
- else if ((y2 == y1) && cr) tp(cr);
-#if 0
- else if ((y2 == y1 + 1) && cr && dn)
- {
- tp(cr);
- tp(dn);
- }
- else if ((y2 == y1 - 1) && cr && up)
- {
- tp(cr);
- tp(up);
- }
-#endif
- else do_cm(x2, y2);
- }
-
-#if 0
- /* Up/Down one line */
- else if ((x2 == x1) && (y2 == y1 + 1) && dn) tp(dn);
- else if ((x2 == x1) && (y2 == y1 - 1) && up) tp(up);
-#endif
-
- /* Default -- go directly there */
- else do_cm(x2, y2);
-}
-
-
-
-
-/*
- * Help initialize this file (see below)
- */
-errr init_cap_aux(void)
-{
-
-#ifdef USE_TERMCAP
-
- /* Get the terminal name (if possible) */
- desc = getenv("TERM");
- if (!desc) return (1);
-
- /* Get the terminal info */
- if (tgetent(blob, desc) != 1) return (2);
-
- /* Get the (initial) columns and rows, or default */
- if ((cols = tgetnum("co")) == -1) cols = 80;
- if ((rows = tgetnum("li")) == -1) rows = 24;
-
- /* Find out how to move the cursor to a given location */
- cm = tgetstr("cm", &next);
- if (!cm) return (10);
-
- /* Find out how to move the cursor to a given position */
- ch = tgetstr("ch", &next);
- cv = tgetstr("cv", &next);
-
- /* Find out how to "home" the screen */
- ho = tgetstr("ho", &next);
-
- /* Find out how to "last-line" the screen */
- ll = tgetstr("ll", &next);
-
- /* Find out how to do a "carriage return" */
- cr = tgetstr("cr", &next);
- if (!cr) cr = "\r";
-
- /* Find out how to clear the screen */
- cl = tgetstr("cl", &next);
- if (!cl) return (11);
-
- /* Find out how to clear to the end of display */
- cd = tgetstr("cd", &next);
-
- /* Find out how to clear to the end of the line */
- ce = tgetstr("ce", &next);
-
- /* Find out how to scroll (set the scroll region) */
- cs = tgetstr("cs", &next);
-
- /* Find out how to hilite */
- so = tgetstr("so", &next);
- se = tgetstr("se", &next);
- if (!so || !se) so = se = NULL;
-
- /* Find out how to bold */
- md = tgetstr("md", &next);
- me = tgetstr("me", &next);
- if (!md || !me) md = me = NULL;
-
- /* Check the cursor visibility stuff */
- vi = tgetstr("vi", &next);
- vs = tgetstr("vs", &next);
- ve = tgetstr("ve", &next);
-
-#endif
-
-#ifdef USE_HARDCODE
-
- /* Assume some defualt information */
- rows = 24;
- cols = 80;
-
- /* Clear screen */
- cl = "\033[2J\033[H"; /* --]--]-- */
-
- /* Clear to end of line */
- ce = "\033[K"; /* --]-- */
-
- /* Hilite on/off */
- so = "\033[7m"; /* --]-- */
- se = "\033[m"; /* --]-- */
-
- /* Scroll region */
- cs = "\033[%d;%dr"; /* --]-- */
-
- /* Move cursor */
- cm = "\033[%d;%dH"; /* --]-- */
-
-#endif
-
- /* Success */
- return (0);
-}
-
-
-
-
-
-
-
-/*
- * Save the "normal" and "angband" terminal settings
- */
-
-#ifdef USE_TPOSIX
-
-static struct termios norm_termios;
-
-static struct termios game_termios;
-
-#endif
-
-#ifdef USE_TERMIO
-
-static struct termio norm_termio;
-
-static struct termio game_termio;
-
-#endif
-
-#ifdef USE_TCHARS
-
-static struct sgttyb norm_ttyb;
-static struct tchars norm_tchars;
-static struct ltchars norm_ltchars;
-static int norm_local_chars;
-
-static struct sgttyb game_ttyb;
-static struct tchars game_tchars;
-static struct ltchars game_ltchars;
-static int game_local_chars;
-
-#endif
-
-
-
-/*
- * Are we active? Not really needed.
- */
-static int active = FALSE;
-
-
-/*
- * The main screen (no sub-screens)
- */
-static term term_screen_body;
-
-
-
-/*
- * Place the "keymap" into its "normal" state
- */
-static void keymap_norm(void)
-{
-
-#ifdef USE_TPOSIX
-
- /* restore the saved values of the special chars */
- (void)tcsetattr(0, TCSAFLUSH, &norm_termios);
-
-#endif
-
-#ifdef USE_TERMIO
-
- /* restore the saved values of the special chars */
- (void)ioctl(0, TCSETA, (char *)&norm_termio);
-
-#endif
-
-#ifdef USE_TCHARS
-
- /* restore the saved values of the special chars */
- (void)ioctl(0, TIOCSETP, (char *)&norm_ttyb);
- (void)ioctl(0, TIOCSETC, (char *)&norm_tchars);
- (void)ioctl(0, TIOCSLTC, (char *)&norm_ltchars);
- (void)ioctl(0, TIOCLSET, (char *)&norm_local_chars);
-
-#endif
-
-}
-
-
-/*
- * Place the "keymap" into the "game" state
- */
-static void keymap_game(void)
-{
-
-#ifdef USE_TPOSIX
-
- /* restore the saved values of the special chars */
- (void)tcsetattr(0, TCSAFLUSH, &game_termios);
-
-#endif
-
-#ifdef USE_TERMIO
-
- /* restore the saved values of the special chars */
- (void)ioctl(0, TCSETA, (char *)&game_termio);
-
-#endif
-
-#ifdef USE_TCHARS
-
- /* restore the saved values of the special chars */
- (void)ioctl(0, TIOCSETP, (char *)&game_ttyb);
- (void)ioctl(0, TIOCSETC, (char *)&game_tchars);
- (void)ioctl(0, TIOCSLTC, (char *)&game_ltchars);
- (void)ioctl(0, TIOCLSET, (char *)&game_local_chars);
-
-#endif
-
-}
-
-
-/*
- * Save the normal keymap
- */
-static void keymap_norm_prepare(void)
-{
-
-#ifdef USE_TPOSIX
-
- /* Get the normal keymap */
- tcgetattr(0, &norm_termios);
-
-#endif
-
-#ifdef USE_TERMIO
-
- /* Get the normal keymap */
- (void)ioctl(0, TCGETA, (char *)&norm_termio);
-
-#endif
-
-#ifdef USE_TCHARS
-
- /* Get the normal keymap */
- (void)ioctl(0, TIOCGETP, (char *)&norm_ttyb);
- (void)ioctl(0, TIOCGETC, (char *)&norm_tchars);
- (void)ioctl(0, TIOCGLTC, (char *)&norm_ltchars);
- (void)ioctl(0, TIOCLGET, (char *)&norm_local_chars);
-
-#endif
-
-}
-
-
-/*
- * Save the keymaps (normal and game)
- */
-static void keymap_game_prepare(void)
-{
-
-#ifdef USE_TPOSIX
-
- /* Acquire the current mapping */
- tcgetattr(0, &game_termios);
-
- /* Force "Ctrl-C" to interupt */
- game_termios.c_cc[VINTR] = (char)3;
-
- /* Force "Ctrl-Z" to suspend */
- game_termios.c_cc[VSUSP] = (char)26;
-
- /* Hack -- Leave "VSTART/VSTOP" alone */
-
- /* Disable the standard control characters */
- game_termios.c_cc[VQUIT] = (char) - 1;
- game_termios.c_cc[VERASE] = (char) - 1;
- game_termios.c_cc[VKILL] = (char) - 1;
- game_termios.c_cc[VEOF] = (char) - 1;
- game_termios.c_cc[VEOL] = (char) - 1;
-
- /* Normally, block until a character is read */
- game_termios.c_cc[VMIN] = 1;
- game_termios.c_cc[VTIME] = 0;
-
- /* Hack -- Turn off "echo" and "canonical" mode */
- game_termios.c_lflag &= ~(ECHO | ICANON);
-
-#endif
-
-#ifdef USE_TERMIO
-
- /* Acquire the current mapping */
- (void)ioctl(0, TCGETA, (char *)&game_termio);
-
- /* Force "Ctrl-C" to interupt */
- game_termio.c_cc[VINTR] = (char)3;
-
- /* Force "Ctrl-Z" to suspend */
- game_termio.c_cc[VSUSP] = (char)26;
-
- /* Hack -- Leave "VSTART/VSTOP" alone */
-
- /* Disable the standard control characters */
- game_termio.c_cc[VQUIT] = (char) - 1;
- game_termio.c_cc[VERASE] = (char) - 1;
- game_termio.c_cc[VKILL] = (char) - 1;
- game_termio.c_cc[VEOF] = (char) - 1;
- game_termio.c_cc[VEOL] = (char) - 1;
-
-#if 0
- /* Disable the non-posix control characters */
- game_termio.c_cc[VEOL2] = (char) - 1;
- game_termio.c_cc[VSWTCH] = (char) - 1;
- game_termio.c_cc[VDSUSP] = (char) - 1;
- game_termio.c_cc[VREPRINT] = (char) - 1;
- game_termio.c_cc[VDISCARD] = (char) - 1;
- game_termio.c_cc[VWERASE] = (char) - 1;
- game_termio.c_cc[VLNEXT] = (char) - 1;
- game_termio.c_cc[VSTATUS] = (char) - 1;
-#endif
-
- /* Normally, block until a character is read */
- game_termio.c_cc[VMIN] = 1;
- game_termio.c_cc[VTIME] = 0;
-
- /* Hack -- Turn off "echo" and "canonical" mode */
- game_termio.c_lflag &= ~(ECHO | ICANON);
-
-#endif
-
-#ifdef USE_TCHARS
-
- /* Get the default game characters */
- (void)ioctl(0, TIOCGETP, (char *)&game_ttyb);
- (void)ioctl(0, TIOCGETC, (char *)&game_tchars);
- (void)ioctl(0, TIOCGLTC, (char *)&game_ltchars);
- (void)ioctl(0, TIOCLGET, (char *)&game_local_chars);
-
- /* Force interupt (^C) */
- game_tchars.t_intrc = (char)3;
-
- /* Force start/stop (^Q, ^S) */
- game_tchars.t_startc = (char)17;
- game_tchars.t_stopc = (char)19;
-
- /* Cancel some things */
- game_tchars.t_quitc = (char) - 1;
- game_tchars.t_eofc = (char) - 1;
- game_tchars.t_brkc = (char) - 1;
-
- /* Force suspend (^Z) */
- game_ltchars.t_suspc = (char)26;
-
- /* Cancel some things */
- game_ltchars.t_dsuspc = (char) - 1;
- game_ltchars.t_rprntc = (char) - 1;
- game_ltchars.t_flushc = (char) - 1;
- game_ltchars.t_werasc = (char) - 1;
- game_ltchars.t_lnextc = (char) - 1;
-
- /* XXX XXX XXX XXX Verify this before use */
- /* Hack -- Turn off "echo" and "canonical" mode */
- /* game_termios.c_lflag &= ~(ECHO | ICANON); */
- game_ttyb.flag &= ~(ECHO | ICANON);
-
-#endif
-
-}
-
-
-
-
-
-
-
-
-/*
- * Suspend/Resume
- */
-static errr Term_xtra_cap_alive(int v)
-{
- /* Suspend */
- if (!v)
- {
- if (!active) return (1);
-
- /* Hack -- make sure the cursor is visible */
- curs_set(1);
-
- /* Move to bottom right */
- do_move(0, rows - 1, 0, rows - 1);
-
- /* Go to normal keymap mode */
- keymap_norm();
-
- /* No longer active */
- active = FALSE;
- }
-
- /* Resume */
- else
- {
- if (active) return (1);
-
- /* Hack -- restore the cursor location */
- do_move(curx, cury, curx, cury);
-
- /* Hack -- restore the cursor visibility */
- curs_set(curv);
-
- /* Go to angband keymap mode */
- keymap_game();
-
- /* Now we are active */
- active = TRUE;
- }
-
- /* Success */
- return (0);
-}
-
-
-
-/*
- * Process an event
- */
-static errr Term_xtra_cap_event(int v)
-{
- int i, arg;
- char buf[2];
-
- /* Wait */
- if (v)
- {
- /* Wait for one byte */
- i = read(0, buf, 1);
-
- /* Hack -- Handle "errors" */
- if ((i <= 0) && (errno != EINTR)) exit_game_panic();
- }
-
- /* Do not wait */
- else
- {
- /* Get the current flags for stdin */
- if ((arg = fcntl(0, F_GETFL, 0)) < 1) return (1);
-
- /* Tell stdin not to block */
- if (fcntl(0, F_SETFL, arg | O_NDELAY) < 0) return (1);
-
- /* Read one byte, if possible */
- i = read(0, buf, 1);
-
- /* Replace the flags for stdin */
- if (fcntl(0, F_SETFL, arg)) return (1);
- }
-
- /* No keys ready */
- if ((i != 1) || (!buf[0])) return (1);
-
- /* Enqueue the keypress */
- Term_keypress(buf[0]);
-
- /* Success */
- return (0);
-}
-
-
-
-
-/*
- * Actually move the hardware cursor
- */
-static errr Term_curs_cap(int x, int y)
-{
- /* Literally move the cursor */
- do_move(curx, cury, x, y);
-
- /* Save the cursor location */
- curx = x;
- cury = y;
-
- /* Success */
- return (0);
-}
-
-
-/*
- * Erase a grid of space
- *
- * XXX XXX XXX Note that we will never be asked to clear the
- * bottom line all the way to the bottom right edge, since we
- * have set the "avoid the bottom right corner" flag.
- */
-static errr Term_wipe_cap(int x, int y, int n)
-{
- int dx;
-
- /* Place the cursor */
- Term_curs_cap(x, y);
-
- /* Wipe to end of line */
- if (x + n >= 80)
- {
- do_ce();
- }
-
- /* Wipe region */
- else
- {
- for (dx = 0; dx < n; ++dx)
- {
- putc(' ', stdout);
- curx++;
- }
- }
-
- /* Success */
- return (0);
-}
-
-
-/*
- * Place some text on the screen using an attribute
- */
-static errr Term_text_cap(int x, int y, int n, byte a, cptr s)
-{
- int i;
-
- /* Move the cursor */
- Term_curs_cap(x, y);
-
- /* Dump the text, advance the cursor */
- for (i = 0; s[i]; i++)
- {
- /* Dump the char */
- putc(s[i], stdout);
-
- /* Advance cursor 'X', and wrap */
- if (++curx >= cols)
- {
- /* Reset cursor 'X' */
- curx = 0;
-
- /* Hack -- Advance cursor 'Y', and wrap */
- if (++cury == rows) cury = 0;
- }
- }
-
- /* Success */
- return (0);
-}
-
-
-/*
- * Handle a "special request"
- */
-static errr Term_xtra_cap(int n, int v)
-{
- /* Analyze the request */
- switch (n)
- {
- /* Clear the screen */
- case TERM_XTRA_CLEAR:
- do_cl();
- do_move(0, 0, 0, 0);
- return (0);
-
- /* Make a noise */
- case TERM_XTRA_NOISE:
- (void)write(1, "\007", 1);
- return (0);
-
- /* Change the cursor visibility */
- case TERM_XTRA_SHAPE:
- curv = v;
- curs_set(v);
- return (0);
-
- /* Suspend/Resume */
- case TERM_XTRA_ALIVE:
- return (Term_xtra_cap_alive(v));
-
- /* Process events */
- case TERM_XTRA_EVENT:
- return (Term_xtra_cap_event(v));
-
- /* Flush events */
- case TERM_XTRA_FLUSH:
- while (!Term_xtra_cap_event(FALSE));
- return (0);
-
- /* Delay */
- case TERM_XTRA_DELAY:
- usleep(1000 * v);
- return (0);
- }
-
- /* Not parsed */
- return (1);
-}
-
-
-
-
-/*
- * Init a "term" for this file
- */
-static void Term_init_cap(term *t)
-{
- if (active) return;
-
- /* Assume cursor at top left */
- curx = 0;
- cury = 0;
-
- /* Assume visible cursor */
- curv = 1;
-
- /* Clear the screen */
- do_cl();
-
- /* Hack -- visible cursor */
- curs_set(1);
-
- /* Assume active */
- active = TRUE;
-}
-
-
-/*
- * Nuke a "term" for this file
- */
-static void Term_nuke_cap(term *t)
-{
- if (!active) return;
-
- /* Hack -- make sure the cursor is visible */
- curs_set(1);
-
- /* Move to bottom right */
- do_move(0, rows - 1, 0, rows - 1);
-
- /* Normal keymap */
- keymap_norm();
-
- /* No longer active */
- active = FALSE;
-}
-
-
-
-
-
-
-
-
-
-
-/*
- * Prepare this file for Angband usage
- */
-errr init_cap(void)
-{
- term *t = &term_screen_body;
-
-
- /*** Initialize ***/
-
- /* Initialize the screen */
- if (init_cap_aux()) return ( -1);
-
- /* Hack -- Require large screen, or Quit with message */
- if ((rows < 24) || (cols < 80)) quit("Screen too small!");
-
-
- /*** Prepare to play ***/
-
- /* Extract the normal keymap */
- keymap_norm_prepare();
-
- /* Extract the game keymap */
- keymap_game_prepare();
-
- /* Hack -- activate the game keymap */
- keymap_game();
-
- /* Hack -- Do NOT buffer stdout */
- setbuf(stdout, NULL);
-
-
- /*** Now prepare the term ***/
-
- /* Initialize the term */
- term_init(t, 80, 24, 256);
-
- /* Avoid the bottom right corner */
- t->icky_corner = TRUE;
-
- /* Erase with "white space" */
- t->attr_blank = TERM_WHITE;
- t->char_blank = ' ';
-
- /* Set some hooks */
- t->init_hook = Term_init_cap;
- t->nuke_hook = Term_nuke_cap;
-
- /* Set some more hooks */
- t->text_hook = Term_text_cap;
- t->wipe_hook = Term_wipe_cap;
- t->curs_hook = Term_curs_cap;
- t->xtra_hook = Term_xtra_cap;
-
- /* Save the term */
- term_screen = t;
-
- /* Activate it */
- Term_activate(term_screen);
-
- /* Success */
- return (0);
-}
-
-
-#endif /* USE_CAP */
-
-
diff --git a/src/main-crb.c b/src/main-crb.c
index c03c29f2..a4a1a742 100644
--- a/src/main-crb.c
+++ b/src/main-crb.c
@@ -478,12 +478,10 @@
#if defined(MACINTOSH) || defined(MACH_O_CARBON)
-#ifdef PRIVATE_USER_PATH
-
/*
* Check and create if needed the directory dirpath
*/
-bool private_check_user_directory(cptr dirpath)
+bool_ private_check_user_directory(cptr dirpath)
{
/* Is this used anywhere else in *bands? */
struct stat stat_buf;
@@ -525,7 +523,7 @@ bool private_check_user_directory(cptr dirpath)
* home directory or try to create it if it doesn't exist.
* Returns FALSE if all the attempts fail.
*/
-static bool check_create_user_dir(void)
+static bool_ check_create_user_dir(void)
{
char dirpath[1024];
char versionpath[1024];
@@ -564,8 +562,6 @@ static bool check_create_user_dir(void)
private_check_user_directory(savepath);
}
-#endif /* PRIVATE_USER_PATH */
-
/*
* Variant-dependent features:
@@ -590,8 +586,6 @@ static bool check_create_user_dir(void)
# define ALLOW_BIG_SCREEN
# define HAS_SCORE_MENU
# define NEW_ZVIRT_HOOKS
-/* I can't ditch this, yet, because there are many variants */
-# define USE_TRANSPARENCY
#endif /* ANGBAND30X */
# define USE_DOUBLE_TILES
@@ -776,7 +770,7 @@ struct term_data
/*
* Forward declare -- see below
*/
-static bool CheckEvents(bool wait);
+static bool_ CheckEvents(bool_ wait);
#ifndef MACH_O_CARBON
@@ -839,7 +833,7 @@ static term_data data[MAX_TERM_DATA];
/*
* Note when "open"/"new" become valid
*/
-static bool initialized = FALSE;
+static bool_ initialized = FALSE;
@@ -2876,18 +2870,9 @@ static errr Term_text_mac(int x, int y, int n, byte a, const char *cp)
*
* Erase "n" characters starting at (x,y)
*/
-#ifdef USE_TRANSPARENCY
-# ifdef USE_EGO_GRAPHICS
static errr Term_pict_mac(int x, int y, int n, const byte *ap, const char *cp,
const byte *tap, const char *tcp,
const byte *eap, const char *ecp)
-# else /* USE_EGO_GRAPHICS */
-static errr Term_pict_mac(int x, int y, int n, const byte *ap, const char *cp,
- const byte *tap, const char *tcp)
-# endif /* USE_EGO_GRAPHICS */
-#else /* USE_TRANSPARENCY */
-static errr Term_pict_mac(int x, int y, int n, const byte *ap, const char *cp)
-#endif /* USE_TRANSPARENCY */
{
int i;
Rect dst_r;
@@ -2920,20 +2905,16 @@ static errr Term_pict_mac(int x, int y, int n, const byte *ap, const char *cp)
/* Scan the input */
for (i = 0; i < n; i++)
{
- bool done = FALSE;
+ bool_ done = FALSE;
byte a = *ap++;
char c = *cp++;
-#ifdef USE_TRANSPARENCY
byte ta = *tap++;
char tc = *tcp++;
-# ifdef USE_EGO_GRAPHICS
byte ea = *eap++;
char ec = *ecp++;
- bool has_overlay = (ea && ec);
-# endif /* USE_EGO_GRAPHICS */
-#endif
+ bool_ has_overlay = (ea && ec);
#ifdef USE_DOUBLE_TILES
@@ -2958,14 +2939,10 @@ static errr Term_pict_mac(int x, int y, int n, const byte *ap, const char *cp)
{
int col, row;
Rect src_r;
-#ifdef USE_TRANSPARENCY
int t_col, t_row;
Rect terrain_r;
-# ifdef USE_EGO_GRAPHICS
int e_col, e_row;
Rect ego_r;
-# endif /* USE_EGO_GRAPHICS */
-#endif /* USE_TRANSPARENCY */
/* Row and Col */
row = ((byte)a & 0x7F) % pict_rows;
@@ -2977,7 +2954,6 @@ static errr Term_pict_mac(int x, int y, int n, const byte *ap, const char *cp)
src_r.right = src_r.left + graf_width;
src_r.bottom = src_r.top + graf_height;
-#ifdef USE_TRANSPARENCY
/* Row and Col */
t_row = ((byte)ta & 0x7F) % pict_rows;
t_col = ((byte)tc & 0x7F) % pict_cols;
@@ -2988,8 +2964,6 @@ static errr Term_pict_mac(int x, int y, int n, const byte *ap, const char *cp)
terrain_r.right = terrain_r.left + graf_width;
terrain_r.bottom = terrain_r.top + graf_height;
-# ifdef USE_EGO_GRAPHICS
-
/* If there's an overlay */
if (has_overlay)
{
@@ -3004,10 +2978,6 @@ static errr Term_pict_mac(int x, int y, int n, const byte *ap, const char *cp)
ego_r.bottom = ego_r.top + graf_height;
}
-# endif /* USE_EGO_GRAPHICS */
-
-#endif /* USE_TRANSPARENCY */
-
/* Hardwire CopyBits */
RGBBackColor(&white);
RGBForeColor(&black);
@@ -3035,8 +3005,6 @@ static errr Term_pict_mac(int x, int y, int n, const byte *ap, const char *cp)
/* Get Pixmap handle */
pixmap_h = GetPortPixMap(port);
-#ifdef USE_TRANSPARENCY
-
/* Transparency effect */
switch (transparency_mode)
{
@@ -3069,8 +3037,6 @@ static errr Term_pict_mac(int x, int y, int n, const byte *ap, const char *cp)
(BitMap*)*pixmap_h,
&src_r, &dst_r, transparent, NULL);
-# ifdef USE_EGO_GRAPHICS
-
/* Draw overlay if there's one */
if (has_overlay)
{
@@ -3079,21 +3045,10 @@ static errr Term_pict_mac(int x, int y, int n, const byte *ap, const char *cp)
&ego_r, &dst_r, transparent, NULL);
}
-# endif /* USE_EGO_GRAPHICS */
-
break;
}
}
-#else /* USE_TRANSPARENCY */
-
- /* Draw the picture */
- CopyBits((BitMap*)frameP->framePix,
- (BitMap*)*pixmap_h,
- &src_r, &dst_r, srcCopy, NULL);
-
-#endif /* USE_TRANSPARENCY */
-
/* Release the lock and dispose the PixMap handle */
UnlockPortBits(port);
@@ -3379,7 +3334,7 @@ static void save_pref_short(const char *key, short value)
* Load preference value for key, returns TRUE if it succeeds with
* vptr updated appropriately, FALSE otherwise.
*/
-static bool query_load_pref_short(const char *key, short *vptr)
+static bool_ query_load_pref_short(const char *key, short *vptr)
{
CFStringRef cf_key;
CFNumberRef cf_value;
@@ -3499,7 +3454,7 @@ static void cf_save_prefs()
*/
static void cf_load_prefs()
{
- bool ok;
+ bool_ ok;
short pref_major, pref_minor, pref_patch, pref_extra;
int i;
@@ -3751,7 +3706,7 @@ static void save_pref_file(void)
* is 'SAVE'.
* Originally written by Peter Ammon
*/
-static bool select_savefile(bool all)
+static bool_ select_savefile(bool_ all)
{
OSErr err;
FSSpec theFolderSpec;
@@ -3905,7 +3860,7 @@ static void do_menu_file_new(void)
/*
* Handle menu: "File" + "Open" / "Import"
*/
-static void do_menu_file_open(bool all)
+static void do_menu_file_open(bool_ all)
{
/* Let the player to choose savefile */
if (!select_savefile(all)) return;
@@ -5526,7 +5481,7 @@ static void quit_calmly(void)
* undesirable monopoly of CPU. The side-effect is that you cannot do
* while (CheckEvents(TRUE)); without discretion.
*/
-static bool CheckEvents(bool wait)
+static bool_ CheckEvents(bool_ wait)
{
EventRecord event;
@@ -6389,10 +6344,8 @@ int main(void)
/* Note the "system" */
ANGBAND_SYS = "mac";
-#ifdef PRIVATE_USER_PATH
if (check_create_user_dir() == FALSE)
quit("Cannot create directory " PRIVATE_USER_PATH);
-#endif
/* Initialize */
init_stuff();
diff --git a/src/main-gcu.c b/src/main-gcu.c
index fa86da80..57c41703 100644
--- a/src/main-gcu.c
+++ b/src/main-gcu.c
@@ -25,10 +25,6 @@
* This code should work with most versions of "curses" or "ncurses",
* and the "main-ncu.c" file (and USE_NCU define) are no longer used.
*
- * See also "USE_CAP" and "main-cap.c" for code that bypasses "curses"
- * and uses the "termcap" information directly, or even bypasses the
- * "termcap" information and sends direct vt100 escape sequences.
- *
* This file provides up to 4 term windows.
*
* This file will attempt to redefine the screen colors to conform to
@@ -397,18 +393,6 @@ static void keymap_game_prepare(void)
game_termio.c_cc[VEOF] = (char) - 1;
game_termio.c_cc[VEOL] = (char) - 1;
-#if 0
- /* Disable the non-posix control characters */
- game_termio.c_cc[VEOL2] = (char) - 1;
- game_termio.c_cc[VSWTCH] = (char) - 1;
- game_termio.c_cc[VDSUSP] = (char) - 1;
- game_termio.c_cc[VREPRINT] = (char) - 1;
- game_termio.c_cc[VDISCARD] = (char) - 1;
- game_termio.c_cc[VWERASE] = (char) - 1;
- game_termio.c_cc[VLNEXT] = (char) - 1;
- game_termio.c_cc[VSTATUS] = (char) - 1;
-#endif
-
/* Normally, block until a character is read */
game_termio.c_cc[VMIN] = 1;
game_termio.c_cc[VTIME] = 0;
@@ -511,17 +495,6 @@ static errr Term_xtra_gcu_alive(int v)
}
-#if 0
-
-#ifdef USE_NCURSES
-const char help_gcu[] = "NCurses, for terminal console, subopts -b(ig screen)";
-#else /* USE_NCURSES */
-const char help_gcu[] = "Curses, for terminal console, subopts -b(ig screen)";
-#endif /* USE_NCURSES */
-
-#endif
-
-
/*
* Init the "curses" system
*/
@@ -612,8 +585,8 @@ static errr Term_xtra_gcu_event(int v)
for (k = 0; (k < 10) && (i == ERR); k++) i = getch();
/* Broken input is special */
- if (i == ERR) exit_game_panic();
- if (i == EOF) exit_game_panic();
+ if (i == ERR) abort();
+ if (i == EOF) abort();
}
/* Do not wait */
@@ -658,7 +631,7 @@ static errr Term_xtra_gcu_event(int v)
i = read(0, buf, 1);
/* Hack -- Handle bizarre "errors" */
- if ((i <= 0) && (errno != EINTR)) exit_game_panic();
+ if ((i <= 0) && (errno != EINTR)) abort();
}
/* Do not wait */
@@ -1010,7 +983,7 @@ errr init_gcu(int argc, char **argv)
int num_term = MAX_TERM_DATA, next_win = 0;
- bool use_big_screen = FALSE;
+ bool_ use_big_screen = FALSE;
/* Parse args */
diff --git a/src/main-gtk.c b/src/main-gtk.c
deleted file mode 100644
index 8a15e237..00000000
--- a/src/main-gtk.c
+++ /dev/null
@@ -1,5251 +0,0 @@
-/* File: main-gtk.c */
-
-/*
- * Copyright (c) 2000-2001 Robert Ruehlmann,
- * Steven Fuerst, Uwe Siems, "pelpel", et al.
- *
- * This software may be copied and distributed for educational, research,
- * and not for profit purposes provided that this copyright and statement
- * are included in all such copies.
- */
-
-/*
- * Robert Ruehlmann wrote the original Gtk port. Since an initial work is
- * much harder than enhancements, his effort worth more credits than
- * others.
- *
- * Steven Fuerst implemented colour-depth independent X server support,
- * graphics, resizing and big screen support for ZAngband as well as
- * fast image rescaling that is included here.
- *
- * Uwe Siems wrote smooth tiles rescaling code (on by default).
- * Try this with 8x8 tiles. They *will* look different.
- *
- * "pelpel" wrote another colour-depth independent X support
- * using GdkRGB, added several hooks and callbacks for various
- * reasons, wrote no-backing store mode (off by default),
- * added GtkItemFactory based menu system, introduced
- * USE_GRAPHICS code bloat (^ ^;), added comments (I have
- * a strange habit of writing comments while I code...)
- * and reorganised the file a bit.
- */
-
-#include "angband.h"
-
-
-/*
- * Activate variant-specific features
- *
- * Angband 2.9.3 and close variants don't require any.
- *
- * Angband 2.9.4 alpha and later removed the short-lived
- * can_save flag, so please #define can_save TRUE, or remove
- * all the references to it. They also changed long-lived
- * z-virt macro names. Find C_FREE/C_KILL and replace them
- * with FREE/KILL, which takes one pointer parameter.
- *
- * [Z]-based variants (Gum and Cth, for example) usually need
- * ANG293_COMPAT, ANG291_COMPAT and ANG281_RESET_VISUALS.
- *
- * [O] needs ANG293_COMPAT and ZANG_SAVE_GAME.
- *
- * ZAngband has its own enhanced main-gtk.c as mentioned above, and
- * you *should* use it :-)
- *
- * ANG291_COMPAT does not include Angband 2.9.x's gamma correction code.
- * If you like to use SUPPORT_GAMMA, copy the code bracketed
- * inside of #ifdef SUPPORT_GAMMA in util.c of Angband 2.9.1 or greater.
- */
-#define TOME
-
-#ifdef TOME
-# define ANG293_COMPAT /* Requires V2.9.3 compatibility code */
-# define ANG291_COMPAT /* Requires V2.9.1 compatibility code */
-# define ANG281_RESET_VISUALS /* The old style reset_visuals() */
-# define INTERACTIVE_GAMMA /* Supports interactive gamma correction */
-# define SAVEFILE_SCREEN /* New/Open integrated into the game */
-# define USE_DOUBLE_TILES /* Mogami's bigtile patch */
-#endif /* TOME */
-
-/*
- * Some examples
- */
-#ifdef ANGBAND300
-# define can_save TRUE /* Mimick the short-lived flag */
-# define C_FREE(P, N, T) FREE(P) /* Emulate the long-lived macro */
-# define USE_TRANSPARENCY /* Because it's default now */
-#endif /* ANGBAND300 */
-
-#ifdef GUMBAND
-# define ANG293_COMPAT /* Requires V2.9.3 compatibility code */
-# define ANG291_COMPAT /* Requires V2.9.1 compatibility code */
-# define ANG281_RESET_VISUALS /* The old style reset_visuals() */
-# define OLD_SAVEFILE_CODE /* See also SAVEFILE_MUTABLE in files.c */
-# define NO_REDRAW_SECTION /* Doesn't have Term_redraw_section() */
-#endif /* GUMBAND */
-
-#ifdef OANGBAND
-# define ANG293_COMPAT /* Requires V2.9.3 compatibility code */
-# define ZANG_SAVE_GAME /* do_cmd_save_game with auto_save parameter */
-#endif /* OANGBAND */
-
-
-#ifdef USE_GTK
-
-/* Force ANSI standard */
-/* #define __STRICT_ANSI__ */
-
-/* No GCC-specific includes */
-/* #undef __GNUC__ */
-
-#include <gtk/gtk.h>
-#include <gdk/gdkkeysyms.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <unistd.h>
-#include <dirent.h>
-
-/* /me pffts Solaris */
-#ifndef NAME_MAX
-#define NAME_MAX _POSIX_NAME_MAX
-#endif
-
-
-/*
- * Include some helpful X11 code.
- */
-#ifndef ANG293_COMPAT
-# include "maid-x11.h"
-#endif /* !ANG293_COMPAT */
-
-
-/*
- * Number of pixels inserted between the menu bar and the main screen
- */
-#define NO_PADDING 0
-
-
-/*
- * Largest possible number of terminal windows supported by the game
- */
-#define MAX_TERM_DATA 8
-
-
-/*
- * Extra data to associate with each "window"
- *
- * Each "window" is represented by a "term_data" structure, which
- * contains a "term" structure, which contains a pointer (t->data)
- * back to the term_data structure.
- */
-
-#ifdef USE_GRAPHICS
-
-/*
- * Since GdkRGB doesn't provide us some useful functions...
- */
-typedef struct GdkRGBImage GdkRGBImage;
-
-struct GdkRGBImage
-{
- gint width;
- gint height;
- gint ref_count;
- guchar *image;
-};
-
-#endif /* USE_GRAPHICS */
-
-
-/*
- * This structure holds everything you need to manipulate terminals
- */
-typedef struct term_data term_data;
-
-struct term_data
-{
- term t;
-
- GtkWidget *window;
- GtkWidget *drawing_area;
- GdkPixmap *backing_store;
- GdkFont *font;
- GdkGC *gc;
-
- bool shown;
- byte last_attr;
-
- int font_wid;
- int font_hgt;
-
- int rows;
- int cols;
-
-#ifdef USE_GRAPHICS
-
- int tile_wid;
- int tile_hgt;
-
- GdkRGBImage *tiles;
-# ifdef USE_TRANSPARENCY
- guint32 bg_pixel;
- GdkRGBImage *trans_buf;
-# endif /* USE_TRANSPARENCY */
-
-#endif /* USE_GRAPHICS */
-
- cptr name;
-};
-
-
-/*
- * Where to draw when we call Gdk drawing primitives
- */
-# define TERM_DATA_DRAWABLE(td) \
-((td)->backing_store ? (td)->backing_store : (td)->drawing_area->window)
-
-# define TERM_DATA_REFRESH(td, x, y, wid, hgt) \
-if ((td)->backing_store) gdk_draw_pixmap( \
-(td)->drawing_area->window, \
-(td)->gc, \
-(td)->backing_store, \
-(x) * (td)->font_wid, \
-(y) * (td)->font_hgt, \
-(x) * (td)->font_wid, \
-(y) * (td)->font_hgt, \
-(wid) * (td)->font_wid, \
-(hgt) * (td)->font_hgt)
-
-
-#if 0
-
-/* Compile time option version */
-
-# ifdef USE_BACKING_STORE
-
-# define TERM_DATA_DRAWABLE(td) (td)->backing_store
-
-# define TERM_DATA_REFRESH(td, x, y, wid, hgt) \
-gdk_draw_pixmap( \
-(td)->drawing_area->window, \
-(td)->gc, \
-(td)->backing_store, \
-(x) * (td)->font_wid, \
-(y) * (td)->font_hgt, \
-(x) * (td)->font_wid, \
-(y) * (td)->font_hgt, \
-(wid) * (td)->font_wid, \
-(hgt) * (td)->font_hgt)
-
-# else /* USE_BACKING_STORE */
-
-# define TERM_DATA_DRAWABLE(td) (td)->drawing_area->window
-# define TERM_DATA_REFRESH(td, x, y, wid, hgt)
-
-# endif /* USE_BACKING_STORE */
-
-#endif /* 0 */
-
-
-/*
- * An array of "term_data" structures, one for each "sub-window"
- */
-static term_data data[MAX_TERM_DATA];
-
-/*
- * Number of active terms
- */
-static int num_term = 1;
-
-
-/*
- * RGB values of the sixteen Angband colours
- */
-static guint32 angband_colours[16];
-
-
-/*
- * Set to TRUE when a game is in progress
- */
-static bool game_in_progress = FALSE;
-
-
-/*
- * This is in some cases used for double buffering as well as
- * a backing store, speeding things up under client-server
- * configurations, while turning this off *might* work better
- * with the MIT Shm extention which is usually active if you run
- * Angband locally, because it reduces amount of memory-to-memory copy.
- */
-static bool use_backing_store = TRUE;
-
-
-
-
-/**** Vanilla compatibility functions ****/
-
-#ifdef ANG293_COMPAT
-
-/*
- * Look up some environment variables to find font name for each window.
- */
-static cptr get_default_font(int term)
-{
- char buf[64];
- cptr font_name;
-
- /* Window specific font name */
- strnfmt(buf, 64, "ANGBAND_X11_FONT_%s", angband_term_name[term]);
-
- /* Check environment for that font */
- font_name = getenv(buf);
-
- /* Window specific font name */
- strnfmt(buf, 64, "ANGBAND_X11_FONT_%d", term);
-
- /* Check environment for that font */
- if (!font_name) font_name = getenv(buf);
-
- /* Check environment for "base" font */
- if (!font_name) font_name = getenv("ANGBAND_X11_FONT");
-
- /* No environment variables, use default font */
- if (!font_name) font_name = DEFAULT_X11_FONT_SCREEN;
-
- return (font_name);
-}
-
-
-# ifndef SAVEFILE_SCREEN
-
-/*
- * In [V]2.9.3, this frees all dynamically allocated memory
- */
-static void cleanup_angband(void)
-{
- /* XXX XXX XXX */
-}
-
-# endif /* !SAVEFILE_SCREEN */
-
-/*
- * New global flag to indicate if it's safe to save now
- */
-#define can_save TRUE
-
-#endif /* ANG293_COMPAT */
-
-
-#ifdef ANG291_COMPAT
-
-/*
- * The standard game uses this to implement lighting effects
- * for 16x16 tiles in cave.c...
- *
- * Because of the way it is implemented in X11 ports,
- * we can set this to TRUE even if we are using the 8x8 tileset.
- */
-static bool use_transparency = TRUE;
-
-#endif /* ANG291_COMPAT */
-
-
-
-
-/**** Low level routines - memory allocation ****/
-
-/*
- * Hook to "release" memory
- */
-#ifdef ANGBAND300
-static vptr hook_rnfree(vptr v)
-#else
-static vptr hook_rnfree(vptr v, huge size)
-#endif /* ANGBAND300 */
-{
- /* Dispose */
- g_free(v);
-
- /* Success */
- return (NULL);
-}
-
-
-/*
- * Hook to "allocate" memory
- */
-static vptr hook_ralloc(huge size)
-{
- /* Make a new pointer */
- return (g_malloc(size));
-}
-
-
-
-/**** Low level routines - colours and graphics ****/
-
-#ifdef SUPPORT_GAMMA
-
-/*
- * When set to TRUE, indicates that we can use gamma_table
- */
-static bool gamma_table_ready = FALSE;
-
-
-# ifdef INTERACTIVE_GAMMA
-
-/*
- * Initialise the gamma-correction table for current gamma_val
- * - interactive version
- */
-static void setup_gamma_table(void)
-{
- static u16b old_gamma_val = 0;
-
- /* Don't have to rebuild the table */
- if (gamma_val == old_gamma_val) return;
-
- /* Temporarily inactivate the table */
- gamma_table_ready = FALSE;
-
- /* Validate gamma_val */
- if ((gamma_val <= 0) || (gamma_val >= 256))
- {
- /* Reset */
- old_gamma_val = gamma_val = 0;
-
- /* Leave it inactive */
- return;
- }
-
- /* (Re)build the gamma table */
- build_gamma_table(gamma_val);
-
- /* Remember the gamma value used */
- old_gamma_val = gamma_val;
-
- /* Activate the table */
- gamma_table_ready = TRUE;
-}
-
-# else /* INTERACTIVE_GAMMA */
-
-/*
- * Initialise the gamma-correction table if environment variable
- * ANGBAND_X11_GAMMA is set and contains a meaningful value
- *
- * Restored for cross-variant compatibility
- */
-static void setup_gamma_table(void)
-{
- cptr tmp;
- int gamma_val;
-
-
- /* The table's already set up */
- if (gamma_table_ready) return;
-
- /*
- * XXX XXX It's documented nowhere, but ANGBAND_X11_GAMMA is
- * 256 * (1 / gamma), rounded to integer. A recommended value
- * is 183, which is an approximation of the Macintosh hardware
- * gamma of 1.4.
- *
- * gamma ANGBAND_X11_GAMMA
- * ----- -----------------
- * 1.2 213
- * 1.25 205
- * 1.3 197
- * 1.35 190
- * 1.4 183
- * 1.45 177
- * 1.5 171
- * 1.6 160
- * 1.7 151
- * ...
- *
- * XXX XXX The environment variable, or better,
- * the interact with colours command should allow users
- * to specify gamma values (or gamma value * 100).
- */
- tmp = getenv("ANGBAND_X11_GAMMA");
-
- /* Nothing to do */
- if (tmp == NULL) return;
-
- /* Extract the value */
- gamma_val = atoi(tmp);
-
- /*
- * Only need to build the table if gamma exists and set to
- * a meaningful value.
- *
- * XXX It may be a good idea to prevent use of very high gamma values,
- * say, greater than 2.5, which is gamma of normal CRT display IIRC.
- */
- if ((gamma_val <= 0) || (gamma_val >= 256)) return;
-
- /* Build the gamma correction table */
- build_gamma_table(gamma_val);
-
- /* The table is properly set up */
- gamma_table_ready = TRUE;
-}
-
-# endif /* INTERACTIVE_GAMMA */
-
-#endif /* SUPPORT_GAMMA */
-
-
-/*
- * Remeber RGB values for sixteen Angband colours, in a format
- * that is convinient for GdkRGB GC functions.
- *
- * XXX XXX Duplication of maid-x11.c is far from the Angband
- * ideal of code cleanliness, but the whole point of using GdkRGB
- * is to let it handle colour allocation which it does in a very
- * clever fashion. Ditto for the tile scaling code and the BMP loader
- * below.
- */
-static void init_colours(void)
-{
- int i;
-
-
-#ifdef SUPPORT_GAMMA
-
- /* (Re)build gamma table if necessary */
- setup_gamma_table();
-
-#endif /* SUPPORT_GAMMA */
-
- /* Process each colour */
- for (i = 0; i < 16; i++)
- {
- u32b red, green, blue;
-
- /* Retrieve RGB values from the game */
- red = angband_color_table[i][1];
- green = angband_color_table[i][2];
- blue = angband_color_table[i][3];
-
-#ifdef SUPPORT_GAMMA
-
- /* Hack -- Gamma Correction */
- if (gamma_table_ready)
- {
- red = gamma_table[red];
- green = gamma_table[green];
- blue = gamma_table[blue];
- }
-
-#endif /* SUPPORT_GAMMA */
-
- /* Remember a GdkRGB value, that is 0xRRGGBB */
- angband_colours[i] = (red << 16) | (green << 8) | blue;
- }
-}
-
-
-/*
- * Set foreground colour of window td to attr, only when it is necessary
- */
-static void term_data_set_fg(term_data *td, byte attr)
-{
- /* We can use the current gc */
- if (td->last_attr == attr) return;
-
- /* Activate the colour */
- gdk_rgb_gc_set_foreground(td->gc, angband_colours[attr]);
-
- /* Remember it */
- td->last_attr = attr;
-}
-
-
-#ifdef USE_GRAPHICS
-
-/*
- * Graphics mode selector - current setting and requested value
- */
-#define GRAF_MODE_NONE 0
-#define GRAF_MODE_OLD 1
-#define GRAF_MODE_NEW 2
-
-static int graf_mode = GRAF_MODE_NONE;
-static int graf_mode_request = GRAF_MODE_NONE;
-
-/*
- * Use smooth rescaling?
- */
-static bool smooth_rescaling = TRUE;
-static bool smooth_rescaling_request = TRUE;
-
-/*
- * Dithering
- */
-static GdkRgbDither dith_mode = GDK_RGB_DITHER_NORMAL;
-
-/*
- * Need to reload and resize tiles when fonts are changed.
- */
-static bool resize_request = FALSE;
-
-/*
- * Numbers of columns and rows in current tileset
- * calculated and set by the tile loading code in graf_init()
- * and used by Term_pict_gtk()
- */
-static int tile_rows;
-static int tile_cols;
-
-
-/*
- * Directory name(s)
- */
-static cptr ANGBAND_DIR_XTRA_GRAF;
-
-
-/*
- * Be nice to old graphics hardwares -- using GdkRGB.
- *
- * We don't have colour allocation failure any longer this way,
- * even with 8bpp X servers. Gimp *does* work with 8bpp, why not Angband?
- *
- * Initialisation (before any widgets are created)
- * gdk_rgb_init();
- * gtk_widget_set_default_colormap (gdk_rgb_get_cmap());
- * gtk_widget_set_default_visual (gdk_rgb_get_visual());
- *
- * Setting fg/bg colours
- * void gdk_rgb_gc_set_foreground(GdkGC *gc, guint32 rgb);
- * void gdk_rgb_gc_set_background(GdkGC *gc, guint32 rgb);
- * where rgb is 0xRRGGBB.
- *
- * Drawing rgb images
- * void gdk_draw_rgb_image(
- * GdkDrawable *drawable,
- * GdkGC *gc,
- * gint x, gint y,
- * gint width, gint height,
- * GdkRgbDither dith,
- * guchar *rgb_buf,
- * gint rowstride);
- *
- * dith:
- * GDK_RGB_DITHER_NORMAL : dither if 8bpp or below
- * GDK_RGB_DITHER_MAX : dither if 16bpp or below.
- *
- * for 0 <= i < width and 0 <= j < height,
- * the pixel (x + i, y + j) is colored with
- * red value rgb_buf[j * rowstride + i * 3],
- * green value rgb_buf[j * rowstride + i * 3 + 1], and
- * blue value rgb_buf[j * rowstride + i * 3 + 2].
- */
-
-/*
- * gdk_image compatibility functions - should be part of gdk, IMHO.
- */
-
-/*
- * Create GdkRGBImage of width * height and return pointer
- * to it. Returns NULL on failure
- */
-static GdkRGBImage *gdk_rgb_image_new(
- gint width,
- gint height)
-{
- GdkRGBImage *result;
-
- /* Allocate a struct */
- result = g_new(GdkRGBImage, 1);
-
- /* Oops */
- if (result == NULL) return (NULL);
-
- /* Allocate buffer */
- result->image = g_new0(guchar, width * height * 3);
-
- /* Oops */
- if (result->image == NULL)
- {
- g_free(result);
- return (NULL);
- }
-
- /* Initialise size fields */
- result->width = width;
- result->height = height;
-
- /* Initialise reference count */
- result->ref_count = 1;
-
- /* Success */
- return (result);
-}
-
-/*
- * Free a GdkRGBImage
- */
-static void gdk_rgb_image_destroy(
- GdkRGBImage *im)
-{
- /* Paranoia */
- if (im == NULL) return;
-
- /* Free the RGB buffer */
- g_free(im->image);
-
- /* Free the structure */
- g_free(im);
-}
-
-
-#if 0
-
-/*
- * Unref a GdkRGBImage
- */
-static void gdk_rgb_image_unref(
- GdkRGBImage *im)
-{
- /* Paranoia */
- g_return_if_fail(im != NULL);
-
- /* Decrease reference count by 1 */
- im->ref_count--;
-
- /* Free if nobody's using it */
- if (im->ref_count <= 0) gdk_rgb_image_destroy(im);
-}
-
-
-/*
- * Reference a GdkRGBImage
- */
-static void gdk_rgb_image_ref(
- GdkRGBImage *im)
-{
- /* Paranoia */
- g_return_if_fail(im != NULL);
-
- /* Increase reference count by 1 */
- im->ref_count++;
-}
-
-#endif /* 0 */
-
-
-/*
- * Write RGB pixel of the format 0xRRGGBB to (x, y) in GdkRGBImage
- */
-static void gdk_rgb_image_put_pixel(
- GdkRGBImage *im,
- gint x,
- gint y,
- guint32 pixel)
-{
- guchar *rgbp;
-
- /* Paranoia */
- g_return_if_fail(im != NULL);
-
- /* Paranoia */
- if ((x < 0) || (x >= im->width)) return;
-
- /* Paranoia */
- if ((y < 0) || (y >= im->height)) return;
-
- /* Access RGB data */
- rgbp = &im->image[(y * im->width * 3) + (x * 3)];
-
- /* Red */
- *rgbp++ = (pixel >> 16) & 0xFF;
- /* Green */
- *rgbp++ = (pixel >> 8) & 0xFF;
- /* Blue */
- *rgbp = pixel & 0xFF;
-}
-
-
-/*
- * Returns RGB pixel (0xRRGGBB) at (x, y) in GdkRGBImage
- */
-static guint32 gdk_rgb_image_get_pixel(
- GdkRGBImage *im,
- gint x,
- gint y)
-{
- guchar *rgbp;
-
- /* Paranoia */
- if (im == NULL) return (0);
-
- /* Paranoia - returns black */
- if ((x < 0) || (x >= im->width)) return (0);
-
- /* Paranoia */
- if ((y < 0) || (y >= im->height)) return (0);
-
- /* Access RGB data */
- rgbp = &im->image[(y * im->width * 3) + (x * 3)];
-
- /* Return result */
- return ((rgbp[0] << 16) | (rgbp[1] << 8) | (rgbp[2]));
-}
-
-
-/*
- * Since gdk_draw_rgb_image is a bit harder to use than it's
- * GdkImage counterpart, I wrote a grue function that takes
- * exactly the same parameters as gdk_draw_image, with
- * the GdkImage parameter replaced with GdkRGBImage.
- */
-static void gdk_draw_rgb_image_2(
- GdkDrawable *drawable,
- GdkGC *gc,
- GdkRGBImage *image,
- gint xsrc,
- gint ysrc,
- gint xdest,
- gint ydest,
- gint width,
- gint height)
-{
- /* Paranoia */
- g_return_if_fail(drawable != NULL);
- g_return_if_fail(image != NULL);
-
- /* Paranoia */
- if (xsrc < 0 || (xsrc + width - 1) >= image->width) return;
- if (ysrc < 0 || (ysrc + height - 1) >= image->height) return;
-
- /* Draw the image at (xdest, ydest), with dithering if bpp <= 8/16 */
- gdk_draw_rgb_image(
- drawable,
- gc,
- xdest,
- ydest,
- width,
- height,
- dith_mode,
- &image->image[(ysrc * image->width * 3) + (xsrc * 3)],
- image->width * 3);
-}
-
-
-/*
- * Code for smooth icon rescaling from Uwe Siems, Jan 2000
- *
- * XXX XXX Duplication of maid-x11.c, again. It doesn't do any colour
- * allocation, either.
- */
-
-/*
- * to save ourselves some labour, define a maximum expected icon width here:
- */
-#define MAX_ICON_WIDTH 32
-
-
-/*
- * Each pixel is kept in this structure during smooth rescaling
- * calculations, to make things a bit easier
- */
-typedef struct rgb_type rgb_type;
-
-struct rgb_type
-{
- guint32 red;
- guint32 green;
- guint32 blue;
-};
-
-/*
- * Because there are many occurences of this, and because
- * it's logical to do so...
- */
-#define pixel_to_rgb(pix, rgb_buf) \
-(rgb_buf)->red = ((pix) >> 16) & 0xFF; \
-(rgb_buf)->green = ((pix) >> 8) & 0xFF; \
-(rgb_buf)->blue = (pix) & 0xFF
-
-
-/*
- * get_scaled_row reads a scan from the given GdkRGBImage, scales it smoothly
- * and returns the red, green and blue values in arrays.
- * The values in this arrays must be divided by a certain value that is
- * calculated in scale_icon.
- * x, y is the position, iw is the input width and ow the output width
- * scan must be sufficiently sized
- */
-static void get_scaled_row(
- GdkRGBImage *im,
- int x,
- int y,
- int iw,
- int ow,
- rgb_type *scan)
-{
- int xi, si, sifrac, ci, cifrac, add_whole, add_frac;
- guint32 pix;
- rgb_type prev;
- rgb_type next;
- bool get_next_pix;
-
- /* Unscaled */
- if (iw == ow)
- {
- for (xi = 0; xi < ow; xi++)
- {
- pix = gdk_rgb_image_get_pixel(im, x + xi, y);
- pixel_to_rgb(pix, &scan[xi]);
- }
- }
-
- /* Scaling by subsampling (grow) */
- else if (iw < ow)
- {
- iw--;
- ow--;
-
- /* read first pixel: */
- pix = gdk_rgb_image_get_pixel(im, x, y);
- pixel_to_rgb(pix, &next);
- prev = next;
-
- /* si and sifrac give the subsampling position: */
- si = x;
- sifrac = 0;
-
- /* get_next_pix tells us, that we need the next pixel */
- get_next_pix = TRUE;
-
- for (xi = 0; xi <= ow; xi++)
- {
- if (get_next_pix)
- {
- prev = next;
- if (xi < ow)
- {
- /* only get next pixel if in same icon */
- pix = gdk_rgb_image_get_pixel(im, si + 1, y);
- pixel_to_rgb(pix, &next);
- }
- }
-
- /* calculate subsampled color values: */
- /* division by ow occurs in scale_icon */
- scan[xi].red = prev.red * (ow - sifrac) + next.red * sifrac;
- scan[xi].green = prev.green * (ow - sifrac) + next.green * sifrac;
- scan[xi].blue = prev.blue * (ow - sifrac) + next.blue * sifrac;
-
- /* advance sampling position: */
- sifrac += iw;
- if (sifrac >= ow)
- {
- si++;
- sifrac -= ow;
- get_next_pix = TRUE;
- }
- else
- {
- get_next_pix = FALSE;
- }
-
- }
- }
-
- /* Scaling by averaging (shrink) */
- else
- {
- /* width of an output pixel in input pixels: */
- add_whole = iw / ow;
- add_frac = iw % ow;
-
- /* start position of the first output pixel: */
- si = x;
- sifrac = 0;
-
- /* get first input pixel: */
- pix = gdk_rgb_image_get_pixel(im, x, y);
- pixel_to_rgb(pix, &next);
-
- for (xi = 0; xi < ow; xi++)
- {
- /* find endpoint of the current output pixel: */
- ci = si + add_whole;
- cifrac = sifrac + add_frac;
- if (cifrac >= ow)
- {
- ci++;
- cifrac -= ow;
- }
-
- /* take fraction of current input pixel (starting segment): */
- scan[xi].red = next.red * (ow - sifrac);
- scan[xi].green = next.green * (ow - sifrac);
- scan[xi].blue = next.blue * (ow - sifrac);
- si++;
-
- /* add values for whole pixels: */
- while (si < ci)
- {
- rgb_type tmp_rgb;
-
- pix = gdk_rgb_image_get_pixel(im, si, y);
- pixel_to_rgb(pix, &tmp_rgb);
- scan[xi].red += tmp_rgb.red * ow;
- scan[xi].green += tmp_rgb.green * ow;
- scan[xi].blue += tmp_rgb.blue * ow;
- si++;
- }
-
- /* add fraction of current input pixel (ending segment): */
- if (xi < ow - 1)
- {
- /* only get next pixel if still in icon: */
- pix = gdk_rgb_image_get_pixel(im, si, y);
- pixel_to_rgb(pix, &next);
- }
-
- sifrac = cifrac;
- if (sifrac > 0)
- {
- scan[xi].red += next.red * sifrac;
- scan[xi].green += next.green * sifrac;
- scan[xi].blue += next.blue * sifrac;
- }
- }
- }
-}
-
-
-/*
- * put_rgb_scan takes arrays for red, green and blue and writes pixel values
- * according to this values in the GdkRGBImage-structure. w is the number of
- * pixels to write and div is the value by which all red/green/blue values
- * are divided first.
- */
-static void put_rgb_scan(
- GdkRGBImage *im,
- int x,
- int y,
- int w,
- int div,
- rgb_type *scan)
-{
- int xi;
- guint32 pix;
- guint32 adj = div / 2;
-
- for (xi = 0; xi < w; xi++)
- {
- byte r, g, b;
-
- /* un-factor the RGB values */
- r = (scan[xi].red + adj) / div;
- g = (scan[xi].green + adj) / div;
- b = (scan[xi].blue + adj) / div;
-
-#ifdef SUPPORT_GAMMA
-
- /* Apply gamma correction if requested and available */
- if (gamma_table_ready)
- {
- r = gamma_table[r];
- g = gamma_table[g];
- b = gamma_table[b];
- }
-
-#endif /* SUPPORT_GAMMA */
-
- /* Make a (virtual) 24-bit pixel */
- pix = (r << 16) | (g << 8) | (b);
-
- /* Draw it into image */
- gdk_rgb_image_put_pixel(im, x + xi, y, pix);
- }
-}
-
-
-/*
- * scale_icon transfers an area from GdkRGBImage im_in, locate (x1,y1) to
- * im_out, locate (x2, y2). Source size is (ix, iy) and destination size
- * is (ox, oy).
- *
- * It does this by getting icon scan line from get_scaled_scan and handling
- * them the same way as pixels are handled in get_scaled_scan.
- * This even allows icons to be scaled differently in horizontal and
- * vertical directions (eg. shrink horizontal, grow vertical).
- */
-static void scale_icon(
- GdkRGBImage *im_in,
- GdkRGBImage *im_out,
- int x1,
- int y1,
- int x2,
- int y2,
- int ix,
- int iy,
- int ox,
- int oy)
-{
- int div;
- int xi, yi, si, sifrac, ci, cifrac, add_whole, add_frac;
-
- /* buffers for pixel rows: */
- rgb_type prev[MAX_ICON_WIDTH];
- rgb_type next[MAX_ICON_WIDTH];
- rgb_type temp[MAX_ICON_WIDTH];
-
- bool get_next_row;
-
- /* get divider value for the horizontal scaling: */
- if (ix == ox)
- div = 1;
- else if (ix < ox)
- div = ox - 1;
- else
- div = ix;
-
- /* no scaling needed vertically: */
- if (iy == oy)
- {
- for (yi = 0; yi < oy; yi++)
- {
- get_scaled_row(im_in, x1, y1 + yi, ix, ox, temp);
- put_rgb_scan(im_out, x2, y2 + yi, ox, div, temp);
- }
- }
-
- /* scaling by subsampling (grow): */
- else if (iy < oy)
- {
- iy--;
- oy--;
- div *= oy;
-
- /* get first row: */
- get_scaled_row(im_in, x1, y1, ix, ox, next);
-
- /* si and sifrac give the subsampling position: */
- si = y1;
- sifrac = 0;
-
- /* get_next_row tells us, that we need the next row */
- get_next_row = TRUE;
- for (yi = 0; yi <= oy; yi++)
- {
- if (get_next_row)
- {
- for (xi = 0; xi < ox; xi++)
- {
- prev[xi] = next[xi];
- }
- if (yi < oy)
- {
- /* only get next row if in same icon */
- get_scaled_row(im_in, x1, si + 1, ix, ox, next);
- }
- }
-
- /* calculate subsampled color values: */
- /* division by oy occurs in put_rgb_scan */
- for (xi = 0; xi < ox; xi++)
- {
- temp[xi].red = (prev[xi].red * (oy - sifrac) +
- next[xi].red * sifrac);
- temp[xi].green = (prev[xi].green * (oy - sifrac) +
- next[xi].green * sifrac);
- temp[xi].blue = (prev[xi].blue * (oy - sifrac) +
- next[xi].blue * sifrac);
- }
-
- /* write row to output image: */
- put_rgb_scan(im_out, x2, y2 + yi, ox, div, temp);
-
- /* advance sampling position: */
- sifrac += iy;
- if (sifrac >= oy)
- {
- si++;
- sifrac -= oy;
- get_next_row = TRUE;
- }
- else
- {
- get_next_row = FALSE;
- }
-
- }
- }
-
- /* scaling by averaging (shrink) */
- else
- {
- div *= iy;
-
- /* height of a output row in input rows: */
- add_whole = iy / oy;
- add_frac = iy % oy;
-
- /* start position of the first output row: */
- si = y1;
- sifrac = 0;
-
- /* get first input row: */
- get_scaled_row(im_in, x1, y1, ix, ox, next);
- for (yi = 0; yi < oy; yi++)
- {
- /* find endpoint of the current output row: */
- ci = si + add_whole;
- cifrac = sifrac + add_frac;
- if (cifrac >= oy)
- {
- ci++;
- cifrac -= oy;
- }
-
- /* take fraction of current input row (starting segment): */
- for (xi = 0; xi < ox; xi++)
- {
- temp[xi].red = next[xi].red * (oy - sifrac);
- temp[xi].green = next[xi].green * (oy - sifrac);
- temp[xi].blue = next[xi].blue * (oy - sifrac);
- }
- si++;
-
- /* add values for whole pixels: */
- while (si < ci)
- {
- get_scaled_row(im_in, x1, si, ix, ox, next);
- for (xi = 0; xi < ox; xi++)
- {
- temp[xi].red += next[xi].red * oy;
- temp[xi].green += next[xi].green * oy;
- temp[xi].blue += next[xi].blue * oy;
- }
- si++;
- }
-
- /* add fraction of current input row (ending segment): */
- if (yi < oy - 1)
- {
- /* only get next row if still in icon: */
- get_scaled_row(im_in, x1, si, ix, ox, next);
- }
- sifrac = cifrac;
- for (xi = 0; xi < ox; xi++)
- {
- temp[xi].red += next[xi].red * sifrac;
- temp[xi].green += next[xi].green * sifrac;
- temp[xi].blue += next[xi].blue * sifrac;
- }
-
- /* write row to output image: */
- put_rgb_scan(im_out, x2, y2 + yi, ox, div, temp);
- }
- }
-}
-
-
-/*
- * Rescale icons using sort of anti-aliasing technique.
- */
-static GdkRGBImage *resize_tiles_smooth(
- GdkRGBImage *im,
- int ix,
- int iy,
- int ox,
- int oy)
-{
- int width1, height1, width2, height2;
- int x1, x2, y1, y2;
-
- GdkRGBImage *tmp;
-
- /* Original size */
- width1 = im->width;
- height1 = im->height;
-
- /* Rescaled size */
- width2 = ox * width1 / ix;
- height2 = oy * height1 / iy;
-
- /* Allocate GdkRGBImage for resized tiles */
- tmp = gdk_rgb_image_new(width2, height2);
-
- /* Oops */
- if (tmp == NULL) return (NULL);
-
- /* Scale each icon */
- for (y1 = 0, y2 = 0; (y1 < height1) && (y2 < height2); y1 += iy, y2 += oy)
- {
- for (x1 = 0, x2 = 0; (x1 < width1) && (x2 < width2); x1 += ix, x2 += ox)
- {
- scale_icon(im, tmp, x1, y1, x2, y2,
- ix, iy, ox, oy);
- }
- }
-
- return tmp;
-}
-
-
-/*
- * Steven Fuerst's tile resizing code
- * Taken from Z because I think the algorithm is cool.
- */
-
-/* 24-bit version - GdkRGB uses 24 bit RGB data internally */
-static void copy_pixels(
- int wid,
- int y,
- int offset,
- int *xoffsets,
- GdkRGBImage *old_image,
- GdkRGBImage *new_image)
-{
- int i;
-
- /* Get source and destination */
- byte *src = &old_image->image[offset * old_image->width * 3];
- byte *dst = &new_image->image[y * new_image->width * 3];
-
- /* Copy to the image */
- for (i = 0; i < wid; i++)
- {
-#ifdef SUPPORT_GAMMA
-
- if (gamma_table_ready)
- {
- *dst++ = gamma_table[src[3 * xoffsets[i]]];
- *dst++ = gamma_table[src[3 * xoffsets[i] + 1]];
- *dst++ = gamma_table[src[3 * xoffsets[i] + 2]];
-
- continue;
- }
-
-#endif /* SUPPORT_GAMMA */
-
- *dst++ = src[3 * xoffsets[i]];
- *dst++ = src[3 * xoffsets[i] + 1];
- *dst++ = src[3 * xoffsets[i] + 2];
- }
-}
-
-
-#if 0
-
-/* 32-bit version: it might be useful in the future */
-static void copy_pixels(
- int wid,
- int y,
- int offset,
- int *xoffsets,
- GdkRGBImage *old_image,
- GdkRGBImage *new_image)
-{
- int i;
-
- /* Get source and destination */
- byte *src = &old_image->image[offset * old_image->width * 4];
- byte *dst = &new_image->image[y * new_image->width * 4];
-
- /* Copy to the image */
- for (i = 0; i < wid; i++)
- {
- *dst++ = src[4 * xoffsets[i]];
- *dst++ = src[4 * xoffsets[i] + 1];
- *dst++ = src[4 * xoffsets[i] + 2];
- *dst++ = src[4 * xoffsets[i] + 3];
- }
-}
-
-#endif
-
-
-/*
- * Resize ix * iy pixel tiles in old to ox * oy pixels
- * and return a new GdkRGBImage containing the resized tiles
- */
-static GdkRGBImage *resize_tiles_fast(
- GdkRGBImage *old_image,
- int ix,
- int iy,
- int ox,
- int oy)
-{
- GdkRGBImage *new_image;
-
- int old_wid, old_hgt;
-
- int new_wid, new_hgt;
-
- int add, remainder, rem_tot, offset;
-
- int *xoffsets;
-
- int i;
-
-
- /* Get the size of the old image */
- old_wid = old_image->width;
- old_hgt = old_image->height;
-
- /* Calculate the size of the new image */
- new_wid = (old_wid / ix) * ox;
- new_hgt = (old_hgt / iy) * oy;
-
- /* Allocate a GdkRGBImage to store resized tiles */
- new_image = gdk_rgb_image_new(new_wid, new_hgt);
-
- /* Paranoia */
- if (new_image == NULL) return (NULL);
-
- /* now begins the cool part of SF's code */
-
- /*
- * Calculate an offsets table, so the transformation
- * is faster. This is much like the Bresenham algorithm
- */
-
- /* Set up x offset table */
- C_MAKE(xoffsets, new_wid, int);
-
- /* Initialize line parameters */
- add = old_wid / new_wid;
- remainder = old_wid % new_wid;
-
- /* Start at left */
- offset = 0;
-
- /* Half-tile offset so 'line' is centered correctly */
- rem_tot = new_wid / 2;
-
- for (i = 0; i < new_wid; i++)
- {
- /* Store into the table */
- xoffsets[i] = offset;
-
- /* Move to next entry */
- offset += add;
-
- /* Take care of fractional part */
- rem_tot += remainder;
- if (rem_tot >= new_wid)
- {
- rem_tot -= new_wid;
- offset++;
- }
- }
-
- /* Scan each row */
-
- /* Initialize line parameters */
- add = old_hgt / new_hgt;
- remainder = old_hgt % new_hgt;
-
- /* Start at left */
- offset = 0;
-
- /* Half-tile offset so 'line' is centered correctly */
- rem_tot = new_hgt / 2;
-
- for (i = 0; i < new_hgt; i++)
- {
- /* Copy pixels to new image */
- copy_pixels(new_wid, i, offset, xoffsets, old_image, new_image);
-
- /* Move to next entry */
- offset += add;
-
- /* Take care of fractional part */
- rem_tot += remainder;
- if (rem_tot >= new_hgt)
- {
- rem_tot -= new_hgt;
- offset++;
- }
- }
-
- /* Free offset table */
- C_FREE(xoffsets, new_wid, int);
-
- return (new_image);
-}
-
-
-/*
- * Resize an image of ix * iy pixels and return a newly allocated
- * image of ox * oy pixels.
- */
-static GdkRGBImage *resize_tiles(
- GdkRGBImage *im,
- int ix,
- int iy,
- int ox,
- int oy)
-{
- GdkRGBImage *result;
-
- /*
- * I hope we can always use this with GdkRGB, which uses a 5x5x5
- * colour cube (125 colours) by default, and resort to dithering
- * when it can't find good match there or expand the cube, so it
- * works with 8bpp X servers.
- */
- if (smooth_rescaling_request && (ix != ox || iy != oy))
- {
- result = resize_tiles_smooth(im, ix, iy, ox, oy);
- }
-
- /*
- * Unless smoothing is requested by user, we use the fast
- * resizing code.
- */
- else
- {
- result = resize_tiles_fast(im, ix, iy, ox, oy);
- }
-
- /* Return rescaled tiles, or NULL */
- return (result);
-}
-
-
-/*
- * Tile loaders - XPM and BMP
- */
-
-/*
- * A helper function for the XPM loader
- *
- * Read next string delimited by double quotes from
- * the input stream. Return TRUE on success, FALSE
- * if it finds EOF or buffer overflow.
- *
- * I never mean this to be generic, so its EOF and buffer
- * overflow behaviour is terribly stupid -- there are no
- * provisions for recovery.
- *
- * CAVEAT: treatment of backslash is not compatible with the standard
- * C usage XXX XXX XXX XXX
- */
-static bool read_str(char *buf, u32b len, FILE *f)
-{
- int c;
-
- /* Paranoia - Buffer too small */
- if (len <= 0) return (FALSE);
-
- /* Find " */
- while ((c = getc(f)) != '"')
- {
- /* Premature EOF */
- if (c == EOF) return (FALSE);
- }
-
- while (1)
- {
- /* Read next char */
- c = getc(f);
-
- /* Premature EOF */
- if (c == EOF) return (FALSE);
-
- /* Terminating " */
- if (c == '"') break;
-
- /* Escape */
- if (c == '\\')
- {
- /* Use next char */
- c = getc(f);
-
- /* Premature EOF */
- if (c == EOF) return (FALSE);
- }
-
- /* Store character in the buffer */
- *buf++ = c;
-
- /* Decrement count */
- len--;
-
- /* Buffer full - we have to place a NULL at the end */
- if (len <= 0) return (FALSE);
- }
-
- /* Make a C string if there's room left */
- if (len > 0) *buf = '\0';
-
- /* Success */
- return (TRUE);
-}
-
-
-/*
- * Remember pixel symbol to RGB colour mappings
- */
-
-/*
- * I've forgot the formula, but I remember prime number yields
- * good results
- */
-#define HASH_SIZE 19
-
-typedef struct pal_type pal_type;
-
-struct pal_type
-{
- u32b str;
- u32b rgb;
- pal_type *next;
-};
-
-
-/*
- * A simple, slow and stupid XPM loader
- */
-static GdkRGBImage *load_xpm(cptr filename)
-{
- FILE *f;
- GdkRGBImage *img = NULL;
- int width, height, colours, chars;
- int i, j, k;
- bool ret;
- pal_type *pal = NULL;
- pal_type *head[HASH_SIZE];
- u32b buflen = 0;
- char *lin = NULL;
- char buf[1024];
-
- /* Build path to the XPM file */
- path_build(buf, 1024, ANGBAND_DIR_XTRA_GRAF, filename);
-
- /* Open it */
- f = my_fopen(buf, "r");
-
- /* Oops */
- if (f == NULL) return (NULL);
-
- /* Read header */
- ret = read_str(buf, 1024, f);
-
- /* Oops */
- if (!ret)
- {
- /* Notify error */
- plog("Cannot find XPM header");
-
- /* Failure */
- goto oops;
- }
-
- /* Parse header */
- if (4 != sscanf(buf, "%d %d %d %d", &width, &height, &colours, &chars))
- {
- /* Notify error */
- plog("Bad XPM header");
-
- /* Failure */
- goto oops;
- }
-
- /*
- * Paranoia - the code can handle upto four letters per pixel,
- * but such large number of colours certainly requires a smarter
- * symbol-to-colour mapping algorithm...
- */
- if ((width <= 0) || (height <= 0) || (colours <= 0) || (chars <= 0) ||
- (chars > 2))
- {
- /* Notify error */
- plog("Invalid width/height/depth");
-
- /* Failure */
- goto oops;
- }
-
- /* Allocate palette */
- C_MAKE(pal, colours, pal_type);
-
- /* Initialise hash table */
- for (i = 0; i < HASH_SIZE; i++) head[i] = NULL;
-
- /* Parse palette */
- for (i = 0; i < colours; i++)
- {
- u32b tmp;
- int h_idx;
-
- /* Read next string */
- ret = read_str(buf, 1024, f);
-
- /* Check I/O result */
- if (!ret)
- {
- /* Notify error */
- plog("EOF in palette");
-
- /* Failure */
- goto oops;
- }
-
- /* Clear symbol code */
- tmp = 0;
-
- /* Encode pixel symbol */
- for (j = 0; j < chars; j++)
- {
- tmp = (tmp << 8) | (buf[j] & 0xFF);
- }
-
- /* Remember it */
- pal[i].str = tmp;
-
- /* Skip spaces */
- while ((buf[j] == ' ') || (buf[j] == '\t')) j++;
-
- /* Verify 'c' */
- if (buf[j] != 'c')
- {
- /* Notify error */
- plog("No 'c' in palette definition");
-
- /* Failure */
- goto oops;
- }
-
- /* Advance cursor */
- j++;
-
- /* Skip spaces */
- while ((buf[j] == ' ') || (buf[j] == '\t')) j++;
-
- /* Hack - Assume 'None' */
- if (buf[j] == 'N')
- {
- /* Angband always uses black background */
- pal[i].rgb = 0x000000;
- }
-
- /* Read colour */
- else if ((1 != sscanf(&buf[j], "#%06lX", &tmp)) &&
- (1 != sscanf(&buf[j], "#%06lx", &tmp)))
- {
- /* Notify error */
- plog("Badly formatted colour");
-
- /* Failure */
- goto oops;
- }
-
- /* Remember it */
- pal[i].rgb = tmp;
-
- /* Store it in hash table as well */
- h_idx = pal[i].str % HASH_SIZE;
-
- /* Link the entry */
- pal[i].next = head[h_idx];
- head[h_idx] = &pal[i];
- }
-
- /* Allocate image */
- img = gdk_rgb_image_new(width, height);
-
- /* Oops */
- if (img == NULL)
- {
- /* Notify error */
- plog("Cannot allocate image");
-
- /* Failure */
- goto oops;
- }
-
- /* Calculate buffer length */
- buflen = width * chars + 1;
-
- /* Allocate line buffer */
- C_MAKE(lin, buflen, char);
-
- /* For each row */
- for (i = 0; i < height; i++)
- {
- /* Read a row of image data */
- ret = read_str(lin, buflen, f);
-
- /* Oops */
- if (!ret)
- {
- /* Notify error */
- plog("EOF in middle of image data");
-
- /* Failure */
- goto oops;
- }
-
- /* For each column */
- for (j = 0; j < width; j++)
- {
- u32b tmp;
- pal_type *h_ptr;
-
- /* Clear encoded pixel */
- tmp = 0;
-
- /* Encode pixel symbol */
- for (k = 0; k < chars; k++)
- {
- tmp = (tmp << 8) | (lin[j * chars + k] & 0xFF);
- }
-
- /* Find colour */
- for (h_ptr = head[tmp % HASH_SIZE];
- h_ptr != NULL;
- h_ptr = h_ptr->next)
- {
- /* Found a match */
- if (h_ptr->str == tmp) break;
- }
-
- /* No match found */
- if (h_ptr == NULL)
- {
- /* Notify error */
- plog("Invalid pixel symbol");
-
- /* Failure */
- goto oops;
- }
-
- /* Draw it */
- gdk_rgb_image_put_pixel(
- img,
- j,
- i,
- h_ptr->rgb);
- }
- }
-
- /* Close file */
- my_fclose(f);
-
- /* Free line buffer */
- C_FREE(lin, buflen, char);
-
- /* Free palette */
- C_FREE(pal, colours, pal_type);
-
- /* Return result */
- return (img);
-
-oops:
-
- /* Close file */
- my_fclose(f);
-
- /* Free image */
- if (img) gdk_rgb_image_destroy(img);
-
- /* Free line buffer */
- if (lin) C_FREE(lin, buflen, char);
-
- /* Free palette */
- if (pal) C_FREE(pal, colours, pal_type);
-
- /* Failure */
- return (NULL);
-}
-
-
-/*
- * A BMP loader, yet another duplication of maid-x11.c functions.
- *
- * Another duplication, again because of different image format and
- * avoidance of colour allocation.
- *
- * XXX XXX XXX XXX Should avoid using a propriatary and closed format.
- * Since it's much bigger than gif that was used before, why don't
- * we switch to XPM? NetHack does. Well, NH has always been much
- * closer to the GNU/Un*x camp and it's GPL'ed quite early...
- *
- * The names and naming convention are worse than the worst I've ever
- * seen, so I deliberately changed them to fit well with the rest of
- * the code. Or are they what xx calls them? If it's the case, there's
- * no reason to follow *their* words.
- */
-
-/*
- * BMP file header
- */
-typedef struct bmp_file_type bmp_file_type;
-
-struct bmp_file_type
-{
- u16b type;
- u32b size;
- u16b reserved1;
- u16b reserved2;
- u32b offset;
-};
-
-
-/*
- * BMP file information fields
- */
-typedef struct bmp_info_type bmp_info_type;
-
-struct bmp_info_type
-{
- u32b size;
- u32b width;
- u32b height;
- u16b planes;
- u16b bit_count;
- u32b compression;
- u32b size_image;
- u32b x_pels_per_meter;
- u32b y_pels_per_meter;
- u32b colors_used;
- u32b color_importand;
-};
-
-/*
- * "RGBQUAD" type.
- */
-typedef struct rgb_quad_type rgb_quad_type;
-
-struct rgb_quad_type
-{
- unsigned char b, g, r;
- unsigned char filler;
-};
-
-
-/*** Helper functions for system independent file loading. ***/
-
-static byte get_byte(FILE *fff)
-{
- /* Get a character, and return it */
- return (getc(fff) & 0xFF);
-}
-
-static void rd_byte(FILE *fff, byte *ip)
-{
- *ip = get_byte(fff);
-}
-
-static void rd_u16b(FILE *fff, u16b *ip)
-{
- (*ip) = get_byte(fff);
- (*ip) |= ((u16b)(get_byte(fff)) << 8);
-}
-
-static void rd_u32b(FILE *fff, u32b *ip)
-{
- (*ip) = get_byte(fff);
- (*ip) |= ((u32b)(get_byte(fff)) << 8);
- (*ip) |= ((u32b)(get_byte(fff)) << 16);
- (*ip) |= ((u32b)(get_byte(fff)) << 24);
-}
-
-
-/*
- * Read a BMP file (a certain trademark nuked)
- *
- * This function replaces the old ReadRaw and RemapColors functions.
- *
- * Assumes that the bitmap has a size such that no padding is needed in
- * various places. Currently only handles bitmaps with 3 to 256 colors.
- */
-GdkRGBImage *load_bmp(cptr filename)
-{
- FILE *f;
-
- char path[1024];
-
- bmp_file_type file_hdr;
- bmp_info_type info_hdr;
-
- GdkRGBImage *result = NULL;
-
- int ncol;
-
- int i;
-
- u32b x, y;
-
- guint32 colour_pixels[256];
-
-
- /* Build the path to the bmp file */
- path_build(path, 1024, ANGBAND_DIR_XTRA_GRAF, filename);
-
- /* Open the BMP file */
- f = fopen(path, "r");
-
- /* No such file */
- if (f == NULL)
- {
- return (NULL);
- }
-
- /* Read the "bmp_file_type" */
- rd_u16b(f, &file_hdr.type);
- rd_u32b(f, &file_hdr.size);
- rd_u16b(f, &file_hdr.reserved1);
- rd_u16b(f, &file_hdr.reserved2);
- rd_u32b(f, &file_hdr.offset);
-
- /* Read the "bmp_info_type" */
- rd_u32b(f, &info_hdr.size);
- rd_u32b(f, &info_hdr.width);
- rd_u32b(f, &info_hdr.height);
- rd_u16b(f, &info_hdr.planes);
- rd_u16b(f, &info_hdr.bit_count);
- rd_u32b(f, &info_hdr.compression);
- rd_u32b(f, &info_hdr.size_image);
- rd_u32b(f, &info_hdr.x_pels_per_meter);
- rd_u32b(f, &info_hdr.y_pels_per_meter);
- rd_u32b(f, &info_hdr.colors_used);
- rd_u32b(f, &info_hdr.color_importand);
-
- /* Verify the header */
- if (feof(f) ||
- (file_hdr.type != 19778) ||
- (info_hdr.size != 40))
- {
- plog(format("Incorrect BMP file format %s", filename));
- fclose(f);
- return (NULL);
- }
-
- /*
- * The two headers above occupy 54 bytes total
- * The "offset" field says where the data starts
- * The "colors_used" field does not seem to be reliable
- */
-
- /* Compute number of colors recorded */
- ncol = (file_hdr.offset - 54) / 4;
-
- for (i = 0; i < ncol; i++)
- {
- rgb_quad_type clr;
-
- /* Read an "rgb_quad_type" */
- rd_byte(f, &clr.b);
- rd_byte(f, &clr.g);
- rd_byte(f, &clr.r);
- rd_byte(f, &clr.filler);
-
- /* Remember the pixel */
- colour_pixels[i] = (clr.r << 16) | (clr.g << 8) | (clr.b);
- }
-
- /* Allocate GdkRGBImage large enough to store the image */
- result = gdk_rgb_image_new(info_hdr.width, info_hdr.height);
-
- /* Failure */
- if (result == NULL)
- {
- fclose(f);
- return (NULL);
- }
-
- for (y = 0; y < info_hdr.height; y++)
- {
- u32b y2 = info_hdr.height - y - 1;
-
- for (x = 0; x < info_hdr.width; x++)
- {
- int ch = getc(f);
-
- /* Verify not at end of file XXX XXX */
- if (feof(f))
- {
- plog(format("Unexpected end of file in %s", filename));
- gdk_rgb_image_destroy(result);
- fclose(f);
- return (NULL);
- }
-
- if (info_hdr.bit_count == 24)
- {
- int c3, c2 = getc(f);
-
- /* Verify not at end of file XXX XXX */
- if (feof(f))
- {
- plog(format("Unexpected end of file in %s", filename));
- gdk_rgb_image_destroy(result);
- fclose(f);
- return (NULL);
- }
-
- c3 = getc(f);
-
- /* Verify not at end of file XXX XXX */
- if (feof(f))
- {
- plog(format("Unexpected end of file in %s", filename));
- gdk_rgb_image_destroy(result);
- fclose(f);
- return (NULL);
- }
-
- /* Draw the pixel */
- gdk_rgb_image_put_pixel(
- result,
- x,
- y2,
- (ch << 16) | (c2 << 8) | (c3));
- }
- else if (info_hdr.bit_count == 8)
- {
- gdk_rgb_image_put_pixel(result, x, y2, colour_pixels[ch]);
- }
- else if (info_hdr.bit_count == 4)
- {
- gdk_rgb_image_put_pixel(result, x, y2, colour_pixels[ch / 16]);
- x++;
- gdk_rgb_image_put_pixel(result, x, y2, colour_pixels[ch % 16]);
- }
- else
- {
- /* Technically 1 bit is legal too */
- plog(format("Illegal bit count %d in %s",
- info_hdr.bit_count, filename));
- gdk_rgb_image_destroy(result);
- fclose(f);
- return (NULL);
- }
- }
- }
-
- fclose(f);
-
- return result;
-}
-
-
-/*
- * Try to load an XPM file, or a BMP file if it fails
- *
- * Choice of file format may better be made yet another option XXX
- */
-static GdkRGBImage *load_tiles(cptr basename)
-{
- char buf[32];
- GdkRGBImage *img;
-
- /* build xpm file name */
- strnfmt(buf, 32, "%s.xpm", basename);
-
- /* Try to load it */
- img = load_xpm(buf);
-
- /* OK */
- if (img) return (img);
-
- /* Try again for a bmp file */
- strnfmt(buf, 32, "%s.bmp", basename);
-
- /* Try loading it */
- img = load_bmp(buf);
-
- /* Return result, success or failure */
- return (img);
-}
-
-
-/*
- * Free all tiles and graphics buffers associated with windows
- *
- * This is conspirator of graf_init() below, sharing its inefficiency
- */
-static void graf_nuke()
-{
- int i;
-
- term_data *td;
-
-
- /* Nuke all terms */
- for (i = 0; i < MAX_TERM_DATA; i++)
- {
- /* Access term_data structure */
- td = &data[i];
-
- /* Disable graphics */
- td->t.higher_pict = FALSE;
-
- /* Free previously allocated tiles */
- if (td->tiles) gdk_rgb_image_destroy(td->tiles);
-
- /* Forget pointer */
- td->tiles = NULL;
-
-# ifdef USE_TRANSPARENCY
-
- /* Free previously allocated transparency buffer */
- if (td->trans_buf) gdk_rgb_image_destroy(td->trans_buf);
-
- /* Forget stale pointer */
- td->trans_buf = NULL;
-
-# endif /* USE_TRANSPARENCY */
-
- }
-}
-
-
-/*
- * Load tiles, scale them to current font size, and store a pointer
- * to them in a term_data structure for each term.
- *
- * XXX XXX XXX This is a terribly stupid quick hack.
- *
- * XXX XXX XXX Windows using the same font should share resized tiles
- */
-static bool graf_init(
- cptr filename,
- int tile_wid,
- int tile_hgt)
-{
- term_data *td;
-
- bool result;
-
- GdkRGBImage *raw_tiles, *scaled_tiles;
-
-# ifdef USE_TRANSPARENCY
- GdkRGBImage *buffer;
-# endif /* USE_TRANSPARENCY */
-
- int i;
-
-
- /* Paranoia */
- if (filename == NULL) return (FALSE);
-
- /* Load tiles */
- raw_tiles = load_tiles(filename);
-
- /* Oops */
- if (raw_tiles == NULL)
- {
- /* Clean up */
- graf_nuke();
-
- /* Failure */
- return (FALSE);
- }
-
- /* Calculate and remember numbers of rows and columns */
- tile_rows = raw_tiles->height / tile_hgt;
- tile_cols = raw_tiles->width / tile_wid;
-
- /* Be optimistic */
- result = TRUE;
-
-
- /*
- * (Re-)init each term
- * XXX It might help speeding this up to avoid doing so if a window
- * doesn't need graphics (e.g. inventory/equipment and message recall).
- */
- for (i = 0; i < MAX_TERM_DATA; i++)
- {
- /* Access term_data */
- td = &data[i];
-
- /* Shouldn't waste anything for unused terms */
- if (!td->shown) continue;
-
- /* Enable graphics */
- td->t.higher_pict = TRUE;
-
- /* See if we need rescaled tiles XXX */
- if ((td->tiles == NULL) ||
- (td->tiles->width != td->tile_wid * tile_cols) ||
- (td->tiles->height != td->tile_hgt * tile_rows))
- {
- /* Free old tiles if present */
- if (td->tiles) gdk_rgb_image_destroy(td->tiles);
-
- /* Forget pointer */
- td->tiles = NULL;
-
- /* Scale the tiles to current font bounding rect */
- scaled_tiles = resize_tiles(
- raw_tiles,
- tile_wid, tile_hgt,
- td->tile_wid, td->tile_hgt);
-
- /* Oops */
- if (scaled_tiles == NULL)
- {
- /* Failure */
- result = FALSE;
-
- break;
- }
-
- /* Store it */
- td->tiles = scaled_tiles;
- }
-
-# ifdef USE_TRANSPARENCY
-
- /* See if we have to (re)allocate a new buffer XXX */
- if ((td->trans_buf == NULL) ||
- (td->trans_buf->width != td->tile_wid) ||
- (td->trans_buf->height != td->tile_hgt))
- {
- /* Free old buffer if present */
- if (td->trans_buf) gdk_rgb_image_destroy(td->trans_buf);
-
- /* Forget pointer */
- td->trans_buf = NULL;
-
- /* Allocate a new buffer */
- buffer = gdk_rgb_image_new(td->tile_wid, td->tile_hgt);
-
- /* Oops */
- if (buffer == NULL)
- {
- /* Failure */
- result = FALSE;
-
- break;
- }
-
- /* Store it */
- td->trans_buf = buffer;
- }
-
- /*
- * Giga-Hack - assume top left corner of 0x86/0x80 should be
- * in the background colour XXX XXX XXX XXX
- */
- td->bg_pixel = gdk_rgb_image_get_pixel(
- raw_tiles,
- 0,
- tile_hgt * 6);
-
-# endif /* USE_TRANSPARENCY */
-
- }
-
-
- /* Alas, we need to free wasted images */
- if (result == FALSE) graf_nuke();
-
- /* We don't need the raw image any longer */
- gdk_rgb_image_destroy(raw_tiles);
-
- /* Report success or failure */
- return (result);
-}
-
-
-/*
- * React to various changes in graphics mode settings
- *
- * It is *not* a requirement for tiles to have same pixel width and height.
- * The program can work with any conbinations of graf_wid and graf_hgt
- * (oops, they must be representable by u16b), as long as they are lesser
- * or equal to 32 if you use smooth rescaling.
- */
-static void init_graphics(void)
-{
- cptr tile_name;
-
- u16b graf_wid = 0, graf_hgt = 0;
-
-
- /* No graphics requests are made - Can't this be simpler? XXX XXX */
- if ((graf_mode_request == graf_mode) &&
- (smooth_rescaling_request == smooth_rescaling) &&
- !resize_request) return;
-
- /* Prevent further unsolicited reaction */
- resize_request = FALSE;
-
-
- /* Dispose unusable old tiles - awkward... XXX XXX */
- if ((graf_mode_request == GRAF_MODE_NONE) ||
- (graf_mode_request != graf_mode) ||
- (smooth_rescaling_request != smooth_rescaling)) graf_nuke();
-
-
- /* Setup parameters according to request */
- switch (graf_mode_request)
- {
- /* ASCII - no graphics whatsoever */
- default:
- case GRAF_MODE_NONE:
- {
- tile_name = NULL;
- use_graphics = arg_graphics = FALSE;
-
- break;
- }
-
- /*
- * 8x8 tiles originally collected for the Amiga port
- * from several contributers by Lars Haugseth, converted
- * to 256 colours and expanded by the Z devteam
- *
- * Use the "old" tile assignments
- *
- * Dawnmist is working on it for ToME
- */
- case GRAF_MODE_OLD:
- {
- tile_name = "8x8";
- graf_wid = graf_hgt = 8;
- ANGBAND_GRAF = "old";
- use_graphics = arg_graphics = TRUE;
-
- break;
- }
-
- /*
- * Adam Bolt's 16x16 tiles
- * "new" tile assignments
- * It is updated for ToME by Andreas Koch
- */
- case GRAF_MODE_NEW:
- {
- tile_name = "16x16";
- graf_wid = graf_hgt = 16;
- ANGBAND_GRAF = "new";
- use_graphics = arg_graphics = TRUE;
-
- break;
- }
- }
-
-
- /* load tiles and set them up if tiles are requested */
- if ((graf_mode_request != GRAF_MODE_NONE) &&
- !graf_init(tile_name, graf_wid, graf_hgt))
- {
- /* Oops */
- plog("Cannot initialize graphics");
-
- /* reject requests */
- graf_mode_request = GRAF_MODE_NONE;
- smooth_rescaling_request = smooth_rescaling;
-
- /* reset graphics flags */
- use_graphics = arg_graphics = FALSE;
- }
-
- /* Update current graphics mode */
- graf_mode = graf_mode_request;
- smooth_rescaling = smooth_rescaling_request;
-
- /* Reset visuals */
-#ifndef ANG281_RESET_VISUALS
- reset_visuals(TRUE);
-#else
- reset_visuals();
-#endif /* !ANG281_RESET_VISUALS */
-}
-
-#endif /* USE_GRAPHICS */
-
-
-
-
-/**** Term package support routines ****/
-
-
-/*
- * Free data used by a term
- */
-static void Term_nuke_gtk(term *t)
-{
- term_data *td = t->data;
-
-
- /* Free name */
- if (td->name) string_free(td->name);
-
- /* Forget it */
- td->name = NULL;
-
- /* Free font */
- if (td->font) gdk_font_unref(td->font);
-
- /* Forget it */
- td->font = NULL;
-
- /* Free backing store */
- if (td->backing_store) gdk_pixmap_unref(td->backing_store);
-
- /* Forget it too */
- td->backing_store = NULL;
-
-#ifdef USE_GRAPHICS
-
- /* Free tiles */
- if (td->tiles) gdk_rgb_image_destroy(td->tiles);
-
- /* Forget pointer */
- td->tiles = NULL;
-
-# ifdef USE_TRANSPARENCY
-
- /* Free transparency buffer */
- if (td->trans_buf) gdk_rgb_image_destroy(td->trans_buf);
-
- /* Amnesia */
- td->trans_buf = NULL;
-
-# endif /* USE_TRANSPARENCY */
-
-#endif /* USE_GRAPHICS */
-}
-
-
-/*
- * Erase the whole term.
- */
-static errr Term_clear_gtk(void)
-{
- term_data *td = (term_data*)(Term->data);
-
-
- /* Don't draw to hidden windows */
- if (!td->shown) return (0);
-
- /* Paranoia */
- g_assert(td->drawing_area->window != 0);
-
- /* Clear the area */
- gdk_draw_rectangle(
- TERM_DATA_DRAWABLE(td),
- td->drawing_area->style->black_gc,
- 1,
- 0,
- 0,
- td->cols * td->font_wid,
- td->rows * td->font_hgt);
-
- /* Copy image from backing store if present */
- TERM_DATA_REFRESH(td, 0, 0, td->cols, td->rows);
-
- /* Success */
- return (0);
-}
-
-
-/*
- * Erase some characters.
- */
-static errr Term_wipe_gtk(int x, int y, int n)
-{
- term_data *td = (term_data*)(Term->data);
-
-
- /* Don't draw to hidden windows */
- if (!td->shown) return (0);
-
- /* Paranoia */
- g_assert(td->drawing_area->window != 0);
-
- /* Fill the area with the background colour */
- gdk_draw_rectangle(
- TERM_DATA_DRAWABLE(td),
- td->drawing_area->style->black_gc,
- TRUE,
- x * td->font_wid,
- y * td->font_hgt,
- n * td->font_wid,
- td->font_hgt);
-
- /* Copy image from backing store if present */
- TERM_DATA_REFRESH(td, x, y, n, 1);
-
- /* Success */
- return (0);
-}
-
-
-/*
- * Draw some textual characters.
- */
-static errr Term_text_gtk(int x, int y, int n, byte a, cptr s)
-{
- term_data *td = (term_data*)(Term->data);
-
-
- /* Don't draw to hidden windows */
- if (!td->shown) return (0);
-
- /* Paranoia */
- g_assert(td->drawing_area->window != 0);
-
- /* Set foreground colour */
- term_data_set_fg(td, a);
-
- /* Clear the line */
- Term_wipe_gtk(x, y, n);
-
- /* Draw the text to the window */
- gdk_draw_text(
- TERM_DATA_DRAWABLE(td),
- td->font,
- td->gc,
- x * td->font_wid,
- td->font->ascent + y * td->font_hgt,
- s,
- n);
-
- /* Copy image from backing store if present */
- TERM_DATA_REFRESH(td, x, y, n, 1);
-
- /* Success */
- return (0);
-}
-
-
-/*
- * Draw software cursor at (x, y)
- */
-static errr Term_curs_gtk(int x, int y)
-{
- term_data *td = (term_data*)(Term->data);
- int cells = 1;
-
-
- /* Don't draw to hidden windows */
- if (!td->shown) return (0);
-
- /* Paranoia */
- g_assert(td->drawing_area->window != 0);
-
- /* Set foreground colour */
- term_data_set_fg(td, TERM_YELLOW);
-
-#ifdef USE_DOUBLE_TILES
-
- /* Mogami's bigtile patch */
-
- /* Adjust it if wide tiles are requested */
- if (use_bigtile &&
- (x + 1 < Term->wid) &&
- (Term->old->a[y][x + 1] == 255))
- {
- cells = 2;
- }
-
-#endif /* USE_DOUBLE_TILES */
-
- /* Draw the software cursor */
- gdk_draw_rectangle(
- TERM_DATA_DRAWABLE(td),
- td->gc,
- FALSE,
- x * td->font_wid,
- y * td->font_hgt,
- td->font_wid * cells - 1,
- td->font_hgt - 1);
-
- /* Copy image from backing store if present */
- TERM_DATA_REFRESH(td, x, y, cells, 1);
-
- /* Success */
- return (0);
-}
-
-
-#ifdef USE_GRAPHICS
-
-# ifdef USE_TRANSPARENCY
-
-/*
- * XXX XXX Low level graphics helper
- * Draw a tile at (s_x, s_y) over one at (t_x, t_y) and store the
- * result in td->trans_buf
- *
- * XXX XXX Even if CPU's are faster than necessary these days,
- * this should be made inline. Or better, there should be an API
- * to take advantage of graphics hardware. They almost always have
- * assortment of builtin bitblt's...
- */
-static void overlay_tiles_2(
- term_data *td,
- int s_x, int s_y,
- int t_x, int t_y)
-{
- guint32 pix;
- int x, y;
-
-
- /* Process each row */
- for (y = 0; y < td->tile_hgt; y++)
- {
- /* Process each column */
- for (x = 0; x < td->tile_wid; x++)
- {
- /* Get an overlay pixel */
- pix = gdk_rgb_image_get_pixel(td->tiles, s_x + x, s_y + y);
-
- /* If it's in background color, use terrain instead */
- if (pix == td->bg_pixel)
- pix = gdk_rgb_image_get_pixel(td->tiles, t_x + x, t_y + y);
-
- /* Store the result in trans_buf */
- gdk_rgb_image_put_pixel(td->trans_buf, x, y, pix);
- }
- }
-}
-
-
-# ifdef USE_EGO_GRAPHICS
-
-/*
- * XXX XXX Low level graphics helper
- * Draw a tile at (e_x, e_y) over one at (s_x, s_y) over another one
- * at (t_x, t_y) and store the result in td->trans_buf
- *
- * XXX XXX The same comment applies as that for the above...
- */
-static void overlay_tiles_3(
- term_data *td,
- int e_x, int e_y,
- int s_x, int s_y,
- int t_x, int t_y)
-{
- guint32 pix;
- int x, y;
-
-
- /* Process each row */
- for (y = 0; y < td->tile_hgt; y++)
- {
- /* Process each column */
- for (x = 0; x < td->tile_wid; x++)
- {
- /* Get an overlay pixel */
- pix = gdk_rgb_image_get_pixel(td->tiles, e_x + x, e_y + y);
-
- /*
- * If it's background colour, try to use one from
- * the second layer
- */
- if (pix == td->bg_pixel)
- pix = gdk_rgb_image_get_pixel(td->tiles, s_x + x, s_y + y);
-
- /*
- * If it's background colour again, fall back to
- * the terrain layer
- */
- if (pix == td->bg_pixel)
- pix = gdk_rgb_image_get_pixel(td->tiles, t_x + x, t_y + y);
-
- /* Store the pixel in trans_buf */
- gdk_rgb_image_put_pixel(td->trans_buf, x, y, pix);
- }
- }
-}
-
-# endif /* USE_EGO_GRAPHICS */
-
-# endif /* USE_TRANSPARENCY */
-
-
-/*
- * Low level graphics (Assumes valid input)
- *
- * Draw "n" tiles/characters starting at (x,y)
- */
-# ifdef USE_TRANSPARENCY
-# ifdef USE_EGO_GRAPHICS
-static errr Term_pict_gtk(
- int x, int y, int n,
- const byte *ap, const char *cp,
- const byte *tap, const char *tcp,
- const byte *eap, const char *ecp)
-# else /* USE_EGO_GRAPHICS */
-static errr Term_pict_gtk(
- int x, int y, int n,
- const byte *ap, const char *cp,
- const byte *tap, const char *tcp)
-# endif /* USE_EGO_GRAPHICS */
-# else /* USE_TRANSPARENCY */
-static errr Term_pict_gtk(
- int x, int y, int n,
- const byte *ap, const char *cp)
-# endif /* USE_TRANSPARENCY */
-{
- term_data *td = (term_data*)(Term->data);
-
- int i;
-
- int d_x, d_y;
-
-# ifdef USE_DOUBLE_TILES
-
- /* Hack - remember real number of columns affected XXX XXX XXX */
- int cols;
-
-# endif /* USE_DOUBLE_TILES */
-
-
- /* Don't draw to hidden windows */
- if (!td->shown) return (0);
-
- /* Paranoia */
- g_assert(td->drawing_area->window != 0);
-
- /* Top left corner of the destination rect */
- d_x = x * td->font_wid;
- d_y = y * td->font_hgt;
-
-
-# ifdef USE_DOUBLE_TILES
-
- /* Reset column counter */
- cols = 0;
-
-# endif /* USE_DOUBLE_TILES */
-
- /* Scan the input */
- for (i = 0; i < n; i++)
- {
- byte a;
- char c;
- int s_x, s_y;
-
-# ifdef USE_TRANSPARENCY
-
- byte ta;
- char tc;
- int t_x, t_y;
-
-# ifdef USE_EGO_GRAPHICS
-
- byte ea;
- char ec;
- int e_x = 0, e_y = 0;
- bool has_overlay;
-
-# endif /* USE_EGO_GRAPHICS */
-
-# endif /* USE_TRANSPARENCY */
-
-
- /* Grid attr/char */
- a = *ap++;
- c = *cp++;
-
-# ifdef USE_TRANSPARENCY
-
- /* Terrain attr/char */
- ta = *tap++;
- tc = *tcp++;
-
-# ifdef USE_EGO_GRAPHICS
-
- /* Overlay attr/char */
- ea = *eap++;
- ec = *ecp++;
- has_overlay = (ea && ec);
-
-# endif /* USE_EGO_GRAPHICS */
-
-# endif /* USE_TRANSPARENCY */
-
- /* Row and Col */
- s_y = (((byte)a & 0x7F) % tile_rows) * td->tile_hgt;
- s_x = (((byte)c & 0x7F) % tile_cols) * td->tile_wid;
-
-# ifdef USE_TRANSPARENCY
-
- /* Terrain Row and Col */
- t_y = (((byte)ta & 0x7F) % tile_rows) * td->tile_hgt;
- t_x = (((byte)tc & 0x7F) % tile_cols) * td->tile_wid;
-
-# ifdef USE_EGO_GRAPHICS
-
- /* Overlay Row and Col */
- if (has_overlay)
- {
- e_y = (((byte)ea & 0x7F) % tile_rows) * td->tile_hgt;
- e_x = (((byte)ec & 0x7F) % tile_cols) * td->tile_wid;
- }
-
-# endif /* USE_EGO_GRAPHICS */
-
-
-# ifdef USE_DOUBLE_TILES
-
- /* Mogami's bigtile patch */
-
- /* Hack -- a filler for wide tile */
- if (use_bigtile && (a == 255))
- {
- /* Advance */
- d_x += td->font_wid;
-
- /* Ignore */
- continue;
- }
-
-# endif /* USE_DOUBLE_TILES */
-
- /* Optimise the common case: terrain == obj/mons */
- if (!use_transparency ||
- ((s_x == t_x) && (s_y == t_y)))
- {
-
-# ifdef USE_EGO_GRAPHICS
-
- /* The simplest possible case - no overlay */
- if (!has_overlay)
- {
- /* Draw the tile */
- gdk_draw_rgb_image_2(
- TERM_DATA_DRAWABLE(td), td->gc, td->tiles,
- s_x, s_y,
- d_x, d_y,
- td->tile_wid, td->tile_hgt);
- }
-
- /* We have to draw overlay... */
- else
- {
- /* Overlay */
- overlay_tiles_2(td, e_x, e_y, s_x, s_y);
-
- /* And draw the result */
- gdk_draw_rgb_image_2(
- TERM_DATA_DRAWABLE(td), td->gc, td->trans_buf,
- 0, 0,
- d_x, d_y,
- td->tile_wid, td->tile_hgt);
-
- /* Hack -- Prevent potential display problem */
- gdk_flush();
- }
-
-# else /* USE_EGO_GRAPHICS */
-
- /* Draw the tile */
- gdk_draw_rgb_image_2(
- TERM_DATA_DRAWABLE(td), td->gc, td->tiles,
- s_x, s_y,
- d_x, d_y,
- td->tile_wid, td->tile_hgt);
-
-# endif /* USE_EGO_GRAPHICS */
-
- }
-
- /*
- * Since there's no masking bitblt in X,
- * we have to do that manually...
- */
- else
- {
-
-# ifndef USE_EGO_GRAPHICS
-
- /* Draw mon/PC/obj over terrain */
- overlay_tiles_2(td, s_x, s_y, t_x, t_y);
-
-# else /* !USE_EGO_GRAPHICS */
-
- /* No overlay */
- if (!has_overlay)
- {
- /* Build terrain + masked overlay image */
- overlay_tiles_2(td, s_x, s_y, t_x, t_y);
- }
-
- /* With overlay */
- else
- {
- /* Ego over mon/PC over terrain */
- overlay_tiles_3(td, e_x, e_y, s_x, s_y,
- t_x, t_y);
- }
-
-# endif /* !USE_EGO_GRAPHICS */
-
- /* Draw it */
- gdk_draw_rgb_image_2(
- TERM_DATA_DRAWABLE(td), td->gc, td->trans_buf,
- 0, 0,
- d_x, d_y,
- td->tile_wid, td->tile_hgt);
-
- /* Hack -- Prevent potential display problem */
- gdk_flush();
- }
-
-# else /* USE_TRANSPARENCY */
-
- /* Draw the tile */
- gdk_draw_rgb_image_2(
- TERM_DATA_DRAWABLE(td), td->gc, td->tiles,
- s_x, s_y,
- d_x, d_y,
- td->tile_wid, td->tile_hgt);
-
-# endif /* USE_TRANSPARENCY */
-
- /*
- * Advance x-coordinate - wide font fillers are taken care of
- * before entering the tile drawing code.
- */
- d_x += td->font_wid;
-
-# ifdef USE_DOUBLE_TILES
-
- /* Add up *real* number of columns updated XXX XXX XXX */
- cols += use_bigtile ? 2 : 1;
-
-# endif /* USE_DOUBLE_TILES */
- }
-
-# ifndef USE_DOUBLE_TILES
-
- /* Copy image from backing store if present */
- TERM_DATA_REFRESH(td, x, y, n, 1);
-
-# else
-
- /* Copy image from backing store if present */
- TERM_DATA_REFRESH(td, x, y, cols, 1);
-
-# endif /* USE_DOUBLE_TILES */
-
- /* Success */
- return (0);
-}
-
-#endif /* USE_GRAPHICS */
-
-
-/*
- * Process an event, if there's none block when wait is set true,
- * return immediately otherwise.
- */
-static void CheckEvent(bool wait)
-{
- /* Process an event */
- (void)gtk_main_iteration_do(wait);
-}
-
-
-/*
- * Process all pending events (without blocking)
- */
-static void DrainEvents(void)
-{
- while (gtk_events_pending())
- gtk_main_iteration();
-}
-
-
-/*
- * Handle a "special request"
- */
-static errr Term_xtra_gtk(int n, int v)
-{
- /* Handle a subset of the legal requests */
- switch (n)
- {
- /* Make a noise */
- case TERM_XTRA_NOISE:
- {
- /* Beep */
- gdk_beep();
-
- /* Success */
- return (0);
- }
-
- /* Flush the output */
- case TERM_XTRA_FRESH:
- {
- /* Flush pending X requests - almost always no-op */
- gdk_flush();
-
- /* Success */
- return (0);
- }
-
- /* Process random events */
- case TERM_XTRA_BORED:
- {
- /* Process a pending event if there's one */
- CheckEvent(FALSE);
-
- /* Success */
- return (0);
- }
-
- /* Process Events */
- case TERM_XTRA_EVENT:
- {
- /* Process an event */
- CheckEvent(v);
-
- /* Success */
- return (0);
- }
-
- /* Flush the events */
- case TERM_XTRA_FLUSH:
- {
- /* Process all pending events */
- DrainEvents();
-
- /* Success */
- return (0);
- }
-
- /* Handle change in the "level" */
- case TERM_XTRA_LEVEL:
- return (0);
-
- /* Clear the screen */
- case TERM_XTRA_CLEAR:
- return (Term_clear_gtk());
-
- /* Delay for some milliseconds */
- case TERM_XTRA_DELAY:
- {
- /* sleep for v milliseconds */
- usleep(v * 1000);
-
- /* Done */
- return (0);
- }
-
- /* Get Delay of some milliseconds */
- case TERM_XTRA_GET_DELAY:
- {
- int ret;
- struct timeval tv;
-
- ret = gettimeofday(&tv, NULL);
- Term_xtra_long = (tv.tv_sec * 1000) + (tv.tv_usec / 1000);
-
- return ret;
- }
-
- /* Subdirectory scan */
- case TERM_XTRA_SCANSUBDIR:
- {
- DIR *directory;
- struct dirent *entry;
-
- scansubdir_max = 0;
-
- directory = opendir(scansubdir_dir);
- if (!directory) return (1);
-
- while ((entry = readdir(directory)) != NULL)
- {
- char file[PATH_MAX + NAME_MAX + 2];
- struct stat filedata;
-
- file[PATH_MAX + NAME_MAX] = 0;
- strncpy(file, scansubdir_dir, PATH_MAX);
- strncat(file, "/", 2);
- strncat(file, entry->d_name, NAME_MAX);
- if ((stat(file, &filedata) == 0) && S_ISDIR(filedata.st_mode))
- {
- string_free(scansubdir_result[scansubdir_max]);
- scansubdir_result[scansubdir_max] =
- string_make(entry->d_name);
- ++scansubdir_max;
- }
- }
- }
-
- /* Rename main window */
- case TERM_XTRA_RENAME_MAIN_WIN: gtk_window_set_title(GTK_WINDOW(data[0].window), angband_term_name[0]); return (0);
-
- /* React to changes */
- case TERM_XTRA_REACT:
- {
- /* (re-)init colours */
- init_colours();
-
-#ifdef USE_GRAPHICS
-
- /* Initialise graphics */
- init_graphics();
-
-#endif /* USE_GRAPHICS */
-
- /* Success */
- return (0);
- }
- }
-
- /* Unknown */
- return (1);
-}
-
-
-
-
-/**** Event handlers ****/
-
-
-/*
- * Operation overkill
- * Verify term size info - just because the other windowing ports have this
- */
-static void term_data_check_size(term_data *td)
-{
- /* Enforce minimum window size */
- if (td == &data[0])
- {
- if (td->cols < 80) td->cols = 80;
- if (td->rows < 24) td->rows = 24;
- }
- else
- {
- if (td->cols < 1) td->cols = 1;
- if (td->rows < 1) td->rows = 1;
- }
-
- /* Paranoia - Enforce maximum size allowed by the term package */
- if (td->cols > 255) td->cols = 255;
- if (td->rows > 255) td->rows = 255;
-}
-
-
-/*
- * Enforce these size constraints within Gtk/Gdk
- * These increments are nice, because you can see numbers of rows/cols
- * while you resize a term.
- */
-static void term_data_set_geometry_hints(term_data *td)
-{
- GdkGeometry geometry;
-
- /* Resizing is character size oriented */
- geometry.width_inc = td->font_wid;
- geometry.height_inc = td->font_hgt;
-
- /* Enforce minimum size - the main window */
- if (td == &data[0])
- {
- geometry.min_width = 80 * td->font_wid;
- geometry.min_height = 24 * td->font_hgt;
- }
-
- /* Subwindows can be much smaller */
- else
- {
- geometry.min_width = 1 * td->font_wid;
- geometry.min_height = 1 * td->font_hgt;
- }
-
- /* Enforce term package's hard limit */
- geometry.max_width = 255 * td->font_wid;
- geometry.max_height = 255 * td->font_hgt;
-
- /* This affects geometry display while we resize a term */
- geometry.base_width = 0;
- geometry.base_height = 0;
-
- /* Give the window a new set of resizing hints */
- gtk_window_set_geometry_hints(GTK_WINDOW(td->window),
- td->drawing_area, &geometry,
- GDK_HINT_MIN_SIZE | GDK_HINT_MAX_SIZE
- | GDK_HINT_BASE_SIZE | GDK_HINT_RESIZE_INC);
-}
-
-
-/*
- * (Re)allocate a backing store for the window
- */
-static void term_data_set_backing_store(term_data *td)
-{
- /* Paranoia */
- if (!GTK_WIDGET_REALIZED(td->drawing_area)) return;
-
- /* Free old one if we cannot use it any longer */
- if (td->backing_store)
- {
- int wid, hgt;
-
- /* Retrive the size of the old backing store */
- gdk_window_get_size(td->backing_store, &wid, &hgt);
-
- /* Continue using it if it's the same with desired size */
- if (use_backing_store &&
- (td->cols * td->font_wid == wid) &&
- (td->rows * td->font_hgt == hgt)) return;
-
- /* Free it */
- gdk_pixmap_unref(td->backing_store);
-
- /* Forget the pointer */
- td->backing_store = NULL;
- }
-
- /* See user preference */
- if (use_backing_store)
- {
- /* Allocate new backing store */
- td->backing_store = gdk_pixmap_new(
- td->drawing_area->window,
- td->cols * td->font_wid,
- td->rows * td->font_hgt,
- -1);
-
- /* Oops - but we can do without it */
- g_return_if_fail(td->backing_store != NULL);
-
- /* Clear the backing store */
- gdk_draw_rectangle(
- td->backing_store,
- td->drawing_area->style->black_gc,
- TRUE,
- 0,
- 0,
- td->cols * td->font_wid,
- td->rows * td->font_hgt);
- }
-}
-
-
-/*
- * Save game only when it's safe to do so
- */
-static void save_game_gtk(void)
-{
- /* We have nothing to save, yet */
- if (!game_in_progress || !character_generated) return;
-
- /* It isn't safe to save game now */
- if (!inkey_flag || !can_save)
- {
- plog("You may not save right now.");
- return;
- }
-
- /* Hack -- Forget messages */
- msg_flag = FALSE;
-
- /* Save the game */
-#ifdef ZANG_SAVE_GAME
- /* Also for OAngband - the parameter tells if it's autosave */
- do_cmd_save_game(FALSE);
-#else
-/* Everything else */
- do_cmd_save_game();
-#endif /* ZANG_SAVE_GAME */
-}
-
-
-/*
- * Display message in a modal dialog
- */
-static void gtk_message(cptr msg)
-{
- GtkWidget *dialog, *label, *ok_button;
-
- /* Create the widgets */
- dialog = gtk_dialog_new();
- g_assert(dialog != NULL);
-
- label = gtk_label_new(msg);
- g_assert(label != NULL);
-
- ok_button = gtk_button_new_with_label("OK");
- g_assert(ok_button != NULL);
-
- /* Ensure that the dialogue box is destroyed when OK is clicked */
- gtk_signal_connect_object(
- GTK_OBJECT(ok_button),
- "clicked",
- GTK_SIGNAL_FUNC(gtk_widget_destroy),
- (gpointer)dialog);
- gtk_container_add(
- GTK_CONTAINER(GTK_DIALOG(dialog)->action_area),
- ok_button);
-
- /* Add the label, and show the dialog */
- gtk_container_add(
- GTK_CONTAINER(GTK_DIALOG(dialog)->vbox),
- label);
-
- /* And make it modal */
- gtk_window_set_modal(GTK_WINDOW(dialog), TRUE);
-
- /* Show the dialog */
- gtk_widget_show_all(dialog);
-}
-
-
-/*
- * Hook to tell the user something important
- */
-static void hook_plog(cptr str)
-{
- /* Warning message */
- gtk_message(str);
-}
-
-
-/*
- * Process File-Quit menu command
- */
-static void quit_event_handler(
- GtkButton *was_clicked,
- gpointer user_data)
-{
- /* Save current game */
- save_game_gtk();
-
- /* It's done */
- quit(NULL);
-}
-
-
-/*
- * Process File-Save menu command
- */
-static void save_event_handler(
- GtkButton *was_clicked,
- gpointer user_data)
-{
- /* Save current game */
- save_game_gtk();
-}
-
-
-/*
- * Handle destruction of the Angband window
- */
-static void destroy_main_event_handler(
- GtkButton *was_clicked,
- gpointer user_data)
-{
- /* This allows for cheating, but... */
- quit(NULL);
-}
-
-
-/*
- * Handle destruction of Subwindows
- */
-static void destroy_sub_event_handler(
- GtkWidget *window,
- gpointer user_data)
-{
- /* Hide the window */
- gtk_widget_hide_all(window);
-}
-
-
-#ifndef SAVEFILE_SCREEN
-
-/*
- * Process File-New menu command
- */
-static void new_event_handler(
- GtkButton *was_clicked,
- gpointer user_data)
-{
- if (game_in_progress)
- {
- plog("You can't start a new game while you're still playing!");
- return;
- }
-
- /* The game is in progress */
- game_in_progress = TRUE;
-
- /* Flush input */
- Term_flush();
-
- /* Play game */
- play_game(TRUE);
-
- /* Houseclearing */
- cleanup_angband();
-
- /* Done */
- quit(NULL);
-}
-
-#endif /* !SAVEFILE_SCREEN */
-
-
-/*
- * Load fond specified by an XLFD fontname and
- * set up related term_data members
- */
-static void load_font(term_data *td, cptr fontname)
-{
- GdkFont *old = td->font;
-
- /* Load font */
- td->font = gdk_font_load(fontname);
-
- if (td->font)
- {
- /* Free the old font */
- if (old) gdk_font_unref(old);
- }
- else
- {
- /* Oops, but we can still use the old one */
- td->font = old;
- }
-
- /* Calculate the size of the font XXX */
- td->font_wid = gdk_char_width(td->font, '@');
- td->font_hgt = td->font->ascent + td->font->descent;
-
-#ifndef USE_DOUBLE_TILES
-
- /* Use the current font size for tiles as well */
- td->tile_wid = td->font_wid;
- td->tile_hgt = td->font_hgt;
-
-#else /* !USE_DOUBLE_TILES */
-
- /* Calculate the size of tiles */
- if (use_bigtile && (td == &data[0])) td->tile_wid = td->font_wid * 2;
- else td->tile_wid = td->font_wid;
- td->tile_hgt = td->font_hgt;
-
-#endif /* !USE_DOUBLE_TILES */
-}
-
-
-/*
- * React to OK button press in font selection dialogue
- */
-static void font_ok_callback(
- GtkWidget *widget,
- GtkWidget *font_selector)
-{
- gchar *fontname;
- term_data *td;
-
- td = gtk_object_get_data(GTK_OBJECT(font_selector), "term_data");
-
- g_assert(td != NULL);
-
- /* Retrieve font name from player's selection */
- fontname = gtk_font_selection_dialog_get_font_name(
- GTK_FONT_SELECTION_DIALOG(font_selector));
-
- /* Leave unless selection was valid */
- if (fontname == NULL) return;
-
- /* Load font and update font size info */
- load_font(td, fontname);
-
- /* Hack - Hide the window - finally found the trick... */
- gtk_widget_hide_all(td->window);
-
- /* Resizes the drawing area */
- gtk_drawing_area_size(
- GTK_DRAWING_AREA(td->drawing_area),
- td->cols * td->font_wid,
- td->rows * td->font_hgt);
-
- /* Update the geometry hints for the window */
- term_data_set_geometry_hints(td);
-
- /* Reallocate the backing store */
- term_data_set_backing_store(td);
-
- /* Hack - Show the window */
- gtk_widget_show_all(td->window);
-
-#ifdef USE_GRAPHICS
-
- /* We have to resize tiles when we are in graphics mode */
- resize_request = TRUE;
-
-#endif /* USE_GRAPHICS */
-
- /* Hack - force redraw */
- Term_key_push(KTRL('R'));
-}
-
-
-/*
- * Process Options-Font-* menu command
- */
-static void change_font_event_handler(
- GtkWidget *widget,
- gpointer user_data)
-{
- GtkWidget *font_selector;
-
- gchar *spacings[] = { "c", "m", NULL };
-
- font_selector = gtk_font_selection_dialog_new("Select font");
-
- gtk_object_set_data(
- GTK_OBJECT(font_selector),
- "term_data",
- user_data);
-
- /* Filter to show only fixed-width fonts */
- gtk_font_selection_dialog_set_filter(
- GTK_FONT_SELECTION_DIALOG(font_selector),
- GTK_FONT_FILTER_BASE,
- GTK_FONT_ALL,
- NULL,
- NULL,
- NULL,
- NULL,
- spacings,
- NULL);
-
- gtk_signal_connect(
- GTK_OBJECT(GTK_FONT_SELECTION_DIALOG(font_selector)->ok_button),
- "clicked",
- font_ok_callback,
- (gpointer)font_selector);
-
- /*
- * Ensure that the dialog box is destroyed when the user clicks
- * a button.
- */
- gtk_signal_connect_object(
- GTK_OBJECT(GTK_FONT_SELECTION_DIALOG(font_selector)->ok_button),
- "clicked",
- GTK_SIGNAL_FUNC(gtk_widget_destroy),
- (gpointer)font_selector);
-
- gtk_signal_connect_object(
- GTK_OBJECT(GTK_FONT_SELECTION_DIALOG(font_selector)->cancel_button),
- "clicked",
- GTK_SIGNAL_FUNC(gtk_widget_destroy),
- (gpointer)font_selector);
-
- gtk_widget_show(GTK_WIDGET(font_selector));
-}
-
-
-/*
- * Process Terms-* menu command - hide/show terminal window
- */
-static void term_event_handler(
- GtkWidget *widget,
- gpointer user_data)
-{
- term_data *td = (term_data *)user_data;
-
- /* We don't mess with the Angband window */
- if (td == &data[0]) return;
-
- /* It's shown */
- if (td->shown)
- {
- /* Hide the window */
- gtk_widget_hide_all(td->window);
- }
-
- /* It's hidden */
- else
- {
- /* Show the window */
- gtk_widget_show_all(td->window);
- }
-}
-
-
-/*
- * Toggles the boolean value of use_backing_store and
- * setup / remove backing store for each term
- */
-static void change_backing_store_event_handler(
- GtkButton *was_clicked,
- gpointer user_data)
-{
- int i;
-
- /* Toggle the backing store mode */
- use_backing_store = !use_backing_store;
-
- /* Reset terms */
- for (i = 0; i < MAX_TERM_DATA; i++)
- {
- term_data_set_backing_store(&data[i]);
- }
-}
-
-
-#ifdef USE_GRAPHICS
-
-/*
- * Set graf_mode_request according to user selection,
- * and let Term_xtra react to the change.
- */
-static void change_graf_mode_event_handler(
- GtkButton *was_clicked,
- gpointer user_data)
-{
- /* Set request according to user selection */
- graf_mode_request = (int)user_data;
-
- /*
- * Hack - force redraw
- * This induces a call to Term_xtra(TERM_XTRA_REACT, 0) as well
- */
- Term_key_push(KTRL('R'));
-}
-
-
-/*
- * Set dither_mode according to user selection
- */
-static void change_dith_mode_event_handler(
- GtkButton *was_clicked,
- gpointer user_data)
-{
- /* Set request according to user selection */
- dith_mode = (int)user_data;
-
- /*
- * Hack - force redraw
- */
- Term_key_push(KTRL('R'));
-}
-
-
-/*
- * Toggles the graphics tile scaling mode (Fast/Smooth)
- */
-static void change_smooth_mode_event_handler(
- GtkButton *was_clicked,
- gpointer user_data)
-{
- /* (Try to) toggle the smooth rescaling mode */
- smooth_rescaling_request = !smooth_rescaling;
-
- /*
- * Hack - force redraw
- * This induces a call to Term_xtra(TERM_XTRA_REACT, 0) as well
- */
- Term_key_push(KTRL('R'));
-}
-
-
-# ifdef USE_DOUBLE_TILES
-
-static void change_wide_tile_mode_event_handler(
- GtkButton *was_clicked,
- gpointer user_data)
-{
- term *old = Term;
- term_data *td = &data[0];
-
- /* Toggle "use_bigtile" */
- use_bigtile = !use_bigtile;
-
-#ifdef TOME
- /* T.o.M.E. requires this as well */
- arg_bigtile = use_bigtile;
-#endif /* TOME */
-
- /* Double the width of tiles (only for the main window) */
- if (use_bigtile)
- {
- td->tile_wid = td->font_wid * 2;
- }
-
- /* Use the width of current font */
- else
- {
- td->tile_wid = td->font_wid;
- }
-
- /* Need to resize the tiles */
- resize_request = TRUE;
-
- /* Activate the main window */
- Term_activate(&td->t);
-
- /* Resize the term */
- Term_resize(td->cols, td->rows);
-
- /* Activate the old term */
- Term_activate(old);
-
- /* Hack - force redraw XXX ??? XXX */
- Term_key_push(KTRL('R'));
-}
-
-# endif /* USE_DOUBLE_TILES */
-
-
-# ifdef USE_TRANSPARENCY
-
-/*
- * Toggles the boolean value of use_transparency
- */
-static void change_trans_mode_event_handler(
- GtkButton *was_clicked,
- gpointer user_data)
-{
- /* Toggle the transparency mode */
- use_transparency = !use_transparency;
-
- /* Hack - force redraw */
- Term_key_push(KTRL('R'));
-}
-
-# endif /* USE_TRANSPARENCY */
-
-#endif /* USE_GRAPHICS */
-
-
-#ifndef SAVEFILE_SCREEN
-
-/*
- * Caution: Modal or not, callbacks are called by gtk_main(),
- * so this is the right place to start a game.
- */
-static void file_ok_callback(
- GtkWidget *widget,
- GtkWidget *file_selector)
-{
- strcpy(savefile,
- gtk_file_selection_get_filename(GTK_FILE_SELECTION(file_selector)));
-
- gtk_widget_destroy(file_selector);
-
- /* game is in progress */
- game_in_progress = TRUE;
-
- /* Flush input */
- Term_flush();
-
- /* Play game */
- play_game(FALSE);
-
- /* Free memory allocated by game */
- cleanup_angband();
-
- /* Done */
- quit(NULL);
-}
-
-
-/*
- * Process File-Open menu command
- */
-static void open_event_handler(
- GtkButton *was_clicked,
- gpointer user_data)
-{
- GtkWidget *file_selector;
- char buf[1024];
-
-
- if (game_in_progress)
- {
- plog("You can't open a new game while you're still playing!");
- return;
- }
-
- /* Prepare the savefile path */
- path_build(buf, 1024, ANGBAND_DIR_SAVE, "*");
-
- file_selector = gtk_file_selection_new("Select a savefile");
- gtk_file_selection_set_filename(
- GTK_FILE_SELECTION(file_selector),
- buf);
- gtk_signal_connect(
- GTK_OBJECT(GTK_FILE_SELECTION(file_selector)->ok_button),
- "clicked",
- file_ok_callback,
- (gpointer)file_selector);
-
- /*
- * Ensure that the dialog box is destroyed when the user
- * clicks a button.
- */
- gtk_signal_connect_object(
- GTK_OBJECT(GTK_FILE_SELECTION(file_selector)->ok_button),
- "clicked",
- GTK_SIGNAL_FUNC(gtk_widget_destroy),
- (gpointer)file_selector);
-
- gtk_signal_connect_object(
- GTK_OBJECT(GTK_FILE_SELECTION(file_selector)->cancel_button),
- "clicked",
- GTK_SIGNAL_FUNC(gtk_widget_destroy),
- (gpointer)file_selector);
-
- gtk_window_set_modal(GTK_WINDOW(file_selector), TRUE);
- gtk_widget_show(GTK_WIDGET(file_selector));
-}
-
-#endif /* !SAVEFILE_SCREEN */
-
-
-/*
- * React to "delete" signal sent to Window widgets
- */
-static gboolean delete_event_handler(
- GtkWidget *widget,
- GdkEvent *event,
- gpointer user_data)
-{
- /* Save game if possible */
- save_game_gtk();
-
- /* Don't prevent closure */
- return (FALSE);
-}
-
-
-/*
- * Convert keypress events to ASCII codes and enqueue them
- * for game
- */
-static gboolean keypress_event_handler(
- GtkWidget *widget,
- GdkEventKey *event,
- gpointer user_data)
-{
- int i, mc, ms, mo, mx;
-
- char msg[128];
-
-
- /* Extract four "modifier flags" */
- mc = (event->state & GDK_CONTROL_MASK) ? TRUE : FALSE;
- ms = (event->state & GDK_SHIFT_MASK) ? TRUE : FALSE;
- mo = (event->state & GDK_MOD1_MASK) ? TRUE : FALSE;
- mx = (event->state & GDK_MOD3_MASK) ? TRUE : FALSE;
-
- /*
- * Hack XXX
- * Parse shifted numeric (keypad) keys specially.
- */
- if ((event->state == GDK_SHIFT_MASK)
- && (event->keyval >= GDK_KP_0) && (event->keyval <= GDK_KP_9))
- {
- /* Build the macro trigger string */
- strnfmt(msg, 128, "%cS_%X%c", 31, event->keyval, 13);
-
- /* Enqueue the "macro trigger" string */
- for (i = 0; msg[i]; i++) Term_keypress(msg[i]);
-
- /* Hack -- auto-define macros as needed */
- if (event->length && (macro_find_exact(msg) < 0))
- {
- /* Create a macro */
- macro_add(msg, event->string);
- }
-
- return (TRUE);
- }
-
- /* Normal keys with no modifiers */
- if (event->length && !mo && !mx)
- {
- /* Enqueue the normal key(s) */
- for (i = 0; i < event->length; i++) Term_keypress(event->string[i]);
-
- /* All done */
- return (TRUE);
- }
-
- /* Handle a few standard keys (bypass modifiers) XXX XXX XXX */
- switch ((uint) event->keyval)
- {
- case GDK_Escape:
- {
- Term_keypress(ESCAPE);
- return (TRUE);
- }
-
- case GDK_Return:
- {
- Term_keypress('\r');
- return (TRUE);
- }
-
- case GDK_Tab:
- {
- Term_keypress('\t');
- return (TRUE);
- }
-
- case GDK_Delete:
- case GDK_BackSpace:
- {
- Term_keypress('\010');
- return (TRUE);
- }
-
- case GDK_Shift_L:
- case GDK_Shift_R:
- case GDK_Control_L:
- case GDK_Control_R:
- case GDK_Caps_Lock:
- case GDK_Shift_Lock:
- case GDK_Meta_L:
- case GDK_Meta_R:
- case GDK_Alt_L:
- case GDK_Alt_R:
- case GDK_Super_L:
- case GDK_Super_R:
- case GDK_Hyper_L:
- case GDK_Hyper_R:
- {
- /* Hack - do nothing to control characters */
- return (TRUE);
- }
- }
-
- /* Build the macro trigger string */
- strnfmt(msg, 128, "%c%s%s%s%s_%X%c", 31,
- mc ? "N" : "", ms ? "S" : "",
- mo ? "O" : "", mx ? "M" : "",
- event->keyval, 13);
-
- /* Enqueue the "macro trigger" string */
- for (i = 0; msg[i]; i++) Term_keypress(msg[i]);
-
- /* Hack -- auto-define macros as needed */
- if (event->length && (macro_find_exact(msg) < 0))
- {
- /* Create a macro */
- macro_add(msg, event->string);
- }
-
- return (TRUE);
-}
-
-
-/*
- * Widget customisation (for drawing area) - "realize" signal
- *
- * In this program, called when window containing the drawing
- * area is shown first time.
- */
-static void realize_event_handler(
- GtkWidget *widget,
- gpointer user_data)
-{
- term_data *td = (term_data *)user_data;
-
- /* Create graphic context */
- td->gc = gdk_gc_new(td->drawing_area->window);
-
- /* Set foreground and background colours - isn't bg used at all? */
- gdk_rgb_gc_set_background(td->gc, 0x000000);
- gdk_rgb_gc_set_foreground(td->gc, angband_colours[TERM_WHITE]);
-
- /* No last foreground colour, yet */
- td->last_attr = -1;
-
- /* Allocate the backing store */
- term_data_set_backing_store(td);
-
- /* Clear the window */
- gdk_draw_rectangle(
- widget->window,
- widget->style->black_gc,
- TRUE,
- 0,
- 0,
- td->cols * td->font_wid,
- td->rows * td->font_hgt);
-}
-
-
-/*
- * Widget customisation (for drawing area) - "show" signal
- */
-static void show_event_handler(
- GtkWidget *widget,
- gpointer user_data)
-{
- term_data *td = (term_data *)user_data;
-
- /* Set the shown flag */
- td->shown = TRUE;
-}
-
-
-/*
- * Widget customisation (for drawing area) - "hide" signal
- */
-static void hide_event_handler(
- GtkWidget *widget,
- gpointer user_data)
-{
- term_data *td = (term_data *)user_data;
-
- /* Set the shown flag */
- td->shown = FALSE;
-}
-
-
-/*
- * Widget customisation (for drawing area)- handle size allocation requests
- */
-static void size_allocate_event_handler(
- GtkWidget *widget,
- GtkAllocation *allocation,
- gpointer user_data)
-{
- term_data *td = user_data;
- int old_rows, old_cols;
- term *old = Term;
-
- /* Paranoia */
- g_return_if_fail(widget != NULL);
- g_return_if_fail(allocation != NULL);
- g_return_if_fail(td != NULL);
-
- /* Remember old values */
- old_cols = td->cols;
- old_rows = td->rows;
-
- /* Update numbers of rows and columns */
- td->cols = (allocation->width + td->font_wid - 1) / td->font_wid;
- td->rows = (allocation->height + td->font_hgt - 1) / td->font_hgt;
-
- /* Overkill - Validate them */
- term_data_check_size(td);
-
- /* Adjust size request and set it */
- allocation->width = td->cols * td->font_wid;
- allocation->height = td->rows * td->font_hgt;
- widget->allocation = *allocation;
-
- /* Widget is realized, so we do some drawing works */
- if (GTK_WIDGET_REALIZED(widget))
- {
- /* Reallocate the backing store */
- term_data_set_backing_store(td);
-
- /* Actually handles resizing in Gtk */
- gdk_window_move_resize(
- widget->window,
- allocation->x,
- allocation->y,
- allocation->width,
- allocation->height);
-
- /* And in the term package */
- Term_activate(&td->t);
-
- /* Resize if necessary */
- if ((td->cols != old_cols) || (td->rows != old_rows))
- (void)Term_resize(td->cols, td->rows);
-
- /* Redraw its content */
- Term_redraw();
-
- /* Refresh */
- Term_fresh();
-
- /* Restore */
- Term_activate(old);
- }
-}
-
-
-/*
- * Update exposed area in a window (for drawing area)
- */
-static gboolean expose_event_handler(
- GtkWidget *widget,
- GdkEventExpose *event,
- gpointer user_data)
-{
- term_data *td = user_data;
-
- term *old = Term;
-
-#ifndef NO_REDRAW_SECTION
-
- int x1, x2, y1, y2;
-
-#endif /* !NO_REDRAW_SECTION */
-
-
- /* Paranoia */
- if (td == NULL) return (TRUE);
-
- /* The window has a backing store */
- if (td->backing_store)
- {
- /* Simply restore the exposed area from the backing store */
- gdk_draw_pixmap(
- td->drawing_area->window,
- td->gc,
- td->backing_store,
- event->area.x,
- event->area.y,
- event->area.x,
- event->area.y,
- event->area.width,
- event->area.height);
- }
-
- /* No backing store - use the game's code to redraw the area */
- else
- {
-
- /* Activate the relevant term */
- Term_activate(&td->t);
-
-# ifdef NO_REDRAW_SECTION
-
- /* K.I.S.S. version */
-
- /* Redraw */
- Term_redraw();
-
-# else /* NO_REDRAW_SECTION */
-
- /*
- * Complex version - The above is enough, but since we have
- * Term_redraw_section... This might help if we had a graphics
- * mode.
- */
-
- /* Convert coordinate in pixels to character cells */
- x1 = event->area.x / td->font_wid;
- x2 = (event->area.x + event->area.width) / td->font_wid;
- y1 = event->area.y / td->font_hgt;
- y2 = (event->area.y + event->area.height) / td->font_hgt;
-
- /*
- * No paranoia - boundary checking is done in
- * Term_redraw_section
- */
-
- /* Redraw the area */
- Term_redraw_section(x1, y1, x2, y2);
-
-# endif /* NO_REDRAW_SECTION */
-
- /* Refresh */
- Term_fresh();
-
- /* Restore */
- Term_activate(old);
- }
-
- /* We've processed the event ourselves */
- return (TRUE);
-}
-
-
-
-
-/**** Initialisation ****/
-
-/*
- * Initialise a term_data struct
- */
-static errr term_data_init(term_data *td, int i)
-{
- term *t = &td->t;
- char *p;
-
- td->cols = 80;
- td->rows = 24;
-
- /* Initialize the term */
- term_init(t, td->cols, td->rows, 1024);
-
- /* Store the name of the term */
- td->name = string_make(angband_term_name[i]);
-
- /* Instance names should start with a lowercase letter XXX */
- for (p = (char *)td->name; *p; p++) *p = tolower(*p);
-
- /* Use a "soft" cursor */
- t->soft_cursor = TRUE;
-
- /* Erase with "white space" */
- t->attr_blank = TERM_WHITE;
- t->char_blank = ' ';
-
- t->xtra_hook = Term_xtra_gtk;
- t->text_hook = Term_text_gtk;
- t->wipe_hook = Term_wipe_gtk;
- t->curs_hook = Term_curs_gtk;
-#ifdef USE_GRAPHICS
- t->pict_hook = Term_pict_gtk;
-#endif /* USE_GRAPHICS */
- t->nuke_hook = Term_nuke_gtk;
-
- /* Save the data */
- t->data = td;
-
- /* Activate (important) */
- Term_activate(t);
-
- /* Success */
- return (0);
-}
-
-
-/*
- * Neater menu code with GtkItemFactory.
- *
- * Menu bar of the Angband window
- *
- * Entry format: Path, Accelerator, Callback, Callback arg, type
- * where type is one of:
- * <Item> - simple item, alias NULL
- * <Branch> - has submenu
- * <Separator> - as you read it
- * <CheckItem> - has a check mark
- * <ToggleItem> - is a toggle
- */
-static GtkItemFactoryEntry main_menu_items[] =
-{
- /* "File" menu */
- { "/File", NULL,
- NULL, 0, "<Branch>"
- },
-#ifndef SAVEFILE_SCREEN
- { "/File/New", "<mod1>N",
- new_event_handler, 0, NULL },
- { "/File/Open", "<mod1>O",
- open_event_handler, 0, NULL },
- { "/File/sep1", NULL,
- NULL, 0, "<Separator>" },
-#endif /* !SAVEFILE_SCREEN */
- { "/File/Save", "<mod1>S",
- save_event_handler, 0, NULL },
- { "/File/Quit", "<mod1>Q",
- quit_event_handler, 0, NULL },
-
- /* "Terms" menu */
- { "/Terms", NULL,
- NULL, 0, "<Branch>" },
- /* XXX XXX XXX NULL's are replaced by the program */
- { NULL, "<mod1>0",
- term_event_handler, (guint)&data[0], "<CheckItem>" },
- { NULL, "<mod1>1",
- term_event_handler, (guint)&data[1], "<CheckItem>" },
- { NULL, "<mod1>2",
- term_event_handler, (guint)&data[2], "<CheckItem>" },
- { NULL, "<mod1>3",
- term_event_handler, (guint)&data[3], "<CheckItem>" },
- { NULL, "<mod1>4",
- term_event_handler, (guint)&data[4], "<CheckItem>" },
- { NULL, "<mod1>5",
- term_event_handler, (guint)&data[5], "<CheckItem>" },
- { NULL, "<mod1>6",
- term_event_handler, (guint)&data[6], "<CheckItem>" },
- { NULL, "<mod1>7",
- term_event_handler, (guint)&data[7], "<CheckItem>" },
-
- /* "Options" menu */
- { "/Options", NULL,
- NULL, 0, "<Branch>" },
-
- /* "Font" submenu */
- { "/Options/Font", NULL,
- NULL, 0, "<Branch>" },
- /* XXX XXX XXX Again, NULL's are filled by the program */
- { NULL, NULL,
- change_font_event_handler, (guint)&data[0], NULL },
- { NULL, NULL,
- change_font_event_handler, (guint)&data[1], NULL },
- { NULL, NULL,
- change_font_event_handler, (guint)&data[2], NULL },
- { NULL, NULL,
- change_font_event_handler, (guint)&data[3], NULL },
- { NULL, NULL,
- change_font_event_handler, (guint)&data[4], NULL },
- { NULL, NULL,
- change_font_event_handler, (guint)&data[5], NULL },
- { NULL, NULL,
- change_font_event_handler, (guint)&data[6], NULL },
- { NULL, NULL,
- change_font_event_handler, (guint)&data[7], NULL },
-
-#ifdef USE_GRAPHICS
-
- /* "Graphics" submenu */
- { "/Options/Graphics", NULL,
- NULL, 0, "<Branch>" },
- { "/Options/Graphics/None", NULL,
- change_graf_mode_event_handler, GRAF_MODE_NONE, "<CheckItem>" },
- { "/Options/Graphics/Old", NULL,
- change_graf_mode_event_handler, GRAF_MODE_OLD, "<CheckItem>" },
- { "/Options/Graphics/New", NULL,
- change_graf_mode_event_handler, GRAF_MODE_NEW, "<CheckItem>" },
-# ifdef USE_DOUBLE_TILES
- { "/Options/Graphics/sep3", NULL,
- NULL, 0, "<Separator>" },
- { "/Options/Graphics/Wide tiles", NULL,
- change_wide_tile_mode_event_handler, 0, "<CheckItem>" },
-# endif /* USE_DOUBLE_TILES */
- { "/Options/Graphics/sep1", NULL,
- NULL, 0, "<Separator>" },
- { "/Options/Graphics/Dither if <= 8bpp", NULL,
- change_dith_mode_event_handler, GDK_RGB_DITHER_NORMAL, "<CheckItem>" },
- { "/Options/Graphics/Dither if <= 16bpp", NULL,
- change_dith_mode_event_handler, GDK_RGB_DITHER_MAX, "<CheckItem>" },
- { "/Options/Graphics/sep2", NULL,
- NULL, 0, "<Separator>" },
- { "/Options/Graphics/Smoothing", NULL,
- change_smooth_mode_event_handler, 0, "<CheckItem>" },
-# ifdef USE_TRANSPARENCY
- { "/Options/Graphics/Transparency", NULL,
- change_trans_mode_event_handler, 0, "<CheckItem>" },
-# endif /* USE_TRANSPARENCY */
-
-#endif /* USE_GRAPHICS */
-
- /* "Misc" submenu */
- { "/Options/Misc", NULL,
- NULL, 0, "<Branch>" },
- { "/Options/Misc/Backing store", NULL,
- change_backing_store_event_handler, 0, "<CheckItem>" },
-};
-
-
-/*
- * XXX XXX Fill those NULL's in the menu definition with
- * angband_term_name[] strings
- */
-static void setup_menu_paths(void)
-{
- int i;
- int nmenu_items = sizeof(main_menu_items) / sizeof(main_menu_items[0]);
- GtkItemFactoryEntry *term_entry, *font_entry;
- char buf[64];
-
- /* Find the "Terms" menu */
- for (i = 0; i < nmenu_items; i++)
- {
- /* Skip NULLs */
- if (main_menu_items[i].path == NULL) continue;
-
- /* Find a match */
- if (streq(main_menu_items[i].path, "/Terms")) break;
- }
- g_assert(i < (nmenu_items - MAX_TERM_DATA));
-
- /* Remember the location */
- term_entry = &main_menu_items[i + 1];
-
- /* Find "Font" menu */
- for (i = 0; i < nmenu_items; i++)
- {
- /* Skip NULLs */
- if (main_menu_items[i].path == NULL) continue;
-
- /* Find a match */
- if (streq(main_menu_items[i].path, "/Options/Font")) break;
- }
- g_assert(i < (nmenu_items - MAX_TERM_DATA));
-
- /* Remember the location */
- font_entry = &main_menu_items[i + 1];
-
- /* For each terminal */
- for (i = 0; i < MAX_TERM_DATA; i++)
- {
- /* XXX XXX Build the real path name to the entry */
- strnfmt(buf, 64, "/Terms/%s", angband_term_name[i]);
-
- /* XXX XXX Store it in the menu definition */
- (cptr)term_entry[i].path = string_make(buf);
-
- /* XXX XXX Build the real path name to the entry */
- strnfmt(buf, 64, "/Options/Font/%s", angband_term_name[i]);
-
- /* XXX XXX Store it in the menu definition */
- (cptr)font_entry[i].path = string_make(buf);
- }
-}
-
-
-/*
- * XXX XXX Free strings allocated by setup_menu_paths()
- */
-static void free_menu_paths(void)
-{
- int i;
- int nmenu_items = sizeof(main_menu_items) / sizeof(main_menu_items[0]);
- GtkItemFactoryEntry *term_entry, *font_entry;
-
- /* Find the "Terms" menu */
- for (i = 0; i < nmenu_items; i++)
- {
- /* Skip NULLs */
- if (main_menu_items[i].path == NULL) continue;
-
- /* Find a match */
- if (streq(main_menu_items[i].path, "/Terms")) break;
- }
- g_assert(i < (nmenu_items - MAX_TERM_DATA));
-
- /* Remember the location */
- term_entry = &main_menu_items[i + 1];
-
- /* Find "Font" menu */
- for (i = 0; i < nmenu_items; i++)
- {
- /* Skip NULLs */
- if (main_menu_items[i].path == NULL) continue;
-
- /* Find a match */
- if (streq(main_menu_items[i].path, "/Options/Font")) break;
- }
- g_assert(i < (nmenu_items - MAX_TERM_DATA));
-
- /* Remember the location */
- font_entry = &main_menu_items[i + 1];
-
- /* For each terminal */
- for (i = 0; i < MAX_TERM_DATA; i++)
- {
- /* XXX XXX Free Term menu path */
- if (term_entry[i].path) string_free((cptr)term_entry[i].path);
-
- /* XXX XXX Free Font menu path */
- if (font_entry[i].path) string_free((cptr)font_entry[i].path);
- }
-}
-
-
-/*
- * Find widget corresponding to path name
- * return NULL on error
- */
-static GtkWidget *get_widget_from_path(cptr path)
-{
- GtkItemFactory *item_factory;
- GtkWidget *widget;
-
- /* Paranoia */
- if (path == NULL) return (NULL);
-
- /* Look up item factory */
- item_factory = gtk_item_factory_from_path(path);
-
- /* Oops */
- if (item_factory == NULL) return (NULL);
-
- /* Look up widget */
- widget = gtk_item_factory_get_widget(item_factory, path);
-
- /* Return result */
- return (widget);
-}
-
-
-/*
- * Enable/disable a menu item
- */
-void enable_menu_item(cptr path, bool enabled)
-{
- GtkWidget *widget;
-
- /* Access menu item widget */
- widget = get_widget_from_path(path);
-
- /* Paranoia */
- g_assert(widget != NULL);
- g_assert(GTK_IS_MENU_ITEM(widget));
-
- /*
- * In Gtk's terminology, enabled is sensitive
- * and disabled insensitive
- */
- gtk_widget_set_sensitive(widget, enabled);
-}
-
-
-/*
- * Check/uncheck a menu item. The item should be of the GtkCheckMenuItem type
- */
-void check_menu_item(cptr path, bool checked)
-{
- GtkWidget *widget;
-
- /* Access menu item widget */
- widget = get_widget_from_path(path);
-
- /* Paranoia */
- g_assert(widget != NULL);
- g_assert(GTK_IS_CHECK_MENU_ITEM(widget));
-
- /*
- * Put/remove check mark
- *
- * Mega-Hack -- The function supposed to be used here,
- * gtk_check_menu_item_set_active(), emits an "activate" signal
- * to the GtkMenuItem class of the widget, as if the menu item
- * were selected by user, thereby causing bizarre behaviour.
- * XXX XXX XXX
- */
- GTK_CHECK_MENU_ITEM(widget)->active = checked;
-}
-
-
-/*
- * Update the "File" menu
- */
-static void file_menu_update_handler(
- GtkWidget *widget,
- gpointer user_data)
-{
-#ifndef SAVEFILE_SCREEN
- bool game_start_ok;
-#endif /* !SAVEFILE_SCREEN */
- bool save_ok, quit_ok;
-
-#ifndef SAVEFILE_SCREEN
-
- /* Can we start a game now? */
- game_start_ok = !game_in_progress;
-
-#endif /* !SAVEFILE_SCREEN */
-
- /* Cave we save/quit now? */
- if (!character_generated || !game_in_progress)
- {
- save_ok = FALSE;
- quit_ok = TRUE;
- }
- else
- {
- if (inkey_flag && can_save) save_ok = quit_ok = TRUE;
- else save_ok = quit_ok = FALSE;
- }
-
- /* Enable / disable menu items according to those conditions */
-#ifndef SAVEFILE_SCREEN
- enable_menu_item("<Angband>/File/New", game_start_ok);
- enable_menu_item("<Angband>/File/Open", game_start_ok);
-#endif /* !SAVEFILE_SCREEN */
- enable_menu_item("<Angband>/File/Save", save_ok);
- enable_menu_item("<Angband>/File/Quit", quit_ok);
-}
-
-
-/*
- * Update the "Terms" menu
- */
-static void term_menu_update_handler(
- GtkWidget *widget,
- gpointer user_data)
-{
- int i;
- char buf[64];
-
- /* For each term */
- for (i = 0; i < MAX_TERM_DATA; i++)
- {
- /* Build the path name */
- strnfmt(buf, 64, "<Angband>/Terms/%s", angband_term_name[i]);
-
- /* Update the check mark on the item */
- check_menu_item(buf, data[i].shown);
- }
-}
-
-
-/*
- * Update the "Font" submenu
- */
-static void font_menu_update_handler(
- GtkWidget *widget,
- gpointer user_data)
-{
- int i;
- char buf[64];
-
- /* For each term */
- for (i = 0; i < MAX_TERM_DATA; i++)
- {
- /* Build the path name */
- strnfmt(buf, 64, "<Angband>/Options/Font/%s", angband_term_name[i]);
-
- /* Enable selection if the term is shown */
- enable_menu_item(buf, data[i].shown);
- }
-}
-
-
-/*
- * Update the "Misc" submenu
- */
-static void misc_menu_update_handler(
- GtkWidget *widget,
- gpointer user_data)
-{
- /* Update an item */
- check_menu_item(
- "<Angband>/Options/Misc/Backing store",
- use_backing_store);
-}
-
-
-#ifdef USE_GRAPHICS
-
-/*
- * Update the "Graphics" submenu
- */
-static void graf_menu_update_handler(
- GtkWidget *widget,
- gpointer user_data)
-{
- /* Update menu items */
- check_menu_item(
- "<Angband>/Options/Graphics/None",
- (graf_mode == GRAF_MODE_NONE));
- check_menu_item(
- "<Angband>/Options/Graphics/Old",
- (graf_mode == GRAF_MODE_OLD));
- check_menu_item(
- "<Angband>/Options/Graphics/New",
- (graf_mode == GRAF_MODE_NEW));
-
-#ifdef USE_DOUBLE_TILES
-
- check_menu_item(
- "<Angband>/Options/Graphics/Wide tiles",
- use_bigtile);
-
-#endif /* USE_DOUBLE_TILES */
-
- check_menu_item(
- "<Angband>/Options/Graphics/Dither if <= 8bpp",
- (dith_mode == GDK_RGB_DITHER_NORMAL));
- check_menu_item(
- "<Angband>/Options/Graphics/Dither if <= 16bpp",
- (dith_mode == GDK_RGB_DITHER_MAX));
-
- check_menu_item(
- "<Angband>/Options/Graphics/Smoothing",
- smooth_rescaling);
-
-# ifdef USE_TRANSPARENCY
-
- check_menu_item(
- "<Angband>/Options/Graphics/Transparency",
- use_transparency);
-
-# endif /* USE_TRANSPARENCY */
-}
-
-#endif /* USE_GRAPHICS */
-
-
-/*
- * Construct a menu hierarchy using GtkItemFactory, setting up
- * callbacks and accelerators along the way, and return
- * a GtkMenuBar widget.
- */
-GtkWidget *get_main_menu(term_data *td)
-{
- GtkItemFactory *item_factory;
- GtkAccelGroup *accel_group;
- gint nmenu_items = sizeof(main_menu_items) / sizeof(main_menu_items[0]);
-
-
- /* XXX XXX Setup path names in the "Terms" and "Font" menus */
- setup_menu_paths();
-
- /* Allocate an accelerator group */
- accel_group = gtk_accel_group_new();
- g_assert(accel_group != NULL);
-
- /* Initialise the item factory */
- item_factory = gtk_item_factory_new(
- GTK_TYPE_MENU_BAR,
- "<Angband>",
- accel_group);
- g_assert(item_factory != NULL);
-
- /* Generate the menu items */
- gtk_item_factory_create_items(
- item_factory,
- nmenu_items,
- main_menu_items,
- NULL);
-
- /* Attach the new accelerator group to the window */
- gtk_window_add_accel_group(
- GTK_WINDOW(td->window),
- accel_group);
-
- /* Return the actual menu bar created */
- return (gtk_item_factory_get_widget(item_factory, "<Angband>"));
-}
-
-
-/*
- * Install callbacks to update menus
- */
-static void add_menu_update_callbacks()
-{
- GtkWidget *widget;
-
- /* Access the "File" menu */
- widget = get_widget_from_path("<Angband>/File");
-
- /* Paranoia */
- g_assert(widget != NULL);
- g_assert(GTK_IS_MENU(widget));
-
- /* Assign callback */
- gtk_signal_connect(
- GTK_OBJECT(widget),
- "show",
- GTK_SIGNAL_FUNC(file_menu_update_handler),
- NULL);
-
- /* Access the "Terms" menu */
- widget = get_widget_from_path("<Angband>/Terms");
-
- /* Paranoia */
- g_assert(widget != NULL);
- g_assert(GTK_IS_MENU(widget));
-
- /* Assign callback */
- gtk_signal_connect(
- GTK_OBJECT(widget),
- "show",
- GTK_SIGNAL_FUNC(term_menu_update_handler),
- NULL);
-
- /* Access the "Font" menu */
- widget = get_widget_from_path("<Angband>/Options/Font");
-
- /* Paranoia */
- g_assert(widget != NULL);
- g_assert(GTK_IS_MENU(widget));
-
- /* Assign callback */
- gtk_signal_connect(
- GTK_OBJECT(widget),
- "show",
- GTK_SIGNAL_FUNC(font_menu_update_handler),
- NULL);
-
- /* Access the "Misc" menu */
- widget = get_widget_from_path("<Angband>/Options/Misc");
-
- /* Paranoia */
- g_assert(widget != NULL);
- g_assert(GTK_IS_MENU(widget));
-
- /* Assign callback */
- gtk_signal_connect(
- GTK_OBJECT(widget),
- "show",
- GTK_SIGNAL_FUNC(misc_menu_update_handler),
- NULL);
-
-#ifdef USE_GRAPHICS
-
- /* Access Graphics menu */
- widget = get_widget_from_path("<Angband>/Options/Graphics");
-
- /* Paranoia */
- g_assert(widget != NULL);
- g_assert(GTK_IS_MENU(widget));
-
- /* Assign callback */
- gtk_signal_connect(
- GTK_OBJECT(widget),
- "show",
- GTK_SIGNAL_FUNC(graf_menu_update_handler),
- NULL);
-
-#endif /* USE_GRAPHICS */
-}
-
-
-/*
- * Create Gtk widgets for a terminal window and set up callbacks
- */
-static void init_gtk_window(term_data *td, int i)
-{
- GtkWidget *menu_bar = NULL, *box;
- cptr font;
-
- bool main_window = (i == 0) ? TRUE : FALSE;
-
-
- /* Create window */
- td->window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
-
- /* Set title */
- gtk_window_set_title(GTK_WINDOW(td->window), td->name);
-
-
- /* Get default font for this term */
- font = get_default_font(i);
-
- /* Load font and initialise related term_data fields */
- load_font(td, font);
-
-
- /* Create drawing area */
- td->drawing_area = gtk_drawing_area_new();
-
- /* Set the size of the drawing area */
- gtk_drawing_area_size(
- GTK_DRAWING_AREA(td->drawing_area),
- td->cols * td->font_wid,
- td->rows * td->font_hgt);
-
- /* Set geometry hints */
- term_data_set_geometry_hints(td);
-
-
- /* Install window event handlers */
- gtk_signal_connect(
- GTK_OBJECT(td->window),
- "delete_event",
- GTK_SIGNAL_FUNC(delete_event_handler),
- NULL);
- gtk_signal_connect(
- GTK_OBJECT(td->window),
- "key_press_event",
- GTK_SIGNAL_FUNC(keypress_event_handler),
- NULL);
-
- /* Destroying the Angband window terminates the game */
- if (main_window)
- {
- gtk_signal_connect(
- GTK_OBJECT(td->window),
- "destroy_event",
- GTK_SIGNAL_FUNC(destroy_main_event_handler),
- NULL);
- }
-
- /* The other windows are just hidden */
- else
- {
- gtk_signal_connect(
- GTK_OBJECT(td->window),
- "destroy_event",
- GTK_SIGNAL_FUNC(destroy_sub_event_handler),
- td);
- }
-
-
- /* Install drawing area event handlers */
- gtk_signal_connect(
- GTK_OBJECT(td->drawing_area),
- "realize",
- GTK_SIGNAL_FUNC(realize_event_handler),
- (gpointer)td);
- gtk_signal_connect(
- GTK_OBJECT(td->drawing_area),
- "show",
- GTK_SIGNAL_FUNC(show_event_handler),
- (gpointer)td);
- gtk_signal_connect(
- GTK_OBJECT(td->drawing_area),
- "hide",
- GTK_SIGNAL_FUNC(hide_event_handler),
- (gpointer)td);
- gtk_signal_connect(
- GTK_OBJECT(td->drawing_area),
- "size_allocate",
- GTK_SIGNAL_FUNC(size_allocate_event_handler),
- (gpointer)td);
- gtk_signal_connect(
- GTK_OBJECT(td->drawing_area),
- "expose_event",
- GTK_SIGNAL_FUNC(expose_event_handler),
- (gpointer)td);
-
-
- /* Create menu */
- if (main_window)
- {
- /* Build the main menu bar */
- menu_bar = get_main_menu(td);
- g_assert(menu_bar != NULL);
-
- /* Since it's tedious to scatter the menu update code around */
- add_menu_update_callbacks();
- }
-
-
- /* Pack the menu bar together with the main window */
- /* For vertical placement of the menu bar and the drawing area */
- box = gtk_vbox_new(FALSE, 0);
-
- /* Let the window widget own it */
- gtk_container_add(GTK_CONTAINER(td->window), box);
-
- /* The main window has a menu bar */
- if (main_window)
- gtk_box_pack_start(
- GTK_BOX(box),
- menu_bar,
- FALSE,
- FALSE,
- NO_PADDING);
-
- /* And place the drawing area just beneath it */
- gtk_box_pack_start_defaults(GTK_BOX(box), td->drawing_area);
-
-
- /* Show the widgets - use of td->shown is a dirty hack XXX XXX */
- if (td->shown) gtk_widget_show_all(td->window);
-}
-
-
-/*
- * To be hooked into quit(). See z-util.c
- */
-static void hook_quit(cptr str)
-{
- /* Free menu paths dynamically allocated */
- free_menu_paths();
-
-# ifdef USE_GRAPHICS
-
- /* Free pathname string */
- if (ANGBAND_DIR_XTRA_GRAF) string_free(ANGBAND_DIR_XTRA_GRAF);
-
-# endif /* USE_GRAPHICS */
-
- /* Terminate the program */
- gtk_exit(0);
-}
-
-
-#ifdef ANGBAND300
-
-/*
- * Help message for this port
- */
-const char help_gtk[] =
- "GTK for X11, subopts -n<windows>\n"
- " -b(acking store off)\n"
-#ifdef USE_GRAPHICS
- " -g(raphics) -o(ld graphics) -s(moothscaling off) \n"
- " -t(ransparency on)\n"
-# ifdef USE_DOUBLE_TILES
- " -w(ide tiles)\n"
-# endif /* USE_DOUBLE_TILES */
-#endif /* USE_GRAPHICS */
- " and standard GTK options";
-
-#endif /* ANGBAND300 */
-
-
-/*
- * Initialization function
- */
-errr init_gtk(int argc, char **argv)
-{
- int i;
-
-
- /* Initialize the environment */
- gtk_init(&argc, &argv);
-
- /* Activate hooks - Use gtk/glib interface throughout */
- ralloc_aux = hook_ralloc;
- rnfree_aux = hook_rnfree;
- quit_aux = hook_quit;
- core_aux = hook_quit;
-
- /* Parse args */
- for (i = 1; i < argc; i++)
- {
- /* Number of terminals displayed at start up */
- if (prefix(argv[i], "-n"))
- {
- num_term = atoi(&argv[i][2]);
- if (num_term > MAX_TERM_DATA) num_term = MAX_TERM_DATA;
- else if (num_term < 1) num_term = 1;
- continue;
- }
-
- /* Disable use of pixmaps as backing store */
- if (streq(argv[i], "-b"))
- {
- use_backing_store = FALSE;
- continue;
- }
-
-#ifdef USE_GRAPHICS
-
- /* Requests "old" graphics */
- if (streq(argv[i], "-o"))
- {
- graf_mode_request = GRAF_MODE_OLD;
- continue;
- }
-
- /* Requests "new" graphics */
- if (streq(argv[i], "-g"))
- {
- graf_mode_request = GRAF_MODE_NEW;
- continue;
- }
-
-# ifdef USE_DOUBLE_TILES
-
- /* Requests wide tile mode */
- if (streq(argv[i], "-w"))
- {
- use_bigtile = TRUE;
-# ifdef TOME
- /* T.o.M.E. uses older version of the patch */
- arg_bigtile = TRUE;
-# endif /* TOME */
- continue;
- }
-
-# endif /* USE_DOUBLE_TILES */
-
-
- /* Enable transparency effect */
- if (streq(argv[i], "-t"))
- {
- use_transparency = TRUE;
- continue;
- }
-
- /* Disable smooth rescaling of tiles */
- if (streq(argv[i], "-s"))
- {
- smooth_rescaling_request = FALSE;
- continue;
- }
-
-#endif /* USE_GRAPHICS */
-
- /* None of the above */
- plog_fmt("Ignoring option: %s", argv[i]);
- }
-
-#ifdef USE_GRAPHICS
-
- {
- char path[1024];
-
- /* Build the "graf" path */
- path_build(path, 1024, ANGBAND_DIR_XTRA, "graf");
-
- /* Allocate the path */
- ANGBAND_DIR_XTRA_GRAF = string_make(path);
- }
-
-#endif /* USE_GRAPHICS */
-
- /* Initialise colours */
- gdk_rgb_init();
- gtk_widget_set_default_colormap(gdk_rgb_get_cmap());
- gtk_widget_set_default_visual(gdk_rgb_get_visual());
- init_colours();
-
- /*
- * Initialise the windows backwards, so that
- * the Angband window comes in front
- */
- for (i = MAX_TERM_DATA - 1; i >= 0; i--)
- {
- term_data *td = &data[i];
-
- /* Initialize the term_data */
- term_data_init(td, i);
-
- /* Hack - Set the shown flag, meaning "to be shown" XXX XXX */
- if (i < num_term) td->shown = TRUE;
- else td->shown = FALSE;
-
- /* Save global entry */
- angband_term[i] = Term;
-
- /* Init the window */
- init_gtk_window(td, i);
- }
-
- /* Activate the "Angband" window screen */
- Term_activate(&data[0].t);
-
-#ifndef SAVEFILE_SCREEN
-
- /* Set the system suffix */
- ANGBAND_SYS = "gtk";
-
- /* Catch nasty signals */
- signals_init();
-
- /* Initialize */
- init_angband();
-
-#ifndef OLD_SAVEFILE_CODE
-
- /* Hack - because this port has New/Open menus XXX */
- savefile[0] = '\0';
-
-#endif /* !OLD_SAVEFILE_CODE */
-
- /* Prompt the user */
- prt("[Choose 'New' or 'Open' from the 'File' menu]", 23, 17);
- Term_fresh();
-
- /* Activate more hook */
- plog_aux = hook_plog;
-
-
- /* Processing loop */
- gtk_main();
-
-
- /* Free allocated memory */
- cleanup_angband();
-
- /* Stop now */
- quit(NULL);
-
-#else /* !SAVEFILE_SCREEN */
-
- /* Activate more hook */
- plog_aux = hook_plog;
-
- /* It's too early to set this, but cannot do so elsewhere XXX XXX */
- game_in_progress = TRUE;
-
-#endif /* !SAVEFILE_SCREEN */
-
- /* Success */
- return (0);
-}
-
-#endif /* USE_GTK */
diff --git a/src/main-gtk2.c b/src/main-gtk2.c
index ada45aa9..4830638a 100644
--- a/src/main-gtk2.c
+++ b/src/main-gtk2.c
@@ -52,9 +52,6 @@
* ZAngband has its own enhanced main-gtk.c as mentioned above, and
* you *should* use it :-)
*
- * ANG291_COMPAT does not include Angband 2.9.x's gamma correction code.
- * If you like to use SUPPORT_GAMMA, copy the code bracketed
- * inside of #ifdef SUPPORT_GAMMA in util.c of Angband 2.9.1 or greater.
*/
#define TOME
@@ -62,7 +59,6 @@
# define ANG293_COMPAT /* Requires V2.9.3 compatibility code */
# define ANG291_COMPAT /* Requires V2.9.1 compatibility code */
# define ANG281_RESET_VISUALS /* The old style reset_visuals() */
-# define INTERACTIVE_GAMMA /* Supports interactive gamma correction */
# define SAVEFILE_SCREEN /* New/Open integrated into the game */
# define USE_DOUBLE_TILES /* Mogami's bigtile patch */
#endif /* TOME */
@@ -73,7 +69,6 @@
#ifdef ANGBAND300
# define can_save TRUE /* Mimick the short-lived flag */
# define C_FREE(P, N, T) FREE(P) /* Emulate the long-lived macro */
-# define USE_TRANSPARENCY /* Because it's default now */
#endif /* ANGBAND300 */
#ifdef GUMBAND
@@ -172,7 +167,7 @@ struct term_data
GdkFont *font;
GdkGC *gc;
- bool shown;
+ bool_ shown;
byte last_attr;
int font_wid;
@@ -187,10 +182,8 @@ struct term_data
int tile_hgt;
GdkRGBImage *tiles;
-# ifdef USE_TRANSPARENCY
guint32 bg_pixel;
GdkRGBImage *trans_buf;
-# endif /* USE_TRANSPARENCY */
#endif /* USE_GRAPHICS */
@@ -267,7 +260,7 @@ static guint32 angband_colours[16];
/*
* Set to TRUE when a game is in progress
*/
-static bool game_in_progress = FALSE;
+static bool_ game_in_progress = FALSE;
/*
@@ -277,7 +270,7 @@ static bool game_in_progress = FALSE;
* with the MIT Shm extention which is usually active if you run
* Angband locally, because it reduces amount of memory-to-memory copy.
*/
-static bool use_backing_store = TRUE;
+static bool_ use_backing_store = TRUE;
@@ -345,7 +338,7 @@ static void cleanup_angband(void)
* Because of the way it is implemented in X11 ports,
* we can set this to TRUE even if we are using the 8x8 tileset.
*/
-static bool use_transparency = TRUE;
+static bool_ use_transparency = TRUE;
#endif /* ANG291_COMPAT */
@@ -384,118 +377,6 @@ static vptr hook_ralloc(huge size)
/**** Low level routines - colours and graphics ****/
-#ifdef SUPPORT_GAMMA
-
-/*
- * When set to TRUE, indicates that we can use gamma_table
- */
-static bool gamma_table_ready = FALSE;
-
-
-# ifdef INTERACTIVE_GAMMA
-
-/*
- * Initialise the gamma-correction table for current gamma_val
- * - interactive version
- */
-static void setup_gamma_table(void)
-{
- static u16b old_gamma_val = 0;
-
- /* Don't have to rebuild the table */
- if (gamma_val == old_gamma_val) return;
-
- /* Temporarily inactivate the table */
- gamma_table_ready = FALSE;
-
- /* Validate gamma_val */
- if ((gamma_val <= 0) || (gamma_val >= 256))
- {
- /* Reset */
- old_gamma_val = gamma_val = 0;
-
- /* Leave it inactive */
- return;
- }
-
- /* (Re)build the gamma table */
- build_gamma_table(gamma_val);
-
- /* Remember the gamma value used */
- old_gamma_val = gamma_val;
-
- /* Activate the table */
- gamma_table_ready = TRUE;
-}
-
-# else /* INTERACTIVE_GAMMA */
-
-/*
- * Initialise the gamma-correction table if environment variable
- * ANGBAND_X11_GAMMA is set and contains a meaningful value
- *
- * Restored for cross-variant compatibility
- */
-static void setup_gamma_table(void)
-{
- cptr tmp;
- int gamma_val;
-
-
- /* The table's already set up */
- if (gamma_table_ready) return;
-
- /*
- * XXX XXX It's documented nowhere, but ANGBAND_X11_GAMMA is
- * 256 * (1 / gamma), rounded to integer. A recommended value
- * is 183, which is an approximation of the Macintosh hardware
- * gamma of 1.4.
- *
- * gamma ANGBAND_X11_GAMMA
- * ----- -----------------
- * 1.2 213
- * 1.25 205
- * 1.3 197
- * 1.35 190
- * 1.4 183
- * 1.45 177
- * 1.5 171
- * 1.6 160
- * 1.7 151
- * ...
- *
- * XXX XXX The environment variable, or better,
- * the interact with colours command should allow users
- * to specify gamma values (or gamma value * 100).
- */
- tmp = getenv("ANGBAND_X11_GAMMA");
-
- /* Nothing to do */
- if (tmp == NULL) return;
-
- /* Extract the value */
- gamma_val = atoi(tmp);
-
- /*
- * Only need to build the table if gamma exists and set to
- * a meaningful value.
- *
- * XXX It may be a good idea to prevent use of very high gamma values,
- * say, greater than 2.5, which is gamma of normal CRT display IIRC.
- */
- if ((gamma_val <= 0) || (gamma_val >= 256)) return;
-
- /* Build the gamma correction table */
- build_gamma_table(gamma_val);
-
- /* The table is properly set up */
- gamma_table_ready = TRUE;
-}
-
-# endif /* INTERACTIVE_GAMMA */
-
-#endif /* SUPPORT_GAMMA */
-
/*
* Remeber RGB values for sixteen Angband colours, in a format
@@ -512,13 +393,6 @@ static void init_colours(void)
int i;
-#ifdef SUPPORT_GAMMA
-
- /* (Re)build gamma table if necessary */
- setup_gamma_table();
-
-#endif /* SUPPORT_GAMMA */
-
/* Process each colour */
for (i = 0; i < 16; i++)
{
@@ -529,18 +403,6 @@ static void init_colours(void)
green = angband_color_table[i][2];
blue = angband_color_table[i][3];
-#ifdef SUPPORT_GAMMA
-
- /* Hack -- Gamma Correction */
- if (gamma_table_ready)
- {
- red = gamma_table[red];
- green = gamma_table[green];
- blue = gamma_table[blue];
- }
-
-#endif /* SUPPORT_GAMMA */
-
/* Remember a GdkRGB value, that is 0xRRGGBB */
angband_colours[i] = (red << 16) | (green << 8) | blue;
}
@@ -578,8 +440,8 @@ static int graf_mode_request = GRAF_MODE_NONE;
/*
* Use smooth rescaling?
*/
-static bool smooth_rescaling = TRUE;
-static bool smooth_rescaling_request = TRUE;
+static bool_ smooth_rescaling = TRUE;
+static bool_ smooth_rescaling_request = TRUE;
/*
* Dithering
@@ -589,7 +451,7 @@ static GdkRgbDither dith_mode = GDK_RGB_DITHER_NORMAL;
/*
* Need to reload and resize tiles when fonts are changed.
*/
-static bool resize_request = FALSE;
+static bool_ resize_request = FALSE;
/*
* Numbers of columns and rows in current tileset
@@ -890,7 +752,7 @@ static void get_scaled_row(
guint32 pix;
rgb_type prev;
rgb_type next;
- bool get_next_pix;
+ bool_ get_next_pix;
/* Unscaled */
if (iw == ow)
@@ -1047,18 +909,6 @@ static void put_rgb_scan(
g = (scan[xi].green + adj) / div;
b = (scan[xi].blue + adj) / div;
-#ifdef SUPPORT_GAMMA
-
- /* Apply gamma correction if requested and available */
- if (gamma_table_ready)
- {
- r = gamma_table[r];
- g = gamma_table[g];
- b = gamma_table[b];
- }
-
-#endif /* SUPPORT_GAMMA */
-
/* Make a (virtual) 24-bit pixel */
pix = (r << 16) | (g << 8) | (b);
@@ -1098,7 +948,7 @@ static void scale_icon(
rgb_type next[MAX_ICON_WIDTH];
rgb_type temp[MAX_ICON_WIDTH];
- bool get_next_row;
+ bool_ get_next_row;
/* get divider value for the horizontal scaling: */
if (ix == ox)
@@ -1315,19 +1165,6 @@ static void copy_pixels(
/* Copy to the image */
for (i = 0; i < wid; i++)
{
-#ifdef SUPPORT_GAMMA
-
- if (gamma_table_ready)
- {
- *dst++ = gamma_table[src[3 * xoffsets[i]]];
- *dst++ = gamma_table[src[3 * xoffsets[i] + 1]];
- *dst++ = gamma_table[src[3 * xoffsets[i] + 2]];
-
- continue;
- }
-
-#endif /* SUPPORT_GAMMA */
-
*dst++ = src[3 * xoffsets[i]];
*dst++ = src[3 * xoffsets[i] + 1];
*dst++ = src[3 * xoffsets[i] + 2];
@@ -1532,7 +1369,7 @@ static GdkRGBImage *resize_tiles(
* CAVEAT: treatment of backslash is not compatible with the standard
* C usage XXX XXX XXX XXX
*/
-static bool read_str(char *buf, u32b len, FILE *f)
+static bool_ read_str(char *buf, u32b len, FILE *f)
{
int c;
@@ -1614,7 +1451,7 @@ static GdkRGBImage *load_xpm(cptr filename)
GdkRGBImage *img = NULL;
int width, height, colours, chars;
int i, j, k;
- bool ret;
+ bool_ ret;
pal_type *pal = NULL;
pal_type *head[HASH_SIZE];
u32b buflen = 0;
@@ -2190,16 +2027,11 @@ static void graf_nuke()
/* Forget pointer */
td->tiles = NULL;
-# ifdef USE_TRANSPARENCY
-
/* Free previously allocated transparency buffer */
if (td->trans_buf) gdk_rgb_image_destroy(td->trans_buf);
/* Forget stale pointer */
td->trans_buf = NULL;
-
-# endif /* USE_TRANSPARENCY */
-
}
}
@@ -2212,20 +2044,18 @@ static void graf_nuke()
*
* XXX XXX XXX Windows using the same font should share resized tiles
*/
-static bool graf_init(
+static bool_ graf_init(
cptr filename,
int tile_wid,
int tile_hgt)
{
term_data *td;
- bool result;
+ bool_ result;
GdkRGBImage *raw_tiles, *scaled_tiles;
-# ifdef USE_TRANSPARENCY
GdkRGBImage *buffer;
-# endif /* USE_TRANSPARENCY */
int i;
@@ -2300,8 +2130,6 @@ static bool graf_init(
td->tiles = scaled_tiles;
}
-# ifdef USE_TRANSPARENCY
-
/* See if we have to (re)allocate a new buffer XXX */
if ((td->trans_buf == NULL) ||
(td->trans_buf->width != td->tile_wid) ||
@@ -2338,8 +2166,6 @@ static bool graf_init(
0,
tile_hgt * 6);
-# endif /* USE_TRANSPARENCY */
-
}
@@ -2502,16 +2328,12 @@ static void Term_nuke_gtk(term *t)
/* Forget pointer */
td->tiles = NULL;
-# ifdef USE_TRANSPARENCY
-
/* Free transparency buffer */
if (td->trans_buf) gdk_rgb_image_destroy(td->trans_buf);
/* Amnesia */
td->trans_buf = NULL;
-# endif /* USE_TRANSPARENCY */
-
#endif /* USE_GRAPHICS */
}
@@ -2670,8 +2492,6 @@ static errr Term_curs_gtk(int x, int y)
#ifdef USE_GRAPHICS
-# ifdef USE_TRANSPARENCY
-
/*
* XXX XXX Low level graphics helper
* Draw a tile at (s_x, s_y) over one at (t_x, t_y) and store the
@@ -2711,8 +2531,6 @@ static void overlay_tiles_2(
}
-# ifdef USE_EGO_GRAPHICS
-
/*
* XXX XXX Low level graphics helper
* Draw a tile at (e_x, e_y) over one at (s_x, s_y) over another one
@@ -2759,9 +2577,6 @@ static void overlay_tiles_3(
}
}
-# endif /* USE_EGO_GRAPHICS */
-
-# endif /* USE_TRANSPARENCY */
/*
@@ -2769,24 +2584,11 @@ static void overlay_tiles_3(
*
* Draw "n" tiles/characters starting at (x,y)
*/
-# ifdef USE_TRANSPARENCY
-# ifdef USE_EGO_GRAPHICS
static errr Term_pict_gtk(
int x, int y, int n,
const byte *ap, const char *cp,
const byte *tap, const char *tcp,
const byte *eap, const char *ecp)
-# else /* USE_EGO_GRAPHICS */
-static errr Term_pict_gtk(
- int x, int y, int n,
- const byte *ap, const char *cp,
- const byte *tap, const char *tcp)
-# endif /* USE_EGO_GRAPHICS */
-# else /* USE_TRANSPARENCY */
-static errr Term_pict_gtk(
- int x, int y, int n,
- const byte *ap, const char *cp)
-# endif /* USE_TRANSPARENCY */
{
term_data *td = (term_data*)(Term->data);
@@ -2827,57 +2629,37 @@ static errr Term_pict_gtk(
char c;
int s_x, s_y;
-# ifdef USE_TRANSPARENCY
-
byte ta;
char tc;
int t_x, t_y;
-# ifdef USE_EGO_GRAPHICS
-
byte ea;
char ec;
int e_x = 0, e_y = 0;
- bool has_overlay;
-
-# endif /* USE_EGO_GRAPHICS */
-
-# endif /* USE_TRANSPARENCY */
+ bool_ has_overlay;
/* Grid attr/char */
a = *ap++;
c = *cp++;
-# ifdef USE_TRANSPARENCY
-
/* Terrain attr/char */
ta = *tap++;
tc = *tcp++;
-# ifdef USE_EGO_GRAPHICS
-
/* Overlay attr/char */
ea = *eap++;
ec = *ecp++;
has_overlay = (ea && ec);
-# endif /* USE_EGO_GRAPHICS */
-
-# endif /* USE_TRANSPARENCY */
-
/* Row and Col */
s_y = (((byte)a & 0x7F) % tile_rows) * td->tile_hgt;
s_x = (((byte)c & 0x7F) % tile_cols) * td->tile_wid;
-# ifdef USE_TRANSPARENCY
-
/* Terrain Row and Col */
t_y = (((byte)ta & 0x7F) % tile_rows) * td->tile_hgt;
t_x = (((byte)tc & 0x7F) % tile_cols) * td->tile_wid;
-# ifdef USE_EGO_GRAPHICS
-
/* Overlay Row and Col */
if (has_overlay)
{
@@ -2885,8 +2667,6 @@ static errr Term_pict_gtk(
e_x = (((byte)ec & 0x7F) % tile_cols) * td->tile_wid;
}
-# endif /* USE_EGO_GRAPHICS */
-
# ifdef USE_DOUBLE_TILES
@@ -2909,8 +2689,6 @@ static errr Term_pict_gtk(
((s_x == t_x) && (s_y == t_y)))
{
-# ifdef USE_EGO_GRAPHICS
-
/* The simplest possible case - no overlay */
if (!has_overlay)
{
@@ -2939,17 +2717,6 @@ static errr Term_pict_gtk(
gdk_flush();
}
-# else /* USE_EGO_GRAPHICS */
-
- /* Draw the tile */
- gdk_draw_rgb_image_2(
- TERM_DATA_DRAWABLE(td), td->gc, td->tiles,
- s_x, s_y,
- d_x, d_y,
- td->tile_wid, td->tile_hgt);
-
-# endif /* USE_EGO_GRAPHICS */
-
}
/*
@@ -2959,13 +2726,6 @@ static errr Term_pict_gtk(
else
{
-# ifndef USE_EGO_GRAPHICS
-
- /* Draw mon/PC/obj over terrain */
- overlay_tiles_2(td, s_x, s_y, t_x, t_y);
-
-# else /* !USE_EGO_GRAPHICS */
-
/* No overlay */
if (!has_overlay)
{
@@ -2981,8 +2741,6 @@ static errr Term_pict_gtk(
t_x, t_y);
}
-# endif /* !USE_EGO_GRAPHICS */
-
/* Draw it */
gdk_draw_rgb_image_2(
TERM_DATA_DRAWABLE(td), td->gc, td->trans_buf,
@@ -2994,17 +2752,6 @@ static errr Term_pict_gtk(
gdk_flush();
}
-# else /* USE_TRANSPARENCY */
-
- /* Draw the tile */
- gdk_draw_rgb_image_2(
- TERM_DATA_DRAWABLE(td), td->gc, td->tiles,
- s_x, s_y,
- d_x, d_y,
- td->tile_wid, td->tile_hgt);
-
-# endif /* USE_TRANSPARENCY */
-
/*
* Advance x-coordinate - wide font fillers are taken care of
* before entering the tile drawing code.
@@ -3042,7 +2789,7 @@ static errr Term_pict_gtk(
* Process an event, if there's none block when wait is set true,
* return immediately otherwise.
*/
-static void CheckEvent(bool wait)
+static void CheckEvent(bool_ wait)
{
/* Process an event */
(void)gtk_main_iteration_do(wait);
@@ -3540,60 +3287,6 @@ static void load_font(term_data *td, cptr fontname)
/*
- * React to OK button press in font selection dialogue
- */
-static void font_ok_callback(
- GtkWidget *widget,
- GtkWidget *font_selector)
-{
- gchar *fontname;
- term_data *td;
-
- td = gtk_object_get_data(GTK_OBJECT(font_selector), "term_data");
-
- g_assert(td != NULL);
-
- /* Retrieve font name from player's selection */
- fontname = gtk_font_selection_dialog_get_font_name(
- GTK_FONT_SELECTION_DIALOG(font_selector));
-
- /* Leave unless selection was valid */
- if (fontname == NULL) return;
-
- /* Load font and update font size info */
- load_font(td, fontname);
-
- /* Hack - Hide the window - finally found the trick... */
- gtk_widget_hide_all(td->window);
-
- /* Resizes the drawing area */
- gtk_drawing_area_size(
- GTK_DRAWING_AREA(td->drawing_area),
- td->cols * td->font_wid,
- td->rows * td->font_hgt);
-
- /* Update the geometry hints for the window */
- term_data_set_geometry_hints(td);
-
- /* Reallocate the backing store */
- term_data_set_backing_store(td);
-
- /* Hack - Show the window */
- gtk_widget_show_all(td->window);
-
-#ifdef USE_GRAPHICS
-
- /* We have to resize tiles when we are in graphics mode */
- resize_request = TRUE;
-
-#endif /* USE_GRAPHICS */
-
- /* Hack - force redraw */
- Term_key_push(KTRL('R'));
-}
-
-
-/*
* Process Options-Font-* menu command
*/
static void change_font_event_handler(
@@ -3601,51 +3294,7 @@ static void change_font_event_handler(
guint user_action,
GtkWidget *widget)
{
- GtkWidget *font_selector;
-
- font_selector = gtk_font_selection_dialog_new("Select font");
-#if 0 // DGDGDGDG
- gtk_object_set_data(
- GTK_OBJECT(font_selector),
- "term_data",
- user_data);
-
- /* Filter to show only fixed-width fonts */
- gtk_font_selection_dialog_set_filter(
- GTK_FONT_SELECTION_DIALOG(font_selector),
- GTK_FONT_FILTER_BASE,
- GTK_FONT_ALL,
- NULL,
- NULL,
- NULL,
- NULL,
- spacings,
- NULL);
-
- gtk_signal_connect(
- GTK_OBJECT(GTK_FONT_SELECTION_DIALOG(font_selector)->ok_button),
- "clicked",
- font_ok_callback,
- (gpointer)font_selector);
-
- /*
- * Ensure that the dialog box is destroyed when the user clicks
- * a button.
- */
- gtk_signal_connect_object(
- GTK_OBJECT(GTK_FONT_SELECTION_DIALOG(font_selector)->ok_button),
- "clicked",
- GTK_SIGNAL_FUNC(gtk_widget_destroy),
- (gpointer)font_selector);
-
- gtk_signal_connect_object(
- GTK_OBJECT(GTK_FONT_SELECTION_DIALOG(font_selector)->cancel_button),
- "clicked",
- GTK_SIGNAL_FUNC(gtk_widget_destroy),
- (gpointer)font_selector);
-
- gtk_widget_show(GTK_WIDGET(font_selector));
-#endif
+ /* Not implemented */
}
@@ -3808,8 +3457,6 @@ static void change_wide_tile_mode_event_handler(
# endif /* USE_DOUBLE_TILES */
-# ifdef USE_TRANSPARENCY
-
/*
* Toggles the boolean value of use_transparency
*/
@@ -3825,8 +3472,6 @@ static void change_trans_mode_event_handler(
Term_key_push(KTRL('R'));
}
-# endif /* USE_TRANSPARENCY */
-
#endif /* USE_GRAPHICS */
@@ -4021,31 +3666,6 @@ static gboolean keypress_event_handler(
return (TRUE);
}
- /* Hack - the cursor keys */
- case GDK_Up:
- {
- Term_keypress('8');
- return (TRUE);
- }
-
- case GDK_Down:
- {
- Term_keypress('2');
- return (TRUE);
- }
-
- case GDK_Left:
- {
- Term_keypress('4');
- return (TRUE);
- }
-
- case GDK_Right:
- {
- Term_keypress('6');
- return (TRUE);
- }
-
case GDK_Shift_L:
case GDK_Shift_R:
case GDK_Control_L:
@@ -4578,10 +4198,8 @@ static GtkItemFactoryEntry main_menu_items[] =
NULL, 0, "<Separator>", NULL },
{ "/Options/Graphics/Smoothing", NULL,
change_smooth_mode_event_handler, 0, "<CheckItem>", NULL },
-# ifdef USE_TRANSPARENCY
{ "/Options/Graphics/Transparency", NULL,
change_trans_mode_event_handler, 0, "<CheckItem>", NULL },
-# endif /* USE_TRANSPARENCY */
#endif /* USE_GRAPHICS */
@@ -4728,7 +4346,7 @@ static GtkWidget *get_widget_from_path(cptr path)
/*
* Enable/disable a menu item
*/
-void enable_menu_item(cptr path, bool enabled)
+void enable_menu_item(cptr path, bool_ enabled)
{
GtkWidget *widget;
@@ -4750,7 +4368,7 @@ void enable_menu_item(cptr path, bool enabled)
/*
* Check/uncheck a menu item. The item should be of the GtkCheckMenuItem type
*/
-void check_menu_item(cptr path, bool checked)
+void check_menu_item(cptr path, bool_ checked)
{
GtkWidget *widget;
@@ -4782,9 +4400,9 @@ static void file_menu_update_handler(
gpointer user_data)
{
#ifndef SAVEFILE_SCREEN
- bool game_start_ok;
+ bool_ game_start_ok;
#endif /* !SAVEFILE_SCREEN */
- bool save_ok, quit_ok;
+ bool_ save_ok, quit_ok;
#ifndef SAVEFILE_SCREEN
@@ -4912,13 +4530,9 @@ static void graf_menu_update_handler(
"<Angband>/Options/Graphics/Smoothing",
smooth_rescaling);
-# ifdef USE_TRANSPARENCY
-
check_menu_item(
"<Angband>/Options/Graphics/Transparency",
use_transparency);
-
-# endif /* USE_TRANSPARENCY */
}
#endif /* USE_GRAPHICS */
@@ -5058,7 +4672,7 @@ static void init_gtk_window(term_data *td, int i)
GtkWidget *menu_bar = NULL, *box;
cptr font;
- bool main_window = (i == 0) ? TRUE : FALSE;
+ bool_ main_window = (i == 0) ? TRUE : FALSE;
/* Create window */
diff --git a/src/main-net.c b/src/main-net.c
deleted file mode 100644
index 339d6a73..00000000
--- a/src/main-net.c
+++ /dev/null
@@ -1,442 +0,0 @@
-/* File: main-gcu.c */
-
-/*
- * Copyright (c) 1997 Ben Harrison, and others
- *
- * This software may be copied and distributed for educational, research,
- * and not for profit purposes provided that this copyright and statement
- * are included in all such copies.
- */
-
-
-/*
- * This file helps Angband run on Unix/Curses machines.
- *
- *
- * To use this file, you must define "USE_NET" in the Makefile.
- *
- *
- * Note that this file is not "intended" to support non-Unix machines,
- * nor is it intended to support VMS or other bizarre setups.
- *
- * Also, this package assumes that the underlying "curses" handles both
- * the "nonl()" and "cbreak()" commands correctly, see the "OPTION" below.
- *
- * This code should work with most versions of "curses" or "ncurses",
- * and the "main-ncu.c" file (and USE_NCU define) are no longer used.
- *
- * See also "USE_CAP" and "main-cap.c" for code that bypasses "curses"
- * and uses the "termcap" information directly, or even bypasses the
- * "termcap" information and sends direct vt100 escape sequences.
- *
- * This file provides up to 4 term windows.
- *
- * This file will attempt to redefine the screen colors to conform to
- * standard Angband colors. It will only do so if the terminal type
- * indicates that it can do so. See the page:
- *
- * http://www.umr.edu/~keldon/ang-patch/ncurses_color.html
- *
- * for information on this.
- *
- * Consider the use of "savetty()" and "resetty()". XXX XXX XXX
- */
-
-
-#include "angband.h"
-
-
-#ifdef USE_NET
-
-/* The server connection */
-ip_connection net_serv_connection_forge;
-ip_connection *net_serv_connection = &net_serv_connection_forge;
-
-/* The client connection */
-ip_connection net_connection_forge;
-ip_connection *net_connection = &net_connection_forge;
-
-#define PACKET_STOP 255
-#define PACKET_TEXT 254
-#define PACKET_CLEAR 253
-
-/*
- * Information about a term
- */
-typedef struct term_data term_data;
-
-struct term_data
-{
- term t; /* All term info */
-};
-
-/* Max number of windows on screen */
-#define MAX_TERM_DATA 4
-
-/* Information about our windows */
-static term_data data[MAX_TERM_DATA];
-
-
-/*
- * Hack -- Number of initialized "term" structures
- */
-static int active = 0;
-
-
-
-
-/*
- * Suspend/Resume
- */
-static errr Term_xtra_net_alive(int v)
-{
- int x, y;
-
-
- /* Suspend */
- if (!v)
- {}
-
- /* Resume */
- else
- {}
-
- /* Success */
- return (0);
-}
-
-
-
-/*
- * Init the "net" system
- */
-static void Term_init_net(term *t)
-{
- term_data *td = (term_data *)(t->data);
-
- /* Count init's, handle first */
- if (active++ != 0) return;
-}
-
-
-/*
- * Nuke the "net" system
- */
-static void Term_nuke_net(term *t)
-{
- int x, y;
- term_data *td = (term_data *)(t->data);
-}
-
-
-
-
-/*
- * Process events (with optional wait)
- */
-static errr Term_xtra_net_event(int v)
-{
- int i, k;
-
- char buf[2];
-
- /* Wait */
- if (v)
- {
- /* Wait for one byte */
- i = zsock.read_simple(net_connection, buf, 1);
-#if 1
- /* Hack -- Handle bizarre "errors" */
- // if (!i) exit_game_panic();
- if (!i) return 1;
-#else
- /* Try again(must be a new connection) */
- while (!i)
- i = zsock.read_simple(net_connection, buf, 1);
-#endif
- }
-
- /* Do not wait */
- else
- {
- /* Read one byte, if possible */
- if (zsock.can_read(net_connection))
- zsock.read_simple(net_connection, buf, 1);
- }
-
- /* Ignore "invalid" keys */
- if (!buf[0]) return (1);
-
- /* Enqueue the keypress */
- Term_keypress(buf[0]);
-
- /* Success */
- return (0);
-}
-
-/*
- * React to changes
- */
-static errr Term_xtra_net_react(void)
-{
-
-#ifdef A_COLOR
-
- int i;
-
- /* Cannot handle color redefinition */
- if (!can_fix_color) return (0);
-
- /* Set the colors */
- for (i = 0; i < 16; i++)
- {
- /* Set one color (note scaling) */
- init_color(i,
- angband_color_table[i][1] * 1000 / 255,
- angband_color_table[i][2] * 1000 / 255,
- angband_color_table[i][3] * 1000 / 255);
- }
-
-#endif
-
- /* Success */
- return (0);
-}
-
-
-/*
- * Handle a "special request"
- */
-static errr Term_xtra_net(int n, int v)
-{
- term_data *td = (term_data *)(Term->data);
- char buf[2];
-
- /* Analyze the request */
- switch (n)
- {
- /* Clear screen */
- case TERM_XTRA_CLEAR:
- buf[0] = PACKET_CLEAR;
- buf[1] = '\0';
- zsock.write_simple(net_connection, buf);
- return (0);
-
- /* Make a noise */
- case TERM_XTRA_NOISE:
- return (0);
-
- /* Flush the Curses buffer */
- case TERM_XTRA_FRESH:
- return (0);
-
- /* Suspend/Resume curses */
- case TERM_XTRA_ALIVE:
- return (Term_xtra_net_alive(v));
-
- /* Process events */
- case TERM_XTRA_EVENT:
- return (Term_xtra_net_event(v));
-
- /* Flush events */
- case TERM_XTRA_FLUSH:
- while (!Term_xtra_net_event(FALSE));
- return (0);
-
- /* Delay */
- case TERM_XTRA_DELAY:
- usleep(1000 * v);
- return (0);
-
- /* Get Delay of some milliseconds */
- case TERM_XTRA_GET_DELAY:
- {
- int ret;
- struct timeval tv;
-
- ret = gettimeofday(&tv, NULL);
- Term_xtra_long = (tv.tv_sec * 1000) + (tv.tv_usec / 1000);
-
- return ret;
- }
-
- /* React to events */
- case TERM_XTRA_REACT:
- Term_xtra_net_react();
- return (0);
- }
-
- /* Unknown */
- return (1);
-}
-
-
-/*
- * Actually MOVE the hardware cursor
- */
-static errr Term_curs_net(int x, int y)
-{
- term_data *td = (term_data *)(Term->data);
-
- /* Literally move the cursor */
- // DGDGDGD
-
- /* Success */
- return (0);
-}
-
-
-/*
- * Erase a grid of space
- * Hack -- try to be "semi-efficient".
- */
-static errr Term_wipe_net(int x, int y, int n)
-{
- char buf[2];
-
- term_data *td = (term_data *)(Term->data);
-
- buf[0] = PACKET_CLEAR;
- buf[1] = '\0';
- zsock.write_simple(net_connection, buf);
-
- /* Success */
- return (0);
-}
-
-/*
- * Place some text on the screen using an attribute
- */
-static errr Term_text_net(int x, int y, int n, byte a, cptr s)
-{
- term_data *td = (term_data *)(Term->data);
- char buf[5];
-
- buf[0] = PACKET_TEXT;
- buf[1] = y + 1;
- buf[2] = x + 1;
- buf[3] = a + 1;
- buf[4] = '\0';
-
- zsock.write_simple(net_connection, buf);
- zsock.write_simple(net_connection, s);
-
- buf[0] = PACKET_STOP;
- buf[1] = '\0';
- zsock.write_simple(net_connection, buf);
-
- /* Success */
- return (0);
-}
-
-
-/*
- * Create a window for the given "term_data" argument.
- *
- * Assumes legal arguments.
- */
-static errr term_data_init_net(term_data *td, int rows, int cols)
-{
- term *t = &td->t;
-
- /* Initialize the term */
- term_init(t, cols, rows, 256);
-
- /* Erase with "white space" */
- t->attr_blank = TERM_WHITE;
- t->char_blank = ' ';
-
- /* Set some hooks */
- t->init_hook = Term_init_net;
- t->nuke_hook = Term_nuke_net;
-
- /* Set some more hooks */
- t->text_hook = Term_text_net;
- t->wipe_hook = Term_wipe_net;
- t->curs_hook = Term_curs_net;
- t->xtra_hook = Term_xtra_net;
-
- /* Save the data */
- t->data = td;
-
- /* Activate it */
- Term_activate(t);
-
- /* Success */
- return (0);
-}
-
-
-static void hook_quit(cptr str)
-{
- /* Unused */
- (void)str;
-}
-
-static void net_lost_connection_hook(ip_connection *conn)
-{
- printf("Lost connection ! ARGGGG\nAccepting a new one...\n");
- zsock.accept(net_serv_connection, net_connection);
- zsock.set_lose_connection(net_connection, net_lost_connection_hook);
- printf("...accepted\n");
-}
-
-/*
- * Prepare "curses" for use by the file "z-term.c"
- *
- * Installs the "hook" functions defined above, and then activates
- * the main screen "term", which clears the screen and such things.
- *
- * Someone should really check the semantics of "initscr()"
- */
-errr init_net(int argc, char **argv)
-{
- int i;
-
- int num_term = MAX_TERM_DATA, next_win = 0;
- int port = 6666;
-
- /* Parse args */
- for (i = 1; i < argc; i++)
- {
- if (prefix(argv[i], "-P"))
- {
- port = atoi(argv[i + 1]);
- i++;
- continue;
- }
-
- plog_fmt("Ignoring option: %s", argv[i]);
- }
-
- /* Activate hooks */
- quit_aux = hook_quit;
- core_aux = hook_quit;
-
- /* Create a term */
- term_data_init_net(&data[0], 25, 80);
-
- /* Remember the term */
- angband_term[0] = &data[0].t;
-
- /* Activate the "Angband" window screen */
- Term_activate(&data[0].t);
-
- /* Remember the active screen */
- term_screen = &data[0].t;
-
- /* Initialize the server and wait for thhe client */
- zsock.setup(net_serv_connection, "127.0.0.1", port, ZSOCK_TYPE_TCP, TRUE);
- zsock.open(net_serv_connection);
-
- printf("Accepting...\n");
- zsock.accept(net_serv_connection, net_connection);
- zsock.set_lose_connection(net_connection, net_lost_connection_hook);
- printf("...accepted\n");
-
- /* Success */
- return (0);
-}
-
-
-#endif /* USE_NET */
diff --git a/src/main-sdl-iso.c b/src/main-sdl-iso.c
deleted file mode 100644
index 1461b376..00000000
--- a/src/main-sdl-iso.c
+++ /dev/null
@@ -1,1955 +0,0 @@
-/* Copyright (C) 2003-2004 Neil Stevens <neil@hakubi.us>
- // Copyright (C) 2004 Ethan Stump <estump@seas.upenn.edu>
- //
- // Permission is hereby granted, free of charge, to any person obtaining a copy
- // of this software and associated documentation files (the "Software"), to deal
- // in the Software without restriction, including without limitation the rights
- // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- // copies of the Software, and to permit persons to whom the Software is
- // furnished to do so, subject to the following conditions:
- //
- // The above copyright notice and this permission notice shall be included in
- // all copies or substantial portions of the Software.
- //
- // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- // THE AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
- // AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- // CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- //
- // Except as contained in this notice, the name(s) of the author(s) shall not be
- // used in advertising or otherwise to promote the sale, use or other dealings
- // in this Software without prior written authorization from the author(s).
- */
-
-#ifdef USE_SDL
-
-#include "angband.h"
-#include <SDL.h>
-#include <SDL_image.h>
-#include <SDL_ttf.h>
-
-#include <math.h>
-
-#ifdef USE_ISO
-/*
- * Simugraph system (Hj. Malthaner)
- */
-#include "iso/simsys.h"
-#include "iso/simgraph.h"
-#include "iso/world_adaptor.h"
-#include "iso/world_view.h"
-/*
- * Simugraph specific routines
- * by Hj. Malthaner
- */
-#include "iso/hackdef.h"
-
-/*
- * Text place marker function protype (Hj. Malthaner)
- */
-static void set_spots(int x, int y, int n, bool v);
-
-/**
- * we need to track spots with text to avoid overdrawing text with images
- * @author Hj. Malthaner (hansjoerg.malthaner@gmx.de)
- */
-bool spots[80][24];
-
-/**
- * mouse coordinates for Simugraph engine
- * @author Hj. Malthaner (hansjoerg.malthaner@gmx.de)
- */
-int mx, my;
-
-/*
- * Hajo: this flags need to be set when opening windows
- */
-
-static int tex_width;
-static int tex_height;
-static int tex_xoff;
-static int tex_yoff;
-
-static unsigned int tab16[1 << 16];
-
-/**
- * this is used if we need to fake an 8 bit array
- * @author Hj. Malthaner
- */
-static unsigned short * data8;
-
-// buffers to store char code/attr for graphics
-unsigned char **iso_ap;
-unsigned char **iso_cp;
-unsigned char **iso_atp;
-unsigned char **iso_ctp;
-unsigned char **iso_aep;
-unsigned char **iso_cep;
-
-#endif /* USE_ISO */
-
-
-/*************************************************
- GLOBAL SDL-ToME PROPERTIES
- *************************************************/
-
-/* Default window properties - used if none are available
-from other places*/
-#define DEF_SCREEN_WIDTH 800
-#define DEF_SCREEN_HEIGHT 600
-#define DEF_SCREEN_BPP 16
-
-/*Main window properties that may be loaded at runtime from
-a preference file or environmental variables. However,
-default values (defined above) can be used. */
-static int arg_width = DEF_SCREEN_WIDTH;
-static int arg_height = DEF_SCREEN_HEIGHT;
-static int arg_bpp = DEF_SCREEN_BPP;
-
-/**************/
-
-/* Default font properties - used unless otherwise changed.
-These properties are the size and also default font to load. */
-#define DEF_FONT_SIZE 16
-#define DEF_FONT_FILE "lib/xtra/font/VeraMono.ttf"
-
-/* The font properties that may perhaps be changed at runtime,
-due to environmental variables, preference files, or in-program
-commands.*/
-static int arg_font_size = DEF_FONT_SIZE;
-static char arg_font_name[64] = DEF_FONT_FILE;
-
-/**************/
-
-/* The number of term_data structures to set aside mem for */
-#define MAX_CONSOLE_COUNT 8
-
-/* The number of consoles that are actually being used.
-This number could be changed via preference files, environmental
-variables, command-line arguments, or possibly even in-game
-keypresses or menu-selections. */
-static int arg_console_count = 1;
-
-/* When rendering multiple terminals, each is drawn with a
-surrounding border. These values control the width of this
-border and also the color to use when drawing it. */
-#define BORDER_THICKNESS 1
-static int border_color = 0;
-
-/**************/
-
-/* some miscellaneous settings which have not been dealt
-with yet */
-static bool arg_old_graphics = FALSE;
-static bool arg_double_width = FALSE;
-
-/* not dealt with yet (although full screen toggle
-is available using Alt-Enter) */
-static bool arg_full_screen = FALSE;
-
-
-/*************************************************
- GLOBAL SDL-ToME VARIABLES
- *************************************************/
-
-/* the main screen to draw to */
-static SDL_Surface *screen;
-
-/* some helper surfaces that are used for rendering
-characters */
-static SDL_Surface *worksurf;
-static SDL_Surface *crayon;
-
-/* the array of pre-rendered characters
-(see loadAndRenderFont() below) */
-SDL_Surface *text[128];
-
-/* the actual TTF_Font used (XXX should get rid of this)*/
-TTF_Font *font=0;
-
-/* the width and height of the uniformly-sized pre-rendered
-characters */
-int t_width = 1, t_height = 1;
-
-
-/*************************************************
- COLOR SETUP
- *************************************************/
-int screen_black;
-int screen_white;
-
-static int color_data[16];
-/* The following macro is for color defining...
- Note that the color is fully opaque... */
-#define COLOR(r,g,b) \
- SDL_MapRGBA(crayon->format,r,g,b,SDL_ALPHA_OPAQUE)
-
-/*These color macros will setup the colors to use, but must be called after
- the SDL video has been set. That way SDL can correct for any funky video
- setttings. */
-
-#define BLACK COLOR(0x00,0x00,0x00)
-#define WHITE COLOR(0xff,0xff,0xff)
-#define MID_GREY COLOR(0x80,0x80,0x80)
-#define BRIGHT_ORANGE COLOR(0xff,0x80,0x00)
-#define RED COLOR(0xc0,0x00,0x00)
-#define GREEN COLOR(0x00,0x80,0x40)
-#define BRIGHT_BLUE COLOR(0x00,0x00,0xff)
-#define DARK_ORANGE COLOR(0x80,0x40,0x00)
-#define DARK_GREY COLOR(0x40,0x40,0x40)
-#define BRIGHT_GREY COLOR(0xc0,0xc0,0xc0)
-#define PURPLE COLOR(0xff,0x00,0xff)
-#define YELLOW COLOR(0xff,0xff,0x00)
-#define BRIGHT_RED COLOR(0xff,0x00,0x00)
-#define BRIGHT_GREEN COLOR(0x00,0xff,0x00)
-#define AQUAMARINE COLOR(0x00,0xff,0xff)
-#define BROWN COLOR(0xc0,0x80,0x40)
-
-/*************************************************
- TERMINAL DATA STRUCTURE SETUP
- *************************************************/
-
-/* Forward declare */
-typedef struct _term_data term_data;
-
-/* A structure for each "term" */
-struct _term_data
-{
- term t; /* the term structure, defined in z-term.h */
- cptr name; /* name of this term sub-window */
-
- uint rows, cols; /* row/column count */
- uint pos_x, pos_y; /* upper left corner of rendering box */
- uint size_w, size_h; /* width, height of rendering box */
-
- bool has_border; /* whether this sub-window has a border or not */
- uint border_thick; /* thickness of border to draw around window */
-#ifdef USE_GRAPHICS
-#ifdef USE_TRANSPARENCY
-#endif
-#endif
-};
-
-/* The array of term data structures */
-static term_data data[MAX_CONSOLE_COUNT];
-
-/*************************************************
- FILE-SPECIFIC MACROS
- *************************************************/
-
-/* Debug macros! */
-#define DB(str) \
- printf("main-sdl: %s\n",str);
-
-/*************************************************
- COLOR SETUP
- *************************************************/
-
-/* SDL Quitting function... declare a few functions first.*/
-void killFontAndAlphabet(void);
-static void sdl_quit(cptr string)
-{
- printf("sdl_quit called.\n");
- printf("message: %s\n",string);
- /* Need to take care of font and rendered characters */
- killFontAndAlphabet();
- if (TTF_WasInit())
- TTF_Quit();
- /* Then exit SDL */
- SDL_Quit();
- /* And now for the default quit behavior */
- quit_aux = 0;
- quit(string);
-}
-
-/*************************************************
- FONT SUPPORT FUNCTIONS
- *************************************************/
-
-/* killFontAndAlphabet will effectively de-initialize the font system;
-it does this by closing the font and destroying any pre-rendered
-text in memory */
-void killFontAndAlphabet(void)
-{
- int i;
- /* need to close a font and free all of its corresponding pre-rendered
- surfaces */
- if (font)
- {
- TTF_CloseFont(font);
- font = 0;
- }
- for (i=0;i<128;i++)
- {
- if(text[i])
- {
- SDL_FreeSurface(text[i]);
- text[i] = NULL;
- }
- }
-}
-
-/* loadAndRenderFont is responsible for loading and initializing
-a font. First, SDL_ttf calls are made to load and set the style
-for the desired font. Next, a character alphabet is rendered and
-each character is placed onto a uniformly-sized surface within
-the text[] array. Whenever text is needed for displaying on-screen,
-this array is referenced and the desired character picture is used. */
-void loadAndRenderFont(char *fname, int size)
-{
- int minx,maxx,miny,maxy,advance,i,midline = 0;
- SDL_Color base_color = {255,255,255,255};
- SDL_Surface *temp_surf;
- SDL_Rect tgt = {0,0,0,0};
-
- /* Assuming that the filename is valid,
- open the font (pointer is global var)*/
- if (fname == NULL)
- sdl_quit("Gimme a font to load!");
- font = TTF_OpenFont(fname,size);
- if (font == NULL)
- sdl_quit("Error loading that font!");
- /* Set the font style to normal */
- TTF_SetFontStyle(font,TTF_STYLE_NORMAL);
-
- /* Collect some measurements on this font -
- arbitrarily choose the letter 'a' to get width*/
- TTF_GlyphMetrics(font,'a',&minx,&maxx,&miny,&maxy,&advance);
- /* the width of each character tile */
- t_width = advance;
- /* the height of each character tile */
- t_height = TTF_FontHeight(font);
- /* position of the y=0 line in each tile */
- midline = TTF_FontAscent(font);
-
- /* now... render each of the individual characters */
- for (i=0;i<128;i++)
- {
- /* make a pretty blended glyph */
- temp_surf=TTF_RenderGlyph_Blended(font,i,base_color);
- /* and make sure that we got it right! */
- if (temp_surf == NULL)
- sdl_quit("Glyph failed to render!");
- /* get the metrics of this particular glyph so we can position it */
- TTF_GlyphMetrics(font,i,&minx,&maxx,&miny,&maxy,&advance);
- /* copy rendered glyph into text queue, at the right position*/
- tgt.x = minx;
- tgt.y = midline-maxy;
- /* but first... we'll need a surface in the text queue to blit to! */
- text[i] = SDL_CreateRGBSurface(SDL_HWSURFACE,t_width,\
- t_height,16,0xf000,0x0f00,0x00f0,0x000f);
- /* turn OFF src-alpha... results in brute
- copy of the RGBA contents of surf */
- SDL_SetAlpha(temp_surf,0,0);
- SDL_BlitSurface(temp_surf,NULL,text[i],&tgt);
- /* turn OFF src-alpha since we'll be using worksurf for blitting */
- SDL_SetAlpha(text[i],0,0);
- /* kill the surface to patch up memory leaks */
- SDL_FreeSurface(temp_surf);
- }
-}
-
-/***********************************************/
-
-#ifdef USE_ISO
-/*************************************************
- ISO SUPPORT FUNCTIONS
- *************************************************/
-/**
- * inits operating system stuff
- * @author Hj. Malthaner (hansjoerg.malthaner@gmx.de)
- */
-int dr_os_init(int n, int *parameter)
-{
- // Hajo:
- // unused in isov-x11
- return TRUE;
-}
-
-
-/**
- * opens graphics device/context/window of size w*h
- * @param w width
- * @param h height
- * @author Hj. Malthaner (hansjoerg.malthaner@gmx.de)
- */
-int dr_os_open(int w, int h)
-{
- const int left = 13;
-
-/* tex_width = (data[0].fd->dw * (data[0].t.wid - left + 2) + 3) & 0xFFFC;
- tex_height = data[0].fd->dh * (data[0].t.hgt - 2);
-
- tex_xoff = data[0].fd->dw * left;
- tex_yoff = data[0].fd->dh * 1 + 1;
-*/
-
- //tex_width = (data[0].size_w - (left - 2) * (data[0].size_w / data[0].cols) + 3) & 0xFFFC;
- // this is too big (but works :-))
- tex_width = data[0].size_w & 0xfffc;
- tex_height = (data[0].size_h / data[0].rows) * (data[0].rows-2);
-
- tex_xoff = (tex_width / data[0].cols) * left;
- tex_yoff = (tex_height / data[0].rows) * 1 + 1;
-
- return TRUE;
-}
-
-
-/**
- * closes operating system stuff
- * @author Hj. Malthaner (hansjoerg.malthaner@gmx.de)
- */
-int dr_os_close()
-{
- // Hajo:
- // unused in isov-x11
- return TRUE;
-}
-
-
-/**
- * retrieve display width
- * @author Hj. Malthaner (hansjoerg.malthaner@gmx.de)
- */
-int dr_get_width()
-{
- return data[0].size_w;
-}
-
-
-/**
- * retrieve display height
- * @author Hj. Malthaner (hansjoerg.malthaner@gmx.de)
- */
-int dr_get_height()
-{
- return data[0].size_h;
-}
-
-
-/**
- * this is used if we need to fake an 8 bit array
- * @author Hj. Malthaner
- */
-static unsigned short * data8;
-
-
-/**
- * creates a (maybe virtual) array of graphics data
- * @author Hj. Malthaner
- */
-unsigned short * dr_textur_init()
-{
- int i;
-
- printf("isov-sdl::dr_textur_init()\n");
- printf(" width = %d\n", data[0].size_w);
- printf(" height = %d\n", data[0].size_h);
-
- for (i = 0; i < (1 << 16); i++)
- {
- // FIXME!!!
- // must consider color bits, or breaks in anything else but RGB 555
- unsigned int R;
- unsigned int G;
- unsigned int B;
-
- // RGB 555
- R = (i & 0x7C00) >> 10;
- G = (i & 0x03E0) >> 5;
- B = (i & 0x001F) >> 0;
-
-
- tab16[i] = SDL_MapRGB(screen->format, R << 3, G << 3, B << 3);
- }
-
-
-
- data8 = malloc((data[0].size_w) * (data[0].size_h) * 2);
-
- printf(" textur = %p\n", data8);
-
- // fake an 16 bit array and convert data before displaying
- return data8;
-}
-
-static void flush_area(int dest_x, int dest_y,
- int x, int y, int w, int h)
-{
- SDL_Surface *face = screen;
-
- if (SDL_LockSurface(face) == 0)
- {
- int i, j;
- const int bpp = screen->format->BytesPerPixel;
-
- for (j = 0; j < h; j++)
- {
- unsigned short * p = data8 + (y + j) * tex_width + x;
- unsigned char * row = face->pixels + (dest_y + j) * face->pitch + dest_x * bpp;
-
-
- for (i = 0; i < w; i++)
- {
- *((unsigned short*)row) = tab16[ *p++ ];
- row += bpp;
- }
- }
- SDL_UnlockSurface(face);
- }
-}
-
-/**
- * displays the array of graphics data
- * @author Hj. Malthaner
- */
-void dr_textur(int xp, int yp, int w, int h)
-{
- int y;
-
- // clipping unten
- if (yp + h > tex_height)
- {
- h = tex_height - yp;
- }
-
- /* debug spots
- for(y=0; y<24; y++) {
- int x;
-
- for(x=0; x<80; x++) {
- if(spots[x][y]) {
- printf("X");
- } else {
- printf(".");
- }
-}
- printf("\n");
-}
- */
-
- for (y = 0; y < SCREEN_HGT; y++)
- {
- const int left = 13;
- const int y1 = y + 1;
- int x = 0;
-
- yp = data[0].size_h / data[0].rows * y;
-
- spots[79][y1] = FALSE;
-
- do
- {
- int n = 0;
- while (x + n + left < 80 && !spots[x + n + left][y1])
- {
- n++;
- }
-
- xp = data[0].size_w / data[0].cols * x;
-
-
- flush_area(tex_xoff + xp, tex_yoff + yp,
- xp, yp,
- data[0].size_w / data[0].cols*(n),
- data[0].size_h / data[0].rows);
-
- x += n;
-
- while (x + left < 80 && spots[x + left][y1])
- {
- x++;
- }
- }
- while (x + left < 80);
- }
-}
-
-
-/**
- * use this method to flush graphics pipeline (undrawn stuff) onscreen.
- * @author Hj. Malthaner
- */
-void dr_flush()
-{
- // Iso-view for angband needs no sync.
- // XSync(md,FALSE);
-}
-
-
-/**
- * set colormap entries
- * @author Hj. Malthaner
- */
-void dr_setRGB8multi(int first, int count, unsigned char * data)
-{
- // Hajo:
- // unused in isov-x11
-}
-
-
-/**
- * display/hide mouse pointer
- * @author Hj. Malthaner (hansjoerg.malthaner@gmx.de)
- */
-void show_pointer(int yesno)
-{
- // Hajo:
- // unused in isov-x11
-}
-
-
-/**
- * move mouse pointer
- * @author Hj. Malthaner (hansjoerg.malthaner@gmx.de)
- */
-void move_pointer(int x, int y)
-{
- // Hajo:
- // unused in isov-x11
-}
-
-
-/**
- * update softpointer position
- * @author Hj. Malthaner (hansjoerg.malthaner@gmx.de)
- */
-void ex_ord_update_mx_my()
-{
- // Hajo:
- // unused in isov-x11
-}
-
-
-/**
- * get events from the system
- * @author Hj. Malthaner (hansjoerg.malthaner@gmx.de)
- */
-void GetEvents()
-{
- // Hajo:
- // unused in isov-x11
-}
-
-
-/**
- * get events from the system without waiting
- * @author Hj. Malthaner (hansjoerg.malthaner@gmx.de)
- */
-void GetEventsNoWait()
-{
- // Hajo:
- // unused in isov-x11
-}
-
-
-/**
- * @returns time since progrma start in milliseconds
- * @author Hj. Malthaner
- */
-long long dr_time(void)
-{
- // Hajo:
- // unused in isov-x11
- return 0;
-}
-
-
-/**
- * sleeps some microseconds
- * @author Hj. Malthaner
- */
-void dr_sleep(unsigned long usec)
-{
- // Hajo:
- // unused in isov-x11
-}
-
-
-/**
- * loads a sample
- * @return a handle for that sample or -1 on failure
- * @author Hj. Malthaner
- */
-int dr_load_sample(const char *filename)
-{
- // Hajo:
- // unused in isov-x11
- return TRUE;
-}
-
-
-/**
- * plays a sample
- * @param key the key for the sample to be played
- * @author Hj. Malthaner
- */
-void dr_play_sample(int key, int volume)
-{
- // Hajo:
- // unused in isov-x11
-}
-
-static unsigned char ** halloc(int w, int h)
-{
- unsigned char **field = (unsigned char **)malloc(sizeof(unsigned char *) * h);
- int i;
-
- for (i = 0; i < h; i++)
- {
- field[i] = (unsigned char *)malloc(sizeof(unsigned char) * w);
- memset(field[i], 32 , w);
- }
-
- return field;
-}
-
-/**
- * spot array access procedure. Mark text output spots
- * @author Hj. Malthaner (hansjoerg.malthaner@gmx.de)
- */
-static void set_spots(const int x, const int y, const int n, const bool v)
-{
- int i;
-
- for (i = x; i < x + n; i++)
- {
- spots[i][y] = v;
- }
-}
-
-
-/***********************************************/
-#endif /* USE_ISO */
-
-
-/*** Function hooks needed by "Term" ***/
-
-static void Term_init_sdl(term *t)
-{
- term_data *td = (term_data*)(t->data);
- DB("Term_init_sdl");
- /* XXX XXX XXX */
-}
-
-static void Term_nuke_sdl(term *t)
-{
- term_data *td = (term_data*)(t->data);
- DB("Term_nuke_sdl");
- /* XXX XXX XXX */
-}
-
-static errr Term_user_sdl(int n)
-{
- term_data *td = (term_data*)(Term->data);
- DB("Term_user_sdl");
- /* XXX XXX XXX */
-
- /* Unknown */
- return (1);
-}
-
-/* KEYPRESS_STRING repeatedly sends characters to the terminal
-XXX - should implement routine from maim-sdl.c, it's sooo much
-cleaner */
-#define KEYPRESS_STRING(str) \
-strcpy(buf,str); \
-n = buf; \
-while (*n != '\0') { \
- Term_keypress((int)(*(n++))); \
-}
-
-/* This is the main event handling routine that will be called
-whenever an event is pulled off of the queue (in Term_xtra_sdl())*/
-void handleEvent(SDL_Event *event)
-{
- static char buf[24]; /* a buffer used when passing key names */
- char *n; /* and a pointer to manipulate this buffer */
-
- switch( event->type )
- {
- case SDL_KEYDOWN:
- {
- /* handle key presses */
-
- /* I'm reading that as long as the upper 9 bits of the unicode
- * value are zero, then the lower 7 bits are direct ASCII characters.
- * Furthermore, it seems that all basic keys return non-zero values
- * for the lower 7 bits, but function keys and other various things
- * return 0000000 for the lower 7 bits.
- * Basically, if the lower 7 bits are zero, do something special
- * (like start a macro), but otherwise just pass along the ASCII
- * code!
- */
- byte ascii_part = event->key.keysym.unicode & 0x00ff;
-
- /* gimme the key name */
- printf("Key is: %s\n",SDL_GetKeyName(event->key.keysym.sym));
-
- /* allow for full screen toggling! */
- if ((event->key.keysym.sym == SDLK_RETURN) && \
- (SDL_GetModState() & KMOD_ALT))
- {
- SDL_WM_ToggleFullScreen(screen);
- }
-#ifdef USE_ISO
- /* toggle tile size */
- if (event->key.keysym.sym == SDLK_SCROLLOCK)
- {
- switch (display_get_tile_size())
- {
- case 32:
- display_select_tile_size(0);
- break;
- case 64:
- display_select_tile_size(1);
- break;
- default:
- display_select_tile_size(0);
- break;
- }
- reset_visuals();
- strcpy(buf, "graf-iso.prf");
- process_pref_file(buf);
- refresh_display();
- SDL_UpdateRect(screen, 0, 0, data[0].size_w, data[0].size_h);
- }
-
- /* cycle grid type none/objects+monsters only/full */
- if ((event->key.keysym.sym == '#') && \
- (SDL_GetModState() & KMOD_ALT))
- {
- set_grid(get_grid()+1);
- refresh_display();
- }
-
-#endif
-
- /*printf("ascii_part: %d\n",ascii_part);*/
- if (ascii_part)
- {
- /* We have now determined that the ASCII part is not '0', so
- we can safely pass along the ASCII value! */
- Term_keypress(ascii_part);
- }
- else
- {
- /* We want to ignore keypresses that are simply the modifier
- keys*/
- if (!( (event->key.keysym.sym == SDLK_RSHIFT) |
- (event->key.keysym.sym == SDLK_LSHIFT) |
- (event->key.keysym.sym == SDLK_RALT) |
- (event->key.keysym.sym == SDLK_LALT) |
- (event->key.keysym.sym == SDLK_RCTRL) |
- (event->key.keysym.sym == SDLK_LCTRL) ))
- {
-
- /* now build a macro string using the modifiers together
- with the key that was just pressed*/
-
- /* As for the formatting...
- * We pass the key press and modifiers as follows:
- * \[ctrl-alt-shift-"key name"]
- * following the previously established convention...
- *
- * All of the things that happen are defined in pref-sdl.prf
- */
-
- KEYPRESS_STRING("\["); /*Output the first part... */
- /* See if a control key is down */
- if (event->key.keysym.mod & KMOD_CTRL)
- {
- KEYPRESS_STRING("ctrl-");
- }
- /* See if an alt key is down */
- if (event->key.keysym.mod & KMOD_ALT)
- {
- KEYPRESS_STRING("alt-");
- }
- /* See if a shift key is down */
- if (event->key.keysym.mod & KMOD_SHIFT)
- {
- KEYPRESS_STRING("shift-");
- }
-
- /* Add in the name of whatever key was pressed */
- KEYPRESS_STRING(SDL_GetKeyName(event->key.keysym.sym));
-
- /* and end it... */
- KEYPRESS_STRING("]");
- }
- }
- break;
- }
- case SDL_QUIT:
- {
- /* handle quit requests */
- sdl_quit("Quitting!\n");
- break;
- }
- default:
- {
- break;
- }
- }
-}
-
-static errr Term_xtra_sdl(int n, int v)
-{
- static SDL_Event event;
- term_data *td;
- char buf[1024];
-
- /* Analyze */
- switch (n)
- {
- case TERM_XTRA_EVENT:
- {
- if (v)
- {
- /* Perform event checking with blocking */
- SDL_WaitEvent( &event );
- handleEvent( &event );
- } else {
- /* Perform event checking without blocking */
- if (SDL_PollEvent(&event)){
- /* We found an event! */
- handleEvent(&event);
- }
- }
- return(0);
- }
-
- case TERM_XTRA_FLUSH:
- {
- /* Keep doing events until the queue is empty! */
- while (SDL_PollEvent(&event))
- {
- handleEvent(&event);
- }
- return (0);
- }
-
- case TERM_XTRA_CLEAR:
- {
- /* Perform a full screen clear; redraw the sub-window borders.*/
- static SDL_Rect base;
- base.x = 0;
- base.y = 0;
- base.w = arg_width;
- base.h = arg_height;
-
- td = (term_data*)(Term->data);
-
- /* Lock the screen */
- if (SDL_MUSTLOCK(screen) ){
- if (SDL_LockSurface(screen) < 0) {
- printf("Can't lock the screen: %s\n", SDL_GetError());
- exit(1);
- }
- }
-
- /* blank the screen area */
- SDL_FillRect(screen, &base, screen_black);
-
- /* Unlock the screen */
- if (SDL_MUSTLOCK(screen) ){
- SDL_UnlockSurface(screen);
- }
-
- /* And... UPDATE the whole screen */
- SDL_Flip(screen);
-
- return (0);
- }
-
- case TERM_XTRA_SHAPE:
- {
- /*
- * Set the cursor visibility XXX XXX XXX
- *
- * This action should change the visibility of the cursor,
- * if possible, to the requested value (0=off, 1=on)
- *
- * This action is optional, but can improve both the
- * efficiency (and attractiveness) of the program.
- */
-
- return (0);
- }
-
- case TERM_XTRA_FROSH:
- {
- /*
- * Flush a row of output XXX XXX XXX
- *
- * This action should make sure that row "v" of the "output"
- * to the window will actually appear on the window.
- *
- * This action is optional, assuming that "Term_text_xxx()"
- * (and similar functions) draw directly to the screen, or
- * that the "TERM_XTRA_FRESH" entry below takes care of any
- * necessary flushing issues.
- */
-
- return (1);
- }
-
- case TERM_XTRA_FRESH:
- {
- /*
- * Flush output XXX XXX XXX
- *
- * This action should make sure that all "output" to the
- * window will actually appear on the window.
- *
- * This action is optional, assuming that "Term_text_xxx()"
- * (and similar functions) draw directly to the screen, or
- * that the "TERM_XTRA_FROSH" entry above takes care of any
- * necessary flushing issues.
- */
-#ifdef USE_ISO
- // Hajo:
- // refresh the graphical view
-
- refresh_display();
- SDL_UpdateRect(screen, 0, 0, data[0].size_w, data[0].size_h);
-// SDL_UpdateRect(td->face, 0, 0, 80*td->w, 24*td->h);
-#endif /* USE_ISO */
- return (1);
- }
-
- case TERM_XTRA_NOISE:
- {
- /*
- * Make a noise XXX XXX XXX
- *
- * This action should produce a "beep" noise.
- *
- * This action is optional, but convenient.
- */
-
- return (1);
- }
-
- case TERM_XTRA_SOUND:
- {
- /*
- * Make a sound XXX XXX XXX
- *
- * This action should produce sound number "v", where the
- * "name" of that sound is "sound_names[v]". This method
- * is still under construction.
- *
- * This action is optional, and not very important.
- */
-
- return (1);
- }
-
- case TERM_XTRA_BORED:
- {
- /* Perform event checking without blocking */
- if (SDL_PollEvent(&event)){
- /* We found an event! */
- handleEvent(&event);
- }
- return(0);
- }
-
- case TERM_XTRA_REACT:
- {
- /*
- * React to global changes XXX XXX XXX
- *
- * For example, this action can be used to react to
- * changes in the global "color_table[256][4]" array.
- *
- * This action is optional, but can be very useful for
- * handling "color changes" and the "arg_sound" and/or
- * "arg_graphics" options.
- */
-#ifdef USE_ISO
- strcpy(buf, "graf-iso.prf");
- process_pref_file(buf);
-#endif /* USE_ISO */
- return (1);
- }
-
- case TERM_XTRA_ALIVE:
- {
- /*
- * Change the "hard" level XXX XXX XXX
- *
- * This action is used if the program changes "aliveness"
- * by being either "suspended" (v=0) or "resumed" (v=1)
- * This action is optional, unless the computer uses the
- * same "physical screen" for multiple programs, in which
- * case this action should clean up to let other programs
- * use the screen, or resume from such a cleaned up state.
- *
- * This action is currently only used by "main-gcu.c",
- * on UNIX machines, to allow proper "suspending".
- */
-
- return (1);
- }
-
- case TERM_XTRA_LEVEL:
- {
- /*
- * Change the "soft" level XXX XXX XXX
- *
- * This action is used when the term window changes "activation"
- * either by becoming "inactive" (v=0) or "active" (v=1)
- *
- * This action can be used to do things like activate the proper
- * font / drawing mode for the newly active term window. This
- * action should NOT change which window has the "focus", which
- * window is "raised", or anything like that.
- *
- * This action is optional if all the other things which depend
- * on what term is active handle activation themself, or if only
- * one "term_data" structure is supported by this file.
- */
-
- return (1);
- }
-
- case TERM_XTRA_DELAY:
- {
- /*
- * Delay for some milliseconds XXX XXX XXX
- *
- * This action is useful for proper "timing" of certain
- * visual effects, such as breath attacks.
- *
- * This action is optional, but may be required by this file,
- * especially if special "macro sequences" must be supported.
- */
-
- /* I think that this command is system independent... */
- /*sleep(v/1000);*/
- /* main-x11 uses usleep(1000*v); */
- /* main-win uses Sleep(v); */
- return (1);
- }
-
- case TERM_XTRA_GET_DELAY:
- {
- /*
- * Get Delay of some milliseconds XXX XXX XXX
- * place the result in Term_xtra_long
- *
- * This action is useful for proper "timing" of certain
- * visual effects, such as recording cmovies.
- *
- * This action is optional, but cmovies wont perform
- * good without it
- */
-
- return (1);
- }
- }
-
- /* Unknown or Unhandled action */
- return (1);
-}
-
-#define TYPECOLOR(i) printf(" R:%d\tG:%d\tB:%d\tA:%d\t\n",\
- color_data[i]>>24,(color_data[i]&0x00ff0000)>>16,\
- (color_data[i]&0x0000ff00)>>8,(color_data[i]&0x000000ff));
-/*
- * Display the cursor
- *
- * This routine should display the cursor at the given location
- * (x,y) in some manner. On some machines this involves actually
- * moving the physical cursor, on others it involves drawing a fake
- * cursor in some form of graphics mode. Note the "soft_cursor"
- * flag which tells "z-term.c" to treat the "cursor" as a "visual"
- * thing and not as a "hardware" cursor.
- *
- * You may assume "valid" input if the window is properly sized.
- *
- * You may use the "Term_grab(x, y, &a, &c)" function, if needed,
- * to determine what attr/char should be "under" the new cursor,
- * for "inverting" purposes or whatever.
- */
-static errr Term_curs_sdl(int x, int y)
-{
- term_data *td = (term_data*)(Term->data);
- DB("Term_curs_sdl");
- /* XXX XXX XXX */
-#ifdef USE_ISO
- highlite_spot(x, y);
-#endif
-
- /* Success */
- return (0);
-}
-
-
-/*
- * Erase some characters
- *
- * This function should erase "n" characters starting at (x,y).
- *
- * You may assume "valid" input if the window is properly sized.
- */
-static errr Term_wipe_sdl(int x, int y, int n)
-{
- static SDL_Rect base;
- term_data *td = (term_data*)(Term->data);
- DB("Wiping");
- /* calculate boundaries of the area to clear */
- base.x = td->pos_x + x*t_width;
- base.y = td->pos_y + y*t_height;
- base.w = n*t_width;
- base.h = t_height;
-
- /* Lock the screen */
- if (SDL_MUSTLOCK(screen) ){
- if (SDL_LockSurface(screen) < 0) {
- printf("Can't lock the screen: %s\n", SDL_GetError());
- sdl_quit("Bah");
- }
- }
-
- /* blank the screen area */
- SDL_FillRect(screen, &base, screen_black);
-
- /* Unlock the screen */
- if (SDL_MUSTLOCK(screen) ){
- SDL_UnlockSurface(screen);
- }
-
- /* And... UPDATE the rectangle we just wrote to! */
- SDL_UpdateRects(screen,1,&base);
-
- /* Success */
- return (0);
-}
-
-
-/*
- * Draw some text on the screen
- *
- * This function should actually display an array of characters
- * starting at the given location, using the given "attribute",
- * and using the given string of characters, which contains
- * exactly "n" characters and which is NOT null-terminated.
- *
- * You may assume "valid" input if the window is properly sized.
- *
- * You must be sure that the string, when written, erases anything
- * (including any visual cursor) that used to be where the text is
- * drawn. On many machines this happens automatically, on others,
- * you must first call "Term_wipe_xxx()" to clear the area.
- *
- * In color environments, you should activate the color contained
- * in "color_data[a & 0x0F]", if needed, before drawing anything.
- *
- * You may ignore the "attribute" if you are only supporting a
- * monochrome environment, since this routine is normally never
- * called to display "black" (invisible) text, including the
- * default "spaces", and all other colors should be drawn in
- * the "normal" color in a monochrome environment.
- *
- * Note that if you have changed the "attr_blank" to something
- * which is not black, then this function must be able to draw
- * the resulting "blank" correctly.
- *
- * Note that this function must correctly handle "black" text if
- * the "always_text" flag is set, if this flag is not set, all the
- * "black" text will be handled by the "Term_wipe_xxx()" hook.
- */
-static errr Term_text_sdl(int x, int y, int n, byte a, const char *cp)
-{
- term_data *td = (term_data*)(Term->data);
- static SDL_Rect base;
- SDL_Rect base_back;
- int i = n;
- char old = 0;
-
- /* calculate place to clear off and draw to */
- base.x = td->pos_x + x*t_width;
- base.y = td->pos_y + y*t_height;
- base.w = n*t_width;
- base.h = t_height;
-
- base_back = base;
-
- /* Lock the screen */
- if (SDL_MUSTLOCK(screen) ){
- if (SDL_LockSurface(screen) < 0) {
- printf("Can't lock the screen: %s\n", SDL_GetError());
- sdl_quit("Bah");
- }
- }
-
- /* blank the screen area */
- SDL_FillRect(screen, &base, screen_black);
-
- /* Unlock the screen */
- if (SDL_MUSTLOCK(screen) ){
- SDL_UnlockSurface(screen);
- }
-
- /* Note that SDL docs specify that SDL_BlitSurface should not be called
- on locked surfaces... since the character printing routine below revolves
- around blitting, the surface has been unlocked first*/
-
- /* loop through the input string, drawing characters */
- i = n;
- old = 0;
- while (i--)
- {
- /* Output the character... */
- /* If character has not changed, then just blit the old surface into
- the new location to save effort*/
- if (*cp == old)
- {
- /* the desired character/color combo is already on the work surf */
- /* just blit it! */
- SDL_BlitSurface(worksurf,NULL,screen,&base);
- } else {
- /* copy the desired character onto working surface */
- SDL_BlitSurface(text[*cp],NULL,worksurf,NULL);
- /* color our crayon surface with the desired color */
- SDL_FillRect(crayon,NULL,color_data[a&0x0f]);
- /* apply the color to the character on the working surface */
- SDL_BlitSurface(crayon,NULL,worksurf,NULL);
- /* and blit it onto our screen! */
- SDL_BlitSurface(worksurf,NULL,screen,&base);
- }
- /* Move to the next position */
- base.x += t_width;
- /* Store the old character */
- old = *cp;
- /* Increment the character pointer */
- cp++;
- }
-
- // And... UPDATE the rectangle we just wrote to!
- SDL_UpdateRects(screen,1,&base_back);
-
-#ifdef USE_ISO
- if (a < 16)
- {
- set_spots(x, y, n, TRUE);
- }
- else
- {
- set_spots(x, y, n, FALSE);
- }
-#endif /* USE_ISO */
-
- /* Success */
- return (0);
-}
-
-/*
- * Draw some attr/char pairs on the screen
- *
- * This routine should display the given "n" attr/char pairs at
- * the given location (x,y). This function is only used if one
- * of the flags "always_pict" or "higher_pict" is defined.
- *
- * You must be sure that the attr/char pairs, when displayed, will
- * erase anything (including any visual cursor) that used to be at
- * the given location. On many machines this is automatic, but on
- * others, you must first call "Term_wipe_xxx(x, y, 1)".
- *
- * With the "higher_pict" flag, this function can be used to allow
- * the display of "pseudo-graphic" pictures, for example, by using
- * the attr/char pair as an encoded index into a pixmap of special
- * "pictures".
- *
- * With the "always_pict" flag, this function can be used to force
- * every attr/char pair to be drawn by this function, which can be
- * very useful if this file can optimize its own display calls.
- *
- * This function is often associated with the "arg_graphics" flag.
- *
- * This function is only used if one of the "higher_pict" and/or
- * "always_pict" flags are set.
- */
-#ifndef USE_ISO
-static errr Term_pict_sdl(int x, int y, int n, const byte *ap, const char *cp)
-{
- term_data *td = (term_data*)(Term->data);
- DB("Term_pict_sdl");
- /* XXX XXX XXX */
-#else
-// for ISO-view we need USE_TRANSPARENCY and USE_EGO_GRAPHICS defined
-static errr Term_pict_sdl(int x, int y, int n, const byte *ap, const char *cp, const byte *tap, const char *tcp, const byte *eap, const char *ecp)
-{
- /* Hajo: memorize output */
- memcpy(&iso_ap[y][x], ap, n);
- memcpy(&iso_cp[y][x], cp, n);
- memcpy(&iso_atp[y][x], tap, n);
- memcpy(&iso_ctp[y][x], tcp, n);
- memcpy(&iso_aep[y][x], eap, n);
- memcpy(&iso_cep[y][x], ecp, n);
-
- // here is no text
- set_spots(x, y, n, FALSE);
-
-#endif /* USE_ISO */
-
- /* Success */
- return (0);
-}
-
-static errr term_data_init(term_data *td, int i)
-{
- term *t = &(td->t);
- int x = 0;
- int y = 0;
- int cols = 80;
- int rows = 24;
-
- /* Initialize the term */
- // gets: pointer to address, number of columns, number of rows, number
- // of keypresses to queue up (guess 24?)
- term_init(t, cols, rows, 24);
-
- /* Use a "soft" cursor */
- t->soft_cursor = TRUE;
-
- // Picture routine flags
- t->always_pict = FALSE;
- t->higher_pict = FALSE;
- t->always_text = FALSE;
-
- /* Erase with "white space" */
- t->attr_blank = TERM_WHITE;
- t->char_blank = ' ';
-
- /* Hooks */
- t->xtra_hook = Term_xtra_sdl;
- t->curs_hook = Term_curs_sdl;
- t->wipe_hook = Term_wipe_sdl;
- t->text_hook = Term_text_sdl;
-#ifdef USE_ISO
- t->pict_hook = Term_pict_sdl;
-#endif /* USE_ISO */
-
-
- /* Save the data */
- t->data = td;
-
- /* Activate (important) */
- Term_activate(t);
-
- // *** Initialize the rest of the term_data stuff....
- td->name = angband_term_name[i];// name of this term window
-
- td->rows = rows;
- td->cols = cols;
- td->pos_x = x;
- td->pos_y = y;
-
-
- td->size_w = cols*t_width;
- td->size_h = rows*t_height;
-
- /* Turn on a border, thickness specified by BORDER_THICKNESS */
- td->has_border = TRUE;
- td->border_thick = BORDER_THICKNESS;
-
-#ifdef USE_GRAPHICS
-#ifdef USE_TRANSPARENCY
-#endif
-#endif
-
- /* Success */
- return (0);
-}
-
-#ifdef PRIVATE_USER_PATH
-
-/*
- * Check and create if needed the directory dirpath -- copied from main.c
- */
-bool private_check_user_directory(cptr dirpath)
-{
- /* Is this used anywhere else in *bands? */
- struct stat stat_buf;
-
- int ret;
-
- /* See if it already exists */
- ret = stat(dirpath, &stat_buf);
-
- /* It does */
- if (ret == 0)
- {
- /* Now we see if it's a directory */
- if ((stat_buf.st_mode & S_IFMT) == S_IFDIR) return (TRUE);
-
- /*
- * Something prevents us from create a directory with
- * the same pathname
- */
- return (FALSE);
- }
-
- /* No - this maybe the first time. Try to create a directory */
- else
- {
- /* Create the ~/.ToME directory */
- ret = mkdir(dirpath, 0700);
-
- /* An error occured */
- if (ret == -1) return (FALSE);
-
- /* Success */
- return (TRUE);
- }
-}
-
-/*
- * Check existence of ".ToME/" directory in the user's
- * home directory or try to create it if it doesn't exist.
- * Returns FALSE if all the attempts fail.
- */
-static bool check_create_user_dir(void)
-{
- char dirpath[1024];
- char versionpath[1024];
- char savepath[1024];
-
- /* Get an absolute path from the filename */
- path_parse(dirpath, 1024, PRIVATE_USER_PATH);
- strcpy(versionpath, dirpath);
- strcat(versionpath, USER_PATH_VERSION);
- strcpy(savepath, versionpath);
- strcat(savepath, "/save");
-
- return private_check_user_directory(dirpath) && private_check_user_directory(versionpath) && private_check_user_directory(savepath);
-}
-
-#endif /* PRIVATE_USER_PATH */
-
-/*
- * Init some stuff - copied from main.c
- */
-static void init_stuff(void)
-{
- char path[1024];
-
- cptr tail;
-
- /* Get the environment variable */
- tail = getenv("TOME_PATH");
-
- /* Use the angband_path, or a default */
-#ifndef ENABLE_BINRELOC
- strcpy(path, tail ? tail : DEFAULT_PATH);
-#else /* Runtime lookup of location */
- strcpy(path, br_strcat(DATADIR, "/tome/lib"));
-#endif
-
- /* Hack -- Add a path separator (only if needed) */
- if (!suffix(path, PATH_SEP)) strcat(path, PATH_SEP);
-
- /* Initialize */
- init_file_paths(path);
-}
-
-
-errr init_sdl(int argc, char **argv)
-{
- return 0;
-}
-
-int main(int argc, char *argv[])
-{
- int i;
-
- bool done = FALSE;
-
- bool new_game = FALSE;
-
- int show_score = 0;
-
- cptr mstr = NULL;
-
- bool args = TRUE;
-
- float gamma;
- char filename[PATH_MAX + 1];
- /* Flags to pass to SDL_SetVideoMode */
- int videoFlags;
- /* this holds some info about our display */
- const SDL_VideoInfo *videoInfo;
-
-
-#ifdef CHECK_MEMORY_LEAKS
- GC_find_leak = 1;
-#endif /* CHECK_MEMORY_LEAKS */
-
-
- /* Save the "program name" XXX XXX XXX */
- argv0 = argv[0];
-
-
-#ifdef SET_UID
-
- /* Default permissions on files */
- (void)umask(022);
-
-#endif /* SET_UID */
-
-
- /* Get the file paths */
- init_stuff();
-
-
-#ifdef SET_UID
-
- /* Get the user id (?) */
- player_uid = getuid();
-
-# ifdef SAFE_SETUID
-
-# ifdef _POSIX_SAVED_IDS
-
- /* Save some info for later */
- player_euid = geteuid();
- player_egid = getegid();
-
-# endif
-
-# if 0 /* XXX XXX XXX */
-
- /* Redundant setting necessary in case root is running the game */
- /* If not root or game not setuid the following two calls do nothing */
-
- if (setgid(getegid()) != 0)
- {
- sdl_quit("setgid(): cannot set permissions correctly!");
- }
-
- if (setuid(geteuid()) != 0)
- {
- sdl_quit("setuid(): cannot set permissions correctly!");
- }
-
-# endif /* XXX XXX XXX */
-
-# endif /* SAFE_SETUID */
-
-#endif /* SET_UID */
-
-
-#ifdef SET_UID
-
- /* Please note that the game is still running in the game's permission */
-
- /* Initialize the "time" checker */
- if (check_time_init() || check_time())
- {
- sdl_quit("The gates to Angband are closed (bad time).");
- }
-
- /* Initialize the "load" checker */
- if (check_load_init() || check_load())
- {
- sdl_quit("The gates to Angband are closed (bad load).");
- }
-
-
- /*
- * Become user -- This will be the normal state for the rest of the game.
- *
- * Put this here because it's totally irrelevant to single user operating
- * systems, as witnessed by huge number of cases where these functions
- * weren't used appropriately (at least in this variant).
- *
- * Whenever it is necessary to open/remove/move the files in the lib folder,
- * this convention must be observed:
- *
- * safe_setuid_grab();
- *
- * fd_open/fd_make/fd_kill/fd_move which requires game's permission,
- * i.e. manipulating files under the lib directory
- *
- * safe_setuid_drop();
- *
- * Please never ever make unmatched calls to these grab/drop functions.
- *
- * Please note that temporary files used by various information commands
- * and ANGBAND_DIR_USER files shouldn't be manipulated this way, because
- * they reside outside of the lib directory on multiuser installations.
- * -- pelpel
- */
- safe_setuid_drop();
-
-
- /* Acquire the "user name" as a default player name */
- user_name(player_name, player_uid);
-
-
-#ifdef PRIVATE_USER_PATH
-
- /*
- * On multiuser systems, users' private directories are
- * used to store pref files, chardumps etc.
- */
- {
- bool ret;
-
- /* Create a directory for the user's files */
- ret = check_create_user_dir();
-
- /* Oops */
- if (ret == FALSE) sdl_quit("Cannot create directory " PRIVATE_USER_PATH);
- }
-
-#endif /* PRIVATE_USER_PATH */
-
-#endif /* SET_UID */
-
- /* Before sdl_quit could possible be called, need to make sure that the text
- array is zeroed, so that sdl_quit->killFontAndAlphabet() doesn't try to free
- SDL_Surfaces that don't exist ! */
- memset(text,0,sizeof(text));
-
- /* Initialize the SDL window*/
- filename[PATH_MAX] = 0;
-
- /* initialize SDL */
- if ( SDL_Init( SDL_INIT_VIDEO ) < 0 )
- {
- sdl_quit("Video initialization failed!");
- }
- DB("SDL Initialized!");
-
- /* Skip to our arguments -- (Neil)*/
- /* for (i = 1; (i < argc) && (0 != strcmp(argv[i], "--")); ++i); */
- /* Handle our arguments -- (Neil)*/
- /* for (++i; i < argc ; ++i)
- {
- if (0 == strcmp(argv[i], "-n"))
- {
- if (++i == argc)
- {
- printf("Argument missing for option -n\n");
- return -1;
- }
-
- arg_console_count = atoi(argv[i]);
- if (arg_console_count <= 0 || arg_console_count > MAX_CONSOLE_COUNT)
- {
- printf("Invalid console count given.\n");
- arg_console_count = 1;
- }
- }
- else if (0 == strcmp(argv[i], "-o"))
- {
- arg_old_graphics = TRUE;
- }
- else if (0 == strcmp(argv[i], "-b"))
- {
- arg_double_width = TRUE;
- }
- else if (0 == strcmp(argv[i], "-w"))
- {
- if (++i == argc)
- {
- printf("Argument missing for option -w\n");
- return -1;
- }
-
- arg_width = atoi(argv[i]);
- }
- else if (0 == strcmp(argv[i], "-h"))
- {
- if (++i == argc)
- {
- printf("Argument missing for option -h\n");
- return -1;
- }
-
- arg_height = atoi(argv[i]);
- }
- else if (0 == strcmp(argv[i], "-fs"))
- {
- arg_full_screen = TRUE;
- }
- else if (0 == strcmp(argv[i], "-bpp"))
- {
- if (++i == argc)
- {
- printf("Argument missing for option -bpp\n");
- return -1;
- }
-
- arg_bpp = atoi(argv[i]);
- }
- }
- */
-
-
- /* Now for the meat of the initialization -- (Neil)*/
- quit_aux = sdl_quit;
-
- /* Window Manager stuff -- (Neil)*/
- path_build(filename, PATH_MAX, ANGBAND_DIR_XTRA, "graf/icon.png");
- SDL_WM_SetIcon(IMG_Load(filename), 0);
- SDL_WM_SetCaption("ToME", "tome");
-
- /* how about a hardware surface with hardware palette?
- XXX XXX XXX should probably be chosen at compile-time! */
- videoFlags = SDL_HWSURFACE | SDL_HWPALETTE;
-
- /* XXX XXX XXX */
- if(getenv("TOME_SCREEN_WIDTH")) arg_width = atoi(getenv("TOME_SCREEN_WIDTH"));
- if(getenv("TOME_SCREEN_HEIGHT")) arg_height = atoi(getenv("TOME_SCREEN_HEIGHT"));
- if(getenv("TOME_SCREEN_BPP")) arg_bpp = atoi(getenv("TOME_SCREEN_BPP"));
-
- /* get a SDL surface */
- screen = SDL_SetVideoMode( arg_width, arg_height, arg_bpp, videoFlags );
-
- DB("Video Mode Set!");
-
- /* Verify there is a surface */
- if ( !screen )
- {
- DB("No screen!");
- sdl_quit("Failed to set SDL Surface.");
- }
-
- DB("SDL Window Created!");
-
- /* Now ready the fonts! */
-
- DB("initializing SDL_ttf");
- if(TTF_Init()==-1) {
- printf("TTF_Init: %s\n", TTF_GetError());
- sdl_quit("Bah");
- }
-
- DB("loading font...");
- /* XXX centralize these environment calls*/
- if(getenv("TOME_FONT_SIZE")) arg_font_size = atoi(getenv("TOME_FONT_SIZE"));
-
- /* load and render the font */
- loadAndRenderFont(arg_font_name,arg_font_size);
-
- /* Initialize the working surface and crayon surface used for rendering
- text in different colors... */
- worksurf = SDL_CreateRGBSurface(SDL_HWSURFACE,t_width,\
- t_height,16,0xf000,0x0f00,0x00f0,0x000f);
- crayon = SDL_CreateRGBSurface(SDL_HWSURFACE,t_width,\
- t_height,16,0xf000,0x0f00,0x00f0,0x000f);
-
- /* The working surface will blit using alpha values... */
- SDL_SetAlpha(worksurf,SDL_SRCALPHA,0);
-
- /* Set up the colors using the great little color macros! */
- color_data[0] = BLACK;
- color_data[1] = WHITE;
- color_data[2] = MID_GREY;
- color_data[3] = BRIGHT_ORANGE;
- color_data[4] = RED;
- color_data[5] = GREEN;
- color_data[6] = BRIGHT_BLUE;
- color_data[7] = DARK_ORANGE;
- color_data[8] = DARK_GREY;
- color_data[9] = BRIGHT_GREY;
- color_data[10] = PURPLE;
- color_data[11] = YELLOW;
- color_data[12] = BRIGHT_RED;
- color_data[13] = BRIGHT_GREEN;
- color_data[14] = AQUAMARINE;
- color_data[15] = BROWN;
-
- /* And setup the screen black color */
- screen_black = SDL_MapRGB(screen->format,0,0,0);
- screen_white = SDL_MapRGB(screen->format,255,255,255);
-
- /* Initialize the windows, or whatever that means in this case */
- for (i = 0; i < MAX_CONSOLE_COUNT; i++)
- {
- term_data *td = &data[i];
-
- /* Initialize the term_data */
- term_data_init(td, i);
- /* Save global entry */
- angband_term[i] = Term;
- }
-
- /* Enable UNICODE keysyms */
- SDL_EnableUNICODE(1);
-
- /* By setting this value, 'pref-sdl.prf' will be loaded on start.
- Since this contains mappings for various keys, this is important! */
- ANGBAND_SYS = "sdl";
-#ifdef USE_ISO
- DB("Isometric view uses always graphics mode.\n");
- use_graphics = TRUE;
-
-
- /* Hajo: allocate memory for output data */
- /* These arrays are read by the iso-view and written from this file */
- iso_cp = halloc(data[0].t.wid, data[0].t.hgt);
- iso_ap = halloc(data[0].t.wid, data[0].t.hgt);
- iso_ctp = halloc(data[0].t.wid, data[0].t.hgt);
- iso_atp = halloc(data[0].t.wid, data[0].t.hgt);
- iso_cep = halloc(data[0].t.wid, data[0].t.hgt);
- iso_aep = halloc(data[0].t.wid, data[0].t.hgt);
-
- // Hmm, no ANGBAND_SYS in old iso-code
- // if I change this I don't have to load the *.prf manually?
- //
- // seems not to work for the following:
- /* Hajo: set mode */
- ANGBAND_GRAF = "iso";
-
- /* Hajo: init view */
- init_adaptor();
-
- center_player = TRUE;
-#endif /* USE_ISO */
-
- printf("Signals?\n");
-
- /* Catch nasty signals */
- signals_init();
-
- printf("Initialize Angband!\n");
- /* Initialize */
- init_angband();
-
- printf("Angband Initialized!\n");
-
- /* Hack -- If requested, display scores and quit */
- if (show_score > 0) display_scores(0, show_score);
-
- /* Wait for response */
- pause_line(23);
-
- printf("Play the game!\n");
-#ifdef USE_ISO
- // Juergen: HACK, but this all is just for testing ...
- data[0].t.higher_pict = TRUE;
-#endif
-
- /* Play the game */
- play_game(new_game);
-
- /* Quit */
- sdl_quit("Game over, man");
-
- /* Exit */
- return (0);
-
-}
-
-#endif
diff --git a/src/main-sdl.c b/src/main-sdl.c
index 42c76958..1b53cfc7 100644
--- a/src/main-sdl.c
+++ b/src/main-sdl.c
@@ -32,80 +32,16 @@
#include <math.h>
-#ifdef USE_ISO
-/*
- * Simugraph system (Hj. Malthaner)
- */
-#include "iso/simsys.h"
-#include "iso/simgraph.h"
-#include "iso/world_adaptor.h"
-#include "iso/world_view.h"
-/*
- * Simugraph specific routines
- * by Hj. Malthaner
- */
-#include "iso/hackdef.h"
-
-/*
- * Text place marker function protype (Hj. Malthaner)
- */
-static void set_spots(int x, int y, int n, bool v);
-
-/**
- * we need to track spots with text to avoid overdrawing text with images
- * @author Hj. Malthaner (hansjoerg.malthaner@gmx.de)
- */
-bool spots[80][24];
-
-/**
- * mouse coordinates for Simugraph engine
- * @author Hj. Malthaner (hansjoerg.malthaner@gmx.de)
- */
-int mx, my;
-
-/*
- * Hajo: this flags need to be set when opening windows
- */
-
-static int tex_width;
-static int tex_height;
-static int tex_xoff;
-static int tex_yoff;
-
-static unsigned int tab16[1 << 16];
-
-/**
- * this is used if we need to fake an 8 bit array
- * @author Hj. Malthaner
- */
-static unsigned short * data8;
-
-// buffers to store char code/attr for graphics
-unsigned char **iso_ap;
-unsigned char **iso_cp;
-unsigned char **iso_atp;
-unsigned char **iso_ctp;
-unsigned char **iso_aep;
-unsigned char **iso_cep;
-
-#endif /* USE_ISO */
-
/*************************************************
GLOBAL SDL-ToME PROPERTIES
*************************************************/
-
-/* Default window properties - used if none are available
-from other places*/
-#define DEF_SCREEN_WIDTH 800
-#define DEF_SCREEN_HEIGHT 600
-#define DEF_SCREEN_BPP 16
/*Main window properties that may be loaded at runtime from
a preference file or environmental variables. However,
default values (defined above) can be used. */
-static int arg_width = DEF_SCREEN_WIDTH;
-static int arg_height = DEF_SCREEN_HEIGHT;
-static int arg_bpp = DEF_SCREEN_BPP;
+static int arg_width = 0;
+static int arg_height = 0;
+static int arg_bpp = 16;
/**************/
@@ -155,15 +91,15 @@ border */
/* some miscellaneous settings which have not been dealt
with yet */
-static bool arg_double_width = FALSE;
+static bool_ arg_double_width = FALSE;
/* flag signifying whether the game is in full screen */
-static bool arg_full_screen = FALSE;
+static bool_ arg_full_screen = FALSE;
/* a flag to show whether window properties have been
set or not... if so, the properties can be dumped
upon quit*/
-static bool window_properties_set = FALSE;
+static bool_ window_properties_set = FALSE;
/*************************************************
GLOBAL SDL-ToME VARIABLES
@@ -181,7 +117,7 @@ redrawn -- like when doing a Term_redraw() or when
redoing the entire screen -- all of the changes
can be stored up before doing an update. This
should cut down on screen flicker */
-static bool suspendUpdate = FALSE;
+static bool_ suspendUpdate = FALSE;
/* some helper surfaces that are used for rendering
characters */
@@ -275,10 +211,6 @@ struct _term_data
rendered to before blitting to main screen */
int black,white,purple; /* basic colors keyed to this terminal's surface */
-#ifdef USE_GRAPHICS
-#ifdef USE_TRANSPARENCY
-#endif
-#endif
};
/* The array of term data structures */
@@ -452,406 +384,6 @@ void loadAndRenderFont(char *fname, int size)
}
}
-#ifdef USE_ISO
-/*************************************************
- ISO SUPPORT FUNCTIONS
- *************************************************/
-/**
- * inits operating system stuff
- * @author Hj. Malthaner (hansjoerg.malthaner@gmx.de)
- */
-int dr_os_init(int n, int *parameter)
-{
- // Hajo:
- // unused in isov-x11
- return TRUE;
-}
-
-
-/**
- * opens graphics device/context/window of size w*h
- * @param w width
- * @param h height
- * @author Hj. Malthaner (hansjoerg.malthaner@gmx.de)
- */
-int dr_os_open(int w, int h)
-{
- const int left = 13;
-
-/* tex_width = (data[0].fd->dw * (data[0].t.wid - left + 2) + 3) & 0xFFFC;
- tex_height = data[0].fd->dh * (data[0].t.hgt - 2);
-
- tex_xoff = data[0].fd->dw * left;
- tex_yoff = data[0].fd->dh * 1 + 1;
-*/
-
- //tex_width = (data[0].size_w - (left - 2) * (data[0].size_w / data[0].cols) + 3) & 0xFFFC;
- // this is too big (but works :-))
- tex_width = data[0].size_w & 0xfffc;
- tex_height = (data[0].size_h / data[0].rows) * (data[0].rows-2);
-
- tex_xoff = (tex_width / data[0].cols) * left;
- tex_yoff = (tex_height / data[0].rows) * 1 + 1;
-
- return TRUE;
-}
-
-
-/**
- * closes operating system stuff
- * @author Hj. Malthaner (hansjoerg.malthaner@gmx.de)
- */
-int dr_os_close()
-{
- // Hajo:
- // unused in isov-x11
- return TRUE;
-}
-
-
-/**
- * retrieve display width
- * @author Hj. Malthaner (hansjoerg.malthaner@gmx.de)
- */
-int dr_get_width()
-{
- return data[0].size_w;
-}
-
-
-/**
- * retrieve display height
- * @author Hj. Malthaner (hansjoerg.malthaner@gmx.de)
- */
-int dr_get_height()
-{
- return data[0].size_h;
-}
-
-
-/**
- * this is used if we need to fake an 8 bit array
- * @author Hj. Malthaner
- */
-static unsigned short * data8;
-
-
-/**
- * creates a (maybe virtual) array of graphics data
- * @author Hj. Malthaner
- */
-unsigned short * dr_textur_init()
-{
- int i;
-
- printf("isov-sdl::dr_textur_init()\n");
- printf(" width = %d\n", data[0].size_w);
- printf(" height = %d\n", data[0].size_h);
-
- for (i = 0; i < (1 << 16); i++)
- {
- // FIXME!!!
- // must consider color bits, or breaks in anything else but RGB 555
- unsigned int R;
- unsigned int G;
- unsigned int B;
-
- // RGB 555
- R = (i & 0x7C00) >> 10;
- G = (i & 0x03E0) >> 5;
- B = (i & 0x001F) >> 0;
-
-
- tab16[i] = SDL_MapRGB(screen->format, R << 3, G << 3, B << 3);
- }
-
-
-
- data8 = malloc((data[0].size_w) * (data[0].size_h) * 2);
-
- printf(" textur = %p\n", data8);
-
- // fake an 16 bit array and convert data before displaying
- return data8;
-}
-
-static void flush_area(int dest_x, int dest_y,
- int x, int y, int w, int h)
-{
- SDL_Surface *face = screen;
-
- if (SDL_LockSurface(face) == 0)
- {
- int i, j;
- const int bpp = screen->format->BytesPerPixel;
-
- for (j = 0; j < h; j++)
- {
- unsigned short * p = data8 + (y + j) * tex_width + x;
- unsigned char * row = face->pixels + (dest_y + j) * face->pitch + dest_x * bpp;
-
-
- for (i = 0; i < w; i++)
- {
- *((unsigned short*)row) = tab16[ *p++ ];
- row += bpp;
- }
- }
- SDL_UnlockSurface(face);
- }
-}
-
-/**
- * displays the array of graphics data
- * @author Hj. Malthaner
- */
-void dr_textur(int xp, int yp, int w, int h)
-{
- int y;
-
- // clipping unten
- if (yp + h > tex_height)
- {
- h = tex_height - yp;
- }
-
- /* debug spots
- for(y=0; y<24; y++) {
- int x;
-
- for(x=0; x<80; x++) {
- if(spots[x][y]) {
- printf("X");
- } else {
- printf(".");
- }
-}
- printf("\n");
-}
- */
-
- for (y = 0; y < SCREEN_HGT; y++)
- {
- const int left = 13;
- const int y1 = y + 1;
- int x = 0;
-
- yp = data[0].size_h / data[0].rows * y;
-
- spots[79][y1] = FALSE;
-
- do
- {
- int n = 0;
- while (x + n + left < 80 && !spots[x + n + left][y1])
- {
- n++;
- }
-
- xp = data[0].size_w / data[0].cols * x;
-
-
- flush_area(tex_xoff + xp, tex_yoff + yp,
- xp, yp,
- data[0].size_w / data[0].cols*(n),
- data[0].size_h / data[0].rows);
-
- x += n;
-
- while (x + left < 80 && spots[x + left][y1])
- {
- x++;
- }
- }
- while (x + left < 80);
- }
-}
-
-
-/**
- * use this method to flush graphics pipeline (undrawn stuff) onscreen.
- * @author Hj. Malthaner
- */
-void dr_flush()
-{
- // Iso-view for angband needs no sync.
- // XSync(md,FALSE);
-}
-
-
-/**
- * set colormap entries
- * @author Hj. Malthaner
- */
-void dr_setRGB8multi(int first, int count, unsigned char * data)
-{
- // Hajo:
- // unused in isov-x11
-}
-
-
-/**
- * display/hide mouse pointer
- * @author Hj. Malthaner (hansjoerg.malthaner@gmx.de)
- */
-void show_pointer(int yesno)
-{
- // Hajo:
- // unused in isov-x11
-}
-
-
-/**
- * move mouse pointer
- * @author Hj. Malthaner (hansjoerg.malthaner@gmx.de)
- */
-void move_pointer(int x, int y)
-{
- // Hajo:
- // unused in isov-x11
-}
-
-
-/**
- * update softpointer position
- * @author Hj. Malthaner (hansjoerg.malthaner@gmx.de)
- */
-void ex_ord_update_mx_my()
-{
- // Hajo:
- // unused in isov-x11
-}
-
-
-/**
- * get events from the system
- * @author Hj. Malthaner (hansjoerg.malthaner@gmx.de)
- */
-void GetEvents()
-{
- // Hajo:
- // unused in isov-x11
-}
-
-
-/**
- * get events from the system without waiting
- * @author Hj. Malthaner (hansjoerg.malthaner@gmx.de)
- */
-void GetEventsNoWait()
-{
- // Hajo:
- // unused in isov-x11
-}
-
-
-/**
- * @returns time since progrma start in milliseconds
- * @author Hj. Malthaner
- */
-long long dr_time(void)
-{
- // Hajo:
- // unused in isov-x11
- return 0;
-}
-
-
-/**
- * sleeps some microseconds
- * @author Hj. Malthaner
- */
-void dr_sleep(unsigned long usec)
-{
- // Hajo:
- // unused in isov-x11
-}
-
-
-/**
- * loads a sample
- * @return a handle for that sample or -1 on failure
- * @author Hj. Malthaner
- */
-int dr_load_sample(const char *filename)
-{
- // Hajo:
- // unused in isov-x11
- return TRUE;
-}
-
-
-/**
- * plays a sample
- * @param key the key for the sample to be played
- * @author Hj. Malthaner
- */
-void dr_play_sample(int key, int volume)
-{
- // Hajo:
- // unused in isov-x11
-}
-
-static unsigned char ** halloc(int w, int h)
-{
- unsigned char **field = (unsigned char **)malloc(sizeof(unsigned char *) * h);
- int i;
-
- for (i = 0; i < h; i++)
- {
- field[i] = (unsigned char *)malloc(sizeof(unsigned char) * w);
- memset(field[i], 32 , w);
- }
-
- return field;
-}
-
-/**
- * spot array access procedure. Mark text output spots
- * @author Hj. Malthaner (hansjoerg.malthaner@gmx.de)
- */
-static void set_spots(const int x, const int y, const int n, const bool v)
-{
- int i;
-
- for (i = x; i < x + n; i++)
- {
- spots[i][y] = v;
- }
-}
-
-
-/***********************************************/
-#endif /* USE_ISO */
-
-/***********************************************/
-
-/*** Function hooks needed by "Term" ***/
-
-static void Term_init_sdl(term *t)
-{
- term_data *td = (term_data*)(t->data);
- DB("Term_init_sdl");
- /* XXX XXX XXX */
-}
-
-static void Term_nuke_sdl(term *t)
-{
- term_data *td = (term_data*)(t->data);
- DB("Term_nuke_sdl");
- /* XXX XXX XXX */
-}
-
-static errr Term_user_sdl(int n)
-{
- term_data *td = (term_data*)(Term->data);
- DB("Term_user_sdl");
- /* XXX XXX XXX */
-
- /* Unknown */
- return (1);
-}
-
/* KEYPRESS_STRING repeatedly sends characters to the terminal
XXX - should implement routine from maim-sdl.c, it's sooo much
cleaner */
@@ -909,39 +441,6 @@ void handleEvent(SDL_Event *event)
manipulationMode();
}
-#ifdef USE_ISO
- /* toggle tile size */
- if (event->key.keysym.sym == SDLK_SCROLLOCK)
- {
- switch (display_get_tile_size())
- {
- case 32:
- display_select_tile_size(0);
- break;
- case 64:
- display_select_tile_size(1);
- break;
- default:
- display_select_tile_size(0);
- break;
- }
- reset_visuals();
- strcpy(buf, "graf-iso.prf");
- process_pref_file(buf);
- refresh_display();
- SDL_UpdateRect(screen, 0, 0, data[0].size_w, data[0].size_h);
- }
-
- /* cycle grid type none/objects+monsters only/full */
- if ((event->key.keysym.sym == '#') && \
- (SDL_GetModState() & KMOD_ALT))
- {
- set_grid(get_grid()+1);
- refresh_display();
- }
-
-#endif
-
/*printf("ascii_part: %d\n",ascii_part);*/
if (ascii_part)
{
@@ -1003,7 +502,9 @@ void handleEvent(SDL_Event *event)
/* handle quit requests */
DB("Emergency Blit");
redrawAllTerminals();
- /*sdl_quit("Quitting!\n");*/
+ save_player();
+ save_dungeon();
+ sdl_quit("Quitting!\n");
break;
}
default:
@@ -1107,14 +608,6 @@ static errr Term_xtra_sdl(int n, int v)
* necessary flushing issues.
*/
-#ifdef USE_ISO
- // Hajo:
- // refresh the graphical view
-
- refresh_display();
- SDL_UpdateRect(screen, 0, 0, data[0].size_w, data[0].size_h);
-// SDL_UpdateRect(td->face, 0, 0, 80*td->w, 24*td->h);
-#else /* regular SDL */
/* If terminal display has been held for any reason,
then update the whole thing now!*/
DB("TERM_XTRA_FRESH");
@@ -1125,7 +618,6 @@ static errr Term_xtra_sdl(int n, int v)
suspendUpdate = FALSE;
drawTermStuff(td,NULL);
}
-#endif /* USE_ISO */
return (0);
}
@@ -1179,10 +671,6 @@ static errr Term_xtra_sdl(int n, int v)
* handling "color changes" and the "arg_sound" and/or
* "arg_graphics" options.
*/
-#ifdef USE_ISO
- strcpy(buf, "graf-iso.prf");
- process_pref_file(buf);
-#endif /* USE_ISO */
return (1);
}
@@ -1355,7 +843,7 @@ rectangle and then updates it to include only the rectangles that intersect
with the test rectangle. If there is an intersection, the function returns
TRUE and base now contains the intersecting rectangle. If there is no
intersection, then the function returns FALSE */
-bool intersectRects(SDL_Rect *base, SDL_Rect *test)
+bool_ intersectRects(SDL_Rect *base, SDL_Rect *test)
{
if (INTERSECT((*base),(*test)))
{
@@ -1431,7 +919,7 @@ drawn, but occluding terminals will then re-blit to re-cover the area. */
void drawTermStuff(term_data *td, SDL_Rect *rect)
{
int n = 0, i;
- bool block = FALSE, cover = FALSE;
+ bool_ block = FALSE, cover = FALSE;
SDL_Rect spot, isect_term, isect_scr;
/* first of all, if updating is suspended, do nothing! */
@@ -1541,9 +1029,6 @@ void createCursor(byte r, byte g, byte b, byte a)
surface onto the correct location */
static errr Term_curs_sdl(int x, int y)
{
-#ifdef USE_ISO
- highlite_spot(x, y);
-#else /* regular SDL */
term_data *td = (term_data*)(Term->data);
static SDL_Rect base;
@@ -1560,7 +1045,6 @@ static errr Term_curs_sdl(int x, int y)
/* Now draw to the main screen */
drawTermStuff(td,&base);
-#endif /* USE_ISO */
/* Success */
return (0);
}
@@ -1662,16 +1146,6 @@ void eraseTerminal(void)
*/
static errr Term_text_sdl(int x, int y, int n, byte a, const char *cp)
{
-#ifdef USE_ISO
- if (a < 16)
- {
- set_spots(x, y, n, TRUE);
- }
- else
- {
- set_spots(x, y, n, FALSE);
- }
-#else
term_data *td = (term_data*)(Term->data);
static SDL_Rect base;
SDL_Rect base_back;
@@ -1731,60 +1205,6 @@ static errr Term_text_sdl(int x, int y, int n, byte a, const char *cp)
/* And update */
drawTermStuff(td,&base_back);
-#endif /* USE_ISO */
- /* Success */
- return (0);
-}
-
-/*
- * Draw some attr/char pairs on the screen
- *
- * This routine should display the given "n" attr/char pairs at
- * the given location (x,y). This function is only used if one
- * of the flags "always_pict" or "higher_pict" is defined.
- *
- * You must be sure that the attr/char pairs, when displayed, will
- * erase anything (including any visual cursor) that used to be at
- * the given location. On many machines this is automatic, but on
- * others, you must first call "Term_wipe_xxx(x, y, 1)".
- *
- * With the "higher_pict" flag, this function can be used to allow
- * the display of "pseudo-graphic" pictures, for example, by using
- * the attr/char pair as an encoded index into a pixmap of special
- * "pictures".
- *
- * With the "always_pict" flag, this function can be used to force
- * every attr/char pair to be drawn by this function, which can be
- * very useful if this file can optimize its own display calls.
- *
- * This function is often associated with the "arg_graphics" flag.
- *
- * This function is only used if one of the "higher_pict" and/or
- * "always_pict" flags are set.
- */
-#ifndef USE_ISO
-static errr Term_pict_sdl(int x, int y, int n, const byte *ap, const char *cp)
-{
- term_data *td = (term_data*)(Term->data);
- DB("Term_pict_sdl");
- /* XXX XXX XXX */
-
-#else
-// for ISO-view we need USE_TRANSPARENCY and USE_EGO_GRAPHICS defined
-static errr Term_pict_sdl(int x, int y, int n, const byte *ap, const char *cp, const byte *tap, const char *tcp, const byte *eap, const char *ecp)
-{
- /* Hajo: memorize output */
- memcpy(&iso_ap[y][x], ap, n);
- memcpy(&iso_cp[y][x], cp, n);
- memcpy(&iso_atp[y][x], tap, n);
- memcpy(&iso_ctp[y][x], tcp, n);
- memcpy(&iso_aep[y][x], eap, n);
- memcpy(&iso_cep[y][x], ecp, n);
-
- // here is no text
- set_spots(x, y, n, FALSE);
-
-#endif /* USE_ISO */
/* Success */
return (0);
}
@@ -2127,7 +1547,7 @@ void manipulationMode(void)
{
term_data *td;
SDL_Event event;
- bool done = FALSE, moveMode = TRUE;
+ bool_ done = FALSE, moveMode = TRUE;
int mouse_x, mouse_y;
int value = 0, delta_x = 0, delta_y = 0;
int current_term;
@@ -2438,9 +1858,6 @@ static errr term_data_init(term_data *td, int i)
t->curs_hook = Term_curs_sdl;
t->wipe_hook = Term_wipe_sdl;
t->text_hook = Term_text_sdl;
-#ifdef USE_ISO
- t->pict_hook = Term_pict_sdl;
-#endif /* USE_ISO */
/* Save the data */
t->data = td;
@@ -2482,10 +1899,6 @@ static errr term_data_init(term_data *td, int i)
printf("Init-int term: %d\n",i);
-#ifdef USE_GRAPHICS
-#ifdef USE_TRANSPARENCY
-#endif
-#endif
/* Success */
return (0);
@@ -2720,6 +2133,26 @@ errr init_sdl(int argc, char **argv)
else
videoFlags = SDL_SWSURFACE;
+ /* Now ready the fonts! */
+
+ DB("initializing SDL_ttf");
+ if(TTF_Init()==-1) {
+ printf("TTF_Init: %s\n", TTF_GetError());
+ sdl_quit("Bah");
+ }
+
+ DB("loading font...");
+
+ /* load and render the font */
+ loadAndRenderFont(arg_font_name,arg_font_size);
+
+ /* Make the window a nice default size if none is specified */
+ if (arg_width < 1 || arg_height < 1)
+ {
+ arg_width = 80 * t_width;
+ arg_height = 24 * t_height;
+ }
+
/* now set the video mode that has been configured */
screen = SDL_SetVideoMode( arg_width, arg_height, arg_bpp, videoFlags );
@@ -2738,19 +2171,6 @@ errr init_sdl(int argc, char **argv)
DB("SDL Window Created!");
- /* Now ready the fonts! */
-
- DB("initializing SDL_ttf");
- if(TTF_Init()==-1) {
- printf("TTF_Init: %s\n", TTF_GetError());
- sdl_quit("Bah");
- }
-
- DB("loading font...");
-
- /* load and render the font */
- loadAndRenderFont(arg_font_name,arg_font_size);
-
/* Graphics! ----
If graphics are selected, then load graphical tiles! */
if (arg_graphics_type != NO_GRAPHICS)
@@ -2826,38 +2246,6 @@ errr init_sdl(int argc, char **argv)
/* Enable key repeat! */
SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY,SDL_DEFAULT_REPEAT_INTERVAL);
- #ifdef USE_ISO
- DB("Isometric view uses always graphics mode.\n");
- use_graphics = TRUE;
-
-
- /* Hajo: allocate memory for output data */
- /* These arrays are read by the iso-view and written from this file */
- iso_cp = halloc(data[0].t.wid, data[0].t.hgt);
- iso_ap = halloc(data[0].t.wid, data[0].t.hgt);
- iso_ctp = halloc(data[0].t.wid, data[0].t.hgt);
- iso_atp = halloc(data[0].t.wid, data[0].t.hgt);
- iso_cep = halloc(data[0].t.wid, data[0].t.hgt);
- iso_aep = halloc(data[0].t.wid, data[0].t.hgt);
-
- // Hmm, no ANGBAND_SYS in old iso-code
- // if I change this I don't have to load the *.prf manually?
- //
- // seems not to work for the following:
- /* Hajo: set mode */
- ANGBAND_GRAF = "iso";
-
- /* Hajo: init view */
- init_adaptor();
-
- center_player = TRUE;
-#endif /* USE_ISO */
-
-#ifdef USE_ISO
- // Juergen: HACK, but this all is just for testing ...
- data[0].t.higher_pict = TRUE;
-#endif
-
/* main-sdl initialized! */
return 0;
}
diff --git a/src/main-sla.c b/src/main-sla.c
index c38f019c..3c02d61f 100644
--- a/src/main-sla.c
+++ b/src/main-sla.c
@@ -27,7 +27,7 @@ static int slang_on = FALSE;
/*
* Can we use "color"?
*/
-static bool can_use_color = FALSE;
+static bool_ can_use_color = FALSE;
/*
diff --git a/src/main-win.c b/src/main-win.c
index f1ca7d46..92a2a775 100644
--- a/src/main-win.c
+++ b/src/main-win.c
@@ -232,14 +232,6 @@
*/
#include <windows.h>
-/*
- * For IRC stuff
- */
-#ifdef USE_WINSOCK
-#define ZSOCK_TIMER_ID 1
-#define ZSOCK_TIMER_RATE 50
-#endif
-
/*
* Exclude parts of MMSYSTEM.H that are not needed
@@ -367,13 +359,13 @@ struct _term_data
uint size_ow2;
uint size_oh2;
- bool size_hack;
+ bool_ size_hack;
- bool xtra_hack;
+ bool_ xtra_hack;
- bool visible;
+ bool_ visible;
- bool bizarre;
+ bool_ bizarre;
cptr font_want;
@@ -407,22 +399,22 @@ static term_data *my_td;
/*
* game in progress
*/
-bool game_in_progress = FALSE;
+bool_ game_in_progress = FALSE;
/*
* note when "open"/"new" become valid
*/
-bool initialized = FALSE;
+bool_ initialized = FALSE;
/*
* screen paletted, i.e. 256 colors
*/
-bool paletted = FALSE;
+bool_ paletted = FALSE;
/*
* 16 colors screen, don't use RGB()
*/
-bool colors16 = FALSE;
+bool_ colors16 = FALSE;
/*
* Saved instance handle
@@ -460,22 +452,18 @@ static HWND hwndSaver;
/*
* Flag set once "graphics" has been initialized
*/
-static bool can_use_graphics = FALSE;
+static bool_ can_use_graphics = FALSE;
/*
* The global bitmap
*/
static DIBINIT infGraph;
-#ifdef USE_TRANSPARENCY
-
/*
* The global bitmap mask
*/
static DIBINIT infMask;
-#endif /* USE_TRANSPARENCY */
-
#endif /* USE_GRAPHICS */
@@ -484,7 +472,7 @@ static DIBINIT infMask;
/*
* Flag set once "sound" has been initialized
*/
-static bool can_use_sound = FALSE;
+static bool_ can_use_sound = FALSE;
/*
* An array of sound file names
@@ -557,8 +545,8 @@ static BYTE win_pal[256] =
/*
* Hack -- define which keys are "special"
*/
-static bool special_key[256];
-static bool ignore_key[256];
+static bool_ special_key[256];
+static bool_ ignore_key[256];
#if 1
/*
@@ -735,7 +723,7 @@ static char *analyze_font(char *path, int *wp, int *hp)
/*
* Check for existance of a file
*/
-static bool check_file(cptr s)
+static bool_ check_file(cptr s)
{
char path[1024];
@@ -784,7 +772,7 @@ static bool check_file(cptr s)
/*
* Check for existance of a directory
*/
-static bool check_dir(cptr s)
+static bool_ check_dir(cptr s)
{
int i;
@@ -1004,12 +992,6 @@ static void save_prefs(void)
strcpy(buf, arg_sound ? "1" : "0");
WritePrivateProfileString("Angband", "Sound", buf, ini_file);
-#ifdef SUPPORT_GAMMA
- /* Save the "gamma_val" */
- sprintf(buf, "%d", gamma_val);
- WritePrivateProfileString("Angband", "GammaVal", buf, ini_file);
-#endif /* SUPPORT_GAMMA */
-
/* Save window prefs */
for (i = 0; i < MAX_TERM_DATA; ++i)
{
@@ -1076,11 +1058,6 @@ static void load_prefs(void)
/* Extract the "arg_sound" flag */
arg_sound = (GetPrivateProfileInt("Angband", "Sound", 0, ini_file) != 0);
-#ifdef SUPPORT_GAMMA
- /* Extract the "gamma_val" */
- gamma_val = GetPrivateProfileInt("Angband", "GammaVal", 0, ini_file);
-#endif /* SUPPORT_GAMMA */
-
/* Load window prefs */
for (i = 0; i < MAX_TERM_DATA; ++i)
{
@@ -1236,7 +1213,7 @@ static int new_palette(void)
/*
* Initialize graphics
*/
-static bool init_graphics()
+static bool_ init_graphics()
{
/* Initialize once */
/*if (can_use_graphics != arg_graphics) */
@@ -1245,8 +1222,6 @@ static bool init_graphics()
int wid, hgt;
cptr name;
-#ifdef USE_TRANSPARENCY
-
/* Unused */
PALETTEENTRY entry =
{
@@ -1254,8 +1229,6 @@ static bool init_graphics()
};
(void)entry;
-#endif /* USE_TRANSPARENCY */
-
if (arg_graphics == 2)
{
wid = 16;
@@ -1289,8 +1262,6 @@ static bool init_graphics()
infGraph.CellHeight = hgt;
-#ifdef USE_TRANSPARENCY
-
path_build(buf, 1024, ANGBAND_DIR_XTRA_GRAF, "mask.bmp");
/* Load the bitmap or quit */
if (!ReadDIB(data[0].w, buf, &infMask))
@@ -1299,8 +1270,6 @@ static bool init_graphics()
return (FALSE);
}
-#endif /* USE_TRANSPARENCY */
-
/* Activate a palette */
if (!new_palette())
{
@@ -1323,7 +1292,7 @@ static bool init_graphics()
/*
* Initialize sound
*/
-static bool init_sound()
+static bool_ init_sound()
{
/* Initialize once */
if (!can_use_sound)
@@ -1401,7 +1370,7 @@ static errr term_force_font(term_data *td, cptr path)
/* Forget old font */
if (td->font_file)
{
- bool used = FALSE;
+ bool_ used = FALSE;
/* Scan windows */
for (i = 0; i < MAX_TERM_DATA; i++)
@@ -1594,16 +1563,6 @@ static errr Term_user_win(int n)
}
-#ifdef SUPPORT_GAMMA
-
-/*
- * When set to TRUE, indicates that we can use gamma_table
- */
-static bool gamma_table_ready = FALSE;
-
-#endif /* SUPPORT_GAMMA */
-
-
/*
* React to global changes
*/
@@ -1630,34 +1589,7 @@ static errr Term_xtra_win_react(void)
byte rv, gv, bv;
- bool change = FALSE;
-
-#ifdef SUPPORT_GAMMA
-
- static u16b old_gamma_val = 0;
-
-
- /* React to change in the gamma value */
- if (gamma_val != old_gamma_val)
- {
- /* Temporarily inactivate the gamma table */
- gamma_table_ready = FALSE;
-
- /* Only need to build the table if gamma exists */
- if (gamma_val)
- {
- /* Rebuild the table */
- build_gamma_table(gamma_val);
-
- /* Activate the table */
- gamma_table_ready = TRUE;
- }
-
- /* Remember the gamma value used */
- old_gamma_val = gamma_val;
- }
-
-#endif /* SUPPORT_GAMMA */
+ bool_ change = FALSE;
/* Save the default colors */
for (i = 0; i < 256; i++)
@@ -1667,18 +1599,6 @@ static errr Term_xtra_win_react(void)
gv = angband_color_table[i][2];
bv = angband_color_table[i][3];
-#ifdef SUPPORT_GAMMA
-
- /* Hack - Gamma correction */
- if (gamma_table_ready)
- {
- rv = gamma_table[rv];
- gv = gamma_table[gv];
- bv = gamma_table[bv];
- }
-
-#endif /* SUPPORT_GAMMA */
-
/* Extract a full color code */
code = PALETTERGB(rv, gv, bv);
@@ -1796,8 +1716,6 @@ static errr Term_xtra_win_event(int v)
/* Check for an event */
else
{
- irc_poll();
-
/* Check */
if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
@@ -2002,8 +1920,6 @@ static errr Term_xtra_win(int n, int v)
/* Delay for some milliseconds */
case TERM_XTRA_DELAY:
{
- irc_poll();
-
return (Term_xtra_win_delay(v));
}
@@ -2216,15 +2132,7 @@ static errr Term_text_win(int x, int y, int n, byte a, const char *s)
*
* If "graphics" is not available, we simply "wipe" the given grids.
*/
-# ifdef USE_TRANSPARENCY
-# ifdef USE_EGO_GRAPHICS
static errr Term_pict_win(int x, int y, int n, const byte *ap, const char *cp, const byte *tap, const char *tcp, const byte *eap, const char *ecp)
-# else /* USE_EGO_GRAPHICS */
-static errr Term_pict_win(int x, int y, int n, const byte *ap, const char *cp, const byte *tap, const char *tcp)
-# endif /* USE_EGO_GRAPHICS */
-# else /* USE_TRANSPARENCY */
-static errr Term_pict_win(int x, int y, int n, const byte *ap, const char *cp)
-# endif /* USE_TRANSPARENCY */
{
term_data *td = (term_data*)(Term->data);
@@ -2234,20 +2142,12 @@ static errr Term_pict_win(int x, int y, int n, const byte *ap, const char *cp)
int x1, y1, w1, h1;
int x2, y2, w2, h2, tw2;
-# ifdef USE_TRANSPARENCY
-
int x3, y3;
HDC hdcMask = NULL;
-#ifdef USE_EGO_GRAPHICS
-
int x4, y4;
-#endif
-
-# endif /* USE_TRANSPARENCY */
-
HDC hdc;
HDC hdcSrc;
HBITMAP hbmSrcOld;
@@ -2282,16 +2182,12 @@ static errr Term_pict_win(int x, int y, int n, const byte *ap, const char *cp)
hdcSrc = CreateCompatibleDC(hdc);
hbmSrcOld = SelectObject(hdcSrc, infGraph.hBitmap);
-# ifdef USE_TRANSPARENCY
-
if (arg_graphics == 2)
{
hdcMask = CreateCompatibleDC(hdc);
SelectObject(hdcMask, infMask.hBitmap);
}
-# endif /* USE_TRANSPARENCY */
-
/* Draw attr/char pairs */
for (i = 0; i < n; i++, x2 += w2)
{
@@ -2306,8 +2202,6 @@ static errr Term_pict_win(int x, int y, int n, const byte *ap, const char *cp)
x1 = col * w1;
y1 = row * h1;
-# ifdef USE_TRANSPARENCY
-
if (arg_graphics == 2)
{
x3 = (tcp[i] & 0x7F) * w1;
@@ -2325,7 +2219,6 @@ static errr Term_pict_win(int x, int y, int n, const byte *ap, const char *cp)
/* Draw the tile */
BitBlt(hdc, x2, y2, tw2, h2, hdcSrc, x1, y1, SRCPAINT);
-#ifdef USE_EGO_GRAPHICS
if (ecp[i] != 0 && eap[i] != 0)
{
x4 = (ecp[i] & 0x7F) * w1;
@@ -2337,7 +2230,6 @@ static errr Term_pict_win(int x, int y, int n, const byte *ap, const char *cp)
/* Draw the tile */
BitBlt(hdc, x2, y2, tw2, h2, hdcSrc, x4, y4, SRCPAINT);
}
-#endif
}
/* Need to stretch */
@@ -2359,7 +2251,6 @@ static errr Term_pict_win(int x, int y, int n, const byte *ap, const char *cp)
StretchBlt(hdc, x2, y2, tw2, h2, hdcSrc, x1, y1, w1, h1, SRCPAINT);
}
-#ifdef USE_EGO_GRAPHICS
if (ecp[i] != 0 && eap[i] != 0)
{
x4 = (ecp[i] & 0x7F) * w1;
@@ -2371,13 +2262,9 @@ static errr Term_pict_win(int x, int y, int n, const byte *ap, const char *cp)
/* Draw the tile */
StretchBlt(hdc, x2, y2, tw2, h2, hdcSrc, x4, y4, w1, h1, SRCPAINT);
}
-#endif
}
}
else
-
-# endif /* USE_TRANSPARENCY */
-
{
/* Perfect size */
if ((w1 == tw2) && (h1 == h2))
@@ -2402,8 +2289,6 @@ static errr Term_pict_win(int x, int y, int n, const byte *ap, const char *cp)
SelectObject(hdcSrc, hbmSrcOld);
DeleteDC(hdcSrc);
-# ifdef USE_TRANSPARENCY
-
if (arg_graphics == 2)
{
/* Release */
@@ -2411,8 +2296,6 @@ static errr Term_pict_win(int x, int y, int n, const byte *ap, const char *cp)
DeleteDC(hdcMask);
}
-# endif /* USE_TRANSPARENCY */
-
/* Release */
ReleaseDC(td->w, hdc);
@@ -3594,9 +3477,9 @@ LRESULT FAR PASCAL AngbandWndProc(HWND hWnd, UINT uMsg,
/* Unused */
/* BYTE KeyState = 0x00; */
- bool mc = FALSE;
- bool ms = FALSE;
- bool ma = FALSE;
+ bool_ mc = FALSE;
+ bool_ ms = FALSE;
+ bool_ ma = FALSE;
/* Extract the modifiers */
if (GetKeyState(VK_CONTROL) & 0x8000) mc = TRUE;
@@ -3906,9 +3789,9 @@ LRESULT FAR PASCAL AngbandListProc(HWND hWnd, UINT uMsg,
/* Unused */
/* BYTE KeyState = 0x00; */
- bool mc = FALSE;
- bool ms = FALSE;
- bool ma = FALSE;
+ bool_ mc = FALSE;
+ bool_ ms = FALSE;
+ bool_ ma = FALSE;
/* Extract the modifiers */
if (GetKeyState(VK_CONTROL) & 0x8000) mc = TRUE;
diff --git a/src/main-x11.c b/src/main-x11.c
index c15f5982..e32e2617 100644
--- a/src/main-x11.c
+++ b/src/main-x11.c
@@ -1547,15 +1547,11 @@ struct term_data
XImage *tiles;
-#ifdef USE_TRANSPARENCY
-
/* Tempory storage for overlaying tiles. */
XImage *TmpImage;
#endif
-#endif
-
};
@@ -1590,8 +1586,8 @@ struct co_ord
typedef struct x11_selection_type x11_selection_type;
struct x11_selection_type
{
- bool select; /* The selection is currently in use. */
- bool drawn; /* The selection is currently displayed. */
+ bool_ select; /* The selection is currently in use. */
+ bool_ drawn; /* The selection is currently displayed. */
term *t; /* The window where the selection is found. */
co_ord init; /* The starting co-ordinates. */
co_ord cur; /* The end co-ordinates (the current ones if still copying). */
@@ -1775,8 +1771,8 @@ static void mark_selection(void)
{
co_ord min, max;
term *old = Term;
- bool draw = s_ptr->select;
- bool clear = s_ptr->drawn;
+ bool_ draw = s_ptr->select;
+ bool_ clear = s_ptr->drawn;
/* Open the correct term if necessary. */
if (s_ptr->t != old) Term_activate(s_ptr->t);
@@ -2090,7 +2086,7 @@ static void paste_x11_accept(const XSelectionEvent *ptr)
* Handle various events conditional on presses of a mouse button.
*/
static void handle_button(Time time, int x, int y, int button,
- bool press)
+ bool_ press)
{
/* The co-ordinates are only used in Angband format. */
pixel_to_square(&x, &y, x, y);
@@ -2104,7 +2100,7 @@ static void handle_button(Time time, int x, int y, int button,
/*
* Process events
*/
-static errr CheckEvent(bool wait)
+static errr CheckEvent(bool_ wait)
{
term_data *old_td = (term_data*)(Term->data);
@@ -2166,7 +2162,7 @@ static errr CheckEvent(bool wait)
case ButtonPress:
case ButtonRelease:
{
- bool press = (xev->type == ButtonPress);
+ bool_ press = (xev->type == ButtonPress);
/* Where is the mouse */
int x = xev->xbutton.x;
@@ -2285,7 +2281,7 @@ static errr CheckEvent(bool wait)
/* Move and/or Resize */
case ConfigureNotify:
{
- int cols, rows, wid, hgt;
+ int cols, rows;
int ox = Infowin->ox;
int oy = Infowin->oy;
@@ -2317,10 +2313,6 @@ static errr CheckEvent(bool wait)
if (cols > 255) cols = 255;
if (rows > 255) rows = 255;
- /* Desired size of window */
- wid = cols * td->fnt->wid + (ox + ox);
- hgt = rows * td->fnt->hgt + (oy + oy);
-
/* Resize the Term (if needed) */
Term_resize(cols, rows);
break;
@@ -2423,16 +2415,12 @@ static errr Term_xtra_x11(int n, int v)
/* Process random events XXX */
case TERM_XTRA_BORED:
{
- irc_poll();
-
return (CheckEvent(0));
}
/* Process Events XXX */
case TERM_XTRA_EVENT:
{
- irc_poll();
-
return (CheckEvent(v));
}
@@ -2447,8 +2435,6 @@ static errr Term_xtra_x11(int n, int v)
/* Delay for some milliseconds */
case TERM_XTRA_DELAY:
- irc_poll();
-
usleep(1000 * v);
return (0);
@@ -2573,40 +2559,26 @@ static errr Term_text_x11(int x, int y, int n, byte a, cptr s)
/*
* Draw some graphical characters.
*/
-# ifdef USE_TRANSPARENCY
-# ifdef USE_EGO_GRAPHICS
static errr Term_pict_x11(int x, int y, int n, const byte *ap, const char *cp,
const byte *tap, const char *tcp, const byte *eap, const char *ecp)
-# else /* USE_EGO_GRAPHICS */
-static errr Term_pict_x11(int x, int y, int n, const byte *ap, const char *cp,
- const byte *tap, const char *tcp)
-# endif /* USE_EGO_GRAPHICS */
-# else /* USE_TRANSPARENCY */
-static errr Term_pict_x11(int x, int y, int n, const byte *ap, const char *cp)
-# endif /* USE_TRANSPARENCY */
{
int i, x1, y1;
byte a;
char c;
-
-#ifdef USE_TRANSPARENCY
byte ta;
char tc;
int x2, y2;
-# ifdef USE_EGO_GRAPHICS
byte ea;
char ec;
int x3, y3;
- bool has_overlay;
-# endif /* USE_EGO_GRAPHICS */
+ bool_ has_overlay;
int k, l;
unsigned long pixel, blank;
-#endif /* USE_TRANSPARENCY */
term_data *td = (term_data*)(Term->data);
@@ -2626,8 +2598,6 @@ static errr Term_pict_x11(int x, int y, int n, const byte *ap, const char *cp)
x1 = (c & 0x7F) * td->fnt->twid;
y1 = (a & 0x7F) * td->fnt->hgt;
-#ifdef USE_TRANSPARENCY
-
ta = *tap++;
tc = *tcp++;
@@ -2635,8 +2605,6 @@ static errr Term_pict_x11(int x, int y, int n, const byte *ap, const char *cp)
x2 = (tc & 0x7F) * td->fnt->twid;
y2 = (ta & 0x7F) * td->fnt->hgt;
-# ifdef USE_EGO_GRAPHICS
-
ea = *eap++;
ec = *ecp++;
has_overlay = (ea && ec);
@@ -2645,22 +2613,9 @@ static errr Term_pict_x11(int x, int y, int n, const byte *ap, const char *cp)
x3 = (ec & 0x7F) * td->fnt->twid;
y3 = (ea & 0x7F) * td->fnt->hgt;
-# endif /* USE_EGO_GRAPHICS */
-
/* Optimise the common case */
if ((x1 == x2) && (y1 == y2))
{
-# ifndef USE_EGO_GRAPHICS
-
- /* Draw object / terrain */
- XPutImage(Metadpy->dpy, td->win->win,
- clr[0]->gc,
- td->tiles,
- x1, y1,
- x, y,
- td->fnt->twid, td->fnt->hgt);
-# else /* !USE_EGO_GRAPHICS */
-
/* Draw object / terrain */
if (!has_overlay)
{
@@ -2701,8 +2656,6 @@ static errr Term_pict_x11(int x, int y, int n, const byte *ap, const char *cp)
td->fnt->twid, td->fnt->hgt);
}
-# endif /* !USE_EGO_GRAPHICS */
-
}
else
{
@@ -2710,26 +2663,6 @@ static errr Term_pict_x11(int x, int y, int n, const byte *ap, const char *cp)
/* Mega Hack^2 - assume the top left corner is "black" */
blank = XGetPixel(td->tiles, 0, td->fnt->hgt * 6);
-# ifndef USE_EGO_GRAPHICS
-
- for (k = 0; k < td->fnt->twid; k++)
- {
- for (l = 0; l < td->fnt->hgt; l++)
- {
- /* If mask set... */
- if ((pixel = XGetPixel(td->tiles, x1 + k, y1 + l)) == blank)
- {
- /* Output from the terrain */
- pixel = XGetPixel(td->tiles, x2 + k, y2 + l);
- }
-
- /* Store into the temp storage. */
- XPutPixel(td->TmpImage, k, l, pixel);
- }
- }
-
-# else /* !USE_EGO_GRAPHICS */
-
for (k = 0; k < td->fnt->twid; k++)
{
for (l = 0; l < td->fnt->hgt; l++)
@@ -2764,7 +2697,6 @@ static errr Term_pict_x11(int x, int y, int n, const byte *ap, const char *cp)
}
}
-# endif /* !USE_EGO_GRAPHICS */
/* Draw to screen */
@@ -2775,17 +2707,6 @@ static errr Term_pict_x11(int x, int y, int n, const byte *ap, const char *cp)
td->fnt->twid, td->fnt->hgt);
}
-#else /* USE_TRANSPARENCY */
-
-/* Draw object / terrain */
- XPutImage(Metadpy->dpy, td->win->win,
- clr[0]->gc,
- td->tiles,
- x1, y1,
- x, y,
- td->fnt->twid, td->fnt->hgt);
-
-#endif /* USE_TRANSPARENCY */
x += td->fnt->wid;
}
@@ -3070,12 +2991,9 @@ errr init_x11(int argc, char *argv[])
int pict_wid = 0;
int pict_hgt = 0;
- bool force_old_graphics = FALSE;
-
-#ifdef USE_TRANSPARENCY
+ bool_ force_old_graphics = FALSE;
char *TmpData;
-#endif /* USE_TRANSPARENCY */
#endif /* USE_GRAPHICS */
@@ -3253,7 +3171,6 @@ errr init_x11(int argc, char *argv[])
td->fnt->twid, td->fnt->hgt);
}
-#ifdef USE_TRANSPARENCY
/* Initialize the transparency masks */
for (i = 0; i < num_term; i++)
{
@@ -3278,8 +3195,6 @@ errr init_x11(int argc, char *argv[])
td->fnt->twid, td->fnt->hgt, 8, 0);
}
-#endif /* USE_TRANSPARENCY */
-
/* Free tiles_raw? XXX XXX */
}
diff --git a/src/main-xaw.c b/src/main-xaw.c
index 5d5333e9..8795e00d 100644
--- a/src/main-xaw.c
+++ b/src/main-xaw.c
@@ -195,13 +195,9 @@ struct AngbandPart
/* Tiles */
XImage *tiles;
-#ifdef USE_TRANSPARENCY
-
/* Tempory storage for overlaying tiles. */
XImage *TmpImage;
-#endif
-
#endif /* USE_GRAPHICS */
/* Private state */
@@ -446,46 +442,29 @@ static void AngbandOutputText(AngbandWidget widget, int x, int y,
/*
* Draw some graphical characters.
*/
-# ifdef USE_TRANSPARENCY
-# ifdef USE_EGO_GRAPHICS
static void AngbandOutputPict(AngbandWidget widget, int x, int y, int n,
const byte *ap, const char *cp, const byte *tap, const char *tcp,
const byte *eap, const char *ecp)
-# else /* USE_EGO_GRAPHICS */
-static void AngbandOutputPict(AngbandWidget widget, int x, int y, int n,
- const byte *ap, const char *cp, const byte *tap, const char *tcp)
-# endif /* USE_EGO_GRAPHICS */
-# else /* USE_TRANSPARENCY */
-static void AngbandOutputPict(AngbandWidget widget, int x, int y, int n,
- const byte *ap, const char *cp)
-# endif /* USE_TRANSPARENCY */
-
-
{
int i, x1, y1;
byte a;
char c;
-#ifdef USE_TRANSPARENCY
byte ta;
char tc;
int x2, y2;
-# ifdef USE_EGO_GRAPHICS
byte ea;
char ec;
int x3, y3;
- bool has_overlay;
+ bool_ has_overlay;
-# endif /* USE_EGO_GRAPHICS */
int k, l;
unsigned long pixel, blank;
-#endif /* USE_TRANSPARENCY */
-
/* Figure out where to place the text */
y = (y * widget->angband.fontheight + widget->angband.internal_border);
x = (x * widget->angband.fontwidth + widget->angband.internal_border);
@@ -499,8 +478,6 @@ static void AngbandOutputPict(AngbandWidget widget, int x, int y, int n,
x1 = (c & 0x7F) * widget->angband.fontwidth;
y1 = (a & 0x7F) * widget->angband.fontheight;
-#ifdef USE_TRANSPARENCY
-
ta = *tap++;
tc = *tcp++;
@@ -508,8 +485,6 @@ static void AngbandOutputPict(AngbandWidget widget, int x, int y, int n,
x2 = (tc & 0x7F) * widget->angband.fontwidth;
y2 = (ta & 0x7F) * widget->angband.fontheight;
-# ifdef USE_EGO_GRAPHICS
-
ea = *eap++;
ec = *ecp++;
has_overlay = (ea && ec);
@@ -518,25 +493,10 @@ static void AngbandOutputPict(AngbandWidget widget, int x, int y, int n,
x3 = (ec & 0x7F) * widget->angband.fontwidth;
y3 = (ea & 0x7F) * widget->angband.fontheight;
-# endif /* USE_EGO_GRAPHICS */
-
/* Optimise the common case */
if ((x1 == x2) && (y1 == y2))
{
-# ifndef USE_EGO_GRAPHICS
-
- /* Draw object / terrain */
- XPutImage(XtDisplay(widget), XtWindow(widget),
- widget->angband.gc[0],
- widget->angband.tiles,
- x1, y1,
- x, y,
- widget->angband.fontwidth,
- widget->angband.fontheight);
-
-# else /* !USE_EGO_GRAPHICS */
-
/* No overlay */
if (!has_overlay)
{
@@ -586,8 +546,6 @@ static void AngbandOutputPict(AngbandWidget widget, int x, int y, int n,
widget->angband.fontheight);
}
-# endif /* !USE_EGO_GRAPHICS */
-
}
else
{
@@ -595,30 +553,6 @@ static void AngbandOutputPict(AngbandWidget widget, int x, int y, int n,
blank = XGetPixel(widget->angband.tiles,
0, widget->angband.fontheight * 6);
-# ifndef USE_EGO_GRAPHICS
-
- for (k = 0; k < widget->angband.fontwidth; k++)
- {
- for (l = 0; l < widget->angband.fontheight; l++)
- {
- /* If mask set... */
- if ((pixel = XGetPixel(widget->angband.tiles,
- x1 + k, y1 + l)) == blank)
- {
-
- /* Output from the terrain */
- pixel = XGetPixel(widget->angband.tiles,
- x2 + k, y2 + l);
- }
-
- /* Store into the temp storage. */
- XPutPixel(widget->angband.TmpImage,
- k, l, pixel);
- }
- }
-
-#else /* !USE_EGO_GRAPHICS */
-
for (k = 0; k < widget->angband.fontwidth; k++)
{
for (l = 0; l < widget->angband.fontheight; l++)
@@ -657,8 +591,6 @@ static void AngbandOutputPict(AngbandWidget widget, int x, int y, int n,
}
}
-#endif /* !USE_EGO_GRAPHICS */
-
/* Draw to screen */
/* Draw object / terrain */
@@ -671,19 +603,6 @@ static void AngbandOutputPict(AngbandWidget widget, int x, int y, int n,
widget->angband.fontheight);
}
-#else /* USE_TRANSPARENCY */
-
- /* Draw object / terrain */
- XPutImage(XtDisplay(widget), XtWindow(widget),
- widget->angband.gc[0],
- widget->angband.tiles,
- x1, y1,
- x, y,
- widget->angband.fontwidth,
- widget->angband.fontheight);
-
-#endif /* USE_TRANSPARENCY */
-
x += widget->angband.fontwidth;
}
}
@@ -1394,7 +1313,7 @@ static void handle_event(Widget widget, XtPointer client_data, XEvent *event,
/*
* Process an event (or just check for one)
*/
-errr CheckEvent(bool wait)
+errr CheckEvent(bool_ wait)
{
XEvent event;
@@ -1634,30 +1553,13 @@ static errr Term_text_xaw(int x, int y, int n, byte a, cptr s)
/*
* Draw some graphical characters.
*/
-# ifdef USE_TRANSPARENCY
-# ifdef USE_EGO_GRAPHICS
static errr Term_pict_xaw(int x, int y, int n, const byte *ap, const char *cp,
const byte *tap, const char *tcp, const byte *eap, const char *ecp)
-# else /* USE_EGO_GRAPHICS */
-static errr Term_pict_xaw(int x, int y, int n, const byte *ap, const char *cp,
- const byte *tap, const char *tcp)
-# endif /* USE_EGO_GRAPHICS */
-# else /* USE_TRANSPARENCY */
-static errr Term_pict_xaw(int x, int y, int n, const byte *ap, const char *cp)
-# endif /* USE_TRANSPARENCY */
{
term_data *td = (term_data*)(Term->data);
/* Draw the pictures */
-# ifdef USE_TRANSPARENCY
-# ifdef USE_EGO_GRAPHICS
AngbandOutputPict(td->widget, x, y, n, ap, cp, tap, tcp, eap, ecp);
-# else /* USE_EGO_GRAPHICS */
- AngbandOutputPict(td->widget, x, y, n, ap, cp, tap, tcp);
-# endif /* USE_EGO_GRAPHICS */
-# else /* USE_TRANSPARENCY */
- AngbandOutputPict(td->widget, x, y, n, ap, cp);
-# endif /* USE_TRANSPARENCY */
/* Success */
return (0);
@@ -1789,12 +1691,9 @@ errr init_xaw(int argc, char *argv[])
int pict_wid = 0;
int pict_hgt = 0;
- bool force_old_graphics = FALSE;
-
-#ifdef USE_TRANSPARENCY
+ bool_ force_old_graphics = FALSE;
char *TmpData;
-#endif /* USE_TRANSPARENCY */
#endif /* USE_GRAPHICS */
@@ -1947,8 +1846,6 @@ errr init_xaw(int argc, char *argv[])
td->widget->angband.fontheight);
}
-#ifdef USE_TRANSPARENCY
-
/* Initialize the transparency temp storage*/
for (i = 0; i < num_term; i++)
{
@@ -1977,8 +1874,6 @@ errr init_xaw(int argc, char *argv[])
}
-#endif /* USE_TRANSPARENCY */
-
/* Free tiles_raw? XXX XXX */
}
diff --git a/src/main-xxx.c b/src/main-xxx.c
index 43e88e95..c80f01f0 100644
--- a/src/main-xxx.c
+++ b/src/main-xxx.c
@@ -721,7 +721,7 @@ errr init_xxx(void)
* to request the start of a new game or the loading of an old
* game, both of which should launch the "play_game()" function.
*/
-static bool CheckEvents(bool wait)
+static bool_ CheckEvents(bool_ wait)
{
/* XXX XXX XXX */
diff --git a/src/main.c b/src/main.c
index 0727e9f1..48ab3f04 100644
--- a/src/main.c
+++ b/src/main.c
@@ -10,10 +10,6 @@
#include "angband.h"
-/* Use runtime location of lib directory */
-#ifdef ENABLE_BINRELOC
-#include "prefix.h"
-#endif
/*
@@ -47,12 +43,10 @@ static void quit_hook(cptr s)
-#ifdef PRIVATE_USER_PATH
-
/*
* Check and create if needed the directory dirpath
*/
-bool private_check_user_directory(cptr dirpath)
+bool_ private_check_user_directory(cptr dirpath)
{
/* Is this used anywhere else in *bands? */
struct stat stat_buf;
@@ -94,7 +88,7 @@ bool private_check_user_directory(cptr dirpath)
* home directory or try to create it if it doesn't exist.
* Returns FALSE if all the attempts fail.
*/
-static bool check_create_user_dir(void)
+static bool_ check_create_user_dir(void)
{
char dirpath[1024];
char versionpath[1024];
@@ -110,8 +104,6 @@ static bool check_create_user_dir(void)
return private_check_user_directory(dirpath) && private_check_user_directory(versionpath) && private_check_user_directory(savepath);
}
-#endif /* PRIVATE_USER_PATH */
-
/*
* Initialize and verify the file paths, and the score file.
@@ -138,11 +130,7 @@ static void init_stuff(void)
tail = getenv("TOME_PATH");
/* Use the angband_path, or a default */
-#ifndef ENABLE_BINRELOC
strcpy(path, tail ? tail : DEFAULT_PATH);
-#else /* Runtime lookup of location */
- strcpy(path, br_strcat(DATADIR, "/tome/lib"));
-#endif
/* Hack -- Add a path separator (only if needed) */
if (!suffix(path, PATH_SEP)) strcat(path, PATH_SEP);
@@ -217,18 +205,6 @@ static void change_path(cptr info)
break;
}
-#ifdef VERIFY_SAVEFILE
-
- case 'b':
- case 'd':
- case 'e':
- case 's':
- {
- quit_fmt("Restricted option '-d%s'", info);
- }
-
-#else /* VERIFY_SAVEFILE */
-
case 'd':
{
string_free(ANGBAND_DIR_DATA);
@@ -250,8 +226,6 @@ static void change_path(cptr info)
break;
}
-#endif /* VERIFY_SAVEFILE */
-
default:
{
quit_fmt("Bad semantics in '-d%s'", info);
@@ -271,15 +245,15 @@ int main(int argc, char *argv[])
{
int i;
- bool done = FALSE;
+ bool_ done = FALSE;
- bool new_game = FALSE;
+ bool_ new_game = FALSE;
int show_score = 0;
cptr mstr = NULL;
- bool args = TRUE;
+ bool_ args = TRUE;
#ifdef CHECK_MEMORY_LEAKS
GC_find_leak = 1;
@@ -290,111 +264,27 @@ int main(int argc, char *argv[])
argv0 = argv[0];
-#ifdef SET_UID
-
/* Default permissions on files */
(void)umask(022);
-#endif /* SET_UID */
-
/* Get the file paths */
init_stuff();
-#ifdef SET_UID
-
/* Get the user id (?) */
player_uid = getuid();
-# ifdef SAFE_SETUID
-
-# ifdef _POSIX_SAVED_IDS
-
- /* Save some info for later */
- player_euid = geteuid();
- player_egid = getegid();
-
-# endif
-
-# if 0 /* XXX XXX XXX */
-
- /* Redundant setting necessary in case root is running the game */
- /* If not root or game not setuid the following two calls do nothing */
-
- if (setgid(getegid()) != 0)
- {
- quit("setgid(): cannot set permissions correctly!");
- }
-
- if (setuid(geteuid()) != 0)
- {
- quit("setuid(): cannot set permissions correctly!");
- }
-
-# endif /* XXX XXX XXX */
-
-# endif /* SAFE_SETUID */
-
-#endif /* SET_UID */
-
-
-#ifdef SET_UID
-
- /* Please note that the game is still running in the game's permission */
-
- /* Initialize the "time" checker */
- if (check_time_init() || check_time())
- {
- quit("The gates to Angband are closed (bad time).");
- }
-
- /* Initialize the "load" checker */
- if (check_load_init() || check_load())
- {
- quit("The gates to Angband are closed (bad load).");
- }
-
-
- /*
- * Become user -- This will be the normal state for the rest of the game.
- *
- * Put this here because it's totally irrelevant to single user operating
- * systems, as witnessed by huge number of cases where these functions
- * weren't used appropriately (at least in this variant).
- *
- * Whenever it is necessary to open/remove/move the files in the lib folder,
- * this convention must be observed:
- *
- * safe_setuid_grab();
- *
- * fd_open/fd_make/fd_kill/fd_move which requires game's permission,
- * i.e. manipulating files under the lib directory
- *
- * safe_setuid_drop();
- *
- * Please never ever make unmatched calls to these grab/drop functions.
- *
- * Please note that temporary files used by various information commands
- * and ANGBAND_DIR_USER files shouldn't be manipulated this way, because
- * they reside outside of the lib directory on multiuser installations.
- * -- pelpel
- */
- safe_setuid_drop();
-
-
/* Acquire the "user name" as a default player name */
user_name(player_name, player_uid);
-#ifdef PRIVATE_USER_PATH
-
/*
* On multiuser systems, users' private directories are
* used to store pref files, chardumps etc.
*/
{
- bool ret;
+ bool_ ret;
/* Create a directory for the user's files */
ret = check_create_user_dir();
@@ -403,10 +293,6 @@ int main(int argc, char *argv[])
if (ret == FALSE) quit("Cannot create directory " PRIVATE_USER_PATH);
}
-#endif /* PRIVATE_USER_PATH */
-
-#endif /* SET_UID */
-
@@ -525,14 +411,6 @@ int main(int argc, char *argv[])
return 0;
}
- case 'c':
- case 'C':
- {
- chg_to_txt(argv[i + 1], argv[i + 2]);
-
- return 0;
- }
-
case 'd':
case 'D':
{
@@ -572,26 +450,12 @@ usage:
puts(" -o Request original keyset");
puts(" -r Request rogue-like keyset");
puts(" -H <list of files> Convert helpfile to html");
- puts(" -c f1 f2 Convert changelog f1 to nice txt f2");
puts(" -s<num> Show <num> high scores");
puts(" -u<who> Use your <who> savefile");
puts(" -M<which> Use the <which> module");
puts(" -m<sys> Force 'main-<sys>.c' usage");
puts(" -d<def> Define a 'lib' dir sub-path");
-#ifdef USE_GTK
- puts(" -mgtk To use GTK");
- puts(" -- Sub options");
- puts(" -- -n# Number of terms to use");
- puts(" -- -b Turn off software backing store");
-# ifdef USE_GRAPHICS
- puts(" -- -s Turn off smoothscaling graphics");
- puts(" -- -o Requests \"old\" graphics");
- puts(" -- -g Requests \"new\" graphics");
- puts(" -- -t Enable transparency effect");
-# endif /* USE_GRAPHICS */
-#endif /* USE_GTK */
-
#ifdef USE_GTK2
puts(" -mgtk2 To use GTK2");
puts(" -- Sub options");
@@ -634,22 +498,10 @@ usage:
puts(" -- -b Requests big screen");
#endif /* USE_GCU */
-#ifdef USE_CAP
- puts(" -mcap To use termcap");
-#endif /* USE_CAP */
-
-#ifdef USE_DOS
- puts(" -mdos To use Allegro");
-#endif /* USE_DOS */
-
#ifdef USE_SLA
puts(" -msla To use SLang");
#endif /* USE_SLA */
-#ifdef USE_ISO
- puts(" -miso To use ISO");
-#endif /* USE_ISO */
-
#ifdef USE_SDL
puts(" -msdl To use SDL");
puts(" -- Sub options");
@@ -687,10 +539,6 @@ usage:
quit_aux = quit_hook;
- /* Install the zsock hooks we cannot do it later because main-net needs them */
- zsock_init();
-
-
#ifdef USE_GLU
/* Attempt to use the "main-glu.c" support */
if (!done && (!mstr || (streq(mstr, "glu"))))
@@ -782,32 +630,6 @@ usage:
}
#endif
-#ifdef USE_CAP
- /* Attempt to use the "main-cap.c" support */
- if (!done && (!mstr || (streq(mstr, "cap"))))
- {
- extern errr init_cap(int, char**);
- if (0 == init_cap(argc, argv))
- {
- ANGBAND_SYS = "cap";
- done = TRUE;
- }
- }
-#endif
-
-
-#ifdef USE_DOS
- /* Attempt to use the "main-dos.c" support */
- if (!done && (!mstr || (streq(mstr, "dos"))))
- {
- extern errr init_dos(void);
- if (0 == init_dos())
- {
- ANGBAND_SYS = "dos";
- done = TRUE;
- }
- }
-#endif
#ifdef USE_SLA
/* Attempt to use the "main-sla.c" support */
@@ -823,58 +645,6 @@ usage:
#endif
-#ifdef USE_PARAGUI
- /* Attempt to use the "main-pgu.c" support */
- if (!done && (!mstr || (streq(mstr, "pgu"))))
- {
- extern errr init_pgu(int, char**);
- if (0 == init_pgu(argc, argv))
- {
- ANGBAND_SYS = "pgu";
- done = TRUE;
- }
- }
-#endif
-
-#ifdef USE_ISO
- /* Attempt to use the "main-iso.c" support */
- if (!done && (!mstr || (streq(mstr, "iso"))))
- {
- extern errr init_iso(int, char**);
- if (0 == init_iso(argc, argv))
- {
- ANGBAND_SYS = "iso";
- done = TRUE;
- }
- }
-#endif
-
-#ifdef USE_LUA_GUI
- /* Attempt to use the "main-lua.c" support */
- if (!done && (!mstr || (streq(mstr, "lua"))))
- {
- extern errr init_lua_gui(int, char**);
- if (0 == init_lua_gui(argc, argv))
- {
- ANGBAND_SYS = "lua";
- done = TRUE;
- }
- }
-#endif
-
-#ifdef USE_NET
- /* Attempt to use the "main-net.c" support */
- if (!done && (!mstr || (streq(mstr, "net"))))
- {
- extern errr init_net(int, char**);
- if (0 == init_net(argc, argv))
- {
- ANGBAND_SYS = "net";
- done = TRUE;
- }
- }
-#endif
-
#ifdef USE_SDL
/* Attempt to use the "main-sdl.c" support */
if (!done && (!mstr || (streq(mstr, "sdl"))))
diff --git a/src/melee1.c b/src/melee1.c
index 9e34c110..4e5d3208 100644
--- a/src/melee1.c
+++ b/src/melee1.c
@@ -115,10 +115,91 @@ static cptr desc_moan[] =
"says she is always happy."
};
+
+/*
+ * Get the "power" of an attack of given effect type.
+ */
+int get_attack_power(int effect)
+{
+ switch (effect)
+ {
+ case RBE_HURT:
+ return 60;
+ case RBE_POISON:
+ return 5;
+ case RBE_UN_BONUS:
+ return 20;
+ case RBE_UN_POWER:
+ return 15;
+ case RBE_EAT_GOLD:
+ return 5;
+ case RBE_EAT_ITEM:
+ return 5;
+ case RBE_EAT_FOOD:
+ return 5;
+ case RBE_EAT_LITE:
+ return 5;
+ case RBE_ACID:
+ return 0;
+ case RBE_ELEC:
+ return 10;
+ case RBE_FIRE:
+ return 10;
+ case RBE_COLD:
+ return 10;
+ case RBE_BLIND:
+ return 2;
+ case RBE_CONFUSE:
+ return 10;
+ case RBE_TERRIFY:
+ return 10;
+ case RBE_PARALYZE:
+ return 2;
+ case RBE_LOSE_STR:
+ return 0;
+ case RBE_LOSE_DEX:
+ return 0;
+ case RBE_LOSE_CON:
+ return 0;
+ case RBE_LOSE_INT:
+ return 0;
+ case RBE_LOSE_WIS:
+ return 0;
+ case RBE_LOSE_CHR:
+ return 0;
+ case RBE_LOSE_ALL:
+ return 2;
+ case RBE_SHATTER:
+ return 60;
+ case RBE_EXP_10:
+ return 5;
+ case RBE_EXP_20:
+ return 5;
+ case RBE_EXP_40:
+ return 5;
+ case RBE_EXP_80:
+ return 5;
+ case RBE_DISEASE:
+ return 5;
+ case RBE_TIME:
+ return 5;
+ case RBE_SANITY:
+ return 60;
+ case RBE_HALLU:
+ return 10;
+ case RBE_PARASITE:
+ return 5;
+ case RBE_ABOMINATION:
+ return 30;
+ }
+ /* Unknown effects have no power */
+ return 0;
+}
+
/*
* Attack the player via physical attacks.
*/
-bool carried_make_attack_normal(int r_idx)
+bool_ carried_make_attack_normal(int r_idx)
{
monster_race *r_ptr = &r_info[r_idx];
@@ -130,9 +211,7 @@ bool carried_make_attack_normal(int r_idx)
char ddesc[80] = "your symbiote";
cptr sym_name = symbiote_name(TRUE);
- bool blinked;
- bool touched = FALSE, alive = TRUE;
- bool explode = FALSE;
+ bool_ touched = FALSE, alive = TRUE;
/* Not allowed to attack */
if (r_ptr->flags1 & (RF1_NEVER_BLOW)) return (FALSE);
@@ -143,14 +222,11 @@ bool carried_make_attack_normal(int r_idx)
/* Extract the effective monster level */
rlev = ((r_ptr->level >= 1) ? r_ptr->level : 1);
- /* 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;
+ bool_ visible = FALSE;
+ bool_ obvious = FALSE;
int power = 0;
int damage = 0;
@@ -177,119 +253,8 @@ bool carried_make_attack_normal(int r_idx)
/* Extract visibility (before blink) */
visible = TRUE;
-#if 0
-
- /* Extract visibility from carrying lite */
- if (r_ptr->flags9 & RF9_HAS_LITE) visible = TRUE;
-
-#endif /* 0 */
-
/* 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;
- case RBE_DISEASE:
- power = 5;
- break;
- case RBE_TIME:
- power = 5;
- break;
- case RBE_SANITY:
- power = 60;
- break;
- case RBE_HALLU:
- power = 10;
- break;
- case RBE_PARASITE:
- power = 5;
- break;
- case RBE_ABOMINATION:
- power = 30;
- break;
- }
+ power = get_attack_power(effect);
/* Monster hits player */
@@ -462,7 +427,6 @@ bool carried_make_attack_normal(int r_idx)
case RBM_EXPLODE:
{
act = "explodes.";
- explode = TRUE;
break;
}
@@ -1080,7 +1044,7 @@ bool carried_make_attack_normal(int r_idx)
if (randint(100) < 11)
{
/* 1% chance for perm. damage */
- bool perm = (randint(10) == 1);
+ bool_ perm = (randint(10) == 1);
if (dec_stat(A_CON, randint(10), perm)) obvious = TRUE;
}
@@ -1361,7 +1325,7 @@ void black_breath_attack(int chance)
/*
* Attack the player via physical attacks.
*/
-bool make_attack_normal(int m_idx, byte divis)
+bool_ make_attack_normal(int m_idx, byte divis)
{
monster_type *m_ptr = &m_list[m_idx];
@@ -1382,9 +1346,9 @@ bool make_attack_normal(int m_idx, byte divis)
char ddesc[80];
- bool blinked;
- bool touched = FALSE, fear = FALSE, alive = TRUE;
- bool explode = FALSE;
+ bool_ blinked;
+ bool_ touched = FALSE, fear = FALSE, alive = TRUE;
+ bool_ explode = FALSE;
/* Not allowed to attack */
if (r_ptr->flags1 & (RF1_NEVER_BLOW)) return (FALSE);
@@ -1419,8 +1383,8 @@ bool make_attack_normal(int m_idx, byte divis)
/* Scan through all four blows */
for (ap_cnt = 0; ap_cnt < 4; ap_cnt++)
{
- bool visible = FALSE;
- bool obvious = FALSE;
+ bool_ visible = FALSE;
+ bool_ obvious = FALSE;
int power = 0;
int damage = 0;
@@ -1447,13 +1411,6 @@ bool make_attack_normal(int m_idx, byte divis)
/* Extract visibility (before blink) */
if (m_ptr->ml) visible = TRUE;
-#if 0
-
- /* Extract visibility from carrying lite */
- if (r_ptr->flags9 & RF9_HAS_LITE) visible = TRUE;
-
-#endif
-
/* Extract the attack "power" */
switch (effect)
{
@@ -1572,7 +1529,9 @@ bool make_attack_normal(int m_idx, byte divis)
if ((chance > 0) && magik(chance))
{
- msg_format("You dodge %s attack!", m_name);
+ char m_poss[80];
+ monster_desc(m_poss, m_ptr, 0x06);
+ msg_format("You dodge %s attack!", m_poss);
continue;
}
@@ -2215,8 +2174,7 @@ bool make_attack_normal(int m_idx, byte divis)
}
/* Steal the items */
- inven_item_increase(i, -1);
- inven_item_optimize(i);
+ inc_stack_size_ex(i, -1, OPTIMIZE, NO_DESCRIBE);
/* Obvious */
obvious = TRUE;
@@ -2260,8 +2218,7 @@ bool make_attack_normal(int m_idx, byte divis)
o_name, index_to_label(i));
/* Steal the items */
- inven_item_increase(i, -1);
- inven_item_optimize(i);
+ inc_stack_size_ex(i, -1, OPTIMIZE, NO_DESCRIBE);
/* Obvious */
obvious = TRUE;
@@ -2711,7 +2668,7 @@ bool make_attack_normal(int m_idx, byte divis)
if (randint(100) < 11)
{
/* 1% chance for perm. damage */
- bool perm = (randint(10) == 1);
+ bool_ perm = (randint(10) == 1);
if (dec_stat(A_CON, randint(10), perm)) obvious = TRUE;
}
diff --git a/src/melee2.c b/src/melee2.c
index 804b8f12..6ada6bd0 100644
--- a/src/melee2.c
+++ b/src/melee2.c
@@ -26,7 +26,7 @@
* Based on mon_take_hit... all monster attacks on
* other monsters should use
*/
-bool mon_take_hit_mon(int s_idx, int m_idx, int dam, bool *fear, cptr note)
+bool_ mon_take_hit_mon(int s_idx, int m_idx, int dam, bool_ *fear, cptr note)
{
monster_type *m_ptr = &m_list[m_idx], *s_ptr = &m_list[s_idx];
@@ -258,7 +258,7 @@ bool mon_take_hit_mon(int s_idx, int m_idx, int dam, bool *fear, cptr note)
/*
* Internal probability routine
*/
-static bool int_outof(monster_race *r_ptr, int prob)
+static bool_ int_outof(monster_race *r_ptr, int prob)
{
/* Non-Smart monsters are half as "smart" */
if (!(r_ptr->flags2 & (RF2_SMART))) prob = prob / 2;
@@ -552,7 +552,7 @@ static void remove_bad_spells(int m_idx, u32b *f4p, u32b *f5p, u32b *f6p)
* Determine if there is a space near the player in which
* a summoned creature can appear
*/
-static bool summon_possible(int y1, int x1)
+static bool_ summon_possible(int y1, int x1)
{
int y, x;
@@ -594,7 +594,7 @@ static bool summon_possible(int y1, int x1)
* 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)
+static bool_ clean_shot(int y1, int x1, int y2, int x2)
{
int dist, y, x;
@@ -642,7 +642,7 @@ static void bolt(int m_idx, int typ, int dam_hp)
/*
* Return TRUE if a spell is good for hurting the player (directly).
*/
-static bool spell_attack(byte spell)
+static bool_ spell_attack(byte spell)
{
/* All RF4 spells hurt (except for shriek, multiply, summon animal) */
if (spell >= 96 + 3 && spell <= 96 + 31) return (TRUE);
@@ -664,7 +664,7 @@ static bool spell_attack(byte spell)
/*
* Return TRUE if a spell is good for escaping.
*/
-static bool spell_escape(byte spell)
+static bool_ spell_escape(byte spell)
{
/* Blink or Teleport */
if (spell == 160 + 4 || spell == 160 + 5) return (TRUE);
@@ -679,7 +679,7 @@ static bool spell_escape(byte spell)
/*
* Return TRUE if a spell is good for annoying the player.
*/
-static bool spell_annoy(byte spell)
+static bool_ spell_annoy(byte spell)
{
/* Shriek */
if (spell == 96 + 0) return (TRUE);
@@ -693,11 +693,6 @@ static bool spell_annoy(byte spell)
/* Teleport to */
if (spell == 160 + 6) return (TRUE);
-#if 0
- /* Hand of Doom */
- if (spell == 160 + 1) return (TRUE);
-#endif
-
/* Darkness, make traps, cause amnesia */
if (spell >= 160 + 9 && spell <= 160 + 11) return (TRUE);
@@ -708,7 +703,7 @@ static bool spell_annoy(byte spell)
/*
* Return TRUE if a spell summons help.
*/
-static bool spell_summon(byte spell)
+static bool_ spell_summon(byte spell)
{
/* RF4_S_ANIMAL, RF6_S_ANIMALS */
if (spell == 96 + 2 || spell == 160 + 3) return (TRUE);
@@ -723,7 +718,7 @@ static bool spell_summon(byte spell)
/*
* Return TRUE if a spell is good in a tactical situation.
*/
-static bool spell_tactic(byte spell)
+static bool_ spell_tactic(byte spell)
{
/* Blink */
if (spell == 160 + 4) return (TRUE);
@@ -736,7 +731,7 @@ static bool spell_tactic(byte spell)
/*
* Return TRUE if a spell hastes.
*/
-static bool spell_haste(byte spell)
+static bool_ spell_haste(byte spell)
{
/* Haste self */
if (spell == 160 + 0) return (TRUE);
@@ -749,7 +744,7 @@ static bool spell_haste(byte spell)
/*
* Return TRUE if a spell is good for healing.
*/
-static bool spell_heal(byte spell)
+static bool_ spell_heal(byte spell)
{
/* Heal */
if (spell == 160 + 2) return (TRUE);
@@ -998,7 +993,7 @@ void cmonster_msg(char a, cptr fmt, ...)
* at another monster.
*/
int monst_spell_monst_spell = -1;
-static bool monst_spell_monst(int m_idx)
+static bool_ monst_spell_monst(int m_idx)
{
int y = 0, x = 0;
int i = 1, k, t_idx;
@@ -1013,21 +1008,21 @@ static bool monst_spell_monst(int m_idx)
monster_type *t_ptr; /* Putative target */
monster_race *tr_ptr;
u32b f4, f5, f6; /* racial spell flags */
- bool direct = TRUE;
- bool wake_up = FALSE;
+ bool_ direct = TRUE;
+ bool_ wake_up = FALSE;
/* Extract the blind-ness */
- bool blind = (p_ptr->blind ? TRUE : FALSE);
+ bool_ blind = (p_ptr->blind ? TRUE : FALSE);
/* Extract the "see-able-ness" */
- bool seen = (!blind && m_ptr->ml);
+ bool_ seen = (!blind && m_ptr->ml);
- bool see_m;
- bool see_t;
- bool see_either;
- bool see_both;
+ bool_ see_m;
+ bool_ see_t;
+ bool_ see_either;
+ bool_ see_both;
- bool friendly = FALSE;
+ bool_ friendly = FALSE;
if (is_friend(m_ptr) > 0) friendly = TRUE;
@@ -1154,9 +1149,6 @@ static bool monst_spell_monst(int m_idx)
if (disturb_other) disturb(1, 0);
if (!see_m) monster_msg("You hear a shriek.");
else monster_msg("%^s shrieks at %s.", m_name, t_name);
-#if 0
- aggravate_monsters(m_idx);
-#endif
wake_up = TRUE;
break;
}
@@ -1741,7 +1733,7 @@ static bool monst_spell_monst(int m_idx)
}
else
{
- bool fear;
+ bool_ fear;
monster_msg("%^s is blasted by psionic energy.", t_name);
t_ptr->confused += rand_int(4) + 4;
@@ -1784,7 +1776,7 @@ static bool monst_spell_monst(int m_idx)
}
else
{
- bool fear;
+ bool_ fear;
if (see_t)
{
monster_msg("%^s is blasted by psionic energy.", t_name);
@@ -1812,7 +1804,7 @@ static bool monst_spell_monst(int m_idx)
}
else
{
- bool fear;
+ bool_ fear;
mon_take_hit_mon(m_idx, t_idx, damroll(3, 8), &fear, " is destroyed.");
}
wake_up = TRUE;
@@ -1832,7 +1824,7 @@ static bool monst_spell_monst(int m_idx)
}
else
{
- bool fear;
+ bool_ fear;
mon_take_hit_mon(m_idx, t_idx, damroll(8, 8), &fear, " is destroyed.");
}
wake_up = TRUE;
@@ -1852,7 +1844,7 @@ static bool monst_spell_monst(int m_idx)
}
else
{
- bool fear;
+ bool_ fear;
mon_take_hit_mon(m_idx, t_idx, damroll(10, 15), &fear, " is destroyed.");
}
wake_up = TRUE;
@@ -1872,7 +1864,7 @@ static bool monst_spell_monst(int m_idx)
}
else
{
- bool fear;
+ bool_ fear;
mon_take_hit_mon(m_idx, t_idx, damroll(15, 15), &fear, " is destroyed.");
}
wake_up = TRUE;
@@ -2300,7 +2292,7 @@ static bool monst_spell_monst(int m_idx)
if (!direct) break;
else
{
- bool resists_tele = FALSE;
+ bool_ resists_tele = FALSE;
if (disturb_other) disturb(1, 0);
monster_msg("%^s teleports %s away.", m_name, t_name);
@@ -2690,14 +2682,6 @@ static bool monst_spell_monst(int m_idx)
count += summon_specific(y, x, rlev, SUMMON_WRAITH);
}
-#if 0
- /* these are not Lords of Amber... */
- for (k = 0; k < 12; k++)
- {
- count += summon_specific(y, x, rlev, SUMMON_HI_UNDEAD);
- }
-#endif
-
if (blind && count)
{
monster_msg("You hear immortal beings appear nearby.");
@@ -2780,7 +2764,7 @@ static bool monst_spell_monst(int m_idx)
void curse_equipment(int chance, int heavy_chance)
{
- bool changed = FALSE;
+ bool_ changed = FALSE;
u32b o1, o2, o3, o4, esp, o5;
object_type * o_ptr =
&p_ptr->inventory[rand_range(INVEN_WIELD, INVEN_TOTAL - 1)];
@@ -2836,7 +2820,7 @@ void curse_equipment(int chance, int heavy_chance)
void curse_equipment_dg(int chance, int heavy_chance)
{
- bool changed = FALSE;
+ bool_ changed = FALSE;
u32b o1, o2, o3, o4, esp, o5;
object_type * o_ptr =
&p_ptr->inventory[rand_range(INVEN_WIELD, INVEN_TOTAL - 1)];
@@ -2947,7 +2931,7 @@ void curse_equipment_dg(int chance, int heavy_chance)
* Note the special "MFLAG_NICE" flag, which prevents a monster from using
* any spell attacks until the player has had a single chance to move.
*/
-bool make_attack_spell(int m_idx)
+bool_ make_attack_spell(int m_idx)
{
int k, chance, thrown_spell, rlev, failrate;
byte spell[96], num = 0;
@@ -2955,23 +2939,23 @@ bool make_attack_spell(int m_idx)
monster_type *m_ptr = &m_list[m_idx];
monster_race *r_ptr = race_inf(m_ptr);
char m_name[80];
- bool no_inate = FALSE;
+ bool_ no_inate = FALSE;
int x, y;
/* Summon count */
int count = 0;
/* Extract the blind-ness */
- bool blind = (p_ptr->blind ? TRUE : FALSE);
+ bool_ blind = (p_ptr->blind ? TRUE : FALSE);
/* Extract the "see-able-ness" */
- bool seen = (!blind && m_ptr->ml);
+ bool_ seen = (!blind && m_ptr->ml);
/* Assume "normal" target */
- bool normal = TRUE;
+ bool_ normal = TRUE;
/* Assume "projectable" */
- bool direct = TRUE;
+ bool_ direct = TRUE;
/* Target location */
if (m_ptr->target > -1)
@@ -4604,14 +4588,6 @@ bool make_attack_spell(int m_idx)
count += summon_specific(y, x, rlev, SUMMON_WRAITH);
}
-#if 0
- /* these are not Lords of Amber... */
- for (k = 0; k < 12; k++)
- {
- count += summon_specific(y, x, rlev, SUMMON_HI_UNDEAD);
- }
-#endif
-
if (blind && count)
{
msg_print("You hear immortal beings appear nearby.");
@@ -4783,7 +4759,7 @@ static int mon_will_run(int m_idx)
* 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)
+static bool_ get_fear_moves_aux(int m_idx, int *yp, int *xp)
{
int y, x, y1, x1, fy, fx, gy = 0, gx = 0;
int when = 0, score = -1;
@@ -4875,7 +4851,7 @@ static bool get_fear_moves_aux(int m_idx, int *yp, int *xp)
*
* Return TRUE if a safe location is available.
*/
-static bool find_safety(int m_idx, int *yp, int *xp)
+static bool_ find_safety(int m_idx, int *yp, int *xp)
{
monster_type *m_ptr = &m_list[m_idx];
@@ -4954,7 +4930,7 @@ static bool find_safety(int m_idx, int *yp, int *xp)
*
* Return TRUE if a good location is available.
*/
-static bool find_hiding(int m_idx, int *yp, int *xp)
+static bool_ find_hiding(int m_idx, int *yp, int *xp)
{
monster_type *m_ptr = &m_list[m_idx];
@@ -5102,7 +5078,7 @@ static void get_target_monster(int m_idx)
/*
* Choose "logical" directions for monster movement
*/
-static bool get_moves(int m_idx, int *mm)
+static bool_ get_moves(int m_idx, int *mm)
{
monster_type *m_ptr = &m_list[m_idx];
monster_race *r_ptr = race_inf(m_ptr);
@@ -5113,7 +5089,7 @@ static bool get_moves(int m_idx, int *mm)
int y2 = p_ptr->py;
int x2 = p_ptr->px;
- bool done = FALSE;
+ bool_ done = FALSE;
/* Oups get nearer */
if ((is_friend(m_ptr) > 0) && (m_ptr->cdis > p_ptr->pet_follow_distance))
@@ -5498,7 +5474,7 @@ int check_hit2(int power, int level, int ac)
/* Monster attacks monster */
-static bool monst_attack_monst(int m_idx, int t_idx)
+static bool_ 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 = race_inf(m_ptr);
@@ -5507,9 +5483,9 @@ static bool monst_attack_monst(int m_idx, int t_idx)
int ac, rlev, pt;
char m_name[80], t_name[80];
char ddesc[80], temp[80];
- bool blinked = FALSE, touched = FALSE;
- bool explode = FALSE;
- bool fear = FALSE;
+ bool_ blinked = FALSE, touched = FALSE;
+ bool_ explode = FALSE;
+ bool_ fear = FALSE;
byte y_saver = t_ptr->fy;
byte x_saver = t_ptr->fx;
@@ -5544,8 +5520,8 @@ static bool monst_attack_monst(int m_idx, int t_idx)
/* Scan through all four blows */
for (ap_cnt = 0; ap_cnt < 4; ap_cnt++)
{
- bool visible = FALSE;
- bool obvious = FALSE;
+ bool_ visible = FALSE;
+ bool_ obvious = FALSE;
int power = 0;
int damage = 0;
@@ -5581,111 +5557,7 @@ static bool monst_attack_monst(int m_idx, int t_idx)
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;
- case RBE_DISEASE:
- power = 5;
- break;
- case RBE_TIME:
- power = 5;
- break;
- case RBE_SANITY:
- power = 60;
- break;
- case RBE_HALLU:
- power = 10;
- break;
- case RBE_PARASITE:
- power = 5;
- break;
- case RBE_ABOMINATION:
- power = 20;
- break;
- }
+ power = get_attack_power(effect);
/* Monster hits*/
@@ -6158,7 +6030,7 @@ static bool monst_attack_monst(int m_idx, int t_idx)
static u32b noise = 0L;
/* Determine whether the player is invisible to a monster */
-static bool player_invis(monster_type * m_ptr)
+static bool_ player_invis(monster_type * m_ptr)
{
s16b inv, mlv;
monster_race *r_ptr = race_inf(m_ptr);
@@ -6222,7 +6094,7 @@ static bool player_invis(monster_type * m_ptr)
*
* A "direction" of "5" means "pick a random direction".
*/
-static void process_monster(int m_idx, bool is_frien)
+static void process_monster(int m_idx, bool_ is_frien)
{
monster_type *m_ptr = &m_list[m_idx];
monster_race *r_ptr = race_inf(m_ptr);
@@ -6234,21 +6106,21 @@ static void process_monster(int m_idx, bool is_frien)
monster_type *y_ptr;
- bool do_turn;
- bool do_move;
- bool do_view;
-
- bool did_open_door;
- bool did_bash_door;
- bool did_take_item;
- bool did_kill_item;
- bool did_move_body;
- bool did_kill_body;
- bool did_pass_wall;
- bool did_kill_wall;
- bool gets_angry = FALSE;
- bool inv;
- bool xxx = FALSE;
+ bool_ do_turn;
+ bool_ do_move;
+ bool_ do_view;
+
+ bool_ did_open_door;
+ bool_ did_bash_door;
+ bool_ did_take_item;
+ bool_ did_kill_item;
+ bool_ did_move_body;
+ bool_ did_kill_body;
+ bool_ did_pass_wall;
+ bool_ did_kill_wall;
+ bool_ gets_angry = FALSE;
+ bool_ inv;
+ bool_ xxx = FALSE;
inv = player_invis(m_ptr);
@@ -6845,7 +6717,7 @@ static void process_monster(int m_idx, bool is_frien)
(c_ptr->feat <= FEAT_DOOR_TAIL)) ||
(c_ptr->feat == FEAT_SECRET))
{
- bool may_bash = TRUE;
+ bool_ may_bash = TRUE;
/* Take a turn */
do_turn = TRUE;
@@ -6872,12 +6744,6 @@ static void process_monster(int m_idx, bool is_frien)
/* Door power */
k = ((c_ptr->feat - FEAT_DOOR_HEAD) & 0x07);
-#if 0
- /* XXX XXX XXX Old test (pval 10 to 20) */
- if (randint((m_ptr->hp + 1) * (50 + o_ptr->pval)) <
- 40 * (m_ptr->hp - 10 - o_ptr->pval));
-#endif
-
/* Try to unlock it XXX XXX XXX */
if (rand_int(m_ptr->hp / 10) > k)
{
@@ -6899,12 +6765,6 @@ static void process_monster(int m_idx, bool is_frien)
/* Door power */
k = ((c_ptr->feat - FEAT_DOOR_HEAD) & 0x07);
-#if 0
- /* XXX XXX XXX Old test (pval 10 to 20) */
- if (randint((m_ptr->hp + 1) * (50 + o_ptr->pval)) <
- 40 * (m_ptr->hp - 10 - o_ptr->pval));
-#endif
-
/* Attempt to Bash XXX XXX XXX */
if (rand_int(m_ptr->hp / 10) > k)
{
@@ -7016,7 +6876,7 @@ static void process_monster(int m_idx, bool is_frien)
{
if (inscription_info[c_ptr->inscription].when & INSCRIP_EXEC_MONST_WALK)
{
- bool t;
+ bool_ t;
t = execute_inscription(c_ptr->inscription, ny, nx);
if (!t && do_move)
{
@@ -7033,11 +6893,6 @@ static void process_monster(int m_idx, bool is_frien)
if (do_move && (ny == p_ptr->py) && (nx == p_ptr->px) &&
(r_ptr->flags1 & RF1_NEVER_BLOW))
{
-#if 0
- /* Hack -- memorize lack of attacks */
- if (m_ptr->ml) r_ptr->r_flags1 |= (RF1_NEVER_BLOW);
-#endif
-
/* Do not move */
do_move = FALSE;
}
@@ -7524,14 +7379,13 @@ void process_monsters(void)
int i, e;
int fx, fy;
- bool test;
- bool is_frien = FALSE;
+ bool_ test;
+ bool_ is_frien = FALSE;
monster_type *m_ptr;
monster_race *r_ptr;
int old_monster_race_idx;
- int old_monster_ego_idx;
u32b old_r_flags1 = 0L;
u32b old_r_flags2 = 0L;
@@ -7554,7 +7408,6 @@ void process_monsters(void)
/* Memorize old race */
old_monster_race_idx = monster_race_idx;
- old_monster_ego_idx = monster_ego_idx;
/* Acquire knowledge */
if (monster_race_idx)
diff --git a/src/modules.c b/src/modules.c
index ceb3e81d..39b41d20 100644
--- a/src/modules.c
+++ b/src/modules.c
@@ -12,8 +12,6 @@
#include "angband.h"
-#ifdef PRIVATE_USER_PATH
-
static void module_reset_dir_aux(cptr *dir, cptr new_path)
{
char buf[1024];
@@ -29,8 +27,6 @@ static void module_reset_dir_aux(cptr *dir, cptr new_path)
quit(format("Unable to create module dir %s\n", *dir));
}
-#endif
-
void module_reset_dir(cptr dir, cptr new_path)
{
cptr *d = 0;
@@ -51,9 +47,6 @@ void module_reset_dir(cptr dir, cptr new_path)
if (!strcmp(dir, "user")) d = &ANGBAND_DIR_USER;
if (!strcmp(dir, "note")) d = &ANGBAND_DIR_NOTE;
if (!strcmp(dir, "cmov")) d = &ANGBAND_DIR_CMOV;
-#ifndef PRIVATE_USER_PATH
- if (!strcmp(dir, "save")) d = &ANGBAND_DIR_SAVE;
-#else /* PRIVATE_USER_PATH */
if (
#ifdef PRIVATE_USER_PATH_APEX
!strcmp(dir, "apex") ||
@@ -79,12 +72,8 @@ void module_reset_dir(cptr dir, cptr new_path)
else if (!strcmp(dir, "save"))
{
module_reset_dir_aux(&ANGBAND_DIR_SAVE, new_path);
-
- /* Tell the savefile code that we must not use setuid */
- savefile_setuid = FALSE;
}
else
-#endif /* PRIVATE_USER_PATH */
{
/* Build the new path */
strnfmt(buf, 1024, "%s%s%s%s%s", ANGBAND_DIR_MODULES, PATH_SEP, new_path, PATH_SEP, dir);
@@ -170,7 +159,7 @@ static void activate_module()
cptr force_module = NULL;
/* Display possible modules and select one */
-bool select_module()
+bool_ select_module()
{
s32b k, sel, max;
diff --git a/src/monster1.c b/src/monster1.c
index 7a44ffab..196272ce 100644
--- a/src/monster1.c
+++ b/src/monster1.c
@@ -35,7 +35,7 @@ static cptr wd_his[3] = { "its", "his", "her" };
* Determine if the "armor" is known
* The higher the level, the fewer kills needed.
*/
-static bool know_armour(int r_idx)
+static bool_ know_armour(int r_idx)
{
monster_race *r_ptr = &r_info[r_idx];
@@ -62,7 +62,7 @@ static bool know_armour(int r_idx)
* the higher the level of the monster, the fewer the attacks you need,
* the more damage an attack does, the more attacks you need
*/
-static bool know_damage(int r_idx, int i)
+static bool_ know_damage(int r_idx, int i)
{
monster_race *r_ptr = &r_info[r_idx];
@@ -105,8 +105,8 @@ static void roff_aux(int r_idx, int ego, int remem)
{
monster_race *r_ptr;
- bool old = FALSE;
- bool sin = FALSE;
+ bool_ old = FALSE;
+ bool_ sin = FALSE;
int m, n, r;
@@ -114,8 +114,8 @@ static void roff_aux(int r_idx, int ego, int remem)
int msex = 0;
- bool breath = FALSE;
- bool magic = FALSE;
+ bool_ breath = FALSE;
+ bool_ magic = FALSE;
u32b flags1;
u32b flags2;
@@ -124,7 +124,6 @@ static void roff_aux(int r_idx, int ego, int remem)
u32b flags5;
u32b flags6;
u32b flags7;
- u32b flags8;
u32b flags9;
int vn = 0;
@@ -135,23 +134,6 @@ static void roff_aux(int r_idx, int ego, int remem)
-#if 0
-
- /* Nothing erased */
- roff_old = 0;
-
- /* Reset the row */
- roff_row = 1;
-
- /* Reset the pointer */
- roff_p = roff_buf;
-
- /* No spaces yet */
- roff_s = NULL;
-
-#endif
-
-
/* Access the race and lore */
r_ptr = race_info_idx(r_idx, ego);
@@ -224,7 +206,6 @@ static void roff_aux(int r_idx, int ego, int remem)
flags5 = (r_ptr->flags5 & r_ptr->r_flags5);
flags6 = (r_ptr->flags6 & r_ptr->r_flags6);
flags7 = (r_ptr->flags7 & r_ptr->r_flags7);
- flags8 = (r_ptr->flags8 & r_ptr->r_flags8);
flags9 = (r_ptr->flags9 & r_ptr->r_flags9);
@@ -271,7 +252,7 @@ static void roff_aux(int r_idx, int ego, int remem)
else if (flags1 & (RF1_UNIQUE))
{
/* Hack -- Determine if the unique is "dead" */
- bool dead = (r_ptr->max_num == 0) ? TRUE : FALSE;
+ bool_ dead = (r_ptr->max_num == 0) ? TRUE : FALSE;
/* We've been killed... */
if (r_ptr->r_deaths)
@@ -1661,7 +1642,7 @@ void display_roff(int r_idx, int ego)
}
-bool monster_quest(int r_idx)
+bool_ monster_quest(int r_idx)
{
monster_race *r_ptr = &r_info[r_idx];
@@ -1678,7 +1659,7 @@ bool monster_quest(int r_idx)
}
-bool monster_dungeon(int r_idx)
+bool_ monster_dungeon(int r_idx)
{
monster_race *r_ptr = &r_info[r_idx];
@@ -1689,7 +1670,7 @@ bool monster_dungeon(int r_idx)
}
-bool monster_ocean(int r_idx)
+bool_ monster_ocean(int r_idx)
{
monster_race *r_ptr = &r_info[r_idx];
@@ -1700,7 +1681,7 @@ bool monster_ocean(int r_idx)
}
-bool monster_shore(int r_idx)
+bool_ monster_shore(int r_idx)
{
monster_race *r_ptr = &r_info[r_idx];
@@ -1711,7 +1692,7 @@ bool monster_shore(int r_idx)
}
-bool monster_waste(int r_idx)
+bool_ monster_waste(int r_idx)
{
monster_race *r_ptr = &r_info[r_idx];
@@ -1722,7 +1703,7 @@ bool monster_waste(int r_idx)
}
-bool monster_town(int r_idx)
+bool_ monster_town(int r_idx)
{
monster_race *r_ptr = &r_info[r_idx];
@@ -1733,7 +1714,7 @@ bool monster_town(int r_idx)
}
-bool monster_wood(int r_idx)
+bool_ monster_wood(int r_idx)
{
monster_race *r_ptr = &r_info[r_idx];
@@ -1744,7 +1725,7 @@ bool monster_wood(int r_idx)
}
-bool monster_volcano(int r_idx)
+bool_ monster_volcano(int r_idx)
{
monster_race *r_ptr = &r_info[r_idx];
@@ -1755,7 +1736,7 @@ bool monster_volcano(int r_idx)
}
-bool monster_mountain(int r_idx)
+bool_ monster_mountain(int r_idx)
{
monster_race *r_ptr = &r_info[r_idx];
@@ -1766,7 +1747,7 @@ bool monster_mountain(int r_idx)
}
-bool monster_grass(int r_idx)
+bool_ monster_grass(int r_idx)
{
monster_race *r_ptr = &r_info[r_idx];
@@ -1777,7 +1758,7 @@ bool monster_grass(int r_idx)
}
-bool monster_deep_water(int r_idx)
+bool_ monster_deep_water(int r_idx)
{
monster_race *r_ptr = &r_info[r_idx];
@@ -1790,7 +1771,7 @@ bool monster_deep_water(int r_idx)
}
-bool monster_shallow_water(int r_idx)
+bool_ monster_shallow_water(int r_idx)
{
monster_race *r_ptr = &r_info[r_idx];
@@ -1803,7 +1784,7 @@ bool monster_shallow_water(int r_idx)
}
-bool monster_lava(int r_idx)
+bool_ monster_lava(int r_idx)
{
monster_race *r_ptr = &r_info[r_idx];
@@ -1864,7 +1845,7 @@ void set_mon_num_hook(void)
/*
* Check if monster can cross terrain
*/
-bool monster_can_cross_terrain(byte feat, monster_race *r_ptr)
+bool_ monster_can_cross_terrain(byte feat, monster_race *r_ptr)
{
/* Deep water */
if (feat == FEAT_DEEP_WATER)
diff --git a/src/monster2.c b/src/monster2.c
index 4e5b31db..b0753244 100644
--- a/src/monster2.c
+++ b/src/monster2.c
@@ -17,7 +17,7 @@
#define MAX_COMMENT 5
/* Monster gain a few levels ? */
-void monster_check_experience(int m_idx, bool silent)
+void monster_check_experience(int m_idx, bool_ silent)
{
monster_type *m_ptr = &m_list[m_idx];
monster_race *r_ptr = &r_info[m_ptr->r_idx];
@@ -59,9 +59,9 @@ void monster_check_experience(int m_idx, bool silent)
/* Gain melee power */
if (magik(30))
{
- int i = rand_int(3), try = 20;
+ int i = rand_int(3), tries = 20;
- while ((try--) && !m_ptr->blow[i].d_dice) i = rand_int(3);
+ while ((tries--) && !m_ptr->blow[i].d_dice) i = rand_int(3);
m_ptr->blow[i].d_dice++;
}
@@ -69,7 +69,7 @@ void monster_check_experience(int m_idx, bool silent)
}
/* Monster gain some xp */
-void monster_gain_exp(int m_idx, u32b exp, bool silent)
+void monster_gain_exp(int m_idx, u32b exp, bool_ silent)
{
monster_type *m_ptr = &m_list[m_idx];
@@ -124,11 +124,11 @@ s32b modify_aux(s32b a, s32b b, char mod)
}
/* Is this ego ok for this monster ? */
-bool mego_ok(int r_idx, int ego)
+bool_ mego_ok(int r_idx, int ego)
{
monster_ego *re_ptr = &re_info[ego];
monster_race *r_ptr = &r_info[r_idx];
- bool ok = FALSE;
+ bool_ ok = FALSE;
int i;
/* needed flags */
@@ -410,7 +410,7 @@ void delete_monster_idx(int i)
s16b this_o_idx, next_o_idx = 0;
- bool had_lite = FALSE;
+ bool_ had_lite = FALSE;
;
@@ -863,7 +863,7 @@ errr get_mon_num_prep(void)
* Some dungeon types restrict the possible monsters.
* Return TRUE is the monster is OK and FALSE otherwise
*/
-bool apply_rule(monster_race *r_ptr, byte rule)
+bool_ apply_rule(monster_race *r_ptr, byte rule)
{
dungeon_info_type *d_ptr = &d_info[dungeon_type];
@@ -953,7 +953,7 @@ bool apply_rule(monster_race *r_ptr, byte rule)
return FALSE;
}
-bool restrict_monster_to_dungeon(int r_idx)
+bool_ restrict_monster_to_dungeon(int r_idx)
{
dungeon_info_type *d_ptr = &d_info[dungeon_type];
monster_race *r_ptr = &r_info[r_idx];
@@ -962,7 +962,7 @@ bool restrict_monster_to_dungeon(int r_idx)
byte rule = d_ptr->rule_percents[rand_int(100)];
/* Apply the rule */
- bool rule_ret = apply_rule(r_ptr, rule);
+ bool_ rule_ret = apply_rule(r_ptr, rule);
/* Should the rule be right or not ? */
if ((d_ptr->rules[rule].mode == DUNGEON_MODE_NAND) || (d_ptr->rules[rule].mode == DUNGEON_MODE_NOR)) rule_ret = !rule_ret;
@@ -975,7 +975,7 @@ bool restrict_monster_to_dungeon(int r_idx)
}
/* Ugly hack, let summon unappropriate monsters */
-bool summon_hack = FALSE;
+bool_ summon_hack = FALSE;
/*
* Choose a monster race that seems "appropriate" to the given level
@@ -1228,7 +1228,7 @@ void monster_desc(char *desc, monster_type *m_ptr, int mode)
monster_race *r_ptr = race_inf(m_ptr);
cptr b_name = (r_name + r_ptr->name);
char silly_name[80], name[100];
- bool seen, pron;
+ bool_ seen, pron;
int insanity = (p_ptr->msane - p_ptr->csane) * 100 / p_ptr->msane;
if (m_ptr->ego)
@@ -1526,9 +1526,9 @@ void lore_treasure(int m_idx, int num_item, int num_gold)
-void sanity_blast(monster_type * m_ptr, bool necro)
+void sanity_blast(monster_type * m_ptr, bool_ necro)
{
- bool happened = FALSE;
+ bool_ happened = FALSE;
int power = 100;
if (!necro)
@@ -1722,7 +1722,7 @@ void sanity_blast(monster_type * m_ptr, bool necro)
* as "detected last turn", and "detected this turn", and "currently
* in line of sight", all of which are used for visibility testing.
*/
-void update_mon(int m_idx, bool full)
+void update_mon(int m_idx, bool_ full)
{
monster_type *m_ptr = &m_list[m_idx];
@@ -1732,22 +1732,22 @@ void update_mon(int m_idx, bool full)
int fy = m_ptr->fy;
int fx = m_ptr->fx;
- bool old_ml = m_ptr->ml;
+ bool_ old_ml = m_ptr->ml;
/* Seen at all */
- bool flag = FALSE;
+ bool_ flag = FALSE;
/* Seen by vision */
- bool easy = FALSE;
+ bool_ easy = FALSE;
/* Seen by telepathy */
- bool hard = FALSE;
+ bool_ hard = FALSE;
/* Various extra flags */
- bool do_empty_mind = FALSE;
- bool do_weird_mind = FALSE;
- bool do_invisible = FALSE;
- bool do_cold_blood = FALSE;
+ bool_ do_empty_mind = FALSE;
+ bool_ do_weird_mind = FALSE;
+ bool_ do_invisible = FALSE;
+ bool_ do_cold_blood = FALSE;
/* Calculate distance */
@@ -1767,19 +1767,6 @@ void update_mon(int m_idx, bool full)
}
-#if 0
-
- /* Process monster light for a monster within MAX_SIGHT + max radius */
- if (m_ptr->cdis <= MAX_SIGHT + 1)
- {
- if (r_ptr->flags9 & RF9_HAS_LITE)
- {
- p_ptr->update |= (PU_MON_LITE);
- }
- }
-
-#endif
-
/* Process "distant" monsters */
if (m_ptr->cdis > MAX_SIGHT)
{
@@ -1823,7 +1810,7 @@ void update_mon(int m_idx, bool full)
if (p_ptr->telepathy)
{
/* Assume we cant see */
- bool can_esp = FALSE;
+ bool_ can_esp = FALSE;
/* Different ESP */
if ((p_ptr->telepathy & ESP_ORC) && (r_ptr->flags3 & RF3_ORC)) can_esp = TRUE;
@@ -1870,11 +1857,6 @@ void update_mon(int m_idx, bool full)
}
}
- /* Merchants sense objects */
-#if 0 /* DGDGDGDG -- use a skill */
- if ((cp_ptr->magic_key == MKEY_TELEKINESIS) && (p_ptr->lev >= 20) &&
- (m_ptr->hold_o_idx)) flag = TRUE;
-#endif
/* Apply "detection" spells */
if (m_ptr->mflag & (MFLAG_MARK)) flag = TRUE;
@@ -2007,7 +1989,7 @@ void update_mon(int m_idx, bool full)
/*
* This function simply updates all the (non-dead) monsters (see above).
*/
-void update_monsters(bool full)
+void update_monsters(bool_ full)
{
int i;
@@ -2093,7 +2075,7 @@ static int possible_randart[] =
};
-bool kind_is_randart(int k_idx)
+bool_ kind_is_randart(int k_idx)
{
int max;
object_kind *k_ptr = &k_info[k_idx];
@@ -2126,15 +2108,15 @@ bool kind_is_randart(int k_idx)
* This is the only function which may place a monster in the dungeon,
* except for the savefile loading code.
*/
-bool bypass_r_ptr_max_num = FALSE;
+bool_ bypass_r_ptr_max_num = FALSE;
int place_monster_result = 0;
-bool place_monster_one_no_drop = FALSE;
+bool_ place_monster_one_no_drop = FALSE;
monster_race *place_monster_one_race = NULL;
-s16b place_monster_one(int y, int x, int r_idx, int ego, bool slp, int status)
+s16b place_monster_one(int y, int x, int r_idx, int ego, bool_ slp, int status)
{
- int i, base;
+ int i;
char dummy[5];
- bool add_level = FALSE;
+ bool_ add_level = FALSE;
int min_level = 0, max_level = 0;
cave_type *c_ptr;
@@ -2303,26 +2285,8 @@ s16b place_monster_one(int y, int x, int r_idx, int ego, bool slp, int status)
return 0;
}
- /* Anyway that doesn't work .... hum... TO FIX -- DG */
-#if 0
- /* Hack -- non "town" monsters are NEVER generated in town */
- if ((!(r_ptr->flags8 & (RF8_WILD_TOWN))) && (wf_info[wild_map[p_ptr->wilderness_y][p_ptr->wilderness_x].feat].terrain_idx == TERRAIN_TOWN) && !dun_level)
- {
- /* Cannot create */
- if (place_monster_one_race) KILL(place_monster_one_race, monster_race);
- return (0);
- }
-#endif
/* Hack -- "unique" monsters must be "unique" */
-#if 0
- if ((r_ptr->flags1 & (RF1_UNIQUE)) && (r_ptr->cur_num >= r_ptr->max_num) && (!m_allow_special[r_idx]))
-#else
-#if 0
- if ((r_ptr->flags1 & (RF1_UNIQUE)) && (r_ptr->cur_num >= r_ptr->max_num) && (!m_allow_special[r_idx]) && (r_ptr->max_num != -1))
-#else
- if ((r_ptr->flags1 & (RF1_UNIQUE)) && (r_ptr->cur_num >= r_ptr->max_num) && (r_ptr->max_num != -1) && (!bypass_r_ptr_max_num))
-#endif
-#endif
+ if ((r_ptr->flags1 & (RF1_UNIQUE)) && (r_ptr->cur_num >= r_ptr->max_num) && (r_ptr->max_num != -1) && (!bypass_r_ptr_max_num))
{
/* Cannot create */
if (wizard) cmsg_format(TERM_L_RED, "WARNING: Refused monster %d: cur_num >= max_num", r_idx);
@@ -2447,12 +2411,12 @@ s16b place_monster_one(int y, int x, int r_idx, int ego, bool slp, int status)
/* Only if not fated to die */
if ((dungeon_type != DUNGEON_DEATH) && (!place_monster_one_no_drop))
{
- bool good = (r_ptr->flags1 & (RF1_DROP_GOOD)) ? TRUE : FALSE;
- bool great = (r_ptr->flags1 & (RF1_DROP_GREAT)) ? TRUE : FALSE;
+ bool_ good = (r_ptr->flags1 & (RF1_DROP_GOOD)) ? TRUE : FALSE;
+ bool_ great = (r_ptr->flags1 & (RF1_DROP_GREAT)) ? TRUE : FALSE;
- bool do_gold = (!(r_ptr->flags1 & (RF1_ONLY_ITEM)));
- bool do_item = (!(r_ptr->flags1 & (RF1_ONLY_GOLD)));
- bool do_mimic = (r_ptr->flags9 & (RF9_MIMIC));
+ bool_ do_gold = (!(r_ptr->flags1 & (RF1_ONLY_ITEM)));
+ bool_ do_item = (!(r_ptr->flags1 & (RF1_ONLY_GOLD)));
+ bool_ do_mimic = (r_ptr->flags9 & (RF9_MIMIC));
int j;
int force_coin = get_coin_type(r_ptr);
@@ -2627,10 +2591,6 @@ s16b place_monster_one(int y, int x, int r_idx, int ego, bool slp, int status)
if (i) m_ptr->mspeed += rand_spread(0, i);
}
- /* Need to match dungeon level ? */
- base = dun_level;
- if (dungeon_flags2 & DF2_ADJUST_LEVEL_PLAYER)
- base = p_ptr->lev * 2;
if (dungeon_flags2 & DF2_ADJUST_LEVEL_1_2)
{
@@ -2711,7 +2671,7 @@ s16b place_monster_one(int y, int x, int r_idx, int ego, bool slp, int status)
/*
* Attempt to place a "group" of monsters around the given location
*/
-static bool place_monster_group(int y, int x, int r_idx, bool slp, int status)
+static bool_ place_monster_group(int y, int x, int r_idx, bool_ slp, int status)
{
monster_race *r_ptr = &r_info[r_idx];
@@ -2806,7 +2766,7 @@ static int place_monster_idx = 0;
/*
* Hack -- help pick an escort type
*/
-static bool place_monster_okay(int r_idx)
+static bool_ place_monster_okay(int r_idx)
{
monster_race *r_ptr = &r_info[place_monster_idx];
@@ -2850,11 +2810,11 @@ static bool place_monster_okay(int r_idx)
* Note the use of the new "monster allocation table" code to restrict
* the "get_mon_num()" function to "legal" escort types.
*/
-bool place_monster_aux(int y, int x, int r_idx, bool slp, bool grp, int status)
+bool_ place_monster_aux(int y, int x, int r_idx, bool_ slp, bool_ grp, int status)
{
int i;
monster_race *r_ptr = &r_info[r_idx];
- bool (*old_get_mon_num_hook)(int r_idx);
+ bool_ (*old_get_mon_num_hook)(int r_idx);
/* Place one monster, or fail */
@@ -2893,7 +2853,7 @@ bool place_monster_aux(int y, int x, int r_idx, bool slp, bool grp, int status)
int nx, ny, z, d = 3;
/* Pick a location */
- scatter(&ny, &nx, y, x, d, 0);
+ scatter(&ny, &nx, y, x, d);
/* Require empty grids */
if (!cave_empty_bold(ny, nx)) continue;
@@ -2944,7 +2904,7 @@ bool place_monster_aux(int y, int x, int r_idx, bool slp, bool grp, int status)
*
* Attempt to find a monster appropriate to the "monster_level"
*/
-bool place_monster(int y, int x, bool slp, bool grp)
+bool_ place_monster(int y, int x, bool_ slp, bool_ grp)
{
int r_idx;
@@ -2976,7 +2936,7 @@ bool place_monster(int y, int x, bool slp, bool grp)
#ifdef MONSTER_HORDES
-bool alloc_horde(int y, int x)
+bool_ alloc_horde(int y, int x)
{
int r_idx = 0;
monster_race * r_ptr = NULL;
@@ -3044,7 +3004,7 @@ bool alloc_horde(int y, int x)
*
* Use "monster_level" for the monster level
*/
-bool alloc_monster(int dis, bool slp)
+bool_ alloc_monster(int dis, bool_ slp)
{
int y, x;
int attempts_left = 10000;
@@ -3110,11 +3070,11 @@ static int summon_specific_type = 0;
/*
* Hack -- help decide if a monster race is "okay" to summon
*/
-bool summon_specific_okay(int r_idx)
+bool_ summon_specific_okay(int r_idx)
{
monster_race *r_ptr = &r_info[r_idx];
- bool okay = FALSE;
+ bool_ okay = FALSE;
/* Hack - Only summon dungeon monsters */
if (!monster_dungeon(r_idx)) return (FALSE);
@@ -3426,11 +3386,11 @@ bool summon_specific_okay(int r_idx)
* Note that this function may not succeed, though this is very rare.
*/
int summon_specific_level = 0;
-bool summon_specific(int y1, int x1, int lev, int type)
+bool_ summon_specific(int y1, int x1, int lev, int type)
{
int i, x, y, r_idx;
- bool Group_ok = TRUE;
- bool (*old_get_mon_num_hook)(int r_idx);
+ bool_ Group_ok = TRUE;
+ bool_ (*old_get_mon_num_hook)(int r_idx);
/* Look for a location */
for (i = 0; i < 20; ++i)
@@ -3439,7 +3399,7 @@ bool summon_specific(int y1, int x1, int lev, int type)
int d = (i / 15) + 1;
/* Pick a location */
- scatter(&y, &x, y1, x1, d, 0);
+ scatter(&y, &x, y1, x1, d);
/* Require "empty" floor grid */
if (!cave_empty_bold(y, x)) continue;
@@ -3515,10 +3475,10 @@ bool summon_specific(int y1, int x1, int lev, int type)
-bool summon_specific_friendly(int y1, int x1, int lev, int type, bool Group_ok)
+bool_ summon_specific_friendly(int y1, int x1, int lev, int type, bool_ Group_ok)
{
int i, x, y, r_idx;
- bool (*old_get_mon_num_hook)(int r_idx);
+ bool_ (*old_get_mon_num_hook)(int r_idx);
/* Look for a location */
for (i = 0; i < 20; ++i)
@@ -3527,7 +3487,7 @@ bool summon_specific_friendly(int y1, int x1, int lev, int type, bool Group_ok)
int d = (i / 15) + 1;
/* Pick a location */
- scatter(&y, &x, y1, x1, d, 0);
+ scatter(&y, &x, y1, x1, d);
/* Require "empty" floor grid */
if (!cave_empty_bold(y, x)) continue;
@@ -3698,11 +3658,11 @@ void monster_swap(int y1, int x1, int y2, int x2)
/*
* Hack -- help decide if a monster race is "okay" to summon
*/
-static bool mutate_monster_okay(int r_idx)
+static bool_ mutate_monster_okay(int r_idx)
{
monster_race *r_ptr = &r_info[r_idx];
- bool okay = FALSE;
+ bool_ okay = FALSE;
/* Hack - Only summon dungeon monsters */
if (!monster_dungeon(r_idx)) return (FALSE);
@@ -3719,14 +3679,14 @@ static bool mutate_monster_okay(int r_idx)
*
* Note that "reproduction" REQUIRES empty space.
*/
-bool multiply_monster(int m_idx, bool charm, bool clone)
+bool_ multiply_monster(int m_idx, bool_ charm, bool_ clone)
{
monster_type *m_ptr = &m_list[m_idx];
monster_race *r_ptr = race_inf(m_ptr);
int i, y, x, new_race;
- bool result = FALSE;
+ bool_ result = FALSE;
if (no_breeds)
{
@@ -3741,7 +3701,7 @@ bool multiply_monster(int m_idx, bool charm, bool clone)
/* Pick a location */
- scatter(&y, &x, m_ptr->fy, m_ptr->fx, d, 0);
+ scatter(&y, &x, m_ptr->fy, m_ptr->fx, d);
/* Require an "empty" floor grid */
if (!cave_empty_bold(y, x)) continue;
@@ -3751,7 +3711,7 @@ bool multiply_monster(int m_idx, bool charm, bool clone)
/* It can mutate into a nastier monster */
if ((rand_int(100) < 3) && (!clone))
{
- bool (*old_get_mon_num_hook)(int r_idx);
+ bool_ (*old_get_mon_num_hook)(int r_idx);
/* Backup the old hook */
old_get_mon_num_hook = get_mon_num_hook;
@@ -3796,7 +3756,7 @@ bool multiply_monster(int m_idx, bool charm, bool clone)
*
* Technically should attempt to treat "Beholder"'s as jelly's
*/
-bool hack_message_pain_may_silent = FALSE;
+bool_ hack_message_pain_may_silent = FALSE;
void message_pain_hook(cptr fmt, ...)
{
va_list vp;
@@ -3826,11 +3786,6 @@ void message_pain(int m_idx, int dam)
monster_race *r_ptr = race_inf(m_ptr);
char m_name[80];
-#if 0
- if (!(player_can_see_bold(m_ptr->fy, m_ptr->fx)))
- return;
-#endif
-
/* Get the monster name */
monster_desc(m_name, m_ptr, 0);
diff --git a/src/monster3.c b/src/monster3.c
index 81c6c2d0..a2b5fb38 100644
--- a/src/monster3.c
+++ b/src/monster3.c
@@ -41,14 +41,11 @@ int is_friend(monster_type *m_ptr)
}
/* Should they attack each others */
-bool is_enemy(monster_type *m_ptr, monster_type *t_ptr)
+bool_ is_enemy(monster_type *m_ptr, monster_type *t_ptr)
{
monster_race *r_ptr = &r_info[m_ptr->r_idx], *rt_ptr = &r_info[t_ptr->r_idx];
int s1 = is_friend(m_ptr), s2 = is_friend(t_ptr);
-#if 0
- /* Stupid monsters attacks just about everything */
- if ((r_ptr->flags2 & RF2_STUPID) && (r_ptr->d_char != rt_ptr->d_char)) return TRUE;
-#endif
+
/* Monsters hates breeders */
if ((m_ptr->status != MSTATUS_NEUTRAL) && (rt_ptr->flags4 & RF4_MULTIPLY) && (num_repro > MAX_REPRO * 2 / 3) && (r_ptr->d_char != rt_ptr->d_char)) return TRUE;
if ((t_ptr->status != MSTATUS_NEUTRAL) && (r_ptr->flags4 & RF4_MULTIPLY) && (num_repro > MAX_REPRO * 2 / 3) && (r_ptr->d_char != rt_ptr->d_char)) return TRUE;
@@ -60,18 +57,13 @@ bool is_enemy(monster_type *m_ptr, monster_type *t_ptr)
return (FALSE);
}
-bool change_side(monster_type *m_ptr)
+bool_ change_side(monster_type *m_ptr)
{
monster_race *r_ptr = race_inf(m_ptr);
/* neutrals and companions */
switch (m_ptr->status)
{
-#if 0
- case MSTATUS_ENEMY:
- m_ptr->status = MSTATUS_FRIEND;
- break;
-#endif
case MSTATUS_FRIEND:
m_ptr->status = MSTATUS_ENEMY;
if ((r_ptr->flags3 & RF3_ANIMAL) && (!(r_ptr->flags3 & RF3_EVIL)))
@@ -97,12 +89,12 @@ bool change_side(monster_type *m_ptr)
}
/* Multiply !! */
-bool ai_multiply(int m_idx)
+bool_ ai_multiply(int m_idx)
{
monster_type *m_ptr = &m_list[m_idx];
monster_race *r_ptr = &r_info[m_ptr->r_idx];
int k, y, x, oy = m_ptr->fy, ox = m_ptr->fx;
- bool is_frien = (is_friend(m_ptr) > 0);
+ bool_ is_frien = (is_friend(m_ptr) > 0);
/* Count the adjacent monsters */
for (k = 0, y = oy - 1; y <= oy + 1; y++)
@@ -142,7 +134,7 @@ bool ai_multiply(int m_idx)
}
/* Possessor incarnates */
-bool ai_possessor(int m_idx, int o_idx)
+bool_ ai_possessor(int m_idx, int o_idx)
{
object_type *o_ptr = &o_list[o_idx];
monster_type *m_ptr = &m_list[m_idx];
@@ -296,7 +288,7 @@ void ai_deincarnate(int m_idx)
}
/* Returns if a new companion is allowed */
-bool can_create_companion(void)
+bool_ can_create_companion(void)
{
int i, mcnt = 0;
@@ -317,7 +309,7 @@ bool can_create_companion(void)
/* Player controlled monsters */
-bool do_control_walk(void)
+bool_ do_control_walk(void)
{
/* Get a "repeated" direction */
if (p_ptr->control)
@@ -338,7 +330,7 @@ bool do_control_walk(void)
return FALSE;
}
-bool do_control_inven(void)
+bool_ do_control_inven(void)
{
int monst_list[23];
@@ -351,12 +343,12 @@ bool do_control_inven(void)
return TRUE;
}
-bool do_control_pickup(void)
+bool_ do_control_pickup(void)
{
int this_o_idx, next_o_idx = 0;
monster_type *m_ptr = &m_list[p_ptr->control];
cave_type *c_ptr;
- bool done = FALSE;
+ bool_ done = FALSE;
if (!p_ptr->control) return FALSE;
@@ -398,7 +390,7 @@ bool do_control_pickup(void)
return TRUE;
}
-bool do_control_drop(void)
+bool_ do_control_drop(void)
{
monster_type *m_ptr = &m_list[p_ptr->control];
@@ -407,12 +399,12 @@ bool do_control_drop(void)
return TRUE;
}
-bool do_control_magic(void)
+bool_ do_control_magic(void)
{
int power = -1;
int num = 0, i;
int powers[96];
- bool flag, redraw;
+ bool_ flag, redraw;
int ask;
char choice;
char out_val[160];
@@ -616,7 +608,7 @@ bool do_control_magic(void)
}
/* Finds the controlled monster and "reconnect" to it */
-bool do_control_reconnect()
+bool_ do_control_reconnect()
{
int i;
@@ -677,3 +669,38 @@ void do_cmd_companion()
else
msg_print("You must target a pet.");
}
+
+/*
+ * List companions to the character sheet.
+ */
+void dump_companions(FILE *outfile)
+{
+ int i;
+ int done_hdr = 0;
+
+ /* Process the monsters (backwards) */
+ for (i = m_max - 1; i >= 1; i--)
+ {
+ /* Access the monster */
+ monster_type *m_ptr = &m_list[i];
+
+ /* Ignore "dead" monsters */
+ if (!m_ptr->r_idx) continue;
+
+ if (m_ptr->status == MSTATUS_COMPANION)
+ {
+ char pet_name[80];
+
+ /* Output the header if we haven't yet. */
+ if (!done_hdr)
+ {
+ done_hdr = 1;
+ fprintf(outfile, "\n\n [Current companions]\n\n");
+ }
+
+ /* List the monster. */
+ monster_desc(pet_name, m_ptr, 0x88);
+ fprintf(outfile, "%s (level %d)\n", pet_name, m_ptr->level);
+ }
+ }
+}
diff --git a/src/notes.c b/src/notes.c
index 11b1ed4f..3504f61c 100644
--- a/src/notes.c
+++ b/src/notes.c
@@ -87,10 +87,9 @@ void add_note(char *note, char code)
char final_note[100];
char long_day[50];
char depths[32];
- char *tmp;
/* Get the first 60 chars - so do not have an overflow */
- tmp = C_WIPE(buf, 100, char);
+ C_WIPE(buf, 100, char);
strncpy(buf, note, 60);
/* Get date and time */
diff --git a/src/object1.c b/src/object1.c
index acdc9a77..fef7fb85 100644
--- a/src/object1.c
+++ b/src/object1.c
@@ -276,7 +276,7 @@ static byte scroll_col[MAX_TITLES];
* Certain items have a flavor
* This function is used only by "flavor_init()"
*/
-static bool object_flavor(int k_idx)
+static bool_ object_flavor(int k_idx)
{
object_kind *k_ptr = &k_info[k_idx];
@@ -374,7 +374,7 @@ void get_table_name(char *out_string)
*
* XXX XXX XXX Add "EASY_KNOW" flag to "k_info.txt" file
*/
-static bool object_easy_know(int i)
+static bool_ object_easy_know(int i)
{
object_kind *k_ptr = &k_info[i];
@@ -577,7 +577,7 @@ void flavor_init(void)
{
char buf[80];
- bool okay;
+ bool_ okay;
/* Start a new title */
buf[0] = '\0';
@@ -819,17 +819,126 @@ void reset_visuals(void)
}
+/*
+ * Extract "xtra" flags from object.
+ */
+void object_flags_xtra(object_type *o_ptr, u32b *f2, u32b *f3, u32b *esp)
+{
+ switch (o_ptr->xtra1)
+ {
+ case EGO_XTRA_SUSTAIN:
+ {
+ /* Choose a sustain */
+ switch (o_ptr->xtra2 % 6)
+ {
+ case 0:
+ (*f2) |= (TR2_SUST_STR);
+ break;
+ case 1:
+ (*f2) |= (TR2_SUST_INT);
+ break;
+ case 2:
+ (*f2) |= (TR2_SUST_WIS);
+ break;
+ case 3:
+ (*f2) |= (TR2_SUST_DEX);
+ break;
+ case 4:
+ (*f2) |= (TR2_SUST_CON);
+ break;
+ case 5:
+ (*f2) |= (TR2_SUST_CHR);
+ break;
+ }
+
+ break;
+ }
+
+ case EGO_XTRA_POWER:
+ {
+ /* Choose a power */
+ switch (o_ptr->xtra2 % 11)
+ {
+ case 0:
+ (*f2) |= (TR2_RES_BLIND);
+ break;
+ case 1:
+ (*f2) |= (TR2_RES_CONF);
+ break;
+ case 2:
+ (*f2) |= (TR2_RES_SOUND);
+ break;
+ case 3:
+ (*f2) |= (TR2_RES_SHARDS);
+ break;
+ case 4:
+ (*f2) |= (TR2_RES_NETHER);
+ break;
+ case 5:
+ (*f2) |= (TR2_RES_NEXUS);
+ break;
+ case 6:
+ (*f2) |= (TR2_RES_CHAOS);
+ break;
+ case 7:
+ (*f2) |= (TR2_RES_DISEN);
+ break;
+ case 8:
+ (*f2) |= (TR2_RES_POIS);
+ break;
+ case 9:
+ (*f2) |= (TR2_RES_DARK);
+ break;
+ case 10:
+ (*f2) |= (TR2_RES_LITE);
+ break;
+ }
+
+ break;
+ }
+
+ case EGO_XTRA_ABILITY:
+ {
+ /* Choose an ability */
+ switch (o_ptr->xtra2 % 8)
+ {
+ case 0:
+ (*f3) |= (TR3_FEATHER);
+ break;
+ case 1:
+ (*f3) |= (TR3_LITE1);
+ break;
+ case 2:
+ (*f3) |= (TR3_SEE_INVIS);
+ break;
+ case 3:
+ (*esp) |= (ESP_ALL);
+ break;
+ case 4:
+ (*f3) |= (TR3_SLOW_DIGEST);
+ break;
+ case 5:
+ (*f3) |= (TR3_REGEN);
+ break;
+ case 6:
+ (*f2) |= (TR2_FREE_ACT);
+ break;
+ case 7:
+ (*f2) |= (TR2_HOLD_LIFE);
+ break;
+ }
+
+ break;
+ }
-
-
-
-
+ }
+}
/*
* Obtain the "flags" for an item
*/
-bool object_flags_no_set = FALSE;
+bool_ object_flags_no_set = FALSE;
void object_flags(object_type *o_ptr, u32b *f1, u32b *f2, u32b *f3, u32b *f4, u32b *f5, u32b *esp)
{
object_kind *k_ptr = &k_info[o_ptr->k_idx];
@@ -872,113 +981,7 @@ void object_flags(object_type *o_ptr, u32b *f1, u32b *f2, u32b *f3, u32b *f4, u3
/* Extra powers */
if (!(o_ptr->art_name))
{
- switch (o_ptr->xtra1)
- {
- case EGO_XTRA_SUSTAIN:
- {
- /* Choose a sustain */
- switch (o_ptr->xtra2 % 6)
- {
- case 0:
- (*f2) |= (TR2_SUST_STR);
- break;
- case 1:
- (*f2) |= (TR2_SUST_INT);
- break;
- case 2:
- (*f2) |= (TR2_SUST_WIS);
- break;
- case 3:
- (*f2) |= (TR2_SUST_DEX);
- break;
- case 4:
- (*f2) |= (TR2_SUST_CON);
- break;
- case 5:
- (*f2) |= (TR2_SUST_CHR);
- break;
- }
-
- break;
- }
-
- case EGO_XTRA_POWER:
- {
- /* Choose a power */
- switch (o_ptr->xtra2 % 11)
- {
- case 0:
- (*f2) |= (TR2_RES_BLIND);
- break;
- case 1:
- (*f2) |= (TR2_RES_CONF);
- break;
- case 2:
- (*f2) |= (TR2_RES_SOUND);
- break;
- case 3:
- (*f2) |= (TR2_RES_SHARDS);
- break;
- case 4:
- (*f2) |= (TR2_RES_NETHER);
- break;
- case 5:
- (*f2) |= (TR2_RES_NEXUS);
- break;
- case 6:
- (*f2) |= (TR2_RES_CHAOS);
- break;
- case 7:
- (*f2) |= (TR2_RES_DISEN);
- break;
- case 8:
- (*f2) |= (TR2_RES_POIS);
- break;
- case 9:
- (*f2) |= (TR2_RES_DARK);
- break;
- case 10:
- (*f2) |= (TR2_RES_LITE);
- break;
- }
-
- break;
- }
-
- case EGO_XTRA_ABILITY:
- {
- /* Choose an ability */
- switch (o_ptr->xtra2 % 8)
- {
- case 0:
- (*f3) |= (TR3_FEATHER);
- break;
- case 1:
- (*f3) |= (TR3_LITE1);
- break;
- case 2:
- (*f3) |= (TR3_SEE_INVIS);
- break;
- case 3:
- (*esp) |= (ESP_ALL);
- break;
- case 4:
- (*f3) |= (TR3_SLOW_DIGEST);
- break;
- case 5:
- (*f3) |= (TR3_REGEN);
- break;
- case 6:
- (*f2) |= (TR2_FREE_ACT);
- break;
- case 7:
- (*f2) |= (TR2_HOLD_LIFE);
- break;
- }
-
- break;
- }
- }
+ object_flags_xtra(o_ptr, f2, f3, esp);
}
}
@@ -1024,7 +1027,7 @@ int object_power(object_type *o_ptr)
*/
void object_flags_known(object_type *o_ptr, u32b *f1, u32b *f2, u32b *f3, u32b *f4, u32b *f5, u32b *esp)
{
- bool spoil = FALSE;
+ bool_ spoil = FALSE;
object_kind *k_ptr = &k_info[o_ptr->k_idx];
@@ -1117,114 +1120,7 @@ void object_flags_known(object_type *o_ptr, u32b *f1, u32b *f2, u32b *f3, u32b *
if (!(o_ptr->art_name))
{
- /* Extra powers */
- switch (o_ptr->xtra1)
- {
- case EGO_XTRA_SUSTAIN:
- {
- /* Choose a sustain */
- switch (o_ptr->xtra2 % 6)
- {
- case 0:
- (*f2) |= (TR2_SUST_STR);
- break;
- case 1:
- (*f2) |= (TR2_SUST_INT);
- break;
- case 2:
- (*f2) |= (TR2_SUST_WIS);
- break;
- case 3:
- (*f2) |= (TR2_SUST_DEX);
- break;
- case 4:
- (*f2) |= (TR2_SUST_CON);
- break;
- case 5:
- (*f2) |= (TR2_SUST_CHR);
- break;
- }
-
- break;
- }
-
- case EGO_XTRA_POWER:
- {
- /* Choose a power */
- switch (o_ptr->xtra2 % 11)
- {
- case 0:
- (*f2) |= (TR2_RES_BLIND);
- break;
- case 1:
- (*f2) |= (TR2_RES_CONF);
- break;
- case 2:
- (*f2) |= (TR2_RES_SOUND);
- break;
- case 3:
- (*f2) |= (TR2_RES_SHARDS);
- break;
- case 4:
- (*f2) |= (TR2_RES_NETHER);
- break;
- case 5:
- (*f2) |= (TR2_RES_NEXUS);
- break;
- case 6:
- (*f2) |= (TR2_RES_CHAOS);
- break;
- case 7:
- (*f2) |= (TR2_RES_DISEN);
- break;
- case 8:
- (*f2) |= (TR2_RES_POIS);
- break;
- case 9:
- (*f2) |= (TR2_RES_DARK);
- break;
- case 10:
- (*f2) |= (TR2_RES_LITE);
- break;
- }
-
- break;
- }
-
- case EGO_XTRA_ABILITY:
- {
- /* Choose an ability */
- switch (o_ptr->xtra2 % 8)
- {
- case 0:
- (*f3) |= (TR3_FEATHER);
- break;
- case 1:
- (*f3) |= (TR3_LITE1);
- break;
- case 2:
- (*f3) |= (TR3_SEE_INVIS);
- break;
- case 3:
- (*esp) |= (ESP_ALL);
- break;
- case 4:
- (*f3) |= (TR3_SLOW_DIGEST);
- break;
- case 5:
- (*f3) |= (TR3_REGEN);
- break;
- case 6:
- (*f2) |= (TR2_FREE_ACT);
- break;
- case 7:
- (*f2) |= (TR2_HOLD_LIFE);
- break;
- }
-
- break;
- }
- }
+ object_flags_xtra(o_ptr, f2, f3, esp);
}
/* Hack - Res Chaos -> Res Confusion */
@@ -1393,17 +1289,17 @@ static char *object_desc_int(char *result, s32b num)
*/
void object_desc(char *buf, object_type *o_ptr, int pref, int mode)
{
- bool hack_name = FALSE;
+ bool_ hack_name = FALSE;
cptr basenm, modstr;
int indexx;
- bool aware = FALSE;
- bool known = FALSE;
+ bool_ aware = FALSE;
+ bool_ known = FALSE;
- bool append_name = FALSE;
+ bool_ append_name = FALSE;
- bool show_weapon = FALSE;
- bool show_armour = FALSE;
+ bool_ show_weapon = FALSE;
+ bool_ show_armour = FALSE;
cptr s, u;
char *t;
@@ -2613,10 +2509,10 @@ copyback:
void object_desc_store(char *buf, object_type *o_ptr, int pref, int mode)
{
/* Save the "aware" flag */
- bool hack_aware = k_info[o_ptr->k_idx].aware;
+ bool_ hack_aware = k_info[o_ptr->k_idx].aware;
/* Save the "known" flag */
- bool hack_known = (o_ptr->ident & (IDENT_KNOWN)) ? TRUE : FALSE;
+ bool_ hack_known = (o_ptr->ident & (IDENT_KNOWN)) ? TRUE : FALSE;
/* Set the "known" flag */
@@ -2713,7 +2609,7 @@ cptr item_activation(object_type *o_ptr, byte num)
}
/* Grab the tval desc */
-bool grab_tval_desc(int tval)
+bool_ grab_tval_desc(int tval)
{
int tv = 0;
@@ -2736,7 +2632,7 @@ if ((first)) { (first) = FALSE; text_out((txt)); } else text_out(", ");
/*
* Display the damage done with a multiplier
*/
-void output_dam(object_type *o_ptr, int mult, int mult2, cptr against, cptr against2, bool *first)
+void output_dam(object_type *o_ptr, int mult, int mult2, cptr against, cptr against2, bool_ *first)
{
int dam;
@@ -2781,8 +2677,8 @@ void display_weapon_damage(object_type *o_ptr)
{
object_type forge, *old_ptr = &forge;
u32b f1, f2, f3, f4, f5, esp;
- bool first = TRUE;
- bool full = o_ptr->ident & (IDENT_MENTAL);
+ bool_ first = TRUE;
+ bool_ full = o_ptr->ident & (IDENT_MENTAL);
/* Extract the flags */
object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp);
@@ -2826,7 +2722,7 @@ void display_weapon_damage(object_type *o_ptr)
/*
* Display the ammo damage done with a multiplier
*/
-void output_ammo_dam(object_type *o_ptr, int mult, int mult2, cptr against, cptr against2, bool *first)
+void output_ammo_dam(object_type *o_ptr, int mult, int mult2, cptr against, cptr against2, bool_ *first)
{
int dam;
object_type *b_ptr = &p_ptr->inventory[INVEN_BOW];
@@ -2880,9 +2776,9 @@ void output_ammo_dam(object_type *o_ptr, int mult, int mult2, cptr against, cptr
void display_ammo_damage(object_type *o_ptr)
{
u32b f1, f2, f3, f4, f5, esp;
- bool first = TRUE;
+ bool_ first = TRUE;
int i;
- bool full = o_ptr->ident & (IDENT_MENTAL);
+ bool_ full = o_ptr->ident & (IDENT_MENTAL);
/* Extract the flags */
object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp);
@@ -2988,7 +2884,7 @@ static cptr object_out_desc_where_found(s16b level, s16b dungeon)
/*
* Describe an item
*/
-bool object_out_desc(object_type *o_ptr, FILE *fff, bool trim_down, bool wait_for_it)
+bool_ object_out_desc(object_type *o_ptr, FILE *fff, bool_ trim_down, bool_ wait_for_it)
{
u32b f1, f2, f3, f4, f5, esp;
@@ -2998,7 +2894,7 @@ bool object_out_desc(object_type *o_ptr, FILE *fff, bool trim_down, bool wait_fo
byte vc[64];
int vn;
- bool first = TRUE;
+ bool_ first = TRUE;
/* Extract the flags */
if ((!(o_ptr->ident & (IDENT_MENTAL))) && (!fff))
@@ -4106,7 +4002,7 @@ int get_slot(int slot)
* Determine which equipment slot (if any) an item likes, ignoring the player's
* current body and stuff if ideal == TRUE
*/
-s16b wield_slot_ideal(object_type *o_ptr, bool ideal)
+s16b wield_slot_ideal(object_type *o_ptr, bool_ ideal)
{
/* Try for a script first */
if (process_hooks_ret(HOOK_WIELD_SLOT, "d", "(O,d)", o_ptr, ideal))
@@ -4470,7 +4366,7 @@ cptr describe_use(int i)
/*
* Check an item against the item tester info
*/
-bool item_tester_okay(object_type *o_ptr)
+bool_ item_tester_okay(object_type *o_ptr)
{
/* Hack -- allow listing empty slots */
if (item_tester_full) return (TRUE);
@@ -4500,8 +4396,8 @@ bool item_tester_okay(object_type *o_ptr)
-void show_equip_aux(bool mirror, bool everything);
-void show_inven_aux(bool mirror, bool everything);
+void show_equip_aux(bool_ mirror, bool_ everything);
+void show_inven_aux(bool_ mirror, bool_ everything);
/*
* Choice window "shadow" of the "show_inven()" function
@@ -4545,7 +4441,7 @@ byte get_item_letter_color(object_type *o_ptr)
*
* Hack -- do not display "trailing" empty slots
*/
-void show_inven_aux(bool mirror, bool everything)
+void show_inven_aux(bool_ mirror, bool_ everything)
{
int i, j, k, l, z = 0;
int row, col, len, lim;
@@ -4706,20 +4602,20 @@ void show_inven_aux(bool mirror, bool everything)
}
-void show_inven(bool mirror)
+void show_inven()
{
- show_inven_aux(mirror, FALSE);
+ show_inven_aux(FALSE, FALSE);
}
-void show_equip(bool mirror)
+void show_equip()
{
- show_equip_aux(mirror, FALSE);
+ show_equip_aux(FALSE, FALSE);
}
/*
* Display the equipment.
*/
-void show_equip_aux(bool mirror, bool everything)
+void show_equip_aux(bool_ mirror, bool_ everything)
{
int i, j, k, l;
int row, col, len, lim, idx;
@@ -4995,7 +4891,7 @@ void toggle_inven_equip(void)
*
* The item can be negative to mean "item on floor".
*/
-bool verify(cptr prompt, int item)
+bool_ verify(cptr prompt, int item)
{
char o_name[80];
@@ -5003,17 +4899,8 @@ bool verify(cptr prompt, int item)
object_type *o_ptr;
- /* Inventory */
- if (item >= 0)
- {
- o_ptr = &p_ptr->inventory[item];
- }
-
- /* Floor */
- else
- {
- o_ptr = &o_list[0 - item];
- }
+ /* Get object */
+ o_ptr = get_object(item);
/* Describe */
object_desc(o_name, o_ptr, TRUE, 3);
@@ -5031,23 +4918,14 @@ bool verify(cptr prompt, int item)
*
* The item can be negative to mean "item on floor".
*/
-static bool get_item_allow(int item)
+static bool_ get_item_allow(int item)
{
cptr s;
object_type *o_ptr;
- /* Inventory */
- if (item >= 0)
- {
- o_ptr = &p_ptr->inventory[item];
- }
-
- /* Floor */
- else
- {
- o_ptr = &o_list[0 - item];
- }
+ /* Get object */
+ o_ptr = get_object(item);
/* No inscription */
if (!o_ptr->note) return (TRUE);
@@ -5078,7 +4956,7 @@ static bool get_item_allow(int item)
/*
* Auxiliary function for "get_item()" -- test an index
*/
-static bool get_item_okay(int i)
+static bool_ get_item_okay(int i)
{
/* Illegal items */
if ((i < 0) || (i >= INVEN_TOTAL)) return (FALSE);
@@ -5163,7 +5041,7 @@ static int get_tag(int *cp, char tag)
* mode & 0x02 -- Marked items only
* mode & 0x04 -- Stop after first
*/
-bool scan_floor(int *items, int *item_num, int y, int x, int mode)
+bool_ scan_floor(int *items, int *item_num, int y, int x, int mode)
{
int this_o_idx, next_o_idx;
@@ -5314,28 +5192,28 @@ void show_floor(int y, int x)
* This version of get_item() is called by get_item() when
* the easy_floor is on.
*/
-bool (*get_item_extra_hook)(int *cp);
-bool get_item_floor(int *cp, cptr pmt, cptr str, int mode)
+bool_ (*get_item_extra_hook)(int *cp);
+bool_ get_item_floor(int *cp, cptr pmt, cptr str, int mode)
{
char n1 = 0, n2 = 0, which = ' ';
int j, k, i1, i2, e1, e2;
- bool done, item;
+ bool_ done, item;
- bool oops = FALSE;
+ bool_ oops = FALSE;
- bool equip = FALSE;
- bool inven = FALSE;
- bool floor = FALSE;
- bool extra = FALSE;
- bool automat = FALSE;
+ bool_ equip = FALSE;
+ bool_ inven = FALSE;
+ bool_ floor = FALSE;
+ bool_ extra = FALSE;
+ bool_ automat = FALSE;
- bool allow_equip = FALSE;
- bool allow_inven = FALSE;
- bool allow_floor = FALSE;
+ bool_ allow_equip = FALSE;
+ bool_ allow_inven = FALSE;
+ bool_ allow_floor = FALSE;
- bool toggle = FALSE;
+ bool_ toggle = FALSE;
char tmp_val[160];
char out_val[160];
@@ -5343,7 +5221,6 @@ bool get_item_floor(int *cp, cptr pmt, cptr str, int mode)
int floor_num, floor_list[23], floor_top = 0;
k = 0;
-#ifdef ALLOW_REPEAT
/* Get the item index */
if (repeat_pull(cp))
@@ -5387,7 +5264,6 @@ bool get_item_floor(int *cp, cptr pmt, cptr str, int mode)
}
}
-#endif /* ALLOW_REPEAT */
/* Extract args */
if (mode & (USE_EQUIP)) equip = TRUE;
@@ -5454,9 +5330,6 @@ bool get_item_floor(int *cp, cptr pmt, cptr str, int mode)
/* Require at least one legal choice */
if (!allow_inven && !allow_equip && !allow_floor)
{
- /* Cancel command_see */
- command_see = FALSE;
-
/* Oops */
oops = TRUE;
@@ -5468,8 +5341,7 @@ bool get_item_floor(int *cp, cptr pmt, cptr str, int mode)
else
{
/* Hack -- Start on equipment if requested */
- if (command_see && (command_wrk == (USE_EQUIP))
- && allow_equip)
+ if ((command_wrk == (USE_EQUIP)) && allow_equip)
{
command_wrk = (USE_EQUIP);
}
@@ -5493,12 +5365,8 @@ bool get_item_floor(int *cp, cptr pmt, cptr str, int mode)
}
}
- /* Hack -- start out in "display" mode */
- if (command_see)
- {
- /* Save screen */
- screen_save();
- }
+ /* Save screen */
+ screen_save();
/* Repeat until done */
while (!done)
@@ -5547,8 +5415,8 @@ bool get_item_floor(int *cp, cptr pmt, cptr str, int mode)
n1 = I2A(i1);
n2 = I2A(i2);
- /* Redraw if needed */
- if (command_see) show_inven(FALSE);
+ /* Redraw */
+ show_inven();
}
/* Equipment screen */
@@ -5558,8 +5426,8 @@ bool get_item_floor(int *cp, cptr pmt, cptr str, int mode)
n1 = I2A(e1 - INVEN_WIELD);
n2 = I2A(e2 - INVEN_WIELD);
- /* Redraw if needed */
- if (command_see) show_equip(FALSE);
+ /* Redraw */
+ show_equip();
}
/* Floor screen */
@@ -5572,8 +5440,8 @@ bool get_item_floor(int *cp, cptr pmt, cptr str, int mode)
n1 = I2A(j - floor_top);
n2 = I2A(k - floor_top);
- /* Redraw if needed */
- if (command_see) show_floor(p_ptr->py, p_ptr->px);
+ /* Redraw */
+ show_floor(p_ptr->py, p_ptr->px);
}
/* Viewing inventory */
@@ -5589,9 +5457,6 @@ bool get_item_floor(int *cp, cptr pmt, cptr str, int mode)
/* Append */
strcat(out_val, tmp_val);
- /* Indicate ability to "view" */
- if (!command_see) strcat(out_val, " * to see,");
-
/* Append */
if (allow_equip) strcat(out_val, " / for Equip,");
@@ -5612,9 +5477,6 @@ bool get_item_floor(int *cp, cptr pmt, cptr str, int mode)
/* Append */
strcat(out_val, tmp_val);
- /* Indicate ability to "view" */
- if (!command_see) strcat(out_val, " * to see,");
-
/* Append */
if (allow_inven) strcat(out_val, " / for Inven,");
@@ -5634,9 +5496,6 @@ bool get_item_floor(int *cp, cptr pmt, cptr str, int mode)
/* Append */
strcat(out_val, tmp_val);
- /* Indicate ability to "view" */
- if (!command_see) strcat(out_val, " * to see,");
-
/* Append */
if (allow_inven)
{
@@ -5684,32 +5543,6 @@ bool get_item_floor(int *cp, cptr pmt, cptr str, int mode)
break;
}
- case '*':
- case '?':
- case ' ':
- {
- /* Hide the list */
- if (command_see)
- {
- /* Flip flag */
- command_see = FALSE;
-
- /* Load screen */
- screen_load();
- }
-
- /* Show the list */
- else
- {
- /* Save screen */
- screen_save();
-
- /* Flip flag */
- command_see = TRUE;
- }
- break;
- }
-
case '/':
{
if (command_wrk == (USE_INVEN))
@@ -5748,14 +5581,8 @@ bool get_item_floor(int *cp, cptr pmt, cptr str, int mode)
}
/* Hack -- Fix screen */
- if (command_see)
- {
- /* Load screen */
- screen_load();
-
- /* Save screen */
- screen_save();
- }
+ screen_load();
+ screen_save();
/* Need to redraw */
break;
@@ -5800,14 +5627,8 @@ bool get_item_floor(int *cp, cptr pmt, cptr str, int mode)
}
/* Hack -- Fix screen */
- if (command_see)
- {
- /* Load screen */
- screen_load();
-
- /* Save screen */
- screen_save();
- }
+ screen_load();
+ screen_save();
command_wrk = (USE_FLOOR);
@@ -6011,16 +5832,8 @@ bool get_item_floor(int *cp, cptr pmt, cptr str, int mode)
}
}
- /* Fix the screen if necessary */
- if (command_see)
- {
- /* Load screen */
- screen_load();
-
- /* Hack -- Cancel "display" */
- command_see = FALSE;
- }
-
+ /* Fix the screen */
+ screen_load();
/* Forget the item_tester_tval restriction */
item_tester_tval = 0;
@@ -6061,12 +5874,9 @@ bool get_item_floor(int *cp, cptr pmt, cptr str, int mode)
/* Warning if needed */
if (oops && str) msg_print(str);
-#ifdef ALLOW_REPEAT
if (item) repeat_push(*cp);
-#endif /* ALLOW_REPEAT */
-
/* Result */
return (item);
}
@@ -6113,19 +5923,15 @@ bool get_item_floor(int *cp, cptr pmt, cptr str, int mode)
* to allow the user to enter a command while viewing those screens, and
* also to induce "auto-enter" of stores, and other such stuff.
*
- * Global "p_ptr->command_see" may be set before calling this function to start
- * out in "browse" mode. It is cleared before this function returns.
- *
* Global "p_ptr->command_wrk" is used to choose between equip/inven listings.
* If it is TRUE then we are viewing inventory, else equipment.
*
* We always erase the prompt when we are done, leaving a blank line,
* or a warning message, if appropriate, if no items are available.
*/
-bool get_item(int *cp, cptr pmt, cptr str, int mode)
+bool_ get_item(int *cp, cptr pmt, cptr str, int mode)
{
automatizer_create = FALSE;
- command_see = TRUE; /* Start out displaying all alternatives. */
return get_item_floor(cp, pmt, str, mode);
}
@@ -6133,7 +5939,7 @@ bool get_item(int *cp, cptr pmt, cptr str, int mode)
/*
* Hook to determine if an object is getable
*/
-static bool item_tester_hook_getable(object_type *o_ptr)
+static bool_ item_tester_hook_getable(object_type *o_ptr)
{
if (!inven_carry_okay(o_ptr)) return (FALSE);
@@ -6264,7 +6070,7 @@ void pickup_ammo()
*
* This is called by py_pickup() when easy_floor is TRUE.
*/
-bool can_carry_heavy(object_type *o_ptr)
+bool_ can_carry_heavy(object_type *o_ptr)
{
/* Query if object is heavy */
if (prompt_pickup_heavy)
@@ -6375,9 +6181,9 @@ void py_pickup_floor(int pickup)
int floor_num = 0, floor_o_idx = 0;
- bool do_pickup = TRUE;
+ bool_ do_pickup = TRUE;
- bool do_ask = TRUE;
+ bool_ do_ask = TRUE;
/* Hack -- ignore monster traps */
if (cave[p_ptr->py][p_ptr->px].feat == FEAT_MON_TRAP) return;
@@ -6560,7 +6366,7 @@ void py_pickup_floor(int pickup)
}
/* Add a flags group */
-void gain_flag_group(object_type *o_ptr, bool silent)
+void gain_flag_group(object_type *o_ptr, bool_ silent)
{
int grp = 0;
int tries = 1000;
@@ -6655,7 +6461,7 @@ u32b get_flag(object_type *o_ptr, int grp, int k)
}
/* Add a flags from a flag group */
-void gain_flag_group_flag(object_type *o_ptr, bool silent)
+void gain_flag_group_flag(object_type *o_ptr, bool_ silent)
{
int grp = 0, k = 0;
u32b f = 0;
@@ -6762,7 +6568,7 @@ void object_gain_level(object_type *o_ptr)
/*
* Item sets fcts
*/
-bool wield_set(s16b a_idx, s16b set_idx, bool silent)
+bool_ wield_set(s16b a_idx, s16b set_idx, bool_ silent)
{
set_type *s_ptr = &set_info[set_idx];
int i;
@@ -6781,7 +6587,7 @@ bool wield_set(s16b a_idx, s16b set_idx, bool silent)
return (FALSE);
}
-bool takeoff_set(s16b a_idx, s16b set_idx)
+bool_ takeoff_set(s16b a_idx, s16b set_idx)
{
set_type *s_ptr = &set_info[set_idx];
int i;
@@ -6802,7 +6608,7 @@ bool takeoff_set(s16b a_idx, s16b set_idx)
return (FALSE);
}
-bool apply_set(s16b a_idx, s16b set_idx)
+bool_ apply_set(s16b a_idx, s16b set_idx)
{
set_type *s_ptr = &set_info[set_idx];
int i, j;
@@ -6828,7 +6634,7 @@ bool apply_set(s16b a_idx, s16b set_idx)
return (FALSE);
}
-bool apply_flags_set(s16b a_idx, s16b set_idx,
+bool_ apply_flags_set(s16b a_idx, s16b set_idx,
u32b *f1, u32b *f2, u32b *f3, u32b *f4, u32b *f5, u32b *esp)
{
set_type *s_ptr = &set_info[set_idx];
@@ -6861,4 +6667,3 @@ bool apply_flags_set(s16b a_idx, s16b set_idx,
-
diff --git a/src/object2.c b/src/object2.c
index b4750a3a..98afb815 100644
--- a/src/object2.c
+++ b/src/object2.c
@@ -13,58 +13,6 @@
#include "angband.h"
/*
- * adds n flags to o_ptr chosen randomly from the masks f1..f4
- */
-#if 0
-static void enhance_random(object_type *o_ptr, int n, u32b f1, u32b f2, u32b f3, u32b f4)
-{
- int counter = 0, null_mask;
- u32b *f, *t, x;
-
- while (n)
- {
- /* inefficient, but simple */
- x = BIT(rand_int(32));
- switch (randint(4))
- {
- case 1:
- null_mask = TR1_NULL_MASK;
- f = &f1;
- t = &o_ptr->art_flags1;
- break;
- case 2:
- null_mask = TR2_NULL_MASK;
- f = &f2;
- t = &o_ptr->art_flags2;
- break;
- case 3:
- null_mask = TR3_NULL_MASK;
- f = &f3;
- t = &o_ptr->art_flags3;
- break;
- case 4:
- null_mask = TR4_NULL_MASK;
- f = &f4;
- t = &o_ptr->art_flags4;
- break;
- default:
- null_mask = 0;
- f = t = NULL;
- return;
- }
- if (++counter > 10000) break;
- if (x & null_mask) continue;
- if (!(x & *f)) continue;
- if (x & *t) continue;
- /* success */
- *f &= ~x;
- *t |= x;
- n--;
- }
-}
-#endif
-
-/*
* Calculate the player's total inventory weight.
*/
s32b calc_total_weight(void)
@@ -1283,10 +1231,6 @@ s32b object_value_real(object_type *o_ptr)
case TV_TRAPKIT:
case TV_INSTRUMENT:
{
-#if 0 /* DG - no */
- /* Hack -- Negative "pval" is always bad */
- if (o_ptr->pval < 0) return (0L);
-#endif
/* No pval */
if (!o_ptr->pval) break;
@@ -1559,7 +1503,7 @@ s32b object_value(object_type *o_ptr)
*
* Chests, and activatable items, never stack (for various reasons).
*/
-bool object_similar(object_type *o_ptr, object_type *j_ptr)
+bool_ object_similar(object_type *o_ptr, object_type *j_ptr)
{
int total = o_ptr->number + j_ptr->number;
u32b f1, f2, f3, f4, f5, esp, f11, f12, f13, f14, esp1, f15;
@@ -1806,15 +1750,6 @@ bool object_similar(object_type *o_ptr, object_type *j_ptr)
/* Require identical "artifact" names */
if (o_ptr->name1 != j_ptr->name1) return (FALSE);
- /* Random artifacts never stack */
- /*
- I don't see why these shouldn't stack.
- -- wilh
- */
-#if 0
- if (o_ptr->art_name || j_ptr->art_name) return (FALSE);
-#endif
-
/* Require identical "ego-item" names */
if (o_ptr->name2 != j_ptr->name2) return (FALSE);
@@ -2124,7 +2059,7 @@ static void finalize_randart(object_type* o_ptr, int lev)
int r;
int i = 0;
int foo = lev + randnor(0, 5);
- bool flag = TRUE;
+ bool_ flag = TRUE;
/* Paranoia */
if (o_ptr->tval != TV_RANDART) return;
@@ -2196,7 +2131,7 @@ static void object_mention(object_type *o_ptr)
void random_artifact_resistance(object_type * o_ptr)
{
- bool give_resistance = FALSE, give_power = FALSE;
+ bool_ give_resistance = FALSE, give_power = FALSE;
switch (o_ptr->name1)
{
@@ -2285,7 +2220,7 @@ void random_artifact_resistance(object_type * o_ptr)
*
* Note -- see "make_artifact()" and "apply_magic()"
*/
-static bool make_artifact_special(object_type *o_ptr)
+static bool_ make_artifact_special(object_type *o_ptr)
{
int i;
int k_idx = 0;
@@ -2309,7 +2244,7 @@ static bool make_artifact_special(object_type *o_ptr)
if (!(a_ptr->flags3 & TR3_INSTA_ART)) continue;
/* Cannot generate some artifacts because they can only exists in special dungeons/quests/... */
- if ((a_ptr->flags4 & TR4_SPECIAL_GENE) && (!a_allow_special[i]) && (!vanilla_town)) continue;
+ if ((a_ptr->flags4 & TR4_SPECIAL_GENE) && (!a_allow_special[i])) continue;
/* XXX XXX Enforce minimum "depth" (loosely) */
if (a_ptr->level > dun_level)
@@ -2369,7 +2304,7 @@ static bool make_artifact_special(object_type *o_ptr)
*
* Note -- see "make_artifact_special()" and "apply_magic()"
*/
-static bool make_artifact(object_type *o_ptr)
+static bool_ make_artifact(object_type *o_ptr)
{
int i;
u32b f1, f2, f3, f4, f5, esp;
@@ -2396,7 +2331,7 @@ static bool make_artifact(object_type *o_ptr)
if (a_ptr->flags3 & TR3_INSTA_ART) continue;
/* Cannot generate some artifacts because they can only exists in special dungeons/quests/... */
- if ((a_ptr->flags4 & TR4_SPECIAL_GENE) && (!a_allow_special[i]) && (!vanilla_town)) continue;
+ if ((a_ptr->flags4 & TR4_SPECIAL_GENE) && (!a_allow_special[i])) continue;
/* Must have the correct fields */
if (a_ptr->tval != o_ptr->tval) continue;
@@ -2444,11 +2379,11 @@ static bool make_artifact(object_type *o_ptr)
*
* This routine should only be called by "apply_magic()"
*/
-static bool make_ego_item(object_type *o_ptr, bool good)
+static bool_ make_ego_item(object_type *o_ptr, bool_ good)
{
int i = 0, j;
int *ok_ego, ok_num = 0;
- bool ret = FALSE;
+ bool_ ret = FALSE;
object_kind *k_ptr = &k_info[o_ptr->k_idx];
if (artifact_p(o_ptr) || o_ptr->name2) return (FALSE);
@@ -2459,7 +2394,7 @@ static bool make_ego_item(object_type *o_ptr, bool good)
for (i = 0; i < max_e_idx; i++)
{
ego_item_type *e_ptr = &e_info[i];
- bool ok = FALSE;
+ bool_ ok = FALSE;
/* Skip "empty" items */
if (!e_ptr->name) continue;
@@ -3377,7 +3312,7 @@ static void a_m_aux_4(object_type *o_ptr, int level, int power)
/* Hack -- choose a monster */
monster_race* r_ptr;
int r_idx, count = 0;
- bool OK = FALSE;
+ bool_ OK = FALSE;
while ((!OK) && (count < 1000))
{
@@ -3540,14 +3475,6 @@ static void a_m_aux_4(object_type *o_ptr, int level, int power)
case TV_TOOL:
{
- /* Hack - set the weight of portable holes */
-#if 0 /* DGDGDGDG -- use a skill */
- if ((o_ptr->sval == SV_PORTABLE_HOLE) &&
- (cp_ptr->magic_key == MKEY_TELEKINESIS))
- {
- o_ptr->weight = portable_hole_weight();
- }
-#endif
break;
}
@@ -3571,7 +3498,7 @@ void trap_hack(object_type *o_ptr)
}
/* Add a random glag to the ego item */
-void add_random_ego_flag(object_type *o_ptr, int fego, bool *limit_blows)
+void add_random_ego_flag(object_type *o_ptr, int fego, bool_ *limit_blows)
{
if (fego & ETR4_SUSTAIN)
{
@@ -4007,7 +3934,7 @@ void add_random_ego_flag(object_type *o_ptr, int fego, bool *limit_blows)
* true, then the item gets 3 extra "attempts" to become an artifact.
*/
int hack_apply_magic_power = 0;
-void apply_magic(object_type *o_ptr, int lev, bool okay, bool good, bool great)
+void apply_magic(object_type *o_ptr, int lev, bool_ okay, bool_ good, bool_ great)
{
int i, rolls, f1, f2, power;
object_kind *k_ptr = &k_info[o_ptr->k_idx];
@@ -4245,15 +4172,7 @@ void apply_magic(object_type *o_ptr, int lev, bool okay, bool good, bool great)
case TV_GLOVES:
case TV_BOOTS:
{
-#if 0
- if (power ||
- ((o_ptr->tval == TV_HELM) && (o_ptr->sval == SV_DRAGON_HELM)) ||
- ((o_ptr->tval == TV_SHIELD) && (o_ptr->sval == SV_DRAGON_SHIELD)) ||
- ((o_ptr->tval == TV_CLOAK) && (o_ptr->sval == SV_ELVEN_CLOAK)))
- a_m_aux_2(o_ptr, lev, power);
-#else
a_m_aux_2(o_ptr, lev, power);
-#endif
break;
}
@@ -4279,7 +4198,7 @@ void apply_magic(object_type *o_ptr, int lev, bool okay, bool good, bool great)
{
ego_item_type *e_ptr;
int j;
- bool limit_blows = FALSE;
+ bool_ limit_blows = FALSE;
u32b f1, f2, f3, f4, f5, esp;
s16b e_idx;
@@ -4432,7 +4351,7 @@ void init_match_theme(obj_theme theme)
/*
* Ditto XXX XXX XXX
*/
-static bool theme_changed(obj_theme theme)
+static bool_ theme_changed(obj_theme theme)
{
/* Any of the themes has been changed */
if (theme.treasure != match_theme.treasure) return (TRUE);
@@ -4448,7 +4367,7 @@ static bool theme_changed(obj_theme theme)
/*
* Maga-Hack -- match certain types of object only.
*/
-bool kind_is_theme(int k_idx)
+bool_ kind_is_theme(int k_idx)
{
object_kind *k_ptr = &k_info[k_idx];
@@ -4642,7 +4561,7 @@ bool kind_is_theme(int k_idx)
* Determine if an object must not be generated.
*/
int kind_is_legal_special = -1;
-bool kind_is_legal(int k_idx)
+bool_ kind_is_legal(int k_idx)
{
object_kind *k_ptr = &k_info[k_idx];
@@ -4689,7 +4608,7 @@ bool kind_is_legal(int k_idx)
/*
* Hack -- determine if a template is "good"
*/
-bool kind_is_good(int k_idx)
+bool_ kind_is_good(int k_idx)
{
object_kind *k_ptr = &k_info[k_idx];
@@ -4786,7 +4705,7 @@ bool kind_is_good(int k_idx)
/*
* Determine if template is suitable for building a randart -- dsb
*/
-bool kind_is_artifactable(int k_idx)
+bool_ kind_is_artifactable(int k_idx)
{
int i, j;
object_kind *k_ptr = &k_info[k_idx];
@@ -4829,7 +4748,7 @@ bool kind_is_artifactable(int k_idx)
* through the forge--object_prep()--apply_magic() sequence and
* get_obj_num() should never be called for that purpose XXX XXX XXX
*/
-bool make_object(object_type *j_ptr, bool good, bool great, obj_theme theme)
+bool_ make_object(object_type *j_ptr, bool_ good, bool_ great, obj_theme theme)
{
int invprob, base;
@@ -4946,7 +4865,7 @@ bool make_object(object_type *j_ptr, bool good, bool great, obj_theme theme)
*
* This routine requires a clean floor grid destination.
*/
-void place_object(int y, int x, bool good, bool great, int where)
+void place_object(int y, int x, bool_ good, bool_ great, int where)
{
s16b o_idx;
@@ -5058,7 +4977,7 @@ void place_object(int y, int x, bool good, bool great, int where)
*
* The location must be a legal, clean, floor grid.
*/
-bool make_gold(object_type *j_ptr)
+bool_ make_gold(object_type *j_ptr)
{
int i;
@@ -5195,10 +5114,10 @@ s16b drop_near(object_type *j_ptr, int chance, int y, int x)
char o_name[80];
- bool flag = FALSE;
- bool done = FALSE;
+ bool_ flag = FALSE;
+ bool_ done = FALSE;
- bool plural = FALSE;
+ bool_ plural = FALSE;
/* Extract plural */
@@ -5239,7 +5158,7 @@ s16b drop_near(object_type *j_ptr, int chance, int y, int x)
/* Scan local grids */
for (dx = -3; dx <= 3; dx++)
{
- bool comb = FALSE;
+ bool_ comb = FALSE;
/* Calculate actual distance */
d = (dy * dy) + (dx * dx);
@@ -5487,7 +5406,7 @@ s16b drop_near(object_type *j_ptr, int chance, int y, int x)
/*
* Scatter some "great" objects near the player
*/
-void acquirement(int y1, int x1, int num, bool great, bool known)
+void acquirement(int y1, int x1, int num, bool_ great, bool_ known)
{
object_type *i_ptr;
object_type object_type_body;
@@ -5626,7 +5545,7 @@ void inven_item_increase(int item, int num)
/*
* Erase an inventory slot if it has no more items
*/
-bool inven_item_optimize(int item)
+bool_ inven_item_optimize(int item)
{
object_type *o_ptr = &p_ptr->inventory[item];
@@ -5776,13 +5695,52 @@ void floor_item_optimize(int item)
}
+/*
+ * Increase stack size for item, describe and optimize.
+ */
+void inc_stack_size(int item, int delta) {
+ inc_stack_size_ex(item, delta, OPTIMIZE, DESCRIBE);
+}
+
+/*
+ * Increase stack size for item.
+ */
+void inc_stack_size_ex(int item, int delta, optimize_flag opt, describe_flag desc) {
+ /* Pack item? */
+ if (item >= 0)
+ {
+ inven_item_increase(item, delta);
+ if (desc == DESCRIBE)
+ {
+ inven_item_describe(item);
+ }
+ if (opt == OPTIMIZE)
+ {
+ inven_item_optimize(item);
+ }
+ }
+
+ /* Floor item? */
+ else
+ {
+ floor_item_increase(0 - item, delta);
+ if (desc == DESCRIBE)
+ {
+ floor_item_describe(0 - item);
+ }
+ if (opt == OPTIMIZE)
+ {
+ floor_item_optimize(0 - item);
+ }
+ }
+}
/*
* Check if we have space for an item in the pack without overflow
*/
-bool inven_carry_okay(object_type *o_ptr)
+bool_ inven_carry_okay(object_type *o_ptr)
{
int j;
@@ -5828,7 +5786,7 @@ bool inven_carry_okay(object_type *o_ptr)
* The "final" flag tells this function to bypass the "combine"
* and "reorder" code until later.
*/
-s16b inven_carry(object_type *o_ptr, bool final)
+s16b inven_carry(object_type *o_ptr, bool_ final)
{
int i, j, k;
int n = -1;
@@ -5986,7 +5944,7 @@ s16b inven_carry(object_type *o_ptr, bool final)
*
* Return the inventory slot into which the item is placed.
*/
-s16b inven_takeoff(int item, int amt, bool force_drop)
+s16b inven_takeoff(int item, int amt, bool_ force_drop)
{
int slot;
@@ -6058,8 +6016,7 @@ s16b inven_takeoff(int item, int amt, bool force_drop)
}
/* Modify, Optimize */
- inven_item_increase(item, -amt);
- inven_item_optimize(item);
+ inc_stack_size_ex(item, -amt, OPTIMIZE, NO_DESCRIBE);
if ((item == INVEN_CARRY) && (get_skill(SKILL_SYMBIOTIC)))
{
@@ -6095,7 +6052,7 @@ s16b inven_takeoff(int item, int amt, bool force_drop)
*
* The object will be dropped "near" the current location
*/
-void inven_drop(int item, int amt, int dy, int dx, bool silent)
+void inven_drop(int item, int amt, int dy, int dx, bool_ silent)
{
object_type forge;
object_type *q_ptr;
@@ -6161,9 +6118,7 @@ void inven_drop(int item, int amt, int dy, int dx, bool silent)
drop_near(q_ptr, 0, dy, dx);
/* Modify, Describe, Optimize */
- inven_item_increase(item, -amt);
- inven_item_describe(item);
- inven_item_optimize(item);
+ inc_stack_size(item, -amt);
}
}
@@ -6179,7 +6134,7 @@ void combine_pack(void)
int i, j, k;
object_type *o_ptr;
object_type *j_ptr;
- bool flag = FALSE;
+ bool_ flag = FALSE;
/* Combine the pack (backwards) */
@@ -6250,7 +6205,7 @@ void reorder_pack(void)
object_type *q_ptr;
object_type *j_ptr;
object_type *o_ptr;
- bool flag = FALSE;
+ bool_ flag = FALSE;
/* Re-order the pack (forwards) */
@@ -6504,8 +6459,7 @@ void pack_decay(int item)
wt = r_ptr->weight;
/* Get rid of decayed object */
- inven_item_increase(item, -amt);
- inven_item_optimize(item);
+ inc_stack_size_ex(item, -amt, OPTIMIZE, NO_DESCRIBE);
if (i_ptr->tval == TV_CORPSE)
{
@@ -6576,7 +6530,7 @@ void floor_decay(int item)
byte y = o_ptr->iy;
/* Maybe the player sees it */
- bool visible = player_can_see_bold(o_ptr->iy, o_ptr->ix);
+ bool_ visible = player_can_see_bold(o_ptr->iy, o_ptr->ix);
char desc[80];
if (visible)
diff --git a/src/player.pkg b/src/player.pkg
index f6717476..dfdced26 100644
--- a/src/player.pkg
+++ b/src/player.pkg
@@ -1766,12 +1766,6 @@ struct player_type
*/
byte body_parts[28];
- /** @structvar extra_body_parts[BODY_MAX]
- * @brief Number
- * @note Various body modifiers
- */
- s16b extra_body_parts[BODY_MAX];
-
/** @structvar powers_mod[POWER_MAX_INIT]
* @brief Boolean
* @note Intrinsinc powers
diff --git a/src/plots.c b/src/plots.c
index 4acc4af3..53d3e1bc 100644
--- a/src/plots.c
+++ b/src/plots.c
@@ -70,7 +70,7 @@ void dump_hooks(int h_idx)
}
/* Check a hook */
-bool check_hook(int h_idx)
+bool_ check_hook(int h_idx)
{
hooks_chain *c = hooks_heads[h_idx];
@@ -80,7 +80,7 @@ bool check_hook(int h_idx)
/* Add a hook */
hooks_chain* add_hook(int h_idx, hook_type hook, cptr name)
{
- hooks_chain *new, *c = hooks_heads[h_idx];
+ hooks_chain *new_, *c = hooks_heads[h_idx];
/* Find it */
while ((c != NULL) && (strcmp(c->name, name)))
@@ -91,16 +91,16 @@ hooks_chain* add_hook(int h_idx, hook_type hook, cptr name)
/* If not already in the list, add it */
if (c == NULL)
{
- MAKE(new, hooks_chain);
- new->hook = hook;
- sprintf(new->name, "%s", name);
+ MAKE(new_, hooks_chain);
+ new_->hook = hook;
+ sprintf(new_->name, "%s", name);
#ifdef DEBUG_HOOK
if (wizard) cmsg_format(TERM_VIOLET, "HOOK ADD: %s", name);
if (take_notes) add_note(format("HOOK ADD: %s", name), 'D');
#endif
- new->next = hooks_heads[h_idx];
- hooks_heads[h_idx] = new;
- return (new);
+ new_->next = hooks_heads[h_idx];
+ hooks_heads[h_idx] = new_;
+ return (new_);
}
else return (c);
}
@@ -229,7 +229,7 @@ char* get_next_arg_str(char *fmt)
/* Actually process the hooks */
int process_hooks_restart = FALSE;
hook_return process_hooks_return[20];
-static bool vprocess_hooks_return (int h_idx, char *ret, char *fmt, va_list *ap)
+static bool_ vprocess_hooks_return (int h_idx, char *ret, char *fmt, va_list *ap)
{
hooks_chain *c = hooks_heads[h_idx];
va_list real_ap;
@@ -392,10 +392,10 @@ static bool vprocess_hooks_return (int h_idx, char *ret, char *fmt, va_list *ap)
return FALSE;
}
-bool process_hooks_ret(int h_idx, char *ret, char *fmt, ...)
+bool_ process_hooks_ret(int h_idx, char *ret, char *fmt, ...)
{
va_list ap;
- bool r;
+ bool_ r;
va_start(ap, fmt);
r = vprocess_hooks_return (h_idx, ret, fmt, &ap);
@@ -403,10 +403,10 @@ bool process_hooks_ret(int h_idx, char *ret, char *fmt, ...)
return (r);
}
-bool process_hooks(int h_idx, char *fmt, ...)
+bool_ process_hooks(int h_idx, char *fmt, ...)
{
va_list ap;
- bool ret;
+ bool_ ret;
va_start(ap, fmt);
ret = vprocess_hooks_return (h_idx, "", fmt, &ap);
@@ -427,7 +427,7 @@ static void quest_describe(int q_idx)
}
/* Catch-all quest hook */
-bool quest_null_hook(int q)
+bool_ quest_null_hook(int q)
{
/* Do nothing */
return (FALSE);
diff --git a/src/plots.h b/src/plots.h
index 7f89c4ce..a1a11e6c 100644
--- a/src/plots.h
+++ b/src/plots.h
@@ -2,46 +2,47 @@
/* Purpose: extern plots declarations */
-extern bool quest_null_hook(int q);
+extern bool_ quest_null_hook(int q);
/******* Random Quests ********/
-extern bool is_randhero(int level);
-extern bool quest_random_init_hook(int q_idx);
+extern bool_ is_randhero(int level);
+extern bool_ quest_random_init_hook(int q_idx);
+extern bool_ quest_random_describe(FILE *fff);
/******* Plot main ********/
-extern bool quest_necro_init_hook(int q_idx);
-extern bool quest_one_init_hook(int q_idx);
-extern bool quest_sauron_init_hook(int q_idx);
-extern bool quest_morgoth_init_hook(int q_idx);
-extern bool quest_ultra_good_init_hook(int q_idx);
-extern bool quest_ultra_evil_init_hook(int q_idx);
+extern bool_ quest_necro_init_hook(int q_idx);
+extern bool_ quest_one_init_hook(int q_idx);
+extern bool_ quest_sauron_init_hook(int q_idx);
+extern bool_ quest_morgoth_init_hook(int q_idx);
+extern bool_ quest_ultra_good_init_hook(int q_idx);
+extern bool_ quest_ultra_evil_init_hook(int q_idx);
/******* Plot Bree *********/
-extern bool quest_thieves_init_hook(int q_idx);
-extern bool quest_hobbit_init_hook(int q_idx);
-extern bool quest_troll_init_hook(int q_idx);
-extern bool quest_wight_init_hook(int q_idx);
-extern bool quest_nazgul_init_hook(int q_idx);
-extern bool quest_shroom_init_hook(int q_idx);
+extern bool_ quest_thieves_init_hook(int q_idx);
+extern bool_ quest_hobbit_init_hook(int q_idx);
+extern bool_ quest_troll_init_hook(int q_idx);
+extern bool_ quest_wight_init_hook(int q_idx);
+extern bool_ quest_nazgul_init_hook(int q_idx);
+extern bool_ quest_shroom_init_hook(int q_idx);
/******* Plot Lorien *********/
-extern bool quest_wolves_init_hook(int q_idx);
-extern bool quest_spider_init_hook(int q_idx);
-extern bool quest_poison_init_hook(int q_idx);
+extern bool_ quest_wolves_init_hook(int q_idx);
+extern bool_ quest_spider_init_hook(int q_idx);
+extern bool_ quest_poison_init_hook(int q_idx);
/******* Plot Gondolin *********/
-extern bool quest_dragons_init_hook(int q_idx);
-extern bool quest_eol_init_hook(int q_idx);
-extern bool quest_nirnaeth_init_hook(int q_idx);
-extern bool quest_invasion_init_hook(int q_idx);
+extern bool_ quest_dragons_init_hook(int q_idx);
+extern bool_ quest_eol_init_hook(int q_idx);
+extern bool_ quest_nirnaeth_init_hook(int q_idx);
+extern bool_ quest_invasion_init_hook(int q_idx);
/******* Plot Minas Anor *********/
-extern bool quest_haunted_init_hook(int q_idx);
-extern bool quest_between_init_hook(int q_idx);
+extern bool_ quest_haunted_init_hook(int q_idx);
+extern bool_ quest_between_init_hook(int q_idx);
/******* Plot Khazad-dum *********/
-extern bool quest_evil_init_hook(int q_idx);
+extern bool_ quest_evil_init_hook(int q_idx);
/******* Plot Other *********/
-extern bool quest_narsil_init_hook(int q_idx);
-extern bool quest_thrain_init_hook(int q_idx);
+extern bool_ quest_narsil_init_hook(int q_idx);
+extern bool_ quest_thrain_init_hook(int q_idx);
diff --git a/src/powers.c b/src/powers.c
index d9a41561..12b2c2c0 100644
--- a/src/powers.c
+++ b/src/powers.c
@@ -15,9 +15,9 @@
/*
* Note: return value indicates the amount of mana to use
*/
-bool power_chance(power_type *x_ptr)
+bool_ power_chance(power_type *x_ptr)
{
- bool use_hp = FALSE;
+ bool_ use_hp = FALSE;
int diff = x_ptr->diff;
/* Always true ? */
@@ -296,8 +296,7 @@ static void power_activate(int power)
{
ok = 0;
- if (item >= 0) o2_ptr = &p_ptr->inventory[item];
- else o2_ptr = &o_list[0 - item];
+ o2_ptr = get_object(item);
/* Is the item cursed? */
if ((item >= INVEN_WIELD) && cursed_p(o2_ptr))
@@ -346,18 +345,7 @@ static void power_activate(int power)
}
/* Destroy item */
- if (item >= 0)
- {
- inven_item_increase(item, -1);
- inven_item_describe(item);
- inven_item_optimize(item);
- }
- else
- {
- inven_item_increase(0 - item, -1);
- inven_item_describe(0 - item);
- inven_item_optimize(0 - item);
- }
+ inc_stack_size(item, -1);
}
}
}
@@ -663,13 +651,8 @@ static void power_activate(int power)
case PWR_WRECK_WORLD:
msg_print("The power of Eru Iluvatar flows through you!");
msg_print("The world changes!");
- if (autosave_l)
- {
- is_autosave = TRUE;
- msg_print("Autosaving the game...");
- do_cmd_save_game();
- is_autosave = FALSE;
- }
+
+ autosave_checkpoint();
/* Leaving */
p_ptr->leaving = TRUE;
break;
@@ -790,7 +773,7 @@ static void power_activate(int power)
d = 2;
while (d < 100)
{
- scatter(&y, &x, p_ptr->py, p_ptr->px, d, 0);
+ scatter(&y, &x, p_ptr->py, p_ptr->px, d);
if (cave_floor_bold(y, x) && (!cave[y][x].m_idx)) break;
@@ -1075,14 +1058,7 @@ static void power_activate(int power)
s = "You have nothing to drain.";
if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR))) break;
- if (item >= 0)
- {
- o_ptr = &p_ptr->inventory[item];
- }
- else
- {
- o_ptr = &o_list[0 - item];
- }
+ o_ptr = get_object(item);
lev = k_info[o_ptr->k_idx].level;
@@ -1261,7 +1237,7 @@ static void power_activate(int power)
/*
* Print a batch of power.
*/
-static void print_power_batch(int *p, int start, int max, bool mode)
+static void print_power_batch(int *p, int start, int max, bool_ mode)
{
char buff[80];
power_type* spell;
@@ -1295,7 +1271,7 @@ static power_type* select_power(int *x_idx)
char which;
int max = 0, i, start = 0;
power_type* ret;
- bool mode = FALSE;
+ bool_ mode = FALSE;
int *p;
C_MAKE(p, power_max, int);
@@ -1384,7 +1360,7 @@ void do_cmd_power()
{
int x_idx;
power_type *x_ptr;
- bool push = TRUE;
+ bool_ push = TRUE;
/* Get the skill, if available */
if (repeat_pull(&x_idx))
diff --git a/src/q_betwen.c b/src/q_betwen.c
index f156b843..e6452dd9 100644
--- a/src/q_betwen.c
+++ b/src/q_betwen.c
@@ -1,7 +1,7 @@
#undef cquest
#define cquest (quest[QUEST_BETWEEN])
-bool quest_between_move_hook(char *fmt)
+bool_ quest_between_move_hook(char *fmt)
{
s32b y;
s32b x;
@@ -49,7 +49,7 @@ bool quest_between_move_hook(char *fmt)
return FALSE;
}
-bool quest_between_gen_hook(char *fmt)
+bool_ quest_between_gen_hook(char *fmt)
{
int x, y;
int xstart = 2;
@@ -74,9 +74,7 @@ bool quest_between_gen_hook(char *fmt)
get_mon_num_prep();
init_flags = INIT_CREATE_DUNGEON;
- process_dungeon_file_full = TRUE;
- process_dungeon_file(NULL, "between.map", &ystart, &xstart, cur_hgt, cur_wid, TRUE);
- process_dungeon_file_full = FALSE;
+ process_dungeon_file("between.map", &ystart, &xstart, cur_hgt, cur_wid, TRUE, TRUE);
/* Otherwise instadeath */
energy_use = 0;
@@ -85,7 +83,7 @@ bool quest_between_gen_hook(char *fmt)
return TRUE;
}
-bool quest_between_finish_hook(char *fmt)
+bool_ quest_between_finish_hook(char *fmt)
{
s32b q_idx;
object_type forge, *q_ptr;
@@ -123,7 +121,7 @@ bool quest_between_finish_hook(char *fmt)
return TRUE;
}
-bool quest_between_death_hook(char *fmt)
+bool_ quest_between_death_hook(char *fmt)
{
int i, mcnt = 0;
@@ -152,7 +150,7 @@ bool quest_between_death_hook(char *fmt)
return FALSE;
}
-bool quest_between_dump_hook(char *fmt)
+bool_ quest_between_dump_hook(char *fmt)
{
if (cquest.status >= QUEST_STATUS_COMPLETED)
{
@@ -161,7 +159,7 @@ bool quest_between_dump_hook(char *fmt)
}
return (FALSE);
}
-bool quest_between_forbid_hook(char *fmt)
+bool_ quest_between_forbid_hook(char *fmt)
{
s32b q_idx;
q_idx = get_next_arg(fmt);
@@ -175,7 +173,7 @@ bool quest_between_forbid_hook(char *fmt)
}
return (FALSE);
}
-bool quest_between_init_hook(int q)
+bool_ quest_between_init_hook(int q)
{
if ((cquest.status >= QUEST_STATUS_TAKEN) && (cquest.status < QUEST_STATUS_FINISHED))
{
diff --git a/src/q_dragons.c b/src/q_dragons.c
index e06dfbe7..025e8ecd 100644
--- a/src/q_dragons.c
+++ b/src/q_dragons.c
@@ -1,7 +1,7 @@
#undef cquest
#define cquest (quest[QUEST_DRAGONS])
-bool quest_dragons_gen_hook(char *fmt)
+bool_ quest_dragons_gen_hook(char *fmt)
{
int x, y, i;
int xstart = 2;
@@ -31,7 +31,7 @@ bool quest_dragons_gen_hook(char *fmt)
get_mon_num_prep();
init_flags = INIT_CREATE_DUNGEON;
- process_dungeon_file(NULL, "dragons.map", &ystart, &xstart, cur_hgt, cur_wid, TRUE);
+ process_dungeon_file("dragons.map", &ystart, &xstart, cur_hgt, cur_wid, TRUE, FALSE);
dungeon_flags2 |= DF2_NO_GENO;
/* Place some columns */
@@ -89,7 +89,7 @@ bool quest_dragons_gen_hook(char *fmt)
return TRUE;
}
-bool quest_dragons_death_hook(char *fmt)
+bool_ quest_dragons_death_hook(char *fmt)
{
int i, mcnt = 0;
@@ -121,7 +121,7 @@ bool quest_dragons_death_hook(char *fmt)
return FALSE;
}
-bool quest_dragons_finish_hook(char *fmt)
+bool_ quest_dragons_finish_hook(char *fmt)
{
s32b q_idx;
@@ -138,7 +138,7 @@ bool quest_dragons_finish_hook(char *fmt)
return TRUE;
}
-bool quest_dragons_init_hook(int q_idx)
+bool_ quest_dragons_init_hook(int q_idx)
{
if ((cquest.status >= QUEST_STATUS_UNTAKEN) && (cquest.status < QUEST_STATUS_FINISHED))
{
diff --git a/src/q_eol.c b/src/q_eol.c
index 4b66e8ad..5b1cf78e 100644
--- a/src/q_eol.c
+++ b/src/q_eol.c
@@ -1,10 +1,10 @@
#undef cquest
#define cquest (quest[QUEST_EOL])
-bool quest_eol_gen_hook(char *fmt)
+bool_ quest_eol_gen_hook(char *fmt)
{
int x, y;
- bool done = FALSE;
+ bool_ done = FALSE;
int xsize = 50, ysize = 30, y0, x0;
int m_idx = 0;
@@ -81,7 +81,7 @@ bool quest_eol_gen_hook(char *fmt)
return TRUE;
}
-bool quest_eol_finish_hook(char *fmt)
+bool_ quest_eol_finish_hook(char *fmt)
{
object_type forge, *q_ptr;
s32b q_idx;
@@ -113,7 +113,7 @@ bool quest_eol_finish_hook(char *fmt)
return TRUE;
}
-bool quest_eol_fail_hook(char *fmt)
+bool_ quest_eol_fail_hook(char *fmt)
{
s32b q_idx;
@@ -131,7 +131,7 @@ bool quest_eol_fail_hook(char *fmt)
return TRUE;
}
-bool quest_eol_death_hook(char *fmt)
+bool_ quest_eol_death_hook(char *fmt)
{
s32b r_idx, m_idx;
@@ -151,7 +151,7 @@ bool quest_eol_death_hook(char *fmt)
return FALSE;
}
-bool quest_eol_stair_hook(char *fmt)
+bool_ quest_eol_stair_hook(char *fmt)
{
monster_race *r_ptr = &r_info[test_monster_name("Eol, the Dark Elf")];
cptr down;
@@ -181,7 +181,7 @@ bool quest_eol_stair_hook(char *fmt)
return FALSE;
}
-bool quest_eol_init_hook(int q)
+bool_ quest_eol_init_hook(int q)
{
if ((cquest.status >= QUEST_STATUS_TAKEN) && (cquest.status < QUEST_STATUS_FINISHED))
{
diff --git a/src/q_evil.c b/src/q_evil.c
index 1e5a19bb..a143f65c 100644
--- a/src/q_evil.c
+++ b/src/q_evil.c
@@ -1,7 +1,7 @@
#undef cquest
#define cquest (quest[QUEST_EVIL])
-bool quest_evil_gen_hook(char *fmt)
+bool_ quest_evil_gen_hook(char *fmt)
{
int x, y, i;
int xstart = 2;
@@ -31,7 +31,7 @@ bool quest_evil_gen_hook(char *fmt)
get_mon_num_prep();
init_flags = INIT_CREATE_DUNGEON;
- process_dungeon_file(NULL, "evil.map", &ystart, &xstart, cur_hgt, cur_wid, TRUE);
+ process_dungeon_file("evil.map", &ystart, &xstart, cur_hgt, cur_wid, TRUE, FALSE);
dungeon_flags2 |= DF2_NO_GENO;
/* Place some random balrogs */
@@ -54,7 +54,7 @@ bool quest_evil_gen_hook(char *fmt)
return TRUE;
}
-bool quest_evil_death_hook(char *fmt)
+bool_ quest_evil_death_hook(char *fmt)
{
int i, mcnt = 0;
@@ -88,7 +88,7 @@ bool quest_evil_death_hook(char *fmt)
return FALSE;
}
-bool quest_evil_finish_hook(char *fmt)
+bool_ quest_evil_finish_hook(char *fmt)
{
s32b q_idx;
@@ -105,7 +105,7 @@ bool quest_evil_finish_hook(char *fmt)
return TRUE;
}
-bool quest_evil_init_hook(int q_idx)
+bool_ quest_evil_init_hook(int q_idx)
{
if ((cquest.status >= QUEST_STATUS_UNTAKEN) && (cquest.status < QUEST_STATUS_FINISHED))
{
diff --git a/src/q_haunted.c b/src/q_haunted.c
index 9cd76d81..db8992bc 100644
--- a/src/q_haunted.c
+++ b/src/q_haunted.c
@@ -1,7 +1,7 @@
#undef cquest
#define cquest (quest[QUEST_HAUNTED])
-bool quest_haunted_gen_hook(char *fmt)
+bool_ quest_haunted_gen_hook(char *fmt)
{
int x, y, i, m_idx;
int xstart = 2;
@@ -31,7 +31,7 @@ bool quest_haunted_gen_hook(char *fmt)
get_mon_num_prep();
init_flags = INIT_CREATE_DUNGEON;
- process_dungeon_file(NULL, "haunted.map", &ystart, &xstart, cur_hgt, cur_wid, TRUE);
+ process_dungeon_file("haunted.map", &ystart, &xstart, cur_hgt, cur_wid, TRUE, FALSE);
dungeon_flags2 |= DF2_NO_GENO;
/* Place some ghosts */
@@ -86,7 +86,7 @@ bool quest_haunted_gen_hook(char *fmt)
return TRUE;
}
-bool quest_haunted_death_hook(char *fmt)
+bool_ quest_haunted_death_hook(char *fmt)
{
int i, mcnt = 0;
@@ -118,7 +118,7 @@ bool quest_haunted_death_hook(char *fmt)
return FALSE;
}
-bool quest_haunted_finish_hook(char *fmt)
+bool_ quest_haunted_finish_hook(char *fmt)
{
s32b q_idx;
@@ -135,7 +135,7 @@ bool quest_haunted_finish_hook(char *fmt)
return TRUE;
}
-bool quest_haunted_init_hook(int q_idx)
+bool_ quest_haunted_init_hook(int q_idx)
{
if ((cquest.status >= QUEST_STATUS_UNTAKEN) && (cquest.status < QUEST_STATUS_FINISHED))
{
diff --git a/src/q_hobbit.c b/src/q_hobbit.c
index 0dd4ef58..f3b7d856 100644
--- a/src/q_hobbit.c
+++ b/src/q_hobbit.c
@@ -1,9 +1,9 @@
#undef cquest
#define cquest (quest[QUEST_HOBBIT])
-bool quest_hobbit_town_gen_hook(char *fmt)
+bool_ quest_hobbit_town_gen_hook(char *fmt)
{
- int x = 1, y = 1, try = 10000;
+ int x = 1, y = 1, tries = 10000;
s32b small;
small = get_next_arg(fmt);
@@ -11,7 +11,7 @@ bool quest_hobbit_town_gen_hook(char *fmt)
if ((turn < (cquest.data[1] + (DAY * 10L))) || (cquest.status > QUEST_STATUS_COMPLETED) || (small) || (p_ptr->town_num != 1)) return (FALSE);
/* Find a good position */
- while (try)
+ while (tries)
{
/* Get a random spot */
y = randint(20) + (cur_hgt / 2) - 10;
@@ -23,7 +23,7 @@ bool quest_hobbit_town_gen_hook(char *fmt)
cave_plain_floor_bold(y, x)) break;
/* One less try */
- try--;
+ tries--;
}
/* Place Melinda */
@@ -33,14 +33,14 @@ bool quest_hobbit_town_gen_hook(char *fmt)
return FALSE;
}
-bool quest_hobbit_gen_hook(char *fmt)
+bool_ quest_hobbit_gen_hook(char *fmt)
{
- int x = 1, y = 1, try = 10000;
+ int x = 1, y = 1, tries = 10000;
if ((cquest.status != QUEST_STATUS_TAKEN) || (dun_level != cquest.data[0]) || (dungeon_type != DUNGEON_MAZE)) return FALSE;
/* Find a good position */
- while (try)
+ while (tries)
{
/* Get a random spot */
y = randint(cur_hgt - 4) + 2;
@@ -50,7 +50,7 @@ bool quest_hobbit_gen_hook(char *fmt)
if (cave_empty_bold(y, x)) break;
/* One less try */
- try--;
+ tries--;
}
/* Place the hobbit */
@@ -60,7 +60,7 @@ bool quest_hobbit_gen_hook(char *fmt)
return FALSE;
}
-bool quest_hobbit_give_hook(char *fmt)
+bool_ quest_hobbit_give_hook(char *fmt)
{
object_type *o_ptr;
monster_type *m_ptr;
@@ -80,8 +80,8 @@ bool quest_hobbit_give_hook(char *fmt)
msg_print("Merton Proudfoot reads the scroll and is recalled to the safety of his home.");
delete_monster_idx(m_idx);
- inven_item_increase(item, -1);
- inven_item_optimize(item);
+
+ inc_stack_size_ex(item, -1, OPTIMIZE, NO_DESCRIBE);
cquest.status = QUEST_STATUS_COMPLETED;
@@ -90,7 +90,7 @@ bool quest_hobbit_give_hook(char *fmt)
return TRUE;
}
-bool quest_hobbit_speak_hook(char *fmt)
+bool_ quest_hobbit_speak_hook(char *fmt)
{
s32b m_idx = get_next_arg(fmt);
@@ -106,7 +106,7 @@ bool quest_hobbit_speak_hook(char *fmt)
}
return (TRUE);
}
-bool quest_hobbit_chat_hook(char *fmt)
+bool_ quest_hobbit_chat_hook(char *fmt)
{
monster_type *m_ptr;
s32b m_idx;
@@ -158,7 +158,7 @@ bool quest_hobbit_chat_hook(char *fmt)
return TRUE;
}
-bool quest_hobbit_dump_hook(char *fmt)
+bool_ quest_hobbit_dump_hook(char *fmt)
{
if (cquest.status >= QUEST_STATUS_COMPLETED)
{
@@ -166,7 +166,7 @@ bool quest_hobbit_dump_hook(char *fmt)
}
return (FALSE);
}
-bool quest_hobbit_init_hook(int q_idx)
+bool_ quest_hobbit_init_hook(int q_idx)
{
/* Get a level to place the hobbit */
if (!cquest.data[0])
diff --git a/src/q_invas.c b/src/q_invas.c
index 5365c72b..59c71d62 100644
--- a/src/q_invas.c
+++ b/src/q_invas.c
@@ -1,7 +1,7 @@
#undef cquest
#define cquest (quest[QUEST_INVASION])
-bool quest_invasion_gen_hook(char *fmt)
+bool_ quest_invasion_gen_hook(char *fmt)
{
int x, y;
int xstart = 2;
@@ -26,9 +26,7 @@ bool quest_invasion_gen_hook(char *fmt)
get_mon_num_prep();
init_flags = INIT_CREATE_DUNGEON;
- process_dungeon_file_full = TRUE;
- process_dungeon_file(NULL, "maeglin.map", &ystart, &xstart, cur_hgt, cur_wid, TRUE);
- process_dungeon_file_full = FALSE;
+ process_dungeon_file("maeglin.map", &ystart, &xstart, cur_hgt, cur_wid, TRUE, TRUE);
for (x = 3; x < xstart; x++)
for (y = 3; y < ystart; y++)
@@ -45,7 +43,7 @@ bool quest_invasion_gen_hook(char *fmt)
return TRUE;
}
-bool quest_invasion_ai_hook(char *fmt)
+bool_ quest_invasion_ai_hook(char *fmt)
{
monster_type *m_ptr;
s32b m_idx;
@@ -84,9 +82,9 @@ bool quest_invasion_ai_hook(char *fmt)
return (FALSE);
}
-bool quest_invasion_turn_hook(char *fmt)
+bool_ quest_invasion_turn_hook(char *fmt)
{
- bool old_quick_messages = quick_messages;
+ bool_ old_quick_messages = quick_messages;
if (cquest.status != QUEST_STATUS_UNTAKEN) return (FALSE);
if (p_ptr->lev < 45) return (FALSE);
@@ -113,7 +111,7 @@ bool quest_invasion_turn_hook(char *fmt)
process_hooks_restart = TRUE;
return (FALSE);
}
-bool quest_invasion_dump_hook(char *fmt)
+bool_ quest_invasion_dump_hook(char *fmt)
{
if (cquest.status == QUEST_STATUS_FAILED)
{
@@ -125,7 +123,7 @@ bool quest_invasion_dump_hook(char *fmt)
}
return (FALSE);
}
-bool quest_invasion_death_hook(char *fmt)
+bool_ quest_invasion_death_hook(char *fmt)
{
s32b r_idx, m_idx;
@@ -145,7 +143,7 @@ bool quest_invasion_death_hook(char *fmt)
return FALSE;
}
-bool quest_invasion_stair_hook(char *fmt)
+bool_ quest_invasion_stair_hook(char *fmt)
{
cptr down;
@@ -188,7 +186,7 @@ bool quest_invasion_stair_hook(char *fmt)
return TRUE;
}
-bool quest_invasion_init_hook(int q_idx)
+bool_ quest_invasion_init_hook(int q_idx)
{
add_hook(HOOK_END_TURN, quest_invasion_turn_hook, "invasion_turn");
add_hook(HOOK_CHAR_DUMP, quest_invasion_dump_hook, "invasion_dump");
diff --git a/src/q_main.c b/src/q_main.c
index 15d15ef3..a13b0790 100644
--- a/src/q_main.c
+++ b/src/q_main.c
@@ -1,4 +1,4 @@
-bool quest_main_monsters_hook(char *fmt)
+bool_ quest_main_monsters_hook(char *fmt)
{
s32b r_idx;
r_idx = get_next_arg(fmt);
@@ -17,7 +17,7 @@ bool quest_main_monsters_hook(char *fmt)
}
return FALSE;
}
-bool quest_morgoth_hook(char *fmt)
+bool_ quest_morgoth_hook(char *fmt)
{
/* Using test_monster_name() here would be a lot less ugly, but would take much more time */
monster_race *r_ptr = &r_info[862];
@@ -67,7 +67,7 @@ bool quest_morgoth_hook(char *fmt)
}
return (FALSE);
}
-bool quest_morgoth_dump_hook(char *fmt)
+bool_ quest_morgoth_dump_hook(char *fmt)
{
if (quest[QUEST_MORGOTH].status >= QUEST_STATUS_COMPLETED)
{
@@ -78,7 +78,7 @@ bool quest_morgoth_dump_hook(char *fmt)
}
return (FALSE);
}
-bool quest_morgoth_init_hook(int q_idx)
+bool_ quest_morgoth_init_hook(int q_idx)
{
if ((quest[QUEST_MORGOTH].status >= QUEST_STATUS_TAKEN) && (quest[QUEST_MORGOTH].status < QUEST_STATUS_FINISHED))
{
@@ -89,7 +89,7 @@ bool quest_morgoth_init_hook(int q_idx)
return (FALSE);
}
-bool quest_sauron_hook(char *fmt)
+bool_ quest_sauron_hook(char *fmt)
{
/* Using test_monster_name() here would be a lot less ugly, but would take much more time */
monster_race *r_ptr = &r_info[860];
@@ -113,7 +113,7 @@ bool quest_sauron_hook(char *fmt)
return (FALSE);
}
-bool quest_sauron_resurect_hook(char *fmt)
+bool_ quest_sauron_resurect_hook(char *fmt)
{
s32b m_idx = get_next_arg(fmt);
monster_type *m_ptr = &m_list[m_idx];
@@ -132,7 +132,7 @@ bool quest_sauron_resurect_hook(char *fmt)
return FALSE;
}
-bool quest_sauron_init_hook(int q_idx)
+bool_ quest_sauron_init_hook(int q_idx)
{
if ((quest[QUEST_SAURON].status >= QUEST_STATUS_TAKEN) && (quest[QUEST_SAURON].status < QUEST_STATUS_FINISHED))
{
@@ -143,7 +143,7 @@ bool quest_sauron_init_hook(int q_idx)
return (FALSE);
}
-bool quest_necro_hook(char *fmt)
+bool_ quest_necro_hook(char *fmt)
{
/* Using test_monster_name() here would be a lot less ugly, but would take much more time */
monster_race *r_ptr = &r_info[819];
@@ -165,7 +165,7 @@ bool quest_necro_hook(char *fmt)
}
return (FALSE);
}
-bool quest_necro_init_hook(int q_idx)
+bool_ quest_necro_init_hook(int q_idx)
{
if ((quest[QUEST_NECRO].status >= QUEST_STATUS_TAKEN) && (quest[QUEST_NECRO].status < QUEST_STATUS_FINISHED))
{
diff --git a/src/q_narsil.c b/src/q_narsil.c
index a15d46c6..27ec218e 100644
--- a/src/q_narsil.c
+++ b/src/q_narsil.c
@@ -1,7 +1,7 @@
#undef cquest
#define cquest (quest[QUEST_NARSIL])
-bool quest_narsil_move_hook(char *fmt)
+bool_ quest_narsil_move_hook(char *fmt)
{
s32b y, x;
cave_type *c_ptr;
@@ -20,7 +20,7 @@ bool quest_narsil_move_hook(char *fmt)
/* Look out for Narsil */
for (i = 0; i < INVEN_TOTAL; i++)
{
- o_ptr = &p_ptr->inventory[i];
+ o_ptr = get_object(i);
if (!o_ptr->k_idx) continue;
@@ -56,7 +56,7 @@ bool quest_narsil_move_hook(char *fmt)
return TRUE;
}
-bool quest_narsil_dump_hook(char *fmt)
+bool_ quest_narsil_dump_hook(char *fmt)
{
if (cquest.status >= QUEST_STATUS_COMPLETED)
{
@@ -64,7 +64,7 @@ bool quest_narsil_dump_hook(char *fmt)
}
return (FALSE);
}
-bool quest_narsil_identify_hook(char *fmt)
+bool_ quest_narsil_identify_hook(char *fmt)
{
if (cquest.status == QUEST_STATUS_UNTAKEN)
{
@@ -74,17 +74,7 @@ bool quest_narsil_identify_hook(char *fmt)
item = get_next_arg(fmt);
- /* Inventory */
- if (item >= 0)
- {
- o_ptr = &p_ptr->inventory[item];
- }
-
- /* Floor */
- else
- {
- o_ptr = &o_list[0 - item];
- }
+ o_ptr = get_object(item);
if (o_ptr->name1 == ART_NARSIL)
{
@@ -106,7 +96,7 @@ bool quest_narsil_identify_hook(char *fmt)
return (FALSE);
}
-bool quest_narsil_init_hook(int q_idx)
+bool_ quest_narsil_init_hook(int q_idx)
{
if ((cquest.status >= QUEST_STATUS_TAKEN) && (cquest.status < QUEST_STATUS_FINISHED))
{
diff --git a/src/q_nazgul.c b/src/q_nazgul.c
index ef188b16..66d3dc98 100644
--- a/src/q_nazgul.c
+++ b/src/q_nazgul.c
@@ -1,9 +1,9 @@
#undef cquest
#define cquest (quest[QUEST_NAZGUL])
-bool quest_nazgul_gen_hook(char *fmt)
+bool_ quest_nazgul_gen_hook(char *fmt)
{
- int m_idx, x = 1, y = 1, try = 10000;
+ int m_idx, x = 1, y = 1, tries = 10000;
s32b small;
small = get_next_arg(fmt);
@@ -11,7 +11,7 @@ bool quest_nazgul_gen_hook(char *fmt)
if ((cquest.status != QUEST_STATUS_TAKEN) || (small) || (p_ptr->town_num != 1)) return (FALSE);
/* Find a good position */
- while (try)
+ while (tries)
{
/* Get a random spot */
y = randint(cur_hgt - 4) + 2;
@@ -22,7 +22,7 @@ bool quest_nazgul_gen_hook(char *fmt)
if ((!los(p_ptr->py, p_ptr->px, y, x)) && cave_empty_bold(y, x)) break;
/* One less try */
- try--;
+ tries--;
}
/* Place the nazgul */
@@ -33,7 +33,7 @@ bool quest_nazgul_gen_hook(char *fmt)
return FALSE;
}
-bool quest_nazgul_finish_hook(char *fmt)
+bool_ quest_nazgul_finish_hook(char *fmt)
{
object_type forge, *q_ptr;
s32b q_idx;
@@ -63,7 +63,7 @@ bool quest_nazgul_finish_hook(char *fmt)
return TRUE;
}
-bool quest_nazgul_dump_hook(char *fmt)
+bool_ quest_nazgul_dump_hook(char *fmt)
{
if (cquest.status >= QUEST_STATUS_COMPLETED)
{
@@ -71,7 +71,7 @@ bool quest_nazgul_dump_hook(char *fmt)
}
return (FALSE);
}
-bool quest_nazgul_forbid_hook(char *fmt)
+bool_ quest_nazgul_forbid_hook(char *fmt)
{
s32b q_idx;
q_idx = get_next_arg(fmt);
@@ -85,7 +85,7 @@ bool quest_nazgul_forbid_hook(char *fmt)
}
return (FALSE);
}
-bool quest_nazgul_death_hook(char *fmt)
+bool_ quest_nazgul_death_hook(char *fmt)
{
s32b r_idx, m_idx;
@@ -102,7 +102,7 @@ bool quest_nazgul_death_hook(char *fmt)
return (FALSE);
}
-bool quest_nazgul_init_hook(int q_idx)
+bool_ quest_nazgul_init_hook(int q_idx)
{
if ((cquest.status >= QUEST_STATUS_TAKEN) && (cquest.status < QUEST_STATUS_FINISHED))
{
diff --git a/src/q_nirna.c b/src/q_nirna.c
index ab0d29ce..be856d31 100644
--- a/src/q_nirna.c
+++ b/src/q_nirna.c
@@ -1,7 +1,7 @@
#undef cquest
#define cquest (quest[QUEST_NIRNAETH])
-bool quest_nirnaeth_gen_hook(char *fmt)
+bool_ quest_nirnaeth_gen_hook(char *fmt)
{
int x, y;
int xstart = 2;
@@ -26,9 +26,7 @@ bool quest_nirnaeth_gen_hook(char *fmt)
get_mon_num_prep();
init_flags = INIT_CREATE_DUNGEON;
- process_dungeon_file_full = TRUE;
- process_dungeon_file(NULL, "nirnaeth.map", &ystart, &xstart, cur_hgt, cur_wid, TRUE);
- process_dungeon_file_full = FALSE;
+ process_dungeon_file("nirnaeth.map", &ystart, &xstart, cur_hgt, cur_wid, TRUE, TRUE);
/* Count the number of monsters */
cquest.data[0] = 0;
@@ -41,7 +39,7 @@ bool quest_nirnaeth_gen_hook(char *fmt)
return TRUE;
}
-bool quest_nirnaeth_finish_hook(char *fmt)
+bool_ quest_nirnaeth_finish_hook(char *fmt)
{
s32b q_idx;
@@ -78,7 +76,7 @@ bool quest_nirnaeth_finish_hook(char *fmt)
return TRUE;
}
-bool quest_nirnaeth_death_hook(char *fmt)
+bool_ quest_nirnaeth_death_hook(char *fmt)
{
if (p_ptr->inside_quest != QUEST_NIRNAETH) return FALSE;
@@ -86,7 +84,7 @@ bool quest_nirnaeth_death_hook(char *fmt)
return FALSE;
}
-bool quest_nirnaeth_stair_hook(char *fmt)
+bool_ quest_nirnaeth_stair_hook(char *fmt)
{
if (p_ptr->inside_quest != QUEST_NIRNAETH) return FALSE;
@@ -98,7 +96,7 @@ bool quest_nirnaeth_stair_hook(char *fmt)
process_hooks_restart = TRUE;
return (FALSE);
}
-bool quest_nirnaeth_init_hook(int q_idx)
+bool_ quest_nirnaeth_init_hook(int q_idx)
{
if ((cquest.status >= QUEST_STATUS_TAKEN) && (cquest.status < QUEST_STATUS_FINISHED))
{
diff --git a/src/q_one.c b/src/q_one.c
index c11c5233..4bfeaf3e 100644
--- a/src/q_one.c
+++ b/src/q_one.c
@@ -1,7 +1,7 @@
#undef cquest
#define cquest (quest[QUEST_ONE])
-bool quest_one_move_hook(char *fmt)
+bool_ quest_one_move_hook(char *fmt)
{
s32b y, x;
cave_type *c_ptr;
@@ -66,7 +66,7 @@ bool quest_one_move_hook(char *fmt)
return FALSE;
}
-bool quest_one_drop_hook(char *fmt)
+bool_ quest_one_drop_hook(char *fmt)
{
s32b o_idx;
object_type *o_ptr;
@@ -84,8 +84,7 @@ bool quest_one_drop_hook(char *fmt)
cmsg_print(TERM_YELLOW, "You feel the powers of evil weakening.");
cmsg_print(TERM_YELLOW, "Now you can go onto the hunt for Sauron!");
- inven_item_increase(o_idx, -99);
- inven_item_optimize(o_idx);
+ inc_stack_size_ex(o_idx, -99, OPTIMIZE, NO_DESCRIBE);
abandon_god(GOD_MELKOR);
@@ -97,7 +96,7 @@ bool quest_one_drop_hook(char *fmt)
return TRUE;
}
-bool quest_one_wield_hook(char *fmt)
+bool_ quest_one_wield_hook(char *fmt)
{
s32b o_idx;
object_type *o_ptr;
@@ -154,7 +153,7 @@ bool quest_one_wield_hook(char *fmt)
return FALSE;
}
-bool quest_one_hp_hook(char *fmt)
+bool_ quest_one_hp_hook(char *fmt)
{
if (cquest.status == QUEST_STATUS_FAILED_DONE)
{
@@ -171,7 +170,7 @@ bool quest_one_hp_hook(char *fmt)
}
return (FALSE);
}
-bool quest_one_die_hook(char *fmt)
+bool_ quest_one_die_hook(char *fmt)
{
if (cquest.status == QUEST_STATUS_FAILED_DONE)
{
@@ -190,7 +189,7 @@ bool quest_one_die_hook(char *fmt)
}
return (FALSE);
}
-bool quest_one_identify_hook(char *fmt)
+bool_ quest_one_identify_hook(char *fmt)
{
s32b item;
@@ -200,17 +199,7 @@ bool quest_one_identify_hook(char *fmt)
{
object_type *o_ptr;
- /* Inventory */
- if (item >= 0)
- {
- o_ptr = &p_ptr->inventory[item];
- }
-
- /* Floor */
- else
- {
- o_ptr = &o_list[0 - item];
- }
+ o_ptr = get_object(item);
if ((o_ptr->name1 == ART_POWER) && (!object_known_p(o_ptr)))
{
@@ -222,15 +211,13 @@ bool quest_one_identify_hook(char *fmt)
return (FALSE);
}
-bool quest_one_death_hook(char *fmt)
+bool_ quest_one_death_hook(char *fmt)
{
s32b r_idx, m_idx;
- bool ok = FALSE;
- monster_race *r_ptr;
+ bool_ ok = FALSE;
m_idx = get_next_arg(fmt);
r_idx = m_list[m_idx].r_idx;
- r_ptr = &r_info[r_idx];
if (a_info[ART_POWER].cur_num) return FALSE;
@@ -304,7 +291,7 @@ bool quest_one_death_hook(char *fmt)
return (FALSE);
}
-bool quest_one_dump_hook(char *fmt)
+bool_ quest_one_dump_hook(char *fmt)
{
if (cquest.status == QUEST_STATUS_FINISHED)
{
@@ -316,16 +303,16 @@ bool quest_one_dump_hook(char *fmt)
}
return (FALSE);
}
-bool quest_one_gen_hook(char *fmt)
+bool_ quest_one_gen_hook(char *fmt)
{
- s32b x, y, try = 10000;
+ s32b x, y, tries = 10000;
/* Paranoia */
if (cquest.status != QUEST_STATUS_TAKEN) return (FALSE);
if ((dungeon_type != DUNGEON_ANGBAND) || (dun_level != 99)) return (FALSE);
/* Find a good position */
- while (try)
+ while (tries)
{
/* Get a random spot */
y = randint(cur_hgt - 4) + 2;
@@ -335,10 +322,10 @@ bool quest_one_gen_hook(char *fmt)
if (cave_empty_bold(y, x)) break;
/* One less try */
- try--;
+ tries--;
}
- if (try)
+ if (tries)
{
int m_idx = place_monster_one(y, x, test_monster_name("Sauron, the Sorcerer"), 0, FALSE, MSTATUS_ENEMY);
if (m_idx) m_list[m_idx].mflag |= MFLAG_QUEST;
@@ -346,7 +333,7 @@ bool quest_one_gen_hook(char *fmt)
return (FALSE);
}
-bool quest_one_init_hook(int q_idx)
+bool_ quest_one_init_hook(int q_idx)
{
if ((cquest.status >= QUEST_STATUS_TAKEN) && (cquest.status < QUEST_STATUS_FINISHED))
{
diff --git a/src/q_poison.c b/src/q_poison.c
index efc8712c..e6fed3a1 100644
--- a/src/q_poison.c
+++ b/src/q_poison.c
@@ -9,7 +9,7 @@ static int wild_locs[4][2] =
{ 34, 48, },
};
-static bool create_molds_hook(int r_idx)
+static bool_ create_molds_hook(int r_idx)
{
monster_race *r_ptr = &r_info[r_idx];
@@ -21,10 +21,10 @@ static bool create_molds_hook(int r_idx)
else return FALSE;
}
-bool quest_poison_gen_hook(char *fmt)
+bool_ quest_poison_gen_hook(char *fmt)
{
- int cy = 1, cx = 1, x, y, try = 10000, r_idx;
- bool (*old_get_mon_num_hook)(int r_idx);
+ int cy = 1, cx = 1, x, y, tries = 10000, r_idx;
+ bool_ (*old_get_mon_num_hook)(int r_idx);
if (cquest.status != QUEST_STATUS_TAKEN) return FALSE;
if (p_ptr->wilderness_y != wild_locs[cquest.data[0]][0]) return FALSE;
@@ -32,7 +32,7 @@ bool quest_poison_gen_hook(char *fmt)
if (p_ptr->wild_mode) return FALSE;
/* Find a good position */
- while (try)
+ while (tries)
{
/* Get a random spot */
cy = randint(cur_hgt - 24) + 22;
@@ -42,7 +42,7 @@ bool quest_poison_gen_hook(char *fmt)
if (cave_empty_bold(cy, cx)) break;
/* One less try */
- try--;
+ tries--;
}
/* Place the baddies */
@@ -98,7 +98,7 @@ bool quest_poison_gen_hook(char *fmt)
return FALSE;
}
-bool quest_poison_finish_hook(char *fmt)
+bool_ quest_poison_finish_hook(char *fmt)
{
object_type forge, *q_ptr;
s32b q_idx;
@@ -129,7 +129,7 @@ bool quest_poison_finish_hook(char *fmt)
return TRUE;
}
-bool quest_poison_dump_hook(char *fmt)
+bool_ quest_poison_dump_hook(char *fmt)
{
if (cquest.status >= QUEST_STATUS_COMPLETED)
{
@@ -137,7 +137,7 @@ bool quest_poison_dump_hook(char *fmt)
}
return (FALSE);
}
-bool quest_poison_quest_hook(char *fmt)
+bool_ quest_poison_quest_hook(char *fmt)
{
object_type forge, *q_ptr;
s32b q_idx;
@@ -160,7 +160,7 @@ bool quest_poison_quest_hook(char *fmt)
return FALSE;
}
-bool quest_poison_drop_hook(char *fmt)
+bool_ quest_poison_drop_hook(char *fmt)
{
s32b mcnt = 0, i, x, y, o_idx;
object_type *o_ptr;
@@ -213,7 +213,7 @@ bool quest_poison_drop_hook(char *fmt)
}
return FALSE;
}
-bool quest_poison_init_hook(int q_idx)
+bool_ quest_poison_init_hook(int q_idx)
{
/* Get a place to place the poison */
if (!cquest.data[1])
diff --git a/src/q_rand.c b/src/q_rand.c
index c952b861..5a3b3ab2 100644
--- a/src/q_rand.c
+++ b/src/q_rand.c
@@ -1,9 +1,9 @@
static int randquest_hero[] = { 20, 13, 15, 16, 9, 17, 18, 8, -1 };
-bool is_randhero(int level)
+bool_ is_randhero(int level)
{
int i;
- bool result = FALSE;
+ bool_ result = FALSE;
for (i = 0; randquest_hero[i] != -1; i++)
{
@@ -167,7 +167,7 @@ void hero_death(s32b m_idx, s32b r_idx)
int d = (i / 15) + 1;
/* Pick a location */
- scatter(&y, &x, p_ptr->py, p_ptr->px, d, 0);
+ scatter(&y, &x, p_ptr->py, p_ptr->px, d);
/* Require "empty" floor grid */
if (!cave_empty_bold(y, x)) continue;
@@ -213,7 +213,7 @@ void hero_death(s32b m_idx, s32b r_idx)
}
}
-bool quest_random_death_hook(char *fmt)
+bool_ quest_random_death_hook(char *fmt)
{
int r_idx;
s32b m_idx;
@@ -242,13 +242,13 @@ bool quest_random_death_hook(char *fmt)
return (FALSE);
}
-bool quest_random_turn_hook(char *fmt)
+bool_ quest_random_turn_hook(char *fmt)
{
quest[QUEST_RANDOM].data[0] = 0;
quest[QUEST_RANDOM].data[1] = 0;
return (FALSE);
}
-bool quest_random_feeling_hook(char *fmt)
+bool_ quest_random_feeling_hook(char *fmt)
{
if (!(dungeon_flags1 & DF1_PRINCIPAL)) return (FALSE);
if ((dun_level < 1) || (dun_level >= MAX_RANDOM_QUEST)) return (FALSE);
@@ -266,7 +266,7 @@ bool quest_random_feeling_hook(char *fmt)
cmsg_format(TERM_YELLOW, "You hear someone shouting: 'Leave me alone, stupid %s'", r_info[random_quests[dun_level].r_idx].name + r_name);
return (FALSE);
}
-bool quest_random_gen_hero_hook(char *fmt)
+bool_ quest_random_gen_hero_hook(char *fmt)
{
int i;
@@ -296,7 +296,7 @@ bool quest_random_gen_hero_hook(char *fmt)
return (FALSE);
}
-bool quest_random_gen_hook(char *fmt)
+bool_ quest_random_gen_hook(char *fmt)
{
s32b x, y, bx0, by0;
int xstart;
@@ -316,12 +316,7 @@ bool quest_random_gen_hook(char *fmt)
bx0 = get_next_arg(fmt);
/* Pick a room size */
- xsize = 0;
- ysize = 0;
- init_flags = INIT_GET_SIZE;
- process_dungeon_file_full = TRUE;
- process_dungeon_file(NULL, format("qrand%d.map", random_quests[dun_level].type), &ysize, &xsize, cur_hgt, cur_wid, TRUE);
- process_dungeon_file_full = FALSE;
+ get_map_size(format("qrand%d.map", random_quests[dun_level].type), &ysize, &xsize);
/* Try to allocate space for room. If fails, exit */
if (!room_alloc(xsize + 2, ysize + 2, FALSE, by0, bx0, &xval, &yval)) return FALSE;
@@ -353,9 +348,7 @@ bool quest_random_gen_hook(char *fmt)
xstart = x1;
ystart = y1;
init_flags = INIT_CREATE_DUNGEON;
- process_dungeon_file_full = TRUE;
- process_dungeon_file(NULL, format("qrand%d.map", random_quests[dun_level].type), &ystart, &xstart, cur_hgt, cur_wid, TRUE);
- process_dungeon_file_full = FALSE;
+ process_dungeon_file(format("qrand%d.map", random_quests[dun_level].type), &ystart, &xstart, cur_hgt, cur_wid, TRUE, TRUE);
for (x = x1; x < xstart; x++)
for (y = y1; y < ystart; y++)
@@ -385,7 +378,7 @@ bool quest_random_gen_hook(char *fmt)
return (TRUE);
}
-bool quest_random_dump_hook(char *fmt)
+bool_ quest_random_dump_hook(char *fmt)
{
static char *number[] =
{ "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten" };
@@ -429,7 +422,37 @@ bool quest_random_dump_hook(char *fmt)
return (FALSE);
}
-bool quest_random_init_hook(int q_idx)
+
+bool_ quest_random_describe(FILE *fff)
+{
+ if (!(dungeon_flags1 & DF1_PRINCIPAL)) return FALSE;
+ if ((dun_level < 1) || (dun_level >= MAX_RANDOM_QUEST)) return FALSE;
+ if (!random_quests[dun_level].type) return FALSE;
+ if (random_quests[dun_level].done) return FALSE;
+ if (p_ptr->inside_quest) return FALSE;
+ if (!dun_level) return FALSE;
+
+ if (!is_randhero(dun_level))
+ {
+ fprintf(fff, "#####yCaptured princess!\n");
+ fprintf(fff, "A princess is being held prisoner and tortured here!\n");
+ fprintf(fff, "Save her from the horrible %s.\n",
+ r_info[random_quests[dun_level].r_idx].name + r_name);
+ }
+ else
+ {
+ fprintf(fff, "#####yLost sword!\n");
+ fprintf(fff, "An adventurer lost his sword to a bunch of %s!\n",
+ r_info[random_quests[dun_level].r_idx].name + r_name);
+ fprintf(fff, "Kill them all to get it back.\n");
+ }
+ fprintf(fff, "Number: %d, Killed: %ld.\n",
+ random_quests[dun_level].type, (long int) quest[QUEST_RANDOM].data[0]);
+ fprintf(fff, "\n");
+ return TRUE;
+}
+
+bool_ quest_random_init_hook(int q_idx)
{
add_hook(HOOK_MONSTER_DEATH, quest_random_death_hook, "rand_death");
add_hook(HOOK_NEW_LEVEL, quest_random_turn_hook, "rand_new_lvl");
diff --git a/src/q_shroom.c b/src/q_shroom.c
index c8cc3bec..b6e26cdf 100644
--- a/src/q_shroom.c
+++ b/src/q_shroom.c
@@ -1,11 +1,11 @@
#undef cquest
#define cquest (quest[QUEST_SHROOM])
-bool quest_shroom_speak_hook(char *fmt);
+bool_ quest_shroom_speak_hook(char *fmt);
-bool quest_shroom_town_gen_hook(char *fmt)
+bool_ quest_shroom_town_gen_hook(char *fmt)
{
- int m_idx, x = 1, y = 1, try = 10000;
+ int m_idx, x = 1, y = 1, tries = 10000;
s32b small;
small = get_next_arg(fmt);
@@ -59,7 +59,7 @@ bool quest_shroom_town_gen_hook(char *fmt)
if ((bst(HOUR, turn) < 6) || (bst(HOUR, turn) >= 18) || (cquest.status > QUEST_STATUS_COMPLETED) || (small) || (p_ptr->town_num != 1)) return (FALSE);
/* Find a good position */
- while (try)
+ while (tries)
{
/* Get a random spot */
y = randint(20) + (cur_hgt / 2) - 10;
@@ -71,7 +71,7 @@ bool quest_shroom_town_gen_hook(char *fmt)
cave_plain_floor_bold(y, x)) break;
/* One less try */
- try--;
+ tries--;
}
/* Place Farmer Maggot */
@@ -81,7 +81,7 @@ bool quest_shroom_town_gen_hook(char *fmt)
return FALSE;
}
-bool quest_shroom_death_hook(char *fmt)
+bool_ quest_shroom_death_hook(char *fmt)
{
s32b r_idx, m_idx;
@@ -99,7 +99,7 @@ bool quest_shroom_death_hook(char *fmt)
return FALSE;
}
-bool quest_shroom_give_hook(char *fmt)
+bool_ quest_shroom_give_hook(char *fmt)
{
object_type *o_ptr;
monster_type *m_ptr;
@@ -133,8 +133,7 @@ bool quest_shroom_give_hook(char *fmt)
if ((o_ptr->tval != TV_FOOD) || (o_ptr->pval2 != 1)) return (FALSE);
/* Take a mushroom */
- inven_item_increase(item, -1);
- inven_item_optimize(item);
+ inc_stack_size_ex(item, -1, OPTIMIZE, NO_DESCRIBE);
cquest.data[0]++;
if (cquest.data[0] == cquest.data[1])
@@ -184,7 +183,7 @@ bool quest_shroom_give_hook(char *fmt)
return TRUE;
}
-bool quest_shroom_speak_hook(char *fmt)
+bool_ quest_shroom_speak_hook(char *fmt)
{
s32b m_idx = get_next_arg(fmt);
@@ -221,7 +220,7 @@ bool quest_shroom_speak_hook(char *fmt)
}
return (TRUE);
}
-bool quest_shroom_chat_hook(char *fmt)
+bool_ quest_shroom_chat_hook(char *fmt)
{
monster_type *m_ptr;
s32b m_idx;
@@ -266,7 +265,7 @@ bool quest_shroom_chat_hook(char *fmt)
return TRUE;
}
-bool quest_shroom_init_hook(int q_idx)
+bool_ quest_shroom_init_hook(int q_idx)
{
/* Get a number of 'shrooms */
if (!cquest.data[1])
diff --git a/src/q_spider.c b/src/q_spider.c
index 8d88524a..a739535b 100644
--- a/src/q_spider.c
+++ b/src/q_spider.c
@@ -1,7 +1,7 @@
#undef cquest
#define cquest (quest[QUEST_SPIDER])
-bool quest_spider_gen_hook(char *fmt)
+bool_ quest_spider_gen_hook(char *fmt)
{
int x, y;
int xstart = 2;
@@ -26,13 +26,11 @@ bool quest_spider_gen_hook(char *fmt)
get_mon_num_prep();
init_flags = INIT_CREATE_DUNGEON;
- process_dungeon_file_full = TRUE;
- process_dungeon_file(NULL, "spiders.map", &ystart, &xstart, cur_hgt, cur_wid, TRUE);
- process_dungeon_file_full = FALSE;
+ process_dungeon_file("spiders.map", &ystart, &xstart, cur_hgt, cur_wid, TRUE, TRUE);
return TRUE;
}
-bool quest_spider_death_hook(char *fmt)
+bool_ quest_spider_death_hook(char *fmt)
{
int i, mcnt = 0;
@@ -68,7 +66,7 @@ bool quest_spider_death_hook(char *fmt)
return (FALSE);
}
-bool quest_spider_finish_hook(char *fmt)
+bool_ quest_spider_finish_hook(char *fmt)
{
object_type forge, *q_ptr;
s32b q_idx;
@@ -98,7 +96,7 @@ bool quest_spider_finish_hook(char *fmt)
return TRUE;
}
-bool quest_spider_init_hook(int q_idx)
+bool_ quest_spider_init_hook(int q_idx)
{
if ((cquest.status >= QUEST_STATUS_TAKEN) && (cquest.status < QUEST_STATUS_FINISHED))
{
diff --git a/src/q_thief.c b/src/q_thief.c
index 96d95658..6b033f8c 100644
--- a/src/q_thief.c
+++ b/src/q_thief.c
@@ -1,12 +1,12 @@
#undef cquest
#define cquest (quest[QUEST_THIEVES])
-bool quest_thieves_gen_hook(char *fmt)
+bool_ quest_thieves_gen_hook(char *fmt)
{
int x, y;
int xstart = 2;
int ystart = 2;
- bool again = TRUE;
+ bool_ again = TRUE;
if (p_ptr->inside_quest != QUEST_THIEVES) return FALSE;
@@ -32,7 +32,7 @@ bool quest_thieves_gen_hook(char *fmt)
get_mon_num_prep();
init_flags = INIT_CREATE_DUNGEON;
- process_dungeon_file(NULL, "thieves.map", &ystart, &xstart, cur_hgt, cur_wid, TRUE);
+ process_dungeon_file("thieves.map", &ystart, &xstart, cur_hgt, cur_wid, TRUE, FALSE);
dungeon_flags2 |= DF2_NO_GENO;
/* Rip the inventory from the player */
@@ -61,7 +61,7 @@ bool quest_thieves_gen_hook(char *fmt)
return TRUE;
}
-bool quest_thieves_hook(char *fmt)
+bool_ quest_thieves_hook(char *fmt)
{
int i, mcnt = 0;
@@ -113,7 +113,7 @@ bool quest_thieves_hook(char *fmt)
}
return FALSE;
}
-bool quest_thieves_finish_hook(char *fmt)
+bool_ quest_thieves_finish_hook(char *fmt)
{
s32b q_idx;
@@ -146,7 +146,7 @@ bool quest_thieves_finish_hook(char *fmt)
return TRUE;
}
-bool quest_thieves_feeling_hook(char *fmt)
+bool_ quest_thieves_feeling_hook(char *fmt)
{
if (p_ptr->inside_quest != QUEST_THIEVES) return FALSE;
@@ -159,7 +159,7 @@ bool quest_thieves_feeling_hook(char *fmt)
return TRUE;
}
-bool quest_thieves_init_hook(int q_idx)
+bool_ quest_thieves_init_hook(int q_idx)
{
if ((cquest.status >= QUEST_STATUS_UNTAKEN) && (cquest.status < QUEST_STATUS_FINISHED))
{
diff --git a/src/q_thrain.c b/src/q_thrain.c
index 265ef3e2..b2b1be9f 100644
--- a/src/q_thrain.c
+++ b/src/q_thrain.c
@@ -1,14 +1,13 @@
#undef cquest
#define cquest (quest[QUEST_THRAIN])
-bool quest_thrain_death_hook(char *fmt)
+bool_ quest_thrain_death_hook(char *fmt)
{
- s32b r_idx, m_idx;
+ s32b m_idx;
int r, x, y;
monster_type *m_ptr;
m_idx = get_next_arg(fmt);
- r_idx = m_list[m_idx].r_idx;
if ((cquest.status >= QUEST_STATUS_FINISHED) || (dun_level !=cquest.data[0]) || (dungeon_type != DUNGEON_DOL_GULDUR)) return (FALSE);
m_ptr = &m_list[m_idx];
@@ -88,7 +87,7 @@ bool quest_thrain_death_hook(char *fmt)
return (FALSE);
}
-bool quest_thrain_gen_hook(char *fmt)
+bool_ quest_thrain_gen_hook(char *fmt)
{
s32b x, y, bx0, by0;
int xstart;
@@ -105,12 +104,7 @@ bool quest_thrain_gen_hook(char *fmt)
bx0 = get_next_arg(fmt);
/* Pick a room size */
- xsize = 0;
- ysize = 0;
- init_flags = INIT_GET_SIZE;
- process_dungeon_file_full = TRUE;
- process_dungeon_file(NULL, "thrain.map", &ysize, &xsize, cur_hgt, cur_wid, TRUE);
- process_dungeon_file_full = FALSE;
+ get_map_size("thrain.map", &ysize, &xsize);
/* Try to allocate space for room. If fails, exit */
if (!room_alloc(xsize + 2, ysize + 2, FALSE, by0, bx0, &xval, &yval)) return FALSE;
@@ -142,9 +136,7 @@ bool quest_thrain_gen_hook(char *fmt)
xstart = x1;
ystart = y1;
init_flags = INIT_CREATE_DUNGEON;
- process_dungeon_file_full = TRUE;
- process_dungeon_file(NULL, "thrain.map", &ystart, &xstart, cur_hgt, cur_wid, TRUE);
- process_dungeon_file_full = FALSE;
+ process_dungeon_file("thrain.map", &ystart, &xstart, cur_hgt, cur_wid, TRUE, TRUE);
for (x = x1; x < xstart; x++)
for (y = y1; y < ystart; y++)
@@ -166,7 +158,7 @@ bool quest_thrain_gen_hook(char *fmt)
return (TRUE);
}
-bool quest_thrain_feeling_hook(char *fmt)
+bool_ quest_thrain_feeling_hook(char *fmt)
{
if (dungeon_type != DUNGEON_DOL_GULDUR) return (FALSE);
if (cquest.data[0] != dun_level) return (FALSE);
@@ -178,7 +170,7 @@ bool quest_thrain_feeling_hook(char *fmt)
return (FALSE);
}
-bool quest_thrain_move_hook(char *fmt)
+bool_ quest_thrain_move_hook(char *fmt)
{
s32b y;
s32b x;
@@ -209,13 +201,13 @@ bool quest_thrain_move_hook(char *fmt)
return (FALSE);
}
-bool quest_thrain_turn_hook(char *fmt)
+bool_ quest_thrain_turn_hook(char *fmt)
{
cquest.data[1] = 0;
cquest.data[2] = 0;
return (FALSE);
}
-bool quest_thrain_init_hook(int q)
+bool_ quest_thrain_init_hook(int q)
{
if (!cquest.data[0])
{
diff --git a/src/q_troll.c b/src/q_troll.c
index d1347ed6..c314d2a7 100644
--- a/src/q_troll.c
+++ b/src/q_troll.c
@@ -1,7 +1,7 @@
#undef cquest
#define cquest (quest[QUEST_TROLL])
-bool quest_troll_gen_hook(char *fmt)
+bool_ quest_troll_gen_hook(char *fmt)
{
int x, y;
int xstart = 2;
@@ -26,9 +26,7 @@ bool quest_troll_gen_hook(char *fmt)
get_mon_num_prep();
init_flags = INIT_CREATE_DUNGEON;
- process_dungeon_file_full = TRUE;
- process_dungeon_file(NULL, "trolls.map", &ystart, &xstart, cur_hgt, cur_wid, TRUE);
- process_dungeon_file_full = FALSE;
+ process_dungeon_file("trolls.map", &ystart, &xstart, cur_hgt, cur_wid, TRUE, TRUE);
for (x = 3; x < xstart; x++)
for (y = 3; y < ystart; y++)
@@ -95,7 +93,7 @@ bool quest_troll_gen_hook(char *fmt)
cquest.data[0] = FALSE;
return TRUE;
}
-bool quest_troll_finish_hook(char *fmt)
+bool_ quest_troll_finish_hook(char *fmt)
{
s32b q_idx;
@@ -115,7 +113,7 @@ bool quest_troll_finish_hook(char *fmt)
return TRUE;
}
-bool quest_troll_death_hook(char *fmt)
+bool_ quest_troll_death_hook(char *fmt)
{
int x, y, xstart = 2, ystart = 2;
s32b r_idx, m_idx;
@@ -140,9 +138,7 @@ bool quest_troll_death_hook(char *fmt)
}
init_flags = INIT_GET_SIZE;
- process_dungeon_file_full = TRUE;
- process_dungeon_file(NULL, "trolls.map", &ystart, &xstart, cur_hgt, cur_wid, TRUE);
- process_dungeon_file_full = FALSE;
+ process_dungeon_file("trolls.map", &ystart, &xstart, cur_hgt, cur_wid, TRUE, TRUE);
if (cquest.data[0]) return FALSE;
@@ -170,7 +166,7 @@ bool quest_troll_death_hook(char *fmt)
return FALSE;
}
-bool quest_troll_init_hook(int q_idx)
+bool_ quest_troll_init_hook(int q_idx)
{
if ((cquest.status >= QUEST_STATUS_TAKEN) && (cquest.status < QUEST_STATUS_FINISHED))
{
diff --git a/src/q_ultrae.c b/src/q_ultrae.c
index d34d8b8f..78471df5 100644
--- a/src/q_ultrae.c
+++ b/src/q_ultrae.c
@@ -5,7 +5,7 @@
#undef cquest
#define cquest (quest[QUEST_ULTRA_EVIL])
-bool quest_ultra_evil_init_hook(int q)
+bool_ quest_ultra_evil_init_hook(int q)
{
return (FALSE);
}
diff --git a/src/q_ultrag.c b/src/q_ultrag.c
index 37d14b0d..a5a09f2d 100644
--- a/src/q_ultrag.c
+++ b/src/q_ultrag.c
@@ -5,7 +5,7 @@
#undef cquest
#define cquest (quest[QUEST_ULTRA_GOOD])
-bool quest_ultra_good_move_hook(char *fmt)
+bool_ quest_ultra_good_move_hook(char *fmt)
{
s32b y, x;
cave_type *c_ptr;
@@ -16,7 +16,7 @@ bool quest_ultra_good_move_hook(char *fmt)
if (cquest.status == QUEST_STATUS_UNTAKEN)
{
- bool old_quick_messages = quick_messages;
+ bool_ old_quick_messages = quick_messages;
if (quest[QUEST_MORGOTH].status < QUEST_STATUS_FINISHED) return (FALSE);
@@ -77,7 +77,7 @@ bool quest_ultra_good_move_hook(char *fmt)
return FALSE;
}
-bool quest_ultra_good_stair_hook(char *fmt)
+bool_ quest_ultra_good_stair_hook(char *fmt)
{
cptr dir;
@@ -103,13 +103,13 @@ bool quest_ultra_good_stair_hook(char *fmt)
if ((!strcmp(dir, "down")) && (dun_level == 149))
{
int i;
- bool ultimate = FALSE;
+ bool_ ultimate = FALSE;
/* Now look for an ULTIMATE artifact, that is, one imbued with the flame */
for (i = INVEN_WIELD; i < INVEN_TOTAL; i++)
{
u32b f1, f2, f3, f4, f5, esp;
- object_type *o_ptr = &p_ptr->inventory[i];
+ object_type *o_ptr = get_object(i);
if (!o_ptr->k_idx) continue;
@@ -140,7 +140,7 @@ bool quest_ultra_good_stair_hook(char *fmt)
return FALSE;
}
-bool quest_ultra_good_recall_hook(char *fmt)
+bool_ quest_ultra_good_recall_hook(char *fmt)
{
if ((dungeon_type != DUNGEON_VOID) && (dungeon_type != DUNGEON_NETHER_REALM))
return FALSE;
@@ -149,7 +149,7 @@ bool quest_ultra_good_recall_hook(char *fmt)
return TRUE;
}
-bool quest_ultra_good_death_hook(char *fmt)
+bool_ quest_ultra_good_death_hook(char *fmt)
{
s32b m_idx = get_next_arg(fmt);
@@ -235,7 +235,7 @@ bool quest_ultra_good_death_hook(char *fmt)
}
return (FALSE);
}
-bool quest_ultra_good_dump_hook(char *fmt)
+bool_ quest_ultra_good_dump_hook(char *fmt)
{
if (quest[QUEST_ULTRA_GOOD].status >= QUEST_STATUS_TAKEN)
{
@@ -259,7 +259,7 @@ bool quest_ultra_good_dump_hook(char *fmt)
}
-bool quest_ultra_good_init_hook(int q)
+bool_ quest_ultra_good_init_hook(int q)
{
if ((cquest.status >= QUEST_STATUS_TAKEN) && (cquest.status < QUEST_STATUS_FINISHED))
{
diff --git a/src/q_wight.c b/src/q_wight.c
index bf5b4868..3f6b2c34 100644
--- a/src/q_wight.c
+++ b/src/q_wight.c
@@ -1,7 +1,7 @@
#undef cquest
#define cquest (quest[QUEST_WIGHT])
-bool quest_wight_gen_hook(char *fmt)
+bool_ quest_wight_gen_hook(char *fmt)
{
int x, y;
int xstart = 2;
@@ -26,9 +26,7 @@ bool quest_wight_gen_hook(char *fmt)
get_mon_num_prep();
init_flags = INIT_CREATE_DUNGEON;
- process_dungeon_file_full = TRUE;
- process_dungeon_file(NULL, "wights.map", &ystart, &xstart, cur_hgt, cur_wid, TRUE);
- process_dungeon_file_full = FALSE;
+ process_dungeon_file("wights.map", &ystart, &xstart, cur_hgt, cur_wid, TRUE, TRUE);
for (x = 3; x < xstart; x++)
for (y = 3; y < ystart; y++)
@@ -103,7 +101,7 @@ bool quest_wight_gen_hook(char *fmt)
return TRUE;
}
-bool quest_wight_death_hook(char *fmt)
+bool_ quest_wight_death_hook(char *fmt)
{
s32b r_idx, m_idx;
@@ -127,7 +125,7 @@ bool quest_wight_death_hook(char *fmt)
return (FALSE);
}
-bool quest_wight_finish_hook(char *fmt)
+bool_ quest_wight_finish_hook(char *fmt)
{
s32b q_idx;
q_idx = get_next_arg(fmt);
@@ -146,7 +144,7 @@ bool quest_wight_finish_hook(char *fmt)
return TRUE;
}
-bool quest_wight_init_hook(int q_idx)
+bool_ quest_wight_init_hook(int q_idx)
{
if ((cquest.status >= QUEST_STATUS_TAKEN) && (cquest.status < QUEST_STATUS_FINISHED))
{
diff --git a/src/q_wolves.c b/src/q_wolves.c
index 39ef5794..2ec14cc2 100644
--- a/src/q_wolves.c
+++ b/src/q_wolves.c
@@ -1,7 +1,7 @@
#undef cquest
#define cquest (quest[QUEST_WOLVES])
-bool quest_wolves_gen_hook(char *fmt)
+bool_ quest_wolves_gen_hook(char *fmt)
{
int x, y, i;
int xstart = 2;
@@ -31,7 +31,7 @@ bool quest_wolves_gen_hook(char *fmt)
get_mon_num_prep();
init_flags = INIT_CREATE_DUNGEON;
- process_dungeon_file(NULL, "wolves.map", &ystart, &xstart, cur_hgt, cur_wid, TRUE);
+ process_dungeon_file("wolves.map", &ystart, &xstart, cur_hgt, cur_wid, TRUE, FALSE);
dungeon_flags2 |= DF2_NO_GENO;
/* Place some random wolves */
@@ -69,7 +69,7 @@ bool quest_wolves_gen_hook(char *fmt)
return TRUE;
}
-bool quest_wolves_death_hook(char *fmt)
+bool_ quest_wolves_death_hook(char *fmt)
{
int i, mcnt = 0;
@@ -101,7 +101,7 @@ bool quest_wolves_death_hook(char *fmt)
return FALSE;
}
-bool quest_wolves_finish_hook(char *fmt)
+bool_ quest_wolves_finish_hook(char *fmt)
{
s32b q_idx;
@@ -118,7 +118,7 @@ bool quest_wolves_finish_hook(char *fmt)
return TRUE;
}
-bool quest_wolves_init_hook(int q_idx)
+bool_ quest_wolves_init_hook(int q_idx)
{
if ((cquest.status >= QUEST_STATUS_UNTAKEN) && (cquest.status < QUEST_STATUS_FINISHED))
{
diff --git a/src/randart.c b/src/randart.c
index de1af12f..298ee83a 100644
--- a/src/randart.c
+++ b/src/randart.c
@@ -21,11 +21,11 @@
/*
* Attempt to add a power to a randart
*/
-static bool grab_one_power(int *ra_idx, object_type *o_ptr, bool good, s16b *max_times)
+static bool_ grab_one_power(int *ra_idx, object_type *o_ptr, bool_ good, s16b *max_times)
{
int i = 0, j;
int *ok_ra, ok_num = 0;
- bool ret = FALSE;
+ bool_ ret = FALSE;
u32b f1, f2, f3, f4, f5, esp;
C_MAKE(ok_ra, max_ra_idx, int);
@@ -34,7 +34,7 @@ static bool grab_one_power(int *ra_idx, object_type *o_ptr, bool good, s16b *max
for (i = 0; i < max_ra_idx; i++)
{
randart_part_type *ra_ptr = &ra_info[i];
- bool ok = FALSE;
+ bool_ ok = FALSE;
/* Must have the correct fields */
for (j = 0; j < 20; j++)
@@ -116,19 +116,9 @@ static bool grab_one_power(int *ra_idx, object_type *o_ptr, bool good, s16b *max
void give_activation_power (object_type * o_ptr)
{
- /* int type = 0, chance = 0; */
-
-
- /* A type was chosen... */
-#if 0 /* DGDGDGDG -- Todo later */
- o_ptr->xtra2 = type;
- o_ptr->art_flags3 |= TR3_ACTIVATE;
- o_ptr->timeout = 0;
-#else
o_ptr->xtra2 = 0;
o_ptr->art_flags3 &= ~TR3_ACTIVATE;
o_ptr->timeout = 0;
-#endif
}
@@ -265,16 +255,16 @@ void get_random_name(char * return_name)
}
-bool create_artifact(object_type *o_ptr, bool a_scroll, bool get_name)
+bool_ create_artifact(object_type *o_ptr, bool_ a_scroll, bool_ get_name)
{
char new_name[80];
int powers = 0, i;
s32b total_flags, total_power = 0;
- bool a_cursed = FALSE;
+ bool_ a_cursed = FALSE;
u32b f1, f2, f3, f4, f5, esp;
s16b *max_times;
s16b pval = 0;
- bool limit_blows = FALSE;
+ bool_ limit_blows = FALSE;
strcpy(new_name, "");
@@ -411,10 +401,10 @@ bool create_artifact(object_type *o_ptr, bool a_scroll, bool get_name)
}
-bool artifact_scroll(void)
+bool_ artifact_scroll(void)
{
int item;
- bool okay = FALSE;
+ bool_ okay = FALSE;
object_type *o_ptr;
char o_name[80];
@@ -429,18 +419,8 @@ bool artifact_scroll(void)
s = "You have nothing to enchant.";
if (!get_item(&item, q, s, (USE_EQUIP | USE_INVEN | USE_FLOOR))) return (FALSE);
- /* Get the item (in the pack) */
- if (item >= 0)
- {
- o_ptr = &p_ptr->inventory[item];
- }
-
- /* Get the item (on the floor) */
- else
- {
- o_ptr = &o_list[0 - item];
- }
-
+ /* Get the item */
+ o_ptr = get_object(item);
/* Description */
object_desc(o_name, o_ptr, FALSE, 0);
diff --git a/src/script.c b/src/script.c
index 44bb935a..89c9ff3b 100644
--- a/src/script.c
+++ b/src/script.c
@@ -70,45 +70,6 @@ static struct luaL_reg tome_iolib[] =
#define luaL_check_bit(L, n) ((long)luaL_check_number(L, n))
#define luaL_check_ubit(L, n) ((unsigned long)luaL_check_bit(L, n))
-#if 0
-
-/*
- * Nuked because they can confuse some compilers (lcc for example),
- * and because of their obscurity -- pelpel
- */
-
-#define TDYADIC(name, op, t1, t2) \
-static int int_ ## name(lua_State* L) { \
-lua_pushnumber(L, \
-luaL_check_ ## t1 ## bit(L, 1) op luaL_check_ ## t2 ## bit(L, 2)); \
-return 1; \
-}
-
-#define DYADIC(name, op) \
-static int int_ ## name(lua_State* L) { \
-lua_pushnumber(L, \
-luaL_check_bit(L, 1) op luaL_check_bit(L, 2)); \
-return 1; \
-}
-
-#define MONADIC(name, op) \
-static int int_ ## name(lua_State* L) { \
-lua_pushnumber(L, op luaL_check_bit(L, 1)); \
-return 1; \
-}
-
-#define VARIADIC(name, op) \
-static int int_ ## name(lua_State *L) { \
-int n = lua_gettop(L), i; \
-long w = luaL_check_bit(L, 1); \
-for (i = 2; i <= n; i++) \
-w op ## = luaL_check_bit(L, i); \
-lua_pushnumber(L, w); \
-return 1; \
-}
-
-#endif
-
/*
* Monadic bit negation operation
@@ -224,52 +185,9 @@ static const struct luaL_reg bitlib[] =
};
/*
- * Some special wrappers
- */
-static int lua_zsock_read(lua_State* L)
-{
- if (!tolua_istype(L, 1, tolua_tag(L, "zsock_hooks"), 0) ||
- !tolua_istype(L, 2, tolua_tag(L, "ip_connection"), 0) ||
- !tolua_istype(L, 3, LUA_TNUMBER, 0) ||
- !tolua_istype(L, 4, LUA_TNUMBER, 0) ||
- !tolua_isnoobj(L, 5)
- )
- {
- tolua_error(L, "#ferror in function 'read'.");
- return 0;
- }
- else
- {
- zsock_hooks* self = (zsock_hooks*) tolua_getusertype(L, 1, 0);
- ip_connection* conn = ((ip_connection*) tolua_getusertype(L, 2, 0));
- int len = ((int) tolua_getnumber(L, 3, 0));
- int start_len = len;
- bool raw = ((bool) tolua_getnumber(L, 4, 0));
- char *str;
-
- if (!self) tolua_error(L, "invalid 'self' in function 'read'");
- {
- bool toluaI_ret;
-
- C_MAKE(str, start_len + 1, char);
-
- toluaI_ret = (bool)self->read(conn, str, &len, raw);
- tolua_pushnumber(L, (long)toluaI_ret);
- tolua_pushstring(L, str);
- tolua_pushnumber(L, (long)len);
-
- C_FREE(str, start_len + 1, char);
-
- return 3;
- }
- return 0;
- }
-}
-
-/*
* Initialize lua scripting
*/
-static bool init_lua_done = FALSE;
+static bool_ init_lua_done = FALSE;
void init_lua()
{
/* Hack -- Do not initialize more than once */
@@ -301,9 +219,6 @@ void init_lua()
tolua_spells_open(L);
tolua_quest_open(L);
tolua_dungeon_open(L);
-
- /* Register some special wrappers */
- tolua_function(L, "zsock_hooks", "read", lua_zsock_read);
}
void init_lua_init()
@@ -334,7 +249,7 @@ void init_lua_init()
init_corruptions(max);
}
-bool tome_dofile(char *file)
+bool_ tome_dofile(char *file)
{
char buf[1024];
int oldtop = lua_gettop(L);
@@ -364,7 +279,7 @@ bool tome_dofile(char *file)
return (TRUE);
}
-bool tome_dofile_anywhere(cptr dir, char *file, bool test_exist)
+bool_ tome_dofile_anywhere(cptr dir, char *file, bool_ test_exist)
{
char buf[1024];
int oldtop = lua_gettop(L);
@@ -441,7 +356,7 @@ void dump_lua_stack(int min, int max)
cmsg_print(TERM_YELLOW, "END lua_stack");
}
-bool call_lua(cptr function, cptr args, cptr ret, ...)
+bool_ call_lua(cptr function, cptr args, cptr ret, ...)
{
int i = 0, nb = 0, nbr = 0;
int oldtop = lua_gettop(L), size;
@@ -557,7 +472,7 @@ bool call_lua(cptr function, cptr args, cptr ret, ...)
return TRUE;
}
-bool get_lua_var(cptr name, char type, void *arg)
+bool_ get_lua_var(cptr name, char type, void *arg)
{
int oldtop = lua_gettop(L), size;
diff --git a/src/skills.c b/src/skills.c
index 5eb653b0..36b4f585 100644
--- a/src/skills.c
+++ b/src/skills.c
@@ -156,7 +156,7 @@ int get_idx(int i)
return (0);
}
-static bool is_known(int s_idx)
+static bool_ is_known(int s_idx)
{
int i;
@@ -181,7 +181,7 @@ static bool is_known(int s_idx)
*
*/
void init_table_aux(int table[MAX_SKILLS][2], int *idx, int father, int lev,
- bool full)
+ bool_ full)
{
int j, i;
@@ -200,14 +200,14 @@ void init_table_aux(int table[MAX_SKILLS][2], int *idx, int father, int lev,
}
-void init_table(int table[MAX_SKILLS][2], int *max, bool full)
+void init_table(int table[MAX_SKILLS][2], int *max, bool_ full)
{
*max = 0;
init_table_aux(table, max, -1, 0, full);
}
-bool has_child(int sel)
+bool_ has_child(int sel)
{
int i;
@@ -337,7 +337,7 @@ void print_skills(int table[MAX_SKILLS][2], int max, int sel, int start)
/*
* Checks various stuff to do when skills change, like new spells, ...
*/
-void recalc_skills(bool init)
+void recalc_skills(bool_ init)
{
static int thaum_level = 0;
@@ -613,7 +613,7 @@ char *melee_names[MAX_MELEE] =
"Barehanded combat",
"Bearform combat",
};
-static bool melee_bool[MAX_MELEE];
+static bool_ melee_bool[MAX_MELEE];
static int melee_num[MAX_MELEE];
s16b get_melee_skill()
@@ -743,7 +743,7 @@ void select_default_melee()
/*
* Print a batch of skills.
*/
-static void print_skill_batch(int *p, cptr *p_desc, int start, int max, bool mode)
+static void print_skill_batch(int *p, cptr *p_desc, int start, int max, bool_ mode)
{
char buff[80];
int i = start, j = 0;
@@ -771,7 +771,7 @@ int do_cmd_activate_skill_aux()
char which;
int max = 0, i, start = 0;
int ret;
- bool mode = FALSE;
+ bool_ mode = FALSE;
int *p;
cptr *p_desc;
@@ -792,7 +792,7 @@ int do_cmd_activate_skill_aux()
if (s_info[i].action_mkey && s_info[i].value && ((!s_info[i].hidden) || (i == SKILL_LEARN)))
{
int j;
- bool next = FALSE;
+ bool_ next = FALSE;
/* Already got it ? */
for (j = 0; j < max; j++)
@@ -815,7 +815,7 @@ int do_cmd_activate_skill_aux()
if (ab_info[i].action_mkey && ab_info[i].acquired)
{
int j;
- bool next = FALSE;
+ bool_ next = FALSE;
/* Already got it ? */
for (j = 0; j < max; j++)
@@ -924,7 +924,7 @@ int do_cmd_activate_skill_aux()
void do_cmd_activate_skill()
{
int x_idx;
- bool push = TRUE;
+ bool_ push = TRUE;
/* Get the skill, if available */
if (repeat_pull(&x_idx))
@@ -1053,7 +1053,7 @@ void do_cmd_activate_skill()
/* Which magic forbids non FA gloves */
-bool forbid_gloves()
+bool_ forbid_gloves()
{
if (get_skill(SKILL_SORCERY)) return (TRUE);
if (get_skill(SKILL_MANA)) return (TRUE);
@@ -1066,145 +1066,13 @@ bool forbid_gloves()
}
/* Which gods forbid edged weapons */
-bool forbid_non_blessed()
+bool_ forbid_non_blessed()
{
GOD(GOD_ERU) return (TRUE);
return (FALSE);
}
-
-
-/*
- * The autoskiller gets fed with the desired skill values at level 50 and determines
- * where to invest each levels
- */
-
-/* Checks if a given autoskill chart is realisable */
-int validate_autoskiller(s32b *ideal)
-{
- int i;
- s32b count = 0;
-
- for (i = 0; i < max_s_idx; i++)
- {
- s32b z, c;
-
- skill_type *s_ptr = &s_info[i];
-
- if (!ideal[i]) continue;
-
- /* How much */
- z = (ideal[i] * SKILL_STEP) - s_ptr->value;
-
- /* How many points will we need to get there ? */
- if (s_ptr->mod)
- c = z / s_ptr->mod;
- else
- c = 99999;
- count += c;
- }
- /* DGDGDGDG: I dont work, fix me */
- /* return (SKILL_NB_BASE * 49) - count;*/
- return 0;
-}
-
-void autoskiller_level(s32b *ideal)
-{
-#if 0
- /* DGDGDGDG */
- int chart[196];
- int final[196];
- int ideal[3] = {50, 30, 25};
- int real[3] = {0, 0, 0};
- int mod[3] = {450, 1000, 1100};
- float pl[3], left[3] = {0, 0, 0}, finalization = 1;
- int c[3], z;
- int i, max = 0, ok = 3, a;
-
- for (i = 0; i < 3; i++)
- {
- c[i] = (ideal[i] * 1000) / mod[i];
- printf("point need c[%d] = %d\n", i, c[i]);
- max += c[i];
-
- pl[i] = (float)c[i] / 50.0;
- printf("pl[%d] = %f\n", i, pl[i]);
- }
- printf("skill balance %d\n", 196 - max);
-
- for (i = 0; i < 196; i++)
- {
- chart[i] = -1;
- }
-
- a = 0;
- while ((a < 196) && (ok))
- {
- int z = 0;
-
- for (z = 0; z < 3; z++)
- {
- int tmp, ii;
-
- if (real[z] == c[z])
- continue;
- left[z] += pl[z];
- tmp = left[z];
- left[z] -= tmp;
- printf("skill %02d: left %f tmp %d\n", z, left[z], tmp);
-
- while (tmp >= 1)
- {
- chart[a++] = z;
- real[z]++;
- tmp--;
- if (real[z] == c[z])
- {
- ok--;
- break;
- }
- if (a == 196)
- {
- ok = 0;
- break;
- }
- }
- if (!ok) break;
- }
- }
- printf("ok %d, a %d interval %f\n", ok, a, (float)a / 196);
- real[0] = real[1] = real[2] = 0;
- for (i = 0; i < 196; i++)
- {
- real[chart[i]]++;
- }
- z = 0;
- i = 0;
- while (z < a)
- {
- if (finalization > 1)
- {
- final[i] = chart[z++];
- finalization--;
- }
- else
- final[i] = -1;
- finalization += ((float)a / 196);
- i++;
- }
- for (z = 0; z < 3; z++)
- {
- printf("skill %d real %d ideal %d\n", z, real[z], c[z]);
- }
-
- for (i = 2; i <= 50; i++)
- {
- printf("level %02d, skills %02d %02d %02d %02d\n", i, final[i * 4], final[i * 4 + 1], final[i * 4 + 2], final[i * 4 + 3]);
- }
-#endif
-}
-
/*
* Gets the base value of a skill, given a race/class/...
*/
@@ -1280,10 +1148,10 @@ void init_skill(s32b value, s32b mod, int i)
void do_get_new_skill()
{
- char *items[4];
- int skl[4];
- s32b val[4], mod[4];
- bool used[MAX_SKILLS];
+ char *items[LOST_SWORD_NSKILLS];
+ int skl[LOST_SWORD_NSKILLS];
+ s32b val[LOST_SWORD_NSKILLS], mod[LOST_SWORD_NSKILLS];
+ bool_ used[MAX_SKILLS];
int available_skills[MAX_SKILLS];
int max = 0, max_a = 0, res, i;
@@ -1308,8 +1176,8 @@ void do_get_new_skill()
/* Count the number of available skills */
while (available_skills[max_a] != -1) max_a++;
- /* Get 4 skills */
- for (max = 0; max < 4; max++)
+ /* Get LOST_SWORD_NSKILLS skills */
+ for (max = 0; max < LOST_SWORD_NSKILLS; max++)
{
int i;
skill_type *s_ptr;
@@ -1360,13 +1228,16 @@ void do_get_new_skill()
while (TRUE)
{
- res = ask_menu("Choose a skill to learn(a-d to choose, ESC to cancel)?", (char **)items, 4);
+ char last = 'a' + (LOST_SWORD_NSKILLS-1);
+ char buf[80];
+ sprintf(buf, "Choose a skill to learn(a-%c to choose, ESC to cancel)?", last);
+ res = ask_menu(buf, (char **)items, LOST_SWORD_NSKILLS);
/* Ok ? lets learn ! */
if (res > -1)
{
skill_type *s_ptr;
- bool oppose = FALSE;
+ bool_ oppose = FALSE;
int oppose_skill = -1;
/* Check we don't oppose an existing skill */
@@ -1419,7 +1290,7 @@ void do_get_new_skill()
}
/* Free them ! */
- for (max = 0; max < 4; max++)
+ for (max = 0; max < LOST_SWORD_NSKILLS; max++)
{
string_free(items[max]);
}
@@ -1455,13 +1326,13 @@ s16b find_ability(cptr name)
/*
* Do the player have the ability
*/
-bool has_ability(int ab)
+bool_ has_ability(int ab)
{
return ab_info[ab].acquired;
}
/* Do we meet the requirements */
-bool can_learn_ability(int ab)
+bool_ can_learn_ability(int ab)
{
ability_type *ab_ptr = &ab_info[ab];
int i;
@@ -1675,11 +1546,7 @@ void do_cmd_ability()
/* Initialise the abilities list */
for (i = 0; i < max_ab_idx; i++)
{
-#if 0 /* Only show learnable */
- if (ab_info[i].name && ((can_learn_ability(i) || has_ability(i)) || wizard))
-#else /* Show all */
if (ab_info[i].name)
-#endif
add_sorted_ability(table, &max, i);
}
diff --git a/src/spells.pkg b/src/spells.pkg
index d1f50566..e785de0d 100644
--- a/src/spells.pkg
+++ b/src/spells.pkg
@@ -2132,21 +2132,6 @@ struct magic_power
cptr desc;
};
-/** @fn *new_magic_power(int num)
- * @dgonly
- * @brief Create a wiped array of "num" magic powers.\n
- * @param num Number \n num is the number of magic powers.
- * @brief Number
- * @return magic_power \n Array of magic powers.
- * @note
- * Get a new magic type\n\n
- * Note: do not call this function directly.\n
- * Please use add_magic() in powers.lua instead.\n
- * By order of DG.
- * @note (see file lua_bind.c)
- */
-extern magic_power *new_magic_power(int num);
-
/** @fn get_magic_power(magic_power *m_ptr, int num);
* @dgonly
* @brief Get magic power number "num" from array "m_ptr" of magic powers.\n
@@ -2162,41 +2147,6 @@ extern magic_power *new_magic_power(int num);
*/
extern magic_power *grab_magic_power @ get_magic_power(magic_power *m_ptr, int num);
-/** @fn select_magic_power(int *sn, magic_power *powers, int max_powers, char *info_fct, int plev, int cast_stat);
- * @dgonly
- * @brief Select a magic power from array of powers.\n
- * @param *sn Number
- * @brief Power (spell) number
- * @param *powers magic_power \n powers is the array of magic powers.
- * @brief Powers
- * @param max_powers Number \n max_powers is the maximum number of magic
- * powers.
- * @brief Maximum powers
- * @param *info_fct String \n info_fct is the name of a function which will
- * return power info.
- * @brief Name of power info function
- * @param plev Number \n plev is the player's level of magic skill.
- * @brief Player magic level
- * @param cast_stat Number \n cast_stat is the required casting statistic
- * (INT or WIS).
- * @brief Casting statistic
- * @return *sn Number \n sn is the index of the power in the array of magic
- * powers.
- * @return Boolean \n TRUE if power was selected, otherwise FALSE.
- * @note
- * Allow user to choose a magic power.\n\n
- * If a valid spell is chosen, saves it in '*sn' and returns TRUE\n
- * If the user hits escape, returns FALSE, and set '*sn' to -1\n
- * If there are no legal choices, returns FALSE, and sets '*sn' to -2\n\n
- * The "prompt" should be "cast", "recite", or "study".
- * The "known" should be TRUE for cast/pray, FALSE for study\n\n
- * Note: do not call this function directly.\n
- * Please use execute_magic() in powers.lua instead.\n
- * By order of DG.
- * @note (see files lua_bind.c, cmd7.c)
- */
-extern bool get_magic_power_lua @ select_magic_power(int *sn, magic_power *powers, int max_powers, char *info_fct, int plev, int cast_stat);
-
/** @fn magic_power_sucess(magic_power *spell, int stat, char *oups_fct=NULL);
* @dgonly
* @brief Determine if using a magic power succeeds.\n
diff --git a/src/spells1.c b/src/spells1.c
index 58b102cf..9bfc6fe2 100644
--- a/src/spells1.c
+++ b/src/spells1.c
@@ -33,12 +33,6 @@ s16b poly_r_idx(int r_idx)
int i, r;
-#if 0 /* No more -- hehehe -- DG */
- /* Allowable range of "levels" for resulting monster */
- int lev1 = r_ptr->level - ((randint(20) / randint(9)) + 1);
- int lev2 = r_ptr->level + ((randint(20) / randint(9)) + 1);
-#endif
-
/* Hack -- Uniques never polymorph */
if (r_ptr->flags1 & RF1_UNIQUE)
return (r_idx);
@@ -58,11 +52,6 @@ s16b poly_r_idx(int r_idx)
/* Ignore unique monsters */
if (r_ptr->flags1 & (RF1_UNIQUE)) continue;
-#if 0
- /* Ignore monsters with incompatible levels */
- if ((r_ptr->level < lev1) || (r_ptr->level > lev2)) continue;
-#endif
-
/* Use that index */
r_idx = r;
@@ -89,9 +78,9 @@ void teleport_player_directed(int rad, int dir)
int min = rad / 4;
int dis = rad;
int i, d;
- bool look = TRUE;
- bool y_major = FALSE;
- bool x_major = FALSE;
+ bool_ look = TRUE;
+ bool_ y_major = FALSE;
+ bool_ x_major = FALSE;
int y_neg = 1;
int x_neg = 1;
cave_type *c_ptr;
@@ -204,7 +193,7 @@ void teleport_away(int m_idx, int dis)
int ny = 0, nx = 0, oy, ox, d, i, min;
int tries = 0;
- bool look = TRUE;
+ bool_ look = TRUE;
monster_type *m_ptr = &m_list[m_idx];
monster_race *r_ptr = race_inf(m_ptr);
@@ -317,7 +306,7 @@ void teleport_to_player(int m_idx)
int ny = 0, nx = 0, oy, ox, d, i, min;
int dis = 2;
- bool look = TRUE;
+ bool_ look = TRUE;
monster_type *m_ptr = &m_list[m_idx];
monster_race *r_ptr = race_inf(m_ptr);
@@ -430,7 +419,7 @@ void teleport_to_player(int m_idx)
* Try very hard to move the player at least a quarter that distance.
*/
/* It'd be better if this was made an argument ... */
-bool teleport_player_bypass = FALSE;
+bool_ teleport_player_bypass = FALSE;
void teleport_player(int dis)
{
@@ -439,7 +428,7 @@ void teleport_player(int dis)
int xx = -1, yy = -1;
- bool look = TRUE;
+ bool_ look = TRUE;
if (p_ptr->resist_continuum && (!teleport_player_bypass))
{
@@ -600,7 +589,7 @@ void get_pos_player(int dis, int *ny, int *nx)
int d, i, min, x = 0, y = 0;
int tries = 0;
- bool look = TRUE;
+ bool_ look = TRUE;
if (dis > 200) dis = 200; /* To be on the safe side... */
@@ -869,13 +858,7 @@ void teleport_player_level(void)
{
msg_print("You sink through the floor.");
- if (autosave_l)
- {
- is_autosave = TRUE;
- msg_print("Autosaving the game...");
- do_cmd_save_game();
- is_autosave = FALSE;
- }
+ autosave_checkpoint();
dun_level++;
@@ -886,13 +869,7 @@ void teleport_player_level(void)
{
msg_print("You rise up through the ceiling.");
- if (autosave_l)
- {
- is_autosave = TRUE;
- msg_print("Autosaving the game...");
- do_cmd_save_game();
- is_autosave = FALSE;
- }
+ autosave_checkpoint();
dun_level--;
@@ -903,13 +880,7 @@ void teleport_player_level(void)
{
msg_print("You rise up through the ceiling.");
- if (autosave_l)
- {
- is_autosave = TRUE;
- msg_print("Autosaving the game...");
- do_cmd_save_game();
- is_autosave = FALSE;
- }
+ autosave_checkpoint();
dun_level--;
@@ -920,13 +891,7 @@ void teleport_player_level(void)
{
msg_print("You sink through the floor.");
- if (autosave_l)
- {
- is_autosave = TRUE;
- msg_print("Autosaving the game...");
- do_cmd_save_game();
- is_autosave = FALSE;
- }
+ autosave_checkpoint();
dun_level++;
@@ -945,14 +910,6 @@ void teleport_player_level(void)
*/
void recall_player(int d, int f)
{
-#if 0
- if (!p_ptr->town_num)
- {
- /* TODO: Recall the player to the last visited town */
- msg_print("Nothing happens.");
- return;
- }
-#endif
/* Rooted means no move */
if (p_ptr->tim_roots)
{
@@ -1289,8 +1246,8 @@ void take_hit(int damage, cptr hit_from)
object_type *o_ptr = &p_ptr->inventory[INVEN_CARRY];
int old_chp = p_ptr->chp;
- bool pen_invuln = FALSE;
- bool monster_take = FALSE;
+ bool_ pen_invuln = FALSE;
+ bool_ monster_take = FALSE;
char death_message[80];
@@ -1345,8 +1302,7 @@ void take_hit(int damage, cptr hit_from)
cmsg_format(TERM_L_RED,
"%s dies from protecting you, you feel very sad...",
sym_name);
- inven_item_increase(INVEN_CARRY, -1);
- inven_item_optimize(INVEN_CARRY);
+ inc_stack_size_ex(INVEN_CARRY, -1, OPTIMIZE, NO_DESCRIBE);
damage -= o_ptr->pval2;
o_ptr->pval2 = 0;
p_ptr->redraw |= PR_MH;
@@ -1611,7 +1567,7 @@ void take_sanity_hit(int damage, cptr hit_from)
* Does a given class of objects (usually) hate acid?
* Note that acid can either melt or corrode something.
*/
-static bool hates_acid(object_type *o_ptr)
+static bool_ hates_acid(object_type *o_ptr)
{
/* Analyze the type */
switch (o_ptr->tval)
@@ -1666,7 +1622,7 @@ static bool hates_acid(object_type *o_ptr)
/*
* Does a given object (usually) hate electricity?
*/
-static bool hates_elec(object_type *o_ptr)
+static bool_ hates_elec(object_type *o_ptr)
{
switch (o_ptr->tval)
{
@@ -1687,7 +1643,7 @@ static bool hates_elec(object_type *o_ptr)
* Hafted/Polearm weapons have wooden shafts.
* Arrows/Bows are mostly wooden.
*/
-static bool hates_fire(object_type *o_ptr)
+static bool_ hates_fire(object_type *o_ptr)
{
/* Analyze the type */
switch (o_ptr->tval)
@@ -1741,7 +1697,7 @@ static bool hates_fire(object_type *o_ptr)
/*
* Does a given object (usually) hate cold?
*/
-static bool hates_cold(object_type *o_ptr)
+static bool_ hates_cold(object_type *o_ptr)
{
switch (o_ptr->tval)
{
@@ -1903,8 +1859,7 @@ static int inven_damage(inven_func typ, int perc)
}
/* Destroy "amt" items */
- inven_item_increase(i, -amt);
- inven_item_optimize(i);
+ inc_stack_size_ex(i, -amt, OPTIMIZE, NO_DESCRIBE);
/* Count the casualties */
k += amt;
@@ -2120,7 +2075,7 @@ void cold_dam(int dam, cptr kb_str)
* Note that this function (used by stat potions) now restores
* the stat BEFORE increasing it.
*/
-bool inc_stat(int stat)
+bool_ inc_stat(int stat)
{
int value, gain;
@@ -2193,7 +2148,7 @@ bool inc_stat(int stat)
* if your stat is already drained, the "max" value will not drop all
* the way down to the "cur" value.
*/
-bool dec_stat(int stat, int amount, int mode)
+bool_ dec_stat(int stat, int amount, int mode)
{
int cur, max, loss = 0, same, res = FALSE;
@@ -2329,7 +2284,7 @@ bool dec_stat(int stat, int amount, int mode)
/*
* Restore a stat. Return TRUE only if this actually makes a difference.
*/
-bool res_stat(int stat, bool full)
+bool_ res_stat(int stat, bool_ full)
{
/* Fully restore */
if (full)
@@ -2390,7 +2345,7 @@ bool res_stat(int stat, bool full)
*
* Return "TRUE" if the player notices anything
*/
-bool apply_disenchant(int mode)
+bool_ apply_disenchant(int mode)
{
int t = mode;
object_type *o_ptr;
@@ -3000,15 +2955,15 @@ static int project_m_y;
*
* XXX XXX XXX Perhaps we should affect doors?
*/
-static bool project_f(int who, int r, int y, int x, int dam, int typ)
+static bool_ project_f(int who, int r, int y, int x, int dam, int typ)
{
cave_type *c_ptr = &cave[y][x];
- bool obvious = FALSE;
+ bool_ obvious = FALSE;
- bool flag = FALSE;
+ bool_ flag = FALSE;
- bool seen;
+ bool_ seen;
/* XXX XXX XXX */
@@ -3059,7 +3014,7 @@ static bool project_f(int who, int r, int y, int x, int dam, int typ)
int x1 = randint(cur_wid) - 1;
int y2 = y1;
int x2 = x1;
- int try = 1000;
+ int tries = 1000;
/*
* Avoid "interesting" and/or permanent features
@@ -3072,18 +3027,18 @@ static bool project_f(int who, int r, int y, int x, int dam, int typ)
(f_info[cave[y][x].feat].flags1 & FF1_PERMANENT)) break;
/* Destination shouldn't be "interesting" either */
- while (try &&
+ while (tries &&
(!cave_plain_floor_bold(y2, x2) ||
(f_info[cave[y2][x2].feat].flags1 & FF1_PERMANENT)))
{
y2 = y1 = randint(cur_hgt) - 1;
x2 = x1 = randint(cur_wid) - 1;
- scatter(&y2, &x2, y1, x1, 20, 0);
- try --;
+ scatter(&y2, &x2, y1, x1, 20);
+ tries --;
}
/* No boarding grids found */
- if (!try) break;
+ if (!tries) break;
/* Place a pair of between gates */
cave_set_feat(y, x, FEAT_BETWEEN);
@@ -3902,21 +3857,20 @@ static int raise_ego[MAX_RAISE] =
*
* We return "TRUE" if the effect of the projection is "obvious".
*/
-static bool project_o(int who, int r, int y, int x, int dam, int typ)
+static bool_ project_o(int who, int r, int y, int x, int dam, int typ)
{
cave_type *c_ptr = &cave[y][x];
s16b this_o_idx, next_o_idx = 0;
- bool obvious = FALSE;
+ bool_ obvious = FALSE;
u32b f1, f2, f3, f4, f5, esp;
char o_name[80];
int o_sval = 0;
- bool is_potion = FALSE;
- int xx, yy;
+ bool_ is_potion = FALSE;
/* XXX XXX XXX */
@@ -3931,10 +3885,10 @@ static bool project_o(int who, int r, int y, int x, int dam, int typ)
{
object_type * o_ptr;
- bool is_art = FALSE;
- bool ignore = FALSE;
- bool plural = FALSE;
- bool do_kill = FALSE;
+ bool_ is_art = FALSE;
+ bool_ ignore = FALSE;
+ bool_ plural = FALSE;
+ bool_ do_kill = FALSE;
cptr note_kill = NULL;
@@ -4176,8 +4130,6 @@ static bool project_o(int who, int r, int y, int x, int dam, int typ)
}
case GF_RAISE:
{
- xx = x;
- yy = y;
get_pos_player(7, &y, &x);
/* Only corpses can be raised */
@@ -4288,7 +4240,7 @@ static bool project_o(int who, int r, int y, int x, int dam, int typ)
}
/* Can the monster be hurt ? */
-bool hurt_monster(monster_type *m_ptr)
+bool_ hurt_monster(monster_type *m_ptr)
{
if (m_ptr->status == MSTATUS_COMPANION) return FALSE;
else return TRUE;
@@ -4347,7 +4299,7 @@ bool hurt_monster(monster_type *m_ptr)
*
* 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)
+bool_ project_m(int who, int r, int y, int x, int dam, int typ)
{
int tmp;
@@ -4362,13 +4314,13 @@ bool project_m(int who, int r, int y, int x, int dam, int typ)
cptr name = (r_name + r_ptr->name);
/* Is the monster "seen"? */
- bool seen;
+ bool_ seen;
/* Were the effects "obvious" (if seen)? */
- bool obvious = FALSE;
+ bool_ obvious = FALSE;
/* Were the effects "irrelevant"? */
- bool skipped = FALSE;
+ bool_ skipped = FALSE;
/* Move setting */
@@ -4413,14 +4365,6 @@ bool project_m(int who, int r, int y, int x, int dam, int typ)
cptr note_dies = " dies.";
-#if 0
-
- /* Walls protect monsters */
- /* (No, they don't) */
- if (!cave_floor_bold(y, x)) return (FALSE);
-
-#endif
-
/* Nobody here */
if (!c_ptr->m_idx) return (FALSE);
@@ -4464,7 +4408,7 @@ bool project_m(int who, int r, int y, int x, int dam, int typ)
if (!who && (is_friend(m_ptr) >= 0))
{
- bool get_angry = FALSE;
+ bool_ get_angry = FALSE;
/* Grrr? */
switch (typ)
{
@@ -5203,7 +5147,7 @@ bool project_m(int who, int r, int y, int x, int dam, int typ)
/* Gravity -- breathers resist */
case GF_GRAVITY:
{
- bool resist_tele = FALSE;
+ bool_ resist_tele = FALSE;
if (seen) obvious = TRUE;
@@ -5632,9 +5576,6 @@ bool project_m(int who, int r, int y, int x, int dam, int typ)
/* Death Ray */
case GF_DEATH_RAY:
{
-#if 0
- dam = 0;
-#endif
if (seen) obvious = TRUE;
if ((r_ptr->flags3 & (RF3_UNDEAD)) ||
(r_ptr->flags3 & (RF3_NONLIVING)))
@@ -5691,7 +5632,7 @@ bool project_m(int who, int r, int y, int x, int dam, int typ)
/* Clone monsters (Ignore "dam") */
case GF_OLD_CLONE:
{
- bool is_frien = FALSE;
+ bool_ is_frien = FALSE;
if (seen) obvious = TRUE;
if ((is_friend(m_ptr) > 0) && (randint(3) != 1))
@@ -5938,15 +5879,6 @@ bool project_m(int who, int r, int y, int x, int dam, int typ)
(!(r_ptr->flags3 & RF3_UNDEAD)) ||
(m_ptr->level > randint((dam - 10) < 1 ? 1 : (dam - 10)) + 10))
{
-
-#if 0
- /* Memorize a flag */
- if (r_ptr->flags3 & (RF3_NO_CONF))
- {
- if (seen) r_ptr->r_flags3 |= (RF3_NO_CONF);
- }
-#endif
-
/* Resist */
/* No obvious effect */
note = " is unaffected!";
@@ -6353,7 +6285,7 @@ bool project_m(int who, int r, int y, int x, int dam, int typ)
/* Only affect undead */
if (r_ptr->flags3 & (RF3_UNDEAD))
{
- bool resists_tele = FALSE;
+ bool_ resists_tele = FALSE;
if (r_ptr->flags3 & (RF3_RES_TELE))
{
@@ -6399,7 +6331,7 @@ bool project_m(int who, int r, int y, int x, int dam, int typ)
/* Only affect evil */
if (r_ptr->flags3 & (RF3_EVIL))
{
- bool resists_tele = FALSE;
+ bool_ resists_tele = FALSE;
if (r_ptr->flags3 & (RF3_RES_TELE))
{
@@ -6441,7 +6373,7 @@ bool project_m(int who, int r, int y, int x, int dam, int typ)
/* Teleport monster (Use "dam" as "power") */
case GF_AWAY_ALL:
{
- bool resists_tele = FALSE;
+ bool_ resists_tele = FALSE;
if (dungeon_flags2 & DF2_NO_TELEPORT) break; /* No teleport on special levels */
if (r_ptr->flags3 & (RF3_RES_TELE))
@@ -7079,7 +7011,7 @@ bool project_m(int who, int r, int y, int x, int dam, int typ)
/* If another monster did the damage, hurt the monster by hand */
if (who > 0)
{
- bool fear = FALSE;
+ bool_ fear = FALSE;
/* Dead monster */
if (mon_take_hit_mon(who, c_ptr->m_idx, dam, &fear, note_dies))
@@ -7101,7 +7033,7 @@ bool project_m(int who, int r, int y, int x, int dam, int typ)
/* If the player did it, give him experience, check fear */
else if (hurt_monster(m_ptr))
{
- bool fear = FALSE;
+ bool_ fear = FALSE;
/* Hurt the monster, check for fear and death */
if (mon_take_hit(c_ptr->m_idx, dam, &fear, note_dies))
@@ -7163,7 +7095,7 @@ bool project_m(int who, int r, int y, int x, int dam, int typ)
/* Is the spell unsafe for the player ? */
-bool unsafe = FALSE;
+bool_ unsafe = FALSE;
/*
@@ -7185,18 +7117,18 @@ bool unsafe = FALSE;
* We return "TRUE" if any "obvious" effects were observed. XXX XXX Actually,
* we just assume that the effects were obvious, for historical reasons.
*/
-static bool project_p(int who, int r, int y, int x, int dam, int typ, int a_rad)
+static bool_ project_p(int who, int r, int y, int x, int dam, int typ, int a_rad)
{
int k = 0, do_move = 0, a = 0, b = 0, x1 = 0, y1 = 0;
/* Hack -- assume obvious */
- bool obvious = TRUE;
+ bool_ obvious = TRUE;
/* Player blind-ness */
- bool blind = (p_ptr->blind ? TRUE : FALSE);
+ bool_ blind = (p_ptr->blind ? TRUE : FALSE);
/* Player needs a "description" (he is blind) */
- bool fuzzy = FALSE;
+ bool_ fuzzy = FALSE;
/* Source monster */
monster_type *m_ptr = NULL;
@@ -7419,33 +7351,14 @@ static bool project_p(int who, int r, int y, int x, int dam, int typ, int a_rad)
/* Holy Orb -- Player only takes partial damage */
case GF_HOLY_FIRE:
{
-#if 0 /* DGDGDGDGD */
- int diff = get_skill(SKILL_VALARIN) - get_skill(SKILL_NETHER);
-#else
- int diff = 0;
-#endif
if (fuzzy) msg_print("You are hit by something!");
- if (diff > 0)
- dam /= 2;
- else if (diff < 0)
- dam *= 2;
take_hit(dam, killer);
break;
}
case GF_HELL_FIRE:
{
-#if 0 /* DGDGDGDGD */
- int diff = get_skill(SKILL_VALARIN) - get_skill(SKILL_NETHER);
-#else
- int diff = 0;
-#endif
-
if (fuzzy) msg_print("You are hit by something!");
- if (diff < 0)
- dam /= 2;
- else if (diff > 0)
- dam *= 2;
take_hit(dam, killer);
break;
}
@@ -8337,7 +8250,7 @@ static bool project_p(int who, int r, int y, int x, int dam, int typ, int a_rad)
* in the blast radius, in case the "illumination" of the grid was changed,
* and "update_view()" and "update_monsters()" need to be called.
*/
-bool project(int who, int rad, int y, int x, int dam, int typ, int flg)
+bool_ project(int who, int rad, int y, int x, int dam, int typ, int flg)
{
int i, t, dist;
@@ -8351,16 +8264,16 @@ bool project(int who, int rad, int y, int x, int dam, int typ, int flg)
int msec = delay_factor * delay_factor * delay_factor;
/* Assume the player sees nothing */
- bool notice = FALSE;
+ bool_ notice = FALSE;
/* Assume the player has seen nothing */
- bool visual = FALSE;
+ bool_ visual = FALSE;
/* Assume the player has seen no blast grids */
- bool drawn = FALSE;
+ bool_ drawn = FALSE;
/* Is the player blind? */
- bool blind = (p_ptr->blind ? TRUE : FALSE);
+ bool_ blind = (p_ptr->blind ? TRUE : FALSE);
/* Number of grids in the "path" */
int path_n = 0;
@@ -8875,13 +8788,13 @@ bool project(int who, int rad, int y, int x, int dam, int typ, int flg)
* the potion was in her inventory);
* o_ptr --- pointer to the potion object.
*/
-bool potion_smash_effect(int who, int y, int x, int o_sval)
+bool_ potion_smash_effect(int who, int y, int x, int o_sval)
{
int radius = 2;
int dt = 0;
int dam = 0;
- bool ident = FALSE;
- bool angry = FALSE;
+ bool_ ident = FALSE;
+ bool_ angry = FALSE;
switch (o_sval)
{
@@ -9226,17 +9139,17 @@ void generate_spell(int plev)
{
random_spell* rspell;
int dice, sides, chance, mana, power;
- bool destruc_gen = FALSE;
- bool simple_gen = TRUE;
- bool ball_desc = FALSE;
+ bool_ destruc_gen = FALSE;
+ bool_ simple_gen = TRUE;
+ bool_ ball_desc = FALSE;
if (spell_num == MAX_SPELLS) return;
rspell = &random_spells[spell_num];
- power = rand_int(15);
+ power = rand_int(5);
- dice = plev / 5;
+ dice = plev / 2;
sides = plev;
mana = plev;
diff --git a/src/spells2.c b/src/spells2.c
index 2e409713..5467499c 100644
--- a/src/spells2.c
+++ b/src/spells2.c
@@ -91,9 +91,9 @@ void grow_grass(int rad)
/*
* Increase players hit points, notice effects
*/
-bool hp_player(int num)
+bool_ hp_player(int num)
{
- bool dead = p_ptr->chp < 0;
+ bool_ dead = p_ptr->chp < 0;
/* Healing needed */
if (p_ptr->chp < p_ptr->mhp)
@@ -225,9 +225,9 @@ static cptr desc_stat_neg[] =
/*
* Lose a "point"
*/
-bool do_dec_stat(int stat, int mode)
+bool_ do_dec_stat(int stat, int mode)
{
- bool sust = FALSE;
+ bool_ sust = FALSE;
/* Access the "sustain" */
switch (stat)
@@ -281,7 +281,7 @@ bool do_dec_stat(int stat, int mode)
/*
* Restore lost "points" in a stat
*/
-bool do_res_stat(int stat, bool full)
+bool_ do_res_stat(int stat, bool_ full)
{
/* Keep a copy of the current stat, so we can evaluate it if necessary */
int cur_stat = p_ptr->stat_cur[stat];
@@ -311,9 +311,9 @@ bool do_res_stat(int stat, bool full)
/*
* Gain a "point" in a stat
*/
-bool do_inc_stat(int stat)
+bool_ do_inc_stat(int stat)
{
- bool res;
+ bool_ res;
/* Restore strength */
res = res_stat(stat, TRUE);
@@ -427,7 +427,7 @@ static int enchant_table[16] =
1000
};
-bool remove_curse_object(object_type *o_ptr, bool all)
+bool_ remove_curse_object(object_type *o_ptr, bool_ all)
{
u32b f1, f2, f3, f4, f5, esp;
@@ -519,7 +519,7 @@ static int remove_curse_aux(int all)
/*
* Remove most curses
*/
-bool remove_curse(void)
+bool_ remove_curse(void)
{
return (remove_curse_aux(FALSE) ? TRUE : FALSE);
}
@@ -527,7 +527,7 @@ bool remove_curse(void)
/*
* Remove all curses
*/
-bool remove_all_curse(void)
+bool_ remove_all_curse(void)
{
return (remove_curse_aux(TRUE) ? TRUE : FALSE);
}
@@ -537,7 +537,7 @@ bool remove_all_curse(void)
/*
* Restores any drained experience
*/
-bool restore_level(void)
+bool_ restore_level(void)
{
/* Restore experience */
if (p_ptr->exp < p_ptr->max_exp)
@@ -560,12 +560,12 @@ bool restore_level(void)
}
-bool alchemy(void) /* Turns an object into gold, gain some of its value in a shop */
+bool_ alchemy(void) /* Turns an object into gold, gain some of its value in a shop */
{
int item, amt = 1;
int old_number;
long price;
- bool force = FALSE;
+ bool_ force = FALSE;
object_type *o_ptr;
char o_name[80];
char out_val[160];
@@ -580,17 +580,8 @@ bool alchemy(void) /* Turns an object into gold, gain some of its value in a sho
s = "You have nothing to turn to gold.";
if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR))) return (FALSE);
- /* Get the item (in the pack) */
- if (item >= 0)
- {
- o_ptr = &p_ptr->inventory[item];
- }
-
- /* Get the item (on the floor) */
- else
- {
- o_ptr = &o_list[0 - item];
- }
+ /* Get the item */
+ o_ptr = get_object(item);
/* See how many items */
@@ -670,21 +661,8 @@ bool alchemy(void) /* Turns an object into gold, gain some of its value in a sho
}
- /* Eliminate the item (from the pack) */
- if (item >= 0)
- {
- inven_item_increase(item, -amt);
- inven_item_describe(item);
- inven_item_optimize(item);
- }
-
- /* Eliminate the item (from the floor) */
- else
- {
- floor_item_increase(0 - item, -amt);
- floor_item_describe(0 - item);
- floor_item_optimize(0 - item);
- }
+ /* Eliminate the item */
+ inc_stack_size(item, -amt);
return TRUE;
}
@@ -813,15 +791,6 @@ void self_knowledge(FILE *fff)
if (r_ptr->flags2 & RF2_MOVE_BODY)
info[i++] = "You can move monsters.";
/* Not implemented */
-#if 0
- /* They are disabled, because the r_info.txt array has to
- * few RF2_TAKE_ITEM flags... */
- if (r_ptr->flags2 & RF2_TAKE_ITEM)
- info[i++] = "You can pick up items.";
- else
- info[i++] = "You cannot pick up items.";
-#endif
- /* Not implemented */
if (r_ptr->flags3 & RF3_ORC)
info[i++] = "You have orc blood in your veins.";
/* Not implemented */
@@ -1909,7 +1878,7 @@ void report_magics(void)
/*
* Forget everything
*/
-bool lose_all_info(void)
+bool_ lose_all_info(void)
{
int i;
@@ -1959,10 +1928,10 @@ bool lose_all_info(void)
/*
* Detect all traps on current panel
*/
-bool detect_traps(int rad)
+bool_ detect_traps(int rad)
{
int x, y;
- bool detect = FALSE;
+ bool_ detect = FALSE;
cave_type *c_ptr;
@@ -2027,11 +1996,11 @@ bool detect_traps(int rad)
/*
* Detect all doors on current panel
*/
-bool detect_doors(int rad)
+bool_ detect_doors(int rad)
{
int y, x;
- bool detect = FALSE;
+ bool_ detect = FALSE;
cave_type *c_ptr;
@@ -2092,11 +2061,11 @@ bool detect_doors(int rad)
/*
* Detect all stairs on current panel
*/
-bool detect_stairs(int rad)
+bool_ detect_stairs(int rad)
{
int y, x;
- bool detect = FALSE;
+ bool_ detect = FALSE;
cave_type *c_ptr;
@@ -2146,11 +2115,11 @@ bool detect_stairs(int rad)
/*
* Detect any treasure on the current panel
*/
-bool detect_treasure(int rad)
+bool_ detect_treasure(int rad)
{
int y, x;
- bool detect = FALSE;
+ bool_ detect = FALSE;
cave_type *c_ptr;
@@ -2213,12 +2182,12 @@ bool detect_treasure(int rad)
/*
* Detect all "gold" objects on the current panel
*/
-bool hack_no_detect_message = FALSE;
-bool detect_objects_gold(int rad)
+bool_ hack_no_detect_message = FALSE;
+bool_ detect_objects_gold(int rad)
{
int i, y, x;
- bool detect = FALSE;
+ bool_ detect = FALSE;
/* Scan objects */
@@ -2287,11 +2256,11 @@ bool detect_objects_gold(int rad)
/*
* Detect all "normal" objects on the current panel
*/
-bool detect_objects_normal(int rad)
+bool_ detect_objects_normal(int rad)
{
int i, y, x;
- bool detect = FALSE;
+ bool_ detect = FALSE;
/* Scan objects */
@@ -2366,11 +2335,11 @@ bool detect_objects_normal(int rad)
*
* It can probably be argued that this function is now too powerful.
*/
-bool detect_objects_magic(int rad)
+bool_ detect_objects_magic(int rad)
{
int i, y, x, tv;
- bool detect = FALSE;
+ bool_ detect = FALSE;
/* Scan all objects */
@@ -2443,11 +2412,11 @@ bool detect_objects_magic(int rad)
/*
* Detect all "normal" monsters on the current panel
*/
-bool detect_monsters_normal(int rad)
+bool_ detect_monsters_normal(int rad)
{
int i, y, x;
- bool flag = FALSE;
+ bool_ flag = FALSE;
/* Scan monsters */
@@ -2502,10 +2471,10 @@ bool detect_monsters_normal(int rad)
/*
* Detect all "invisible" monsters on current panel
*/
-bool detect_monsters_invis(int rad)
+bool_ detect_monsters_invis(int rad)
{
int i, y, x;
- bool flag = FALSE;
+ bool_ flag = FALSE;
/* Scan monsters */
for (i = 1; i < m_max; i++)
@@ -2569,10 +2538,10 @@ bool detect_monsters_invis(int rad)
/*
* Detect all "evil" monsters on current panel
*/
-bool detect_monsters_evil(int rad)
+bool_ detect_monsters_evil(int rad)
{
int i, y, x;
- bool flag = FALSE;
+ bool_ flag = FALSE;
/* Scan monsters */
@@ -2638,10 +2607,10 @@ bool detect_monsters_evil(int rad)
/*
* Detect all (string) monsters on current panel
*/
-bool detect_monsters_string(cptr chars, int rad)
+bool_ detect_monsters_string(cptr chars, int rad)
{
int i, y, x;
- bool flag = FALSE;
+ bool_ flag = FALSE;
/* Scan monsters */
@@ -2703,10 +2672,10 @@ bool detect_monsters_string(cptr chars, int rad)
/*
* A "generic" detect monsters routine, tagged to flags3
*/
-bool detect_monsters_xxx(u32b match_flag, int rad)
+bool_ detect_monsters_xxx(u32b match_flag, int rad)
{
int i, y, x;
- bool flag = FALSE;
+ bool_ flag = FALSE;
cptr desc_monsters = "weird monsters";
@@ -2782,7 +2751,7 @@ bool detect_monsters_xxx(u32b match_flag, int rad)
}
/* Detect good monsters */
-bool detect_monsters_good(int rad)
+bool_ detect_monsters_good(int rad)
{
return (detect_monsters_xxx(RF3_GOOD, rad));
}
@@ -2791,9 +2760,9 @@ bool detect_monsters_good(int rad)
/*
* Detect everything
*/
-bool detect_all(int rad)
+bool_ detect_all(int rad)
{
- bool detect = FALSE;
+ bool_ detect = FALSE;
/* Detect everything */
if (detect_traps(rad)) detect = TRUE;
@@ -2870,7 +2839,7 @@ void stair_creation(void)
/*
* Hook to specify "weapon"
*/
-static bool item_tester_hook_weapon(object_type *o_ptr)
+static bool_ item_tester_hook_weapon(object_type *o_ptr)
{
switch (o_ptr->tval)
{
@@ -2906,7 +2875,7 @@ static bool item_tester_hook_weapon(object_type *o_ptr)
/*
* Hook to specify "armour"
*/
-bool item_tester_hook_armour(object_type *o_ptr)
+bool_ item_tester_hook_armour(object_type *o_ptr)
{
switch (o_ptr->tval)
{
@@ -2942,7 +2911,7 @@ bool item_tester_hook_armour(object_type *o_ptr)
/*
* Check if an object is weapon or armour (but not arrow, bolt, or shot)
*/
-bool item_tester_hook_weapon_armour(object_type *o_ptr)
+bool_ item_tester_hook_weapon_armour(object_type *o_ptr)
{
return (item_tester_hook_weapon(o_ptr) ||
item_tester_hook_armour(o_ptr));
@@ -2951,7 +2920,7 @@ bool item_tester_hook_weapon_armour(object_type *o_ptr)
/*
* Check if an object is artifactable
*/
-bool item_tester_hook_artifactable(object_type *o_ptr)
+bool_ item_tester_hook_artifactable(object_type *o_ptr)
{
return ((item_tester_hook_weapon(o_ptr) ||
item_tester_hook_armour(o_ptr) ||
@@ -2977,11 +2946,11 @@ bool item_tester_hook_artifactable(object_type *o_ptr)
* Note that this function can now be used on "piles" of items, and
* the larger the pile, the lower the chance of success.
*/
-bool enchant(object_type *o_ptr, int n, int eflag)
+bool_ enchant(object_type *o_ptr, int n, int eflag)
{
int i, chance, prob;
- bool res = FALSE;
- bool a = (artifact_p(o_ptr) || o_ptr->art_name);
+ bool_ res = FALSE;
+ bool_ a = (artifact_p(o_ptr) || o_ptr->art_name);
u32b f1, f2, f3, f4, f5, esp;
@@ -3154,10 +3123,10 @@ bool enchant(object_type *o_ptr, int n, int eflag)
* Note that "num_ac" requires armour, else weapon
* Returns TRUE if attempted, FALSE if cancelled
*/
-bool enchant_spell(int num_hit, int num_dam, int num_ac, int num_pval)
+bool_ enchant_spell(int num_hit, int num_dam, int num_ac, int num_pval)
{
int item;
- bool okay = FALSE;
+ bool_ okay = FALSE;
object_type *o_ptr;
char o_name[80];
cptr q, s;
@@ -3174,18 +3143,8 @@ bool enchant_spell(int num_hit, int num_dam, int num_ac, int num_pval)
s = "You have nothing to enchant.";
if (!get_item(&item, q, s, (USE_EQUIP | USE_INVEN | USE_FLOOR))) return (FALSE);
- /* Get the item (in the pack) */
- if (item >= 0)
- {
- o_ptr = &p_ptr->inventory[item];
- }
-
- /* Get the item (on the floor) */
- else
- {
- o_ptr = &o_list[0 - item];
- }
-
+ /* Get the item */
+ o_ptr = get_object(item);
/* Description */
object_desc(o_name, o_ptr, FALSE, 0);
@@ -3222,9 +3181,6 @@ void curse_artifact(object_type * o_ptr)
if (o_ptr->to_h) o_ptr->to_h = 0 - ((o_ptr->to_h) + randint(4));
if (o_ptr->to_d) o_ptr->to_d = 0 - ((o_ptr->to_d) + randint(4));
o_ptr->art_flags3 |= ( TR3_HEAVY_CURSE | TR3_CURSED );
-#if 0 /* Silly */
- if (randint(4) == 1) o_ptr-> art_flags3 |= TR3_PERMA_CURSE;
-#endif
if (randint(3) == 1) o_ptr-> art_flags3 |= TR3_TY_CURSE;
if (randint(2) == 1) o_ptr-> art_flags3 |= TR3_AGGRAVATE;
if (randint(3) == 1) o_ptr-> art_flags3 |= TR3_DRAIN_EXP;
@@ -3239,7 +3195,7 @@ void curse_artifact(object_type * o_ptr)
* Should be merged with randart code.
* looks like BASIC coder's work...
*/
-void random_plus(object_type * o_ptr, bool is_scroll)
+void random_plus(object_type * o_ptr, bool_ is_scroll)
{
int this_type = (o_ptr->tval < TV_BOOTS ? 23 : 19);
@@ -3461,7 +3417,7 @@ void random_plus(object_type * o_ptr, bool is_scroll)
}
-void random_resistance (object_type * o_ptr, bool is_scroll, int specific)
+void random_resistance (object_type * o_ptr, bool_ is_scroll, int specific)
{
/* To avoid a number of possible bugs */
if (!specific)
@@ -3765,7 +3721,7 @@ void random_resistance (object_type * o_ptr, bool is_scroll, int specific)
}
}
-void random_misc(object_type * o_ptr, bool is_scroll)
+void random_misc(object_type * o_ptr, bool_ is_scroll)
{
if (artifact_bias == BIAS_RANGER)
@@ -3976,7 +3932,7 @@ void random_misc(object_type * o_ptr, bool is_scroll)
}
-void random_slay (object_type * o_ptr, bool is_scroll)
+void random_slay (object_type * o_ptr, bool_ is_scroll)
{
if (artifact_bias == BIAS_CHAOS && !(o_ptr->tval == TV_BOW))
{
@@ -4262,7 +4218,7 @@ void random_slay (object_type * o_ptr, bool is_scroll)
/*
* Determines if an item is not identified
*/
-static bool item_tester_hook_unknown(object_type *o_ptr)
+static bool_ item_tester_hook_unknown(object_type *o_ptr)
{
return (object_known_p(o_ptr) ? FALSE : TRUE);
}
@@ -4273,7 +4229,7 @@ static bool item_tester_hook_unknown(object_type *o_ptr)
* This routine does *not* automatically combine objects.
* Returns TRUE if something was identified, else FALSE.
*/
-bool ident_spell(void)
+bool_ ident_spell(void)
{
int item;
@@ -4289,18 +4245,8 @@ bool ident_spell(void)
s = "You have nothing to identify.";
if (!get_item(&item, q, s, (USE_EQUIP | USE_INVEN | USE_FLOOR))) return (FALSE);
- /* Get the item (in the pack) */
- if (item >= 0)
- {
- o_ptr = &p_ptr->inventory[item];
- }
-
- /* Get the item (on the floor) */
- else
- {
- o_ptr = &o_list[0 - item];
- }
-
+ /* Get the item */
+ o_ptr = get_object(item);
/* Identify it fully */
object_aware(o_ptr);
@@ -4345,9 +4291,6 @@ bool ident_spell(void)
/* Build note and write */
sprintf(note, "Found The %s", item_name);
add_note(note, 'A');
-
- sprintf(note, "has found The %s", item_name);
- irc_emote(note);
}
/* Process the appropriate hooks */
process_hooks(HOOK_IDENTIFY, "(d,s)", item, "normal");
@@ -4359,7 +4302,7 @@ bool ident_spell(void)
/*
* Identify all objects in the level
*/
-bool ident_all(void)
+bool_ ident_all(void)
{
int i;
@@ -4384,9 +4327,6 @@ bool ident_all(void)
/* Build note and write */
sprintf(note, "Found The %s", item_name);
add_note(note, 'A');
-
- sprintf(note, "has found The %s", item_name);
- irc_emote(note);
}
/* Process the appropriate hooks */
process_hooks(HOOK_IDENTIFY, "(d,s)", -i, "normal");
@@ -4401,7 +4341,7 @@ bool ident_all(void)
/*
* Determine if an object is not fully identified
*/
-static bool item_tester_hook_no_mental(object_type *o_ptr)
+static bool_ item_tester_hook_no_mental(object_type *o_ptr)
{
return ((o_ptr->ident & (IDENT_MENTAL)) ? FALSE : TRUE);
}
@@ -4410,7 +4350,7 @@ static bool item_tester_hook_no_mental(object_type *o_ptr)
* Fully "identify" an object in the inventory -BEN-
* This routine returns TRUE if an item was identified.
*/
-bool identify_fully(void)
+bool_ identify_fully(void)
{
int item;
object_type *o_ptr;
@@ -4424,17 +4364,8 @@ bool identify_fully(void)
s = "You have nothing to identify.";
if (!get_item(&item, q, s, (USE_EQUIP | USE_INVEN | USE_FLOOR))) return (FALSE);
- /* Get the item (in the pack) */
- if (item >= 0)
- {
- o_ptr = &p_ptr->inventory[item];
- }
-
- /* Get the item (on the floor) */
- else
- {
- o_ptr = &o_list[0 - item];
- }
+ /* Get the item */
+ o_ptr = get_object(item);
/* Do the identification */
make_item_fully_identified(o_ptr);
@@ -4478,9 +4409,6 @@ bool identify_fully(void)
/* Build note and write */
sprintf(note, "Found The %s", item_name);
add_note(note, 'A');
-
- sprintf(note, "has found The %s", item_name);
- irc_emote(note);
}
/* Describe it fully */
@@ -4499,7 +4427,7 @@ bool identify_fully(void)
/*
* Hook for "get_item()". Determine if something is rechargable.
*/
-bool item_tester_hook_recharge(object_type *o_ptr)
+bool_ item_tester_hook_recharge(object_type *o_ptr)
{
u32b f1, f2, f3, f4, f5, esp;
@@ -4543,12 +4471,12 @@ bool item_tester_hook_recharge(object_type *o_ptr)
*
* XXX XXX XXX Beware of "sliding index errors".
*/
-bool recharge(int power)
+bool_ recharge(int power)
{
int recharge_strength, recharge_amount;
int item, lev;
- bool fail = FALSE;
+ bool_ fail = FALSE;
byte fail_type = 1;
@@ -4558,7 +4486,6 @@ bool recharge(int power)
char o_name[80];
object_type *o_ptr;
- object_kind *k_ptr;
/* Only accept legal items */
item_tester_hook = item_tester_hook_recharge;
@@ -4568,24 +4495,14 @@ bool recharge(int power)
s = "You have nothing to recharge.";
if (!get_item(&item, q, s, (USE_INVEN | USE_FLOOR))) return (FALSE);
- /* Get the item (in the pack) */
- if (item >= 0)
- {
- o_ptr = &p_ptr->inventory[item];
- }
-
- /* Get the item (on the floor) */
- else
- {
- o_ptr = &o_list[0 - item];
- }
+ /* Get the item */
+ o_ptr = get_object(item);
/* Extract the flags */
object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp);
/* Extract the object "level" */
lev = k_info[o_ptr->k_idx].level;
- k_ptr = &k_info[o_ptr->k_idx];
/* Recharge a rod */
if (o_ptr->tval == TV_ROD_MAIN)
@@ -4781,21 +4698,8 @@ bool recharge(int power)
/* Reduce rod stack maximum timeout, drain wands. */
if (o_ptr->tval == TV_WAND) o_ptr->pval = 0;
- /* Reduce and describe inventory */
- if (item >= 0)
- {
- inven_item_increase(item, -1);
- inven_item_describe(item);
- inven_item_optimize(item);
- }
-
- /* Reduce and describe floor item */
- else
- {
- floor_item_increase(0 - item, -1);
- floor_item_describe(0 - item);
- floor_item_optimize(0 - item);
- }
+ /* Reduce and describe */
+ inc_stack_size(item, -1);
}
/* Destroy all memebers of a stack of objects. */
@@ -4808,20 +4712,7 @@ bool recharge(int power)
/* 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);
- }
+ inc_stack_size(item, -999);
}
}
}
@@ -4844,11 +4735,11 @@ bool recharge(int power)
*
* Note that affected monsters are NOT auto-tracked by this usage.
*/
-bool project_hack(int typ, int dam)
+bool_ project_hack(int typ, int dam)
{
int i, x, y;
int flg = PROJECT_JUMP | PROJECT_KILL | PROJECT_HIDE;
- bool obvious = FALSE;
+ bool_ obvious = FALSE;
/* Affect all (nearby) monsters */
@@ -4912,7 +4803,7 @@ void project_meteor(int radius, int typ, int dam, u32b flg)
/*
* Speed monsters
*/
-bool speed_monsters(void)
+bool_ speed_monsters(void)
{
return (project_hack(GF_OLD_SPEED, p_ptr->lev));
}
@@ -4920,7 +4811,7 @@ bool speed_monsters(void)
/*
* Slow monsters
*/
-bool slow_monsters(void)
+bool_ slow_monsters(void)
{
return (project_hack(GF_OLD_SLOW, p_ptr->lev));
}
@@ -4928,7 +4819,7 @@ bool slow_monsters(void)
/*
* Paralyzation monsters
*/
-bool conf_monsters(void)
+bool_ conf_monsters(void)
{
return (project_hack(GF_OLD_CONF, p_ptr->lev));
}
@@ -4936,7 +4827,7 @@ bool conf_monsters(void)
/*
* Sleep monsters
*/
-bool sleep_monsters(void)
+bool_ sleep_monsters(void)
{
return (project_hack(GF_OLD_SLEEP, p_ptr->lev));
}
@@ -4944,7 +4835,7 @@ bool sleep_monsters(void)
/*
* Scare monsters
*/
-bool scare_monsters(void)
+bool_ scare_monsters(void)
{
return (project_hack(GF_FEAR, p_ptr->lev));
}
@@ -4953,7 +4844,7 @@ bool scare_monsters(void)
/*
* Banish evil monsters
*/
-bool banish_evil(int dist)
+bool_ banish_evil(int dist)
{
return (project_hack(GF_AWAY_EVIL, dist));
}
@@ -4962,7 +4853,7 @@ bool banish_evil(int dist)
/*
* Turn undead
*/
-bool turn_undead(void)
+bool_ turn_undead(void)
{
return (project_hack(GF_TURN_UNDEAD, p_ptr->lev));
}
@@ -4971,7 +4862,7 @@ bool turn_undead(void)
/*
* Dispel undead monsters
*/
-bool dispel_undead(int dam)
+bool_ dispel_undead(int dam)
{
return (project_hack(GF_DISP_UNDEAD, dam));
}
@@ -4979,7 +4870,7 @@ bool dispel_undead(int dam)
/*
* Dispel evil monsters
*/
-bool dispel_evil(int dam)
+bool_ dispel_evil(int dam)
{
return (project_hack(GF_DISP_EVIL, dam));
}
@@ -4987,7 +4878,7 @@ bool dispel_evil(int dam)
/*
* Dispel good monsters
*/
-bool dispel_good(int dam)
+bool_ dispel_good(int dam)
{
return (project_hack(GF_DISP_GOOD, dam));
}
@@ -4995,7 +4886,7 @@ bool dispel_good(int dam)
/*
* Dispel all monsters
*/
-bool dispel_monsters(int dam)
+bool_ dispel_monsters(int dam)
{
return (project_hack(GF_DISP_ALL, dam));
}
@@ -5003,7 +4894,7 @@ bool dispel_monsters(int dam)
/*
* Dispel 'living' monsters
*/
-bool dispel_living(int dam)
+bool_ dispel_living(int dam)
{
return (project_hack(GF_DISP_LIVING, dam));
}
@@ -5011,7 +4902,7 @@ bool dispel_living(int dam)
/*
* Dispel demons
*/
-bool dispel_demons(int dam)
+bool_ dispel_demons(int dam)
{
return (project_hack(GF_DISP_DEMON, dam));
}
@@ -5023,8 +4914,8 @@ bool dispel_demons(int dam)
void aggravate_monsters(int who)
{
int i;
- bool sleep = FALSE;
- bool speed = FALSE;
+ bool_ sleep = FALSE;
+ bool_ speed = FALSE;
/* Aggravate everyone nearby */
@@ -5081,7 +4972,7 @@ void aggravate_monsters(int who)
/*
* Generic genocide race selection
*/
-bool get_genocide_race(cptr msg, char *typ)
+bool_ get_genocide_race(cptr msg, char *typ)
{
int i, j;
cave_type *c_ptr;
@@ -5107,11 +4998,11 @@ bool get_genocide_race(cptr msg, char *typ)
/*
* Inflict dam damage of type typee to all monster of the given race
*/
-bool invoke(int dam, int typee)
+bool_ invoke(int dam, int typee)
{
int i;
char typ;
- bool result = FALSE;
+ bool_ result = FALSE;
int msec = delay_factor * delay_factor * delay_factor;
if (dungeon_flags2 & DF2_NO_GENO) return (FALSE);
@@ -5172,10 +5063,10 @@ bool invoke(int dam, int typee)
/*
* Delete all non-unique/non-quest monsters of a given "type" from the level
*/
-bool genocide_aux(bool player_cast, char typ)
+bool_ genocide_aux(bool_ player_cast, char typ)
{
int i;
- bool result = FALSE;
+ bool_ result = FALSE;
int msec = delay_factor * delay_factor * delay_factor;
int dam = 0;
@@ -5207,7 +5098,7 @@ bool genocide_aux(bool player_cast, char typ)
do
{
- scatter(&wy, &wx, m_ptr->fy, m_ptr->fx, 10, 0);
+ scatter(&wy, &wx, m_ptr->fy, m_ptr->fx, 10);
}
while (!(in_bounds(wy, wx) && cave_floor_bold(wy, wx)) && --attempts);
@@ -5265,7 +5156,7 @@ bool genocide_aux(bool player_cast, char typ)
return (result);
}
-bool genocide(bool player_cast)
+bool_ genocide(bool_ player_cast)
{
char typ;
@@ -5288,10 +5179,10 @@ bool genocide(bool player_cast)
/*
* Delete all nearby (non-unique) monsters
*/
-bool mass_genocide(bool player_cast)
+bool_ mass_genocide(bool_ player_cast)
{
int i;
- bool result = FALSE;
+ bool_ result = FALSE;
int msec = delay_factor * delay_factor * delay_factor;
int dam = 0;
@@ -5332,7 +5223,7 @@ bool mass_genocide(bool player_cast)
do
{
- scatter(&wy, &wx, m_ptr->fy, m_ptr->fx, 10, 0);
+ scatter(&wy, &wx, m_ptr->fy, m_ptr->fx, 10);
}
while (!(in_bounds(wy, wx) && cave_floor_bold(wy, wx)) && --attempts);
@@ -5431,11 +5322,11 @@ void do_probe(int m_idx)
/*
* Probe nearby monsters
*/
-bool probing(void)
+bool_ probing(void)
{
int i;
- bool probe = FALSE;
+ bool_ probe = FALSE;
/* Probe all (nearby) monsters */
@@ -5483,7 +5374,7 @@ void wipe(int y1, int x1, int r)
cave_type *c_ptr;
- bool flag = FALSE;
+ bool_ flag = FALSE;
if (dungeon_flags2 & DF2_NO_GENO)
{
@@ -5565,13 +5456,13 @@ void wipe(int y1, int x1, int r)
* Later we may use one function for both "destruction" and
* "earthquake" by using the "full" to select "destruction".
*/
-void destroy_area(int y1, int x1, int r, bool full, bool bypass)
+void destroy_area(int y1, int x1, int r, bool_ full, bool_ bypass)
{
int y, x, k, t;
cave_type *c_ptr;
- bool flag = FALSE;
+ bool_ flag = FALSE;
/* XXX XXX */
@@ -5725,9 +5616,9 @@ void earthquake(int cy, int cx, int r)
int i, t, y, x, yy, xx, dy, dx, oy, ox;
int damage = 0;
int sn = 0, sy = 0, sx = 0;
- bool hurt = FALSE;
+ bool_ hurt = FALSE;
cave_type *c_ptr;
- bool map[32][32];
+ bool_ map[32][32];
if (p_ptr->inside_quest)
{
@@ -6043,7 +5934,7 @@ void earthquake(int cy, int cx, int r)
/* Destroy location (if valid) */
if (cave_valid_bold(yy, xx))
{
- bool floor = cave_floor_bold(yy, xx);
+ bool_ floor = cave_floor_bold(yy, xx);
/* Delete objects */
delete_object(yy, xx);
@@ -6371,7 +6262,7 @@ void unlite_room(int y1, int x1)
* Hack -- call light around the player
* Affect all monsters in the projection radius
*/
-bool lite_area(int dam, int rad)
+bool_ lite_area(int dam, int rad)
{
int flg = PROJECT_GRID | PROJECT_KILL;
@@ -6396,7 +6287,7 @@ bool lite_area(int dam, int rad)
* Hack -- call darkness around the player
* Affect all monsters in the projection radius
*/
-bool unlite_area(int dam, int rad)
+bool_ unlite_area(int dam, int rad)
{
int flg = PROJECT_GRID | PROJECT_KILL;
@@ -6423,7 +6314,7 @@ bool unlite_area(int dam, int rad)
* Allow "target" mode to pass over monsters
* Affect grids, objects, and monsters
*/
-bool fire_ball(int typ, int dir, int dam, int rad)
+bool_ fire_ball(int typ, int dir, int dam, int rad)
{
int tx, ty;
@@ -6451,7 +6342,7 @@ bool fire_ball(int typ, int dir, int dam, int rad)
* Allow "target" mode to pass over monsters
* Affect grids, objects, and monsters
*/
-bool fire_cloud(int typ, int dir, int dam, int rad, int time)
+bool_ fire_cloud(int typ, int dir, int dam, int rad, int time)
{
int tx, ty;
@@ -6480,7 +6371,7 @@ bool fire_cloud(int typ, int dir, int dam, int rad, int time)
* Allow "target" mode to pass over monsters
* Affect grids, objects, and monsters
*/
-bool fire_wave(int typ, int dir, int dam, int rad, int time, s32b eff)
+bool_ fire_wave(int typ, int dir, int dam, int rad, int time, s32b eff)
{
project_time_effect = eff;
return (fire_cloud(typ, dir, dam, rad, time));
@@ -6491,7 +6382,7 @@ bool fire_wave(int typ, int dir, int dam, int rad, int time, s32b eff)
* Pass through monsters, as a "beam"
* Affect monsters (not grids or objects)
*/
-bool fire_wall(int typ, int dir, int dam, int time)
+bool_ fire_wall(int typ, int dir, int dam, int time)
{
int flg = PROJECT_BEAM | PROJECT_KILL | PROJECT_STAY | PROJECT_GRID;
project_time = time;
@@ -6504,7 +6395,7 @@ bool fire_wall(int typ, int dir, int dam, int time)
* Allow "target" mode to pass over monsters
* Affect grids, objects, and monsters
*/
-bool fire_druid_ball(int typ, int dir, int dam, int rad)
+bool_ fire_druid_ball(int typ, int dir, int dam, int rad)
{
int tx, ty;
@@ -6533,7 +6424,7 @@ bool fire_druid_ball(int typ, int dir, int dam, int rad)
* Allow "target" mode to pass over monsters
* Affect grids, objects, and monsters
*/
-bool fire_ball_beam(int typ, int dir, int dam, int rad)
+bool_ fire_ball_beam(int typ, int dir, int dam, int rad)
{
int tx, ty;
@@ -6668,7 +6559,6 @@ void swap_position(int lty, int ltx)
int tx = ltx, ty = lty;
cave_type * c_ptr;
monster_type * m_ptr;
- monster_race * r_ptr;
if (p_ptr->resist_continuum)
{
@@ -6717,7 +6607,6 @@ void swap_position(int lty, int ltx)
else
{
m_ptr = &m_list[c_ptr->m_idx];
- r_ptr = race_inf(m_ptr);
sound(SOUND_TELEPORT);
@@ -6770,7 +6659,7 @@ void swap_position(int lty, int ltx)
/*
* Hack -- apply a "projection()" in a direction (or at the target)
*/
-bool project_hook(int typ, int dir, int dam, int flg)
+bool_ project_hook(int typ, int dir, int dam, int flg)
{
int tx, ty;
@@ -6798,7 +6687,7 @@ bool project_hook(int typ, int dir, int dam, int flg)
* Stop if we hit a monster, as a "bolt"
* Affect monsters (not grids or objects)
*/
-bool fire_bolt(int typ, int dir, int dam)
+bool_ fire_bolt(int typ, int dir, int dam)
{
int flg = PROJECT_STOP | PROJECT_KILL;
return (project_hook(typ, dir, dam, flg));
@@ -6809,7 +6698,7 @@ bool fire_bolt(int typ, int dir, int dam)
* Stop if we hit a monster, as a "bolt"
* Affect monsters (not grids or objects)
*/
-bool fire_druid_bolt(int typ, int dir, int dam)
+bool_ fire_druid_bolt(int typ, int dir, int dam)
{
int flg = PROJECT_STOP | PROJECT_KILL | PROJECT_MANA_PATH;
return (project_hook(typ, dir, dam, flg));
@@ -6821,7 +6710,7 @@ bool fire_druid_bolt(int typ, int dir, int dam)
* Pass through monsters, as a "beam"
* Affect monsters (not grids or objects)
*/
-bool fire_druid_beam(int typ, int dir, int dam)
+bool_ fire_druid_beam(int typ, int dir, int dam)
{
int flg = PROJECT_BEAM | PROJECT_KILL | PROJECT_MANA_PATH;
return (project_hook(typ, dir, dam, flg));
@@ -6832,7 +6721,7 @@ bool fire_druid_beam(int typ, int dir, int dam)
* Pass through monsters, as a "beam"
* Affect monsters (not grids or objects)
*/
-bool fire_beam(int typ, int dir, int dam)
+bool_ fire_beam(int typ, int dir, int dam)
{
int flg = PROJECT_BEAM | PROJECT_KILL;
return (project_hook(typ, dir, dam, flg));
@@ -6842,7 +6731,7 @@ bool fire_beam(int typ, int dir, int dam)
/*
* Cast a bolt spell, or rarely, a beam spell
*/
-bool fire_bolt_or_beam(int prob, int typ, int dir, int dam)
+bool_ fire_bolt_or_beam(int prob, int typ, int dir, int dam)
{
if (rand_int(100) < prob)
{
@@ -6854,14 +6743,14 @@ bool fire_bolt_or_beam(int prob, int typ, int dir, int dam)
}
}
-bool fire_godly_wrath(int y, int x, int typ, int rad, int dam)
+bool_ fire_godly_wrath(int y, int x, int typ, int rad, int dam)
{
int flg = PROJECT_STOP | PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL;
return (project(0, rad, y, x, dam, typ, flg));
}
-bool fire_explosion(int y, int x, int typ, int rad, int dam)
+bool_ fire_explosion(int y, int x, int typ, int rad, int dam)
{
int flg = PROJECT_STOP | PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL;
@@ -6871,126 +6760,126 @@ bool fire_explosion(int y, int x, int typ, int rad, int dam)
/*
* Some of the old functions
*/
-bool lite_line(int dir)
+bool_ lite_line(int dir)
{
int flg = PROJECT_BEAM | PROJECT_GRID | PROJECT_KILL;
return (project_hook(GF_LITE_WEAK, dir, damroll(6, 8), flg));
}
-bool drain_life(int dir, int dam)
+bool_ drain_life(int dir, int dam)
{
int flg = PROJECT_STOP | PROJECT_KILL;
return (project_hook(GF_OLD_DRAIN, dir, dam, flg));
}
-bool wall_to_mud(int dir)
+bool_ wall_to_mud(int dir)
{
int flg = PROJECT_BEAM | PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL;
return (project_hook(GF_KILL_WALL, dir, 20 + randint(30), flg));
}
-bool wizard_lock(int dir)
+bool_ wizard_lock(int dir)
{
int flg = PROJECT_BEAM | PROJECT_GRID | PROJECT_ITEM | PROJECT_KILL;
return (project_hook(GF_JAM_DOOR, dir, 20 + randint(30), flg));
}
-bool destroy_door(int dir)
+bool_ destroy_door(int dir)
{
int flg = PROJECT_BEAM | PROJECT_GRID | PROJECT_ITEM;
return (project_hook(GF_KILL_DOOR, dir, 0, flg));
}
-bool disarm_trap(int dir)
+bool_ disarm_trap(int dir)
{
int flg = PROJECT_BEAM | PROJECT_GRID | PROJECT_ITEM;
return (project_hook(GF_KILL_TRAP, dir, 0, flg));
}
-bool heal_monster(int dir)
+bool_ heal_monster(int dir)
{
int flg = PROJECT_STOP | PROJECT_KILL;
return (project_hook(GF_OLD_HEAL, dir, damroll(4, 6), flg));
}
-bool speed_monster(int dir)
+bool_ speed_monster(int dir)
{
int flg = PROJECT_STOP | PROJECT_KILL;
return (project_hook(GF_OLD_SPEED, dir, p_ptr->lev, flg));
}
-bool slow_monster(int dir)
+bool_ slow_monster(int dir)
{
int flg = PROJECT_STOP | PROJECT_KILL;
return (project_hook(GF_OLD_SLOW, dir, p_ptr->lev, flg));
}
-bool sleep_monster(int dir)
+bool_ sleep_monster(int dir)
{
int flg = PROJECT_STOP | PROJECT_KILL;
return (project_hook(GF_OLD_SLEEP, dir, p_ptr->lev, flg));
}
-bool stasis_monster(int dir)
+bool_ stasis_monster(int dir)
{
int flg = PROJECT_STOP | PROJECT_KILL;
return (project_hook(GF_STASIS, dir, p_ptr->lev, flg));
}
-bool confuse_monster(int dir, int plev)
+bool_ confuse_monster(int dir, int plev)
{
int flg = PROJECT_STOP | PROJECT_KILL;
return (project_hook(GF_OLD_CONF, dir, plev, flg));
}
-bool stun_monster(int dir, int plev)
+bool_ stun_monster(int dir, int plev)
{
int flg = PROJECT_STOP | PROJECT_KILL;
return (project_hook(GF_STUN, dir, plev, flg));
}
-bool poly_monster(int dir)
+bool_ poly_monster(int dir)
{
int flg = PROJECT_STOP | PROJECT_KILL;
return (project_hook(GF_OLD_POLY, dir, p_ptr->lev, flg));
}
-bool clone_monster(int dir)
+bool_ clone_monster(int dir)
{
int flg = PROJECT_STOP | PROJECT_KILL;
return (project_hook(GF_OLD_CLONE, dir, 0, flg));
}
-bool fear_monster(int dir, int plev)
+bool_ fear_monster(int dir, int plev)
{
int flg = PROJECT_STOP | PROJECT_KILL;
return (project_hook(GF_TURN_ALL, dir, plev, flg));
}
-bool death_ray(int dir, int plev)
+bool_ death_ray(int dir, int plev)
{
int flg = PROJECT_STOP | PROJECT_KILL;
return (project_hook(GF_DEATH_RAY, dir, plev, flg));
}
-bool teleport_monster(int dir)
+bool_ teleport_monster(int dir)
{
int flg = PROJECT_BEAM | PROJECT_KILL;
@@ -7007,34 +6896,34 @@ bool teleport_monster(int dir)
/*
* Hooks -- affect adjacent grids (radius 1 ball attack)
*/
-bool door_creation(void)
+bool_ door_creation(void)
{
int flg = PROJECT_GRID | PROJECT_ITEM | PROJECT_HIDE;
return (project(0, 1, p_ptr->py, p_ptr->px, 0, GF_MAKE_DOOR, flg));
}
-bool trap_creation(void)
+bool_ trap_creation(void)
{
int flg = PROJECT_GRID | PROJECT_ITEM | PROJECT_HIDE;
return (project(0, 1, p_ptr->py, p_ptr->px, 0, GF_MAKE_TRAP, flg));
}
-bool glyph_creation(void)
+bool_ glyph_creation(void)
{
int flg = PROJECT_GRID | PROJECT_ITEM;
return (project(0, 1, p_ptr->py, p_ptr->px, 0, GF_MAKE_GLYPH, flg));
}
-bool wall_stone(int y, int x)
+bool_ wall_stone(int y, int x)
{
cave_type *c_ptr = &cave[y][x];
int flg = PROJECT_GRID | PROJECT_ITEM;
int featflags = f_info[c_ptr->feat].flags1;
- bool dummy = (project(0, 1, y, x, 0, GF_STONE_WALL, flg));
+ bool_ dummy = (project(0, 1, y, x, 0, GF_STONE_WALL, flg));
if (!(featflags & FF1_PERMANENT) && !(featflags & FF1_WALL))
cave_set_feat(y, x, FEAT_FLOOR);
@@ -7055,19 +6944,19 @@ bool wall_stone(int y, int x)
}
-bool destroy_doors_touch(void)
+bool_ destroy_doors_touch(void)
{
int flg = PROJECT_GRID | PROJECT_ITEM | PROJECT_HIDE;
return (project(0, 1, p_ptr->py, p_ptr->px, 0, GF_KILL_DOOR, flg));
}
-bool destroy_traps_touch(void)
+bool_ destroy_traps_touch(void)
{
int flg = PROJECT_GRID | PROJECT_ITEM | PROJECT_HIDE;
return (project(0, 1, p_ptr->py, p_ptr->px, 0, GF_KILL_TRAP, flg));
}
-bool sleep_monsters_touch(void)
+bool_ sleep_monsters_touch(void)
{
int flg = PROJECT_KILL | PROJECT_HIDE;
return (project(0, 1, p_ptr->py, p_ptr->px, p_ptr->lev, GF_OLD_SLEEP, flg));
@@ -7078,7 +6967,7 @@ void call_chaos(void)
{
int Chaos_type, dummy, dir;
int plev = p_ptr->lev;
- bool line_chaos = FALSE;
+ bool_ line_chaos = FALSE;
int hurt_types[30] =
{
@@ -7095,11 +6984,6 @@ void call_chaos(void)
Chaos_type = hurt_types[randint(30) - 1];
if (randint(4) == 1) line_chaos = TRUE;
-#if 0
- /* Probably a meaningless line, a remnant from earlier code */
- while (Chaos_type > GF_GRAVITY && Chaos_type < GF_ROCKET);
-#endif
-
if (randint(6) == 1)
{
for (dummy = 1; dummy < 10; dummy++)
@@ -7136,7 +7020,7 @@ void call_chaos(void)
void activate_ty_curse(void)
{
int i = 0;
- bool stop_ty = FALSE;
+ bool_ stop_ty = FALSE;
do
{
@@ -7215,7 +7099,7 @@ case 21: case 22: case 23:
void activate_dg_curse(void)
{
int i = 0;
- bool stop_dg = FALSE;
+ bool_ stop_dg = FALSE;
do
{
@@ -7457,18 +7341,8 @@ void bless_weapon(void)
s = "You have weapon to bless.";
if (!get_item(&item, q, s, (USE_EQUIP | USE_INVEN | USE_FLOOR))) return;
- /* Get the item (in the pack) */
- if (item >= 0)
- {
- o_ptr = &p_ptr->inventory[item];
- }
-
- /* Get the item (on the floor) */
- else
- {
- o_ptr = &o_list[0 - item];
- }
-
+ /* Get the item */
+ o_ptr = get_object(item);
/* Description */
object_desc(o_name, o_ptr, FALSE, 0);
@@ -7533,7 +7407,7 @@ void bless_weapon(void)
}
else
{
- bool dis_happened = FALSE;
+ bool_ dis_happened = FALSE;
msg_print("The artifact resists your blessing!");
@@ -7584,10 +7458,10 @@ void bless_weapon(void)
/*
* Detect all "nonliving", "undead" or "demonic" monsters on current panel
*/
-bool detect_monsters_nonliving(int rad)
+bool_ detect_monsters_nonliving(int rad)
{
int i, y, x;
- bool flag = FALSE;
+ bool_ flag = FALSE;
/* Scan monsters */
for (i = 1; i < m_max; i++)
@@ -7649,7 +7523,7 @@ bool detect_monsters_nonliving(int rad)
/*
* Confuse monsters
*/
-bool confuse_monsters(int dam)
+bool_ confuse_monsters(int dam)
{
return (project_hack(GF_OLD_CONF, dam));
}
@@ -7658,7 +7532,7 @@ bool confuse_monsters(int dam)
/*
* Charm monsters
*/
-bool charm_monsters(int dam)
+bool_ charm_monsters(int dam)
{
return (project_hack(GF_CHARM, dam));
}
@@ -7667,7 +7541,7 @@ bool charm_monsters(int dam)
/*
* Charm animals
*/
-bool charm_animals(int dam)
+bool_ charm_animals(int dam)
{
return (project_hack(GF_CONTROL_ANIMAL, dam));
}
@@ -7675,7 +7549,7 @@ bool charm_animals(int dam)
/*
* Charm demons
*/
-bool charm_demons(int dam)
+bool_ charm_demons(int dam)
{
return (project_hack(GF_CONTROL_DEMON, dam));
}
@@ -7684,7 +7558,7 @@ bool charm_demons(int dam)
/*
* Stun monsters
*/
-bool stun_monsters(int dam)
+bool_ stun_monsters(int dam)
{
return (project_hack(GF_STUN, dam));
}
@@ -7693,7 +7567,7 @@ bool stun_monsters(int dam)
/*
* Stasis monsters
*/
-bool stasis_monsters(int dam)
+bool_ stasis_monsters(int dam)
{
return (project_hack(GF_STASIS, dam));
}
@@ -7702,7 +7576,7 @@ bool stasis_monsters(int dam)
/*
* Mindblast monsters
*/
-bool mindblast_monsters(int dam)
+bool_ mindblast_monsters(int dam)
{
return (project_hack(GF_PSI, dam));
}
@@ -7711,7 +7585,7 @@ bool mindblast_monsters(int dam)
/*
* Banish all monsters
*/
-bool banish_monsters(int dist)
+bool_ banish_monsters(int dist)
{
return (project_hack(GF_AWAY_ALL, dist));
}
@@ -7720,7 +7594,7 @@ bool banish_monsters(int dist)
/*
* Turn evil
*/
-bool turn_evil(int dam)
+bool_ turn_evil(int dam)
{
return (project_hack(GF_TURN_EVIL, dam));
}
@@ -7729,7 +7603,7 @@ bool turn_evil(int dam)
/*
* Turn everyone
*/
-bool turn_monsters(int dam)
+bool_ turn_monsters(int dam)
{
return (project_hack(GF_TURN_ALL, dam));
}
@@ -7738,33 +7612,33 @@ bool turn_monsters(int dam)
/*
* Death-ray all monsters (note: OBSCENELY powerful)
*/
-bool deathray_monsters(void)
+bool_ deathray_monsters(void)
{
return (project_hack(GF_DEATH_RAY, p_ptr->lev));
}
-bool charm_monster(int dir, int plev)
+bool_ charm_monster(int dir, int plev)
{
int flg = PROJECT_STOP | PROJECT_KILL;
return (project_hook(GF_CHARM, dir, plev, flg));
}
-bool star_charm_monster(int dir, int plev)
+bool_ star_charm_monster(int dir, int plev)
{
int flg = PROJECT_STOP | PROJECT_KILL;
return (project_hook(GF_STAR_CHARM, dir, plev, flg));
}
-bool control_one_undead(int dir, int plev)
+bool_ control_one_undead(int dir, int plev)
{
int flg = PROJECT_STOP | PROJECT_KILL;
return (project_hook(GF_CONTROL_UNDEAD, dir, plev, flg));
}
-bool charm_animal(int dir, int plev)
+bool_ charm_animal(int dir, int plev)
{
int flg = PROJECT_STOP | PROJECT_KILL;
return (project_hook(GF_CONTROL_ANIMAL, dir, plev, flg));
@@ -7785,13 +7659,7 @@ void change_wild_mode(void)
p_ptr->wild_mode = !p_ptr->wild_mode;
- if (autosave_l)
- {
- is_autosave = TRUE;
- msg_print("Autosaving the game...");
- do_cmd_save_game();
- is_autosave = FALSE;
- }
+ autosave_checkpoint();
/* Leaving */
p_ptr->leaving = TRUE;
@@ -7802,20 +7670,14 @@ void alter_reality(void)
{
msg_print("The world changes!");
- if (autosave_l)
- {
- is_autosave = TRUE;
- msg_print("Autosaving the game...");
- do_cmd_save_game();
- is_autosave = FALSE;
- }
+ autosave_checkpoint();
/* Leaving */
p_ptr->leaving = TRUE;
}
/* Heal insanity. */
-bool heal_insanity(int val)
+bool_ heal_insanity(int val)
{
if (p_ptr->csane < p_ptr->msane)
{
@@ -7857,11 +7719,11 @@ bool heal_insanity(int val)
* Send the player shooting through walls in the given direction until
* they reach a non-wall space, or a monster, or a permanent wall.
*/
-bool passwall(int dir, bool safe)
+bool_ passwall(int dir, bool_ safe)
{
int x = p_ptr->px, y = p_ptr->py, ox = p_ptr->px, oy = p_ptr->py, lx = p_ptr->px, ly = p_ptr->py;
cave_type *c_ptr;
- bool ok = FALSE;
+ bool_ ok = FALSE;
if (p_ptr->wild_mode) return FALSE;
if (p_ptr->inside_quest) return FALSE;
@@ -7951,7 +7813,7 @@ bool passwall(int dir, bool safe)
/*
* Print a batch of dungeons.
*/
-static void print_dungeon_batch(int *p, int start, int max, bool mode)
+static void print_dungeon_batch(int *p, int start, int max, bool_ mode)
{
char buf[80];
int i, j;
@@ -7989,7 +7851,7 @@ int reset_recall_aux()
int *p;
int max = 0, i, start = 0;
int ret;
- bool mode = FALSE;
+ bool_ mode = FALSE;
C_MAKE(p, max_d_idx, int);
@@ -8113,7 +7975,7 @@ int reset_recall_aux()
return ret;
}
-bool reset_recall(bool no_trepas_max_depth)
+bool_ reset_recall(bool_ no_trepas_max_depth)
{
int dun, depth, max;
diff --git a/src/squeltch.c b/src/squeltch.c
index 72a84f45..603eaa0e 100644
--- a/src/squeltch.c
+++ b/src/squeltch.c
@@ -73,7 +73,7 @@ void squeltch_inventory(void)
int oldtop;
int i;
int num_iter = 0;
- bool found = TRUE;
+ bool_ found = TRUE;
if (!automatizer_enabled) return;
@@ -507,11 +507,11 @@ void do_cmd_automatizer()
}
/* Add a new rule in an easy way */
-bool automatizer_create = FALSE;
-void automatizer_add_rule(object_type *o_ptr, bool destroy)
+bool_ automatizer_create = FALSE;
+void automatizer_add_rule(object_type *o_ptr, bool_ destroy)
{
char ch;
- bool do_status = FALSE;
+ bool_ do_status = FALSE;
cptr type = "destroy";
if (!destroy)
diff --git a/src/status.c b/src/status.c
index 37b683c5..967a8323 100644
--- a/src/status.c
+++ b/src/status.c
@@ -95,7 +95,7 @@ void status_move(void)
Term_fresh();
while (1)
{
- bool loop_exit = FALSE;
+ bool_ loop_exit = FALSE;
char c;
c = inkey();
switch (c)
@@ -146,7 +146,7 @@ void status_sight(void)
Term_fresh();
while (1)
{
- bool loop_exit = FALSE;
+ bool_ loop_exit = FALSE;
char c;
c = inkey();
switch (c)
@@ -198,7 +198,7 @@ void status_item(void)
Term_fresh();
while (1)
{
- bool loop_exit = FALSE;
+ bool_ loop_exit = FALSE;
char c;
c = inkey();
switch (c)
@@ -257,7 +257,7 @@ void status_combat(void)
Term_fresh();
while (1)
{
- bool loop_exit = FALSE;
+ bool_ loop_exit = FALSE;
char c;
c = inkey();
switch (c)
@@ -304,7 +304,7 @@ void status_curses(void)
Term_fresh();
while (1)
{
- bool loop_exit = FALSE;
+ bool_ loop_exit = FALSE;
char c;
c = inkey();
@@ -355,7 +355,7 @@ void status_res(void)
Term_fresh();
while (1)
{
- bool loop_exit = FALSE;
+ bool_ loop_exit = FALSE;
char c;
c = inkey();
diff --git a/src/store.c b/src/store.c
index 2ac73753..78120846 100644
--- a/src/store.c
+++ b/src/store.c
@@ -362,7 +362,7 @@ static owner_type *ot_ptr = NULL;
* to adjust (by 200) to extract a usable multiplier. Note that the
* "greed" value is always something (?).
*/
-static s32b price_item(object_type *o_ptr, int greed, bool flip)
+static s32b price_item(object_type *o_ptr, int greed, bool_ flip)
{
int factor;
int adjust;
@@ -392,11 +392,6 @@ static s32b price_item(object_type *o_ptr, int greed, bool flip)
/* Add in the charisma factor */
factor += adj_chr_gold[p_ptr->stat_ind[A_CHR]];
- /* Hack - merchants have better prices */
-#if 0 /* DGDGDGDG -- use a skill */
- if (cp_ptr->magic_key == MKEY_TELEKINESIS)
- factor -= p_ptr->lev / 2;
-#endif
/* Shop is buying */
if (flip)
{
@@ -597,7 +592,7 @@ static void mass_produce(object_type *o_ptr)
*
* See "object_similar()" for the same function for the "player"
*/
-static bool store_object_similar(object_type *o_ptr, object_type *j_ptr)
+static bool_ store_object_similar(object_type *o_ptr, object_type *j_ptr)
{
/* Hack -- Identical items cannot be stacked */
if (o_ptr == j_ptr) return (0);
@@ -688,7 +683,7 @@ static void store_object_absorb(object_type *o_ptr, object_type *j_ptr)
* Note that the shop, just like a player, will not accept things
* it cannot hold. Before, one could "nuke" potions this way.
*/
-static bool store_check_num(object_type *o_ptr)
+static bool_ store_check_num(object_type *o_ptr)
{
int i;
object_type *j_ptr;
@@ -730,7 +725,7 @@ static bool store_check_num(object_type *o_ptr)
}
-bool is_blessed(object_type *o_ptr)
+bool_ is_blessed(object_type *o_ptr)
{
u32b f1, f2, f3, f4, f5, esp;
object_flags_known(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp);
@@ -745,7 +740,7 @@ bool is_blessed(object_type *o_ptr)
*
* Note that a shop-keeper must refuse to buy "worthless" items
*/
-static bool store_will_buy(object_type *o_ptr)
+static bool_ store_will_buy(object_type *o_ptr)
{
/* Hack -- The Home is simple */
if (cur_store_num == 7) return (TRUE);
@@ -1026,7 +1021,7 @@ static void store_item_optimize(int item)
* Crap is defined as any item that is "available" elsewhere
* Based on a suggestion by "Lee Vogt" <lvogt@cig.mcel.mot.com>
*/
-static bool black_market_crap(object_type *o_ptr)
+static bool_ black_market_crap(object_type *o_ptr)
{
int i, j;
@@ -1116,7 +1111,7 @@ static int store_tval = 0, store_level = 0;
/*
* Hack -- determine if a template is "good"
*/
-static bool kind_is_storeok(int k_idx)
+static bool_ kind_is_storeok(int k_idx)
{
object_kind *k_ptr = &k_info[k_idx];
@@ -1150,7 +1145,7 @@ static void store_create(void)
object_type forge;
object_type *q_ptr = NULL;
- bool obj_all_done = FALSE;
+ bool_ obj_all_done = FALSE;
/* Paranoia -- no room left */
@@ -1336,7 +1331,7 @@ static void store_create(void)
/*
* Eliminate need to bargain if player has haggled well in the past
*/
-static bool noneedtobargain(s32b minprice)
+static bool_ noneedtobargain(s32b minprice)
{
s32b good = st_ptr->good_buy;
s32b bad = st_ptr->bad_buy;
@@ -1594,13 +1589,7 @@ void display_store(void)
/* The "Home" is special */
if (cur_store_num == 7)
{
- /* Put the owner name -- mega hack */
-#if 0 /* DGDGDGDG -- use a skill */
- if ((cp_ptr->magic_key == MKEY_TELEKINESIS) &&
- (p_ptr->town_num == TOWN_RANDOM)) put_str("Hole Contents", 3, 30);
- else
-#endif
- put_str("Your Home", 3, 30);
+ put_str("Your Home", 3, 30);
/* Label the item descriptions */
put_str("Item Description", 5, 3);
@@ -1675,8 +1664,6 @@ static int get_stock(int *com_val, cptr pmt, int i, int j)
char out_val[160];
-#ifdef ALLOW_REPEAT /* TNB */
-
/* Get the item index */
if (repeat_pull(com_val))
{
@@ -1689,8 +1676,6 @@ static int get_stock(int *com_val, cptr pmt, int i, int j)
}
}
-#endif /* ALLOW_REPEAT -- TNB */
-
/* Paranoia XXX XXX XXX */
msg_print(NULL);
@@ -1730,12 +1715,8 @@ static int get_stock(int *com_val, cptr pmt, int i, int j)
/* Cancel */
if (command == ESCAPE) return (FALSE);
-#ifdef ALLOW_REPEAT /* TNB */
-
repeat_push(*com_val);
-#endif /* ALLOW_REPEAT -- TNB */
-
/* Success */
return (TRUE);
}
@@ -1801,7 +1782,7 @@ static int haggle_insults(void)
/*
* Mega-Hack -- Enable "increments"
*/
-static bool allow_inc = FALSE;
+static bool_ allow_inc = FALSE;
/*
* Mega-Hack -- Last "increment" during haggling
@@ -1930,7 +1911,7 @@ static int get_haggle(cptr pmt, s32b *poffer, s32b price, int final)
*
* Return TRUE if offer is NOT okay
*/
-static bool receive_offer(cptr pmt, s32b *poffer,
+static bool_ receive_offer(cptr pmt, s32b *poffer,
s32b last_offer, int factor,
s32b price, int final)
{
@@ -1960,7 +1941,7 @@ static bool receive_offer(cptr pmt, s32b *poffer,
*
* Return TRUE if purchase is NOT successful
*/
-static bool purchase_haggle(object_type *o_ptr, s32b *price)
+static bool_ purchase_haggle(object_type *o_ptr, s32b *price)
{
s32b cur_ask, final_ask;
s32b last_offer, offer;
@@ -1969,7 +1950,7 @@ static bool purchase_haggle(object_type *o_ptr, s32b *price)
int flag, loop_flag, noneed;
int annoyed = 0, final = FALSE;
- bool cancel = FALSE;
+ bool_ cancel = FALSE;
cptr pmt = "Asking";
@@ -2140,7 +2121,7 @@ static bool purchase_haggle(object_type *o_ptr, s32b *price)
*
* Return TRUE if purchase is NOT successful
*/
-static bool sell_haggle(object_type *o_ptr, s32b *price)
+static bool_ sell_haggle(object_type *o_ptr, s32b *price)
{
s32b purse, cur_ask, final_ask;
s32b last_offer = 0, offer = 0;
@@ -2150,7 +2131,7 @@ static bool sell_haggle(object_type *o_ptr, s32b *price)
int flag, loop_flag, noneed;
int annoyed = 0, final = FALSE;
- bool cancel = FALSE;
+ bool_ cancel = FALSE;
cptr pmt = "Offer";
@@ -2334,7 +2315,7 @@ static bool sell_haggle(object_type *o_ptr, s32b *price)
/*
* Will the owner retire?
*/
-static bool retire_owner_p(void)
+static bool_ retire_owner_p(void)
{
store_info_type *sti_ptr = &st_info[town_info[p_ptr->town_num].store[cur_store_num].st_idx];
@@ -2962,7 +2943,7 @@ void store_sell(void)
u32b f1, f2, f3, f4, f5, esp;
- bool museum = (st_info[st_ptr->st_idx].flags1 & SF1_MUSEUM) ? TRUE : FALSE;
+ bool_ museum = (st_info[st_ptr->st_idx].flags1 & SF1_MUSEUM) ? TRUE : FALSE;
/* Prepare a prompt */
if (cur_store_num == 7) q = "Drop which item? ";
@@ -2987,18 +2968,8 @@ void store_sell(void)
}
if (!get_item(&item, q, s, (USE_EQUIP | USE_INVEN))) return;
- /* Get the item (in the pack) */
- if (item >= 0)
- {
- o_ptr = &p_ptr->inventory[item];
- }
-
- /* Get the item (on the floor) */
- else
- {
- o_ptr = &o_list[0 - item];
- }
-
+ /* Get the item */
+ o_ptr = get_object(item);
object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp);
@@ -3027,17 +2998,6 @@ void store_sell(void)
}
- /* Hack -- Cannot put a portable hole into home */
-#if 0 /* DGDGDGDG -- use a skill */
- if ((cp_ptr->magic_key == MKEY_TELEKINESIS) &&
- (o_ptr->tval == TV_TOOL) && (o_ptr->sval == SV_PORTABLE_HOLE))
- {
- msg_print("Putting it into your home has extra-dimensional problems");
-
- return;
- }
-#endif
-
/* Assume one item */
amt = 1;
@@ -3173,9 +3133,7 @@ void store_sell(void)
}
/* Take the item from the player, describe the result */
- inven_item_increase(item, -amt);
- inven_item_describe(item);
- inven_item_optimize(item);
+ inc_stack_size(item, -amt);
/* Handle stuff */
handle_stuff();
@@ -3224,9 +3182,7 @@ void store_sell(void)
choice = 0;
/* Take it from the players inventory */
- inven_item_increase(item, -amt);
- inven_item_describe(item);
- inven_item_optimize(item);
+ inc_stack_size(item, -amt);
/* Handle stuff */
handle_stuff();
@@ -3260,9 +3216,7 @@ void store_sell(void)
}
/* Take it from the players inventory */
- inven_item_increase(item, -amt);
- inven_item_describe(item);
- inven_item_optimize(item);
+ inc_stack_size(item, -amt);
/* Handle stuff */
handle_stuff();
@@ -3367,7 +3321,7 @@ void store_examine(void)
/*
* Hack -- set this to leave the store
*/
-static bool leave_store = FALSE;
+static bool_ leave_store = FALSE;
/*
@@ -3378,20 +3332,16 @@ static bool leave_store = FALSE;
* must disable some commands which are allowed in the dungeon
* but not in the stores, to prevent chaos.
*/
-static bool store_process_command(void)
+static bool_ store_process_command(void)
{
- bool validcmd = FALSE;
+ bool_ validcmd = FALSE;
int i;
store_action_type *ba_ptr;
- bool recreate = FALSE;
-
-#ifdef ALLOW_REPEAT /* TNB */
+ bool_ recreate = FALSE;
/* Handle repeating the last command */
repeat_check();
-#endif /* ALLOW_REPEAT -- TNB */
-
for (i = 0; i < 6; i++)
{
ba_ptr = &ba_info[st_info[st_ptr->st_idx].actions[i]];
@@ -3723,7 +3673,7 @@ void do_cmd_store(void)
int maintain_num;
int tmp_chr;
int i;
- bool recreate = FALSE;
+ bool_ recreate = FALSE;
cave_type *c_ptr;
@@ -3911,9 +3861,7 @@ void do_cmd_store(void)
msg_format("You drop %s (%c).", o_name, index_to_label(item));
/* Remove it from the players inventory */
- inven_item_increase(item, -255);
- inven_item_describe(item);
- inven_item_optimize(item);
+ inc_stack_size(item, -255);
/* Handle stuff */
handle_stuff();
@@ -3957,9 +3905,6 @@ void do_cmd_store(void)
/* Hack -- Cancel automatic command */
command_new = 0;
- /* Hack -- Cancel "see" mode */
- command_see = FALSE;
-
/* Mega-Hack -- Clear the 'ignore-keymaps' list */
memset(request_command_ignore_keymaps, 0, 12);
@@ -4393,9 +4338,7 @@ void do_cmd_home_trump(void)
msg_format("You drop %s (%c).", o_name, index_to_label(item));
/* Remove it from the players inventory */
- inven_item_increase(item, -255);
- inven_item_describe(item);
- inven_item_optimize(item);
+ inc_stack_size(item, -255);
/* Handle stuff */
handle_stuff();
@@ -4427,9 +4370,6 @@ void do_cmd_home_trump(void)
/* Hack -- Cancel automatic command */
command_new = 0;
- /* Hack -- Cancel "see" mode */
- command_see = FALSE;
-
/* Mega-Hack -- Clear the 'ignore-keymaps' list */
memset(request_command_ignore_keymaps, 0, 12);
@@ -4487,14 +4427,6 @@ void store_request_item(void)
object_type forge, *q_ptr = &forge;
store_type *ost_ptr = st_ptr;
- /* Paranoia */
-#if 0 /* DGDGDGDG -- use a skill */
- if (cp_ptr->magic_key == MKEY_TELEKINESIS)
- {
- st_ptr = ost_ptr;
- return;
- }
-#endif
/* Get the Black Market */
st_ptr = &town_info[p_ptr->town_num].store[6];
diff --git a/src/tables.c b/src/tables.c
index 44973287..e976e234 100644
--- a/src/tables.c
+++ b/src/tables.c
@@ -1301,7 +1301,7 @@ cptr window_flag_desc[32] =
NULL,
"Display character",
"Show visible monsters",
- "Display IRC messages",
+ NULL,
"Display messages",
"Display overhead view",
"Display monster recall",
@@ -1466,15 +1466,11 @@ option_type option_info[] =
{ &disturb_pets, FALSE, 2, 17,
"disturb_pets", "Disturb when visible pets move" },
-#ifdef ALLOW_EASY_OPEN
{ &easy_open, TRUE, 2, 18,
"easy_open", "Automatically open doors" },
-#endif /* ALLOW_EASY_OPEN */
-#ifdef ALLOW_EASY_DISARM
{ &easy_disarm, TRUE, 2, 19,
"easy_disarm", "Automatically disarm traps" },
-#endif /* ALLOW_EASY_DISARM */
{ &easy_tunnel, FALSE, 2, 20,
"easy_tunnel", "Automatically tunnel walls" },
@@ -1617,11 +1613,6 @@ option_type option_info[] =
/*** Birth Options ***/
-#if 0 /* XXX free -- no more used */
- { &vanilla_town, FALSE, 6, 0,
- "vanilla_town", "Use 'vanilla' town without quests and wilderness" },
-#endif
-
{ &maximize, TRUE, 6, 1,
"maximize", "Maximise stats" },
@@ -1633,10 +1624,7 @@ option_type option_info[] =
{ &point_based, FALSE, 6, 17,
"point_based", "Generate character using a point system" },
-#if 0
- { &special_lvls, TRUE, 6, 4,
- "special_lvls", "Allow the use of special, unique, levels" },
-#endif
+
{ &ironman_rooms, FALSE, 6, 6,
"ironman_rooms", "Always generate very unusual rooms" },
@@ -1646,10 +1634,6 @@ option_type option_info[] =
{ &auto_notes, TRUE, 6, 8,
"auto_notes", "Automatically note important events" },
-#if 0 /* when Ill get some ideas */
- { &rand_birth, FALSE, 6, 9,
- "rand_birth", "Random present at birth" },
-#endif
{ &fast_autoroller, FALSE, 6, 10,
"fast_autoroller", "Fast autoroller(NOT on multiuser systems)" },
@@ -2923,9 +2907,6 @@ activation activation_info[MAX_T_ACT] =
{ "corruption", 100, ACT_MUT },
{ "cure insanity", 2000, ACT_CURE_INSANITY },
{ "light absortion", 800, ACT_LIGHT_ABSORBTION },
-#if 0 /* No more for the time being, ehehhe evil I am :> */
- { "cure corruption", 2000, ACT_CURE_MUT },
-#endif
};
/*
@@ -3620,6 +3601,7 @@ quest_type quest_init_tome[MAX_Q_IDX_INIT] =
HOOK_TYPE_C,
quest_null_hook,
{0, 0},
+ NULL,
},
{
FALSE,
@@ -3644,6 +3626,7 @@ quest_type quest_init_tome[MAX_Q_IDX_INIT] =
HOOK_TYPE_C,
quest_necro_init_hook,
{0, 0},
+ NULL,
},
{
FALSE,
@@ -3668,6 +3651,7 @@ quest_type quest_init_tome[MAX_Q_IDX_INIT] =
HOOK_TYPE_C,
quest_sauron_init_hook,
{0, 0},
+ NULL,
},
{
FALSE,
@@ -3692,6 +3676,7 @@ quest_type quest_init_tome[MAX_Q_IDX_INIT] =
HOOK_TYPE_C,
quest_morgoth_init_hook,
{0, 0},
+ NULL,
},
/* Bree plot */
@@ -3718,6 +3703,7 @@ quest_type quest_init_tome[MAX_Q_IDX_INIT] =
HOOK_TYPE_C,
quest_thieves_init_hook,
{0, 0},
+ NULL,
},
{
@@ -3743,6 +3729,7 @@ quest_type quest_init_tome[MAX_Q_IDX_INIT] =
HOOK_TYPE_C,
quest_random_init_hook,
{0, 0},
+ quest_random_describe,
},
{
@@ -3768,6 +3755,7 @@ quest_type quest_init_tome[MAX_Q_IDX_INIT] =
HOOK_TYPE_C,
quest_hobbit_init_hook,
{0, 0},
+ NULL,
},
{
@@ -3793,6 +3781,7 @@ quest_type quest_init_tome[MAX_Q_IDX_INIT] =
HOOK_TYPE_C,
quest_nazgul_init_hook,
{0, 0},
+ NULL,
},
{
@@ -3818,6 +3807,7 @@ quest_type quest_init_tome[MAX_Q_IDX_INIT] =
HOOK_TYPE_C,
quest_troll_init_hook,
{FALSE, 0},
+ NULL,
},
{
@@ -3843,6 +3833,7 @@ quest_type quest_init_tome[MAX_Q_IDX_INIT] =
HOOK_TYPE_C,
quest_wight_init_hook,
{FALSE, 0},
+ NULL,
},
/* Lorien plot */
@@ -3869,6 +3860,7 @@ quest_type quest_init_tome[MAX_Q_IDX_INIT] =
HOOK_TYPE_C,
quest_spider_init_hook,
{0, 0},
+ NULL,
},
{
FALSE,
@@ -3893,6 +3885,7 @@ quest_type quest_init_tome[MAX_Q_IDX_INIT] =
HOOK_TYPE_C,
quest_poison_init_hook,
{0, 0},
+ NULL,
},
/* Other quests */
{
@@ -3918,6 +3911,7 @@ quest_type quest_init_tome[MAX_Q_IDX_INIT] =
HOOK_TYPE_C,
quest_narsil_init_hook,
{0, 0},
+ NULL,
},
/* Gondolin plot */
{
@@ -3943,6 +3937,7 @@ quest_type quest_init_tome[MAX_Q_IDX_INIT] =
HOOK_TYPE_C,
quest_eol_init_hook,
{0, 0},
+ NULL,
},
{
FALSE,
@@ -3967,6 +3962,7 @@ quest_type quest_init_tome[MAX_Q_IDX_INIT] =
HOOK_TYPE_C,
quest_nirnaeth_init_hook,
{0, 0},
+ NULL,
},
{
FALSE,
@@ -3991,6 +3987,7 @@ quest_type quest_init_tome[MAX_Q_IDX_INIT] =
HOOK_TYPE_C,
quest_invasion_init_hook,
{0, 0},
+ NULL,
},
/* Minas Anor Plot*/
{
@@ -4016,6 +4013,7 @@ quest_type quest_init_tome[MAX_Q_IDX_INIT] =
HOOK_TYPE_C,
quest_between_init_hook,
{0, 0},
+ NULL,
},
{
FALSE,
@@ -4040,6 +4038,7 @@ quest_type quest_init_tome[MAX_Q_IDX_INIT] =
HOOK_TYPE_C,
quest_one_init_hook,
{0, 0},
+ NULL,
},
{
@@ -4065,6 +4064,7 @@ quest_type quest_init_tome[MAX_Q_IDX_INIT] =
HOOK_TYPE_C,
quest_shroom_init_hook,
{0, 0},
+ NULL,
},
{
@@ -4090,6 +4090,7 @@ quest_type quest_init_tome[MAX_Q_IDX_INIT] =
HOOK_TYPE_C,
quest_thrain_init_hook,
{0, 0},
+ NULL,
},
/* The 2 ultra endings go here */
@@ -4116,6 +4117,7 @@ quest_type quest_init_tome[MAX_Q_IDX_INIT] =
HOOK_TYPE_C,
quest_ultra_good_init_hook,
{0, 0},
+ NULL,
},
{
FALSE,
@@ -4140,6 +4142,7 @@ quest_type quest_init_tome[MAX_Q_IDX_INIT] =
HOOK_TYPE_C,
quest_ultra_evil_init_hook,
{0, 0},
+ NULL,
},
/* More Lorien */
{
@@ -4165,6 +4168,7 @@ quest_type quest_init_tome[MAX_Q_IDX_INIT] =
HOOK_TYPE_C,
quest_wolves_init_hook,
{0, 0},
+ NULL,
},
/* More Gondolin */
{
@@ -4190,6 +4194,7 @@ quest_type quest_init_tome[MAX_Q_IDX_INIT] =
HOOK_TYPE_C,
quest_dragons_init_hook,
{0, 0},
+ NULL,
},
/* More Minas Anor */
{
@@ -4215,6 +4220,7 @@ quest_type quest_init_tome[MAX_Q_IDX_INIT] =
HOOK_TYPE_C,
quest_haunted_init_hook,
{0, 0},
+ NULL,
},
/* Khazad-Dum Plot*/
{
@@ -4240,6 +4246,7 @@ quest_type quest_init_tome[MAX_Q_IDX_INIT] =
HOOK_TYPE_C,
quest_evil_init_hook,
{0, 0},
+ NULL,
},
};
@@ -4608,7 +4615,7 @@ tval_desc tval_descs[] =
/*
* List of the between exits
* s16b corresp; Corresponding between gate
- * bool dungeon; Do we exit in a dungeon or in the wild ?
+ * bool_ dungeon; Do we exit in a dungeon or in the wild ?
*
* s16b wild_x, wild_y; Wilderness spot to land onto
* s16b p_ptr->px, p_ptr->py; Location of the map
diff --git a/src/traps.c b/src/traps.c
index 181c0bbe..1c8e36c9 100644
--- a/src/traps.c
+++ b/src/traps.c
@@ -13,20 +13,18 @@
#include "angband.h"
-bool do_player_trap_call_out(void)
+bool_ do_player_trap_call_out(void)
{
s16b i, sn, cx, cy;
s16b h_index = 0;
s16b h_level = 0;
monster_type *m_ptr;
- monster_race *r_ptr;
char m_name[80];
- bool ident = FALSE;
+ bool_ ident = FALSE;
for (i = 1; i < m_max; i++)
{
m_ptr = &m_list[i];
- r_ptr = race_inf(m_ptr);
/* Paranoia -- Skip dead monsters */
if (!m_ptr->r_idx) continue;
@@ -73,9 +71,9 @@ bool do_player_trap_call_out(void)
return (ident);
}
-static bool do_trap_teleport_away(object_type *i_ptr, s16b y, s16b x)
+static bool_ do_trap_teleport_away(object_type *i_ptr, s16b y, s16b x)
{
- bool ident = FALSE;
+ bool_ ident = FALSE;
char o_name[80];
s16b o_idx = 0;
@@ -135,14 +133,14 @@ static bool do_trap_teleport_away(object_type *i_ptr, s16b y, s16b x)
/*
* this handles a trap that places walls around the player
*/
-static bool player_handle_trap_of_walls(void)
+static bool_ player_handle_trap_of_walls(void)
{
- bool ident;
+ bool_ ident;
s16b dx, dy, cx, cy;
s16b sx = 0, sy = 0, sn, i;
cave_type *cv_ptr;
- bool map[5][5] =
+ bool_ map[5][5] =
{
{FALSE, FALSE, FALSE, FALSE, FALSE},
{FALSE, FALSE, FALSE, FALSE, FALSE},
@@ -321,7 +319,7 @@ static bool player_handle_trap_of_walls(void)
/* Destroy location (if valid) */
if ((cx < cur_wid) && (cy < cur_hgt) && cave_valid_bold(cy, cx))
{
- bool floor = (f_info[cave[cy][cx].feat].flags1 & FF1_FLOOR);
+ bool_ floor = (f_info[cave[cy][cx].feat].flags1 & FF1_FLOOR);
/* Delete any object that is still there */
delete_object(cy, cx);
@@ -375,7 +373,7 @@ static bool player_handle_trap_of_walls(void)
*
* return value = ident (always TRUE)
*/
-static bool player_handle_missile_trap(s16b num, s16b tval, s16b sval, s16b dd, s16b ds,
+static bool_ player_handle_missile_trap(s16b num, s16b tval, s16b sval, s16b dd, s16b ds,
s16b pdam, cptr name)
{
object_type *o_ptr, forge;
@@ -414,10 +412,10 @@ static bool player_handle_missile_trap(s16b num, s16b tval, s16b sval, s16b dd,
/*
* this function handles a "breath" type trap - acid bolt, lightning balls etc.
*/
-static bool player_handle_breath_trap(s16b rad, s16b type, u16b trap)
+static bool_ player_handle_breath_trap(s16b rad, s16b type, u16b trap)
{
trap_type *t_ptr = &t_info[trap];
- bool ident;
+ bool_ ident;
s16b my_dd, my_ds, dam;
my_dd = t_ptr->dd;
@@ -451,11 +449,11 @@ static void trap_hit(s16b trap)
/*
* this function activates one trap type, and returns
- * a bool indicating if this trap is now identified
+ * a bool_ indicating if this trap is now identified
*/
-bool player_activate_trap_type(s16b y, s16b x, object_type *i_ptr, s16b item)
+bool_ player_activate_trap_type(s16b y, s16b x, object_type *i_ptr, s16b item)
{
- bool ident = FALSE;
+ bool_ ident = FALSE;
s16b trap;
s16b k, l;
@@ -805,8 +803,8 @@ bool player_activate_trap_type(s16b y, s16b x, object_type *i_ptr, s16b item)
/* Drop it somewhere */
do_trap_teleport_away(q_ptr, y, x);
- inven_item_increase(i, -1);
- inven_item_optimize(i);
+ inc_stack_size_ex(i, -1, OPTIMIZE, NO_DESCRIBE);
+
ident = TRUE;
}
break;
@@ -850,12 +848,9 @@ bool player_activate_trap_type(s16b y, s16b x, object_type *i_ptr, s16b item)
}
/* Still alive and autosave enabled */
- if (autosave_l && (p_ptr->chp >= 0))
+ if (p_ptr->chp >= 0)
{
- is_autosave = TRUE;
- msg_print("Autosaving the game...");
- do_cmd_save_game();
- is_autosave = FALSE;
+ autosave_checkpoint();
}
if (dungeon_flags1 & DF1_TOWER) dun_level--;
@@ -934,10 +929,11 @@ bool player_activate_trap_type(s16b y, s16b x, object_type *i_ptr, s16b item)
if ((j_ptr->tval == TV_SCROLL) &&
(j_ptr->sval == SV_SCROLL_WORD_OF_RECALL))
{
- inven_item_increase(j, -j_ptr->number);
- inven_item_optimize(j);
+ inc_stack_size_ex(j, -j_ptr->number, OPTIMIZE, NO_DESCRIBE);
+
combine_pack();
reorder_pack();
+
if (!ident)
{
msg_print("A small fire works its way through your backpack. "
@@ -1121,7 +1117,7 @@ bool player_activate_trap_type(s16b y, s16b x, object_type *i_ptr, s16b item)
s16b tmps, tmpx;
s16b tmpspecial, tmpspecial2;
u32b tmpf;
- bool seen = FALSE;
+ bool_ seen = FALSE;
s16b index_x[20], index_y[20]; /* 20 stairs per level is enough? */
cave_type *cv_ptr;
@@ -1299,7 +1295,7 @@ bool player_activate_trap_type(s16b y, s16b x, object_type *i_ptr, s16b item)
case TRAP_OF_SCATTER_ITEMS:
{
s16b i, j;
- bool message = FALSE;
+ bool_ message = FALSE;
for (i = 0; i < INVEN_PACK; i++)
{
@@ -1319,8 +1315,8 @@ bool player_activate_trap_type(s16b y, s16b x, object_type *i_ptr, s16b item)
if (!cave_floor_bold(cy, cx)) continue;
object_copy(j_ptr, &p_ptr->inventory[i]);
- inven_item_increase(i, -999);
- inven_item_optimize(i);
+
+ inc_stack_size_ex(i, -999, OPTIMIZE, NO_DESCRIBE);
p_ptr->notice |= (PN_COMBINE | PN_REORDER);
@@ -1559,7 +1555,7 @@ bool player_activate_trap_type(s16b y, s16b x, object_type *i_ptr, s16b item)
case TRAP_OF_DROP_ITEMS:
{
s16b i;
- bool message = FALSE;
+ bool_ message = FALSE;
for (i = 0; i < INVEN_PACK; i++)
{
@@ -1573,8 +1569,9 @@ bool player_activate_trap_type(s16b y, s16b x, object_type *i_ptr, s16b item)
/* drop carefully */
drop_near(&tmp_obj, 0, y, x);
- inven_item_increase(i, -999);
- inven_item_optimize(i);
+
+ inc_stack_size_ex(i, -999, OPTIMIZE, NO_DESCRIBE);
+
p_ptr->notice |= (PN_COMBINE | PN_REORDER);
if (!message)
@@ -1594,7 +1591,7 @@ bool player_activate_trap_type(s16b y, s16b x, object_type *i_ptr, s16b item)
case TRAP_OF_DROP_ALL_ITEMS:
{
s16b i;
- bool message = FALSE;
+ bool_ message = FALSE;
for (i = 0; i < INVEN_PACK; i++)
{
@@ -1608,8 +1605,9 @@ bool player_activate_trap_type(s16b y, s16b x, object_type *i_ptr, s16b item)
/* drop carefully */
drop_near(&tmp_obj, 0, y, x);
- inven_item_increase(i, -999);
- inven_item_optimize(i);
+
+ inc_stack_size_ex(i, -999, OPTIMIZE, NO_DESCRIBE);
+
p_ptr->notice |= (PN_COMBINE | PN_REORDER);
if (!message)
@@ -1629,7 +1627,7 @@ bool player_activate_trap_type(s16b y, s16b x, object_type *i_ptr, s16b item)
case TRAP_OF_DROP_EVERYTHING:
{
s16b i;
- bool message = FALSE;
+ bool_ message = FALSE;
for (i = 0; i < INVEN_TOTAL; i++)
{
@@ -1642,8 +1640,9 @@ bool player_activate_trap_type(s16b y, s16b x, object_type *i_ptr, s16b item)
/* drop carefully */
drop_near(&tmp_obj, 0, y, x);
- inven_item_increase(i, -999);
- inven_item_optimize(i);
+
+ inc_stack_size_ex(i, -999, OPTIMIZE, NO_DESCRIBE);
+
p_ptr->notice |= (PN_COMBINE | PN_REORDER);
if (!message)
@@ -1966,7 +1965,7 @@ bool player_activate_trap_type(s16b y, s16b x, object_type *i_ptr, s16b item)
void player_activate_door_trap(s16b y, s16b x)
{
cave_type *c_ptr;
- bool ident = FALSE;
+ bool_ ident = FALSE;
c_ptr = &cave[y][x];
@@ -2123,7 +2122,7 @@ void wiz_place_trap(int y, int x, int idx)
/*
* Hook to determine if an object is a device
*/
-static bool item_tester_hook_device(object_type *o_ptr)
+static bool_ item_tester_hook_device(object_type *o_ptr)
{
if (((o_ptr->tval == TV_ROD_MAIN) && (o_ptr->pval != 0)) ||
(o_ptr->tval == TV_STAFF) ||
@@ -2136,7 +2135,7 @@ static bool item_tester_hook_device(object_type *o_ptr)
/*
* Hook to determine if an object is a potion
*/
-static bool item_tester_hook_potion(object_type *o_ptr)
+static bool_ item_tester_hook_potion(object_type *o_ptr)
{
if ((o_ptr->tval == TV_POTION) ||
(o_ptr->tval == TV_POTION2)) return (TRUE);
@@ -2279,10 +2278,8 @@ void do_cmd_set_trap(void)
cave[p_ptr->py][p_ptr->px].special2 = floor_carry(p_ptr->py, p_ptr->px, i_ptr);
/* Modify, Describe, Optimize */
- inven_item_increase(item_kit, -1);
- inven_item_describe(item_kit);
- inven_item_increase(item_load, -num);
- inven_item_describe(item_load);
+ inc_stack_size_ex(item_kit, -1, NO_OPTIMIZE, DESCRIBE);
+ inc_stack_size_ex(item_load, -num, NO_OPTIMIZE, DESCRIBE);
for (i = 0; i < INVEN_WIELD; i++)
{
@@ -2302,7 +2299,7 @@ void do_cmd_set_trap(void)
*
* Return TRUE if the monster died
*/
-bool mon_hit_trap_aux_rod(int m_idx, object_type *o_ptr)
+bool_ mon_hit_trap_aux_rod(int m_idx, object_type *o_ptr)
{
int dam = 0, typ = 0;
int rad = 0;
@@ -2413,99 +2410,9 @@ bool mon_hit_trap_aux_rod(int m_idx, object_type *o_ptr)
*
* Return TRUE if the monster died
*/
-bool mon_hit_trap_aux_staff(int m_idx, object_type *o_ptr)
+bool_ mon_hit_trap_aux_staff(int m_idx, object_type *o_ptr)
{
- /* Monster pointer and position */
- monster_type *m_ptr = &m_list[m_idx];
- int y = m_ptr->fy;
- int x = m_ptr->fx;
-
- /* sval and base level of the staff */
- int sval = o_ptr->sval;
-
- /* Damage amount, type, and radius */
- int dam = 0, typ = 0;
- int rad = 0;
-
- /* Depend on staff type */
- switch (sval)
- {
-#if 0 /*must be tested*/
- case SV_STAFF_IDENTIFY:
- case SV_STAFF_MANA:
- case SV_STAFF_REMOVE_CURSES:
- case SV_STAFF_REVEAL_WAYS:
- case SV_STAFF_SENSE_MONSTER:
- case SV_STAFF_VISION:
- case SV_STAFF_DISARM:
- return (FALSE);
-
- case SV_STAFF_LIGHT:
- lite_room(y, x);
- typ = GF_LITE_WEAK;
- dam = damroll(2, 8);
- rad = 2;
- break;
-
- case SV_STAFF_SUMMON:
- for (k = 0; k < randint(4) ; k++)
- (void)summon_specific(y, x, dun_level, 0);
- return (FALSE);
-
- case SV_STAFF_TELEPORTATION:
- typ = GF_AWAY_ALL;
- dam = 100 + 2 * level;
- break;
-
- case SV_STAFF_HEALING:
- typ = GF_OLD_HEAL;
- dam = m_ptr->maxhp * (150 + 7 * level) / 1000;
- break;
-
- case SV_STAFF_SHAKE:
- earthquake(y, x, 4 + level / 5); /* was 10 */
- return (FALSE);
-
- case SV_STAFF_RECOVERY:
- m_ptr->bleeding = 0;
- m_ptr->poisoned = 0;
- return (FALSE);
-
- case SV_STAFF_GENOCIDE:
- {
- monster_race *r_ptr = &r_info[m_ptr->r_idx];
- genocide_aux(FALSE, r_ptr->d_char);
- /* although there's no point in a multiple genocide trap... */
- return (cave[y][x].m_idx == 0 ? TRUE : FALSE);
- }
-
- case SV_STAFF_SENSE_HIDDEN:
- m_ptr->smart |= SM_NOTE_TRAP;
- return (FALSE);
-
- case SV_STAFF_WISH:
- acquirement(y, x, randint(2) + 1, TRUE, FALSE);
- return (FALSE);
-
- case SV_STAFF_MITHRANDIR:
- typ = GF_HOLY_FIRE;
- dam = 50 + 6 * level;
- rad = 9; /* instead of LOS */
-
- /* How to implement these ? */
- case SV_STAFF_FIERY_SHIELD:
- case SV_STAFF_WINGS_WIND:
- case SV_STAFF_PROBABILITY_TRAVEL:
-
-#endif
-
- default:
- return (FALSE);
- }
-
- /* Actually hit the monster */
- (void) project( -2, rad, y, x, dam, typ, PROJECT_KILL | PROJECT_ITEM | PROJECT_JUMP);
- return (cave[y][x].m_idx == 0 ? TRUE : FALSE);
+ return (FALSE);
}
/*
@@ -2513,7 +2420,7 @@ bool mon_hit_trap_aux_staff(int m_idx, object_type *o_ptr)
*
* Return TRUE if the monster died
*/
-bool mon_hit_trap_aux_scroll(int m_idx, int sval)
+bool_ mon_hit_trap_aux_scroll(int m_idx, int sval)
{
monster_type *m_ptr = &m_list[m_idx];
int dam = 0, typ = 0;
@@ -2640,140 +2547,9 @@ bool mon_hit_trap_aux_scroll(int m_idx, int sval)
*
* Return TRUE if the monster died
*/
-bool mon_hit_trap_aux_wand(int m_idx, object_type *o_ptr)
+bool_ mon_hit_trap_aux_wand(int m_idx, object_type *o_ptr)
{
- /* Monster pointer and position */
- monster_type *m_ptr = &m_list[m_idx];
- int y = m_ptr->fy;
- int x = m_ptr->fx;
-
- /* sval and bonus level of the wand */
- int sval = o_ptr->sval;
-
- /* Damage amount, type, and radius */
- int dam = 0, typ = 0;
- int rad = 0;
-
- /* Depend on wand type */
- switch (sval)
- {
-
-#if 0 /* must be tested */
-
- case SV_WAND_MANATHRUST:
- typ = GF_MANA;
- dam = damroll(3 + level, 1 + 2 * level / 5 );
- break;
-
- case SV_WAND_FIREFLASH:
- typ = GF_FIRE;
- dam = 20 + level * 10;
- rad = 2 + level / 10;
- break;
-
- case SV_WAND_NOXIOUS_CLOUD:
- typ = GF_POIS;
- dam = 7 + 3 * level;
- rad = 3;
- break;
-
- case SV_WAND_THUNDERSTORM:
- typ = GF_ELEC; /* GF_LITE, GF_SOUND ??? */
- dam = damroll(5 + level / 5, 10 + level / 2);
- break;
-
- case SV_WAND_DIG:
- case SV_WAND_THRAIN:
- typ = GF_KILL_WALL;
- dam = 20 + randint(30);
- break;
-
- case SV_WAND_STRIKE:
- typ = GF_FORCE;
- dam = 50 + level;
- break;
-
- case SV_WAND_TELEPORT_AWAY:
- typ = GF_AWAY_ALL;
- dam = MAX_SIGHT * 5;
- break;
-
- case SV_WAND_SUMMON_ANIMAL:
- summon_specific(y, x, dun_level, SUMMON_ANIMAL); /* friendly ?*/
- return (FALSE);
-
- case SV_WAND_SLOW_MONSTER:
- typ = GF_OLD_SLOW;
- dam = 40 + 16 * level / 5;
- break;
-
- case SV_WAND_BANISHMENT:
- typ = GF_AWAY_ALL;
- dam = 40 + 16 * level / 5;
- rad = 9; /* instead of LOS */
- break;
-
- case SV_WAND_CHARM:
- typ = GF_CHARM;
- dam = 10 + 3 * level;
- break;
-
- case SV_WAND_CONFUSE:
- typ = GF_OLD_CONF;
- dam = 10 + 3 * level;
- break;
-
- case SV_WAND_HEAL_MONSTER:
- typ = GF_OLD_HEAL;
- dam = 20 + 38 * level / 5;
- break;
-
- case SV_WAND_SPEED:
- case SV_WAND_HASTE_MONSTER:
- typ = GF_OLD_SPEED;
- dam = damroll(5, 10);
- break;
-
- case SV_WAND_STONE_PRISON:
- wall_stone(y, x);
- return (FALSE);
-
- case SV_WAND_DISPERSE_MAGIC:
- m_ptr->confused = 0;
- m_ptr->mspeed = 0;
- return (FALSE);
-
- case SV_WAND_ICE_STORM:
- typ = GF_COLD;
- dam = 80 + 4 * level;
- rad = 1 + 3 * level / 50;
- break;
-
- case SV_WAND_TIDAL_WAVE:
- typ = GF_WAVE;
- dam = 40 + 4 * level;
- rad = 6 + level / 5;
- break;
-
- case SV_WAND_FIREWALL:
- typ = GF_FIRE;
- dam = 40 + 3 * level;
- rad = 1; /*instead of beam*/
-
- /* Not sure about these */
- case SV_WAND_MAGELOCK:
- case SV_WAND_DEMON_BLADE:
- case SV_WAND_POISON_BLOOD:
-
-#endif
-
- default:
- return (FALSE);
- }
-
- /* Actually hit the monster */
- (void) project( -2, rad, y, x, dam, typ, PROJECT_KILL | PROJECT_ITEM | PROJECT_JUMP);
- return (cave[y][x].m_idx == 0 ? TRUE : FALSE);
+ return (FALSE);
}
/*
@@ -2781,7 +2557,7 @@ bool mon_hit_trap_aux_wand(int m_idx, object_type *o_ptr)
*
* Return TRUE if the monster died
*/
-bool mon_hit_trap_aux_potion(int m_idx, object_type *o_ptr)
+bool_ mon_hit_trap_aux_potion(int m_idx, object_type *o_ptr)
{
monster_type *m_ptr = &m_list[m_idx];
int dam = 0, typ = 0;
@@ -2936,13 +2712,10 @@ bool mon_hit_trap_aux_potion(int m_idx, object_type *o_ptr)
* Monster hitting a monster trap -MWK-
* Returns True if the monster died, false otherwise
*/
-bool mon_hit_trap(int m_idx)
+bool_ mon_hit_trap(int m_idx)
{
monster_type *m_ptr = &m_list[m_idx];
monster_race *r_ptr = &r_info[m_ptr->r_idx];
-#if 0 /* DGDGDGDG */
- monster_lore *l_ptr = &l_list[m_ptr->r_idx];
-#endif
object_type *kit_o_ptr, *load_o_ptr, *j_ptr;
@@ -2958,11 +2731,11 @@ bool mon_hit_trap(int m_idx)
char m_name[80];
- bool notice = FALSE;
- bool disarm = FALSE;
- bool remove = FALSE;
- bool dead = FALSE;
- bool fear = FALSE;
+ bool_ notice = FALSE;
+ bool_ disarm = FALSE;
+ bool_ remove = FALSE;
+ bool_ dead = FALSE;
+ bool_ fear = FALSE;
s32b special = 0;
int dam, chance, shots;
@@ -2986,7 +2759,7 @@ bool mon_hit_trap(int m_idx)
/* Some traps are specialized to some creatures */
if (f2 & TRAP2_ONLY_MASK)
{
- bool affect = FALSE;
+ bool_ affect = FALSE;
if ((f2 & TRAP2_ONLY_DRAGON) && (r_ptr->flags3 & RF3_DRAGON)) affect = TRUE;
if ((f2 & TRAP2_ONLY_DEMON) && (r_ptr->flags3 & RF3_DEMON)) affect = TRUE;
if ((f2 & TRAP2_ONLY_UNDEAD) && (r_ptr->flags3 & RF3_UNDEAD)) affect = TRUE;
@@ -3013,10 +2786,6 @@ bool mon_hit_trap(int m_idx)
/* Smart monsters are better at detecting traps */
if (r_ptr->flags2 & RF2_SMART) smartness += 10;
- /* Some monsters are great at detecting traps */
-#if 0 /* DGDGDGDG */
- if (r_ptr->flags2 & RF2_NOTICE_TRAP) smartness += 20;
-#endif
/* Some monsters have already noticed one of out traps */
if (m_ptr->smart & SM_NOTE_TRAP) smartness += 20;
@@ -3032,10 +2801,6 @@ bool mon_hit_trap(int m_idx)
/* The next traps will be easier to spot! */
m_ptr->smart |= SM_NOTE_TRAP;
- /* Tell the player about it */
-#if 0 /* DGDGDGDG */
- if (m_ptr->ml) l_ptr->r_flags2 |= (RF2_NOTICE_TRAP & r_ptr->flags2);
-#endif
/* Get trap disarming difficulty */
difficulty = (kit_o_ptr->ac + kit_o_ptr->to_a);
@@ -3043,14 +2808,6 @@ bool mon_hit_trap(int m_idx)
/* Higher level monsters are better */
smartness = r_ptr->level / 5;
- /* Some monsters are great at disarming */
-#if 0 /* DGDGDGDG */
- if (r_ptr->flags2 & RF2_DISARM_TRAP) smartness += 20;
-#endif
- /* After disarming one trap, the next is easier */
-#if 0 /* DGDGDGDG */
- if (m_ptr->status & STATUS_DISARM_TRAP) smartness += 20;
-#endif
/* Smart monsters are better at disarming */
if (r_ptr->flags2 & RF2_SMART) smartness *= 2;
@@ -3069,19 +2826,11 @@ bool mon_hit_trap(int m_idx)
{
remove = TRUE;
- /* Next time disarming will be easier */
-#if 0 /* DGDGDGDG */
- m_ptr->status |= STATUS_DISARM_TRAP;
-#endif
if (m_ptr->ml)
{
/* Get the name */
monster_desc(m_name, m_ptr, 0);
- /* Tell the player about it */
-#if 0 /* DGDGDGDG */
- l_ptr->r_flags2 |= (RF2_DISARM_TRAP & r_ptr->flags2);
-#endif
/* Print a message */
msg_format("%^s disarms a trap!", m_name);
}
@@ -3362,17 +3111,6 @@ bool mon_hit_trap(int m_idx)
while (shots-- && !dead)
{
-#if 0
- /* Message if visible */
- if (m_ptr->ml)
- {
- /* describe the monster (again, just in case :-) */
- monster_desc(m_name, m_ptr, 0);
-
- /* Print a message */
- msg_format("%^s is hit by some magic.", m_name);
- }
-#endif
/* Get the effect effect */
switch (load_o_ptr->tval)
{
diff --git a/src/types.h b/src/types.h
index d895b1a7..49acb383 100644
--- a/src/types.h
+++ b/src/types.h
@@ -81,21 +81,8 @@ typedef struct header header;
struct header
{
- byte v_major; /* Version -- major */
- byte v_minor; /* Version -- minor */
- byte v_patch; /* Version -- patch */
- byte v_extra; /* Version -- extra */
-
-
u16b info_num; /* Number of "info" records */
- u16b info_len; /* Size of each "info" record */
-
-
- u32b head_size; /* Size of the "header" in bytes */
-
- u32b info_size; /* Size of the "info" array in bytes */
-
u32b name_size; /* Size of the "name" array in bytes */
u32b text_size; /* Size of the "text" array in bytes */
@@ -216,21 +203,21 @@ struct object_kind
byte flavor; /* Special object flavor (or zero) */
- bool easy_know; /* This object is always known (if aware) */
+ bool_ easy_know; /* This object is always known (if aware) */
- bool aware; /* The player is "aware" of the item's effects */
+ bool_ aware; /* The player is "aware" of the item's effects */
- bool tried; /* The player has "tried" one of the items */
+ bool_ tried; /* The player has "tried" one of the items */
- bool know; /* extractable flag for the alchemist */
+ bool_ know; /* extractable flag for the alchemist */
u32b esp; /* ESP flags */
u32b oesp; /* Obvious ESP flags */
byte btval; /* Become Object type */
byte bsval; /* Become Object sub type */
- bool artifact; /* Is it a normal artifact(already generated) */
+ bool_ artifact; /* Is it a normal artifact(already generated) */
s16b power; /* Power granted(if any) */
};
@@ -309,7 +296,7 @@ struct ego_item_type
u32b name; /* Name (offset) */
u32b text; /* Text (offset) */
- bool before; /* Before or after the object name ? */
+ bool_ before; /* Before or after the object name ? */
byte tval[10];
byte min_sval[10];
@@ -540,7 +527,7 @@ struct monster_race
u32b r_flags8; /* Observed racial flags */
u32b r_flags9; /* Observed racial flags */
- bool on_saved; /* Is the (unique) on a saved level ? */
+ bool_ on_saved; /* Is the (unique) on a saved level ? */
byte total_visible; /* Amount of this race that are visible */
@@ -553,7 +540,7 @@ typedef struct monster_ego monster_ego;
struct monster_ego
{
u32b name; /* Name (offset) */
- bool before; /* Display ego before or after */
+ bool_ before; /* Display ego before or after */
monster_blow blow[4]; /* Up to four blows per round */
byte blowm[4][2];
@@ -665,7 +652,7 @@ struct trap_type
byte minlevel; /* what is the minimum level on which the traps should be */
byte color; /* what is the color on screen */
u32b flags; /* where can these traps go - and perhaps other flags */
- bool ident; /* do we know the name */
+ bool_ ident; /* do we know the name */
s16b known; /* how well is this trap known */
s16b name; /* normal name like weakness */
s16b dd, ds; /* base damage */
@@ -910,7 +897,7 @@ struct monster_type
s32b mflag; /* Extra monster flags */
- bool ml; /* Monster is "visible" */
+ bool_ ml; /* Monster is "visible" */
s16b hold_o_idx; /* Object being held (if any) */
@@ -974,7 +961,7 @@ typedef struct option_type option_type;
struct option_type
{
- bool *o_var;
+ bool_ *o_var;
byte o_norm;
@@ -1194,7 +1181,7 @@ struct player_race_mod
{
s32b title; /* Type of race mod */
s32b desc; /* Desc */
- bool place; /* TRUE = race race modifier, FALSE = Race modifier race */
+ bool_ place; /* TRUE = race race modifier, FALSE = Race modifier race */
s16b r_adj[6]; /* (+) Racial stat bonuses */
@@ -1411,7 +1398,7 @@ struct meta_class_type
typedef struct help_info help_info;
struct help_info
{
- bool enabled; /* ingame help enabled */
+ bool_ enabled; /* ingame help enabled */
u32b help1; /* help flags 1 */
};
@@ -1481,12 +1468,12 @@ struct player_type
s16b arena_number; /* monster number in arena -KMW- */
s16b inside_arena; /* Is character inside arena? */
s16b inside_quest; /* Inside quest level */
- bool exit_bldg; /* Goal obtained in arena? -KMW- */
+ bool_ exit_bldg; /* Goal obtained in arena? -KMW- */
s32b wilderness_x; /* Coordinates in the wilderness */
s32b wilderness_y;
- bool wild_mode; /* TRUE = Small map, FLASE = Big map */
- bool old_wild_mode; /* TRUE = Small map, FLASE = Big map */
+ bool_ wild_mode; /* TRUE = Small map, FLASE = Big map */
+ bool_ old_wild_mode; /* TRUE = Small map, FLASE = Big map */
s16b mhp; /* Max hit pts */
s16b chp; /* Cur hit pts */
@@ -1503,7 +1490,7 @@ struct player_type
s32b grace; /* Your God's appreciation factor. */
byte pgod; /* Your God. */
- bool praying; /* Praying to your god. */
+ bool_ praying; /* Praying to your god. */
s16b melkor_sacrifice; /* How much hp has been sacrified for damage */
s16b max_plv; /* Max Player Level */
@@ -1620,11 +1607,11 @@ struct player_type
s16b xtra_spells; /* Number of xtra spell learned(via potion) */
- bool old_cumber_armor;
- bool old_cumber_glove;
- bool old_heavy_wield;
- bool old_heavy_shoot;
- bool old_icky_wield;
+ bool_ old_cumber_armor;
+ bool_ old_cumber_glove;
+ bool_ old_heavy_wield;
+ bool_ old_heavy_shoot;
+ bool_ old_icky_wield;
s16b old_lite; /* Old radius of lite (if any) */
s16b old_view; /* Old radius of view (if any) */
@@ -1632,12 +1619,12 @@ struct player_type
s16b old_food_aux; /* Old value of food */
- bool cumber_armor; /* Mana draining armor */
- bool cumber_glove; /* Mana draining gloves */
- bool heavy_wield; /* Heavy weapon */
- bool heavy_shoot; /* Heavy shooter */
- bool icky_wield; /* Icky weapon */
- bool immovable; /* Immovable character */
+ bool_ cumber_armor; /* Mana draining armor */
+ bool_ cumber_glove; /* Mana draining gloves */
+ bool_ heavy_wield; /* Heavy weapon */
+ bool_ heavy_shoot; /* Heavy shooter */
+ bool_ icky_wield; /* Icky weapon */
+ bool_ immovable; /* Immovable character */
s16b cur_lite; /* Radius of lite (if any) */
@@ -1655,72 +1642,72 @@ struct player_type
s16b stat_cnt[6]; /* Counter for temporary drains */
s16b stat_los[6]; /* Amount of temporary drains */
- bool immune_acid; /* Immunity to acid */
- bool immune_elec; /* Immunity to lightning */
- bool immune_fire; /* Immunity to fire */
- bool immune_cold; /* Immunity to cold */
- bool immune_neth; /* Immunity to nether */
-
- bool resist_acid; /* Resist acid */
- bool resist_elec; /* Resist lightning */
- bool resist_fire; /* Resist fire */
- bool resist_cold; /* Resist cold */
- bool resist_pois; /* Resist poison */
-
- bool resist_conf; /* Resist confusion */
- bool resist_sound; /* Resist sound */
- bool resist_lite; /* Resist light */
- bool resist_dark; /* Resist darkness */
- bool resist_chaos; /* Resist chaos */
- bool resist_disen; /* Resist disenchant */
- bool resist_shard; /* Resist shards */
- bool resist_nexus; /* Resist nexus */
- bool resist_blind; /* Resist blindness */
- bool resist_neth; /* Resist nether */
- bool resist_fear; /* Resist fear */
- bool resist_continuum; /* Resist space-time continuum disruption */
-
- bool sensible_fire; /* Fire does more damage on the player */
- bool sensible_lite; /* Lite does more damage on the player and blinds her/him */
-
- bool reflect; /* Reflect 'bolt' attacks */
- bool sh_fire; /* Fiery 'immolation' effect */
- bool sh_elec; /* Electric 'immolation' effect */
- bool wraith_form; /* wraithform */
-
- bool anti_magic; /* Anti-magic */
- bool anti_tele; /* Prevent teleportation */
-
- bool sustain_str; /* Keep strength */
- bool sustain_int; /* Keep intelligence */
- bool sustain_wis; /* Keep wisdom */
- bool sustain_dex; /* Keep dexterity */
- bool sustain_con; /* Keep constitution */
- bool sustain_chr; /* Keep charisma */
-
- bool aggravate; /* Aggravate monsters */
- bool teleport; /* Random teleporting */
-
- bool exp_drain; /* Experience draining */
+ bool_ immune_acid; /* Immunity to acid */
+ bool_ immune_elec; /* Immunity to lightning */
+ bool_ immune_fire; /* Immunity to fire */
+ bool_ immune_cold; /* Immunity to cold */
+ bool_ immune_neth; /* Immunity to nether */
+
+ bool_ resist_acid; /* Resist acid */
+ bool_ resist_elec; /* Resist lightning */
+ bool_ resist_fire; /* Resist fire */
+ bool_ resist_cold; /* Resist cold */
+ bool_ resist_pois; /* Resist poison */
+
+ bool_ resist_conf; /* Resist confusion */
+ bool_ resist_sound; /* Resist sound */
+ bool_ resist_lite; /* Resist light */
+ bool_ resist_dark; /* Resist darkness */
+ bool_ resist_chaos; /* Resist chaos */
+ bool_ resist_disen; /* Resist disenchant */
+ bool_ resist_shard; /* Resist shards */
+ bool_ resist_nexus; /* Resist nexus */
+ bool_ resist_blind; /* Resist blindness */
+ bool_ resist_neth; /* Resist nether */
+ bool_ resist_fear; /* Resist fear */
+ bool_ resist_continuum; /* Resist space-time continuum disruption */
+
+ bool_ sensible_fire; /* Fire does more damage on the player */
+ bool_ sensible_lite; /* Lite does more damage on the player and blinds her/him */
+
+ bool_ reflect; /* Reflect 'bolt' attacks */
+ bool_ sh_fire; /* Fiery 'immolation' effect */
+ bool_ sh_elec; /* Electric 'immolation' effect */
+ bool_ wraith_form; /* wraithform */
+
+ bool_ anti_magic; /* Anti-magic */
+ bool_ anti_tele; /* Prevent teleportation */
+
+ bool_ sustain_str; /* Keep strength */
+ bool_ sustain_int; /* Keep intelligence */
+ bool_ sustain_wis; /* Keep wisdom */
+ bool_ sustain_dex; /* Keep dexterity */
+ bool_ sustain_con; /* Keep constitution */
+ bool_ sustain_chr; /* Keep charisma */
+
+ bool_ aggravate; /* Aggravate monsters */
+ bool_ teleport; /* Random teleporting */
+
+ bool_ exp_drain; /* Experience draining */
byte drain_mana; /* mana draining */
byte drain_life; /* hp draining */
- bool magical_breath; /* Magical breathing -- can breath anywhere */
- bool water_breath; /* Water breathing -- can breath underwater */
- bool climb; /* Can climb mountains */
- bool fly; /* Can fly over some features */
- bool ffall; /* No damage falling */
- bool lite; /* Permanent light */
- bool free_act; /* Never paralyzed */
- bool see_inv; /* Can see invisible */
- bool regenerate; /* Regenerate hit pts */
- bool hold_life; /* Resist life draining */
+ bool_ magical_breath; /* Magical breathing -- can breath anywhere */
+ bool_ water_breath; /* Water breathing -- can breath underwater */
+ bool_ climb; /* Can climb mountains */
+ bool_ fly; /* Can fly over some features */
+ bool_ ffall; /* No damage falling */
+ bool_ lite; /* Permanent light */
+ bool_ free_act; /* Never paralyzed */
+ bool_ see_inv; /* Can see invisible */
+ bool_ regenerate; /* Regenerate hit pts */
+ bool_ hold_life; /* Resist life draining */
u32b telepathy; /* Telepathy */
- bool slow_digest; /* Slower digestion */
- bool bless_blade; /* Blessed blade */
+ bool_ slow_digest; /* Slower digestion */
+ bool_ bless_blade; /* Blessed blade */
byte xtra_might; /* Extra might bow */
- bool impact; /* Earthquake blows */
- bool auto_id; /* Auto id items */
+ bool_ impact; /* Earthquake blows */
+ bool_ auto_id; /* Auto id items */
s16b invis; /* Invisibility */
@@ -1805,11 +1792,11 @@ struct player_type
s16b companion_killed; /* Number of companion death */
- bool no_mortal; /* Fated to never die by the hand of a mortal being */
+ bool_ no_mortal; /* Fated to never die by the hand of a mortal being */
- bool black_breath; /* The Tolkien's Black Breath */
+ bool_ black_breath; /* The Tolkien's Black Breath */
- bool precognition; /* Like the cheat mode */
+ bool_ precognition; /* Like the cheat mode */
/*** Extra flags -- used for lua and easying stuff ***/
u32b xtra_f1;
@@ -1820,7 +1807,7 @@ struct player_type
u32b xtra_esp;
/* Corruptions */
- bool *corruptions;
+ bool_ *corruptions;
/*** Pet commands ***/
byte pet_follow_distance; /* Length of the imaginary "leash" for pets */
@@ -1832,17 +1819,15 @@ struct player_type
/*** Body changing variables ***/
u16b body_monster; /* In which body is the player */
- bool disembodied; /* Is the player in a body ? */
+ bool_ disembodied; /* Is the player in a body ? */
byte body_parts[INVEN_TOTAL - INVEN_WIELD]; /* Which body parts does he have ? */
- s16b extra_body_parts[BODY_MAX]; /* Various body modifiers */
-
/* Astral */
- bool astral; /* We started at the bottom ? */
+ bool_ astral; /* We started at the bottom ? */
/* Powers */
- bool *powers; /* Actual powers */
- bool powers_mod[POWER_MAX_INIT]; /* Intrinsinc powers */
+ bool_ *powers; /* Actual powers */
+ bool_ powers_mod[POWER_MAX_INIT]; /* Intrinsinc powers */
/* Skills */
s16b skill_points;
@@ -1855,8 +1840,8 @@ struct player_type
/*** Temporary fields ***/
- bool did_nothing; /* True if the last action wasnt a real action */
- bool leaving; /* True if player is leaving */
+ bool_ did_nothing; /* True if the last action wasnt a real action */
+ bool_ leaving; /* True if player is leaving */
};
@@ -1938,7 +1923,7 @@ struct wilderness_map
u32b seed; /* Seed for the RNG */
u16b entrance; /* Entrance for dungeons */
- bool known; /* Is it seen by the player ? */
+ bool_ known; /* Is it seen by the player ? */
};
/*
@@ -1955,9 +1940,9 @@ struct town_type
byte flags; /* Town flags */
/* Left this for the sake of compatibility */
- bool stocked; /* Is the town actualy stocked ? */
+ bool_ stocked; /* Is the town actualy stocked ? */
- bool destroyed; /* Is the town destroyed? */
+ bool_ destroyed; /* Is the town destroyed? */
};
@@ -1985,7 +1970,7 @@ struct artifact_select_flag {
byte level; /* Player skill level to start at */
int desc; /* Display this description to select flag */
u32b xp; /* xp cost for this flag */
- bool pval; /* indicates this flag benifits from pval */
+ bool_ pval; /* indicates this flag benifits from pval */
int item_desc; /* Description of required item */
int item_descp; /* Description of required item */
byte rtval; /* Required items' tval */
@@ -2072,7 +2057,7 @@ struct random_spell
byte dam_sides;
byte dam_dice;
byte level; /* Level needed */
- bool untried; /* Is the spell was tried? */
+ bool_ untried; /* Is the spell was tried? */
};
/* A structure to describe the fate of the player */
@@ -2090,8 +2075,8 @@ struct fate
s16b r_idx; /* Monster to find */
s16b count; /* Number of things */
s16b time; /* Turn before */
- bool know; /* Has it been predicted? */
- bool icky; /* Hackish runtime-only flag */
+ bool_ know; /* Has it been predicted? */
+ bool_ icky; /* Hackish runtime-only flag */
};
/* A structure for movements */
@@ -2155,7 +2140,7 @@ struct dungeon_info_type
s16b mindepth; /* Minimal depth */
s16b maxdepth; /* Maximal depth */
- bool principal; /* If it's a part of the main dungeon */
+ bool_ principal; /* If it's a part of the main dungeon */
byte next; /* The next part of the main dungeon */
byte min_plev; /* Minimal plev needed to enter -- it's an anti-cheating mesure */
@@ -2194,7 +2179,7 @@ struct inscription_info_type
{
char text[40]; /* The inscription itself */
byte when; /* When it is executed */
- bool know; /* Is the inscription know ? */
+ bool_ know; /* Is the inscription know ? */
byte mana; /* Grid mana needed */
};
@@ -2241,7 +2226,7 @@ struct power_type
};
/* Hooks */
-typedef bool (*hook_type)(char *fmt);
+typedef bool_ (*hook_type)(char *fmt);
/*
* Structure for the "quests"
@@ -2250,9 +2235,9 @@ typedef struct quest_type quest_type;
struct quest_type
{
- bool silent;
+ bool_ silent;
- bool dynamic_desc; /* Do we need to ask a function to get the description ? */
+ bool_ dynamic_desc; /* Do we need to ask a function to get the description ? */
char name[40]; /* Quest name */
@@ -2266,16 +2251,18 @@ struct quest_type
byte type; /* Lua or C ? */
- bool (*init)(int q); /* Function that takes care of generating hardcoded quests */
+ bool_ (*init)(int q); /* Function that takes care of generating hardcoded quests */
s32b data[4]; /* Various datas used by the quests */
+
+ bool_ (*gen_desc)(FILE *fff); /* Function for generating description. */
};
typedef struct random_quest random_quest;
struct random_quest
{
byte type; /* Type/number of monsters to kill(0 = no quest) */
s16b r_idx; /* Monsters to crush */
- bool done; /* Done ? */
+ bool_ done; /* Done ? */
};
/* Monster powers for player uses */
@@ -2285,7 +2272,7 @@ struct monster_power
u32b power; /* Power RF?_xxx */
cptr name; /* Name of it */
int mana; /* Mana needed */
- bool great; /* Need the use of great spells */
+ bool_ great; /* Need the use of great spells */
};
/* Tval descs */
@@ -2303,7 +2290,7 @@ typedef struct between_exit between_exit;
struct between_exit
{
s16b corresp; /* Corresponding between gate */
- bool dungeon; /* Do we exit in a dungeon or in the wild ? */
+ bool_ dungeon; /* Do we exit in a dungeon or in the wild ? */
s16b wild_x, wild_y; /* Wilderness spot to land onto */
s16b px, py; /* Location of the map */
@@ -2346,7 +2333,7 @@ struct birther
char history[4][60];
- bool quick_ok;
+ bool_ quick_ok;
};
typedef struct hooks_chain hooks_chain;
@@ -2399,7 +2386,7 @@ struct set_type
byte num_use; /* Number actually wore */
struct /* the various items */
{
- bool present; /* Is it actually wore ? */
+ bool_ present; /* Is it actually wore ? */
s16b a_idx; /* What artifact ? */
s16b pval[6]; /* Pval for each combination */
u32b flags1[6]; /* Flags */
@@ -2444,9 +2431,9 @@ struct skill_type
s16b action[MAX_SKILLS]; /* List of actions against other skills */
s16b father; /* Father in the skill tree */
- bool dev; /* Is the branch developped ? */
+ bool_ dev; /* Is the branch developped ? */
s16b order; /* Order in the tree */
- bool hidden; /* Innactive */
+ bool_ hidden; /* Innactive */
byte random_gain_chance; /* random gain chance, still needs the flag */
@@ -2493,7 +2480,7 @@ struct timer_type
{
timer_type *next; /* The next timer in the list */
- bool enabled; /* Is it currently counting? */
+ bool_ enabled; /* Is it currently counting? */
s32b delay; /* Delay between activations */
s32b countdown; /* The current number of turns passed, when it reaches delay it fires */
@@ -2524,7 +2511,7 @@ struct ability_type
s16b cost; /* Skill points cost */
- bool acquired; /* Do the player actualylg ot it ? */
+ bool_ acquired; /* Do the player actualylg ot it ? */
/* Prereqs */
s16b skills[10]; /* List of prereq skills(10 max) */
diff --git a/src/util.c b/src/util.c
index 5d178780..93e38e4a 100644
--- a/src/util.c
+++ b/src/util.c
@@ -122,11 +122,6 @@ void user_name(char *buf, int id)
(void)strcpy(buf, pw->pw_name);
buf[16] = '\0';
-#ifdef CAPITALIZE_USER_NAME
- /* Hack -- capitalize the user name */
- if (islower(buf[0])) buf[0] = toupper(buf[0]);
-#endif /* CAPITALIZE_USER_NAME */
-
return;
}
#endif /* SET_UID */
@@ -176,14 +171,12 @@ void user_name(char *buf, int id)
* Extract a "parsed" path from an initial filename
* Normally, we simply copy the filename into the buffer
* But leading tilde symbols must be handled in a special way
-* Replace "~user/" by the home directory of the user named "user"
* Replace "~/" by the home directory of the current user
*/
errr path_parse(char *buf, int max, cptr file)
{
cptr u, s;
struct passwd *pw;
- char user[128];
/* Assume no result */
@@ -205,9 +198,6 @@ errr path_parse(char *buf, int max, cptr file)
/* Look for non-user portion of the file */
s = strstr(u, PATH_SEP);
- /* Hack -- no long user names */
- if (s && (s >= u + sizeof(user))) return (1);
-
#ifdef GETLOGIN_BROKEN
/* Ask the environment for the home directory */
u = getenv("HOME");
@@ -216,21 +206,8 @@ errr path_parse(char *buf, int max, cptr file)
(void)strcpy(buf, u);
#else
- /* Extract a user name */
- if (s)
- {
- int i;
- for (i = 0; u < s; ++i) user[i] = *u++;
- user[i] = '\0';
- u = user;
- }
-
- /* Look up the "current" user */
- if (u[0] == '\0') u = getlogin();
-
- /* Look up a user (or "current" user) */
- if (u) pw = getpwnam(u);
- else pw = getpwuid(getuid());
+ /* Look up password data for user */
+ pw = getpwuid(getuid());
/* Nothing found? */
if (!pw) return (1);
@@ -406,107 +383,6 @@ errr my_fclose(FILE *fff)
/*
-* Like "fgets()" but for strings
-*
-* Process tabs, strip internal non-printables
-*/
-errr my_str_fgets(cptr full_text, char *buf, huge n)
-{
- static huge last_read = 0;
- static huge full_size;
- huge i = 0;
-
- char *s;
-
- char tmp[1024];
-
- /* Initialize */
- if (!buf)
- {
- last_read = 0;
- full_size = strlen(full_text);
- return 0;
- }
-
- /* The end! */
- if (last_read >= full_size)
- {
- return 1;
- }
-
- while (last_read < full_size)
- {
- char c = full_text[last_read++];
-
- tmp[i++] = c;
-
- /* Dont overflow */
- if (i >= 1024)
- {
- /* Nothing */
- buf[0] = '\0';
-
- /* Failure */
- return (1);
- }
-
- if ((c == '\n') || (c == '\r'))
- {
- break;
- }
- }
-
- tmp[i++] = '\n';
- tmp[i++] = '\0';
-
- /* We need it again */
- i = 0;
-
- /* Convert weirdness */
- for (s = tmp; *s; s++)
- {
- /* Handle newline */
- if (*s == '\n')
- {
- /* Terminate */
- buf[i] = '\0';
-
- /* Success */
- return (0);
- }
-
- /* Handle tabs */
- else if (*s == '\t')
- {
- /* Hack -- require room */
- if (i + 8 >= n) break;
-
- /* Append a space */
- buf[i++] = ' ';
-
- /* Append some more spaces */
- while (!(i % 8)) buf[i++] = ' ';
- }
-
- /* Handle printables */
- else if (isprint(*s))
- {
- /* Copy */
- buf[i++] = *s;
-
- /* Check length */
- if (i >= n) break;
- }
- }
-
- /* Nothing */
- buf[0] = '\0';
-
- /* Failure */
- return (1);
-}
-
-/*
* Hack -- replacement for "fgets()"
*
* Read a string, without a newline, to a file
@@ -881,27 +757,6 @@ errr fd_seek(int fd, huge n)
/*
-* Hack -- attempt to truncate a file descriptor
-*/
-errr fd_chop(int fd, huge n)
-{
- /* XXX XXX */
- n = n ? n : 0;
-
- /* Verify the fd */
- if (fd < 0) return ( -1);
-
-#if defined(SUNOS) || defined(ULTRIX) || defined(NeXT)
- /* Truncate */
- ftruncate(fd, n);
-#endif
-
- /* Success */
- return (0);
-}
-
-
-/*
* Hack -- attempt to read data from a file descriptor
*/
errr fd_read(int fd, char *buf, huge n)
@@ -1115,7 +970,7 @@ static void trigger_text_to_ascii(char **bufptr, cptr *strptr)
{
char *s = *bufptr;
cptr str = *strptr;
- bool mod_status[MAX_MACRO_MOD];
+ bool_ mod_status[MAX_MACRO_MOD];
int i, len = 0;
int shiftstatus = 0;
@@ -1335,7 +1190,7 @@ void text_to_ascii(char *buf, cptr str)
}
-bool trigger_ascii_to_text(char **bufptr, cptr *strptr)
+bool_ trigger_ascii_to_text(char **bufptr, cptr *strptr)
{
char *s = *bufptr;
cptr str = *strptr;
@@ -1502,7 +1357,7 @@ void ascii_to_text(char *buf, cptr str)
/*
* Determine if any macros have ever started with a given character.
*/
-static bool macro__use[256];
+static bool_ macro__use[256];
/*
@@ -1701,7 +1556,7 @@ errr macro_init(void)
/*
* Local "need flush" variable
*/
-static bool flush_later = FALSE;
+static bool_ flush_later = FALSE;
/*
@@ -1709,14 +1564,14 @@ static bool flush_later = FALSE;
*
* Do not match any macros until "ascii 30" is found.
*/
-static bool parse_macro = FALSE;
+static bool_ parse_macro = FALSE;
/*
* Local variable -- we are inside a "macro trigger"
*
* Strip all keypresses until a low ascii value is found.
*/
-static bool parse_under = FALSE;
+static bool_ parse_under = FALSE;
/*
@@ -1997,7 +1852,7 @@ char inkey(void)
char ch = 0;
- bool done = FALSE;
+ bool_ done = FALSE;
term *old = Term;
@@ -3230,7 +3085,7 @@ static char complete_buf[100];
static int complete_command(char *buf, int clen, int mlen)
{
int i, j = 1, max = clen;
- bool gotone = FALSE;
+ bool_ gotone = FALSE;
/* Forget the characters after the end of the string. */
complete_buf[clen] = '\0';
@@ -3279,8 +3134,8 @@ static int complete_command(char *buf, int clen, int mlen)
* ESCAPE clears the buffer and the window and returns FALSE.
* RETURN accepts the current buffer contents and returns TRUE.
*/
-bool askfor_aux_complete = FALSE;
-bool askfor_aux(char *buf, int len)
+bool_ askfor_aux_complete = FALSE;
+bool_ askfor_aux(char *buf, int len)
{
int y, x;
@@ -3290,7 +3145,7 @@ bool askfor_aux(char *buf, int len)
int wid, hgt;
- bool done = FALSE;
+ bool_ done = FALSE;
/* Locate the cursor */
@@ -3406,9 +3261,9 @@ bool askfor_aux(char *buf, int len)
*
* We clear the input, and return FALSE, on "ESCAPE".
*/
-bool get_string(cptr prompt, char *buf, int len)
+bool_ get_string(cptr prompt, char *buf, int len)
{
- bool res;
+ bool_ res;
/* Paranoia XXX XXX XXX */
msg_print(NULL);
@@ -3434,7 +3289,7 @@ bool get_string(cptr prompt, char *buf, int len)
*
* Note that "[y/n]" is appended to the prompt.
*/
-bool get_check(cptr prompt)
+bool_ get_check(cptr prompt)
{
int i;
@@ -3477,7 +3332,7 @@ bool get_check(cptr prompt)
*
* Returns TRUE unless the character is "Escape"
*/
-bool get_com(cptr prompt, char *command)
+bool_ get_com(cptr prompt, char *command)
{
/* Paranoia XXX XXX XXX */
msg_print(NULL);
@@ -3530,8 +3385,6 @@ s32b get_quantity(cptr prompt, s32b max)
return (amt);
}
-#ifdef ALLOW_REPEAT /* TNB */
-
/* Get the item index */
if ((max != 1) && repeat_pull(&aamt))
{
@@ -3547,8 +3400,6 @@ s32b get_quantity(cptr prompt, s32b max)
return (amt);
}
-#endif /* ALLOW_REPEAT -- TNB */
-
/* Build a prompt if needed */
if (!prompt)
{
@@ -3581,12 +3432,9 @@ s32b get_quantity(cptr prompt, s32b max)
/* Enforce the minimum */
if (amt < 0) amt = 0;
-#ifdef ALLOW_REPEAT /* TNB */
if (amt) repeat_push(amt);
-#endif /* ALLOW_REPEAT -- TNB */
-
/* Return the result */
return (amt);
}
@@ -3597,10 +3445,9 @@ s32b get_quantity(cptr prompt, s32b max)
*/
void pause_line(int row)
{
- int i;
prt("", row, 0);
put_str("[Press any key to continue]", row, 23);
- i = inkey();
+ inkey();
prt("", row, 0);
}
@@ -3622,7 +3469,7 @@ char request_command_ignore_keymaps[MAX_IGNORE_KEYMAPS];
* Mega-Hack -- flag set by do_cmd_{inven,equip}() to allow keymaps in
* auto-command mode.
*/
-bool request_command_inven_mode = FALSE;
+bool_ request_command_inven_mode = FALSE;
/*
@@ -3656,18 +3503,8 @@ void request_command(int shopping)
cptr act;
- /* Roguelike */
- if (rogue_like_commands)
- {
- mode = KEYMAP_MODE_ROGUE;
- }
-
- /* Original */
- else
- {
- mode = KEYMAP_MODE_ORIG;
- }
-
+ /* Keymap mode */
+ mode = get_keymap_mode();
/* No command yet */
command_cmd = 0;
@@ -3803,7 +3640,7 @@ void request_command(int shopping)
if ((cmd == ' ') || (cmd == '\n') || (cmd == '\r'))
{
/* Get a real command */
- bool temp = get_com("Command: ", &cmd_char);
+ bool_ temp = get_com("Command: ", &cmd_char);
cmd = cmd_char;
if (!temp)
@@ -3939,7 +3776,7 @@ void request_command(int shopping)
/*
* Check a char for "vowel-hood"
*/
-bool is_a_vowel(int ch)
+bool_ is_a_vowel(int ch)
{
switch (ch)
{
@@ -3960,65 +3797,6 @@ bool is_a_vowel(int ch)
}
-
-#if 0
-
-/*
-* Replace the first instance of "target" in "buf" with "insert"
-* If "insert" is NULL, just remove the first instance of "target"
-* In either case, return TRUE if "target" is found.
-*
-* XXX Could be made more efficient, especially in the
-* case where "insert" is smaller than "target".
-*/
-static bool insert_str(char *buf, cptr target, cptr insert)
-{
- int i, len;
- int b_len, t_len, i_len;
-
- /* Attempt to find the target (modify "buf") */
- buf = strstr(buf, target);
-
- /* No target found */
- if (!buf) return (FALSE);
-
- /* Be sure we have an insertion string */
- if (!insert) insert = "";
-
- /* Extract some lengths */
- t_len = strlen(target);
- i_len = strlen(insert);
- b_len = strlen(buf);
-
- /* How much "movement" do we need? */
- len = i_len - t_len;
-
- /* We need less space (for insert) */
- if (len < 0)
- {
- for (i = t_len; i < b_len; ++i) buf[i + len] = buf[i];
- }
-
- /* We need more space (for insert) */
- else if (len > 0)
- {
- for (i = b_len - 1; i >= t_len; --i) buf[i + len] = buf[i];
- }
-
- /* If movement occured, we need a new terminator */
- if (len) buf[b_len + len] = '\0';
-
- /* Now copy the insertion string */
- for (i = 0; i < i_len; ++i) buf[i] = insert[i];
-
- /* Successful operation */
- return (TRUE);
-}
-
-
-#endif
-
-
/*
* GH
* Called from cmd4.c and a few other places. Just extracts
@@ -4045,17 +3823,8 @@ int get_keymap_dir(char ch)
}
else
{
- /* Roguelike */
- if (rogue_like_commands)
- {
- mode = KEYMAP_MODE_ROGUE;
- }
-
- /* Original */
- else
- {
- mode = KEYMAP_MODE_ORIG;
- }
+ /* Keymap mode */
+ mode = get_keymap_mode();
/* Extract the action (if any) */
act = keymap_act[mode][(byte)(ch)];
@@ -4080,8 +3849,6 @@ int get_keymap_dir(char ch)
}
-#ifdef ALLOW_REPEAT /* TNB */
-
#define REPEAT_MAX 20
/* Number of chars saved */
@@ -4107,7 +3874,7 @@ void repeat_push(int what)
}
-bool repeat_pull(int *what)
+bool_ repeat_pull(int *what)
{
/* All out of keys */
if (repeat__idx == repeat__cnt) return (FALSE);
@@ -4157,7 +3924,6 @@ void repeat_check(void)
}
}
-#endif /* ALLOW_REPEAT -- TNB */
/*
* Read a number at a specific location on the screen
@@ -4169,7 +3935,7 @@ u32b get_number(u32b def, u32b max, int y, int x, char *cmd)
u32b res = def;
/* Player has not typed anything yet */
- bool no_keys = TRUE;
+ bool_ no_keys = TRUE;
/* Begin the input with default */
prt(format("%lu", def), y, x);
@@ -4378,7 +4144,7 @@ s32b bst(s32b what, s32b t)
}
}
-cptr get_month_name(int day, bool full, bool compact)
+cptr get_month_name(int day, bool_ full, bool_ compact)
{
int i = 8;
static char buf[40];
@@ -4452,107 +4218,6 @@ cptr get_player_race_name(int pr, int ps)
return (buf);
}
-#ifdef SUPPORT_GAMMA
-
-/* Table of gamma values */
-byte gamma_table[256];
-
-/* Table of ln(x / 256) * 256 for x going from 0 -> 255 */
-static const s16b gamma_helper[256] =
-{
- 0, -1420, -1242, -1138, -1065, -1007, -961, -921, -887, -857, -830,
- -806, -783, -762, -744, -726, -710, -694, -679, -666, -652, -640,
- -628, -617, -606, -596, -586, -576, -567, -577, -549, -541, -532,
- -525, -517, -509, -502, -495, -488, -482, -475, -469, -463, -457,
- -451, -455, -439, -434, -429, -423, -418, -413, -408, -403, -398,
- -394, -389, -385, -380, -376, -371, -367, -363, -359, -355, -351,
- -347, -343, -339, -336, -332, -328, -325, -321, -318, -314, -311,
- -308, -304, -301, -298, -295, -291, -288, -285, -282, -279, -276,
- -273, -271, -268, -265, -262, -259, -257, -254, -251, -248, -246,
- -243, -241, -238, -236, -233, -231, -228, -226, -223, -221, -219,
- -216, -214, -212, -209, -207, -205, -203, -200, -198, -196, -194,
- -192, -190, -188, -186, -184, -182, -180, -178, -176, -174, -172,
- -170, -168, -166, -164, -162, -160, -158, -156, -155, -153, -151,
- -149, -147, -146, -144, -142, -140, -139, -137, -135, -134, -132,
- -130, -128, -127, -125, -124, -122, -120, -119, -117, -116, -114,
- -112, -111, -109, -108, -106, -105, -103, -102, -100, -99, -97, -96,
- -95, -93, -92, -90, -89, -87, -86, -85, -83, -82, -80, -79, -78,
- -76, -75, -74, -72, -71, -70, -68, -67, -66, -65, -63, -62, -61,
- -59, -58, -57, -56, -54, -53, -52, -51, -50, -48, -47, -46, -45,
- -44, -42, -41, -40, -39, -38, -37, -35, -34, -33, -32, -31, -30,
- -29, -27, -26, -25, -24, -23, -22, -21, -20, -19, -18, -17, -16,
- -14, -13, -12, -11, -10, -9, -8, -7, -6, -5, -4, -3, -2, -1
-};
-
-
-/*
- * Build the gamma table so that floating point isn't needed.
- *
- * Note gamma goes from 0->256. The old value of 100 is now 128.
- */
-void build_gamma_table(int gamma)
-{
- int i, n;
-
- /*
- * value is the current sum.
- * diff is the new term to add to the series.
- */
- long value, diff;
-
- /* Hack - convergence is bad in these cases. */
- gamma_table[0] = 0;
- gamma_table[255] = 255;
-
- for (i = 1; i < 255; i++)
- {
- /*
- * Initialise the Taylor series
- *
- * value and diff have been scaled by 256
- */
- n = 1;
- value = 256 * 256;
- diff = ((long)gamma_helper[i]) * (gamma - 256);
-
- while (diff)
- {
- value += diff;
- n++;
-
- /*
- * Use the following identiy to calculate the gamma table.
- * exp(x) = 1 + x + x^2/2 + x^3/(2*3) + x^4/(2*3*4) +...
- *
- * n is the current term number.
- *
- * The gamma_helper array contains a table of
- * ln(x/256) * 256
- * This is used because a^b = exp(b*ln(a))
- *
- * In this case:
- * a is i / 256
- * b is gamma.
- *
- * Note that everything is scaled by 256 for accuracy,
- * plus another factor of 256 for the final result to
- * be from 0-255. Thus gamma_helper[] * gamma must be
- * divided by 256*256 each itteration, to get back to
- * the original power series.
- */
- diff = (((diff / 256) * gamma_helper[i]) * (gamma - 256)) / (256 * n);
- }
-
- /*
- * Store the value in the table so that the
- * floating point pow function isn't needed.
- */
- gamma_table[i] = ((long)(value / 256) * i) / 256;
- }
-}
-
-#endif /* SUPPORT_GAMMA */
-
/*
* Ask to select an item in a list
*/
@@ -4632,7 +4297,7 @@ int ask_menu(cptr ask, char **items, int max)
/*
* Determine if string "t" is a prefix of string "s"
*/
-bool prefix(cptr s, cptr t)
+bool_ prefix(cptr s, cptr t)
{
/* Paranoia */
if (!s || !t)
@@ -4717,7 +4382,7 @@ void display_list(int y, int x, int h, int w, cptr title, cptr *list, int max, i
/*
* Creates an input box
*/
-bool input_box(cptr text, int y, int x, char *buf, int max)
+bool_ input_box(cptr text, int y, int x, char *buf, int max)
{
int smax = strlen(text);
@@ -4800,3 +4465,15 @@ void del_timer(timer_type *t_ptr)
else
cmsg_print(TERM_VIOLET, "Unknown timer!");
}
+
+int get_keymap_mode()
+{
+ if (rogue_like_commands)
+ {
+ return KEYMAP_MODE_ROGUE;
+ }
+ else
+ {
+ return KEYMAP_MODE_ORIG;
+ }
+}
diff --git a/src/util.pkg b/src/util.pkg
index 1dd6000b..39f70b40 100644
--- a/src/util.pkg
+++ b/src/util.pkg
@@ -1316,7 +1316,7 @@ extern void prt(cptr str, int row, int col);
* @brief Add a message "msg" of type "type" and colour "color" to the
* message array.\n
* @param type Number \n the type of message. MESSAGE_MSG for regular
- * messages, MESSAGE_IRC for IRC messages.
+ * messages.
* @brief Type
* @param msg String \n the message.
* @brief Message
@@ -1514,6 +1514,12 @@ extern void quit(cptr str);
*/
extern s32b value_scale(int value, int vmax, int max, int min);
+/*
+ * compass, approximate_distance
+ */
+extern cptr compass(int y, int x, int y2, int x2);
+extern cptr approximate_distance(int y, int x, int y2, int x2);
+
/** @fn text_out_c(byte a, cptr str)
* @brief Output text to the screen (in color) or to a file depending on the
* selected hook.\n
@@ -2339,29 +2345,10 @@ extern s16b ddy_ddd[9];
/* Gen stuff */
-/** @fn get_map_size(bool full_text, char *name, int *ysize = 0, int *xsize = 0)
- * @brief Return the size of the map in file "name".\n
- * @param full_text Boolean \n if TRUE, "name" contains the map itself,
- * otherwise "name" is the name of the map file.
- * @brief Name is a map?
- * @param *name String \n the map itself, or the name of the map file.
- * @brief Map
- * @param *ysize Number
- * @brief Maximum y-coordinate
- * @param *xsize Number
- * @brief Maximum x-coordinate
- * @return *ysize Number \n The maximum y-coordinate of the map.
- * @return *xsize Number \n The maximum x-coordinate of the map.
- * @note (see file lua_bind.c, init1.c)
- */
-extern void get_map_size(bool full_text, char *name, int *ysize = 0, int *xsize = 0);
-/** @fn load_map(bool full_text, char *name, int *y = 2, int *x = 2)
+/** @fn load_map(char *name, int *y = 2, int *x = 2)
* @brief Load the map in file "name".\n
- * @param full_text Boolean \n if TRUE, "name" contains the map itself,
- * otherwise "name" is the name of the map file.
- * @brief Name is a map?
- * @param *name String \n the map itself, or the name of the map file.
+ * @param *name String \n the name of the map file.
* @brief Map
* @param *y Number
* @brief Maximum y-coordinate
@@ -2373,7 +2360,7 @@ extern void get_map_size(bool full_text, char *name, int *ysize = 0, int *xsize
* The map is loaded and the player is placed at the starting position.
* @note (see file lua_bind.c)
*/
-extern void load_map(bool full_text, char *name, int *y = 2, int *x = 2);
+extern void load_map(char *name, int *y = 2, int *x = 2);
/** @fn alloc_room(int by0, int bx0, int ysize, int xsize, int *y1 = 0, int *x1 = 0, int *y2 = 0, int *x2 = 0)
* @brief Allocate the space needed by a room in the room_map array.\n
@@ -2463,40 +2450,6 @@ $static const char *player_name_lua(void){return (const char *)player_name;}
*/
const char *player_name_lua@player_name();
-/* Temp files */
-/** @fn make_temp_file();
- * @brief Create a temporary file.
- * @note
- * If a temp file already exists, or one can't be generated, the function
- * will fail. Otherwise a file is created and the temp_file flag is set to
- * TRUE.
- * @note (see file lua_bind.c, util.c)
- */
-extern void lua_make_temp_file@make_temp_file();
-
-/** @fn close_temp_file();
- * @brief Close a temporary file.
- * @note
- * The file is closed but not released.
- * @note (see file lua_bind.c, util.c)
- */
-extern void lua_close_temp_file@close_temp_file();
-
-/** @fn end_temp_file();
- * @brief End a temporary file.
- * @note
- * The file is released and the temp_file flag is set to FALSE.
- * @note (see file lua_bind.c, util.c)
- */
-extern void lua_end_temp_file@end_temp_file();
-
-/** @fn get_temp_name();
- * @brief Return the name of the temporary file.
- * @return String \n The name of the temporary file.
- * @note (see file lua_bind.c)
- */
-extern cptr lua_get_temp_name@get_temp_name();
-
/* Quarks */
/** @fn quark_str(s16b num)
* @brief Return a quark (inscription) from the quark array.\n
@@ -2725,3 +2678,6 @@ extern void calc_bonuses(bool silent);
extern void note_spot(int y, int x);
extern void lite_spot(int y, int x);
+
+extern bool drop_text_left(byte c, cptr s, int y, int o);
+extern bool drop_text_right(byte c, cptr s, int y, int o);
diff --git a/src/variable.c b/src/variable.c
index 6bc4b04e..0eb0fadf 100644
--- a/src/variable.c
+++ b/src/variable.c
@@ -60,25 +60,25 @@ u16b sf_saves; /* Number of "saves" during this life */
/*
* Run-time arguments
*/
-bool arg_fiddle; /* Command arg -- Request fiddle mode */
-bool arg_wizard; /* Command arg -- Request wizard mode */
-bool arg_sound; /* Command arg -- Request special sounds */
-bool arg_graphics; /* Command arg -- Request graphics mode */
-bool arg_force_original; /* Command arg -- Request original keyset */
-bool arg_force_roguelike; /* Command arg -- Request roguelike keyset */
-bool arg_bigtile = FALSE; /* Command arg -- Request big tile mode */
+bool_ arg_fiddle; /* Command arg -- Request fiddle mode */
+bool_ arg_wizard; /* Command arg -- Request wizard mode */
+bool_ arg_sound; /* Command arg -- Request special sounds */
+bool_ arg_graphics; /* Command arg -- Request graphics mode */
+bool_ arg_force_original; /* Command arg -- Request original keyset */
+bool_ arg_force_roguelike; /* Command arg -- Request roguelike keyset */
+bool_ arg_bigtile = FALSE; /* Command arg -- Request big tile mode */
/*
* Various things
*/
-bool character_generated; /* The character exists */
-bool character_dungeon; /* The character has a dungeon */
-bool character_loaded; /* The character was loaded from a savefile */
-bool character_saved; /* The character was just saved to a savefile */
+bool_ character_generated; /* The character exists */
+bool_ character_dungeon; /* The character has a dungeon */
+bool_ character_loaded; /* The character was loaded from a savefile */
+bool_ character_saved; /* The character was just saved to a savefile */
-bool character_icky; /* The game is in an icky full screen mode */
-bool character_xtra; /* The game is in an icky startup mode */
+bool_ character_icky; /* The game is in an icky full screen mode */
+bool_ character_xtra; /* The game is in an icky startup mode */
u32b seed_flavor; /* Hack -- consistent object colors */
@@ -88,24 +88,23 @@ s16b command_arg; /* Gives argument of current command */
s16b command_rep; /* Gives repetition of current command */
s16b command_dir; /* Gives direction of current command */
-s16b command_see; /* See "cmd1.c" */
s16b command_wrk; /* See "cmd1.c" */
s16b command_new; /* Command chaining from inven/equip view */
s32b energy_use; /* Energy use this turn */
-bool create_up_stair; /* Auto-create "up stairs" */
-bool create_down_stair; /* Auto-create "down stairs" */
+bool_ create_up_stair; /* Auto-create "up stairs" */
+bool_ create_down_stair; /* Auto-create "down stairs" */
-bool create_up_shaft; /* Auto-create "up shaft" */
-bool create_down_shaft; /* Auto-create "down shaft" */
+bool_ create_up_shaft; /* Auto-create "up shaft" */
+bool_ create_down_shaft; /* Auto-create "down shaft" */
-bool msg_flag; /* Used in msg_print() for "buffering" */
+bool_ msg_flag; /* Used in msg_print() for "buffering" */
-bool alive; /* True if game is running */
+bool_ alive; /* True if game is running */
-bool death; /* True if player has died */
+bool_ death; /* True if player has died */
s16b running; /* Current counter for running, if any */
s16b resting; /* Current counter for resting, if any */
@@ -121,41 +120,40 @@ s16b monster_level; /* Current monster creation level */
s32b turn; /* Current game turn */
s32b old_turn; /* Turn when level began (feelings) */
-bool wizard; /* Is the player currently in Wizard mode? */
+bool_ wizard; /* Is the player currently in Wizard mode? */
-bool use_sound; /* The "sound" mode is enabled */
-bool use_graphics; /* The "graphics" mode is enabled */
-bool use_bigtile = FALSE;
+bool_ use_sound; /* The "sound" mode is enabled */
+bool_ use_graphics; /* The "graphics" mode is enabled */
+bool_ use_bigtile = FALSE;
byte graphics_mode; /* Current graphics mode */
u16b total_winner; /* Semi-Hack -- Game has been won */
u16b has_won; /* Semi-Hack -- Game has been won */
-u16b panic_save; /* Track some special "conditions" */
u16b noscore; /* Track various "cheating" conditions */
s16b signal_count; /* Hack -- Count interupts */
-bool inkey_base; /* See the "inkey()" function */
-bool inkey_xtra; /* See the "inkey()" function */
-bool inkey_scan; /* See the "inkey()" function */
-bool inkey_flag; /* See the "inkey()" function */
+bool_ inkey_base; /* See the "inkey()" function */
+bool_ inkey_xtra; /* See the "inkey()" function */
+bool_ inkey_scan; /* See the "inkey()" function */
+bool_ inkey_flag; /* See the "inkey()" function */
s16b coin_type; /* Hack -- force coin type */
-bool opening_chest; /* Hack -- prevent chest generation */
+bool_ opening_chest; /* Hack -- prevent chest generation */
-bool shimmer_monsters; /* Hack -- optimize multi-hued monsters */
-bool shimmer_objects; /* Hack -- optimize multi-hued objects */
+bool_ shimmer_monsters; /* Hack -- optimize multi-hued monsters */
+bool_ shimmer_objects; /* Hack -- optimize multi-hued objects */
-bool repair_monsters; /* Hack -- optimize detect monsters */
-bool repair_objects; /* Hack -- optimize detect objects */
+bool_ repair_monsters; /* Hack -- optimize detect monsters */
+bool_ repair_objects; /* Hack -- optimize detect objects */
s16b inven_nxt; /* Hack -- unused */
-bool hack_mind;
-bool hack_corruption;
+bool_ hack_mind;
+bool_ hack_corruption;
int artifact_bias;
-bool is_autosave = FALSE;
+bool_ is_autosave = FALSE;
s16b inven_cnt; /* Number of items in inventory */
s16b equip_cnt; /* Number of items in equipment */
@@ -168,7 +166,7 @@ s16b m_cnt = 0; /* Number of live monsters */
s16b hack_m_idx = 0; /* Hack -- see "process_monsters()" */
s16b hack_m_idx_ii = 0;
-bool multi_rew = FALSE;
+bool_ multi_rew = FALSE;
char summon_kin_type; /* Hack, by Julian Lighton: summon 'relatives' */
int total_friends = 0;
@@ -217,132 +215,132 @@ int highscore_fd = -1;
/* Option Set 1 -- User Interface */
-bool rogue_like_commands; /* Rogue-like commands */
-bool quick_messages; /* Activate quick messages */
-bool other_query_flag; /* Prompt for various information */
-bool carry_query_flag; /* Prompt before picking things up */
-bool use_old_target; /* Use old target by default */
-bool always_pickup; /* Pick things up by default */
-bool prompt_pickup_heavy; /* Don't pick up the corpses */
-bool always_repeat; /* Repeat obvious commands */
-bool depth_in_feet; /* Show dungeon level in feet */
+bool_ rogue_like_commands; /* Rogue-like commands */
+bool_ quick_messages; /* Activate quick messages */
+bool_ other_query_flag; /* Prompt for various information */
+bool_ carry_query_flag; /* Prompt before picking things up */
+bool_ use_old_target; /* Use old target by default */
+bool_ always_pickup; /* Pick things up by default */
+bool_ prompt_pickup_heavy; /* Don't pick up the corpses */
+bool_ always_repeat; /* Repeat obvious commands */
+bool_ depth_in_feet; /* Show dungeon level in feet */
-bool stack_force_notes; /* Merge inscriptions when stacking */
-bool stack_force_costs; /* Merge discounts when stacking */
+bool_ stack_force_notes; /* Merge inscriptions when stacking */
+bool_ stack_force_costs; /* Merge discounts when stacking */
-bool show_labels; /* Show labels in object listings */
-bool show_weights; /* Show weights in object listings */
-bool show_choices; /* Show choices in certain sub-windows */
-bool show_details; /* Show details in certain sub-windows */
+bool_ show_labels; /* Show labels in object listings */
+bool_ show_weights; /* Show weights in object listings */
+bool_ show_choices; /* Show choices in certain sub-windows */
+bool_ show_details; /* Show details in certain sub-windows */
-bool ring_bell; /* Ring the bell (on errors, etc) */
+bool_ ring_bell; /* Ring the bell (on errors, etc) */
-bool show_inven_graph; /* Show graphics in inventory */
-bool show_equip_graph; /* Show graphics in equip list */
-bool show_store_graph; /* Show graphics in store */
+bool_ show_inven_graph; /* Show graphics in inventory */
+bool_ show_equip_graph; /* Show graphics in equip list */
+bool_ show_store_graph; /* Show graphics in store */
/* Option Set 2 -- Disturbance */
-bool find_ignore_stairs; /* Run past stairs */
-bool find_ignore_doors; /* Run through open doors */
-bool find_cut; /* Run past known corners */
-bool find_examine; /* Run into potential corners */
-
-bool disturb_move; /* Disturb whenever any monster moves */
-bool disturb_near; /* Disturb whenever viewable monster moves */
-bool disturb_panel; /* Disturb whenever map panel changes */
-bool disturb_detect; /* Disturb whenever leaving trap-detected area */
-bool disturb_state; /* Disturn whenever player state changes */
-bool disturb_minor; /* Disturb whenever boring things happen */
-bool disturb_other; /* Disturb whenever various things happen */
-
-bool alert_hitpoint; /* Alert user to critical hitpoints */
-bool alert_failure; /* Alert user to various failures */
-bool last_words; /* Get last words upon dying */
-bool speak_unique; /* Speaking uniques + shopkeepers */
-bool small_levels; /* Allow unusually small dungeon levels */
-bool empty_levels; /* Allow empty 'arena' levels */
-bool always_small_level; /* Small levels */
-bool player_symbols; /* Use varying symbols for the player char */
-bool plain_descriptions; /* Plain object descriptions */
-bool stupid_monsters; /* Monsters use old AI */
-bool auto_destroy; /* Known worthless items are destroyed without confirmation */
-bool confirm_stairs; /* Prompt before staircases... */
-bool wear_confirm; /* Confirm before putting on known cursed items */
-bool disturb_pets; /* Pets moving nearby disturb us */
+bool_ find_ignore_stairs; /* Run past stairs */
+bool_ find_ignore_doors; /* Run through open doors */
+bool_ find_cut; /* Run past known corners */
+bool_ find_examine; /* Run into potential corners */
+
+bool_ disturb_move; /* Disturb whenever any monster moves */
+bool_ disturb_near; /* Disturb whenever viewable monster moves */
+bool_ disturb_panel; /* Disturb whenever map panel changes */
+bool_ disturb_detect; /* Disturb whenever leaving trap-detected area */
+bool_ disturb_state; /* Disturn whenever player state changes */
+bool_ disturb_minor; /* Disturb whenever boring things happen */
+bool_ disturb_other; /* Disturb whenever various things happen */
+
+bool_ alert_hitpoint; /* Alert user to critical hitpoints */
+bool_ alert_failure; /* Alert user to various failures */
+bool_ last_words; /* Get last words upon dying */
+bool_ speak_unique; /* Speaking uniques + shopkeepers */
+bool_ small_levels; /* Allow unusually small dungeon levels */
+bool_ empty_levels; /* Allow empty 'arena' levels */
+bool_ always_small_level; /* Small levels */
+bool_ player_symbols; /* Use varying symbols for the player char */
+bool_ plain_descriptions; /* Plain object descriptions */
+bool_ stupid_monsters; /* Monsters use old AI */
+bool_ auto_destroy; /* Known worthless items are destroyed without confirmation */
+bool_ confirm_stairs; /* Prompt before staircases... */
+bool_ wear_confirm; /* Confirm before putting on known cursed items */
+bool_ disturb_pets; /* Pets moving nearby disturb us */
/* Option Set 3 -- Game-Play */
-bool auto_haggle; /* Auto-haggle in stores */
+bool_ auto_haggle; /* Auto-haggle in stores */
-bool auto_scum; /* Auto-scum for good levels */
+bool_ auto_scum; /* Auto-scum for good levels */
-bool stack_allow_items; /* Allow weapons and armor to stack */
-bool stack_allow_wands; /* Allow wands/staffs/rods to stack */
+bool_ stack_allow_items; /* Allow weapons and armor to stack */
+bool_ stack_allow_wands; /* Allow wands/staffs/rods to stack */
-bool expand_look; /* Expand the power of the look command */
-bool expand_list; /* Expand the power of the list commands */
+bool_ expand_look; /* Expand the power of the look command */
+bool_ expand_list; /* Expand the power of the list commands */
-bool view_perma_grids; /* Map remembers all perma-lit grids */
-bool view_torch_grids; /* Map remembers all torch-lit grids */
+bool_ view_perma_grids; /* Map remembers all perma-lit grids */
+bool_ view_torch_grids; /* Map remembers all torch-lit grids */
-bool monster_lite; /* Allow some monsters to carry light */
+bool_ monster_lite; /* Allow some monsters to carry light */
-bool dungeon_align; /* Generate dungeons with aligned rooms */
-bool dungeon_stair; /* Generate dungeons with connected stairs */
+bool_ dungeon_align; /* Generate dungeons with aligned rooms */
+bool_ dungeon_stair; /* Generate dungeons with connected stairs */
-bool flow_by_sound; /* Monsters track new player location */
+bool_ flow_by_sound; /* Monsters track new player location */
-bool track_follow; /* Monsters follow the player */
-bool track_target; /* Monsters target the player */
+bool_ track_follow; /* Monsters follow the player */
+bool_ track_target; /* Monsters target the player */
-bool smart_learn; /* Monsters learn from their mistakes */
-bool smart_cheat; /* Monsters exploit player weaknesses */
+bool_ smart_learn; /* Monsters learn from their mistakes */
+bool_ smart_cheat; /* Monsters exploit player weaknesses */
/* Option Set 4 -- Efficiency */
-bool view_reduce_lite; /* Reduce lite-radius when running */
-bool view_reduce_view; /* Reduce view-radius in town */
+bool_ view_reduce_lite; /* Reduce lite-radius when running */
+bool_ view_reduce_view; /* Reduce view-radius in town */
-bool avoid_abort; /* Avoid checking for user abort */
-bool avoid_shimmer; /* Avoid processing extra shimmering */
-bool avoid_other; /* Avoid processing special colors */
+bool_ avoid_abort; /* Avoid checking for user abort */
+bool_ avoid_shimmer; /* Avoid processing extra shimmering */
+bool_ avoid_other; /* Avoid processing special colors */
-bool flush_failure; /* Flush input on any failure */
-bool flush_disturb; /* Flush input on disturbance */
-bool flush_command; /* Flush input before every command */
+bool_ flush_failure; /* Flush input on any failure */
+bool_ flush_disturb; /* Flush input on disturbance */
+bool_ flush_command; /* Flush input before every command */
-bool fresh_before; /* Flush output before normal commands */
-bool fresh_after; /* Flush output after normal commands */
-bool fresh_message; /* Flush output after all messages */
+bool_ fresh_before; /* Flush output before normal commands */
+bool_ fresh_after; /* Flush output after normal commands */
+bool_ fresh_message; /* Flush output after all messages */
-bool hilite_player; /* Hilite the player with the cursor */
+bool_ hilite_player; /* Hilite the player with the cursor */
-bool view_yellow_lite; /* Use special colors for torch-lit grids */
-bool view_bright_lite; /* Use special colors for 'viewable' grids */
+bool_ view_yellow_lite; /* Use special colors for torch-lit grids */
+bool_ view_bright_lite; /* Use special colors for 'viewable' grids */
-bool view_granite_lite; /* Use special colors for wall grids (slow) */
-bool view_special_lite; /* Use special colors for floor grids (slow) */
+bool_ view_granite_lite; /* Use special colors for wall grids (slow) */
+bool_ view_special_lite; /* Use special colors for floor grids (slow) */
/* Option set 5 -- Testing */
-bool testing_stack; /* Test the stacking code */
+bool_ testing_stack; /* Test the stacking code */
-bool testing_carry; /* Test the carrying code */
+bool_ testing_carry; /* Test the carrying code */
/* Cheating options */
-bool cheat_peek; /* Peek into object creation */
-bool cheat_hear; /* Peek into monster creation */
-bool cheat_room; /* Peek into dungeon creation */
-bool cheat_xtra; /* Peek into something else */
-bool cheat_know; /* Know complete monster info */
-bool cheat_live; /* Allow player to avoid death */
+bool_ cheat_peek; /* Peek into object creation */
+bool_ cheat_hear; /* Peek into monster creation */
+bool_ cheat_room; /* Peek into dungeon creation */
+bool_ cheat_xtra; /* Peek into something else */
+bool_ cheat_know; /* Know complete monster info */
+bool_ cheat_live; /* Allow player to avoid death */
/* Special options */
@@ -351,8 +349,8 @@ byte hitpoint_warn; /* Hitpoint warning (0 to 9) */
byte delay_factor; /* Delay factor (0 to 9) */
-bool autosave_l; /* Autosave before entering new levels */
-bool autosave_t; /* Timed autosave */
+bool_ autosave_l; /* Autosave before entering new levels */
+bool_ autosave_t; /* Timed autosave */
s16b autosave_freq; /* Autosave frequency */
@@ -363,9 +361,9 @@ s16b autosave_freq; /* Autosave frequency */
s16b feeling; /* Most recent feeling */
s16b rating; /* Level's current rating */
-bool good_item_flag; /* True if "Artifact" on this level */
+bool_ good_item_flag; /* True if "Artifact" on this level */
-bool closing_flag; /* Dungeon is closing */
+bool_ closing_flag; /* Dungeon is closing */
/*
* Dungeon size info
@@ -414,8 +412,6 @@ object_type *tracked_object;
* User info
*/
int player_uid;
-int player_euid;
-int player_egid;
/*
* Current player's character name
@@ -441,7 +437,6 @@ char history[4][60];
* Buffer to hold the current savefile name
*/
char savefile[1024];
-bool savefile_setuid = TRUE;
/*
@@ -484,7 +479,7 @@ cptr *macro__act;
/*
* Array of macro types [MACRO_MAX]
*/
-bool *macro__cmd;
+bool_ *macro__cmd;
/*
* Current macro action [1024]
@@ -609,17 +604,6 @@ byte angband_color_table[256][4] =
};
-#ifdef SUPPORT_GAMMA
-
-/*
- * Gamma correction - gamma_val == (int)(256 / gamma)
- * The value of 0 means no gamma correction (== 1.0)
- */
-u16b gamma_val;
-
-#endif /* SUPPORT_GAMMA */
-
-
/*
* Standard sound names
*/
@@ -741,7 +725,7 @@ alloc_entry *alloc_kind_table;
* The flag to tell if alloc_kind_table contains valid entries
* for normal (i.e. kind_is_legal) object allocation
*/
-bool alloc_kind_table_valid = FALSE;
+bool_ alloc_kind_table_valid = FALSE;
/*
@@ -1134,7 +1118,7 @@ char pref_tmp_value[8];
* Total Hack -- allow all items to be listed (even empty ones)
* This is only used by "do_cmd_inven_e()" and is cleared there.
*/
-bool item_tester_full;
+bool_ item_tester_full;
/*
@@ -1148,14 +1132,14 @@ byte item_tester_tval;
* Here is a "hook" used during calls to "get_item()" and
* "show_inven()" and "show_equip()", and the choice window routines.
*/
-bool (*item_tester_hook)(object_type*);
+bool_ (*item_tester_hook)(object_type*);
/*
* Current "comp" function for ang_sort()
*/
-bool (*ang_sort_comp)(vptr u, vptr v, int a, int b);
+bool_ (*ang_sort_comp)(vptr u, vptr v, int a, int b);
/*
@@ -1168,29 +1152,23 @@ void (*ang_sort_swap)(vptr u, vptr v, int a, int b);
/*
* Hack -- function hooks to restrict "get_mon_num_prep()" function
*/
-bool (*get_mon_num_hook)(int r_idx);
-bool (*get_mon_num2_hook)(int r_idx);
+bool_ (*get_mon_num_hook)(int r_idx);
+bool_ (*get_mon_num2_hook)(int r_idx);
/*
* Hack -- function hook to restrict "get_obj_num_prep()" function
*/
-bool (*get_obj_num_hook)(int k_idx);
+bool_ (*get_obj_num_hook)(int k_idx);
/* Hack, monk armour */
-bool monk_armour_aux;
-bool monk_notify_aux;
+bool_ monk_armour_aux;
+bool_ monk_notify_aux;
-#ifdef ALLOW_EASY_OPEN /* TNB */
-bool easy_open = TRUE;
-#endif /* ALLOW_EASY_OPEN -- TNB */
-
-#ifdef ALLOW_EASY_DISARM /* TNB */
-bool easy_disarm = TRUE;
-#endif /* ALLOW_EASY_DISARM -- TNB */
-
-bool easy_tunnel = FALSE;
+bool_ easy_open = TRUE;
+bool_ easy_disarm = TRUE;
+bool_ easy_tunnel = FALSE;
/*
@@ -1320,16 +1298,16 @@ u16b max_wf_idx;
int init_flags;
/* True if on an ambush */
-bool ambush_flag;
+bool_ ambush_flag;
/* True if on fated level */
-bool fate_flag;
+bool_ fate_flag;
/* No breeders */
-u16b no_breeds;
+s16b no_breeds;
/* Carried monsters can't take the damage if this is them which attack the player */
-bool carried_monster_hit = FALSE;
+bool_ carried_monster_hit = FALSE;
/*
* Random artifacts.
@@ -1349,7 +1327,7 @@ s16b bounties[MAX_BOUNTIES][2];
/*
* Spell description
*/
-bool info_spell = FALSE;
+bool_ info_spell = FALSE;
char spell_txt[50];
/*
@@ -1370,11 +1348,6 @@ s16b rune_num;
fate fates[MAX_FATES];
/*
- * Vanilla town.
- */
-byte vanilla_town = FALSE;
-
-/*
* Which dungeon ?
* 0 = Wilderness
* 1 = Mirkwood
@@ -1397,59 +1370,59 @@ u32b total_bounties;
s16b doppleganger;
/* To allow wilderness encounters */
-bool generate_encounter;
+bool_ generate_encounter;
/* Permanent dungeons ? */
-bool permanent_levels;
+bool_ permanent_levels;
/* Autoroler */
-bool autoroll;
+bool_ autoroll;
/* Point based */
-bool point_based;
+bool_ point_based;
/* Maximize, preserve, special levels, ironman_rooms */
-bool maximize, preserve, special_lvls, ironman_rooms;
+bool_ maximize, preserve, special_lvls, ironman_rooms;
/* In inventory option window, just erase the letters,
* rather that displaying the list without the invalid
* selections */
-bool inventory_no_move;
+bool_ inventory_no_move;
/* Notes patch */
-bool take_notes, auto_notes;
+bool_ take_notes, auto_notes;
/*
* Such an ugly hack ...
*/
-bool *m_allow_special;
-bool *k_allow_special;
-bool *a_allow_special;
+bool_ *m_allow_special;
+bool_ *k_allow_special;
+bool_ *a_allow_special;
/*
* Gives a random object to newly created characters
*/
-bool rand_birth;
+bool_ rand_birth;
/*
* Fast autoroller
*/
-bool fast_autoroller;
+bool_ fast_autoroller;
/*
* Which monsters are allowed ?
*/
-bool joke_monsters;
+bool_ joke_monsters;
/*
* How will mana staf & weapons of life act
*/
-bool munchkin_multipliers = TRUE;
+bool_ munchkin_multipliers = TRUE;
/*
* Center view
*/
-bool center_player = FALSE;
+bool_ center_player = FALSE;
/*
* Plots
@@ -1464,28 +1437,28 @@ random_quest random_quests[MAX_RANDOM_QUEST];
/*
* Show exp left
*/
-bool exp_need;
+bool_ exp_need;
/*
* Auto load old colors;
*/
-bool autoload_old_colors;
+bool_ autoload_old_colors;
/*
* Fated ?
*/
-bool fate_option;
+bool_ fate_option;
/*
* Special levels
*/
-bool *special_lvl[MAX_DUNGEON_DEPTH];
-bool generate_special_feeling = FALSE;
+bool_ *special_lvl[MAX_DUNGEON_DEPTH];
+bool_ generate_special_feeling = FALSE;
/*
* Auto more
*/
-bool auto_more;
+bool_ auto_more;
/*
* Dungeon flags
@@ -1524,7 +1497,7 @@ quest_type *quest;
/*
* Display the player as a special symbol when in bad health ?
*/
-bool player_char_health;
+bool_ player_char_health;
/*
@@ -1553,7 +1526,7 @@ s16b gen_skill_mod[MAX_SKILLS];
/*
* Display stats as linear
*/
-bool linear_stats;
+bool_ linear_stats;
/*
* Table of "cli" macros.
@@ -1574,12 +1547,12 @@ s16b max_corruptions = 0;
/*
* Ingame contextual help
*/
-bool option_ingame_help = TRUE;
+bool_ option_ingame_help = TRUE;
/*
* Automatizer enabled status
*/
-bool automatizer_enabled = FALSE;
+bool_ automatizer_enabled = FALSE;
/*
* Location of the last teleportation thath affected the level
@@ -1618,7 +1591,7 @@ timer_type *gl_timers = NULL;
const char *get_version_string()
{
static char version_str[80];
- static bool initialized = 0;
+ static bool_ initialized = 0;
if (!initialized) {
sprintf(version_str, "%s %ld.%ld.%ld%s",
game_module,
diff --git a/src/wild.c b/src/wild.c
index c22de8ab..7a9d1c51 100644
--- a/src/wild.c
+++ b/src/wild.c
@@ -133,7 +133,7 @@ static void plasma_recursive(int x1, int y1, int x2, int y2,
*
* Return the number of floor grids
*/
-int generate_area(int y, int x, bool border, bool corner, bool refresh)
+int generate_area(int y, int x, bool_ border, bool_ corner, bool_ refresh)
{
int road, entrance;
int x1, y1;
@@ -224,7 +224,7 @@ int generate_area(int y, int x, bool border, bool corner, bool refresh)
/* Initialize the town */
init_flags = INIT_CREATE_DUNGEON;
- process_dungeon_file(NULL, "t_info.txt", &ystart, &xstart, cur_hgt, cur_wid, TRUE);
+ process_dungeon_file("t_info.txt", &ystart, &xstart, cur_hgt, cur_wid, TRUE, FALSE);
}
else
{
@@ -281,47 +281,6 @@ int generate_area(int y, int x, bool border, bool corner, bool refresh)
}
}
-#if 0
- /* Hack -- Use the "simple" RNG */
- Rand_quick = TRUE;
-
- /* Hack -- Induce consistant town layout */
- Rand_value = wilderness[y][x].seed;
-
- /* Generate a wilderness vault. */
- if (magik(DUN_WILD_VAULT))
- {
- vault_type *v_ptr;
- int vindex, vy, vx;
- int i;
-
- /* Pick a wilderness vault */
- for (i = 0; i < 1000; i++)
- {
- /* Access a random vault record */
- vindex = rand_int(max_v_idx);
- v_ptr = &v_info[vindex];
-
- /* Accept the first greater vault */
- if (v_ptr->typ == 10) break;
- }
-
- /* Message */
- if (cheat_room) msg_format("Wilderness Vault %d", vindex);
-
- /* Boost the rating */
- rating += v_ptr->rat;
-
- vy = rand_range((v_ptr->hgt / 2) + 1, MAX_HGT - (v_ptr->hgt / 2)-1);
- vx = rand_range((v_ptr->wid / 2) + 1, MAX_WID - (v_ptr->wid / 2)-1);
-
- build_vault(vy, vx, v_ptr->hgt, v_ptr->wid, v_text + v_ptr->text);
- }
-
- /* Use the complex RNG */
- Rand_quick = FALSE;
-#endif
-
/* Hack -- Use the "simple" RNG */
Rand_quick = TRUE;
@@ -385,13 +344,13 @@ static border_type border;
void wilderness_gen(int refresh)
{
int i, y, x, hack_floor;
- bool daytime;
+ bool_ daytime;
int xstart = 0;
int ystart = 0;
cave_type *c_ptr;
/* Init the wilderness */
- process_dungeon_file(NULL, "w_info.txt", &ystart, &xstart, cur_hgt, cur_wid, TRUE);
+ process_dungeon_file("w_info.txt", &ystart, &xstart, cur_hgt, cur_wid, TRUE, FALSE);
x = p_ptr->wilderness_x;
y = p_ptr->wilderness_y;
@@ -595,7 +554,7 @@ void wilderness_gen_small()
}
/* Init the wilderness */
- process_dungeon_file(NULL, "w_info.txt", &ystart, &xstart, cur_hgt, cur_wid, TRUE);
+ process_dungeon_file("w_info.txt", &ystart, &xstart, cur_hgt, cur_wid, TRUE, FALSE);
/* Fill the map */
for (i = 0; i < max_wild_x; i++)
@@ -972,7 +931,7 @@ static void town_borders(int t_idx, int qy, int qx)
}
}
-static bool create_townpeople_hook(int r_idx)
+static bool_ create_townpeople_hook(int r_idx)
{
monster_race *r_ptr = &r_info[r_idx];
@@ -991,7 +950,7 @@ static bool create_townpeople_hook(int r_idx)
static void town_gen_hack(int t_idx, int qy, int qx)
{
int y, x, floor, num = 0;
- bool (*old_get_mon_num_hook)(int r_idx);
+ bool_ (*old_get_mon_num_hook)(int r_idx);
int *rooms;
@@ -1082,7 +1041,7 @@ static void town_gen_hack(int t_idx, int qy, int qx)
static void town_gen_circle(int t_idx, int qy, int qx)
{
int y, x, cy, cx, rad, floor, num = 0;
- bool (*old_get_mon_num_hook)(int r_idx);
+ bool_ (*old_get_mon_num_hook)(int r_idx);
int *rooms;
diff --git a/src/wizard1.c b/src/wizard1.c
index 44b154a3..7daef324 100644
--- a/src/wizard1.c
+++ b/src/wizard1.c
@@ -1175,7 +1175,7 @@ static void spoiler_print_art(obj_desc_list *art_ptr, int name1, int set, object
/*
* Hack -- Create a "forged" artifact
*/
-static bool make_fake_artifact(object_type *o_ptr, int name1)
+static bool_ make_fake_artifact(object_type *o_ptr, int name1)
{
int i;
int cur;
@@ -1466,7 +1466,7 @@ static void spoil_mon_info(cptr fname)
{
char buf[1024];
int msex, vn, i, j, k, n;
- bool breath, magic, sin;
+ bool_ breath, magic, sin;
cptr p, q;
cptr vp[64];
u32b flags1, flags2, flags3, flags4, flags5, flags6, flags9;
diff --git a/src/wizard2.c b/src/wizard2.c
index daabe4f3..a19b72e0 100644
--- a/src/wizard2.c
+++ b/src/wizard2.c
@@ -56,13 +56,7 @@ void teleport_player_town(int town)
{
int x = 0, y = 0;
- if (autosave_l)
- {
- is_autosave = TRUE;
- msg_print("Autosaving the game...");
- do_cmd_save_game();
- is_autosave = FALSE;
- }
+ autosave_checkpoint();
/* Change town */
dun_level = 0;
@@ -142,7 +136,7 @@ static void wiz_create_named_art()
object_type *q_ptr;
int i, a_idx;
cptr p = "Number of the artifact :";
- char out_val[80];
+ char out_val[80] = "";
artifact_type *a_ptr;
if (!get_string(p, out_val, 4)) return;
@@ -237,7 +231,7 @@ static void do_cmd_summon_horde()
while (--attempts)
{
- scatter(&wy, &wx, p_ptr->py, p_ptr->px, 3, 0);
+ scatter(&wy, &wx, p_ptr->py, p_ptr->px, 3);
if (cave_naked_bold(wy, wx)) break;
}
@@ -729,11 +723,6 @@ static void wiz_tweak_item(object_type *o_ptr)
object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp);
-#if 0 /* DG -- A Wizard can do whatever he/she wants */
- /* Hack -- leave artifacts alone */
- if (artifact_p(o_ptr) || o_ptr->art_name) return;
-#endif
-
p = "Enter new 'pval' setting: ";
sprintf(tmp_val, "%ld", (long int) o_ptr->pval);
if (!get_string(p, tmp_val, 5)) return;
@@ -813,7 +802,7 @@ static void wiz_reroll_item(object_type *o_ptr)
char ch;
- bool changed = FALSE;
+ bool_ changed = FALSE;
/* Hack -- leave artifacts alone */
@@ -926,7 +915,7 @@ static void wiz_statistics(object_type *o_ptr)
char ch;
char *quality;
- bool good, great;
+ bool_ good, great;
object_type forge;
object_type *q_ptr;
@@ -1112,13 +1101,9 @@ static void wiz_statistics(object_type *o_ptr)
*/
static void wiz_quantity_item(object_type *o_ptr)
{
- int tmp_int, tmp_qnt;
-
+ int tmp_int;
char tmp_val[100];
-
- tmp_qnt = o_ptr->number;
-
/* Default */
sprintf(tmp_val, "%d", o_ptr->number);
@@ -1157,7 +1142,7 @@ static void do_cmd_wiz_play(void)
char ch;
- bool changed;
+ bool_ changed;
cptr q, s;
@@ -1166,17 +1151,8 @@ static void do_cmd_wiz_play(void)
s = "You have nothing to play with.";
if (!get_item(&item, q, s, (USE_EQUIP | USE_INVEN | USE_FLOOR))) return;
- /* Get the item (in the pack) */
- if (item >= 0)
- {
- o_ptr = &p_ptr->inventory[item];
- }
-
- /* Get the item (on the floor) */
- else
- {
- o_ptr = &o_list[0 - item];
- }
+ /* Get the item */
+ o_ptr = get_object(item);
/* The item was not changed */
@@ -1374,7 +1350,6 @@ static void wiz_create_item_2(void)
void do_cmd_wiz_cure_all(void)
{
object_type *o_ptr;
- monster_race *r_ptr;
/* Remove curses */
(void)remove_all_curse();
@@ -1403,7 +1378,6 @@ void do_cmd_wiz_cure_all(void)
o_ptr = &p_ptr->inventory[INVEN_CARRY];
if (o_ptr->k_idx)
{
- r_ptr = &r_info[o_ptr->pval];
o_ptr->pval2 = o_ptr->pval3;
}
@@ -1466,13 +1440,7 @@ static void do_cmd_wiz_jump(void)
/* Accept request */
msg_format("You jump to dungeon level %d.", command_arg);
- if (autosave_l)
- {
- is_autosave = TRUE;
- msg_print("Autosaving the game...");
- do_cmd_save_game();
- is_autosave = FALSE;
- }
+ autosave_checkpoint();
/* Change level */
dun_level = command_arg;
@@ -1537,7 +1505,7 @@ static void do_cmd_wiz_summon(int num)
*
* XXX XXX XXX This function is rather dangerous
*/
-static void do_cmd_wiz_named(int r_idx, bool slp)
+static void do_cmd_wiz_named(int r_idx, bool_ slp)
{
int i, x, y;
@@ -1553,7 +1521,7 @@ static void do_cmd_wiz_named(int r_idx, bool slp)
int d = 1;
/* Pick a location */
- scatter(&y, &x, p_ptr->py, p_ptr->px, d, 0);
+ scatter(&y, &x, p_ptr->py, p_ptr->px, d);
/* Require empty grids */
if (!cave_empty_bold(y, x)) continue;
@@ -1571,7 +1539,7 @@ static void do_cmd_wiz_named(int r_idx, bool slp)
*
* XXX XXX XXX This function is rather dangerous
*/
-void do_cmd_wiz_named_friendly(int r_idx, bool slp)
+void do_cmd_wiz_named_friendly(int r_idx, bool_ slp)
{
int i, x, y;
@@ -1588,7 +1556,7 @@ void do_cmd_wiz_named_friendly(int r_idx, bool slp)
int d = 1;
/* Pick a location */
- scatter(&y, &x, p_ptr->py, p_ptr->px, d, 0);
+ scatter(&y, &x, p_ptr->py, p_ptr->px, d);
/* Require empty grids */
if (!cave_empty_bold(y, x)) continue;
@@ -1823,11 +1791,6 @@ void do_cmd_debug(void)
teleport_player(10);
break;
- /* Panic save the game */
- case 'P':
- exit_game_panic();
- break;
-
/* get a Quest */
case 'q':
{
diff --git a/src/xtra1.c b/src/xtra1.c
index d1996b18..933bc265 100644
--- a/src/xtra1.c
+++ b/src/xtra1.c
@@ -429,7 +429,6 @@ static void prt_mh(void)
byte color;
object_type *o_ptr;
- monster_race *r_ptr;
/* Get the carried monster */
o_ptr = &p_ptr->inventory[INVEN_CARRY];
@@ -440,8 +439,6 @@ static void prt_mh(void)
return;
}
- r_ptr = &r_info[o_ptr->pval];
-
put_str("MH ", ROW_MH, COL_MH);
sprintf(tmp, "%4d/%4d", o_ptr->pval2, (int)o_ptr->pval3);
@@ -1250,67 +1247,6 @@ void fix_message(void)
/*
- * Hack -- display recent IRC messages in sub-windows
- *
- * XXX XXX XXX Adjust for width and split messages
- */
-void fix_irc_message(void)
-{
- int j, i, k;
- int w, h;
- int x, y;
-
- /* Scan windows */
- for (j = 0; j < 8; j++)
- {
- term *old = Term;
-
- /* No window */
- if (!angband_term[j]) continue;
-
- /* No relevant flags */
- if (!(window_flag[j] & (PW_IRC))) continue;
-
- /* Activate */
- Term_activate(angband_term[j]);
-
- /* Get size */
- Term_get_size(&w, &h);
-
- Term_clear();
-
- /* Dump messages */
- k = 0;
- for (i = 0; ; i++)
- {
- byte type = message_type((s16b)i);
-
- if (k >= h) break;
- if (MESSAGE_NONE == type) break;
- if (MESSAGE_IRC != type) continue;
-
- /* Dump the message on the appropriate line */
- display_message(0, (h - 1) - k, strlen(message_str((s16b)i)), message_color((s16b)i), message_str((s16b)i));
-
- /* Cursor */
- Term_locate(&x, &y);
-
- /* Clear to end of line */
- Term_erase(x, y, 255);
-
- k++;
- }
-
- /* Fresh */
- Term_fresh();
-
- /* Restore */
- Term_activate(old);
- }
-}
-
-
-/*
* Hack -- display overhead view in sub-windows
*
* Note that the "player" symbol does NOT appear on the map.
@@ -1581,13 +1517,13 @@ static void calc_spells(void)
}
/* Ugly hack */
-bool calc_powers_silent = FALSE;
+bool_ calc_powers_silent = FALSE;
/* Calc the player powers */
static void calc_powers(void)
{
int i, p = 0;
- bool *old_powers;
+ bool_ *old_powers;
/* Hack -- wait for creation */
if (!character_generated) return;
@@ -1595,7 +1531,7 @@ static void calc_powers(void)
/* Hack -- handle "xtra" mode */
if (character_xtra) return;
- C_MAKE(old_powers, power_max, bool);
+ C_MAKE(old_powers, power_max, bool_);
/* Save old powers */
for (i = 0; i < power_max; i++) old_powers[i] = p_ptr->powers[i];
@@ -1650,20 +1586,20 @@ static void calc_powers(void)
for (i = 0; i < power_max; i++)
{
s32b old = old_powers[i];
- s32b new = p_ptr->powers[i];
+ s32b new_ = p_ptr->powers[i];
- if (new > old)
+ if (new_ > old)
{
if (!calc_powers_silent) cmsg_print(TERM_GREEN, powers_type[i].gain_text);
}
- else if (new < old)
+ else if (new_ < old)
{
if (!calc_powers_silent) cmsg_print(TERM_RED, powers_type[i].lose_text);
}
}
calc_powers_silent = FALSE;
- C_FREE(old_powers, power_max, bool);
+ C_FREE(old_powers, power_max, bool_);
}
@@ -2180,16 +2116,11 @@ void calc_body()
}
}
- /* Do we need more parts ? ;) */
- for (i = 0; i < BODY_MAX; i++)
- p_ptr->extra_body_parts[i] = 0;
- process_hooks(HOOK_BODY_PARTS, "()");
-
for (i = 0; i < BODY_MAX; i++)
{
int b;
- b = bp[i] + cp_ptr->body_parts[i] + p_ptr->extra_body_parts[i];
+ b = bp[i] + cp_ptr->body_parts[i];
if (b < 0) b = 0;
if (b > max_body_part[i]) b = max_body_part[i];
@@ -2383,14 +2314,11 @@ int get_weaponmastery_skill()
int get_archery_skill()
{
int i, skill = 0;
- object_type *o_ptr;
i = INVEN_BOW - INVEN_WIELD;
/* All weapons must be of the same type */
while (p_ptr->body_parts[i] == INVEN_BOW)
{
- o_ptr = &p_ptr->inventory[INVEN_WIELD + i];
-
if (p_ptr->inventory[INVEN_WIELD + i].tval == TV_BOW)
{
switch (p_ptr->inventory[INVEN_WIELD + i].sval / 10)
@@ -2708,10 +2636,9 @@ void apply_flags(u32b f1, u32b f2, u32b f3, u32b f4, u32b f5, u32b esp, s16b pva
* This function induces various "status" messages, unless silent is
* TRUE.
*/
-void calc_bonuses(bool silent)
+void calc_bonuses(bool_ silent)
{
int i, j, hold;
- int old_invis;
int old_speed;
u32b old_telepathy;
int old_see_inv;
@@ -2732,9 +2659,6 @@ void calc_bonuses(bool silent)
old_dis_ac = p_ptr->dis_ac;
old_dis_to_a = p_ptr->dis_to_a;
- /* Save the old invisibility */
- old_invis = p_ptr->invis;
-
/* Clear extra blows/shots */
extra_blows = extra_shots = 0;
@@ -4452,13 +4376,6 @@ void window_stuff(void)
}
/* Display overhead view */
- if (p_ptr->window & (PW_IRC))
- {
- p_ptr->window &= ~(PW_IRC);
- fix_irc_message();
- }
-
- /* Display overhead view */
if (p_ptr->window & (PW_OVERHEAD))
{
p_ptr->window &= ~(PW_OVERHEAD);
@@ -4497,7 +4414,7 @@ void handle_stuff(void)
}
-bool monk_empty_hands(void)
+bool_ monk_empty_hands(void)
{
int i;
object_type *o_ptr;
@@ -4517,7 +4434,7 @@ bool monk_empty_hands(void)
return TRUE;
}
-bool monk_heavy_armor(void)
+bool_ monk_heavy_armor(void)
{
u16b monk_arm_wgt = 0;
@@ -4537,7 +4454,6 @@ bool monk_heavy_armor(void)
static int get_artifact_idx(int level)
{
int count = 0, i;
- bool OK = FALSE;
while (count < 1000)
{
@@ -4557,23 +4473,12 @@ static int get_artifact_idx(int level)
/* Avoid granting SPECIAL_GENE artifacts */
if (a_ptr->flags4 & TR4_SPECIAL_GENE) continue;
- OK = TRUE;
- break;
+ return i;
}
/* No matches found */
- if (OK == FALSE)
- {
-#if 0 /* pelpel */
- /* XXX XXX XXX Grant the Phial */
- i = 1;
-#endif /* pelpel */
-
- /* Grant a randart */
- i = 0;
- }
-
- return i;
+ /* Grant a randart */
+ return 0;
}
/* Chose a fate */
@@ -4829,7 +4734,7 @@ void dump_fates(FILE *outfile)
{
int i;
char buf[120];
- bool pending = FALSE;
+ bool_ pending = FALSE;
if (!outfile) return;
diff --git a/src/xtra2.c b/src/xtra2.c
index 0dbc2b02..70978e47 100644
--- a/src/xtra2.c
+++ b/src/xtra2.c
@@ -16,7 +16,7 @@
/*
* Invoke The Rush
*/
-bool set_rush(int v)
+bool_ set_rush(int v)
{
int j;
@@ -55,9 +55,9 @@ bool set_rush(int v)
* Set "p_ptr->parasite" and "p_ptr->parasite_r_idx"
* notice observable changes
*/
-bool set_parasite(int v, int r)
+bool_ set_parasite(int v, int r)
{
- bool notice = FALSE;
+ bool_ notice = FALSE;
/* Hack -- Force good values */
v = (v > 10000) ? 10000 : (v < 0) ? 0 : v;
@@ -87,7 +87,7 @@ bool set_parasite(int v, int r)
do
{
- scatter(&wy, &wx, p_ptr->py, p_ptr->px, 10, 0);
+ scatter(&wy, &wx, p_ptr->py, p_ptr->px, 10);
}
while (!(in_bounds(wy, wx) && cave_floor_bold(wy, wx)) && --attempts);
@@ -124,12 +124,17 @@ bool set_parasite(int v, int r)
}
/*
- * Set "p_ptr->tim_project" and others
- * notice observable changes
+ * Set a simple player field.
*/
-bool set_project(int v, s16b gf, s16b dam, s16b rad, s16b flag)
+static bool_ set_simple_field(
+ s16b *p_field,
+ s16b v,
+ byte activate_color,
+ cptr activate_msg,
+ byte deactivate_color,
+ cptr deactivate_msg)
{
- bool notice = FALSE;
+ bool_ notice = FALSE;
/* Hack -- Force good values */
v = (v > 10000) ? 10000 : (v < 0) ? 0 : v;
@@ -137,9 +142,9 @@ bool set_project(int v, s16b gf, s16b dam, s16b rad, s16b flag)
/* Open */
if (v)
{
- if (!p_ptr->tim_project)
+ if (!*p_field)
{
- msg_print("Your weapon starts glowing.");
+ cmsg_print(activate_color, activate_msg);
notice = TRUE;
}
}
@@ -147,19 +152,15 @@ bool set_project(int v, s16b gf, s16b dam, s16b rad, s16b flag)
/* Shut */
else
{
- if (p_ptr->tim_project)
+ if (*p_field)
{
- msg_print("Your weapon stops glowing.");
+ cmsg_print(deactivate_color, deactivate_msg);
notice = TRUE;
}
}
/* Use the value */
- p_ptr->tim_project = v;
- p_ptr->tim_project_gf = gf;
- p_ptr->tim_project_dam = dam;
- p_ptr->tim_project_rad = rad;
- p_ptr->tim_project_flag = flag;
+ *p_field = v;
/* Nothing to notice */
if (!notice)
@@ -177,1009 +178,292 @@ bool set_project(int v, s16b gf, s16b dam, s16b rad, s16b flag)
}
/*
- * Set "p_ptr->tim_roots" and others
+ * Set "p_ptr->tim_project" and others
* notice observable changes
*/
-bool set_roots(int v, s16b ac, s16b dam)
+bool_ set_project(int v, s16b gf, s16b dam, s16b rad, s16b flag)
{
- bool notice = FALSE;
+ bool_ notice = set_simple_field(
+ &p_ptr->tim_project, v,
+ TERM_WHITE, "Your weapon starts glowing.",
+ TERM_WHITE, "Your weapon stops glowing.");
- /* Hack -- Force good values */
- v = (v > 10000) ? 10000 : (v < 0) ? 0 : v;
+ /* Use the values */
+ p_ptr->tim_project_gf = gf;
+ p_ptr->tim_project_dam = dam;
+ p_ptr->tim_project_rad = rad;
+ p_ptr->tim_project_flag = flag;
- /* Open */
- if (v)
- {
- if (!p_ptr->tim_roots)
- {
- msg_print("Roots dive into the floor from your feet.");
- notice = TRUE;
- }
- }
+ /* Result */
+ return notice;
+}
- /* Shut */
- else
- {
- if (p_ptr->tim_roots)
- {
- msg_print("The roots of your feet suddenly vanish.");
- notice = TRUE;
- }
- }
+/*
+ * Set "p_ptr->tim_roots" and others
+ * notice observable changes
+ */
+bool_ set_roots(int v, s16b ac, s16b dam)
+{
+ bool_ notice = set_simple_field(
+ &p_ptr->tim_roots, v,
+ TERM_WHITE, "Roots dive into the floor from your feet.",
+ TERM_WHITE, "The roots of your feet suddenly vanish.");
- /* Use the value */
- p_ptr->tim_roots = v;
+ /* Use the values */
p_ptr->tim_roots_dam = dam;
p_ptr->tim_roots_ac = ac;
- /* Nothing to notice */
- if (!notice)
- return (FALSE);
-
- /* Disturb */
- if (disturb_state)
- disturb(0, 0);
-
- /* Recalculate bonuses */
- p_ptr->update |= (PU_BONUS);
-
/* Result */
- return (TRUE);
+ return notice;
}
/*
* Set "p_ptr->tim_(magic|water)_breath" and others
* notice observable changes
*/
-bool set_tim_breath(int v, bool magical)
+bool_ set_tim_breath(int v, bool_ magical)
{
- bool notice = FALSE;
-
- /* Hack -- Force good values */
- v = (v > 10000) ? 10000 : (v < 0) ? 0 : v;
-
- /* Open */
- if (v)
+ if (magical)
{
- if (magical)
- {
- if (!p_ptr->tim_magic_breath)
- {
- msg_print("Air seems to fill your lungs without breathing.");
- notice = TRUE;
- }
- }
- else
- {
- if (!p_ptr->tim_water_breath)
- {
- msg_print("Water seems to fill your lungs.");
- notice = TRUE;
- }
- }
+ return set_simple_field(
+ &p_ptr->tim_magic_breath, v,
+ TERM_WHITE, "Air seems to fill your lungs without breathing.",
+ TERM_WHITE, "You need to breathe again.");
}
-
- /* Shut */
else
{
- if (magical)
- {
- if (p_ptr->tim_magic_breath)
- {
- msg_print("You need to breathe again.");
- notice = TRUE;
- }
- }
- else
- {
- if (p_ptr->tim_water_breath)
- {
- msg_print("The water filling your lungs evaporates.");
- notice = TRUE;
- }
- }
+ return set_simple_field(
+ &p_ptr->tim_water_breath, v,
+ TERM_WHITE, "Water seems to fill your lungs.",
+ TERM_WHITE, "The water filling your lungs evaporates.");
}
-
- /* Use the value */
- if (magical)
- p_ptr->tim_magic_breath = v;
- else
- p_ptr->tim_water_breath = v;
-
- /* Nothing to notice */
- if (!notice)
- return (FALSE);
-
- /* Disturb */
- if (disturb_state)
- disturb(0, 0);
-
- /* Recalculate bonuses */
- p_ptr->update |= (PU_BONUS);
-
- /* Result */
- return (TRUE);
}
/*
* Set "p_ptr->absorb_soul"
* notice observable changes
*/
-bool set_absorb_soul(int v)
+bool_ set_absorb_soul(int v)
{
- bool notice = FALSE;
-
- /* Hack -- Force good values */
- v = (v > 10000) ? 10000 : (v < 0) ? 0 : v;
-
- /* Open */
- if (v)
- {
- if (!p_ptr->absorb_soul)
- {
- cmsg_print(TERM_L_DARK, "You start absorbing the souls of your foes.");
- notice = TRUE;
- }
- }
-
- /* Shut */
- else
- {
- if (p_ptr->absorb_soul)
- {
- cmsg_print(TERM_L_DARK, "You stop absorbing the souls of dead foes.");
- notice = TRUE;
- }
- }
-
- /* Use the value */
- p_ptr->absorb_soul = v;
-
- /* Nothing to notice */
- if (!notice)
- return (FALSE);
-
- /* Disturb */
- if (disturb_state)
- disturb(0, 0);
-
- /* Recalculate bonuses */
- p_ptr->update |= (PU_BONUS);
-
- /* Result */
- return (TRUE);
+ return set_simple_field(
+ &p_ptr->absorb_soul, v,
+ TERM_L_DARK, "You start absorbing the souls of your foes.",
+ TERM_L_DARK, "You stop absorbing the souls of dead foes.");
}
/*
* Set "p_ptr->disrupt_shield"
* notice observable changes
*/
-bool set_disrupt_shield(int v)
+bool_ set_disrupt_shield(int v)
{
- bool notice = FALSE;
-
- /* Hack -- Force good values */
- v = (v > 10000) ? 10000 : (v < 0) ? 0 : v;
-
- /* Open */
- if (v)
- {
- if (!p_ptr->disrupt_shield)
- {
- cmsg_print(TERM_L_BLUE, "You feel invulnerable.");
- notice = TRUE;
- }
- }
-
- /* Shut */
- else
- {
- if (p_ptr->disrupt_shield)
- {
- cmsg_print(TERM_L_RED, "You are more vulnerable.");
- notice = TRUE;
- }
- }
-
- /* Use the value */
- p_ptr->disrupt_shield = v;
-
- /* Nothing to notice */
- if (!notice)
- return (FALSE);
-
- /* Disturb */
- if (disturb_state)
- disturb(0, 0);
-
- /* Recalculate bonuses */
- p_ptr->update |= (PU_BONUS);
-
- /* Result */
- return (TRUE);
+ return set_simple_field(
+ &p_ptr->disrupt_shield, v,
+ TERM_L_BLUE, "You feel invulnerable.",
+ TERM_L_RED, "You are more vulnerable.");
}
/*
* Set "p_ptr->prob_travel"
* notice observable changes
*/
-bool set_prob_travel(int v)
+bool_ set_prob_travel(int v)
{
- bool notice = FALSE;
-
- /* Hack -- Force good values */
- v = (v > 10000) ? 10000 : (v < 0) ? 0 : v;
-
- /* Open */
- if (v)
- {
- if (!p_ptr->prob_travel)
- {
- msg_print("You feel instable.");
- notice = TRUE;
- }
- }
-
- /* Shut */
- else
- {
- if (p_ptr->prob_travel)
- {
- msg_print("You are more stable.");
- notice = TRUE;
- }
- }
-
- /* Use the value */
- p_ptr->prob_travel = v;
-
- /* Nothing to notice */
- if (!notice)
- return (FALSE);
-
- /* Disturb */
- if (disturb_state)
- disturb(0, 0);
-
- /* Recalculate bonuses */
- p_ptr->update |= (PU_BONUS);
-
- /* Result */
- return (TRUE);
+ return set_simple_field(
+ &p_ptr->prob_travel, v,
+ TERM_WHITE, "You feel instable.",
+ TERM_WHITE, "You are more stable.");
}
/*
* Set "p_ptr->tim_invis", and "p_ptr->tim_inv_pow",
* notice observable changes
*/
-bool set_invis(int v, int p)
+bool_ set_invis(int v, int p)
{
- bool notice = FALSE;
-
- /* Hack -- Force good values */
- v = (v > 10000) ? 10000 : (v < 0) ? 0 : v;
-
- /* Open */
- if (v)
- {
- if (!p_ptr->tim_invisible)
- {
- msg_print("You feel your body fade away.");
- notice = TRUE;
- }
- }
-
- /* Shut */
- else
- {
- if (p_ptr->tim_invisible)
- {
- msg_print("You are no longer invisible.");
- notice = TRUE;
- p = 0;
- }
- }
+ bool_ notice = set_simple_field(
+ &p_ptr->tim_invisible, v,
+ TERM_WHITE, "You feel your body fade away.",
+ TERM_WHITE, "You are no longer invisible.");
- /* Use the value */
- p_ptr->tim_invisible = v;
+ /* Use the power value */
p_ptr->tim_inv_pow = p;
- /* Nothing to notice */
- if (!notice)
- return (FALSE);
-
- /* Disturb */
- if (disturb_state)
- disturb(0, 0);
-
- /* Recalculate bonuses */
- p_ptr->update |= (PU_BONUS);
-
/* Result */
- return (TRUE);
+ return notice;
}
/*
* Set "p_ptr->tim_poison",
* notice observable changes
*/
-bool set_poison(int v)
+bool_ set_poison(int v)
{
- bool notice = FALSE;
-
- /* Hack -- Force good values */
- v = (v > 10000) ? 10000 : (v < 0) ? 0 : v;
-
- /* Open */
- if (v)
- {
- if (!p_ptr->tim_poison)
- {
- msg_print("Your hands are dripping with venom.");
- notice = TRUE;
- }
- }
-
- /* Shut */
- else
- {
- if (p_ptr->tim_poison)
- {
- msg_print("The venom source dries out.");
- notice = TRUE;
- }
- }
-
- /* Use the value */
- p_ptr->tim_poison = v;
-
- /* Nothing to notice */
- if (!notice)
- return (FALSE);
-
- /* Disturb */
- if (disturb_state)
- disturb(0, 0);
-
- /* Recalculate bonuses */
- p_ptr->update |= (PU_BONUS);
-
- /* Result */
- return (TRUE);
+ return set_simple_field(
+ &p_ptr->tim_poison, v,
+ TERM_WHITE, "Your hands are dripping with venom.",
+ TERM_WHITE, "The venom source dries out.");
}
/*
* Set "no_breeds"
*/
-bool set_no_breeders(int v)
+bool_ set_no_breeders(int v)
{
- bool notice = FALSE;
-
- /* Hack -- Force good values */
- v = (v > 10000) ? 10000 : (v < 0) ? 0 : v;
-
- /* Open */
- if (v)
- {
- if (!no_breeds)
- {
- msg_print("You feel an anti-sexual aura.");
- notice = TRUE;
- }
- }
-
- /* Shut */
- else
- {
- if (no_breeds)
- {
- msg_print("You no longer feel an anti-sexual aura.");
- notice = TRUE;
- }
- }
-
- /* Use the value */
- no_breeds = v;
-
- /* Nothing to notice */
- if (!notice)
- return (FALSE);
-
- /* Disturb */
- if (disturb_state)
- disturb(0, 0);
-
- /* Recalculate bonuses */
- p_ptr->update |= (PU_BONUS);
-
- /* Result */
- return (TRUE);
+ return set_simple_field(
+ &no_breeds, v,
+ TERM_WHITE, "You feel an anti-sexual aura.",
+ TERM_WHITE, "You no longer feel an anti-sexual aura.");
}
/*
* Set "p_ptr->tim_deadly"
*/
-bool set_tim_deadly(int v)
+bool_ set_tim_deadly(int v)
{
- bool notice = FALSE;
-
- /* Hack -- Force good values */
- v = (v > 10000) ? 10000 : (v < 0) ? 0 : v;
-
- /* Open */
- if (v)
- {
- if (!p_ptr->tim_deadly)
- {
- msg_print("You feel extremely accurate.");
- notice = TRUE;
- }
- }
-
- /* Shut */
- else
- {
- if (p_ptr->tim_deadly)
- {
- msg_print("You are suddenly much less accurate.");
- notice = TRUE;
- }
- }
-
- /* Use the value */
- p_ptr->tim_deadly = v;
-
- /* Nothing to notice */
- if (!notice)
- return (FALSE);
-
- /* Disturb */
- if (disturb_state)
- disturb(0, 0);
-
- /* Recalculate bonuses */
- p_ptr->update |= (PU_BONUS);
-
- /* Result */
- return (TRUE);
+ return set_simple_field(
+ &p_ptr->tim_deadly, v,
+ TERM_WHITE, "You feel extremely accurate.",
+ TERM_WHITE, "You are suddenly much less accurate.");
}
/*
* Set "p_ptr->tim_ffall"
*/
-bool set_tim_ffall(int v)
+bool_ set_tim_ffall(int v)
{
- bool notice = FALSE;
-
- /* Hack -- Force good values */
- v = (v > 10000) ? 10000 : (v < 0) ? 0 : v;
-
- /* Open */
- if (v)
- {
- if (!p_ptr->tim_ffall)
- {
- msg_print("You feel very light.");
- notice = TRUE;
- }
- }
-
- /* Shut */
- else
- {
- if (p_ptr->tim_ffall)
- {
- msg_print("You are suddenly heavier.");
- notice = TRUE;
- }
- }
-
- /* Use the value */
- p_ptr->tim_ffall = v;
-
- /* Nothing to notice */
- if (!notice)
- return (FALSE);
-
- /* Disturb */
- if (disturb_state)
- disturb(0, 0);
-
- /* Recalculate bonuses */
- p_ptr->update |= (PU_BONUS);
-
- /* Result */
- return (TRUE);
+ return set_simple_field(
+ &p_ptr->tim_ffall, v,
+ TERM_WHITE, "You feel very light.",
+ TERM_WHITE, "You are suddenly heavier.");
}
/*
* Set "p_ptr->tim_fly"
*/
-bool set_tim_fly(int v)
+bool_ set_tim_fly(int v)
{
- bool notice = FALSE;
-
- /* Hack -- Force good values */
- v = (v > 10000) ? 10000 : (v < 0) ? 0 : v;
-
- /* Open */
- if (v)
- {
- if (!p_ptr->tim_fly)
- {
- msg_print("You feel able to reach the clouds.");
- notice = TRUE;
- }
- }
-
- /* Shut */
- else
- {
- if (p_ptr->tim_fly)
- {
- msg_print("You are suddenly a lot heavier.");
- notice = TRUE;
- }
- }
-
- /* Use the value */
- p_ptr->tim_fly = v;
-
- /* Nothing to notice */
- if (!notice)
- return (FALSE);
-
- /* Disturb */
- if (disturb_state)
- disturb(0, 0);
-
- /* Recalculate bonuses */
- p_ptr->update |= (PU_BONUS);
-
- /* Result */
- return (TRUE);
+ return set_simple_field(
+ &p_ptr->tim_fly, v,
+ TERM_WHITE, "You feel able to reach the clouds.",
+ TERM_WHITE, "You are suddenly a lot heavier.");
}
/*
* Set "p_ptr->meditation"
*/
-bool set_meditation(int v)
+bool_ set_meditation(int v)
{
- bool notice = FALSE;
-
- /* Hack -- Force good values */
- v = (v > 10000) ? 10000 : (v < 0) ? 0 : v;
+ bool_ notice = set_simple_field(
+ &p_ptr->meditation, v,
+ TERM_WHITE, "You start meditating on yourself...",
+ TERM_WHITE, "You stop your self meditation.");
- /* Open */
- if (v)
+ /* Recalculate bonuses */
+ if (notice)
{
- if (!p_ptr->meditation)
- {
- msg_print("You start meditating on yourself...");
- notice = TRUE;
- }
+ p_ptr->update |= (PU_MANA);
}
- /* Shut */
- else
- {
- if (p_ptr->meditation)
- {
- msg_print("You stop your self meditation.");
- notice = TRUE;
- }
- }
-
- /* Use the value */
- p_ptr->meditation = v;
-
- /* Nothing to notice */
- if (!notice)
- return (FALSE);
-
- /* Disturb */
- if (disturb_state)
- disturb(0, 0);
-
- /* Recalculate bonuses */
- p_ptr->update |= (PU_BONUS);
- p_ptr->update |= (PU_MANA);
-
/* Result */
- return (TRUE);
+ return notice;
}
/*
* Set "p_ptr->tim_reflect"
*/
-bool set_tim_reflect(int v)
+bool_ set_tim_reflect(int v)
{
- bool notice = FALSE;
-
- /* Hack -- Force good values */
- v = (v > 10000) ? 10000 : (v < 0) ? 0 : v;
-
- /* Open */
- if (v)
- {
- if (!p_ptr->tim_reflect)
- {
- msg_print("You start reflecting the world around you.");
- notice = TRUE;
- }
- }
-
- /* Shut */
- else
- {
- if (p_ptr->tim_reflect)
- {
- msg_print("You stop reflecting.");
- notice = TRUE;
- }
- }
-
- /* Use the value */
- p_ptr->tim_reflect = v;
-
- /* Nothing to notice */
- if (!notice)
- return (FALSE);
-
- /* Disturb */
- if (disturb_state)
- disturb(0, 0);
-
- /* Recalculate bonuses */
- p_ptr->update |= (PU_BONUS);
-
- /* Result */
- return (TRUE);
+ return set_simple_field(
+ &p_ptr->tim_reflect, v,
+ TERM_WHITE, "You start reflecting the world around you.",
+ TERM_WHITE, "You stop reflecting.");
}
/*
* Set "p_ptr->tim_res_time"
*/
-bool set_tim_res_time(int v)
+bool_ set_tim_res_time(int v)
{
- bool notice = FALSE;
-
- /* Hack -- Force good values */
- v = (v > 10000) ? 10000 : (v < 0) ? 0 : v;
-
- /* Open */
- if (v)
- {
- if (!p_ptr->tim_res_time)
- {
- msg_print("You are now protected against space-time distortions.");
- notice = TRUE;
- }
- }
-
- /* Shut */
- else
- {
- if (p_ptr->tim_res_time)
- {
- msg_print("You are no longer protected against space-time distortions.");
- notice = TRUE;
- }
- }
-
- /* Use the value */
- p_ptr->tim_res_time = v;
-
- /* Nothing to notice */
- if (!notice)
- return (FALSE);
-
- /* Disturb */
- if (disturb_state)
- disturb(0, 0);
-
- /* Recalculate bonuses */
- p_ptr->update |= (PU_BONUS);
-
- /* Result */
- return (TRUE);
+ return set_simple_field(
+ &p_ptr->tim_res_time, v,
+ TERM_WHITE, "You are now protected against space-time distortions.",
+ TERM_WHITE, "You are no longer protected against space-time distortions.");
}
/*
* Set "p_ptr->tim_fire_aura"
*/
-bool set_tim_fire_aura(int v)
+bool_ set_tim_fire_aura(int v)
{
- bool notice = FALSE;
-
- /* Hack -- Force good values */
- v = (v > 10000) ? 10000 : (v < 0) ? 0 : v;
-
- /* Open */
- if (v)
- {
- if (!p_ptr->tim_fire_aura)
- {
- msg_print("You are enveloped in flames.");
- notice = TRUE;
- }
- }
-
- /* Shut */
- else
- {
- if (p_ptr->tim_fire_aura)
- {
- msg_print("You are no longer enveloped in flames.");
- notice = TRUE;
- }
- }
-
- /* Use the value */
- p_ptr->tim_fire_aura = v;
-
- /* Nothing to notice */
- if (!notice)
- return (FALSE);
-
- /* Disturb */
- if (disturb_state)
- disturb(0, 0);
-
- /* Recalculate bonuses */
- p_ptr->update |= (PU_BONUS);
-
- /* Result */
- return (TRUE);
+ return set_simple_field(
+ &p_ptr->tim_fire_aura, v,
+ TERM_WHITE, "You are enveloped in flames.",
+ TERM_WHITE, "You are no longer enveloped in flames.");
}
/*
* Set "p_ptr->strike"
*/
-bool set_strike(int v)
+bool_ set_strike(int v)
{
- bool notice = FALSE;
-
- /* Hack -- Force good values */
- v = (v > 10000) ? 10000 : (v < 0) ? 0 : v;
-
- /* Open */
- if (v)
- {
- if (!p_ptr->strike)
- {
- msg_print("You feel very accurate.");
- notice = TRUE;
- }
- }
-
- /* Shut */
- else
- {
- if (p_ptr->strike)
- {
- msg_print("You are no longer very accurate.");
- notice = TRUE;
- }
- }
-
- /* Use the value */
- p_ptr->strike = v;
-
- /* Nothing to notice */
- if (!notice)
- return (FALSE);
-
- /* Disturb */
- if (disturb_state)
- disturb(0, 0);
-
- /* Recalculate bonuses */
- p_ptr->update |= (PU_BONUS);
-
- /* Result */
- return (TRUE);
+ return set_simple_field(
+ &p_ptr->strike, v,
+ TERM_WHITE, "You feel very accurate.",
+ TERM_WHITE, "You are no longer very accurate.");
}
/*
* Set "p_ptr->oppose_ld"
*/
-bool set_oppose_ld(int v)
+bool_ set_oppose_ld(int v)
{
- bool notice = FALSE;
-
- /* Hack -- Force good values */
- v = (v > 10000) ? 10000 : (v < 0) ? 0 : v;
-
- /* Open */
- if (v)
- {
- if (!p_ptr->oppose_ld)
- {
- msg_print("You feel protected against light's fluctuation.");
- notice = TRUE;
- }
- }
-
- /* Shut */
- else
- {
- if (p_ptr->oppose_ld)
- {
- msg_print("You are no longer protected against light's fluctuation.");
- notice = TRUE;
- }
- }
-
- /* Use the value */
- p_ptr->oppose_ld = v;
-
- /* Nothing to notice */
- if (!notice)
- return (FALSE);
-
- /* Disturb */
- if (disturb_state)
- disturb(0, 0);
-
- /* Recalculate bonuses */
- p_ptr->update |= (PU_BONUS);
-
- /* Result */
- return (TRUE);
+ return set_simple_field(
+ &p_ptr->oppose_ld, v,
+ TERM_WHITE, "You feel protected against light's fluctuation.",
+ TERM_WHITE, "You are no longer protected against light's fluctuation.");
}
/*
* Set "p_ptr->oppose_cc"
*/
-bool set_oppose_cc(int v)
+bool_ set_oppose_cc(int v)
{
- bool notice = FALSE;
-
- /* Hack -- Force good values */
- v = (v > 10000) ? 10000 : (v < 0) ? 0 : v;
-
- /* Open */
- if (v)
- {
- if (!p_ptr->oppose_cc)
- {
- msg_print("You feel protected against raw chaos.");
- notice = TRUE;
- }
- }
-
- /* Shut */
- else
- {
- if (p_ptr->oppose_cc)
- {
- msg_print("You are no longer protected against chaos.");
- notice = TRUE;
- }
- }
-
- /* Use the value */
- p_ptr->oppose_cc = v;
-
- /* Nothing to notice */
- if (!notice)
- return (FALSE);
-
- /* Disturb */
- if (disturb_state)
- disturb(0, 0);
-
- /* Recalculate bonuses */
- p_ptr->update |= (PU_BONUS);
-
- /* Result */
- return (TRUE);
+ return set_simple_field(
+ &p_ptr->oppose_cc, v,
+ TERM_WHITE, "You feel protected against raw chaos.",
+ TERM_WHITE, "You are no longer protected against chaos.");
}
/*
* Set "p_ptr->oppose_ss"
*/
-bool set_oppose_ss(int v)
+bool_ set_oppose_ss(int v)
{
- bool notice = FALSE;
-
- /* Hack -- Force good values */
- v = (v > 10000) ? 10000 : (v < 0) ? 0 : v;
-
- /* Open */
- if (v)
- {
- if (!p_ptr->oppose_ss)
- {
- msg_print("You feel protected against the ravages of sound and shards.");
- notice = TRUE;
- }
- }
-
- /* Shut */
- else
- {
- if (p_ptr->oppose_ss)
- {
- msg_print("You are no longer protected against the ravages of sound and shards.");
- notice = TRUE;
- }
- }
-
- /* Use the value */
- p_ptr->oppose_ss = v;
-
- /* Nothing to notice */
- if (!notice)
- return (FALSE);
-
- /* Disturb */
- if (disturb_state)
- disturb(0, 0);
-
- /* Recalculate bonuses */
- p_ptr->update |= (PU_BONUS);
-
- /* Result */
- return (TRUE);
+ return set_simple_field(
+ &p_ptr->oppose_ss, v,
+ TERM_WHITE, "You feel protected against the ravages of sound and shards.",
+ TERM_WHITE, "You are no longer protected against the ravages of sound and shards.");
}
/*
* Set "p_ptr->oppose_nex"
*/
-bool set_oppose_nex(int v)
+bool_ set_oppose_nex(int v)
{
- bool notice = FALSE;
-
- /* Hack -- Force good values */
- v = (v > 10000) ? 10000 : (v < 0) ? 0 : v;
-
- /* Open */
- if (v)
- {
- if (!p_ptr->oppose_nex)
- {
- msg_print("You feel protected against the strange forces of nexus.");
- notice = TRUE;
- }
- }
-
- /* Shut */
- else
- {
- if (p_ptr->oppose_nex)
- {
- msg_print("You are no longer protected against the strange forces of nexus.");
- notice = TRUE;
- }
- }
-
- /* Use the value */
- p_ptr->oppose_nex = v;
-
- /* Nothing to notice */
- if (!notice)
- return (FALSE);
-
- /* Disturb */
- if (disturb_state)
- disturb(0, 0);
-
- /* Recalculate bonuses */
- p_ptr->update |= (PU_BONUS);
-
- /* Result */
- return (TRUE);
+ return set_simple_field(
+ &p_ptr->oppose_nex, v,
+ TERM_WHITE, "You feel protected against the strange forces of nexus.",
+ TERM_WHITE, "You are no longer protected against the strange forces of nexus.");
}
/*
* Set "p_ptr->tim_mimic", and "p_ptr->mimic_form",
* notice observable changes
*/
-bool set_mimic(int v, int p, int level)
+bool_ set_mimic(int v, int p, int level)
{
- bool notice = FALSE;
+ bool_ notice = FALSE;
/* Hack -- Force good values */
v = (v > 10000) ? 10000 : (v < 0) ? 0 : v;
@@ -1240,59 +524,33 @@ bool set_mimic(int v, int p, int level)
* Note that blindness is currently the only thing which can affect
* "player_can_see_bold()".
*/
-bool set_blind(int v)
+bool_ set_blind(int v)
{
- bool notice = FALSE;
-
- /* Hack -- Force good values */
- v = (v > 10000) ? 10000 : (v < 0) ? 0 : v;
+ bool_ notice = set_simple_field(
+ &p_ptr->blind, v,
+ TERM_WHITE, "You are blind!",
+ TERM_WHITE, "You can see again.");
- /* Open */
- if (v)
+ if (notice)
{
- if (!p_ptr->blind)
- {
- msg_print("You are blind!");
- notice = TRUE;
- }
- }
-
- /* Shut */
- else
- {
- if (p_ptr->blind)
- {
- msg_print("You can see again.");
- notice = TRUE;
- }
- }
-
- /* Use the value */
- p_ptr->blind = v;
-
- /* Nothing to notice */
- if (!notice) return (FALSE);
-
- /* Disturb */
- if (disturb_state) disturb(0, 0);
-
- /* Fully update the visuals */
- p_ptr->update |= (PU_UN_VIEW | PU_VIEW | PU_MONSTERS | PU_MON_LITE);
+ /* Fully update the visuals */
+ p_ptr->update |= (PU_UN_VIEW | PU_VIEW | PU_MONSTERS | PU_MON_LITE);
- /* Redraw map */
- p_ptr->redraw |= (PR_MAP);
+ /* Redraw map */
+ p_ptr->redraw |= (PR_MAP);
- /* Redraw the "blind" */
- p_ptr->redraw |= (PR_BLIND);
+ /* Redraw the "blind" */
+ p_ptr->redraw |= (PR_BLIND);
- /* Window stuff */
- p_ptr->window |= (PW_OVERHEAD);
+ /* Window stuff */
+ p_ptr->window |= (PW_OVERHEAD);
- /* Handle stuff */
- handle_stuff();
+ /* Handle stuff */
+ handle_stuff();
+ }
/* Result */
- return (TRUE);
+ return notice;
}
/*
@@ -1303,255 +561,126 @@ bool set_blind(int v)
* Note that blindness is currently the only thing which can affect
* "player_can_see_bold()".
*/
-bool set_lite(int v)
+bool_ set_lite(int v)
{
- bool notice = FALSE;
-
- /* Hack -- Force good values */
- v = (v > 10000) ? 10000 : (v < 0) ? 0 : v;
+ bool_ notice = set_simple_field(
+ &p_ptr->tim_lite, v,
+ TERM_WHITE, "You suddenly seem brighter!",
+ TERM_WHITE, "You are no longer bright.");
- /* Open */
- if (v)
- {
- if (!p_ptr->tim_lite)
- {
- msg_print("You suddenly seem brighter!");
- notice = TRUE;
- }
- }
-
- /* Shut */
- else
+ if (notice)
{
- if (p_ptr->tim_lite)
- {
- msg_print("You are no longer bright.");
- notice = TRUE;
- }
- }
+ /* Fully update the visuals */
+ p_ptr->update |= (PU_VIEW | PU_MONSTERS);
- /* Use the value */
- p_ptr->tim_lite = v;
-
- /* Nothing to notice */
- if (!notice) return (FALSE);
-
- /* Disturb */
- if (disturb_state) disturb(0, 0);
-
- /* Fully update the visuals */
- p_ptr->update |= (PU_VIEW | PU_MONSTERS);
-
- /* Redraw map */
- p_ptr->redraw |= (PR_MAP);
+ /* Redraw map */
+ p_ptr->redraw |= (PR_MAP);
- /* Window stuff */
- p_ptr->window |= (PW_OVERHEAD);
+ /* Window stuff */
+ p_ptr->window |= (PW_OVERHEAD);
- /* Handle stuff */
- handle_stuff();
+ /* Handle stuff */
+ handle_stuff();
+ }
/* Result */
- return (TRUE);
+ return notice;
}
/*
* Set "p_ptr->confused", notice observable changes
*/
-bool set_confused(int v)
+bool_ set_confused(int v)
{
- bool notice = FALSE;
+ bool_ notice =
+ set_simple_field(
+ &p_ptr->confused, v,
+ TERM_WHITE, "You are confused!",
+ TERM_WHITE, "You feel less confused now.");
- /* Hack -- Force good values */
- v = (v > 10000) ? 10000 : (v < 0) ? 0 : v;
-
- /* Open */
- if (v)
+ if (notice)
{
- if (!p_ptr->confused)
- {
- msg_print("You are confused!");
- notice = TRUE;
- }
- }
+ /* Redraw the "confused" */
+ p_ptr->redraw |= (PR_CONFUSED);
- /* Shut */
- else
- {
- if (p_ptr->confused)
- {
- msg_print("You feel less confused now.");
- notice = TRUE;
- }
+ /* Handle stuff */
+ handle_stuff();
}
- /* Use the value */
- p_ptr->confused = v;
-
- /* Nothing to notice */
- if (!notice) return (FALSE);
-
- /* Disturb */
- if (disturb_state) disturb(0, 0);
-
- /* Redraw the "confused" */
- p_ptr->redraw |= (PR_CONFUSED);
-
- /* Handle stuff */
- handle_stuff();
-
/* Result */
- return (TRUE);
+ return notice;
}
/*
* Set "p_ptr->poisoned", notice observable changes
*/
-bool set_poisoned(int v)
+bool_ set_poisoned(int v)
{
- bool notice = FALSE;
+ bool_ notice = set_simple_field(
+ &p_ptr->poisoned, v,
+ TERM_WHITE, "You are poisoned!",
+ TERM_WHITE, "You are no longer poisoned.");
- /* Hack -- Force good values */
- v = (v > 10000) ? 10000 : (v < 0) ? 0 : v;
-
- /* Open */
- if (v)
+ if (notice)
{
- if (!p_ptr->poisoned)
- {
- msg_print("You are poisoned!");
- notice = TRUE;
- }
- }
+ /* Redraw the "poisoned" */
+ p_ptr->redraw |= (PR_POISONED);
- /* Shut */
- else
- {
- if (p_ptr->poisoned)
- {
- msg_print("You are no longer poisoned.");
- notice = TRUE;
- }
+ /* Handle stuff */
+ handle_stuff();
}
- /* Use the value */
- p_ptr->poisoned = v;
-
- /* Nothing to notice */
- if (!notice) return (FALSE);
-
- /* Disturb */
- if (disturb_state) disturb(0, 0);
-
- /* Redraw the "poisoned" */
- p_ptr->redraw |= (PR_POISONED);
-
- /* Handle stuff */
- handle_stuff();
-
/* Result */
- return (TRUE);
+ return notice;
}
/*
* Set "p_ptr->afraid", notice observable changes
*/
-bool set_afraid(int v)
+bool_ set_afraid(int v)
{
- bool notice = FALSE;
-
- /* Hack -- Force good values */
- v = (v > 10000) ? 10000 : (v < 0) ? 0 : v;
+ bool_ notice = set_simple_field(
+ &p_ptr->afraid, v,
+ TERM_WHITE, "You are terrified!",
+ TERM_WHITE, "You feel bolder now.");
- /* Open */
- if (v)
+ if (notice)
{
- if (!p_ptr->afraid)
- {
- msg_print("You are terrified!");
- notice = TRUE;
- }
- }
+ /* Redraw the "afraid" */
+ p_ptr->redraw |= (PR_AFRAID);
- /* Shut */
- else
- {
- if (p_ptr->afraid)
- {
- msg_print("You feel bolder now.");
- notice = TRUE;
- }
+ /* Handle stuff */
+ handle_stuff();
}
- /* Use the value */
- p_ptr->afraid = v;
-
- /* Nothing to notice */
- if (!notice) return (FALSE);
-
- /* Disturb */
- if (disturb_state) disturb(0, 0);
-
- /* Redraw the "afraid" */
- p_ptr->redraw |= (PR_AFRAID);
-
- /* Handle stuff */
- handle_stuff();
-
/* Result */
- return (TRUE);
+ return notice;
}
/*
* Set "p_ptr->paralyzed", notice observable changes
*/
-bool set_paralyzed(int v)
+bool_ set_paralyzed(int v)
{
- bool notice = FALSE;
-
- /* Hack -- Force good values */
- v = (v > 10000) ? 10000 : (v < 0) ? 0 : v;
+ bool_ notice = set_simple_field(
+ &p_ptr->paralyzed, v,
+ TERM_WHITE, "You are paralyzed!",
+ TERM_WHITE, "You can move again.");
- /* Open */
- if (v)
+ if (notice)
{
- if (!p_ptr->paralyzed)
- {
- msg_print("You are paralyzed!");
- notice = TRUE;
- }
- }
+ /* Redraw the state */
+ p_ptr->redraw |= (PR_STATE);
- /* Shut */
- else
- {
- if (p_ptr->paralyzed)
- {
- msg_print("You can move again.");
- notice = TRUE;
- }
+ /* Handle stuff */
+ handle_stuff();
}
- /* Use the value */
- p_ptr->paralyzed = v;
-
- /* Nothing to notice */
- if (!notice) return (FALSE);
-
- /* Disturb */
- if (disturb_state) disturb(0, 0);
-
- /* Redraw the state */
- p_ptr->redraw |= (PR_STATE);
-
- /* Handle stuff */
- handle_stuff();
-
/* Result */
- return (TRUE);
+ return notice;
}
@@ -1560,110 +689,56 @@ bool set_paralyzed(int v)
*
* Note that we must redraw the map when hallucination changes.
*/
-bool set_image(int v)
+bool_ set_image(int v)
{
- bool notice = FALSE;
+ bool_ notice = set_simple_field(
+ &p_ptr->image, v,
+ TERM_WHITE, "Oh, wow! Everything looks so cosmic now!",
+ TERM_WHITE, "You can see clearly again.");
- /* Hack -- Force good values */
- v = (v > 10000) ? 10000 : (v < 0) ? 0 : v;
-
- /* Open */
- if (v)
+ if (notice)
{
- if (!p_ptr->image)
- {
- msg_print("Oh, wow! Everything looks so cosmic now!");
- notice = TRUE;
- }
- }
-
- /* Shut */
- else
- {
- if (p_ptr->image)
- {
- msg_print("You can see clearly again.");
- notice = TRUE;
- }
- }
-
- /* Use the value */
- p_ptr->image = v;
-
- /* Nothing to notice */
- if (!notice) return (FALSE);
-
- /* Disturb */
- if (disturb_state) disturb(0, 0);
-
- /* Redraw map */
- p_ptr->redraw |= (PR_MAP);
+ /* Redraw map */
+ p_ptr->redraw |= (PR_MAP);
- /* Update monsters */
- p_ptr->update |= (PU_MONSTERS);
+ /* Update monsters */
+ p_ptr->update |= (PU_MONSTERS);
- /* Window stuff */
- p_ptr->window |= (PW_OVERHEAD | PW_M_LIST);
+ /* Window stuff */
+ p_ptr->window |= (PW_OVERHEAD | PW_M_LIST);
- /* Handle stuff */
- handle_stuff();
+ /* Handle stuff */
+ handle_stuff();
+ }
/* Result */
- return (TRUE);
+ return notice;
}
/*
* Set "p_ptr->lightspeed", notice observable changes
*/
-bool set_light_speed(int v)
+bool_ set_light_speed(int v)
{
- bool notice = FALSE;
+ bool_ notice =
+ set_simple_field(
+ &p_ptr->lightspeed, v,
+ TERM_WHITE, "You feel as if time has stopped!",
+ TERM_WHITE, "You feel time returning to its normal rate.");
- /* Hack -- Force good values */
- v = (v > 10000) ? 10000 : (v < 0) ? 0 : v;
-
- /* Open */
- if (v)
+ if (notice)
{
- if (!p_ptr->lightspeed)
- {
- msg_print("You feel as if time has stopped!");
- notice = TRUE;
- }
- }
-
- /* Shut */
- else
- {
- if (p_ptr->lightspeed)
- {
- msg_print("You feel time returning to its normal rate.");
- notice = TRUE;
- }
+ /* Handle stuff */
+ handle_stuff();
}
- /* Use the value */
- p_ptr->lightspeed = v;
-
- /* Nothing to notice */
- if (!notice) return (FALSE);
-
- /* Disturb */
- if (disturb_state) disturb(0, 0);
-
- /* Recalculate bonuses */
- p_ptr->update |= (PU_BONUS);
-
- /* Handle stuff */
- handle_stuff();
-
/* Result */
- return (TRUE);
+ return notice;
}
-bool set_fast(int v, int p)
+bool_ set_fast(int v, int p)
{
- bool notice = FALSE;
+ bool_ notice = FALSE;
/* Hack -- Force good values */
v = (v > 10000) ? 10000 : (v < 0) ? 0 : v;
@@ -1713,105 +788,49 @@ bool set_fast(int v, int p)
/*
* Set "p_ptr->slow", notice observable changes
*/
-bool set_slow(int v)
+bool_ set_slow(int v)
{
- bool notice = FALSE;
+ bool_ notice = set_simple_field(
+ &p_ptr->slow, v,
+ TERM_WHITE, "You feel yourself moving slower!",
+ TERM_WHITE, "You feel yourself speed up.");
- /* Hack -- Force good values */
- v = (v > 10000) ? 10000 : (v < 0) ? 0 : v;
-
- /* Open */
- if (v)
+ if (notice)
{
- if (!p_ptr->slow)
- {
- msg_print("You feel yourself moving slower!");
- notice = TRUE;
- }
- }
-
- /* Shut */
- else
- {
- if (p_ptr->slow)
- {
- msg_print("You feel yourself speed up.");
- notice = TRUE;
- }
+ /* Handle stuff */
+ handle_stuff();
}
- /* Use the value */
- p_ptr->slow = v;
-
- /* Nothing to notice */
- if (!notice) return (FALSE);
-
- /* Disturb */
- if (disturb_state) disturb(0, 0);
-
- /* Recalculate bonuses */
- p_ptr->update |= (PU_BONUS);
-
- /* Handle stuff */
- handle_stuff();
-
/* Result */
- return (TRUE);
+ return notice;
}
/*
* Set "p_ptr->shield", notice observable changes
*/
-bool set_shield(int v, int p, s16b o, s16b d1, s16b d2)
+bool_ set_shield(int v, int p, s16b o, s16b d1, s16b d2)
{
- bool notice = FALSE;
-
- /* Hack -- Force good values */
- v = (v > 10000) ? 10000 : (v < 0) ? 0 : v;
-
- /* Open */
- if (v)
- {
- if (!p_ptr->shield)
- {
- msg_print("A mystic shield forms around your body!");
- notice = TRUE;
- }
- }
-
- /* Shut */
- else
- {
- if (p_ptr->shield)
- {
- msg_print("Your mystic shield crumbles away.");
- notice = TRUE;
- p = 0;
- }
- }
+ bool_ notice = set_simple_field(
+ &p_ptr->shield, v,
+ TERM_WHITE, "A mystic shield forms around your body!",
+ TERM_WHITE, "Your mystic shield crumbles away.");
- /* Use the value */
- p_ptr->shield = v;
+ /* Use the values */
p_ptr->shield_power = p;
p_ptr->shield_opt = o;
p_ptr->shield_power_opt = d1;
p_ptr->shield_power_opt2 = d2;
- /* Nothing to notice */
- if (!notice) return (FALSE);
-
- /* Disturb */
- if (disturb_state) disturb(0, 0);
-
- /* Recalculate bonuses */
- p_ptr->update |= (PU_BONUS);
-
- /* Handle stuff */
- handle_stuff();
+ /* Notice? */
+ if (notice)
+ {
+ /* Handle stuff */
+ handle_stuff();
+ }
/* Result */
- return (TRUE);
+ return notice;
}
@@ -1819,485 +838,203 @@ bool set_shield(int v, int p, s16b o, s16b d1, s16b d2)
/*
* Set "p_ptr->blessed", notice observable changes
*/
-bool set_blessed(int v)
+bool_ set_blessed(int v)
{
- bool notice = FALSE;
+ bool_ notice = set_simple_field(
+ &p_ptr->blessed, v,
+ TERM_WHITE, "You feel righteous!",
+ TERM_WHITE, "The prayer has expired.");
- /* Hack -- Force good values */
- v = (v > 10000) ? 10000 : (v < 0) ? 0 : v;
-
- /* Open */
- if (v)
+ if (notice)
{
- if (!p_ptr->blessed)
- {
- msg_print("You feel righteous!");
- notice = TRUE;
- }
- }
-
- /* Shut */
- else
- {
- if (p_ptr->blessed)
- {
- msg_print("The prayer has expired.");
- notice = TRUE;
- }
+ /* Handle stuff */
+ handle_stuff();
}
- /* Use the value */
- p_ptr->blessed = v;
-
- /* Nothing to notice */
- if (!notice) return (FALSE);
-
- /* Disturb */
- if (disturb_state) disturb(0, 0);
-
- /* Recalculate bonuses */
- p_ptr->update |= (PU_BONUS);
-
- /* Handle stuff */
- handle_stuff();
-
/* Result */
- return (TRUE);
+ return notice;
}
/*
* Set "p_ptr->hero", notice observable changes
*/
-bool set_hero(int v)
+bool_ set_hero(int v)
{
- bool notice = FALSE;
-
- /* Hack -- Force good values */
- v = (v > 10000) ? 10000 : (v < 0) ? 0 : v;
+ bool_ notice = set_simple_field(
+ &p_ptr->hero, v,
+ TERM_WHITE, "You feel like a hero!",
+ TERM_WHITE, "The heroism wears off.");
- /* Open */
- if (v)
+ if (notice)
{
- if (!p_ptr->hero)
- {
- msg_print("You feel like a hero!");
- notice = TRUE;
- }
- }
+ /* Recalculate hitpoints */
+ p_ptr->update |= (PU_HP);
- /* Shut */
- else
- {
- if (p_ptr->hero)
- {
- msg_print("The heroism wears off.");
- notice = TRUE;
- }
+ /* Handle stuff */
+ handle_stuff();
}
- /* Use the value */
- p_ptr->hero = v;
-
- /* Nothing to notice */
- if (!notice) return (FALSE);
-
- /* Disturb */
- if (disturb_state) disturb(0, 0);
-
- /* Recalculate bonuses */
- p_ptr->update |= (PU_BONUS);
-
- /* Recalculate hitpoints */
- p_ptr->update |= (PU_HP);
-
- /* Handle stuff */
- handle_stuff();
-
/* Result */
- return (TRUE);
+ return notice;
}
/*
* Set "p_ptr->holy", notice observable changes
*/
-bool set_holy(int v)
+bool_ set_holy(int v)
{
- bool notice = FALSE;
+ bool_ notice = set_simple_field(
+ &p_ptr->holy, v,
+ TERM_WHITE, "You feel a holy aura around you!",
+ TERM_WHITE, "The holy aura vanishes.");
- /* Hack -- Force good values */
- v = (v > 10000) ? 10000 : (v < 0) ? 0 : v;
-
- /* Open */
- if (v)
+ if (notice)
{
- if (!p_ptr->holy)
- {
- msg_print("You feel a holy aura around you!");
- notice = TRUE;
- }
- }
-
- /* Shut */
- else
- {
- if (p_ptr->holy)
- {
- msg_print("The holy aura vanishes.");
- notice = TRUE;
- }
+ /* Handle stuff */
+ handle_stuff();
}
- /* Use the value */
- p_ptr->holy = v;
-
- /* Nothing to notice */
- if (!notice) return (FALSE);
-
- /* Disturb */
- if (disturb_state) disturb(0, 0);
-
- /* Recalculate bonuses */
- p_ptr->update |= (PU_BONUS);
-
- /* Handle stuff */
- handle_stuff();
-
/* Result */
- return (TRUE);
+ return notice;
}
/*
* Set "p_ptr->walk_water", notice observable changes
*/
-bool set_walk_water(int v)
+bool_ set_walk_water(int v)
{
- bool notice = FALSE;
-
- /* Hack -- Force good values */
- v = (v > 10000) ? 10000 : (v < 0) ? 0 : v;
-
- /* Open */
- if (v)
- {
- if (!p_ptr->walk_water)
- {
- msg_print("You feel strangely buoyant!");
- notice = TRUE;
- }
- }
+ bool_ notice = set_simple_field(
+ &p_ptr->walk_water, v,
+ TERM_WHITE, "You feel strangely buoyant!",
+ TERM_WHITE, "You feel much less buoyant.");
- /* Shut */
- else
+ if (notice)
{
- if (p_ptr->walk_water)
- {
- msg_print("You feel much less buoyant.");
- notice = TRUE;
- }
+ /* Handle stuff */
+ handle_stuff();
}
- /* Use the value */
- p_ptr->walk_water = v;
-
- /* Nothing to notice */
- if (!notice) return (FALSE);
-
- /* Disturb */
- if (disturb_state) disturb(0, 0);
-
- /* Recalculate bonuses */
- p_ptr->update |= (PU_BONUS);
-
- /* Handle stuff */
- handle_stuff();
-
/* Result */
- return (TRUE);
+ return notice;
}
/*
* Set "p_ptr->shero", notice observable changes
*/
-bool set_shero(int v)
+bool_ set_shero(int v)
{
- bool notice = FALSE;
+ bool_ notice = set_simple_field(
+ &p_ptr->shero, v,
+ TERM_WHITE, "You feel like a killing machine!",
+ TERM_WHITE, "You feel less berserk.");
- /* Hack -- Force good values */
- v = (v > 10000) ? 10000 : (v < 0) ? 0 : v;
-
- /* Open */
- if (v)
+ if (notice)
{
- if (!p_ptr->shero)
- {
- msg_print("You feel like a killing machine!");
- notice = TRUE;
-
- /* Redraw map */
- p_ptr->redraw |= (PR_MAP);
-
- /* Update monsters */
- p_ptr->update |= (PU_MONSTERS);
-
- /* Window stuff */
- p_ptr->window |= (PW_OVERHEAD);
- }
- }
-
- /* Shut */
- else
- {
- if (p_ptr->shero)
- {
- msg_print("You feel less berserk.");
- notice = TRUE;
+ /* Redraw map */
+ p_ptr->redraw |= (PR_MAP);
- /* Redraw map */
- p_ptr->redraw |= (PR_MAP);
+ /* Update monsters */
+ p_ptr->update |= (PU_MONSTERS | PU_HP);
- /* Update monsters */
- p_ptr->update |= (PU_MONSTERS);
+ /* Window stuff */
+ p_ptr->window |= (PW_OVERHEAD);
- /* Window stuff */
- p_ptr->window |= (PW_OVERHEAD);
- }
+ /* Handle stuff */
+ handle_stuff();
}
- /* Use the value */
- p_ptr->shero = v;
-
- /* Nothing to notice */
- if (!notice) return (FALSE);
-
- /* Disturb */
- if (disturb_state) disturb(0, 0);
-
- /* Recalculate bonuses */
- p_ptr->update |= (PU_BONUS);
-
- /* Recalculate hitpoints */
- p_ptr->update |= (PU_HP);
-
- /* Handle stuff */
- handle_stuff();
-
/* Result */
- return (TRUE);
+ return notice;
}
/*
* Set "p_ptr->protevil", notice observable changes
*/
-bool set_protevil(int v)
+bool_ set_protevil(int v)
{
- bool notice = FALSE;
+ bool_ notice = set_simple_field(
+ &p_ptr->protevil, v,
+ TERM_WHITE, "You feel safe from evil!",
+ TERM_WHITE, "You no longer feel safe from evil.");
- /* Hack -- Force good values */
- v = (v > 10000) ? 10000 : (v < 0) ? 0 : v;
-
- /* Open */
- if (v)
+ if (notice)
{
- if (!p_ptr->protevil)
- {
- msg_print("You feel safe from evil!");
- notice = TRUE;
- }
- }
-
- /* Shut */
- else
- {
- if (p_ptr->protevil)
- {
- msg_print("You no longer feel safe from evil.");
- notice = TRUE;
- }
+ /* Handle stuff */
+ handle_stuff();
}
- /* Use the value */
- p_ptr->protevil = v;
-
- /* Nothing to notice */
- if (!notice) return (FALSE);
-
- /* Disturb */
- if (disturb_state) disturb(0, 0);
-
- /* Handle stuff */
- handle_stuff();
-
/* Result */
- return (TRUE);
+ return notice;
}
/*
* Set "p_ptr->protgood", notice observable changes
*/
-bool set_protgood(int v)
+bool_ set_protgood(int v)
{
- bool notice = FALSE;
-
- /* Hack -- Force good values */
- v = (v > 10000) ? 10000 : (v < 0) ? 0 : v;
-
- /* Open */
- if (v)
- {
- if (!p_ptr->protgood)
- {
- msg_print("You feel safe from good!");
- notice = TRUE;
- }
- }
+ bool_ notice = set_simple_field(
+ &p_ptr->protgood, v,
+ TERM_WHITE, "You feel safe from good!",
+ TERM_WHITE, "You no longer feel safe from good.");
- /* Shut */
- else
+ if (notice)
{
- if (p_ptr->protgood)
- {
- msg_print("You no longer feel safe from good.");
- notice = TRUE;
- }
+ /* Handle stuff */
+ handle_stuff();
}
- /* Use the value */
- p_ptr->protgood = v;
-
- /* Nothing to notice */
- if (!notice) return (FALSE);
-
- /* Disturb */
- if (disturb_state) disturb(0, 0);
-
- /* Handle stuff */
- handle_stuff();
-
/* Result */
- return (TRUE);
+ return notice;
}
/*
* Set "p_ptr->protundead", notice observable changes
*/
-bool set_protundead(int v)
+bool_ set_protundead(int v)
{
- bool notice = FALSE;
-
- /* Hack -- Force good values */
- v = (v > 10000) ? 10000 : (v < 0) ? 0 : v;
-
- /* Open */
- if (v)
- {
- if (!p_ptr->protundead)
- {
- msg_print("You feel safe from undead!");
- notice = TRUE;
- }
- }
+ bool_ notice = set_simple_field(
+ &p_ptr->protundead, v,
+ TERM_WHITE, "You feel safe from undead!",
+ TERM_WHITE, "You no longer feel safe from undead.");
- /* Shut */
- else
- {
- if (p_ptr->protundead)
- {
- msg_print("You no longer feel safe from undead.");
- notice = TRUE;
- }
+ if (notice) {
+ /* Handle stuff */
+ handle_stuff();
}
- /* Use the value */
- p_ptr->protundead = v;
-
- /* Nothing to notice */
- if (!notice) return (FALSE);
-
- /* Disturb */
- if (disturb_state) disturb(0, 0);
-
- /* Handle stuff */
- handle_stuff();
-
/* Result */
- return (TRUE);
+ return notice;
}
/*
* Set "p_ptr->set_shadow", notice observable changes
*/
-bool set_shadow(int v)
+bool_ set_shadow(int v)
{
- bool notice = FALSE;
+ bool_ notice = set_simple_field(
+ &p_ptr->tim_wraith, v,
+ TERM_WHITE, "You leave the physical world and turn into a wraith-being!",
+ TERM_WHITE, "You feel opaque.");
- /* Hack -- Force good values */
- v = (v > 10000) ? 10000 : (v < 0) ? 0 : v;
-
- /* Open */
- if (v)
+ if (notice)
{
- if (!p_ptr->tim_wraith)
- {
-
- msg_print("You leave the physical world and turn into a wraith-being!");
- notice = TRUE;
-
- {
- /* Redraw map */
- p_ptr->redraw |= (PR_MAP);
-
- /* Update monsters */
- p_ptr->update |= (PU_MONSTERS);
-
- /* Window stuff */
- p_ptr->window |= (PW_OVERHEAD);
- }
- }
- }
+ /* Redraw map */
+ p_ptr->redraw |= (PR_MAP);
- /* Shut */
- else
- {
- if (p_ptr->tim_wraith)
- {
- msg_print("You feel opaque.");
- notice = TRUE;
- {
- /* Redraw map */
- p_ptr->redraw |= (PR_MAP);
+ /* Update monsters */
+ p_ptr->update |= (PU_MONSTERS);
- /* Update monsters */
- p_ptr->update |= (PU_MONSTERS);
+ /* Window stuff */
+ p_ptr->window |= (PW_OVERHEAD);
- /* Window stuff */
- p_ptr->window |= (PW_OVERHEAD);
- }
- }
+ /* Handle stuff */
+ handle_stuff();
}
- /* Use the value */
- p_ptr->tim_wraith = v;
-
- /* Nothing to notice */
- if (!notice) return (FALSE);
-
- /* Disturb */
- if (disturb_state) disturb(0, 0);
-
- /* Recalculate bonuses */
- p_ptr->update |= (PU_BONUS);
-
-
-
-
- /* Handle stuff */
- handle_stuff();
-
/* Result */
- return (TRUE);
-
+ return notice;
}
@@ -2306,76 +1043,30 @@ bool set_shadow(int v)
/*
* Set "p_ptr->invuln", notice observable changes
*/
-bool set_invuln(int v)
+bool_ set_invuln(int v)
{
- bool notice = FALSE;
-
- /* Hack -- Force good values */
- v = (v > 10000) ? 10000 : (v < 0) ? 0 : v;
-
- /* Open */
- if (v)
- {
- if (!p_ptr->invuln)
- {
-
- cmsg_print(TERM_L_BLUE, "Invulnerability!");
- notice = TRUE;
-
- {
- /* Redraw map */
- p_ptr->redraw |= (PR_MAP);
-
- /* Update monsters */
- p_ptr->update |= (PU_MONSTERS);
+ bool_ notice = set_simple_field(
+ &p_ptr->invuln, v,
+ TERM_L_BLUE, "Invulnerability!",
+ TERM_L_RED, "The invulnerability wears off.");
- /* Window stuff */
- p_ptr->window |= (PW_OVERHEAD);
- }
- }
- }
-
- /* Shut */
- else
+ if (notice)
{
- if (p_ptr->invuln)
- {
- cmsg_print(TERM_L_RED, "The invulnerability wears off.");
- notice = TRUE;
- {
- /* Redraw map */
- p_ptr->redraw |= (PR_MAP);
-
- /* Update monsters */
- p_ptr->update |= (PU_MONSTERS);
+ /* Redraw map */
+ p_ptr->redraw |= (PR_MAP);
+
+ /* Update monsters */
+ p_ptr->update |= (PU_MONSTERS);
+
+ /* Window stuff */
+ p_ptr->window |= (PW_OVERHEAD);
- /* Window stuff */
- p_ptr->window |= (PW_OVERHEAD);
- }
- }
+ /* Handle stuff */
+ handle_stuff();
}
- /* Use the value */
- p_ptr->invuln = v;
-
- /* Nothing to notice */
- if (!notice) return (FALSE);
-
- /* Disturb */
- if (disturb_state) disturb(0, 0);
-
- /* Recalculate bonuses */
- p_ptr->update |= (PU_BONUS);
-
-
-
-
- /* Handle stuff */
- handle_stuff();
-
/* Result */
- return (TRUE);
-
+ return notice;
}
@@ -2383,61 +1074,32 @@ bool set_invuln(int v)
/*
* Set "p_ptr->tim_esp", notice observable changes
*/
-bool set_tim_esp(int v)
+bool_ set_tim_esp(int v)
{
- bool notice = FALSE;
+ bool_ notice = set_simple_field(
+ &p_ptr->tim_esp, v,
+ TERM_WHITE, "You feel your consciousness expand!",
+ TERM_WHITE, "Your consciousness contracts again.");
- /* Hack -- Force good values */
- v = (v > 10000) ? 10000 : (v < 0) ? 0 : v;
-
- /* Open */
- if (v)
+ if (notice)
{
- if (!p_ptr->tim_esp)
- {
- msg_print("You feel your consciousness expand!");
- notice = TRUE;
- }
- }
+ /* Update the monsters */
+ p_ptr->update |= (PU_MONSTERS);
- /* Shut */
- else
- {
- if (p_ptr->tim_esp)
- {
- msg_print("Your consciousness contracts again.");
- notice = TRUE;
- }
+ /* Handle stuff */
+ handle_stuff();
}
- /* Use the value */
- p_ptr->tim_esp = v;
-
- /* Nothing to notice */
- if (!notice) return (FALSE);
-
- /* Disturb */
- if (disturb_state) disturb(0, 0);
-
- /* Recalculate bonuses */
- p_ptr->update |= (PU_BONUS);
-
- /* Update the monsters */
- p_ptr->update |= (PU_MONSTERS);
-
- /* Handle stuff */
- handle_stuff();
-
/* Result */
- return (TRUE);
+ return notice;
}
/*
* Set "p_ptr->tim_thunder", notice observable changes
*/
-bool set_tim_thunder(int v, int p1, int p2)
+bool_ set_tim_thunder(int v, int p1, int p2)
{
- bool notice = FALSE;
+ bool_ notice = FALSE;
/* Hack -- Force good values */
v = (v > 10000) ? 10000 : (v < 0) ? 0 : v;
@@ -2490,396 +1152,182 @@ bool set_tim_thunder(int v, int p1, int p2)
/*
* Set "p_ptr->tim_invis", notice observable changes
*/
-bool set_tim_invis(int v)
+bool_ set_tim_invis(int v)
{
- bool notice = FALSE;
+ bool_ notice = set_simple_field(
+ &p_ptr->tim_invis, v,
+ TERM_WHITE, "Your eyes feel very sensitive!",
+ TERM_WHITE, "Your eyes feel less sensitive.");
- /* Hack -- Force good values */
- v = (v > 10000) ? 10000 : (v < 0) ? 0 : v;
-
- /* Open */
- if (v)
+ if (notice)
{
- if (!p_ptr->tim_invis)
- {
- msg_print("Your eyes feel very sensitive!");
- notice = TRUE;
- }
- }
+ /* Update the monsters */
+ p_ptr->update |= (PU_MONSTERS);
- /* Shut */
- else
- {
- if (p_ptr->tim_invis)
- {
- msg_print("Your eyes feel less sensitive.");
- notice = TRUE;
- }
+ /* Handle stuff */
+ handle_stuff();
}
- /* Use the value */
- p_ptr->tim_invis = v;
-
- /* Nothing to notice */
- if (!notice) return (FALSE);
-
- /* Disturb */
- if (disturb_state) disturb(0, 0);
-
- /* Recalculate bonuses */
- p_ptr->update |= (PU_BONUS);
-
- /* Update the monsters */
- p_ptr->update |= (PU_MONSTERS);
-
- /* Handle stuff */
- handle_stuff();
-
/* Result */
- return (TRUE);
+ return notice;
}
/*
* Set "p_ptr->tim_infra", notice observable changes
*/
-bool set_tim_infra(int v)
+bool_ set_tim_infra(int v)
{
- bool notice = FALSE;
+ bool_ notice = set_simple_field(
+ &p_ptr->tim_infra, v,
+ TERM_WHITE, "Your eyes begin to tingle!",
+ TERM_WHITE, "Your eyes stop tingling.");
- /* Hack -- Force good values */
- v = (v > 10000) ? 10000 : (v < 0) ? 0 : v;
-
- /* Open */
- if (v)
+ if (notice)
{
- if (!p_ptr->tim_infra)
- {
- msg_print("Your eyes begin to tingle!");
- notice = TRUE;
- }
- }
+ /* Update the monsters */
+ p_ptr->update |= (PU_MONSTERS);
- /* Shut */
- else
- {
- if (p_ptr->tim_infra)
- {
- msg_print("Your eyes stop tingling.");
- notice = TRUE;
- }
+ /* Handle stuff */
+ handle_stuff();
}
- /* Use the value */
- p_ptr->tim_infra = v;
-
- /* Nothing to notice */
- if (!notice) return (FALSE);
-
- /* Disturb */
- if (disturb_state) disturb(0, 0);
-
- /* Recalculate bonuses */
- p_ptr->update |= (PU_BONUS);
-
- /* Update the monsters */
- p_ptr->update |= (PU_MONSTERS);
-
- /* Handle stuff */
- handle_stuff();
-
/* Result */
- return (TRUE);
+ return notice;
}
/*
* Set "p_ptr->tim_mental_barrier", notice observable changes
*/
-bool set_mental_barrier(int v)
+bool_ set_mental_barrier(int v)
{
- bool notice = FALSE;
-
- /* Hack -- Force good values */
- v = (v > 10000) ? 10000 : (v < 0) ? 0 : v;
-
- /* Open */
- if (v)
- {
- if (!p_ptr->tim_mental_barrier)
- {
- msg_print("Your mind grows stronger!");
- notice = TRUE;
- }
- }
+ bool_ notice = set_simple_field(
+ &p_ptr->tim_mental_barrier, v,
+ TERM_WHITE, "Your mind grows stronger!",
+ TERM_WHITE, "Your mind is no longer especially strong.");
- /* Shut */
- else
+ if (notice)
{
- if (p_ptr->tim_mental_barrier)
- {
- msg_print("Your mind is no longer especially strong.");
- notice = TRUE;
- }
+ /* Handle stuff */
+ handle_stuff();
}
- /* Use the value */
- p_ptr->tim_mental_barrier = v;
-
- /* Nothing to notice */
- if (!notice) return (FALSE);
-
- /* Disturb */
- if (disturb_state) disturb(0, 0);
-
- /* Handle stuff */
- handle_stuff();
-
/* Result */
- return (TRUE);
+ return notice;
}
/*
* Set "p_ptr->oppose_acid", notice observable changes
*/
-bool set_oppose_acid(int v)
+bool_ set_oppose_acid(int v)
{
- bool notice = FALSE;
+ bool_ notice = set_simple_field(
+ &p_ptr->oppose_acid, v,
+ TERM_WHITE, "You feel resistant to acid!",
+ TERM_WHITE, "You feel less resistant to acid.");
- /* Hack -- Force good values */
- v = (v > 10000) ? 10000 : (v < 0) ? 0 : v;
-
- /* Open */
- if (v)
- {
- if (!p_ptr->oppose_acid)
- {
- msg_print("You feel resistant to acid!");
- notice = TRUE;
- }
- }
-
- /* Shut */
- else
+ if (notice)
{
- if (p_ptr->oppose_acid)
- {
- msg_print("You feel less resistant to acid.");
- notice = TRUE;
- }
+ /* Handle stuff */
+ handle_stuff();
}
- /* Use the value */
- p_ptr->oppose_acid = v;
-
- /* Nothing to notice */
- if (!notice) return (FALSE);
-
- /* Disturb */
- if (disturb_state) disturb(0, 0);
-
- /* Handle stuff */
- handle_stuff();
-
/* Result */
- return (TRUE);
+ return notice;
}
/*
* Set "p_ptr->oppose_elec", notice observable changes
*/
-bool set_oppose_elec(int v)
+bool_ set_oppose_elec(int v)
{
- bool notice = FALSE;
-
- /* Hack -- Force good values */
- v = (v > 10000) ? 10000 : (v < 0) ? 0 : v;
-
- /* Open */
- if (v)
- {
- if (!p_ptr->oppose_elec)
- {
- msg_print("You feel resistant to electricity!");
- notice = TRUE;
- }
- }
+ bool_ notice = set_simple_field(
+ &p_ptr->oppose_elec, v,
+ TERM_WHITE, "You feel resistant to electricity!",
+ TERM_WHITE, "You feel less resistant to electricity.");
- /* Shut */
- else
+ if (notice)
{
- if (p_ptr->oppose_elec)
- {
- msg_print("You feel less resistant to electricity.");
- notice = TRUE;
- }
+ /* Handle stuff */
+ handle_stuff();
}
- /* Use the value */
- p_ptr->oppose_elec = v;
-
- /* Nothing to notice */
- if (!notice) return (FALSE);
-
- /* Disturb */
- if (disturb_state) disturb(0, 0);
-
- /* Handle stuff */
- handle_stuff();
-
/* Result */
- return (TRUE);
+ return notice;
}
/*
* Set "p_ptr->oppose_fire", notice observable changes
*/
-bool set_oppose_fire(int v)
+bool_ set_oppose_fire(int v)
{
- bool notice = FALSE;
+ bool_ notice = set_simple_field(
+ &p_ptr->oppose_fire, v,
+ TERM_WHITE, "You feel resistant to fire!",
+ TERM_WHITE, "You feel less resistant to fire.");
- /* Hack -- Force good values */
- v = (v > 10000) ? 10000 : (v < 0) ? 0 : v;
-
- /* Open */
- if (v)
+ if (notice)
{
- if (!p_ptr->oppose_fire)
- {
- msg_print("You feel resistant to fire!");
- notice = TRUE;
- }
- }
-
- /* Shut */
- else
- {
- if (p_ptr->oppose_fire)
- {
- msg_print("You feel less resistant to fire.");
- notice = TRUE;
- }
+ /* Handle stuff */
+ handle_stuff();
}
- /* Use the value */
- p_ptr->oppose_fire = v;
-
- /* Nothing to notice */
- if (!notice) return (FALSE);
-
- /* Disturb */
- if (disturb_state) disturb(0, 0);
-
- /* Handle stuff */
- handle_stuff();
-
/* Result */
- return (TRUE);
+ return notice;
}
/*
* Set "p_ptr->oppose_cold", notice observable changes
*/
-bool set_oppose_cold(int v)
+bool_ set_oppose_cold(int v)
{
- bool notice = FALSE;
-
- /* Hack -- Force good values */
- v = (v > 10000) ? 10000 : (v < 0) ? 0 : v;
-
- /* Open */
- if (v)
- {
- if (!p_ptr->oppose_cold)
- {
- msg_print("You feel resistant to cold!");
- notice = TRUE;
- }
- }
+ bool_ notice = set_simple_field(
+ &p_ptr->oppose_cold, v,
+ TERM_WHITE, "You feel resistant to cold!",
+ TERM_WHITE, "You feel less resistant to cold.");
- /* Shut */
- else
+ if (notice)
{
- if (p_ptr->oppose_cold)
- {
- msg_print("You feel less resistant to cold.");
- notice = TRUE;
- }
+ /* Handle stuff */
+ handle_stuff();
}
- /* Use the value */
- p_ptr->oppose_cold = v;
-
- /* Nothing to notice */
- if (!notice) return (FALSE);
-
- /* Disturb */
- if (disturb_state) disturb(0, 0);
-
- /* Handle stuff */
- handle_stuff();
-
/* Result */
- return (TRUE);
+ return notice;
}
/*
* Set "p_ptr->oppose_pois", notice observable changes
*/
-bool set_oppose_pois(int v)
+bool_ set_oppose_pois(int v)
{
- bool notice = FALSE;
-
- /* Hack -- Force good values */
- v = (v > 10000) ? 10000 : (v < 0) ? 0 : v;
-
- /* Open */
- if (v)
- {
- if (!p_ptr->oppose_pois)
- {
- msg_print("You feel resistant to poison!");
- notice = TRUE;
- }
- }
+ bool_ notice = set_simple_field(
+ &p_ptr->oppose_pois, v,
+ TERM_WHITE, "You feel resistant to poison!",
+ TERM_WHITE, "You feel less resistant to poison.");
- /* Shut */
- else
+ if (notice)
{
- if (p_ptr->oppose_pois)
- {
- msg_print("You feel less resistant to poison.");
- notice = TRUE;
- }
+ /* Handle stuff */
+ handle_stuff();
}
- /* Use the value */
- p_ptr->oppose_pois = v;
-
- /* Nothing to notice */
- if (!notice) return (FALSE);
-
- /* Disturb */
- if (disturb_state) disturb(0, 0);
-
- /* Handle stuff */
- handle_stuff();
-
/* Result */
- return (TRUE);
+ return notice;
}
/*
* Set "p_ptr->tim_regen", notice observable changes
*/
-bool set_tim_regen(int v, int p)
+bool_ set_tim_regen(int v, int p)
{
- bool notice = FALSE;
+ bool_ notice = FALSE;
/* Hack -- Force good values */
v = (v > 10000) ? 10000 : (v < 0) ? 0 : v;
@@ -2928,10 +1376,10 @@ bool set_tim_regen(int v, int p)
*
* Note the special code to only notice "range" changes.
*/
-bool set_stun(int v)
+bool_ set_stun(int v)
{
int old_aux, new_aux;
- bool notice = FALSE;
+ bool_ notice = FALSE;
/* Hack -- Force good values */
@@ -3089,11 +1537,11 @@ bool set_stun(int v)
*
* Note the special code to only notice "range" changes.
*/
-bool set_cut(int v)
+bool_ set_cut(int v)
{
int old_aux, new_aux;
- bool notice = FALSE;
+ bool_ notice = FALSE;
/* Hack -- Force good values */
v = (v > 10000) ? 10000 : (v < 0) ? 0 : v;
@@ -3328,11 +1776,11 @@ void drop_from_wild()
* game turns, or 500/(100/5) = 25 player turns (if nothing else is
* affecting the player speed).
*/
-bool set_food(int v)
+bool_ set_food(int v)
{
int old_aux, new_aux;
- bool notice = FALSE;
+ bool_ notice = FALSE;
/* Hack -- Force good values */
v = (v > 20000) ? 20000 : (v < 0) ? 0 : v;
@@ -3511,14 +1959,11 @@ bool set_food(int v)
*/
void check_experience(void)
{
- int i, gained = 0;
- bool level_reward = FALSE;
- bool level_corruption = FALSE;
+ int gained = 0;
+ bool_ level_reward = FALSE;
+ bool_ level_corruption = FALSE;
- /* Note current level */
- i = p_ptr->lev;
-
/* Hack -- lower limit */
if (p_ptr->exp < 0) p_ptr->exp = 0;
@@ -3651,11 +2096,6 @@ void check_experience(void)
*/
void check_experience_obj(object_type *o_ptr)
{
- int i;
-
- /* Note current level */
- i = o_ptr->elevel;
-
/* Hack -- lower limit */
if (o_ptr->exp < 0) o_ptr->exp = 0;
@@ -3815,18 +2255,6 @@ void place_corpse(monster_type *m_ptr)
int x = m_ptr->fx;
int y = m_ptr->fy;
-#if 0 /* If I can find some time to implement the decapitation ... */
- object_type *w_ptr = &p_ptr->inventory[INVEN_WIELD];
-
- int i = w_ptr->weight + ((p_ptr->to_h + w_ptr->to_h) * 5) + (p_ptr->lev * 3);
-
- /* Handle decapitations. This is not allowed with hafted weapons. */
- bool crit = (randint(5000) <= i);
-
- bool decapitate = ((rand_int(m_ptr->maxhp) <= -(m_ptr->hp)) &&
- (w_ptr->tval != TV_HAFTED) && crit);
-#endif
-
/* Get local object */
i_ptr = &object_type_body;
@@ -3927,11 +2355,10 @@ void monster_death(int m_idx)
monster_race *r_ptr = race_inf(m_ptr);
- bool visible = (m_ptr->ml || (r_ptr->flags1 & (RF1_UNIQUE)));
+ bool_ visible = (m_ptr->ml || (r_ptr->flags1 & (RF1_UNIQUE)));
- bool cloned = FALSE;
- bool create_stairs = FALSE;
+ bool_ create_stairs = FALSE;
int force_coin = get_coin_type(r_ptr);
object_type forge;
@@ -3978,8 +2405,6 @@ void monster_death(int m_idx)
p_ptr->arena_number++;
}
- if (m_ptr->smart &(SM_CLONED)) cloned = TRUE;
-
/* If the doppleganger die, the variable must be set accordingly */
if (r_ptr->flags9 & RF9_DOPPLEGANGER) doppleganger = 0;
@@ -4079,7 +2504,7 @@ void monster_death(int m_idx)
do
{
- scatter(&wy, &wx, p_ptr->py, p_ptr->px, 20, 0);
+ scatter(&wy, &wx, p_ptr->py, p_ptr->px, 20);
}
while (!(in_bounds(wy, wx) && cave_floor_bold(wy, wx)) && --attempts);
@@ -4121,7 +2546,7 @@ void monster_death(int m_idx)
do
{
- scatter(&wy, &wx, p_ptr->py, p_ptr->px, 3, 0);
+ scatter(&wy, &wx, p_ptr->py, p_ptr->px, 3);
}
while (!(in_bounds(wy, wx) && cave_floor_bold(wy, wx)) && --attempts);
@@ -4325,7 +2750,7 @@ void monster_death(int m_idx)
do
{
- scatter(&yy, &xx, y, x, 6, 0);
+ scatter(&yy, &xx, y, x, 6);
}
while (!(in_bounds(yy, xx) && cave_floor_bold(yy, xx)) && --attempts);
@@ -4479,7 +2904,7 @@ void monster_death(int m_idx)
int d = 1;
/* Pick a location */
- scatter(&ny, &nx, y, x, d, 0);
+ scatter(&ny, &nx, y, x, d);
/* Stagger */
y = ny;
@@ -4530,7 +2955,7 @@ void monster_death(int m_idx)
* monster worth more than subsequent monsters. This would also need
* to induce changes in the monster recall code.
*/
-bool mon_take_hit(int m_idx, int dam, bool *fear, cptr note)
+bool_ mon_take_hit(int m_idx, int dam, bool_ *fear, cptr note)
{
monster_type *m_ptr = &m_list[m_idx];
monster_race *r_ptr = race_inf(m_ptr);
@@ -4650,12 +3075,10 @@ bool mon_take_hit(int m_idx, int dam, bool *fear, cptr note)
if (!note)
{
object_type *o_ptr;
- object_kind *k_ptr;
u32b f1, f2, f3, f4, f5, esp;
/* Access the weapon */
o_ptr = &p_ptr->inventory[INVEN_WIELD];
- k_ptr = &k_info[o_ptr->k_idx];
object_flags(o_ptr, &f1, &f2, &f3, &f4, &f5, &esp);
/* Can the weapon gain levels ? */
@@ -4908,7 +3331,7 @@ static void panel_bounds(void)
*
* Also used in do_cmd_locate()
*/
-bool change_panel(int dy, int dx)
+bool_ change_panel(int dy, int dx)
{
int y, x;
int wid, hgt;
@@ -5080,16 +3503,6 @@ void verify_panel(void)
/* Recalculate the boundaries */
panel_bounds();
- /* Hack - merchants detect items */
-#if 0 /* DGDGDGDG -- use a skill */
- if (cp_ptr->magic_key == MKEY_TELEKINESIS)
- {
- hack_no_detect_message = TRUE;
- detect_objects_normal(DEFAULT_RADIUS);
- detect_objects_gold(DEFAULT_RADIUS);
- hack_no_detect_message = FALSE;
- }
-#endif
/* Update stuff */
p_ptr->update |= (PU_MONSTERS);
@@ -5168,7 +3581,7 @@ void resize_window(void)
p_ptr->window |= (PW_INVEN | PW_EQUIP | PW_PLAYER);
/* Window stuff */
- p_ptr->window |= (PW_M_LIST | PW_IRC | PW_MESSAGE | PW_OVERHEAD |
+ p_ptr->window |= (PW_M_LIST | PW_MESSAGE | PW_OVERHEAD |
PW_MONSTER | PW_OBJECT);
@@ -5190,7 +3603,7 @@ cptr look_mon_desc(int m_idx)
monster_type *m_ptr = &m_list[m_idx];
monster_race *r_ptr = race_inf(m_ptr);
- bool living = TRUE;
+ bool_ living = TRUE;
int perc;
@@ -5314,7 +3727,7 @@ void ang_sort(vptr u, vptr v, int n)
* Future versions may restrict the ability to target "trappers"
* and "mimics", but the semantics is a little bit weird.
*/
-bool target_able(int m_idx)
+bool_ target_able(int m_idx)
{
monster_type *m_ptr = &m_list[m_idx];
@@ -5351,7 +3764,7 @@ bool target_able(int m_idx)
*
* We return TRUE if the target is "okay" and FALSE otherwise.
*/
-bool target_okay(void)
+bool_ target_okay(void)
{
/* Accept stationary targets */
if (target_who < 0) return (TRUE);
@@ -5385,7 +3798,7 @@ bool target_okay(void)
* We use "u" and "v" to point to arrays of "x" and "y" positions,
* and sort the arrays by double-distance to the player.
*/
-static bool ang_sort_comp_distance(vptr u, vptr v, int a, int b)
+static bool_ ang_sort_comp_distance(vptr u, vptr v, int a, int b)
{
byte *x = (byte*)(u);
byte *y = (byte*)(v);
@@ -5501,7 +3914,7 @@ static s16b target_pick(int y1, int x1, int dy, int dx)
/*
* Hack -- determine if a given location is "interesting"
*/
-static bool target_set_accept(int y, int x)
+static bool_ target_set_accept(int y, int x)
{
cave_type *c_ptr;
@@ -5608,7 +4021,7 @@ static void target_set_prepare(int mode)
}
-bool target_object(int y, int x, int mode, cptr info, bool *boring,
+bool_ target_object(int y, int x, int mode, cptr info, bool_ *boring,
object_type *o_ptr, char *out_val, cptr *s1, cptr *s2, cptr *s3,
int *query)
{
@@ -5672,7 +4085,7 @@ static int target_set_aux(int y, int x, int mode, cptr info)
cptr s1, s2, s3;
- bool boring;
+ bool_ boring;
int feat;
@@ -5749,7 +4162,7 @@ static int target_set_aux(int y, int x, int mode, cptr info)
/* Visible */
if (m_ptr->ml)
{
- bool recall = FALSE;
+ bool_ recall = FALSE;
char m_name[80];
@@ -6110,15 +4523,15 @@ static int target_set_aux(int y, int x, int mode, cptr info)
* This command will cancel any old target, even if used from
* inside the "look" command.
*/
-bool target_set(int mode)
+bool_ target_set(int mode)
{
int i, d, m;
int y = p_ptr->py;
int x = p_ptr->px;
- bool done = FALSE;
+ bool_ done = FALSE;
- bool flag = TRUE;
+ bool_ flag = TRUE;
char query;
@@ -6500,7 +4913,7 @@ bool target_set(int mode)
*
* Note that confusion over-rides any (explicit?) user choice.
*/
-bool get_aim_dir(int *dp)
+bool_ get_aim_dir(int *dp)
{
int dir;
@@ -6508,8 +4921,6 @@ bool get_aim_dir(int *dp)
cptr p;
-#ifdef ALLOW_REPEAT /* TNB */
-
if (repeat_pull(dp))
{
/* Confusion? */
@@ -6521,8 +4932,6 @@ bool get_aim_dir(int *dp)
}
}
-#endif /* ALLOW_REPEAT -- TNB */
-
/* Initialize */
(*dp) = 0;
@@ -6609,12 +5018,9 @@ bool get_aim_dir(int *dp)
/* Save direction */
(*dp) = dir;
-#ifdef ALLOW_REPEAT /* TNB */
repeat_push(dir);
-#endif /* ALLOW_REPEAT -- TNB */
-
/* A "valid" direction was entered */
return (TRUE);
}
@@ -6637,19 +5043,15 @@ bool get_aim_dir(int *dp)
* This function tracks and uses the "global direction", and uses
* that as the "desired direction", to which "confusion" is applied.
*/
-bool get_rep_dir(int *dp)
+bool_ get_rep_dir(int *dp)
{
int dir;
-#ifdef ALLOW_REPEAT /* TNB */
-
if (repeat_pull(dp))
{
return (TRUE);
}
-#endif /* ALLOW_REPEAT -- TNB */
-
/* Initialize */
(*dp) = 0;
@@ -6701,12 +5103,9 @@ bool get_rep_dir(int *dp)
/* Save direction */
(*dp) = dir;
-#ifdef ALLOW_REPEAT /* TNB */
repeat_push(dir);
-#endif /* ALLOW_REPEAT -- TNB */
-
/* Success */
return (TRUE);
}
@@ -6728,14 +5127,6 @@ void gain_level_reward(int chosen_reward)
int type, effect;
-#if 0
- if (!chosen_reward)
- {
- if (multi_rew) return;
- else multi_rew = TRUE;
- }
-#endif
-
if (p_ptr->lev == 13) nasty_chance = 2;
else if (!(p_ptr->lev % 13)) nasty_chance = 3;
else if (!(p_ptr->lev % 14)) nasty_chance = 12;
@@ -7155,12 +5546,12 @@ void gain_level_reward(int chosen_reward)
/*
* old -- from PsiAngband.
*/
-bool tgt_pt(int *x, int *y)
+bool_ tgt_pt(int *x, int *y)
{
char ch = 0;
int d, cu, cv;
int screen_wid, screen_hgt;
- bool success = FALSE;
+ bool_ success = FALSE;
*x = p_ptr->px;
*y = p_ptr->py;
@@ -7213,25 +5604,25 @@ bool tgt_pt(int *x, int *y)
}
-bool gain_random_corruption(int choose_mut)
+bool_ gain_random_corruption(int choose_mut)
{
exec_lua("gain_corruption()");
return (FALSE);
}
-bool lose_corruption(int choose_mut)
+bool_ lose_corruption(int choose_mut)
{
exec_lua("lose_corruption()");
return (FALSE);
}
-bool lose_all_corruptions(void)
+bool_ lose_all_corruptions(void)
{
exec_lua("lose_all_corruptions()");
return (FALSE);
}
-bool get_hack_dir(int *dp)
+bool_ get_hack_dir(int *dp)
{
int dir;
cptr p;
@@ -7330,7 +5721,7 @@ bool get_hack_dir(int *dp)
/*
* Do we have at least one corruption?
*/
-bool got_corruptions()
+bool_ got_corruptions()
{
int i, max;
@@ -7349,7 +5740,7 @@ bool got_corruptions()
/*
* Dump the corruption list
*/
-void dump_corruptions(FILE *fff, bool color)
+void dump_corruptions(FILE *fff, bool_ color)
{
int i, max;
@@ -7385,7 +5776,7 @@ void set_grace(s32b v)
handle_stuff();
}
-bool test_object_wish(char *name, object_type *o_ptr, object_type *forge, char *what)
+bool_ test_object_wish(char *name, object_type *o_ptr, object_type *forge, char *what)
{
int i, j, jb, save_aware;
char buf[200];
@@ -7418,19 +5809,11 @@ bool test_object_wish(char *name, object_type *o_ptr, object_type *forge, char *
/* Hack hack hackery */
(o_ptr->tval == TV_ROD_MAIN && strstr(name, "rod of")))
{
-#if 0 // DGDGDGDG
- /* You can't wish for a wish! */
- if ((o_ptr->tval == TV_STAFF) && (o_ptr->sval == SV_STAFF_WISHING))
- {
- msg_format("You cannot %s for a wish!", what);
- return FALSE;
- }
-#endif
/* try all ego */
for (j = max_e_idx - 1; j >= 0; j--)
{
ego_item_type *e_ptr = &e_info[j];
- bool ok = FALSE;
+ bool_ ok = FALSE;
if (j && !e_ptr->name) continue;
@@ -7458,7 +5841,7 @@ bool test_object_wish(char *name, object_type *o_ptr, object_type *forge, char *
for (jb = max_e_idx - 1; jb >= 0; jb--)
{
ego_item_type *eb_ptr = &e_info[jb];
- bool ok = FALSE;
+ bool_ ok = FALSE;
if (jb && !eb_ptr->name) continue;
@@ -7649,7 +6032,7 @@ void make_wish(void)
do
{
- scatter(&wy, &wx, p_ptr->py, p_ptr->px, 5, 0);
+ scatter(&wy, &wx, p_ptr->py, p_ptr->px, 5);
}
while (!(in_bounds(wy, wx) && cave_floor_bold(wy, wx)) && --attempts);
@@ -7706,7 +6089,7 @@ void switch_subclass(int sclass)
/*
* Change to an other subrace
*/
-void switch_subrace(int racem, bool copy_old)
+void switch_subrace(int racem, bool_ copy_old)
{
if ((racem < 0) && (racem >= max_rmp_idx)) return;
diff --git a/src/z-form.c b/src/z-form.c
index 1ad92156..b3d5d005 100644
--- a/src/z-form.c
+++ b/src/z-form.c
@@ -229,10 +229,10 @@ uint vstrnfmt(char *buf, uint max, cptr fmt, va_list vp)
cptr s;
/* The argument is "long" */
- bool do_long;
+ bool_ do_long;
/* The argument needs "processing" */
- bool do_xtra;
+ bool_ do_xtra;
/* Bytes used in buffer */
uint n;
diff --git a/src/z-form.h b/src/z-form.h
index 69b46794..2dcfa96c 100644
--- a/src/z-form.h
+++ b/src/z-form.h
@@ -3,6 +3,10 @@
#ifndef INCLUDED_Z_FORM_H
#define INCLUDED_Z_FORM_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+
#include "h-basic.h"
/*
@@ -43,5 +47,8 @@ extern void quit_fmt(cptr fmt, ...);
/* Vararg interface to "core()", using "format()" */
extern void core_fmt(cptr fmt, ...);
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
#endif
diff --git a/src/z-rand.c b/src/z-rand.c
index 2f24b9b0..ca5b49ae 100644
--- a/src/z-rand.c
+++ b/src/z-rand.c
@@ -47,7 +47,7 @@
/*
* Use the "simple" LCRNG
*/
-bool Rand_quick = TRUE;
+bool_ Rand_quick = TRUE;
/*
diff --git a/src/z-rand.h b/src/z-rand.h
index 69a531b4..39cc958c 100644
--- a/src/z-rand.h
+++ b/src/z-rand.h
@@ -3,6 +3,10 @@
#ifndef INCLUDED_Z_RAND_H
#define INCLUDED_Z_RAND_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+
#include "h-basic.h"
@@ -67,7 +71,7 @@
/**** Available Variables ****/
-extern bool Rand_quick;
+extern bool_ Rand_quick;
extern u32b Rand_value;
extern u16b Rand_place;
extern u32b Rand_state[RAND_DEG];
@@ -84,6 +88,9 @@ extern s32b damroll(s16b num, s16b sides);
extern s32b maxroll(s16b num, s16b sides);
+#ifdef __cplusplus
+} /* extern "C" */
#endif
+#endif
diff --git a/src/z-sock.c b/src/z-sock.c
deleted file mode 100644
index fcc6cd1c..00000000
--- a/src/z-sock.c
+++ /dev/null
@@ -1,787 +0,0 @@
-/* File: z-term.c */
-
-/*
- * Copyright (c) 1997 Ben Harrison
- *
- * This software may be copied and distributed for educational, research,
- * and not for profit purposes provided that this copyright and statement
- * are included in all such copies.
- */
-
-/* Purpose: a generic, IP connection package */
-
-#include "angband.h"
-#include "z-term.h"
-#include "z-virt.h"
-
-
-/*
- * System independant functions
- */
-
-/* Call all the callbacks */
-void zsock_handle_callbacks()
-{
- timer_callback_list *c = zsock.__timer_callbacks;
-
- while (c != NULL)
- {
- c->callback();
- c = c->next;
- }
-}
-
-/* Add a callback in the list */
-void zsock_add_timer_callback(timer_callback callback)
-{
- timer_callback_list *c;
-
- /* Create it */
- MAKE(c, timer_callback_list);
- c->callback = callback;
-
- /* Add it into the lsit */
- c->next = zsock.__timer_callbacks;
- zsock.__timer_callbacks = c;
-
- /* Increase the timer count */
- zsock.__timers++;
-}
-
-/* Remove a callback in the list */
-void zsock_remove_timer_callback(timer_callback callback)
-{
- timer_callback_list *c = zsock.__timer_callbacks, *old = NULL;
-
- /* Find it */
- while ((c != NULL) && (c->callback != callback))
- {
- old = c;
- c = c->next;
- }
-
- if (c->callback == callback)
- {
- /* Skip it */
- if (old == NULL)
- zsock.__timer_callbacks = c->next;
- else
- old->next = c->next;
-
- /* Delete it */
- FREE(c, timer_callback_list);
-
- /* Increase the timer count */
- zsock.__timers--;
- }
- else
- {
- cmsg_print(TERM_VIOLET, "WARNING: tried to remove a non existing timer callback!");
- }
-}
-
-/* Creates a connection struct */
-ip_connection *zsock_new_connection()
-{
- ip_connection *c;
-
- MAKE(c, ip_connection);
- return c;
-}
-void zsock_free_connection(ip_connection *c)
-{
- FREE(c, ip_connection);
-}
-
-
-/* Set the dying connection callback */
-void zsock_set_lose_connection(ip_connection *conn, lose_connection_hook hook)
-{
- conn->lost_conn = hook;
-}
-
-/* Send data on the connection -- easy to use */
-bool zsock_write_simple(ip_connection *conn, cptr str)
-{
- int len = 0;
-
- return zsock.write(conn, str, &len);
-}
-
-/* Read data on the connection -- easy to use */
-bool zsock_read_simple(ip_connection *conn, char *str, int len)
-{
- int rlen = len;
-
- return zsock.read(conn, str, &rlen, FALSE);
-}
-
-/*
- ******************************* Here comes the Windows socket part ********************************
- */
-#ifdef USE_WINSOCK
-#include <windows.h>
-#include <winsock2.h>
-
-/* Needed for timers -- pfft */
-extern HWND get_main_hwnd();
-
-#define ZSOCK_TIMER_ID 1
-
-VOID CALLBACK zsock_timer_callback_win(HWND hwnd, UINT message, UINT idTimer, DWORD dwTime)
-{
- zsock_handle_callbacks();
-}
-
-bool zsock_add_timer_win(timer_callback callback)
-{
- zsock_add_timer_callback(callback);
-
- /* Is it the first callback ? then we must create the timer */
- if (zsock.__timers == 1)
- {
- SetTimer(get_main_hwnd(), ZSOCK_TIMER_ID, ZSOCK_TIMER_DELAY, zsock_timer_callback_win);
- }
- return TRUE;
-}
-
-bool zsock_remove_timer_win(timer_callback callback)
-{
- zsock_remove_timer_callback(callback);
-
- /* No more callbacks ? no need for the timer then */
- if (!zsock.__timers)
- {
- KillTimer(get_main_hwnd(), ZSOCK_TIMER_ID);
- }
- return TRUE;
-}
-
-
-bool zsock_setup_win(ip_connection *conn, cptr conn_ip, int port, byte conn_type, bool server)
-{
- /* Already setup! */
- if (conn->setup) return FALSE;
-
- MAKE(conn->socket, SOCKET);
-
- if (!server)
- {
- struct hostent *host;
-
- host = gethostbyname(conn_ip);
- conn->conn_ip = ((struct in_addr *)(host->h_addr))->s_addr;
- }
- else
- conn->conn_ip = 0;
-
- conn->conn_type = conn_type;
- conn->conn_port = htons(port);
-
- conn->setup = TRUE;
- conn->server = server;
-
- conn->lost_conn = NULL;
-
- return TRUE;
-}
-
-bool zsock_unsetup_win(ip_connection *conn)
-{
- /* Already unsetup */
- if (!conn->setup) return FALSE;
-
- FREE(conn->socket, SOCKET);
-
- return TRUE;
-}
-
-bool zsock_open_win(ip_connection *conn)
-{
- struct sockaddr_in sin;
-
- /* Already connected */
- if (conn->connected) return FALSE;
-
- *((SOCKET*)conn->socket) = socket(AF_INET, SOCK_STREAM, 0);
-
- memset(&sin, 0, sizeof(sin));
- sin.sin_family = AF_INET;
- sin.sin_addr.s_addr = conn->conn_ip;
- sin.sin_port = conn->conn_port;
-
- if (conn->server)
- {
- if (SOCKET_ERROR == bind(*((SOCKET*)conn->socket), &sin, sizeof(sin)))
- return FALSE;
-
- if (SOCKET_ERROR == listen(*((SOCKET*)conn->socket), 10)) return FALSE;
- }
- else
- {
- if (connect(*((SOCKET*)conn->socket), &sin, sizeof sin) == SOCKET_ERROR)
- {
- /* could not connect to server */
- return (FALSE);
- }
- }
-
- conn->connected = TRUE;
- return TRUE;
-}
-
-bool zsock_can_read_win(ip_connection *conn)
-{
- struct timeval t;
- fd_set rd;
- SOCKET *c = conn->socket;
-
- if (!conn->connected) return FALSE;
-
- FD_ZERO(&rd);
- FD_SET(*c, &rd);
- t.tv_sec = 0;
- t.tv_usec = 0;
- select(*c + 1, &rd, NULL, NULL, &t);
- if (FD_ISSET(*c, &rd)) return TRUE;
- else return (FALSE);
-}
-
-bool zsock_wait_win(ip_connection *conn, int seconds)
-{
- struct timeval t;
- fd_set rd;
- SOCKET *c = conn->socket;
-
- if (!conn->connected) return FALSE;
-
- t.tv_sec = seconds;
- t.tv_usec = 0;
-
- FD_ZERO(&rd);
- FD_SET(*c, &rd);
- select(*c + 1, &rd, NULL, NULL, &t);
- if (FD_ISSET(*c, &rd)) return TRUE;
- else return (FALSE);
-}
-
-bool zsock_close_win(ip_connection *conn)
-{
- SOCKET *c = conn->socket;
-
- /* Already disconnected */
- if (!conn->connected) return FALSE;
-
- closesocket(*c);
- conn->connected = FALSE;
- return TRUE;
-}
-
-bool zsock_write_win(ip_connection *conn, cptr str, int *size)
-{
- SOCKET *c = conn->socket;
-
- if (!conn->connected) return FALSE;
-
- if ((*size = send(*c, str, (!*size) ? strlen(str) : *size, 0)) <= 0)
- {
- /* Oups connection died! */
- if (conn->lost_conn) conn->lost_conn(conn);
- zsock.close(conn);
- return FALSE;
- }
-
- return TRUE;
-}
-
-bool zsock_read_win(ip_connection *conn, char *str, int *len, bool raw)
-{
- char c;
- int l = 0;
- SOCKET *cc = conn->socket;
-
- if (!conn->connected) return FALSE;
-
- if (!raw)
- {
- /* This *IS* fucking slow */
- while ((l < *len) && zsock_can_read_win(conn))
- {
- if (recv(*cc, &c, 1, 0) <= 0)
- {
- /* Oups connection died! */
- if (conn->lost_conn) conn->lost_conn(conn);
- zsock.close(conn);
- return FALSE;
- }
- if (c == '\r') continue;
- if (c == '\n') break;
- str[l++] = c;
- }
- str[l] = '\0';
- *len = l;
- return TRUE;
- }
- else
- {
- if ((*len = recv(*cc, str, *len, 0)) <= 0)
- {
- /* Oups connection died! */
- if (conn->lost_conn) conn->lost_conn(conn);
- zsock.close(conn);
- return FALSE;
- }
- return TRUE;
- }
-}
-
-bool zsock_accept_win(ip_connection *conn, ip_connection *child)
-{
- SOCKET *s = conn->socket;
- SOCKET sock;
- struct sockaddr_in sin;
- int len;
-
- if (!conn->server) return FALSE;
- if (!conn->connected) return FALSE;
-
- len = sizeof(sin);
- sock = accept(*s, (struct sockaddr*) & sin, &len);
-
- if (sock == SOCKET_ERROR) return FALSE;
-
- /* Initialize the connection with a fake destination */
- zsock.setup(child, "127.0.0.1", 0, ZSOCK_TYPE_TCP, FALSE);
-
- /* Set the correct socket */
- *((SOCKET*)child->socket) = sock;
- child->connected = TRUE;
-
- return TRUE;
-}
-
-bool init_socks_win()
-{
- WSADATA wsaData;
- WORD version;
- int error;
-
- version = MAKEWORD( 2, 0 );
-
- error = WSAStartup( version, &wsaData );
-
- /* check for error */
- if ( error != 0 )
- {
- /* error occured */
- return FALSE;
- }
-
- /* check for correct version */
- if ( LOBYTE( wsaData.wVersion ) != 2 ||
- HIBYTE( wsaData.wVersion ) != 0 )
- {
- /* incorrect WinSock version */
- WSACleanup();
- return FALSE;
- }
-
- return TRUE;
-}
-#endif
-
-/*
- ****************************** And there is the unix sockets **************************
- */
-#ifdef USE_UNIXSOCK
-#include <netinet/in.h>
-#include <arpa/inet.h>
-#include <sys/socket.h>
-#include <netdb.h>
-#include <signal.h>
-
-void handle_timer(int sig)
-{
- zsock_handle_callbacks();
-}
-
-static struct sigaction handle_old_alarm;
-bool zsock_add_timer_unix(timer_callback callback)
-{
- zsock_add_timer_callback(callback);
-
- /* Is it the first callback ? then we must create the timer */
- if (zsock.__timers == 1)
- {
- struct sigaction new_sig;
-
- /* Register the timer */
- new_sig.sa_handler = handle_timer;
- new_sig.sa_flags = 0;
- sigaction(SIGALRM, &new_sig, &handle_old_alarm);
-
- ualarm(ZSOCK_TIMER_DELAY * 1000, ZSOCK_TIMER_DELAY * 1000);
- }
- return TRUE;
-}
-
-bool zsock_remove_timer_unix(timer_callback callback)
-{
- zsock_remove_timer_callback(callback);
-
- /* No more callbacks ? no need for the timer then */
- if (!zsock.__timers)
- {
- alarm(0);
- sigaction(SIGALRM, &handle_old_alarm, NULL);
- }
- return TRUE;
-}
-
-bool zsock_setup_unix(ip_connection *conn, cptr conn_ip, int port, byte conn_type, bool server)
-{
- /* Already setup! */
- if (conn->setup) return FALSE;
-
- MAKE(conn->socket, int);
-
- if (!server)
- {
- struct hostent *host;
-
- host = gethostbyname(conn_ip);
- conn->conn_ip = ((struct in_addr *)(host->h_addr))->s_addr;
- }
- else
- conn->conn_ip = 0;
-
- conn->conn_type = conn_type;
- conn->conn_port = htons(port);
-
- conn->setup = TRUE;
- conn->server = server;
-
- conn->lost_conn = NULL;
-
- return TRUE;
-}
-
-bool zsock_unsetup_unix(ip_connection *conn)
-{
- /* Already unsetup */
- if (!conn->setup) return FALSE;
-
- FREE(conn->socket, int);
-
- return TRUE;
-}
-
-bool zsock_open_unix(ip_connection *conn)
-{
- struct sockaddr_in sin;
-
- /* Already connected */
- if (conn->connected) return FALSE;
-
- *((int*)conn->socket) = socket(AF_INET, SOCK_STREAM, 0);
-
- memset(&sin, 0, sizeof(sin));
- sin.sin_family = AF_INET;
- sin.sin_addr.s_addr = conn->conn_ip;
- sin.sin_port = conn->conn_port;
-
- if (conn->server)
- {
- int option = 1;
-
- /* Set this so we don't wait forever on startups */
- if ( -1 == setsockopt(*((int*)conn->socket), SOL_SOCKET, SO_REUSEADDR , (void*)&option, sizeof(int))) return FALSE;
-
- if ( -1 == bind(*((int*)conn->socket), (struct sockaddr*)&sin, sizeof(sin)))
- return FALSE;
-
- if ( -1 == listen(*((int*)conn->socket), 10)) return FALSE;
- }
- else
- {
- if (connect(*((int*)conn->socket), (struct sockaddr*)&sin, sizeof sin) == -1)
- {
- /* could not connect to server */
- return (FALSE);
- }
- }
-
- conn->connected = TRUE;
- return TRUE;
-}
-
-bool zsock_can_read_unix(ip_connection *conn)
-{
- struct timeval t;
- fd_set rd;
- int *c = conn->socket;
-
- if (!conn->connected) return FALSE;
-
- FD_ZERO(&rd);
- FD_SET(*c, &rd);
- t.tv_sec = 0;
- t.tv_usec = 0;
- select(*c + 1, &rd, NULL, NULL, &t);
- if (FD_ISSET(*c, &rd)) return TRUE;
- else return (FALSE);
-}
-
-bool zsock_wait_unix(ip_connection *conn, int seconds)
-{
- struct timeval t;
- fd_set rd;
- int *c = conn->socket;
-
- if (!conn->connected) return FALSE;
-
- t.tv_sec = seconds;
- t.tv_usec = 0;
-
- FD_ZERO(&rd);
- FD_SET(*c, &rd);
- select(*c + 1, &rd, NULL, NULL, &t);
- if (FD_ISSET(*c, &rd)) return TRUE;
- else return (FALSE);
-}
-
-bool zsock_close_unix(ip_connection *conn)
-{
- int *c = conn->socket;
-
- /* Already disconnected */
- if (!conn->connected) return FALSE;
-
- close(*c);
- conn->connected = FALSE;
- return TRUE;
-}
-
-bool zsock_write_unix(ip_connection *conn, cptr str, int *size)
-{
- int *c = conn->socket;
-
- if (conn->server) return FALSE;
- if (!conn->connected) return FALSE;
-
- if ((*size = send(*c, str, (!*size) ? (s32b)strlen(str) : *size, 0)) <= 0)
- {
- /* Oups connection died! */
- if (conn->lost_conn) conn->lost_conn(conn);
- zsock.close(conn);
- return FALSE;
- }
- return TRUE;
-}
-
-bool zsock_read_unix(ip_connection *conn, char *str, int *len, bool raw)
-{
- char c;
- int l = 0;
- int *cc = conn->socket;
-
- if (conn->server) return FALSE;
- if (!conn->connected) return FALSE;
-
- if (!raw)
- {
- /* This *IS* fucking slow */
- while ((l < *len) && zsock_can_read_unix(conn))
- {
- if (recv(*cc, &c, 1, 0) <= 0)
- {
- /* Oups connection died! */
- if (conn->lost_conn) conn->lost_conn(conn);
- zsock.close(conn);
- return FALSE;
- }
- if (c == '\r') continue;
- if (c == '\n') break;
- str[l++] = c;
- }
- str[l] = '\0';
- *len = l;
- return TRUE;
- }
- else
- {
- if ((*len = recv(*cc, str, *len, 0)) <= 0)
- {
- /* Oups connection died! */
- if (conn->lost_conn) conn->lost_conn(conn);
- zsock.close(conn);
- return FALSE;
- }
- return TRUE;
- }
-}
-
-bool zsock_accept_unix(ip_connection *conn, ip_connection *child)
-{
- int *s = conn->socket;
- int sock;
- struct sockaddr_in sin;
- unsigned int len;
-
- if (!conn->server) return FALSE;
- if (!conn->connected) return FALSE;
-
- len = sizeof(sin);
- sock = accept(*s, (struct sockaddr*) & sin, &len);
-
- if (sock == -1) return FALSE;
-
- /* Initialize the connection with a fake destination */
- zsock.setup(child, "127.0.0.1", 0, ZSOCK_TYPE_TCP, FALSE);
-
- /* Set the correct socket */
- *((int*)child->socket) = sock;
- child->connected = TRUE;
-
- return TRUE;
-}
-
-#endif
-
-/* The zsock hook list */
-zsock_hooks zsock;
-
-/*
- * Dummy hooks for systems without socks
- */
-bool zsock_setup_dummy(ip_connection *conn, cptr conn_ip, int port, byte conn_type, bool server)
-{
- return FALSE;
-}
-
-bool zsock_unsetup_dummy(ip_connection *conn)
-{
- return FALSE;
-}
-
-bool zsock_open_dummy(ip_connection *conn)
-{
- return FALSE;
-}
-
-bool zsock_can_read_dummy(ip_connection *conn)
-{
- return (FALSE);
-}
-
-bool zsock_wait_dummy(ip_connection *conn, int seconds)
-{
- return (FALSE);
-}
-
-bool zsock_close_dummy(ip_connection *conn)
-{
- return FALSE;
-}
-
-bool zsock_write_dummy(ip_connection *conn, cptr str, int *size)
-{
- return FALSE;
-}
-
-bool zsock_read_dummy(ip_connection *conn, char *str, int *len, bool raw)
-{
- return FALSE;
-}
-
-bool zsock_accept_dummy(ip_connection *conn, ip_connection *child)
-{
- return FALSE;
-}
-
-bool zsock_add_timer_dummy(timer_callback callback)
-{
- return TRUE;
-}
-
-bool zsock_remove_timer_dummy(timer_callback callback)
-{
- return TRUE;
-}
-
-void dummy_socks()
-{
- zsock.setup = zsock_setup_dummy;
- zsock.unsetup = zsock_unsetup_dummy;
- zsock.open = zsock_open_dummy;
- zsock.close = zsock_close_dummy;
- zsock.write = zsock_write_dummy;
- zsock.read = zsock_read_dummy;
- zsock.accept = zsock_accept_dummy;
- zsock.can_read = zsock_can_read_dummy;
- zsock.wait = zsock_wait_dummy;
- zsock.add_timer = zsock_add_timer_dummy;
- zsock.remove_timer = zsock_remove_timer_dummy;
-}
-
-/*
- * Initialize the hooks
- */
-static bool init_once = TRUE;
-bool zsock_init()
-{
- /* Sadly on some platforms we will be called 2 times ... */
- if (init_once)
- {
- /* Set the timers */
- zsock.__timers = 0;
- zsock.__timer_callbacks = NULL;
- init_once = FALSE;
- }
-
- /* Set the few system independants functions */
- zsock.new_connection = zsock_new_connection;
- zsock.free_connection = zsock_free_connection;
- zsock.set_lose_connection = zsock_set_lose_connection;
- zsock.write_simple = zsock_write_simple;
- zsock.read_simple = zsock_read_simple;
-
-#ifdef USE_WINSOCK
- if (init_socks_win())
- {
- zsock.setup = zsock_setup_win;
- zsock.unsetup = zsock_unsetup_win;
- zsock.open = zsock_open_win;
- zsock.close = zsock_close_win;
- zsock.write = zsock_write_win;
- zsock.read = zsock_read_win;
- zsock.accept = zsock_accept_win;
- zsock.can_read = zsock_can_read_win;
- zsock.wait = zsock_wait_win;
- zsock.add_timer = zsock_add_timer_win;
- zsock.remove_timer = zsock_remove_timer_win;
- return TRUE;
- }
- else
- {
- dummy_socks();
- return TRUE;
- }
-#elif defined(USE_UNIXSOCK)
-zsock.setup = zsock_setup_unix;
- zsock.unsetup = zsock_unsetup_unix;
- zsock.open = zsock_open_unix;
- zsock.close = zsock_close_unix;
- zsock.write = zsock_write_unix;
- zsock.read = zsock_read_unix;
- zsock.accept = zsock_accept_unix;
- zsock.can_read = zsock_can_read_unix;
- zsock.wait = zsock_wait_unix;
- zsock.add_timer = zsock_add_timer_unix;
- zsock.remove_timer = zsock_remove_timer_unix;
- return TRUE;
-#else
- dummy_socks();
- return TRUE;
-#endif
-}
diff --git a/src/z-sock.h b/src/z-sock.h
deleted file mode 100644
index c842668e..00000000
--- a/src/z-sock.h
+++ /dev/null
@@ -1,127 +0,0 @@
-/* File: z-sock.h */
-
-/*
- * Copyright (c) 2002 DarkGod
- *
- * This software may be copied and distributed for educational, research,
- * and not for profit purposes provided that this copyright and statement
- * are included in all such copies.
- */
-
-#ifndef INCLUDED_Z_SOCK_H
-#define INCLUDED_Z_SOCK_H
-
-#include "h-basic.h"
-
-/*
- * This represents an IP connection
- */
-typedef struct ip_connection ip_connection;
-
-/* A callback used when the connection suddently dies */
-typedef void (*lose_connection_hook)(ip_connection *conn);
-
-struct ip_connection
-{
- bool setup; /* Has it been setted up yet? */
-
- long conn_ip; /* The IP where to connect to */
- int conn_port; /* The port where to connect to */
- byte conn_type; /* Type of connection */
-
- bool connected; /* The connection status */
- void *socket; /* The socket for the connection */
-
- lose_connection_hook lost_conn; /* Called when the conenction dies */
-
- bool server; /* Is it a server socket ? */
-};
-
-/*
- * Possible connection types
- */
-#define ZSOCK_TYPE_TCP 1
-/* #define ZSOCK_TYPE_UDP 2 */
-
-
-/*
- * The time in milliseconds when to call the sockets callbacks for the timer
- */
-#define ZSOCK_TIMER_DELAY 100
-
-/* Timer callbacks */
-typedef void (*timer_callback)(void);
-typedef struct timer_callback_list timer_callback_list;
-struct timer_callback_list
-{
- timer_callback callback;
- timer_callback_list *next;
-};
-
-/*
- * Hooks needed for a main-foo.c to be sock-able
- */
-typedef struct zsock_hooks zsock_hooks;
-struct zsock_hooks
-{
- /* Creates a struct */
- ip_connection *(*new_connection)(void);
-
- /* Free it */
- void (*free_connection)(ip_connection *c);
-
- /* Setup a connection, but do NOT connect */
- bool (*setup)(ip_connection *conn, cptr conn_ip, int port, byte conn_type, bool server);
-
- /* Unsetup a connection, but and DO close before if needed */
- bool (*unsetup)(ip_connection *conn);
-
- /* Open(connect) a well setup-ed connection */
- bool (*open)(ip_connection *conn);
-
- /* Close a connected connection */
- bool (*close)(ip_connection *conn);
-
- /* Send data on the connection */
- bool (*write)(ip_connection *conn, cptr str, int *size);
-
- /* Read data on the connection */
- bool (*read)(ip_connection *conn, char *str, int *len, bool raw);
-
- /* Send data on the connection -- easy to use */
- bool (*write_simple)(ip_connection *conn, cptr str);
-
- /* Read data on the connection -- easy to use */
- bool (*read_simple)(ip_connection *conn, char *str, int len);
-
- /* Set the dying connection callback */
- void (*set_lose_connection)(ip_connection *conn, lose_connection_hook hook);
-
- /* Accept a connection */
- bool (*accept)(ip_connection *conn, ip_connection *child);
-
- /* Check if there is any data to be read and return instantly in any case */
- bool (*can_read)(ip_connection *conn);
-
- /* Wait until there is any data to be read and return after seconds time in any case */
- bool (*wait)(ip_connection *conn, int seconds);
-
-
- /*
- * Timer stuff, I hope I can make that look better
- */
- int __timers;
- timer_callback_list *__timer_callbacks;
-
- /* Setup the timer */
- bool (*add_timer)(timer_callback callback);
-
- /* Remove the timer */
- bool (*remove_timer)(timer_callback callback);
-};
-
-extern zsock_hooks zsock;
-
-extern bool zsock_init(void);
-
-#endif
diff --git a/src/z-term.c b/src/z-term.c
index b93d8470..4e89ffb7 100644
--- a/src/z-term.c
+++ b/src/z-term.c
@@ -300,8 +300,6 @@ static errr term_win_nuke(term_win *s, int w, int h)
C_KILL(s->va, h * w, byte);
C_KILL(s->vc, h * w, char);
-#ifdef USE_TRANSPARENCY
-
/* Free the terrain access arrays */
C_KILL(s->ta, h, byte*);
C_KILL(s->tc, h, char*);
@@ -310,8 +308,6 @@ static errr term_win_nuke(term_win *s, int w, int h)
C_KILL(s->vta, h * w, byte);
C_KILL(s->vtc, h * w, char);
-#ifdef USE_EGO_GRAPHICS
-
/* Free the ego graphics access arrays */
C_KILL(s->ea, h, byte*);
C_KILL(s->ec, h, char*);
@@ -320,10 +316,6 @@ static errr term_win_nuke(term_win *s, int w, int h)
C_KILL(s->vea, h * w, byte);
C_KILL(s->vec, h * w, char);
-#endif /* USE_EGO_GRAPHICS */
-
-#endif /* USE_TRANSPARENCY */
-
/* Success */
return (0);
}
@@ -344,8 +336,6 @@ static errr term_win_init(term_win *s, int w, int h)
C_MAKE(s->va, h * w, byte);
C_MAKE(s->vc, h * w, char);
-#ifdef USE_TRANSPARENCY
-
/* Make the terrain access arrays */
C_MAKE(s->ta, h, byte*);
C_MAKE(s->tc, h, char*);
@@ -354,8 +344,6 @@ static errr term_win_init(term_win *s, int w, int h)
C_MAKE(s->vta, h * w, byte);
C_MAKE(s->vtc, h * w, char);
-#ifdef USE_EGO_GRAPHICS
-
/* Make the ego graphics access arrays */
C_MAKE(s->ea, h, byte*);
C_MAKE(s->ec, h, char*);
@@ -364,10 +352,6 @@ static errr term_win_init(term_win *s, int w, int h)
C_MAKE(s->vea, h * w, byte);
C_MAKE(s->vec, h * w, char);
-#endif /* USE_EGO_GRAPHICS */
-
-#endif /* USE_TRANSPARENCY */
-
/* Prepare the window access arrays */
for (y = 0; y < h; y++)
@@ -375,20 +359,12 @@ static errr term_win_init(term_win *s, int w, int h)
s->a[y] = s->va + w * y;
s->c[y] = s->vc + w * y;
-#ifdef USE_TRANSPARENCY
-
s->ta[y] = s->vta + w * y;
s->tc[y] = s->vtc + w * y;
-#ifdef USE_EGO_GRAPHICS
-
s->ea[y] = s->vea + w * y;
s->ec[y] = s->vec + w * y;
-#endif /* USE_EGO_GRAPHICS */
-
-#endif /* USE_TRANSPARENCY */
-
}
/* Success */
@@ -412,41 +388,28 @@ static errr term_win_copy(term_win *s, term_win *f, int w, int h)
byte *s_aa = s->a[y];
char *s_cc = s->c[y];
-#ifdef USE_TRANSPARENCY
-
byte *f_taa = f->ta[y];
char *f_tcc = f->tc[y];
byte *s_taa = s->ta[y];
char *s_tcc = s->tc[y];
-#ifdef USE_EGO_GRAPHICS
-
byte *f_eaa = f->ea[y];
char *f_ecc = f->ec[y];
byte *s_eaa = s->ea[y];
char *s_ecc = s->ec[y];
-#endif /* USE_EGO_GRAPHICS */
-
-#endif /* USE_TRANSPARENCY */
-
for (x = 0; x < w; x++)
{
*s_aa++ = *f_aa++;
*s_cc++ = *f_cc++;
-#ifdef USE_TRANSPARENCY
*s_taa++ = *f_taa++;
*s_tcc++ = *f_tcc++;
-#ifdef USE_EGO_GRAPHICS
*s_eaa++ = *f_eaa++;
*s_ecc++ = *f_ecc++;
-#endif /* USE_EGO_GRAPHICS */
-#endif /* USE_TRANSPARENCY */
-
}
}
@@ -538,26 +501,10 @@ static errr Term_text_hack(int x, int y, int n, byte a, const char *cp)
/*
* Hack -- fake hook for "Term_pict()" (see above)
*/
-#ifdef USE_TRANSPARENCY
-#ifdef USE_EGO_GRAPHICS
static errr Term_pict_hack(int x, int y, int n, const byte *ap, const char *cp, const byte *tap, const char *tcp, const byte *eap, const char *ecp)
-#else /* USE_EGO_GRAPHICS */
-static errr Term_pict_hack(int x, int y, int n, const byte *ap, const char *cp, const byte *tap, const char *tcp)
-#endif /* USE_EGO_GRAPHICS */
-#else /* USE_TRANSPARENCY */
-static errr Term_pict_hack(int x, int y, int n, const byte *ap, const char *cp)
-#endif /* USE_TRANSPARENCY */
{
/* Compiler silliness */
-#ifdef USE_TRANSPARENCY
-#ifdef USE_EGO_GRAPHICS
if (x || y || n || ap || cp || tap || tcp || eap || ecp) return ( -2);
-#else /* USE_EGO_GRAPHICS */
-if (x || y || n || ap || cp || tap || tcp) return ( -2);
-#endif /* USE_EGO_GRAPHICS */
-#else /* USE_TRANSPARENCY */
- if (x || y || n || ap || cp) return ( -2);
-#endif /* USE_TRANSPARENCY */
/* Oops */
return ( -1);
@@ -573,28 +520,16 @@ if (x || y || n || ap || cp || tap || tcp) return ( -2);
*
* Assumes given location and values are valid.
*/
-#ifdef USE_TRANSPARENCY
-#ifdef USE_EGO_GRAPHICS
void Term_queue_char(int x, int y, byte a, char c, byte ta, char tc, byte ea, char ec)
-#else /* USE_EGO_GRAPHICS */
-void Term_queue_char(int x, int y, byte a, char c, byte ta, char tc)
-#endif /* USE_EGO_GRAPHICS */
-#else /* USE_TRANSPARENCY */
-void Term_queue_char(int x, int y, byte a, char c)
-#endif /* USE_TRANSPARENCY */
{
term_win *scrn = Term->scr;
byte *scr_aa = &scrn->a[y][x];
char *scr_cc = &scrn->c[y][x];
-#ifdef USE_TRANSPARENCY
-
byte *scr_taa = &scrn->ta[y][x];
char *scr_tcc = &scrn->tc[y][x];
-#ifdef USE_EGO_GRAPHICS
-
byte *scr_eaa = &scrn->ea[y][x];
char *scr_ecc = &scrn->ec[y][x];
@@ -603,39 +538,16 @@ void Term_queue_char(int x, int y, byte a, char c)
(*scr_taa == ta) && (*scr_tcc == tc) &&
(*scr_eaa == ea) && (*scr_ecc == ec)) return;
-#else /* USE_EGO_GRAPHICS */
-
- /* Hack -- Ignore non-changes */
- if ((*scr_aa == a) && (*scr_cc == c) &&
- (*scr_taa == ta) && (*scr_tcc == tc)) return;
-
-#endif /* USE_EGO_GRAPHICS */
-
-#else /* USE_TRANSPARENCY */
-
- /* Hack -- Ignore non-changes */
- if ((*scr_aa == a) && (*scr_cc == c)) return;
-
-#endif /* USE_TRANSPARENCY */
-
/* Save the "literal" information */
*scr_aa = a;
*scr_cc = c;
-#ifdef USE_TRANSPARENCY
-
*scr_taa = ta;
*scr_tcc = tc;
-#ifdef USE_EGO_GRAPHICS
-
*scr_eaa = ea;
*scr_ecc = ec;
-#endif /* USE_EGO_GRAPHICS */
-
-#endif /* USE_TRANSPARENCY */
-
/* Check for new min/max row info */
if (y < Term->y1) Term->y1 = y;
if (y > Term->y2) Term->y2 = y;
@@ -654,15 +566,7 @@ void Term_queue_char(int x, int y, byte a, char c)
* This function is designed to be fast, with no consistancy checking.
* It is used to update the map in the game.
*/
-#ifdef USE_TRANSPARENCY
-#ifdef USE_EGO_GRAPHICS
void Term_queue_line(int x, int y, int n, byte *a, char *c, byte *ta, char *tc, byte *ea, char *ec)
-#else /* USE_EGO_GRAPHICS */
-void Term_queue_line(int x, int y, int n, byte *a, char *c, byte *ta, char *tc)
-#endif /* USE_EGO_GRAPHICS */
-#else /* USE_TRANSPARENCY */
-void Term_queue_line(int x, int y, int n, byte *a, char *c)
-#endif /* USE_TRANSPARENCY */
{
term_win *scrn = Term->scr;
@@ -672,53 +576,33 @@ void Term_queue_line(int x, int y, int n, byte *a, char *c)
byte *scr_aa = &scrn->a[y][x];
char *scr_cc = &scrn->c[y][x];
-#ifdef USE_TRANSPARENCY
-
byte *scr_taa = &scrn->ta[y][x];
char *scr_tcc = &scrn->tc[y][x];
-#ifdef USE_EGO_GRAPHICS
-
byte *scr_eaa = &scrn->ea[y][x];
char *scr_ecc = &scrn->ec[y][x];
-#endif /* USE_EGO_GRAPHICS */
-
-#endif /* USE_TRANSPARENCY */
-
while (n--)
{
-#ifdef USE_TRANSPARENCY
-
-#ifdef USE_EGO_GRAPHICS
/* Hack -- Ignore non-changes */
if ((*scr_aa == *a) && (*scr_cc == *c) &&
(*scr_taa == *ta) && (*scr_tcc == *tc) &&
(*scr_eaa == *ea) && (*scr_ecc == *ec))
-#else /* USE_EGO_GRAPHICS */
- /* Hack -- Ignore non-changes */
- if ((*scr_aa == *a) && (*scr_cc == *c) &&
- (*scr_taa == *ta) && (*scr_tcc == *tc))
-#endif /* USE_EGO_GRAPHICS */
{
x++;
a++;
c++;
ta++;
tc++;
-#ifdef USE_EGO_GRAPHICS
ea++;
ec++;
-#endif /* USE_EGO_GRAPHICS */
scr_aa++;
scr_cc++;
scr_taa++;
scr_tcc++;
-#ifdef USE_EGO_GRAPHICS
scr_eaa++;
scr_ecc++;
-#endif /* USE_EGO_GRAPHICS */
continue;
}
@@ -726,26 +610,9 @@ void Term_queue_line(int x, int y, int n, byte *a, char *c)
*scr_taa++ = *ta++;
*scr_tcc++ = *tc++;
-#ifdef USE_EGO_GRAPHICS
/* Save the "literal" information */
*scr_eaa++ = *ea++;
*scr_ecc++ = *ec++;
-#endif /* USE_EGO_GRAPHICS */
-
-#else /* USE_TRANSPARENCY */
-
- /* Hack -- Ignore non-changes */
- if ((*scr_aa == *a) && (*scr_cc == *c))
- {
- x++;
- a++;
- c++;
- scr_aa++;
- scr_cc++;
- continue;
- }
-
-#endif /* USE_TRANSPARENCY */
/* Save the "literal" information */
*scr_aa++ = *a++;
@@ -790,32 +657,21 @@ void Term_queue_chars(int x, int y, int n, byte a, cptr s)
byte *scr_aa = Term->scr->a[y];
char *scr_cc = Term->scr->c[y];
-#ifdef USE_TRANSPARENCY
-
byte *scr_taa = Term->scr->ta[y];
char *scr_tcc = Term->scr->tc[y];
-#ifdef USE_EGO_GRAPHICS
-
byte *scr_eaa = Term->scr->ea[y];
char *scr_ecc = Term->scr->ec[y];
-#endif /* USE_EGO_GRAPHICS */
-#endif /* USE_TRANSPARENCY */
-
/* Queue the attr/chars */
for ( ; n; x++, s++, n--)
{
int oa = scr_aa[x];
int oc = scr_cc[x];
-#ifdef USE_TRANSPARENCY
-
int ota = scr_taa[x];
int otc = scr_tcc[x];
-#ifdef USE_EGO_GRAPHICS
-
int oea = scr_eaa[x];
int oec = scr_ecc[x];
@@ -824,38 +680,17 @@ void Term_queue_chars(int x, int y, int n, byte a, cptr s)
(ota == 0) && (otc == 0) &&
(oea == 0) && (oec == 0)) continue;
-#else /* USE_EGO_GRAPHICS */
-
- /* Hack -- Ignore non-changes */
- if ((oa == a) && (oc == *s) && (ota == 0) && (otc == 0)) continue;
-
-#endif /* USE_EGO_GRAPHICS */
-
-#else /* USE_TRANSPARENCY */
-
- /* Hack -- Ignore non-changes */
- if ((oa == a) && (oc == *s)) continue;
-
-#endif /* USE_TRANSPARENCY */
/* Save the "literal" information */
scr_aa[x] = a;
scr_cc[x] = *s;
-#ifdef USE_TRANSPARENCY
-
scr_taa[x] = 0;
scr_tcc[x] = 0;
-#ifdef USE_EGO_GRAPHICS
-
scr_taa[x] = 0;
scr_tcc[x] = 0;
-#endif /* USE_EGO_GRAPHICS */
-
-#endif /* USE_TRANSPARENCY */
-
/* Note the "range" of window updates */
if (x1 < 0) x1 = x;
x2 = x;
@@ -894,8 +729,6 @@ static void Term_fresh_row_pict(int y, int x1, int x2)
byte *scr_aa = Term->scr->a[y];
char *scr_cc = Term->scr->c[y];
-#ifdef USE_TRANSPARENCY
-
byte *old_taa = Term->old->ta[y];
char *old_tcc = Term->old->tc[y];
@@ -908,8 +741,6 @@ static void Term_fresh_row_pict(int y, int x1, int x2)
byte nta;
char ntc;
-#ifdef USE_EGO_GRAPHICS
-
byte *old_eaa = Term->old->ea[y];
char *old_ecc = Term->old->ec[y];
@@ -922,9 +753,6 @@ static void Term_fresh_row_pict(int y, int x1, int x2)
byte nea;
char nec;
-#endif /* USE_EGO_GRAPHICS */
-
-#endif /* USE_TRANSPARENCY */
/* Pending length */
@@ -950,16 +778,12 @@ static void Term_fresh_row_pict(int y, int x1, int x2)
na = scr_aa[x];
nc = scr_cc[x];
-#ifdef USE_TRANSPARENCY
-
ota = old_taa[x];
otc = old_tcc[x];
nta = scr_taa[x];
ntc = scr_tcc[x];
-#ifdef USE_EGO_GRAPHICS
-
oea = old_eaa[x];
oec = old_ecc[x];
@@ -970,38 +794,15 @@ static void Term_fresh_row_pict(int y, int x1, int x2)
if ((na == oa) && (nc == oc) &&
(nta == ota) && (ntc == otc) &&
(nea == oea) && (nec == oec))
-
-#else /* USE_EGO_GRAPHICS */
-
- /* Handle unchanged grids */
- if ((na == oa) && (nc == oc) && (nta == ota) && (ntc == otc))
-
-#endif /* USE_EGO_GRAPHICS */
-
-#else /* USE_TRANSPARENCY */
-
- /* Handle unchanged grids */
- if ((na == oa) && (nc == oc))
-
-#endif /* USE_TRANSPARENCY */
{
/* Flush */
if (fn)
{
/* Draw pending attr/char pairs */
-#ifdef USE_TRANSPARENCY
-#ifdef USE_EGO_GRAPHICS
(void)((*Term->pict_hook)(fx, y, fn,
&scr_aa[fx], &scr_cc[fx],
&scr_taa[fx], &scr_tcc[fx],
&scr_eaa[fx], &scr_ecc[fx]));
-#else /* USE_EGO_GRAPHICS */
- (void)((*Term->pict_hook)(fx, y, fn,
- &scr_aa[fx], &scr_cc[fx], &scr_taa[fx], &scr_tcc[fx]));
-#endif
-#else /* USE_TRANSPARENCY */
- (void)((*Term->pict_hook)(fx, y, fn, &scr_aa[fx], &scr_cc[fx]));
-#endif /* USE_TRANSPARENCY */
/* Forget */
fn = 0;
@@ -1014,16 +815,11 @@ static void Term_fresh_row_pict(int y, int x1, int x2)
old_aa[x] = na;
old_cc[x] = nc;
-#ifdef USE_TRANSPARENCY
old_taa[x] = nta;
old_tcc[x] = ntc;
-#ifdef USE_EGO_GRAPHICS
old_eaa[x] = nea;
old_ecc[x] = nec;
-#endif /* USE_EGO_GRAPHICS */
-
-#endif /* USE_TRANSPARENCY */
/* Restart and Advance */
if (fn++ == 0) fx = x;
@@ -1033,19 +829,10 @@ static void Term_fresh_row_pict(int y, int x1, int x2)
if (fn)
{
/* Draw pending attr/char pairs */
-#ifdef USE_TRANSPARENCY
-#ifdef USE_EGO_GRAPHICS
(void)((*Term->pict_hook)(fx, y, fn,
&scr_aa[fx], &scr_cc[fx],
&scr_taa[fx], &scr_tcc[fx],
&scr_eaa[fx], &scr_ecc[fx]));
-#else /* USE_EGO_GRAPHICS */
- (void)((*Term->pict_hook)(fx, y, fn,
- &scr_aa[fx], &scr_cc[fx], &scr_taa[fx], &scr_tcc[fx]));
-#endif /* USE_EGO_GRAPHICS */
-#else /* USE_TRANSPARENCY */
- (void)((*Term->pict_hook)(fx, y, fn, &scr_aa[fx], &scr_cc[fx]));
-#endif /* USE_TRANSPARENCY */
}
}
@@ -1067,7 +854,6 @@ static void Term_fresh_row_both(int y, int x1, int x2)
byte *scr_aa = Term->scr->a[y];
char *scr_cc = Term->scr->c[y];
-#ifdef USE_TRANSPARENCY
byte *old_taa = Term->old->ta[y];
char *old_tcc = Term->old->tc[y];
byte *scr_taa = Term->scr->ta[y];
@@ -1078,7 +864,6 @@ static void Term_fresh_row_both(int y, int x1, int x2)
byte nta;
char ntc;
-#ifdef USE_EGO_GRAPHICS
byte *old_eaa = Term->old->ea[y];
char *old_ecc = Term->old->ec[y];
byte *scr_eaa = Term->scr->ea[y];
@@ -1088,9 +873,6 @@ static void Term_fresh_row_both(int y, int x1, int x2)
char oec;
byte nea;
char nec;
-#endif /* USE_EGO_GRAPHICS */
-
-#endif /* USE_TRANSPARENCY */
/* The "always_text" flag */
int always_text = Term->always_text;
@@ -1121,15 +903,12 @@ static void Term_fresh_row_both(int y, int x1, int x2)
na = scr_aa[x];
nc = scr_cc[x];
-#ifdef USE_TRANSPARENCY
-
ota = old_taa[x];
otc = old_tcc[x];
nta = scr_taa[x];
ntc = scr_tcc[x];
-#ifdef USE_EGO_GRAPHICS
oea = old_eaa[x];
oec = old_ecc[x];
@@ -1140,21 +919,6 @@ static void Term_fresh_row_both(int y, int x1, int x2)
if ((na == oa) && (nc == oc) &&
(nta == ota) && (ntc == otc) &&
(nea == oea) && (nec == oec))
-
-#else /* USE_EGO_GRAPHICS */
-
-/* Handle unchanged grids */
- if ((na == oa) && (nc == oc) && (nta == ota) && (ntc == otc))
-
-#endif /* USE_EGO_GRAPHICS */
-
-#else /* USE_TRANSPARENCY */
-
- /* Handle unchanged grids */
- if ((na == oa) && (nc == oc))
-
-#endif /* USE_TRANSPARENCY */
-
{
/* Flush */
if (fn)
@@ -1181,20 +945,12 @@ static void Term_fresh_row_both(int y, int x1, int x2)
old_aa[x] = na;
old_cc[x] = nc;
-#ifdef USE_TRANSPARENCY
-
old_taa[x] = nta;
old_tcc[x] = ntc;
-#ifdef USE_EGO_GRAPHICS
-
old_eaa[x] = nea;
old_ecc[x] = nec;
-#endif /* USE_EGO_GRAPHICS */
-
-#endif /* USE_TRANSPARENCY */
-
/* 2nd byte of bigtile */
if (na == 255) continue;
@@ -1218,27 +974,9 @@ static void Term_fresh_row_both(int y, int x1, int x2)
fn = 0;
}
-#ifdef USE_TRANSPARENCY
-
-#ifdef USE_EGO_GRAPHICS
-
/* Hack -- Draw the special attr/char pair */
(void)((*Term->pict_hook)(x, y, 1, &na, &nc, &nta, &ntc, &nea, &nec));
-#else /* USE_EGO_GRAPHICS */
-
-/* Hack -- Draw the special attr/char pair */
- (void)((*Term->pict_hook)(x, y, 1, &na, &nc, &nta, &ntc));
-
-#endif /* USE_EGO_GRAPHICS */
-
-#else /* USE_TRANSPARENCY */
-
- /* Hack -- Draw the special attr/char pair */
- (void)((*Term->pict_hook)(x, y, 1, &na, &nc));
-
-#endif /* USE_TRANSPARENCY */
-
/* Skip */
continue;
}
@@ -1591,20 +1329,12 @@ errr Term_fresh(void)
byte *aa = old->a[y];
char *cc = old->c[y];
-#ifdef USE_TRANSPARENCY
-
byte *taa = old->ta[y];
char *tcc = old->tc[y];
-#ifdef USE_EGO_GRAPHICS
-
byte *eaa = old->ea[y];
char *ecc = old->ec[y];
-#endif /* USE_EGO_GRAPHICS */
-
-#endif /* USE_TRANSPARENCY */
-
/* Wipe each column */
for (x = 0; x < w; x++)
@@ -1613,20 +1343,11 @@ errr Term_fresh(void)
*aa++ = na;
*cc++ = nc;
-#ifdef USE_TRANSPARENCY
-
*taa++ = na;
*tcc++ = nc;
-#ifdef USE_EGO_GRAPHICS
-
*eaa++ = na;
*ecc++ = nc;
-
-#endif /* USE_EGO_GRAPHICS */
-
-#endif /* USE_TRANSPARENCY */
-
}
}
@@ -1661,52 +1382,28 @@ errr Term_fresh(void)
byte oa = old_aa[tx];
char oc = old_cc[tx];
-#ifdef USE_TRANSPARENCY
-
byte *old_taa = old->ta[ty];
char *old_tcc = old->tc[ty];
byte ota = old_taa[tx];
char otc = old_tcc[tx];
-#ifdef USE_EGO_GRAPHICS
-
byte *old_eaa = old->ea[ty];
char *old_ecc = old->ec[ty];
byte oea = old_eaa[tx];
char oec = old_ecc[tx];
-#endif /* USE_EGO_GRAPHICS */
-
-#endif /* USE_TRANSPARENCY */
-
/* Hack -- use "Term_pict()" always */
if (Term->always_pict)
{
-#ifdef USE_TRANSPARENCY
-#ifdef USE_EGO_GRAPHICS
(void)((*Term->pict_hook)(tx, ty, 1, &oa, &oc, &ota, &otc, &oea, &oec));
-#else /* USE_EGO_GRAPHICS */
- (void)((*Term->pict_hook)(tx, ty, 1, &oa, &oc, &ota, &otc));
-#endif /* USE_EGO_GRAPHICS */
-#else /* USE_TRANSPARENCY */
- (void)((*Term->pict_hook)(tx, ty, 1, &oa, &oc));
-#endif /* USE_TRANSPARENCY */
}
/* Hack -- use "Term_pict()" sometimes */
else if (Term->higher_pict && (oa & 0x80))
{
-#ifdef USE_TRANSPARENCY
-#ifdef USE_EGO_GRAPHICS
(void)((*Term->pict_hook)(tx, ty, 1, &oa, &oc, &ota, &otc, &oea, &oec));
-#else /* USE_EGO_GRAPHICS */
-(void)((*Term->pict_hook)(tx, ty, 1, &oa, &oc, &ota, &otc));
-#endif /* USE_EGO_GRAPHICS */
-#else /* USE_TRANSPARENCY */
- (void)((*Term->pict_hook)(tx, ty, 1, &oa, &oc));
-#endif /* USE_TRANSPARENCY */
}
/* Hack -- restore the actual character */
@@ -1932,15 +1629,7 @@ errr Term_draw(int x, int y, byte a, char c)
if (!c) return ( -2);
/* Queue it for later */
-#ifdef USE_TRANSPARENCY
-#ifdef USE_EGO_GRAPHICS
Term_queue_char(x, y, a, c, 0, 0, 0, 0);
-#else /* USE_EGO_GRAPHICS */
-Term_queue_char(x, y, a, c, 0, 0);
-#endif /* USE_EGO_GRAPHICS */
-#else /* USE_TRANSPARENCY */
- Term_queue_char(x, y, a, c);
-#endif /* USE_TRANSPARENCY */
/* Success */
return (0);
@@ -1974,15 +1663,7 @@ errr Term_addch(byte a, char c)
if (!c) return ( -2);
/* Queue the given character for display */
-#ifdef USE_TRANSPARENCY
-#ifdef USE_EGO_GRAPHICS
Term_queue_char(Term->scr->cx, Term->scr->cy, a, c, 0, 0, 0, 0);
-#else /* USE_EGO_GRAPHICS */
- Term_queue_char(Term->scr->cx, Term->scr->cy, a, c, 0, 0);
-#endif /* USE_EGO_GRAPHICS */
-#else /* USE_TRANSPARENCY */
- Term_queue_char(Term->scr->cx, Term->scr->cy, a, c);
-#endif /* USE_TRANSPARENCY */
/* Advance the cursor */
Term->scr->cx++;
@@ -2107,15 +1788,11 @@ errr Term_erase(int x, int y, int n)
byte *scr_aa;
char *scr_cc;
-#ifdef USE_TRANSPARENCY
byte *scr_taa;
char *scr_tcc;
-#ifdef USE_EGO_GRAPHICS
byte *scr_eaa;
char *scr_ecc;
-#endif /* USE_EGO_GRAPHICS */
-#endif /* USE_TRANSPARENCY */
/* Place cursor */
if (Term_gotoxy(x, y)) return ( -1);
@@ -2127,15 +1804,11 @@ errr Term_erase(int x, int y, int n)
scr_aa = Term->scr->a[y];
scr_cc = Term->scr->c[y];
-#ifdef USE_TRANSPARENCY
scr_taa = Term->scr->ta[y];
scr_tcc = Term->scr->tc[y];
-#ifdef USE_EGO_GRAPHICS
scr_eaa = Term->scr->ea[y];
scr_ecc = Term->scr->ec[y];
-#endif
-#endif /* USE_TRANSPARENCY */
if (n > 0 && (byte)scr_cc[x] == 255 && scr_aa[x] == 255)
{
@@ -2156,15 +1829,11 @@ errr Term_erase(int x, int y, int n)
scr_aa[x] = na;
scr_cc[x] = nc;
-#ifdef USE_TRANSPARENCY
scr_taa[x] = 0;
scr_tcc[x] = 0;
-#ifdef USE_EGO_GRAPHICS
scr_eaa[x] = 0;
scr_ecc[x] = 0;
-#endif /* USE_EGO_GRAPHICS */
-#endif /* USE_TRANSPARENCY */
/* Track minimum changed column */
if (x1 < 0) x1 = x;
@@ -2217,15 +1886,11 @@ errr Term_clear(void)
byte *scr_aa = Term->scr->a[y];
char *scr_cc = Term->scr->c[y];
-#ifdef USE_TRANSPARENCY
byte *scr_taa = Term->scr->ta[y];
char *scr_tcc = Term->scr->tc[y];
-#ifdef USE_EGO_GRAPHICS
byte *scr_eaa = Term->scr->ea[y];
char *scr_ecc = Term->scr->ec[y];
-#endif /* USE_EGO_GRAPHICS */
-#endif /* USE_TRANSPARENCY */
/* Wipe each column */
for (x = 0; x < w; x++)
@@ -2233,15 +1898,11 @@ errr Term_clear(void)
scr_aa[x] = na;
scr_cc[x] = nc;
-#ifdef USE_TRANSPARENCY
scr_taa[x] = 0;
scr_tcc[x] = 0;
-#ifdef USE_EGO_GRAPHICS
scr_eaa[x] = 0;
scr_ecc[x] = 0;
-#endif /* USE_EGO_GRAPHICS */
-#endif /* USE_TRANSPARENCY */
}
/* This row has changed */
@@ -2300,18 +1961,6 @@ errr Term_redraw_section(int x1, int y1, int x2, int y2)
char *c_ptr;
-#if 0 // DGDGDGDG
- /* Pat */
- if ((do_movies == 1) && IN_MAINWINDOW)
- {
- if (!cmovie_get_msecond())
- {
- fprintf(movfile, "W:1:\n");
- }
- }
- /* Endpat */
-#endif
-
/* Bounds checking */
if (y2 >= Term->hgt) y2 = Term->hgt - 1;
if (x2 >= Term->wid) x2 = Term->wid - 1;
@@ -2455,11 +2104,6 @@ errr Term_keypress(int k)
/* Success (unless overflow) */
if (Term->key_head != Term->key_tail) return (0);
-#if 0
- /* Hack -- Forget the oldest key */
- if (++Term->key_tail == Term->key_size) Term->key_tail = 0;
-#endif
-
/* Problem */
return (1);
}
@@ -2482,11 +2126,6 @@ errr Term_key_push(int k)
/* Success (unless overflow) */
if (Term->key_head != Term->key_tail) return (0);
-#if 0
- /* Hack -- Forget the oldest key */
- if (++Term->key_tail == Term->key_size) Term->key_tail = 0;
-#endif
-
/* Problem */
return (1);
}
@@ -2505,7 +2144,7 @@ errr Term_key_push(int k)
*
* Remove the keypress if "take" is true.
*/
-errr Term_inkey(char *ch, bool wait, bool take)
+errr Term_inkey(char *ch, bool_ wait, bool_ take)
{
/* Assume no key */
(*ch) = '\0';
@@ -2658,7 +2297,7 @@ errr Term_load(void)
/*
* Same as previous but allow to save more than one
*/
-errr Term_load_from(term_win *save, bool final)
+errr Term_load_from(term_win *save, bool_ final)
{
int y;
diff --git a/src/z-term.h b/src/z-term.h
index d7a34530..31e5b308 100644
--- a/src/z-term.h
+++ b/src/z-term.h
@@ -11,6 +11,10 @@
#ifndef INCLUDED_Z_TERM_H
#define INCLUDED_Z_TERM_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+
#include "h-basic.h"
#define IN_MAINWINDOW (Term == term_screen)
@@ -35,7 +39,7 @@ typedef struct term_win term_win;
struct term_win
{
- bool cu, cv;
+ bool_ cu, cv;
byte cx, cy;
byte **a;
@@ -44,22 +48,17 @@ struct term_win
byte *va;
char *vc;
-#ifdef USE_TRANSPARENCY
byte **ta;
char **tc;
byte *vta;
char *vtc;
-#ifdef USE_EGO_GRAPHICS
byte **ea;
char **ec;
byte *vea;
char *vec;
-#endif /* USE_EGO_GRAPHICS */
-
-#endif /* USE_TRANSPARENCY */
};
@@ -173,22 +172,22 @@ struct term
vptr data;
- bool user_flag;
+ bool_ user_flag;
- bool data_flag;
+ bool_ data_flag;
- bool active_flag;
- bool mapped_flag;
- bool total_erase;
- bool fixed_shape;
- bool icky_corner;
- bool soft_cursor;
- bool always_pict;
- bool higher_pict;
- bool always_text;
- bool unused_flag;
- bool never_bored;
- bool never_frosh;
+ bool_ active_flag;
+ bool_ mapped_flag;
+ bool_ total_erase;
+ bool_ fixed_shape;
+ bool_ icky_corner;
+ bool_ soft_cursor;
+ bool_ always_pict;
+ bool_ higher_pict;
+ bool_ always_text;
+ bool_ unused_flag;
+ bool_ never_bored;
+ bool_ never_frosh;
byte attr_blank;
char char_blank;
@@ -230,15 +229,7 @@ struct term
void (*resize_hook)(void);
-#ifdef USE_TRANSPARENCY
-#ifdef USE_EGO_GRAPHICS
errr (*pict_hook)(int x, int y, int n, const byte *ap, const char *cp, const byte *tap, const char *tcp, const byte *eap, const char *ecp);
-#else /* USE_EGO_GRAPHICS */
- errr (*pict_hook)(int x, int y, int n, const byte *ap, const char *cp, const byte *tap, const char *tcp);
-#endif /* USE_EGO_GRAPHICS */
-#else /* USE_TRANSPARENCY */
- errr (*pict_hook)(int x, int y, int n, const byte *ap, const char *cp);
-#endif /* USE_TRANSPARENCY */
};
@@ -303,22 +294,8 @@ extern char scansubdir_dir[1024];
extern int scansubdir_max;
extern cptr scansubdir_result[255];
-#ifdef USE_TRANSPARENCY
-#ifdef USE_EGO_GRAPHICS
extern void Term_queue_char(int x, int y, byte a, char c, byte ta, char tc, byte ea, char ec);
-
extern void Term_queue_line(int x, int y, int n, byte *a, char *c, byte *ta, char *tc, byte *ea, char *ec);
-#else /* USE_EGO_GRAPHICS */
-extern void Term_queue_char(int x, int y, byte a, char c, byte ta, char tc);
-
-extern void Term_queue_line(int x, int y, int n, byte *a, char *c, byte *ta, char *tc);
-#endif /* USE_EGO_GRAPHICS */
-#else /* USE_TRANSPARENCY */
-extern void Term_queue_char(int x, int y, byte a, char c);
-
-extern void Term_queue_line(int x, int y, int n, byte *a, char *c);
-#endif /* USE_TRANSPARENCY */
-
extern void Term_queue_chars(int x, int y, int n, byte a, cptr s);
extern errr Term_fresh(void);
@@ -342,12 +319,12 @@ extern errr Term_what(int x, int y, byte *a, char *c);
extern errr Term_flush(void);
extern errr Term_keypress(int k);
extern errr Term_key_push(int k);
-extern errr Term_inkey(char *ch, bool wait, bool take);
+extern errr Term_inkey(char *ch, bool_ wait, bool_ take);
extern errr Term_save(void);
extern term_win* Term_save_to(void);
extern errr Term_load(void);
-extern errr Term_load_from(term_win *save, bool final);
+extern errr Term_load_from(term_win *save, bool_ final);
extern errr Term_exchange(void);
@@ -358,6 +335,9 @@ extern errr Term_activate(term *t);
extern errr term_nuke(term *t);
extern errr term_init(term *t, int w, int h, int k);
+#ifdef __cplusplus
+} /* extern "C" */
#endif
+#endif
diff --git a/src/z-util.c b/src/z-util.c
index f0842b07..7c5374f3 100644
--- a/src/z-util.c
+++ b/src/z-util.c
@@ -30,12 +30,12 @@ vptr vptr_tmp = NULL;
/*
* Constant bool meaning true
*/
-bool bool_true = 1;
+bool_ bool_true = 1;
/*
* Constant bool meaning false
*/
-bool bool_false = 0;
+bool_ bool_false = 0;
/*
@@ -105,7 +105,7 @@ errr func_failure(void)
/*
* A routine that always returns "true"
*/
-bool func_true(void)
+bool_ func_true(void)
{
return (1);
}
@@ -114,7 +114,7 @@ bool func_true(void)
/*
* A routine that always returns "false"
*/
-bool func_false(void)
+bool_ func_false(void)
{
return (0);
}
@@ -125,8 +125,11 @@ bool func_false(void)
/*
* Determine if string "t" is equal to string "t"
*/
-bool streq(cptr a, cptr b)
+bool_ streq(cptr a, cptr b)
{
+ if ((a == NULL) && (b == NULL)) { return TRUE; }
+ if (a == NULL) { return FALSE; }
+ if (b == NULL) { return FALSE; }
return (!strcmp(a, b));
}
@@ -134,7 +137,7 @@ bool streq(cptr a, cptr b)
/*
* Determine if string "t" is a suffix of string "s"
*/
-bool suffix(cptr s, cptr t)
+bool_ suffix(cptr s, cptr t)
{
int tlen = strlen(t);
int slen = strlen(s);
diff --git a/src/z-util.h b/src/z-util.h
index 64871cf2..11dbdb4e 100644
--- a/src/z-util.h
+++ b/src/z-util.h
@@ -3,6 +3,10 @@
#ifndef INCLUDED_Z_UTIL_H
#define INCLUDED_Z_UTIL_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+
#include "h-basic.h"
@@ -59,14 +63,14 @@ extern errr func_problem(void);
extern errr func_failure(void);
/* Functions that return bools */
-extern bool func_true(void);
-extern bool func_false(void);
+extern bool_ func_true(void);
+extern bool_ func_false(void);
/* Test equality, prefix, suffix */
-extern bool streq(cptr s, cptr t);
-extern bool prefix(cptr s, cptr t);
-extern bool suffix(cptr s, cptr t);
+extern bool_ streq(cptr s, cptr t);
+extern bool_ prefix(cptr s, cptr t);
+extern bool_ suffix(cptr s, cptr t);
/* Print an error message */
@@ -80,5 +84,8 @@ extern void core(cptr str);
+#ifdef __cplusplus
+} /* extern "C" */
#endif
+#endif
diff --git a/src/z-virt.h b/src/z-virt.h
index b45f3905..a7880f2f 100644
--- a/src/z-virt.h
+++ b/src/z-virt.h
@@ -11,6 +11,10 @@
#ifndef INCLUDED_Z_VIRT_H
#define INCLUDED_Z_VIRT_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+
#include "h-basic.h"
#ifdef CHECK_MEMORY_LEAKS
@@ -59,67 +63,49 @@
((huge)(sizeof(T)))
-/* Compare two arrays of type T[N], at locations P1 and P2 */
-#define C_DIFF(P1,P2,N,T) \
- (memcmp((char*)(P1),(char*)(P2),C_SIZE(N,T)))
-
-/* Compare two things of type T, at locations P1 and P2 */
-#define DIFF(P1,P2,T) \
- (memcmp((char*)(P1),(char*)(P2),SIZE(T)))
-
-
-/* Set every byte in an array of type T[N], at location P, to V, and return P */
-#define C_BSET(P,V,N,T) \
- (T*)(memset((char*)(P),(V),C_SIZE(N,T)))
-
-/* Set every byte in a thing of type T, at location P, to V, and return P */
-#define BSET(P,V,T) \
- (T*)(memset((char*)(P),(V),SIZE(T)))
-
-
/* Wipe an array of type T[N], at location P, and return P */
#define C_WIPE(P,N,T) \
- (T*)(memset((char*)(P),0,C_SIZE(N,T)))
+ (memset((char*)(P),0,C_SIZE(N,T)))
/* Wipe a thing of type T, at location P, and return P */
#define WIPE(P,T) \
- (T*)(memset((char*)(P),0,SIZE(T)))
+ (memset((char*)(P),0,SIZE(T)))
/* Load an array of type T[N], at location P1, from another, at location P2 */
#define C_COPY(P1,P2,N,T) \
- (T*)(memcpy((char*)(P1),(char*)(P2),C_SIZE(N,T)))
+ (memcpy((char*)(P1),(char*)(P2),C_SIZE(N,T)))
/* Load a thing of type T, at location P1, from another, at location P2 */
#define COPY(P1,P2,T) \
- (T*)(memcpy((char*)(P1),(char*)(P2),SIZE(T)))
+ (memcpy((char*)(P1),(char*)(P2),SIZE(T)))
/* Free an array of N things of type T at P, return NULL */
#define C_FREE(P,N,T) \
- (T*)(rnfree(P,C_SIZE(N,T)))
+ (rnfree(P,C_SIZE(N,T)))
/* Free one thing of type T at P, return NULL */
#define FREE(P,T) \
- (T*)(rnfree(P,SIZE(T)))
+ (rnfree(P,SIZE(T)))
/* Allocate, and return, an array of type T[N] */
#define C_RNEW(N,T) \
- ((T*)(ralloc(C_SIZE(N,T))))
+ (ralloc(C_SIZE(N,T)))
/* Allocate, and return, a thing of type T */
#define RNEW(T) \
- ((T*)(ralloc(SIZE(T))))
+ (ralloc(SIZE(T)))
/* Allocate, wipe, and return an array of type T[N] */
#define C_ZNEW(N,T) \
- ((T*)(C_WIPE(C_RNEW(N,T),N,T)))
+ (C_WIPE(C_RNEW(N,T),N,T))
/* Allocate, wipe, and return a thing of type T */
#define ZNEW(T) \
- ((T*)(WIPE(RNEW(T),T)))
+ (WIPE(RNEW(T),T))
/* Allocate a wiped array of type T[N], assign to pointer P */
@@ -173,7 +159,10 @@ extern errr string_free(cptr str);
+#ifdef __cplusplus
+} /* extern "C" */
#endif
+#endif
diff --git a/src/z_pack.pkg b/src/z_pack.pkg
index c2582e45..5a46b3b2 100644
--- a/src/z_pack.pkg
+++ b/src/z_pack.pkg
@@ -396,298 +396,3 @@ extern s16b damroll(int num, int sides);
* @note (see file z-rand.c)
*/
extern s16b maxroll(int num, int sides);
-
-
-
-
-
-/*
- ****************** ZSOCKS ***************
- */
-
-/** @struct ip_connection
- * This represents an IP connection
- */
-struct ip_connection
-{
- /** @var setup
- * @brief Boolean
- * @note Has it been setted up yet?
- */
- bool setup;
-
- /** @var conn_ip
- * @brief Number
- * @note The IP where to connect to
- */
- long conn_ip;
-
- /** @var conn_port
- * @brief Number
- * @note The port where to connect to
- */
- int conn_port;
-
- /** @var conn_type
- * @brief Number
- * @note Type of connection
- */
- byte conn_type;
-
- /** @var connected
- * @brief Boolean
- * @note The connection status
- */
- bool connected;
-
- /** @var *socket
- * @brief void
- * @note The socket for the connection
- */
- void *socket;
-
- /** @var server
- * @brief Boolean
- * @note Is it a server socket ?
- */
- bool server;
-};
-
-/*
- * Possible connection types
- */
-/** @def ZSOCK_TYPE_TCP */
-#define ZSOCK_TYPE_TCP 1
-
-/* #define ZSOCK_TYPE_UDP 2 */
-
-
-/** @def ZSOCK_TIMER_DELAY
- * @note The time in milliseconds when to call the sockets callbacks for the
- * timer
- */
-#define ZSOCK_TIMER_DELAY 100
-
-
-/** @struct zsock_hooks
- * @note Hooks needed for a main-foo.c to be sock-able
- */
-struct zsock_hooks
-{
- /** @fn *new_connection()
- * @brief Creates an IP connection.
- * @return ip_connection \n An IP connection.
- * @note (see file z-sock.c)
- */
- ip_connection *new_connection();
-
- /** @fn free_connection(ip_connection *c)
- * @brief Free IP connection "c".\n
- * @param *c ip_connection \n an IP connection.
- * @brief Ip connection
- * @note (see file z-sock.c)
- */
- void free_connection(ip_connection *c);
-
- /** @fn setup(ip_connection *conn, cptr conn_ip, int port, byte conn_type, bool server)
- * @brief Setup a connection, but do NOT connect.\n
- * @param *conn ip_connection \n an IP connection.
- * @brief Ip connection
- * @param conn_ip String \n IP address of host machine.
- * @brief Host ip address
- * @param port Number \n port of host machine.
- * @brief Host port
- * @param conn_type Number \n type of connection.
- * @brief Connection type
- * @param server Boolean \n TRUE if this is a server socket,
- * otherwise FALSE.
- * @brief Server socket?
- * @return Boolean \n TRUE if socket setup successfully, otherwise FALSE.
- * @note
- * You can not setup a connection if it is setup.
- * @note (see file z-sock.c)
- */
- bool setup(ip_connection *conn, cptr conn_ip, int port, byte conn_type, bool server);
-
- /** @fn unsetup(ip_connection *conn)
- * @brief Unsetup a connection, but and DO close before if needed.\n
- * @param *conn ip_connection \n an IP connection.
- * @brief Ip connection
- * @return Boolean \n TRUE if socket was setup, otherwise FALSE.
- * @note
- * You can not unset a connection if it is not setup.
- * @note (see file z-sock.c)
- */
- bool unsetup(ip_connection *conn);
-
- /** @fn open(ip_connection *conn)
- * @brief Open(connect) a well setup-ed connection.\n
- * @param *conn ip_connection \n an IP connection.
- * @brief Ip connection
- * @return Boolean \n TRUE if connection was opened, otherwise FALSE.
- * @note
- * You can not open a connection if it is open.
- * @note (see file z-sock.c)
- */
- bool open(ip_connection *conn);
-
- /** @fn close(ip_connection *conn)
- * @brief Close a connected connection.\n
- * @param *conn ip_connection \n an IP connection.
- * @brief Ip connection
- * @return Boolean \n TRUE if connection was closed, otherwise FALSE.
- * @note
- * You can not close a connection if it is closed.
- * @note (see file z-sock.c)
- */
- bool close(ip_connection *conn);
-
- /** @fn write(ip_connection *conn, cptr str, int *size)
- * @brief Send data on the connection.\n
- * @param *conn ip_connection \n an IP connection.
- * @brief Ip connection
- * @param str String \n the string to send along the connection.
- * @brief String
- * @param *size Number
- * @brief Bytes sent
- * @return Boolean \n TRUE if string was sent successfully,
- * otherwise FALSE.
- * @return *size \n the number of bytes sent.
- * @note
- * This function will return FALSE if you write to a connection which
- * is not connected, or if the connection has died.
- * @note (see file z-sock.c)
- */
- bool write(ip_connection *conn, cptr str, int *size);
-
- /* Read data on the connection */
- /** @fn read(ip_connection *conn, char *str, int *len, bool raw)
- * @brief Read data on connection.\n
- * @param *conn ip_connection \n an IP connection.
- * @brief Ip connection
- * @param *str String
- * @brief String
- * @param *len Number \n the number of bytes to read.
- * @brief Bytes to read
- * @param raw Boolean \n TRUE if all data is to be read at once,
- * otherwise FALSE.
- * @brief Read raw data?
- * @return Boolean \n TRUE if a string was returned, otherwise FALSE.
- * @return *str String \n The string read.
- * @return *len Number \n The number of bytes read.
- * @note
- * @note (see file z-sock.c)
- */
- /* -- DG -- This is done in script.c since it needs a specific wrapper :(
- bool read(ip_connection *conn, char *str, int *len, bool raw);
- */
-
- /** @fn write_simple(ip_connection *conn, cptr str)
- * @brief Send data on the connection.\n
- * @param *conn ip_connection \n an IP connection.
- * @brief Ip connection
- * @param str String \n the string to send along the connection.
- * @brief String
- * @return Boolean \n TRUE if string was sent successfully,
- * otherwise FALSE.
- * @note
- * This is easy to use.
- * @note (see file z-sock.c)
- */
- bool write_simple(ip_connection *conn, cptr str);
-
- /* Read data on the connection -- easy to use */
- /** @fn read_simple(ip_connection *conn, char *str, int len)
- * @brief Read data on the connection.\n
- * @param *conn ip_connection \n an IP connection.
- * @brief Ip connection
- * @param *str String
- * @brief String
- * @param len Number \n the number of bytes to read.
- * @brief Bytes to read
- * @return Boolean \n TRUE if a string was returned, otherwise FALSE.
- * @return *str String \n The string read.
- * @note
- * This function will return FALSE if you read from a connection which
- * is not connected, or if the connection has died.
- * @note (see file z-sock.c)
- */
- bool read_simple(ip_connection *conn, char *str, int len);
-
- /* Accept a connection */
- /** @fn accept(ip_connection *conn, ip_connection *child)
- * @brief Allow "conn" to accept a connection from "child".\n
- * @param *conn ip_connection \n an IP connection.
- * @brief Parent ip connection
- * @param *child ip_connection \n another IP connection.
- * @brief Child ip connection
- * @return Boolean \n TRUE if child socket was accepted, otherwise
- * FALSE.
- * @note
- * "conn" must be a server and must be connected.
- * @note (see file z-sock.c)
- */
- bool accept(ip_connection *conn, ip_connection *child);
-
- /** @fn can_read(ip_connection *conn)
- * @brief Check if there is any data to be read and return instantly
- * in any case.\n
- * @param *conn ip_connection \n an IP connection.
- * @brief Ip connection
- * @return Boolean \n TRUE if there is something to read, otherwise
- * FALSE.
- * @note
- * This function will return FALSE if you read from a connection which
- * is not connected.
- * @note (see file z-sock.c)
- */
- bool can_read(ip_connection *conn);
-
- /** @fn wait(ip_connection *conn, int seconds)
- * @brief Wait for up to "seconds" seconds for data to read from
- * "conn".\n
- * @param *conn ip_connection \n an IP connection.
- * @brief Ip connection
- * @param seconds Number \n number of seconds to wait for something to
- * read.
- * @brief Seconds to wait
- * @return Boolean TRUE if there is something to read, otherwise
- * FALSE.
- * @note
- * This function will return FALSE if you wait for a connection which
- * is not connected.
- * @note (see file z-sock.c)
- */
- bool wait(ip_connection *conn, int seconds);
-
-
- /*
- * Timer stuff, I hope I can make that look better
- */
- /** @fn add_timer(timer_callback callback)
- * @brief Add "callback" to the list.\n
- * @param callback timer_callback \n a callback timer.
- * @brief Callback
- * @return Boolean \n TRUE (always).
- * @note
- * If this is the first callback, the timer will be created.
- * @note (see file z-sock.c)
- */
- bool add_timer(timer_callback callback);
-
- /** @fn remove_timer(timer_callback callback)
- * @brief Remove "callback" from the list.\n
- * @param callback timer_callback \n a callback timer.
- * @brief Callback
- * @return Boolean \n TRUE (always).
- * @note
- * If this is the last callback, the timer will be deleted.
- * @note (see file z-sock.c)
- */
- bool remove_timer(timer_callback callback);
-};
-
-/** @var zsock
- * @brief zsock_hooks
- */
-extern zsock_hooks zsock;