summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenjamin Barenblat <bbaren@mit.edu>2015-09-05 09:32:30 -0400
committerBenjamin Barenblat <bbaren@mit.edu>2015-09-05 09:32:30 -0400
commitea76b6988ccafaa6a4d4ed90f2489d0e49e1f180 (patch)
treeb01dd19f5c53406d9d636b18bc49916bfdd6d3bc
Imported Upstream version 0.40.24upstream/0.40.24upstream
-rwxr-xr-xREADME.linux49
-rwxr-xr-xcommand line.txt15
-rwxr-xr-xdata/announcement/diplomatrebuffedbin0 -> 93 bytes
-rwxr-xr-xdata/announcement/end2bin0 -> 82 bytes
-rwxr-xr-xdata/announcement/end3bin0 -> 90 bytes
-rwxr-xr-xdata/announcement/end4bin0 -> 135 bytes
-rwxr-xr-xdata/announcement/end5bin0 -> 81 bytes
-rwxr-xr-xdata/announcement/fortressintrobin0 -> 526 bytes
-rwxr-xr-xdata/announcement/hastykingbin0 -> 104 bytes
-rwxr-xr-xdata/announcement/kingarrivalbin0 -> 133 bytes
-rwxr-xr-xdata/announcement/merchantexitbin0 -> 115 bytes
-rwxr-xr-xdata/announcement/merchantintrobin0 -> 408 bytes
-rwxr-xr-xdata/announcement/semiendbin0 -> 80 bytes
-rwxr-xr-xdata/announcement/unretirebin0 -> 322 bytes
-rwxr-xr-xdata/art/curses_640x300.bmpbin0 -> 73782 bytes
-rwxr-xr-xdata/art/curses_640x300.pngbin0 -> 1568 bytes
-rwxr-xr-xdata/art/curses_800x600.bmpbin0 -> 92214 bytes
-rwxr-xr-xdata/art/curses_800x600.pngbin0 -> 2393 bytes
-rwxr-xr-xdata/art/curses_square_16x16.bmpbin0 -> 196662 bytes
-rwxr-xr-xdata/art/curses_square_16x16.pngbin0 -> 2464 bytes
-rwxr-xr-xdata/art/font license.txt40
-rwxr-xr-xdata/art/font.ttfbin0 -> 622020 bytes
-rwxr-xr-xdata/art/mouse.bmpbin0 -> 3126 bytes
-rwxr-xr-xdata/art/mouse.pngbin0 -> 249 bytes
-rwxr-xr-xdata/dipscript/dwarf_liaisonbin0 -> 164 bytes
-rwxr-xr-xdata/dipscript/elves_firstcontactbin0 -> 184 bytes
-rwxr-xr-xdata/dipscript/elves_standardbin0 -> 162 bytes
-rwxr-xr-xdata/dipscript/human_standardbin0 -> 164 bytes
-rwxr-xr-xdata/dipscript/human_tradebin0 -> 161 bytes
-rwxr-xr-xdata/dipscript/text/dwarf_liaison1bin0 -> 143 bytes
-rwxr-xr-xdata/dipscript/text/dwarf_liaison_byebin0 -> 174 bytes
-rwxr-xr-xdata/dipscript/text/elves_firstcontact1bin0 -> 213 bytes
-rwxr-xr-xdata/dipscript/text/elves_firstcontact2bin0 -> 307 bytes
-rwxr-xr-xdata/dipscript/text/elves_standard1bin0 -> 136 bytes
-rwxr-xr-xdata/dipscript/text/elves_standard_byebin0 -> 187 bytes
-rwxr-xr-xdata/dipscript/text/human_standard1bin0 -> 132 bytes
-rwxr-xr-xdata/dipscript/text/human_standard_byebin0 -> 146 bytes
-rwxr-xr-xdata/dipscript/text/human_trade1bin0 -> 165 bytes
-rwxr-xr-xdata/dipscript/text/human_trade_byebin0 -> 165 bytes
-rwxr-xr-xdata/help/a_firstbin0 -> 1504 bytes
-rwxr-xr-xdata/help/a_iconsbin0 -> 242 bytes
-rwxr-xr-xdata/help/a_introbin0 -> 474 bytes
-rwxr-xr-xdata/help/a_keysbin0 -> 1547 bytes
-rwxr-xr-xdata/help/a_mainbin0 -> 334 bytes
-rwxr-xr-xdata/help/accountsbin0 -> 922 bytes
-rwxr-xr-xdata/help/building_clutterbin0 -> 429 bytes
-rwxr-xr-xdata/help/craftsbin0 -> 2421 bytes
-rwxr-xr-xdata/help/defensebin0 -> 673 bytes
-rwxr-xr-xdata/help/foodbin0 -> 1906 bytes
-rwxr-xr-xdata/help/iconsbin0 -> 174 bytes
-rwxr-xr-xdata/help/icons_creaturebin0 -> 290 bytes
-rwxr-xr-xdata/help/icons_dwarfbin0 -> 511 bytes
-rwxr-xr-xdata/help/icons_itemsbin0 -> 778 bytes
-rwxr-xr-xdata/help/icons_terrainbin0 -> 390 bytes
-rwxr-xr-xdata/help/introbin0 -> 420 bytes
-rwxr-xr-xdata/help/living_quartersbin0 -> 972 bytes
-rwxr-xr-xdata/help/machinesbin0 -> 959 bytes
-rwxr-xr-xdata/help/mainbin0 -> 442 bytes
-rwxr-xr-xdata/help/menu_activity_zonesbin0 -> 919 bytes
-rwxr-xr-xdata/help/menu_builditembin0 -> 757 bytes
-rwxr-xr-xdata/help/menu_buildjobbin0 -> 670 bytes
-rwxr-xr-xdata/help/menu_buildjob_animaltrapbin0 -> 352 bytes
-rwxr-xr-xdata/help/menu_buildjob_depotbin0 -> 508 bytes
-rwxr-xr-xdata/help/menu_buildjob_doorbin0 -> 470 bytes
-rwxr-xr-xdata/help/menu_buildjob_farmplotbin0 -> 398 bytes
-rwxr-xr-xdata/help/menu_buildjob_leverbin0 -> 560 bytes
-rwxr-xr-xdata/help/menu_buildjob_shopbin0 -> 298 bytes
-rwxr-xr-xdata/help/menu_buildjob_siegebin0 -> 435 bytes
-rwxr-xr-xdata/help/menu_buildjob_stockpilebin0 -> 332 bytes
-rwxr-xr-xdata/help/menu_civlistbin0 -> 510 bytes
-rwxr-xr-xdata/help/menu_designationsbin0 -> 1482 bytes
-rwxr-xr-xdata/help/menu_jobunitlistbin0 -> 538 bytes
-rwxr-xr-xdata/help/menu_lookbin0 -> 340 bytes
-rwxr-xr-xdata/help/menu_make_buildingsbin0 -> 918 bytes
-rwxr-xr-xdata/help/menu_managerbin0 -> 734 bytes
-rwxr-xr-xdata/help/menu_militarybin0 -> 162 bytes
-rwxr-xr-xdata/help/menu_noblesbin0 -> 1095 bytes
-rwxr-xr-xdata/help/menu_ordersbin0 -> 1006 bytes
-rwxr-xr-xdata/help/menu_professionsbin0 -> 348 bytes
-rwxr-xr-xdata/help/menu_roomlistbin0 -> 613 bytes
-rwxr-xr-xdata/help/menu_roomsbin0 -> 1627 bytes
-rwxr-xr-xdata/help/menu_squadsbin0 -> 432 bytes
-rwxr-xr-xdata/help/menu_statusbin0 -> 610 bytes
-rwxr-xr-xdata/help/menu_status_animalsbin0 -> 491 bytes
-rwxr-xr-xdata/help/menu_status_currencybin0 -> 285 bytes
-rwxr-xr-xdata/help/menu_status_justicebin0 -> 1347 bytes
-rwxr-xr-xdata/help/menu_status_kitchenbin0 -> 421 bytes
-rwxr-xr-xdata/help/menu_status_pricesbin0 -> 633 bytes
-rwxr-xr-xdata/help/menu_status_stocksbin0 -> 583 bytes
-rwxr-xr-xdata/help/menu_status_stonebin0 -> 442 bytes
-rwxr-xr-xdata/help/menu_stockpilesbin0 -> 821 bytes
-rwxr-xr-xdata/help/menu_viewunitbin0 -> 839 bytes
-rwxr-xr-xdata/help/menu_wagesbin0 -> 483 bytes
-rwxr-xr-xdata/help/menusbin0 -> 2222 bytes
-rwxr-xr-xdata/help/miningbin0 -> 541 bytes
-rwxr-xr-xdata/help/new_regionbin0 -> 647 bytes
-rwxr-xr-xdata/help/outpostbin0 -> 701 bytes
-rwxr-xr-xdata/help/practicebin0 -> 166 bytes
-rwxr-xr-xdata/help/r_introbin0 -> 525 bytes
-rwxr-xr-xdata/help/r_mainbin0 -> 415 bytes
-rwxr-xr-xdata/help/setup_gamebin0 -> 895 bytes
-rwxr-xr-xdata/help/storagebin0 -> 1072 bytes
-rwxr-xr-xdata/help/table_item_designationsbin0 -> 409 bytes
-rwxr-xr-xdata/help/tablesbin0 -> 117 bytes
-rwxr-xr-xdata/help/technicalbin0 -> 1108 bytes
-rwxr-xr-xdata/help/text_viewerbin0 -> 689 bytes
-rwxr-xr-xdata/help/text_viewer2bin0 -> 273 bytes
-rwxr-xr-xdata/help/text_viewer3bin0 -> 342 bytes
-rwxr-xr-xdata/help/tradingbin0 -> 351 bytes
-rwxr-xr-xdata/help/unit_profilebin0 -> 623 bytes
-rwxr-xr-xdata/help/waterbin0 -> 496 bytes
-rwxr-xr-xdata/help/woodbin0 -> 623 bytes
-rwxr-xr-xdata/indexbin0 -> 1290 bytes
-rwxr-xr-xdata/init/announcements.txt307
-rwxr-xr-xdata/init/arena.txt1305
-rwxr-xr-xdata/init/colors.txt50
-rwxr-xr-xdata/init/d_init.txt303
-rwxr-xr-xdata/init/init.txt150
-rwxr-xr-xdata/init/interface.txt3006
-rwxr-xr-xdata/init/world_gen.txt890
-rwxr-xr-xdata/initial_movies/bay12games.cmvbin0 -> 20013 bytes
-rwxr-xr-xdata/initial_movies/dwarf_fortress.cmvbin0 -> 75791 bytes
-rwxr-xr-xdata/initial_movies/toadyone.cmvbin0 -> 15647 bytes
-rwxr-xr-xdata/shader.fs20
-rwxr-xr-xdata/shader.vs69
-rwxr-xr-xdata/sound/DFINTRO.oggbin0 -> 179511 bytes
-rwxr-xr-xdata/sound/DFINTROEND.oggbin0 -> 66209 bytes
-rwxr-xr-xdata/sound/DFPICK.oggbin0 -> 13083 bytes
-rwxr-xr-xdata/sound/DFRUBBLE.oggbin0 -> 33840 bytes
-rwxr-xr-xdata/sound/baybeyond.oggbin0 -> 17258 bytes
-rwxr-xr-xdata/sound/bayend.oggbin0 -> 10702 bytes
-rwxr-xr-xdata/sound/bayquality.oggbin0 -> 21751 bytes
-rwxr-xr-xdata/sound/baystart.oggbin0 -> 45888 bytes
-rwxr-xr-xdata/sound/song_game.oggbin0 -> 1993969 bytes
-rwxr-xr-xdata/sound/song_title.oggbin0 -> 438809 bytes
-rwxr-xr-xdata/speech/ab_specific_hf_seeker.txt1
-rwxr-xr-xdata/speech/animal_slayer.txt1
-rwxr-xr-xdata/speech/arch_info_justification.txt1
-rwxr-xr-xdata/speech/child_age_proclamation.txt1
-rwxr-xr-xdata/speech/current_profession_no_year.txt1
-rwxr-xr-xdata/speech/current_profession_year.txt1
-rwxr-xr-xdata/speech/curse.txt1
-rwxr-xr-xdata/speech/dwarf.txt7
-rwxr-xr-xdata/speech/elf.txt5
-rwxr-xr-xdata/speech/family_relationship_additional.txt1
-rwxr-xr-xdata/speech/family_relationship_additional_dead.txt1
-rwxr-xr-xdata/speech/family_relationship_no_spec.txt1
-rwxr-xr-xdata/speech/family_relationship_no_spec_dead.txt1
-rwxr-xr-xdata/speech/family_relationship_spec.txt1
-rwxr-xr-xdata/speech/family_relationship_spec_dead.txt1
-rwxr-xr-xdata/speech/general.txt7
-rwxr-xr-xdata/speech/goodbye_worship_1.txt14
-rwxr-xr-xdata/speech/goodbye_worship_2.txt11
-rwxr-xr-xdata/speech/goodbye_worship_3.txt12
-rwxr-xr-xdata/speech/greet.txt1
-rwxr-xr-xdata/speech/greet_baby.txt3
-rwxr-xr-xdata/speech/greet_reply.txt1
-rwxr-xr-xdata/speech/greet_reply_after_hero.txt2
-rwxr-xr-xdata/speech/greet_reply_diff_language.txt1
-rwxr-xr-xdata/speech/greet_reply_unusual_first.txt5
-rwxr-xr-xdata/speech/greet_worship.txt5
-rwxr-xr-xdata/speech/guard_profession.txt1
-rwxr-xr-xdata/speech/guard_warning.txt1
-rwxr-xr-xdata/speech/hist_fig_slayer.txt1
-rwxr-xr-xdata/speech/hunting_profession.txt1
-rwxr-xr-xdata/speech/hunting_profession_year.txt1
-rwxr-xr-xdata/speech/justification_antithetical.txt1
-rwxr-xr-xdata/speech/justification_experience.txt1
-rwxr-xr-xdata/speech/justification_proximity.txt1
-rwxr-xr-xdata/speech/justification_reminder.txt1
-rwxr-xr-xdata/speech/justification_representation.txt1
-rwxr-xr-xdata/speech/lair_hunter_minotaur.txt3
-rwxr-xr-xdata/speech/mercenary_profession.txt1
-rwxr-xr-xdata/speech/mercenary_profession_year.txt1
-rwxr-xr-xdata/speech/no_family.txt1
-rwxr-xr-xdata/speech/past_hunting_profession.txt2
-rwxr-xr-xdata/speech/past_mercenary_profession.txt2
-rwxr-xr-xdata/speech/past_profession_no_year.txt1
-rwxr-xr-xdata/speech/past_profession_year.txt1
-rwxr-xr-xdata/speech/past_scouting_profession.txt2
-rwxr-xr-xdata/speech/past_snatcher_profession.txt2
-rwxr-xr-xdata/speech/past_thief_profession.txt2
-rwxr-xr-xdata/speech/past_wandering_profession.txt2
-rwxr-xr-xdata/speech/positive.txt10
-rwxr-xr-xdata/speech/same_site_ab_specific_hf_seeker.txt1
-rwxr-xr-xdata/speech/same_site_specific_hf_seeker.txt1
-rwxr-xr-xdata/speech/scouting_profession.txt1
-rwxr-xr-xdata/speech/scouting_profession_year.txt1
-rwxr-xr-xdata/speech/site_specific_hf_seeker.txt1
-rwxr-xr-xdata/speech/slayer.txt14
-rwxr-xr-xdata/speech/snatcher_profession.txt1
-rwxr-xr-xdata/speech/snatcher_profession_year.txt1
-rwxr-xr-xdata/speech/soldier_profession.txt1
-rwxr-xr-xdata/speech/task_recommendation.txt1
-rwxr-xr-xdata/speech/temple_already_member.txt5
-rwxr-xr-xdata/speech/temple_become_member.txt4
-rwxr-xr-xdata/speech/thief_profession.txt1
-rwxr-xr-xdata/speech/thief_profession_year.txt1
-rwxr-xr-xdata/speech/threat.txt1
-rwxr-xr-xdata/speech/unknown_hf_seeker.txt1
-rwxr-xr-xdata/speech/wandering_profession.txt1
-rwxr-xr-xdata/speech/wandering_profession_year.txt1
-rwxr-xr-xdf7
-rwxr-xr-xfile changes.txt2494
-rwxr-xr-xg_src/KeybindingScreen.cpp409
-rwxr-xr-xg_src/KeybindingScreen.h69
-rwxr-xr-xg_src/ViewBase.cpp38
-rwxr-xr-xg_src/ViewBase.h197
-rwxr-xr-xg_src/basics.cpp792
-rwxr-xr-xg_src/basics.h117
-rwxr-xr-xg_src/bimap.h17
-rwxr-xr-xg_src/command_line.cpp132
-rwxr-xr-xg_src/command_line.h25
-rwxr-xr-xg_src/curses.h28
-rwxr-xr-xg_src/enabler.cpp968
-rwxr-xr-xg_src/enabler.h1027
-rwxr-xr-xg_src/enabler_input.cpp1095
-rwxr-xr-xg_src/enabler_input.h137
-rwxr-xr-xg_src/endian.h42
-rwxr-xr-xg_src/files.cpp428
-rwxr-xr-xg_src/files.h368
-rwxr-xr-xg_src/find_files.cpp180
-rwxr-xr-xg_src/find_files.h6
-rwxr-xr-xg_src/find_files_posix.cpp185
-rwxr-xr-xg_src/g_basics.h33
-rwxr-xr-xg_src/graphics.cpp566
-rwxr-xr-xg_src/graphics.h252
-rwxr-xr-xg_src/init.cpp685
-rwxr-xr-xg_src/init.h166
-rwxr-xr-xg_src/interface.cpp1777
-rwxr-xr-xg_src/interface.h149
-rwxr-xr-xg_src/keybindings.cpp3115
-rwxr-xr-xg_src/keybindings.h1524
-rwxr-xr-xg_src/mail.hpp155
-rwxr-xr-xg_src/music_and_sound_fmodex.cpp308
-rwxr-xr-xg_src/music_and_sound_fmodex.h102
-rwxr-xr-xg_src/music_and_sound_g.h13
-rwxr-xr-xg_src/music_and_sound_openal.cpp688
-rwxr-xr-xg_src/music_and_sound_openal.h82
-rwxr-xr-xg_src/music_and_sound_v.h11
-rwxr-xr-xg_src/platform.h102
-rwxr-xr-xg_src/random.cpp206
-rwxr-xr-xg_src/random.h40
-rwxr-xr-xg_src/renderer_2d.hpp352
-rwxr-xr-xg_src/renderer_curses.cpp369
-rwxr-xr-xg_src/renderer_offscreen.cpp86
-rwxr-xr-xg_src/renderer_opengl.hpp609
-rwxr-xr-xg_src/resize++.cpp269
-rwxr-xr-xg_src/resize++.h68
-rwxr-xr-xg_src/svector.h28
-rwxr-xr-xg_src/template.h1235
-rwxr-xr-xg_src/textlines.cpp61
-rwxr-xr-xg_src/textlines.h22
-rwxr-xr-xg_src/texture_handler.h60
-rwxr-xr-xg_src/textures.cpp398
-rwxr-xr-xg_src/ttf_manager.cpp245
-rwxr-xr-xg_src/ttf_manager.hpp101
-rwxr-xr-xg_src/win32_compat.cpp184
-rwxr-xr-xlibs/Dwarf_Fortressbin0 -> 18273176 bytes
-rw-r--r--libs/libgcc_s.so.1bin0 -> 466491 bytes
-rwxr-xr-xlibs/libgraphics.sobin0 -> 1459923 bytes
-rwxr-xr-xlibs/libstdc++.so.6bin0 -> 4852343 bytes
-rwxr-xr-xraw/graphics/example/dwarves.bmpbin0 -> 2358 bytes
-rwxr-xr-xraw/graphics/graphics_example.txt137
-rwxr-xr-xraw/interaction examples/interaction_disturbance.txt75
-rwxr-xr-xraw/interaction examples/interaction_region.txt37
-rwxr-xr-xraw/interaction examples/interaction_secret.txt52
-rwxr-xr-xraw/interaction examples/interaction_underground_special.txt16
-rwxr-xr-xraw/interaction examples/interaction_vampire.txt45
-rwxr-xr-xraw/interaction examples/interaction_werebeast.txt61
-rwxr-xr-xraw/objects/b_detail_plan_default.txt514
-rwxr-xr-xraw/objects/body_default.txt1815
-rwxr-xr-xraw/objects/body_rcp.txt616
-rwxr-xr-xraw/objects/building_custom.txt54
-rwxr-xr-xraw/objects/c_variation_default.txt660
-rwxr-xr-xraw/objects/creature_amphibians.txt68
-rwxr-xr-xraw/objects/creature_annelids.txt48
-rwxr-xr-xraw/objects/creature_birds.txt1393
-rwxr-xr-xraw/objects/creature_birds_new.txt4460
-rwxr-xr-xraw/objects/creature_bug_slug_new.txt1622
-rwxr-xr-xraw/objects/creature_desert_new.txt474
-rwxr-xr-xraw/objects/creature_domestic.txt2523
-rwxr-xr-xraw/objects/creature_equipment.txt26
-rwxr-xr-xraw/objects/creature_fanciful.txt37
-rwxr-xr-xraw/objects/creature_insects.txt658
-rwxr-xr-xraw/objects/creature_large_mountain.txt664
-rwxr-xr-xraw/objects/creature_large_ocean.txt2930
-rwxr-xr-xraw/objects/creature_large_riverlake.txt637
-rwxr-xr-xraw/objects/creature_large_temperate.txt2029
-rwxr-xr-xraw/objects/creature_large_tropical.txt3069
-rwxr-xr-xraw/objects/creature_large_tundra.txt317
-rwxr-xr-xraw/objects/creature_mountain_new.txt310
-rwxr-xr-xraw/objects/creature_next_underground.txt2600
-rwxr-xr-xraw/objects/creature_ocean_new.txt1360
-rwxr-xr-xraw/objects/creature_other.txt618
-rwxr-xr-xraw/objects/creature_reptiles.txt76
-rwxr-xr-xraw/objects/creature_riverlakepool_new.txt1160
-rwxr-xr-xraw/objects/creature_savage_tropical.txt583
-rwxr-xr-xraw/objects/creature_small_mammal_new.txt438
-rwxr-xr-xraw/objects/creature_small_mammals.txt348
-rwxr-xr-xraw/objects/creature_small_ocean.txt1539
-rwxr-xr-xraw/objects/creature_small_riverlake.txt791
-rwxr-xr-xraw/objects/creature_standard.txt5511
-rwxr-xr-xraw/objects/creature_subterranean.txt2759
-rwxr-xr-xraw/objects/creature_temperate_new.txt3341
-rwxr-xr-xraw/objects/creature_tropical_new.txt3138
-rwxr-xr-xraw/objects/creature_tundra_taiga_new.txt307
-rwxr-xr-xraw/objects/descriptor_color_standard.txt589
-rwxr-xr-xraw/objects/descriptor_pattern_iris_eye.txt669
-rwxr-xr-xraw/objects/descriptor_pattern_pupil_eye.txt558
-rwxr-xr-xraw/objects/descriptor_pattern_special.txt98
-rwxr-xr-xraw/objects/descriptor_shape_standard.txt212
-rwxr-xr-xraw/objects/entity_default.txt1912
-rwxr-xr-xraw/objects/inorganic_metal.txt1041
-rwxr-xr-xraw/objects/inorganic_other.txt65
-rwxr-xr-xraw/objects/inorganic_stone_gem.txt1031
-rwxr-xr-xraw/objects/inorganic_stone_layer.txt235
-rwxr-xr-xraw/objects/inorganic_stone_mineral.txt798
-rwxr-xr-xraw/objects/inorganic_stone_soil.txt152
-rwxr-xr-xraw/objects/interaction_standard.txt61
-rwxr-xr-xraw/objects/item_ammo.txt24
-rwxr-xr-xraw/objects/item_armor.txt163
-rwxr-xr-xraw/objects/item_food.txt15
-rwxr-xr-xraw/objects/item_gloves.txt40
-rwxr-xr-xraw/objects/item_helm.txt106
-rwxr-xr-xraw/objects/item_instrument.txt23
-rwxr-xr-xraw/objects/item_pants.txt121
-rwxr-xr-xraw/objects/item_shield.txt17
-rwxr-xr-xraw/objects/item_shoes.txt74
-rwxr-xr-xraw/objects/item_siegeammo.txt7
-rwxr-xr-xraw/objects/item_tool.txt234
-rwxr-xr-xraw/objects/item_toy.txt23
-rwxr-xr-xraw/objects/item_trapcomp.txt58
-rwxr-xr-xraw/objects/item_weapon.txt321
-rwxr-xr-xraw/objects/language_DWARF.txt2178
-rwxr-xr-xraw/objects/language_ELF.txt2178
-rwxr-xr-xraw/objects/language_GOBLIN.txt2178
-rwxr-xr-xraw/objects/language_HUMAN.txt2178
-rwxr-xr-xraw/objects/language_SYM.txt3304
-rwxr-xr-xraw/objects/language_words.txt19588
-rwxr-xr-xraw/objects/material_template_default.txt3203
-rwxr-xr-xraw/objects/notes/gaits.txt89
-rwxr-xr-xraw/objects/plant_crops.txt1586
-rwxr-xr-xraw/objects/plant_garden.txt2607
-rwxr-xr-xraw/objects/plant_grasses.txt619
-rwxr-xr-xraw/objects/plant_new_trees.txt3061
-rwxr-xr-xraw/objects/plant_standard.txt2471
-rwxr-xr-xraw/objects/reaction_other.txt332
-rwxr-xr-xraw/objects/reaction_smelter.txt214
-rwxr-xr-xraw/objects/text/book_art.txt18
-rwxr-xr-xraw/objects/text/book_instruction.txt67
-rwxr-xr-xraw/objects/text/secret_death.txt21
-rwxr-xr-xraw/objects/tissue_template_default.txt413
-rwxr-xr-xreadme.txt168
-rwxr-xr-xrelease notes.txt2315
-rwxr-xr-xsdl/sdl license.txt502
356 files changed, 137044 insertions, 0 deletions
diff --git a/README.linux b/README.linux
new file mode 100755
index 0000000..c80551a
--- /dev/null
+++ b/README.linux
@@ -0,0 +1,49 @@
+-------------------
+System Requirements
+-------------------
+
+In addition to the hardware requirements (which will be the same as the other
+platforms) your system will need these libraries installed:
+
+* GTK+ 2+
+* SDL 1.2+
+* SDL_image
+
+And some kind of OpenGL implementation, so:
+
+* libgl
+* libglu
+
+
+
+-------------------
+Commandline Options
+-------------------
+
+-sound_output : sets the sound system to use. Possible values:
+ ALSA - Use the Advanced Linux Sound Architecture. (default)
+ OSS - Use the Open Sound System.
+ ESD - Use the Enlightenment Sound Daemon.
+
+If you need to use one of the alternative systems and want to avoid
+having to run from a terminal everytime, add the switch and the sound
+system required to the df script.
+
+
+
+-------------------
+ Known Issues
+-------------------
+
+* If the mouse cursor is enabled, and you are running fullscreen
+ it reacts strangely around the leftmost and topmost edges of the screen.
+* Recorded movies will flicker every few frames, with artifacts on
+ larger screen sizes.
+* If the lock keys (caps lock, num lock, etc) do not work for you, open
+ the df file in a text editor and remove the line that reads
+
+ export SDL_DISABLE_LOCK_KEYS=1
+
+ it's a work around for a bug in the SDL package in Debian based distributions,
+ that reverses the behaviour of the above environmental variable.
+
diff --git a/command line.txt b/command line.txt
new file mode 100755
index 0000000..e055388
--- /dev/null
+++ b/command line.txt
@@ -0,0 +1,15 @@
+See readme.txt for general information about the release.
+See release_notes.txt for information on handling saves and a brief writeup on the changes for this version.
+See file_changes.txt for new init/interface information.
+
+
+Dwarf Fortress Command Line Options
+
+
+Dwarf Fortress currently offers one command line option, a world generator, suggested by genmac. You can use it as follows:
+
+FORMAT: "Dwarf Fortress.exe" -gen <id number> <seed> <world gen param title>
+EXAMPLE: "Dwarf Fortress.exe" -gen 1 3498 "MEDIUM ISLAND"
+EXAMPLE: "Dwarf Fortress.exe" -gen 2 RANDOM CUSTOM6
+
+This will open a silent, introless dwarf fortress, generate a world with the given id number and seed, export the region files and a picture, and finally quit. The window remains open so you can see what's going on. You can still abort world generation while it is running. If you attempt to create a world number that already exists, it will abort immediately. \ No newline at end of file
diff --git a/data/announcement/diplomatrebuffed b/data/announcement/diplomatrebuffed
new file mode 100755
index 0000000..db647b1
--- /dev/null
+++ b/data/announcement/diplomatrebuffed
Binary files differ
diff --git a/data/announcement/end2 b/data/announcement/end2
new file mode 100755
index 0000000..57fed28
--- /dev/null
+++ b/data/announcement/end2
Binary files differ
diff --git a/data/announcement/end3 b/data/announcement/end3
new file mode 100755
index 0000000..6d97781
--- /dev/null
+++ b/data/announcement/end3
Binary files differ
diff --git a/data/announcement/end4 b/data/announcement/end4
new file mode 100755
index 0000000..db3c160
--- /dev/null
+++ b/data/announcement/end4
Binary files differ
diff --git a/data/announcement/end5 b/data/announcement/end5
new file mode 100755
index 0000000..ff20df8
--- /dev/null
+++ b/data/announcement/end5
Binary files differ
diff --git a/data/announcement/fortressintro b/data/announcement/fortressintro
new file mode 100755
index 0000000..79bc25a
--- /dev/null
+++ b/data/announcement/fortressintro
Binary files differ
diff --git a/data/announcement/hastyking b/data/announcement/hastyking
new file mode 100755
index 0000000..31bfcb1
--- /dev/null
+++ b/data/announcement/hastyking
Binary files differ
diff --git a/data/announcement/kingarrival b/data/announcement/kingarrival
new file mode 100755
index 0000000..33aa9ee
--- /dev/null
+++ b/data/announcement/kingarrival
Binary files differ
diff --git a/data/announcement/merchantexit b/data/announcement/merchantexit
new file mode 100755
index 0000000..2c7f165
--- /dev/null
+++ b/data/announcement/merchantexit
Binary files differ
diff --git a/data/announcement/merchantintro b/data/announcement/merchantintro
new file mode 100755
index 0000000..2339641
--- /dev/null
+++ b/data/announcement/merchantintro
Binary files differ
diff --git a/data/announcement/semiend b/data/announcement/semiend
new file mode 100755
index 0000000..3db0fe3
--- /dev/null
+++ b/data/announcement/semiend
Binary files differ
diff --git a/data/announcement/unretire b/data/announcement/unretire
new file mode 100755
index 0000000..c3051f9
--- /dev/null
+++ b/data/announcement/unretire
Binary files differ
diff --git a/data/art/curses_640x300.bmp b/data/art/curses_640x300.bmp
new file mode 100755
index 0000000..1aaec9b
--- /dev/null
+++ b/data/art/curses_640x300.bmp
Binary files differ
diff --git a/data/art/curses_640x300.png b/data/art/curses_640x300.png
new file mode 100755
index 0000000..f94daf3
--- /dev/null
+++ b/data/art/curses_640x300.png
Binary files differ
diff --git a/data/art/curses_800x600.bmp b/data/art/curses_800x600.bmp
new file mode 100755
index 0000000..e7dde31
--- /dev/null
+++ b/data/art/curses_800x600.bmp
Binary files differ
diff --git a/data/art/curses_800x600.png b/data/art/curses_800x600.png
new file mode 100755
index 0000000..0aa2ee6
--- /dev/null
+++ b/data/art/curses_800x600.png
Binary files differ
diff --git a/data/art/curses_square_16x16.bmp b/data/art/curses_square_16x16.bmp
new file mode 100755
index 0000000..36cee3c
--- /dev/null
+++ b/data/art/curses_square_16x16.bmp
Binary files differ
diff --git a/data/art/curses_square_16x16.png b/data/art/curses_square_16x16.png
new file mode 100755
index 0000000..a552417
--- /dev/null
+++ b/data/art/curses_square_16x16.png
Binary files differ
diff --git a/data/art/font license.txt b/data/art/font license.txt
new file mode 100755
index 0000000..72a9baa
--- /dev/null
+++ b/data/art/font license.txt
@@ -0,0 +1,40 @@
+Fonts are Bitstream (see below). DejaVu changes are in public domain. Explanation of copyright is on Gnome page on Bitstream Vera fonts. Glyphs imported from Arev fonts are Tavmjung Bah (see below)
+
+
+Bitstream Vera Fonts Copyright
+
+Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is a trademark of Bitstream, Inc.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of the fonts accompanying this license ("Fonts") and associated documentation files (the "Font Software"), to reproduce and distribute the Font Software, including without limitation the rights to use, copy, merge, publish, distribute, and/or sell copies of the Font Software, and to permit persons to whom the Font Software is furnished to do so, subject to the following conditions:
+
+The above copyright and trademark notices and this permission notice shall be included in all copies of one or more of the Font Software typefaces.
+
+The Font Software may be modified, altered, or added to, and in particular the designs of glyphs or characters in the Fonts may be modified and additional glyphs or characters may be added to the Fonts, only if the fonts are renamed to names not containing either the words "Bitstream" or the word "Vera".
+
+This License becomes null and void to the extent applicable to Fonts or Font Software that has been modified and is distributed under the "Bitstream Vera" names.
+
+The Font Software may be sold as part of a larger software package but no copy of one or more of the Font Software typefaces may be sold by itself.
+
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE.
+
+Except as contained in this notice, the names of Gnome, the Gnome Foundation, and Bitstream Inc., shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Font Software without prior written authorization from the Gnome Foundation or Bitstream Inc., respectively. For further information, contact: fonts at gnome dot org.
+
+
+
+Arev Fonts Copyright
+
+Copyright (c) 2006 by Tavmjong Bah. All Rights Reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of the fonts accompanying this license ("Fonts") and associated documentation files (the "Font Software"), to reproduce and distribute the modifications to the Bitstream Vera Font Software, including without limitation the rights to use, copy, merge, publish, distribute, and/or sell copies of the Font Software, and to permit persons to whom the Font Software is furnished to do so, subject to the following conditions:
+
+The above copyright and trademark notices and this permission notice shall be included in all copies of one or more of the Font Software typefaces.
+
+The Font Software may be modified, altered, or added to, and in particular the designs of glyphs or characters in the Fonts may be modified and additional glyphs or characters may be added to the Fonts, only if the fonts are renamed to names not containing either the words "Tavmjong Bah" or the word "Arev".
+
+This License becomes null and void to the extent applicable to Fonts or Font Software that has been modified and is distributed under the "Tavmjong Bah Arev" names.
+
+The Font Software may be sold as part of a larger software package but no copy of one or more of the Font Software typefaces may be sold by itself.
+
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL TAVMJONG BAH BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE.
+
+Except as contained in this notice, the name of Tavmjong Bah shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Font Software without prior written authorization from Tavmjong Bah. For further information, contact: tavmjong @ free . fr. \ No newline at end of file
diff --git a/data/art/font.ttf b/data/art/font.ttf
new file mode 100755
index 0000000..b69c918
--- /dev/null
+++ b/data/art/font.ttf
Binary files differ
diff --git a/data/art/mouse.bmp b/data/art/mouse.bmp
new file mode 100755
index 0000000..f63c6b3
--- /dev/null
+++ b/data/art/mouse.bmp
Binary files differ
diff --git a/data/art/mouse.png b/data/art/mouse.png
new file mode 100755
index 0000000..a9cffb0
--- /dev/null
+++ b/data/art/mouse.png
Binary files differ
diff --git a/data/dipscript/dwarf_liaison b/data/dipscript/dwarf_liaison
new file mode 100755
index 0000000..4063e82
--- /dev/null
+++ b/data/dipscript/dwarf_liaison
Binary files differ
diff --git a/data/dipscript/elves_firstcontact b/data/dipscript/elves_firstcontact
new file mode 100755
index 0000000..58a4c32
--- /dev/null
+++ b/data/dipscript/elves_firstcontact
Binary files differ
diff --git a/data/dipscript/elves_standard b/data/dipscript/elves_standard
new file mode 100755
index 0000000..ace42c5
--- /dev/null
+++ b/data/dipscript/elves_standard
Binary files differ
diff --git a/data/dipscript/human_standard b/data/dipscript/human_standard
new file mode 100755
index 0000000..28bc8f4
--- /dev/null
+++ b/data/dipscript/human_standard
Binary files differ
diff --git a/data/dipscript/human_trade b/data/dipscript/human_trade
new file mode 100755
index 0000000..7c7c95b
--- /dev/null
+++ b/data/dipscript/human_trade
Binary files differ
diff --git a/data/dipscript/text/dwarf_liaison1 b/data/dipscript/text/dwarf_liaison1
new file mode 100755
index 0000000..748ffc3
--- /dev/null
+++ b/data/dipscript/text/dwarf_liaison1
Binary files differ
diff --git a/data/dipscript/text/dwarf_liaison_bye b/data/dipscript/text/dwarf_liaison_bye
new file mode 100755
index 0000000..49b0437
--- /dev/null
+++ b/data/dipscript/text/dwarf_liaison_bye
Binary files differ
diff --git a/data/dipscript/text/elves_firstcontact1 b/data/dipscript/text/elves_firstcontact1
new file mode 100755
index 0000000..766dfa9
--- /dev/null
+++ b/data/dipscript/text/elves_firstcontact1
Binary files differ
diff --git a/data/dipscript/text/elves_firstcontact2 b/data/dipscript/text/elves_firstcontact2
new file mode 100755
index 0000000..6b4ce9b
--- /dev/null
+++ b/data/dipscript/text/elves_firstcontact2
Binary files differ
diff --git a/data/dipscript/text/elves_standard1 b/data/dipscript/text/elves_standard1
new file mode 100755
index 0000000..a111a7c
--- /dev/null
+++ b/data/dipscript/text/elves_standard1
Binary files differ
diff --git a/data/dipscript/text/elves_standard_bye b/data/dipscript/text/elves_standard_bye
new file mode 100755
index 0000000..7e22cec
--- /dev/null
+++ b/data/dipscript/text/elves_standard_bye
Binary files differ
diff --git a/data/dipscript/text/human_standard1 b/data/dipscript/text/human_standard1
new file mode 100755
index 0000000..70c3ef6
--- /dev/null
+++ b/data/dipscript/text/human_standard1
Binary files differ
diff --git a/data/dipscript/text/human_standard_bye b/data/dipscript/text/human_standard_bye
new file mode 100755
index 0000000..2a9bb98
--- /dev/null
+++ b/data/dipscript/text/human_standard_bye
Binary files differ
diff --git a/data/dipscript/text/human_trade1 b/data/dipscript/text/human_trade1
new file mode 100755
index 0000000..35d0ec1
--- /dev/null
+++ b/data/dipscript/text/human_trade1
Binary files differ
diff --git a/data/dipscript/text/human_trade_bye b/data/dipscript/text/human_trade_bye
new file mode 100755
index 0000000..4cf2c9d
--- /dev/null
+++ b/data/dipscript/text/human_trade_bye
Binary files differ
diff --git a/data/help/a_first b/data/help/a_first
new file mode 100755
index 0000000..4da191d
--- /dev/null
+++ b/data/help/a_first
Binary files differ
diff --git a/data/help/a_icons b/data/help/a_icons
new file mode 100755
index 0000000..71eef7d
--- /dev/null
+++ b/data/help/a_icons
Binary files differ
diff --git a/data/help/a_intro b/data/help/a_intro
new file mode 100755
index 0000000..8fe4daf
--- /dev/null
+++ b/data/help/a_intro
Binary files differ
diff --git a/data/help/a_keys b/data/help/a_keys
new file mode 100755
index 0000000..fc8a4a1
--- /dev/null
+++ b/data/help/a_keys
Binary files differ
diff --git a/data/help/a_main b/data/help/a_main
new file mode 100755
index 0000000..0d5711a
--- /dev/null
+++ b/data/help/a_main
Binary files differ
diff --git a/data/help/accounts b/data/help/accounts
new file mode 100755
index 0000000..550b0d5
--- /dev/null
+++ b/data/help/accounts
Binary files differ
diff --git a/data/help/building_clutter b/data/help/building_clutter
new file mode 100755
index 0000000..30eaa3c
--- /dev/null
+++ b/data/help/building_clutter
Binary files differ
diff --git a/data/help/crafts b/data/help/crafts
new file mode 100755
index 0000000..f1d2f58
--- /dev/null
+++ b/data/help/crafts
Binary files differ
diff --git a/data/help/defense b/data/help/defense
new file mode 100755
index 0000000..76d33b4
--- /dev/null
+++ b/data/help/defense
Binary files differ
diff --git a/data/help/food b/data/help/food
new file mode 100755
index 0000000..68389a1
--- /dev/null
+++ b/data/help/food
Binary files differ
diff --git a/data/help/icons b/data/help/icons
new file mode 100755
index 0000000..4618b68
--- /dev/null
+++ b/data/help/icons
Binary files differ
diff --git a/data/help/icons_creature b/data/help/icons_creature
new file mode 100755
index 0000000..b3f7077
--- /dev/null
+++ b/data/help/icons_creature
Binary files differ
diff --git a/data/help/icons_dwarf b/data/help/icons_dwarf
new file mode 100755
index 0000000..6ee51d8
--- /dev/null
+++ b/data/help/icons_dwarf
Binary files differ
diff --git a/data/help/icons_items b/data/help/icons_items
new file mode 100755
index 0000000..0365414
--- /dev/null
+++ b/data/help/icons_items
Binary files differ
diff --git a/data/help/icons_terrain b/data/help/icons_terrain
new file mode 100755
index 0000000..21adceb
--- /dev/null
+++ b/data/help/icons_terrain
Binary files differ
diff --git a/data/help/intro b/data/help/intro
new file mode 100755
index 0000000..c6d0e11
--- /dev/null
+++ b/data/help/intro
Binary files differ
diff --git a/data/help/living_quarters b/data/help/living_quarters
new file mode 100755
index 0000000..11dacda
--- /dev/null
+++ b/data/help/living_quarters
Binary files differ
diff --git a/data/help/machines b/data/help/machines
new file mode 100755
index 0000000..45d485f
--- /dev/null
+++ b/data/help/machines
Binary files differ
diff --git a/data/help/main b/data/help/main
new file mode 100755
index 0000000..7132a13
--- /dev/null
+++ b/data/help/main
Binary files differ
diff --git a/data/help/menu_activity_zones b/data/help/menu_activity_zones
new file mode 100755
index 0000000..afed771
--- /dev/null
+++ b/data/help/menu_activity_zones
Binary files differ
diff --git a/data/help/menu_builditem b/data/help/menu_builditem
new file mode 100755
index 0000000..03e29e9
--- /dev/null
+++ b/data/help/menu_builditem
Binary files differ
diff --git a/data/help/menu_buildjob b/data/help/menu_buildjob
new file mode 100755
index 0000000..bef857d
--- /dev/null
+++ b/data/help/menu_buildjob
Binary files differ
diff --git a/data/help/menu_buildjob_animaltrap b/data/help/menu_buildjob_animaltrap
new file mode 100755
index 0000000..4329b15
--- /dev/null
+++ b/data/help/menu_buildjob_animaltrap
Binary files differ
diff --git a/data/help/menu_buildjob_depot b/data/help/menu_buildjob_depot
new file mode 100755
index 0000000..38f5877
--- /dev/null
+++ b/data/help/menu_buildjob_depot
Binary files differ
diff --git a/data/help/menu_buildjob_door b/data/help/menu_buildjob_door
new file mode 100755
index 0000000..790721a
--- /dev/null
+++ b/data/help/menu_buildjob_door
Binary files differ
diff --git a/data/help/menu_buildjob_farmplot b/data/help/menu_buildjob_farmplot
new file mode 100755
index 0000000..7dfa305
--- /dev/null
+++ b/data/help/menu_buildjob_farmplot
Binary files differ
diff --git a/data/help/menu_buildjob_lever b/data/help/menu_buildjob_lever
new file mode 100755
index 0000000..2e2e148
--- /dev/null
+++ b/data/help/menu_buildjob_lever
Binary files differ
diff --git a/data/help/menu_buildjob_shop b/data/help/menu_buildjob_shop
new file mode 100755
index 0000000..d3f4eee
--- /dev/null
+++ b/data/help/menu_buildjob_shop
Binary files differ
diff --git a/data/help/menu_buildjob_siege b/data/help/menu_buildjob_siege
new file mode 100755
index 0000000..105a184
--- /dev/null
+++ b/data/help/menu_buildjob_siege
Binary files differ
diff --git a/data/help/menu_buildjob_stockpile b/data/help/menu_buildjob_stockpile
new file mode 100755
index 0000000..d93d46f
--- /dev/null
+++ b/data/help/menu_buildjob_stockpile
Binary files differ
diff --git a/data/help/menu_civlist b/data/help/menu_civlist
new file mode 100755
index 0000000..9de489d
--- /dev/null
+++ b/data/help/menu_civlist
Binary files differ
diff --git a/data/help/menu_designations b/data/help/menu_designations
new file mode 100755
index 0000000..b0676ff
--- /dev/null
+++ b/data/help/menu_designations
Binary files differ
diff --git a/data/help/menu_jobunitlist b/data/help/menu_jobunitlist
new file mode 100755
index 0000000..b8711d9
--- /dev/null
+++ b/data/help/menu_jobunitlist
Binary files differ
diff --git a/data/help/menu_look b/data/help/menu_look
new file mode 100755
index 0000000..b4ef31f
--- /dev/null
+++ b/data/help/menu_look
Binary files differ
diff --git a/data/help/menu_make_buildings b/data/help/menu_make_buildings
new file mode 100755
index 0000000..52a8e26
--- /dev/null
+++ b/data/help/menu_make_buildings
Binary files differ
diff --git a/data/help/menu_manager b/data/help/menu_manager
new file mode 100755
index 0000000..46deed3
--- /dev/null
+++ b/data/help/menu_manager
Binary files differ
diff --git a/data/help/menu_military b/data/help/menu_military
new file mode 100755
index 0000000..12bb214
--- /dev/null
+++ b/data/help/menu_military
Binary files differ
diff --git a/data/help/menu_nobles b/data/help/menu_nobles
new file mode 100755
index 0000000..234af9a
--- /dev/null
+++ b/data/help/menu_nobles
Binary files differ
diff --git a/data/help/menu_orders b/data/help/menu_orders
new file mode 100755
index 0000000..3304ff1
--- /dev/null
+++ b/data/help/menu_orders
Binary files differ
diff --git a/data/help/menu_professions b/data/help/menu_professions
new file mode 100755
index 0000000..2d4f18a
--- /dev/null
+++ b/data/help/menu_professions
Binary files differ
diff --git a/data/help/menu_roomlist b/data/help/menu_roomlist
new file mode 100755
index 0000000..b90eddc
--- /dev/null
+++ b/data/help/menu_roomlist
Binary files differ
diff --git a/data/help/menu_rooms b/data/help/menu_rooms
new file mode 100755
index 0000000..92df649
--- /dev/null
+++ b/data/help/menu_rooms
Binary files differ
diff --git a/data/help/menu_squads b/data/help/menu_squads
new file mode 100755
index 0000000..39e02b9
--- /dev/null
+++ b/data/help/menu_squads
Binary files differ
diff --git a/data/help/menu_status b/data/help/menu_status
new file mode 100755
index 0000000..f2348bf
--- /dev/null
+++ b/data/help/menu_status
Binary files differ
diff --git a/data/help/menu_status_animals b/data/help/menu_status_animals
new file mode 100755
index 0000000..07a1ff0
--- /dev/null
+++ b/data/help/menu_status_animals
Binary files differ
diff --git a/data/help/menu_status_currency b/data/help/menu_status_currency
new file mode 100755
index 0000000..20af058
--- /dev/null
+++ b/data/help/menu_status_currency
Binary files differ
diff --git a/data/help/menu_status_justice b/data/help/menu_status_justice
new file mode 100755
index 0000000..fbc47d4
--- /dev/null
+++ b/data/help/menu_status_justice
Binary files differ
diff --git a/data/help/menu_status_kitchen b/data/help/menu_status_kitchen
new file mode 100755
index 0000000..d4d49d7
--- /dev/null
+++ b/data/help/menu_status_kitchen
Binary files differ
diff --git a/data/help/menu_status_prices b/data/help/menu_status_prices
new file mode 100755
index 0000000..9f44162
--- /dev/null
+++ b/data/help/menu_status_prices
Binary files differ
diff --git a/data/help/menu_status_stocks b/data/help/menu_status_stocks
new file mode 100755
index 0000000..f4d47e6
--- /dev/null
+++ b/data/help/menu_status_stocks
Binary files differ
diff --git a/data/help/menu_status_stone b/data/help/menu_status_stone
new file mode 100755
index 0000000..0a56af3
--- /dev/null
+++ b/data/help/menu_status_stone
Binary files differ
diff --git a/data/help/menu_stockpiles b/data/help/menu_stockpiles
new file mode 100755
index 0000000..7a17d55
--- /dev/null
+++ b/data/help/menu_stockpiles
Binary files differ
diff --git a/data/help/menu_viewunit b/data/help/menu_viewunit
new file mode 100755
index 0000000..f2dc16d
--- /dev/null
+++ b/data/help/menu_viewunit
Binary files differ
diff --git a/data/help/menu_wages b/data/help/menu_wages
new file mode 100755
index 0000000..a9f7f47
--- /dev/null
+++ b/data/help/menu_wages
Binary files differ
diff --git a/data/help/menus b/data/help/menus
new file mode 100755
index 0000000..8f9a3dd
--- /dev/null
+++ b/data/help/menus
Binary files differ
diff --git a/data/help/mining b/data/help/mining
new file mode 100755
index 0000000..95b83e2
--- /dev/null
+++ b/data/help/mining
Binary files differ
diff --git a/data/help/new_region b/data/help/new_region
new file mode 100755
index 0000000..c615ab2
--- /dev/null
+++ b/data/help/new_region
Binary files differ
diff --git a/data/help/outpost b/data/help/outpost
new file mode 100755
index 0000000..70a3453
--- /dev/null
+++ b/data/help/outpost
Binary files differ
diff --git a/data/help/practice b/data/help/practice
new file mode 100755
index 0000000..86df617
--- /dev/null
+++ b/data/help/practice
Binary files differ
diff --git a/data/help/r_intro b/data/help/r_intro
new file mode 100755
index 0000000..0aecf14
--- /dev/null
+++ b/data/help/r_intro
Binary files differ
diff --git a/data/help/r_main b/data/help/r_main
new file mode 100755
index 0000000..32572f6
--- /dev/null
+++ b/data/help/r_main
Binary files differ
diff --git a/data/help/setup_game b/data/help/setup_game
new file mode 100755
index 0000000..e3d7981
--- /dev/null
+++ b/data/help/setup_game
Binary files differ
diff --git a/data/help/storage b/data/help/storage
new file mode 100755
index 0000000..7f9b889
--- /dev/null
+++ b/data/help/storage
Binary files differ
diff --git a/data/help/table_item_designations b/data/help/table_item_designations
new file mode 100755
index 0000000..8d0e102
--- /dev/null
+++ b/data/help/table_item_designations
Binary files differ
diff --git a/data/help/tables b/data/help/tables
new file mode 100755
index 0000000..4608352
--- /dev/null
+++ b/data/help/tables
Binary files differ
diff --git a/data/help/technical b/data/help/technical
new file mode 100755
index 0000000..f7b1885
--- /dev/null
+++ b/data/help/technical
Binary files differ
diff --git a/data/help/text_viewer b/data/help/text_viewer
new file mode 100755
index 0000000..ad5d603
--- /dev/null
+++ b/data/help/text_viewer
Binary files differ
diff --git a/data/help/text_viewer2 b/data/help/text_viewer2
new file mode 100755
index 0000000..fd6d84f
--- /dev/null
+++ b/data/help/text_viewer2
Binary files differ
diff --git a/data/help/text_viewer3 b/data/help/text_viewer3
new file mode 100755
index 0000000..e18bb63
--- /dev/null
+++ b/data/help/text_viewer3
Binary files differ
diff --git a/data/help/trading b/data/help/trading
new file mode 100755
index 0000000..eaf8078
--- /dev/null
+++ b/data/help/trading
Binary files differ
diff --git a/data/help/unit_profile b/data/help/unit_profile
new file mode 100755
index 0000000..3cf6b4b
--- /dev/null
+++ b/data/help/unit_profile
Binary files differ
diff --git a/data/help/water b/data/help/water
new file mode 100755
index 0000000..c6fdb86
--- /dev/null
+++ b/data/help/water
Binary files differ
diff --git a/data/help/wood b/data/help/wood
new file mode 100755
index 0000000..99984f7
--- /dev/null
+++ b/data/help/wood
Binary files differ
diff --git a/data/index b/data/index
new file mode 100755
index 0000000..e648112
--- /dev/null
+++ b/data/index
Binary files differ
diff --git a/data/init/announcements.txt b/data/init/announcements.txt
new file mode 100755
index 0000000..47b9c75
--- /dev/null
+++ b/data/init/announcements.txt
@@ -0,0 +1,307 @@
+BOX or DO_MEGA: the announcment will appear in a box and pause the game
+P or PAUSE: the announcement will cause the game to pause
+R or RECENTER: the announcement will cause the game to recenter (if possible)
+A_D or A_DISPLAY: the announcement will be displayed in the main adventure announcement log (and on screen)
+D_D or D_DISPLAY: the announcement will be displayed in the main dwarf announcement log (and at the bottom)
+UCR or UNIT_COMBAT_REPORT: the announcement will be associated to the unit combat/hunting/sparring reports
+UCR_A or UNIT_COMBAT_REPORT_ALL_ACTIVE: the announcement will be associated to any active unit combat/hunting/sparring reports, but if there are no reports it will not create one
+
+[REACHED_PEAK:A_D:D_D:BOX]
+[ERA_CHANGE:A_D:D_D:BOX]
+[ENDGAME_EVENT_1:A_D:D_D:BOX:P:R]
+[ENDGAME_EVENT_2:A_D:D_D:BOX:P:R]
+[FEATURE_DISCOVERY:A_D:D_D:BOX:P:R]
+[STRUCK_DEEP_METAL:A_D:D_D:BOX:P:R]
+[STRUCK_MINERAL:A_D:D_D]
+[STRUCK_ECONOMIC_MINERAL:A_D:D_D]
+[COMBAT_TWIST_WEAPON:A_D:UCR]
+[COMBAT_LET_ITEM_DROP:A_D:UCR]
+[COMBAT_START_CHARGE:A_D:UCR]
+[COMBAT_SURPRISE_CHARGE:A_D:UCR]
+[COMBAT_JUMP_DODGE_PROJ:A_D:UCR]
+[COMBAT_JUMP_DODGE_STRIKE:A_D:UCR]
+[COMBAT_DODGE:A_D:UCR]
+[COMBAT_COUNTERSTRIKE:A_D:UCR]
+[COMBAT_BLOCK:A_D:UCR]
+[COMBAT_PARRY:A_D:UCR]
+[COMBAT_CHARGE_COLLISION:A_D:UCR]
+[COMBAT_CHARGE_DEFENDER_TUMBLES:A_D:UCR]
+[COMBAT_CHARGE_DEFENDER_KNOCKED_OVER:A_D:UCR]
+[COMBAT_CHARGE_ATTACKER_TUMBLES:A_D:UCR]
+[COMBAT_CHARGE_ATTACKER_BOUNCE_BACK:A_D:UCR]
+[COMBAT_CHARGE_TANGLE_TOGETHER:A_D:UCR]
+[COMBAT_CHARGE_TANGLE_TUMBLE:A_D:UCR]
+[COMBAT_CHARGE_RUSH_BY:A_D:UCR]
+[COMBAT_CHARGE_MANAGE_STOP:A_D:UCR]
+[COMBAT_CHARGE_OBSTACLE_SLAM:A_D:UCR]
+[COMBAT_WRESTLE_LOCK:A_D:UCR]
+[COMBAT_WRESTLE_CHOKEHOLD:A_D:UCR]
+[COMBAT_WRESTLE_TAKEDOWN:A_D:UCR]
+[COMBAT_WRESTLE_THROW:A_D:UCR]
+[COMBAT_WRESTLE_RELEASE_LOCK:A_D:UCR]
+[COMBAT_WRESTLE_RELEASE_CHOKE:A_D:UCR]
+[COMBAT_WRESTLE_RELEASE_GRIP:A_D:UCR]
+[COMBAT_WRESTLE_STRUGGLE:A_D:UCR]
+[COMBAT_WRESTLE_RELEASE_LATCH:A_D:UCR]
+[COMBAT_WRESTLE_STRANGLE_KO:A_D:UCR]
+[COMBAT_WRESTLE_ADJUST_GRIP:A_D:UCR]
+[COMBAT_GRAB_TEAR:A_D:UCR]
+[COMBAT_STRIKE_DETAILS:A_D:UCR]
+[COMBAT_STRIKE_DETAILS_2:A_D:UCR]
+[COMBAT_EVENT_ENRAGED:A_D:UCR]
+[COMBAT_EVENT_STUCKIN:A_D:UCR]
+[COMBAT_EVENT_LATCH_BP:A_D:UCR]
+[COMBAT_EVENT_LATCH_GENERAL:A_D:UCR]
+[COMBAT_EVENT_PROPELLED_AWAY:A_D:UCR]
+[COMBAT_EVENT_KNOCKED_OUT:A_D:UCR]
+[COMBAT_EVENT_STUNNED:A_D:UCR]
+[COMBAT_EVENT_WINDED:A_D:UCR]
+[COMBAT_EVENT_NAUSEATED:A_D:UCR]
+[MIGRANT_ARRIVAL_NAMED:A_D:D_D:P:R]
+[MIGRANT_ARRIVAL:A_D:D_D:P:R]
+[DIG_CANCEL_WARM:A_D:D_D:P:R]
+[DIG_CANCEL_DAMP:A_D:D_D:P:R]
+[AMBUSH_DEFENDER:A_D:D_D:P:R]
+[AMBUSH_RESIDENT:A_D:D_D:P:R]
+[AMBUSH_THIEF:A_D:D_D:P:R]
+[AMBUSH_THIEF_SUPPORT_SKULKING:A_D:D_D:P:R]
+[AMBUSH_THIEF_SUPPORT_NATURE:A_D:D_D:P:R]
+[AMBUSH_THIEF_SUPPORT:A_D:D_D:P:R]
+[AMBUSH_MISCHIEVOUS:A_D:D_D:P:R]
+[AMBUSH_SNATCHER:A_D:D_D:P:R]
+[AMBUSH_SNATCHER_SUPPORT:A_D:D_D:P:R]
+[AMBUSH_AMBUSHER_NATURE:A_D:D_D:P:R]
+[AMBUSH_AMBUSHER:A_D:D_D:P:R]
+[AMBUSH_INJURED:A_D:D_D:P:R]
+[AMBUSH_OTHER:A_D:D_D:P:R]
+[AMBUSH_INCAPACITATED:A_D:D_D:P:R]
+[CARAVAN_ARRIVAL:A_D:D_D:P:R]
+[NOBLE_ARRIVAL:A_D:D_D:P:R]
+[D_MIGRANTS_ARRIVAL:A_D:D_D:P:R]
+[D_MIGRANT_ARRIVAL:A_D:D_D:P:R]
+[D_MIGRANT_ARRIVAL_DISCOURAGED:A_D:D_D]
+[D_NO_MIGRANT_ARRIVAL:A_D:D_D]
+[ANIMAL_TRAP_CATCH:A_D:D_D:P:R]
+[ANIMAL_TRAP_ROBBED:A_D:D_D:P:R]
+[MISCHIEF_LEVER:A_D:D_D:P:R]
+[MISCHIEF_PLATE:A_D:D_D:P:R]
+[MISCHIEF_CAGE:A_D:D_D:P:R]
+[MISCHIEF_CHAIN:A_D:D_D:P:R]
+[DIPLOMAT_ARRIVAL:A_D:D_D:P:R]
+[LIAISON_ARRIVAL:A_D:D_D:P:R]
+[TRADE_DIPLOMAT_ARRIVAL:A_D:D_D:P:R]
+[CAVE_COLLAPSE:A_D:D_D:P:R]
+[BIRTH_CITIZEN:A_D:D_D:P:R]
+[BIRTH_ANIMAL:A_D:D_D]
+[BIRTH_WILD_ANIMAL:A_D:D_D]
+[STRANGE_MOOD:A_D:D_D:P:R]
+[MADE_ARTIFACT:A_D:D_D:BOX:P:R]
+[NAMED_ARTIFACT:A_D:D_D:BOX:P:R]
+[ITEM_ATTACHMENT:A_D:D_D]
+[VERMIN_CAGE_ESCAPE:A_D:D_D:P:R]
+[TRIGGER_WEB:A_D:D_D:P:R]
+[MOOD_BUILDING_CLAIMED:A_D:D_D:P:R]
+[ARTIFACT_BEGUN:A_D:D_D:P:R]
+[MEGABEAST_ARRIVAL:A_D:D_D:BOX:P:R]
+[BERSERK_CITIZEN:A_D:D_D:P:R]
+[MAGMA_DEFACES_ENGRAVING:A_D:D_D]
+[ENGRAVING_MELTS:A_D:D_D]
+[MASTERPIECE_ARCHITECTURE:A_D:D_D]
+[MASTERPIECE_CONSTRUCTION:A_D:D_D]
+[MASTER_ARCHITECTURE_LOST:A_D:D_D]
+[MASTER_CONSTRUCTION_LOST:A_D:D_D]
+[ADV_AWAKEN:A_D:D_D]
+[ADV_SLEEP_INTERRUPTED:A_D:D_D]
+[ADV_REACTION_PRODUCTS:A_D:D_D]
+[CANCEL_JOB:A_D:D_D]
+[ADV_CREATURE_DEATH:A_D:D_D:UCR_A]
+[CITIZEN_DEATH:A_D:D_D:UCR_A]
+[PET_DEATH:A_D:D_D:UCR_A]
+[FALL_OVER:A_D:UCR_A]
+[CAUGHT_IN_FLAMES:A_D:UCR_A]
+[CAUGHT_IN_WEB:A_D:UCR_A]
+[UNIT_PROJECTILE_SLAM_BLOW_APART:A_D:UCR_A]
+[UNIT_PROJECTILE_SLAM:A_D:UCR_A]
+[UNIT_PROJECTILE_SLAM_INTO_UNIT:A_D:UCR_A]
+[VOMIT:A_D:UCR_A]
+[LOSE_HOLD_OF_ITEM:A_D:UCR_A]
+[REGAIN_CONSCIOUSNESS:A_D:UCR_A]
+[FREE_FROM_WEB:A_D:UCR_A]
+[PARALYZED:A_D:UCR_A]
+[OVERCOME_PARALYSIS:A_D:UCR_A]
+[NOT_STUNNED:A_D:UCR_A]
+[EXHAUSTION:A_D:UCR_A]
+[PAIN_KO:A_D:UCR_A]
+[BREAK_GRIP:A_D:UCR_A]
+[NO_BREAK_GRIP:A_D:UCR_A]
+[BLOCK_FIRE:A_D:UCR_A]
+[BREATHE_FIRE:A_D:UCR_A]
+[SHOOT_WEB:A_D:UCR_A]
+[PULL_OUT_DROP:A_D:UCR_A]
+[STAND_UP:A_D:UCR_A]
+[MARTIAL_TRANCE:A_D:D_D]
+[MAT_BREATH:A_D:UCR_A]
+[NIGHT_ATTACK_STARTS:A_D:D_D:BOX]
+[NIGHT_ATTACK_ENDS:A_D:D_D:BOX]
+[NIGHT_ATTACK_TRAVEL:A_D:D_D]
+[GHOST_ATTACK:A_D:D_D:UCR_A]
+[TRAVEL_SITE_DISCOVERY:A_D:D_D:BOX]
+[TRAVEL_SITE_BUMP:A_D:D_D]
+[ADVENTURE_INTRO:BOX]
+[CREATURE_SOUND:A_D]
+[MECHANISM_SOUND:A_D]
+[CREATURE_STEALS_OBJECT:A_D:D_D]
+[FOUND_TRAP:A_D:D_D]
+[BODY_TRANSFORMATION:A_D:D_D]
+[INTERACTION_ACTOR:A_D:UCR]
+[INTERACTION_TARGET:A_D:UCR]
+[UNDEAD_ATTACK:A_D:D_D:BOX:P:R]
+[CITIZEN_MISSING:A_D:D_D:UCR_A]
+[PET_MISSING:A_D:D_D:UCR_A]
+[STRANGE_RAIN_SNOW:A_D:D_D]
+[STRANGE_CLOUD:A_D:D_D:P:R]
+[SIMPLE_ANIMAL_ACTION:A_D]
+[FLOUNDER_IN_LIQUID:A_D]
+[TRAINING_DOWN_TO_SEMI_WILD:A_D:D_D]
+[TRAINING_FULL_REVERSION:A_D:D_D:P:R]
+[ANIMAL_TRAINING_KNOWLEDGE:A_D:D_D]
+[SKIP_ON_LIQUID:A_D:UCR_A]
+[DODGE_FLYING_OBJECT:A_D:UCR_A]
+[REGULAR_CONVERSATION:A_D]
+[CONFLICT_CONVERSATION:A_D:UCR_A]
+[FLAME_HIT:A_D:UCR]
+[EMBRACE:A_D]
+[BANDIT_EMPTY_CONTAINER:A_D]
+[BANDIT_GRAB_ITEM:A_D]
+[COMBAT_EVENT_ATTACK_INTERRUPTED:A_D:UCR]
+[COMBAT_WRESTLE_CATCH_ATTACK:A_D:UCR]
+[FAIL_TO_GRAB_SURFACE:A_D:UCR_A]
+[LOSE_HOLD_OF_SURFACE:A_D:UCR_A]
+[TRAVEL_COMPLAINT:A_D:D_D:BOX]
+[LOSE_EMOTION:A_D:UCR_A]
+[REORGANIZE_POSSESSIONS:A_D]
+[PUSH_ITEM:A_D:UCR_A]
+[DRAW_ITEM:A_D]
+[STRAP_ITEM:A_D]
+[GAIN_SITE_CONTROL:A_D:D_D:BOX]
+[FORT_POSITION_SUCCESSION:A_D:D_D:BOX:P:R]
+[STRESSED_CITIZEN:A_D:D_D]
+[CITIZEN_LOST_TO_STRESS:A_D:D_D]
+[CITIZEN_TANTRUM:A_D:D_D]
+[MOVED_OUT_OF_RANGE:A_D:D_D]
+[CANNOT_JUMP:A_D:D_D]
+[NO_TRACKS:A_D:D_D]
+[ALREADY_SEARCHED_AREA:A_D:D_D]
+[SEARCH_FOUND_SOMETHING:A_D:D_D]
+[SEARCH_FOUND_NOTHING:A_D:D_D]
+[NOTHING_TO_INTERACT:A_D:D_D]
+[NOTHING_TO_EXAMINE:A_D:D_D]
+[YOU_YIELDED:A_D:D_D]
+[YOU_UNYIELDED:A_D:D_D]
+[YOU_STRAP_ITEM:A_D:D_D]
+[YOU_DRAW_ITEM:A_D:D_D]
+[NO_GRASP_TO_DRAW_ITEM:A_D:D_D]
+[NO_ITEM_TO_STRAP:A_D:D_D]
+[NO_INV_TO_REMOVE:A_D:D_D]
+[NO_INV_TO_WEAR:A_D:D_D]
+[NO_INV_TO_EAT:A_D:D_D]
+[NO_INV_TO_CONTAIN:A_D:D_D]
+[NO_INV_TO_DROP:A_D:D_D]
+[NOTHING_TO_PICK_UP:A_D:D_D]
+[NO_INV_TO_THROW:A_D:D_D]
+[NO_INV_TO_FIRE:A_D:D_D]
+[CURRENT_SMELL:A_D:D_D]
+[CURRENT_WEATHER:A_D:D_D]
+[CURRENT_TEMPERATURE:A_D:D_D]
+[CURRENT_DATE:A_D:D_D]
+[NO_GRASP_FOR_PICKUP:A_D:D_D]
+[TRAVEL_ADVISORY:A_D:D_D]
+[CANNOT_CLIMB:A_D:D_D]
+[CANNOT_STAND:A_D:D_D]
+[MUST_UNRETRACT_FIRST:A_D:D_D]
+[CANNOT_REST:A_D:D_D]
+[CANNOT_MAKE_CAMPFIRE:A_D:D_D]
+[MADE_CAMPFIRE:A_D:D_D]
+[CANNOT_SET_FIRE:A_D:D_D]
+[SET_FIRE:A_D:D_D]
+[DAWN_BREAKS:A_D:D_D]
+[NOON:A_D:D_D]
+[NIGHTFALL:A_D:D_D]
+[NO_INV_INTERACTION:A_D:D_D]
+[EMPTY_CONTAINER:A_D:D_D]
+[TAKE_OUT_OF_CONTAINER:A_D:D_D]
+[NO_CONTAINER_FOR_ITEM:A_D:D_D]
+[PUT_INTO_CONTAINER:A_D:D_D]
+[EAT_ITEM:A_D:D_D]
+[DRINK_ITEM:A_D:D_D]
+[CONSUME_FAILURE:A_D:D_D]
+[DROP_ITEM:A_D:D_D]
+[PICK_UP_ITEM:A_D:D_D]
+[YOU_BUILDING_INTERACTION:A_D:D_D]
+[YOU_ITEM_INTERACTION:A_D:D_D]
+[YOU_TEMPERATURE_EFFECTS:A_D:D_D]
+[RESOLVE_SHARED_ITEMS:A_D:D_D]
+[COUGH_BLOOD:A_D:D_D]
+[VOMIT_BLOOD:A_D:D_D]
+[POWER_LEARNED:A_D:D_D]
+[YOU_FEED_ON_SUCKEE:A_D:D_D]
+[PROFESSION_CHANGES:A_D:D_D]
+[RECRUIT_PROMOTED:A_D:D_D]
+[SOLDIER_BECOMES_MASTER:A_D:D_D]
+[MERCHANTS_UNLOADING:A_D:D_D]
+[MERCHANTS_NEED_DEPOT:A_D:D_D]
+[MERCHANT_WAGONS_BYPASSED:A_D:D_D]
+[MERCHANTS_LEAVING_SOON:A_D:D_D]
+[MERCHANTS_EMBARKED:A_D:D_D]
+[PET_LOSES_DEAD_OWNER:A_D:D_D]
+[PET_ADOPTS_OWNER:A_D:D_D]
+[VERMIN_BITE:A_D:D_D]
+[UNABLE_TO_COMPLETE_BUILDING:A_D:D_D]
+[JOBS_REMOVED_FROM_UNPOWERED_BUILDING:A_D:D_D]
+[CITIZEN_SNATCHED:A_D:D_D]
+[VERMIN_DISTURBED:A_D:D_D]
+[LAND_GAINS_STATUS:A_D:D_D]
+[LAND_ELEVATED_STATUS:A_D:D_D]
+[MASTERPIECE_CRAFTED:A_D:D_D]
+[ARTWORK_DEFACED:A_D:D_D]
+[ANIMAL_TRAINED:A_D:D_D]
+[DYED_MASTERPIECE:A_D:D_D]
+[COOKED_MASTERPIECE:A_D:D_D]
+[MANDATE_ENDS:A_D:D_D]
+[SLOWDOWN_ENDS:A_D:D_D]
+[FAREWELL_HELPER:A_D:D_D]
+[ELECTION_RESULTS:A_D:D_D]
+[SITE_PRESENT:A_D:D_D]
+[CONSTRUCTION_SUSPENDED:A_D:D_D]
+[LINKAGE_SUSPENDED:A_D:D_D]
+[QUOTA_FILLED:A_D:D_D]
+[JOB_OVERWRITTEN:A_D:D_D]
+[NOTHING_TO_CATCH_IN_WATER:A_D:D_D]
+[DEMAND_FORGOTTEN:A_D:D_D]
+[NEW_DEMAND:A_D:D_D]
+[NEW_MANDATE:A_D:D_D]
+[PRICES_ALTERED:A_D:D_D]
+[NAMED_RESIDENT_CREATURE:A_D:D_D]
+[SOMEBODY_GROWS_UP:A_D:D_D]
+[GUILD_REQUEST_TAKEN:A_D:D_D]
+[GUILD_WAGES_CHANGED:A_D:D_D]
+[NEW_WORK_MANDATE:A_D:D_D]
+[CITIZEN_BECOMES_SOLDIER:A_D:D_D]
+[CITIZEN_BECOMES_NONSOLDIER:A_D:D_D]
+[PARTY_ORGANIZED:A_D:D_D]
+[POSSESSED_TANTRUM:A_D:D_D]
+[BUILDING_TOPPLED_BY_GHOST:A_D:D_D]
+[MASTERFUL_IMPROVEMENT:A_D:D_D]
+[MASTERPIECE_ENGRAVING:A_D:D_D]
+[MARRIAGE:A_D:D_D]
+[NO_MARRIAGE_CELEBRATION:A_D:D_D]
+[CURIOUS_GUZZLER:A_D:D_D]
+[WEATHER_BECOMES_CLEAR:A_D:D_D]
+[WEATHER_BECOMES_SNOW:A_D:D_D]
+[WEATHER_BECOMES_RAIN:A_D:D_D]
+[SEASON_WET:A_D:D_D]
+[SEASON_DRY:A_D:D_D]
+[SEASON_SPRING:A_D:D_D]
+[SEASON_SUMMER:A_D:D_D]
+[SEASON_AUTUMN:A_D:D_D]
+[SEASON_WINTER:A_D:D_D] \ No newline at end of file
diff --git a/data/init/arena.txt b/data/init/arena.txt
new file mode 100755
index 0000000..6a86dd0
--- /dev/null
+++ b/data/init/arena.txt
@@ -0,0 +1,1305 @@
+Z=-4, Lowest Level (must leave this line here)
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP.........................CCCCCC.....................PPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP.........................CCCCCC.....................PPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP.........................CCCCCC......................PPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP.......................................................PP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP.......................................................PP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPP.....PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPP.....PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPP.....PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPP.....PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPP.....PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPP.....PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPP.....PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPRRPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP....PPPPPPPPP....PPPPPPPPP....PPPPPPPPP....PPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP.RR.PPPPPPPPP.RR.PPPPPPPPP.RR.PPPPPPPPP.RR.PPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP.PP.PPPPPPPPP.PP.PPPPPPPPP.PP.PPPPPPPPP.PP.PPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP....PPPPPPPPP....PPPPPPPPP....PPPPPPPPP....PPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP.PP.PPPPPPPPP.PP.PPPPPPPPP.PP.PPPPPPPPP.PP.PPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP.RR.PPPPPPPPP.RR.PPPPPPPPP.RR.PPPPPPPPP.RR.PPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP....PPPPPPPPP....PPPPPPPPP....PPPPPPPPP....PPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP....PPPPPPPPP....PPPPPPPPP....PPPPPPPPP....PPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP....PPPPPPPPP....PPPPPPPPP....PPPPPPPPP....PPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP.RR.PPPPPPPPP.RR.PPPPPPPPP.RR.PPPPPPPPP.RR.PPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP.PP.PPPPPPPPP.PP.PPPPPPPPP.PP.PPPPPPPPP.PP.PPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP....PPPPPPPPP....PPPPPPPPP....PPPPPPPPP....PPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP.PP.PPPPPPPPP.PP.PPPPPPPPP.PP.PPPPPPPPP.PP.PPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP.RR.PPPPPPPPP.RR.PPPPPPPPP.RR.PPPPPPPPP.RR.PPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP....PPPPPPPPP....PPPPPPPPP....PPPPPPPPP....PPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP....PPPPPPPPP....PPPPPPPPP....PPPPPPPPP....PPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP....PPPPPPPPP....PPPPPPPPP....PPPPPPPPP....PPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP.RR.PPPPPPPPP.RR.PPPPPPPPP.RR.PPPPPPPPP.RR.PPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP.PP.PPPPPPPPP.PP.PPPPPPPPP.PP.PPPPPPPPP.PP.PPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP....PPPPPPPPP....PPPPPPPPP....PPPPPPPPP....PPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP.PP.PPPPPPPPP.PP.PPPPPPPPP.PP.PPPPPPPPP.PP.PPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP.RR.PPPPPPPPP.RR.PPPPPPPPP.RR.PPPPPPPPP.RR.PPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP....PPPPPPPPP....PPPPPPPPP....PPPPPPPPP....PPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP....PPPPPPPPP....PPPPPPPPP....PPPPPPPPP....PPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP....PPPPPPPPP....PPPPPPPPP....PPPPPPPPP....PPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP.RR.PPPPPPPPP.RR.PPPPPPPPP.RR.PPPPPPPPP.RR.PPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP.PP.PPPPPPPPP.PP.PPPPPPPPP.PP.PPPPPPPPP.PP.PPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP....PPPPPPPPP....PPPPPPPPP....PPPPPPPPP....PPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP.PP.PPPPPPPPP.PP.PPPPPPPPP.PP.PPPPPPPPP.PP.PPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP.RR.PPPPPPPPP.RR.PPPPPPPPP.RR.PPPPPPPPP.RR.PPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP....PPPPPPPPP....PPPPPPPPP....PPPPPPPPP....PPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP..PPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP..........PP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP..PP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPRPPPPPCCCCC...PR..PP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP.....PCCCCC...PP..PP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP.PCCCCCPPR.P..PP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP..PRPCCCCCPPR.P..PP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP.PPPCCCCC...PP..PP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPR.............PR..PP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+Z=-3 (must leave this line here)
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPLLLlPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP####################################################PPPPP
+PPLLLlPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP####################################################PPPPP
+PPLLLlPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP#####################################################PPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP#######################################################PP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP#######################################################PP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP#######################################################PP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP#######################################################PP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP#######################################################PP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP#######################################################PP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP#######################################################PP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP#######################################################PP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPRRRRRRRRRRRRRRRRRRR..RRRRRRRRRRR..RRRRRRRRRRRRRRRRRRRRRPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP..PPPPPPPPPPP..PPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP..PPPPPPPPPPP..PPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP..PPPPPPPPPPP..PPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP..PPPPPPPPPPP..PPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP..PPPPPPPPPPP..PPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP..PPPPPPPPPPP..PPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP..PPPPPPPPPPP..PPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP..PPPPPPPPPPP..PPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP..PPPPPPPPPPP..PPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP..PPPPPPPPPPP..PPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP..PPPPPPPPPPP..PPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP..PPPPPPPPPPP..PPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP..PPPPPPPPPPP..PPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP..PPPPPPPPPPP..PPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP..PPPPPPPPPPP..PPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP..PPPPPPPPPPP..PPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP..PPPPPPPPPPP..PPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP..PPPPPPPPPPP..PPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP..PPPPPPPPPPP..PPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP..PPPPPPPPPPP..PPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP..PPPPPPPPPPP..PPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP..PPPPPPPPPPP..PPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP..PPPPPPPPPPP..PPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP..PPPPPPPPPPP..PPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP..PPPPPPPPPPP..PPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP..PPPPPPPPPPP..PPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP..PPPPPPPPPPP..PPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP..PPPPPPPPPPP..PPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP..PPPPPPPPPPP..PPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP..PPPPPPPPPPP..PPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP..PPPPPPPPPPP..PPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP..PPPPPPPPPPP..PPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP..PPPPPPPPPPP..PPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP..PPPPPPPPPPP..PPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP..PPPPPPPPPPP..PPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP..PPPPPPPPPPP..PPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP..PPPPPPPPPPP..PPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP..PPPPPPPPPPP..PPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP..PPPPPPPPPPP..PPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP..PPPPPPPPPPP..PPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP..PPPPPPPPPPP..PPPPPPPPPPPPPPPPPPPPPPP
+PPPPPP#####PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP..PPPPPPPPPPP..PPPPPPPPPPPPPPPPPPPPPPP
+PPPPPP#####PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP..PPPPPPPPPPP..PPPPPPPPPPPPPPPPPPPPPPP
+PPPPPP#####PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP..PPPPPPPPPPP..PPPPPPPPPPPPPPPPPPPPPPP
+PPPPPP#####PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP..PPPPPPPPPPP..PPPPPPPPPPPPPPPPPPPPPPP
+PPPPPP#####PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP..PPPPPPPPPPP..PPPPPPPPPPPPPPPPPPPPPPP
+PPPPPP#####PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP..PPPPPPPPPPP..PPPPPPPPPPPPPPPPPPPPPPP
+PPPPPP#####PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP..PPPPPPPPPPP..PPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP..PPPPPPPPPPP..PPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP..PPPPPPPPPPP..PPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP..PPPPPPPPPPP..PPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP..PPPPPPPPPPP..PPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP..PPPPPPPPPPP..PPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP..PPPPPPPPPPP..PPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP..PPPPPPPPPPP..PPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP..PPPPPPPPPPP..PPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP..PPPPPPPPPPP..PPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP..PPPPPPPPPPP..PPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP..PPPPPPPPPPP..PPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP..PPPPPPPPPPP..PPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP..PPPPPPPPPPP..PPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP..PPPPPPPPPPP..PPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP..PPPPPPPPPPP..PPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP..PPPPPPPPPPP..PPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP..PPPPPPPPPPP..PPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP..PPPPPPPPPPP..PPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP..PPPPPPPPPPP..PPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP..PPPPPPPPPPP..PPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP..PPPPPPPPPPP..PPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP..PPPPPPPPPPP..PPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP..PPPPPPPPPPP..PPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP..PPPPPPPPPPP..PPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP..PPPPPPPPPPP..PPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP..PPPPPPPPPPP..PPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP..PPPPPPPPPPP..PPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP..PPPPPPPPPPP..PPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP..PPPPPPPPPPP..PPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP..PPPPPPPPPPP..PPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP..PPPPPPPPPPP..PPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP..PPPPPPPPPPP..PPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP..PPPPPPPPPPP..PPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP..PPPPPPPPPPP..PPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP..PPPPPPPPPPP..PPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP..PPPPPPPPPPP..PPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP..PPPPPPPPPPP..PPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPRPPPPP..PPPPPRPPPPP..PPPPPRPPPPPRRPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP...........................PPPPP##PPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP####PPPPRPPPP####PPPPRPPPP####PPPPRPPPP####PPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP..P####P..PPP..P####P..PPP..P####P..PPP..P####P..PPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP...PPRRPP...P...PPRRPP...P...PPRRPP...P...PPRRPP...PPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP............P............P............P............PPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP...PPRRPP...P...PPRRPP...P...PPRRPP...P...PPRRPP...PPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP..P####P..PPP..P####P..PPP..P####P..PPP..P####P..PPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP####PPPPRPPPP####PPPPRPPPP####PPPPRPPPP####PPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP####PPPP...........................PPPP####PPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP####PPPPRPPPP####PPPPRPPPP####PPPPRPPPP####PPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP..P####P..PPP..P####P..PPP..P####P..PPP..P####P..PPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPWWWPPP...PPRRPP...P...PPRRPP...P...PPRRPP...P...PPRRPP...PPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPWWWPPP............P............P............P............PPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPWWWPPP...PPRRPP...P...PPRRPP...P...PPRRPP...P...PPRRPP...PPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPWWWPPPP..P####P..PPP..P####P..PPP..P####P..PPP..P####P..PPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPWWWPPPPPPP####PPPPRPPPP####PPPPRPPPP####PPPPRPPPP####PPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPWWWPPPPPPP####PPPP...........................PPPP####PPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPWWWPPPPPPP####PPPPRPPPP####PPPPRPPPP####PPPPRPPPP####PPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPWWWPPPP..P####P..PPP..P####P..PPP..P####P..PPP..P####P..PPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPWWWPPP...PPRRPP...P...PPRRPP...P...PPRRPP...P...PPRRPP...PPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPWWWPPP............P............P............P............PPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPWWWPPP...PPRRPP...P...PPRRPP...P...PPRRPP...P...PPRRPP...PPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPWWWPPPP..P####P..PPP..P####P..PPP..P####P..PPP..P####P..PPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPWWWPPPPPPP####PPPPRPPPP####PPPPRPPPP####PPPPRPPPP####PPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPWWWPPPPPPP####PPPP...........................PPPP####PPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPWWWPPPPPPP####PPPPRPPPP####PPPPRPPPP####PPPPRPPPP####PPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPWWWPPPP..P####P..PPP..P####P..PPP..P####P..PPP..P####P..PPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPWWWPPP...PPRRPP...P...PPRRPP...P...PPRRPP...P...PPRRPP...PPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPWWWPPP............P............P............P............PPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPWWWPPP...PPRRPP...P...PPRRPP...P...PPRRPP...P...PPRRPP...PPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPWWWPPPP..P####P..PPP..P####P..PPP..P####P..PPP..P####P..PPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPWWWPPPPPPP####PPPPPPPPP####PPPPPPPPP####PPPPPPPPP####PPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP.....PPPPPPWWWPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP.........PPPPWWWPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP...........PPPWWWPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP.............PWWWPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP#RP.RP#######PR###PP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP...........P.PWWWPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP#PP.#P#######PPP##PP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP.........PP.PWWWPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP....#P####PPR##P##PP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP.....PPPPRPWWWPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP.##P#P####PPR##P##PP
+PPWWWwPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPWWWPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP.R#P.P#######PPP##PP
+PPWWWwPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPWWWPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP#P##RP#######PR###PP
+PPWWWwPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPWWWPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPWWWPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPWWWPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+Z=-2 (must leave this line here)
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPLLLLLLLLLLLLLLLLLLlPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP####################################################PPPPP
+PPLLLLLLLLLLLLLLLLLLlPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP####################################################PPPPP
+PPLLLLLLLLLLLLLLLLLLlPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP#####################################################PPPP
+PPLLLLLLLLLLLLLLLLLLlPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP#######################################################PP
+PPLLLLLLLLLLLLLLLLLLlPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP#######################################################PP
+PPLLLLLLLLLLLLLLLLLLlPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP#######################################################PP
+PPLLLLLLLLLLLLLLLLLLlPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP#######################################################PP
+PPLLLLLLLLLLLLLLLLLLlPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP#######################################################PP
+PPLLLLLLLLLLLLLLLLLLlPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP#######################################################PP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP#######################################################PP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP#######################################################PP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP#######################################################PP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP.......................................................PP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP.......................................................PP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP.......................................................PP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP.......................................................PP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP.......................................................PP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP.......................................................PP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP.......................................................PP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP.......................................................PP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP.......................................................PP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP.......................................................PP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP.......................................................PP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP.......................................................PP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP.......................................................PP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP.......................................................PP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPP#########PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPP#########PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPP#########PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPP#########PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPP#########PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPP#########PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPP#########PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP..PPPPPPPPPPP..PPPPPPPPPPP..PPPPPPPPPPP..PPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP....PPPPPPPPP....PPPPPPPPP....PPPPPPPPP....PPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP......PPPPPPP......PPPPPPP......PPPPPPP......PPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP......PPPPPPP......PPPPPPP......PPPPPPP.PPPP.PPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP......PPPPPPP......PPPPPPP......PPPPPPP.PRRP.PPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP......PP.#.PP......PP.#.PP......PP.#.PP.P##P.PPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP......P..P..P......P..P..P......P..P..P......PPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPR..RPP..#..PPR..RPP..#..PPR..RPP..#..PPR..RPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP##PPP.PPP.PPP##PPP.PPP.PPP##PPP.PPP.PPP##PPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP...PR##RP...P...PR##RP...P...PR##RP...P...PR##RP...PPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP.....##.....P.....##.....P.....##.....P.....##.....PPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP...PR##RP...P...PR##RP...P...PR##RP...P...PR##RP...PPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP##PPPPPPPPPPP##PPPPPPPPPPP##PPPPPPPPPPP##PPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPR..RPPP.#.PPPR..RPPP.#.PPPR..RPPP.#.PPPR..RPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP#..#P...P...P#..#P...P...P#..#P...P...P#..#PPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPR..RP.P.#.P.PR..RP.P.#.P.PR..RP.P.#.P.PR..RPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP##PP.PPPPP.PP##PP.PPPPP.PP##PP.PPPPP.PP##PPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP###PPP...PR##RP...P...PR##RP...P...PR##RP...P...PR##RP...PPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP###PPP.....##.....P.....##.....P.....##.....P.....##.....PPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP###PPP...PR##RP...P...PR##RP...P...PR##RP...P...PR##RP...PPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP###PPPPPPPP##PPPPPPPPPPP##PPPPPPPPPPP##PPPPPPPPPPP##PPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP###PPPPPPPR..RPPP.#.PPPR..RPPP.#.PPPR..RPPP.#.PPPR..RPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP###PPPPPPP#..#P...P...P#..#P...P...P#..#P...P...P#..#PPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP###PPPPPPPR..RP.P.#.P.PR..RP.P.#.P.PR..RP.P.#.P.PR..RPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP###PPPPPPPP##PP.PPPPP.PP##PP.PPPPP.PP##PP.PPPPP.PP##PPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP###PPP...PR##RP...P...PR##RP...P...PR##RP...P...PR##RP...PPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP###PPP.....##.....P...P.##.....P.....##.....P.....##.....PPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP###PPP...PR##RP...P...PR##RP...P...PR##RP...P...PR##RP...PPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP###PPPPPPPP##PPPPPPPPPPP##PPPPPPPPPPP##PPPPPPPPPPP##PPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP###PPPPPPPR..RPPP.#.PPPR..RPPP.#.PPPR..RPPP.#.PPPR..RPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP###PPPPPPP#..#P...P...P#..#P...P...P#..#P...P...P#..#PPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP###PPPPPPPR..RP.P.#.P.PR..RP.P.#.P.PR..RP.P.#.P.PR..RPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP###PPPPPPPP##PP.PPPPP.PP##PP.PPPPP.PP##PP.PPPPP.PP##PPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP###PPP...PR##RP...P...PR##RP...P...PR##RP...P...PR##RP...PPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP###PPP.....##.....P.....##.....P.....##.....P...P.##.....PPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP###PPP...PR##RP...P...PR##RP...P...PR##RP...P...PR##RP...PPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP###PPPPPPPP##PPPPPPPPPPP##PPPPPPPPPPP##PPPPPPPPPPP##PPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP###PPPPPPPR..RP.......PR..RP.......PR..RPPPPPPPPPR..RPPP....PP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP###PPPPPPPP..PP.......PP..PP.......PP..PPPPPPPPPPP..........PP
+PPWWWWWWWWWWWWWWWWwPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP###PPPPPPPP..P.........P..P.........P...............PPPP....PP
+PPWWWWWWWWWWWWWWWWwPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP###PPPPPPPP..P.........P..PPPPP.PPPPP..PPPPPPPPPPPPPPPPPPPPPPP
+PPWWWWWWWWWWWWWWWWwPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP###PPPPPPPP..P.........P...............PPP##.##...####PR####PP
+PPWWWWWWWWWWWWWWWWwPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP###PPPPPPPP..PPPPP.PPPPP..PPPPPPPPPPPPPPPP#..#PP#.####PPPP##PP
+PPWWWWWWWWWWWWWWWWwPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP###PPPPPPPP...............PPPPPPPPPPPPPPPP#PR#R...#PPR###P##PP
+PPWWWWWWWWWWWWWWWWwPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP#P###PPPPPPPP..PPPPPPPPPPPPPPPPPPPPPPPPPPPPP###PR...#PPR###P##PP
+PPWWWWWWWWWWWWWWWWwPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP...............PPPPPPPPPPPPPPPPPPPPPPPPPPPPP###PPP#.####PPPP##PP
+PPWWWWWWWWWWWWWWWWwPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP...............PPPPPPPPPPPPPPPPPPPPPPPPPPPPP#RP##...####PR####PP
+PPWWWWWWWWWWWWWWWWwPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP###PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP###PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP###PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+Z=-1 (must leave this line here)
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP+++PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPWWWPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLPPWWWPP####################################################PPPPP
+PPLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLPPWWWPP####################################################PPPPP
+PPLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLPPWWWPP#####################################################PPPP
+PPLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLPPWWWPP#######################################################PP
+PPLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLPPWWWPP#######################################################PP
+PPLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLPPWWWPP#######################################################PP
+PPLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLPPWWWPP#######################################################PP
+PPLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLPPWWWPP#######################################################PP
+PPLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLPPWWWPP#######################################################PP
+PPLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLPPWWWPP#######################################################PP
+PPLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLPPWWWPP#######################################################PP
+PPLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLPPWWWPP#######################################################PP
+PPLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLPPWWWPP#######################################################PP
+PPLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLPPWWWPP#######################################################PP
+PPLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLPPWWWPP#######################################################PP
+PPLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLPPWWWPP#######################################################PP
+PPLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLPPWWWPP#######################################################PP
+PPLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLPPWWWPP#######################################################PP
+PPLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLPPWWWPP#######################################################PP
+PPLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLPPWWWPP#######################################################PP
+PPLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLPPWWWPP#######################################################PP
+PPLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLPPWWWPP#######################################################PP
+PPLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLPPWWWPP#######################################################PP
+PPLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLPPWWWPP#######################################################PP
+PPLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLPPWWWPP#######################################################PP
+PPLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLPPWWWPP#######################################################PP
+PPLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLPPWWWPP#######################################################PP
+PPLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLPPWWWPP#######################################################PP
+PPLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLPPWWWPP#######################################################PP
+PPLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLPPWWWPP#######################################################PP
+PPLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLPPWWWPP#######################################################PP
+PPLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLPPWWWPP#######################################################PP
+PPLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLPPWWWPP#######################################################PP
+PPLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLPPWWWPP#######################################################PP
+PPLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLPPWWWPP#######################################################PP
+PPLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLPPWWWPP#######################################################PP
+PPLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLPPWWWPP#######################################################PP
+PPLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLPPWWWPP#######################################################PP
+PPLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLPPWWWPP#######################################################PP
+PPLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLPPWWWPP#######################################################PP
+PPLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLPPWWWPP#######################################################PP
+PPLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLPPWWWPP#######################################################PP
+PPLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLPPWWWPP#######################################################PP
+PPLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLPPWWWPP#######################################################PP
+PPLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLPPWWWPP#######################################################PP
+PPLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLPPWWWPP#######################################################PP
+PPLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLPPWWWPP#######################################################PP
+PPLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLPPWWWPP#######################################################PP
+PPLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLPPWWWPP#######################################################PP
+PPLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLPPWWWPP#######################################################PP
+PPLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLPPWWWPP#######################################################PP
+PPLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLPPWWWPP#######################################################PP
+PPLLLPPPPPPPPPPPPPPPPPLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLPPWWWPP#######################################################PP
+PPLLLP##############PPPLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLPPWWWPP#######################################################PP
+PPLLLP###############PPPLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLPPWWWPP#######################################################PP
+PPLLLP###############PPPLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLPPWWWPP#######################################################PP
+PPLLLP###############PPPLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLPPWWWPP#############PPP#######################################PP
+PPLLLP###############PPPLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLPPWWWPP#######PPP#############################################PP
+PPLLLP###############PPPLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLPPWWWPP###P###PPPPPPPPP#######################################PP
+PPLLLP#############PPPPLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLPPWWWPP#######PPP#############################################PP
+PPLLLPPPPPPPPPPPPPPPPPLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLPPWWWPP#######################################################PP
+PPLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLPPWWWPP#######################################################PP
+PPLLLPPPPPPPPPPPLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLPPWWWPP########P##############################################PP
+PPLLLPPPPPPPPPPPLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLPPWWWPP########P##############################################PP
+PPLPLPPPPPPPPPPPLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLPPWWWPP########P##############################################PP
+PPLLLPPPPPPPPPPPLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLPPWWWPP#PPP#PP#P##############################################PP
+PPLLLPPPPPPPPPPPLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLPPWWWPP#PPP#PP#P#PP###########################################PP
+PPLPLPPPPPPPPPPPLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLPPWWWPP#PPP#PP#P#PP#P#P#######################################PP
+PPLLLPPPPPPPPPPPLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLPPWWWPP#######################################################PP
+PPLLLPPPPPPPPPPPLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLPPWWWPP##############P###P####################################PP
+PPLPLPPPPPPPPPPPLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLPPPPWWWPPPP#####################################################PP
+PPLLLPPPPPPPPPPPLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLPPPWWWWWWWWWPPP#########P#P#P#####################################PP
+PPLLLPPPPPPPPPPPLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLPPWWWWWWWWWWWWWPP##################################################PP
+PPLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLPPWWWWWPPPPPWWWWWPP########P##P#####################################PP
+PPLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLPPWWWWPPPPPPPPPWWWWPP################################################PP
+PPLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLPPWWWWPPPPPPPPPPPWWWWPP###############################################PP
+PPLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLPPWWWPPPPPPPPPPPPPWWWPP###############################################PP
+PPllllllllllllllllllllLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLPPPWWWPPPPPPPPPPPPPWWWPPPRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPWWWWPPPPPPPPPPPPPWWWWPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPWWWPPPPPPPPPPPPPPPWWWPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
++WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWPPPPPPPPPPPPPPPWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW+
++WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWPPPPPPPPPPPPPPPWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW+
++WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWPPPPPPPPPPPPPPPWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW+
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPWWWPPPPPPPPPPPPPPPWWWPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPWWWWPPPPPPPPPPPPPWWWWPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPwwwwwwwwwwwwwwwwwwwwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWPPPWWWPPPPPPPPPPPPPWWWPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWPPWWWPPPPPPPPPPPPPWWWPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWPPWWWWPPPPPPPPPPPWWWWPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWPPWWWWPPPPPPPPPWWWWPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWPPWWWWWPPPPPWWWWWPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWPPWWWWWWWWWWWWWPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWPPPWWWWWWWWWPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWPPPPWWWPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWPPWWWPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWPPWWWPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWPPWWWPP...............................................PPPPPPPPPP
+PPWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWPPWWWPP.PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP##PPPPPPPPPP
+PPWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWPPWWWPP.PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWPPWWWPP.PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWPPWWWPP.PPPP####PPPPPPPPP####PPPPPPPPP####PPPPPPPPP####PPPPPPPPP
+PPWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWPPWWWPP.P..........PPP..........PPP..........PPP..........PPPPPP
+PPWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWPPWWWPP.P..P#..#P..PPP..P#..#P..PPP..P#..#P..PPP..P#..#P..PPPPPP
+PPWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWPPWWWPP.P..P#..#P..PPP..P#..#P..PPP..P#..#P..PPP..P#..#P..PPPPPP
+PPWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWPPWWWPP.P..P#..#P..PPP..P#..#P..PPP..P#..#P..PPP..P#..#P..PPPPPP
+PPWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWPPWWWPP.P..........PPP..........PPP..........PPP..........PPPPPP
+PPWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWPPWWWPP.PPPP####PPPPPPPPP####PPPPPPPPP####PPPPPPPPP####PPPPPPPPP
+PPWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWPPWWWPP.PPPP####PPPPPPPPP####PPPPPPPPP####PPPPPPPPP####PPPPPPPPP
+PPWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWPPWWWPP.PPPP####PPPPPPPPP####PPPPPPPPP####PPPPPPPPP####PPPPPPPPP
+PPWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWPPWWWPP.P..........PPP..........PPP..........PPP..........PPPPPP
+PPWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWPP###PP.P..P#..#P..PPP..P#..#P..PPP..P#..#P..PPP..P#..#P..PPPPPP
+PPWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWPP###PP.P..P#..#P..PPP..P#..#P..PPP..P#..#P..PPP..P#..#P..PPPPPP
+PPWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWPP###PP.P..P#..#P..PPP..P#..#P..PPP..P#..#P..PPP..P#..#P..PPPPPP
+PPWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWPP###PP.P..........PPP..........PPP..........PPP..........PPPPPP
+PPWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWPP###PP.PPPP####PPPPPPPPP####PPPPPPPPP####PPPPPPPPP####PPPPPPPPP
+PPWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWPP###PP.PPPP####PPPPPPPPP####PPPPPPPPP####PPPPPPPPP####PPPPPPPPP
+PPWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWPP###PP.PPPP####PPPPPPPPP####PPPPPPPPP####PPPPPPPPP####PPPPPPPPP
+PPWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWPP###PP.P..........PPP..........PPP..........PPP..........PPPPPP
+PPWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWPP###PP.P..P#..#P..PPP..P#..#P..PPP..P#..#P..PPP..P#..#P..PPPPPP
+PPWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWPP###PP.P..P#..#P..PPP..P#..#P..PPP..P#..#P..PPP..P#..#P..PPPPPP
+PPWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWPP###PP.P..P#..#P..PPP..P#..#P..PPP..P#..#P..PPP..P#..#P..PPPPPP
+PPWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWPP###PP.P..........PPP..........PPP..........PPP..........PPPPPP
+PPWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWPP###PP.PPPP####PPPPPPPPP####PPPPPPPPP####PPPPPPPPP####PPPPPPPPP
+PPWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWPP###PP.PPPP####PPPPPPPPP####PPPPPPPPP####PPPPPPPPP####PPPPPPPPP
+PPWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWPP###PP.PPPP####PPPPPPPPP####PPPPPPPPP####PPPPPPPPP####PPPPPPPPP
+PPWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWPP###PP.P..........PPP..........PPP..........PPP..........PPPPPP
+PPWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWPP###PPRP..P#..#P..PPP..P#..#P..PPP..P#..#P..PPP..P#..#P..PPPPPP
+PPWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWPP###PPPP..P#..#P..PPP..P#..#P..PPP..P#..#P..PPP..P#..#P..PPPPPP
+PPWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWPP###PPPP..P#..#P..PPP..P#..#P..PPP..P#..#P..PPP..P#..#P..PPPPPP
+PPWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWPP###PPPP..........PPP..........PPP..........PPP..........PPPPPP
+PPWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWPP###PPPP.PP####PPPPPPPPP####PPPPPPPPP####PPPPPPPPP####PPPPPPPPP
+PPWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWPP###PPPP.PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWPP###PPPP.PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWPP###PPPP.PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWPP###PPPP.PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP..RP#######PR#####PP
+PPWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWPP###PPPP.PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP.##P...####PPPPP##PP
+PPWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWPP###PPPP.PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP..#P#PR#PPR####P##PP
+PPWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWPP###PP...PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP###P#PR#PPR####P##PP
+PPWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWPP###PP.PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP###P...####PPPPP##PP
+PPWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWPP###PP.PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP##RP#######PR#####PP
+PPWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWPP###PP.PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP###PPRPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP###PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
+Z=0 (must leave this line here)
+..................................................................................###......................................................PPPPP
+..................................................................................###..........................................................P
+..#################################...##########################################..###..############################...#####################....P
+..#################################...##########################################..###..############################...#####################PP..P
+..#################################...#############################################################################...######################P..P
+..#################################...#############################################################################...########################..
+..#################################...#############################################################################...########################..
+..#################################...#############################################################################...########################..
+..#################################...#############################################################################...########################..
+..#################################...#############################################################################...########################..
+..#################################...#############################################################################...########################..
+..#################################...#############################################################################...########################..
+..#################################...#############################################################################...##########################
+..#################################...#############################################################################...##########################
+###################################...#############################################################################...##########################
+###################################...#############################################################################...##########################
+###################################...#############################################################################...##########################
+###################################...#############################################################################...##########################
+###################################...#############################################################################...##########################
+###################################...#############################################################################...##########################
+###################################...#############################################################################...##########################
+###################################...#############################################################################...##########################
+###################################...#############################################################################...##########################
+###################################...#############################################################################...##########################
+###################################...#############################################################################...##########################
+##################################.....############################################################################...##########################
+##################################.....############################################################################...##########################
+#################################.......###########################################################################...##########################
+###############################...........#########################################################################...##########################
+############################.................######################################################################...##########################
+#########################.......................###################################################################...##########################
+#########################.......................###################################################################...##########################
+#########################..RRRRRRRRRRRRRRRRRRR..###################################################################...##########################
+########################...RPPPPPPPPPPPPPPPPPR...##################################################################...##########################
+########################...RP...............PR...##################################################################...##########################
+########################...RP...............PR...##################################################################...##########################
+#######################....RP...............PR....#################################################################...##########################
+#######################....RP...............PR....#################################################################...##########################
+..####################.....RP...............PR.....#############################..#################################...##########################
+..##################.......RP...............PR.......###########################..#################################...##########################
+...........................RP...............PR....................................#################################...##########################
+...........................RP...............PR....................................#################################...##########################
+...........................RP...............PR....................................#################################...##########################
+..##################.......RP...............PR.......###########################..#################################...##########################
+..####################.....RP...............PR.....#############################..#################################...##########################
+#######################....RP...............PR....#################################################################...##########################
+#######################....RP...............PR....#################################################################...##########################
+########################...RP...............PR...##################################################################...##########################
+########################...RP...............PR...##################################################################...##########################
+########################...RPPPPPPP...PPPPPPPR...##################################################################...##########################
+#########################..RRRRRRRR...RRRRRRRR..###################################################################...##########################
+#########################.......................###################################################################...##########################
+#########################.......................###################################################################...##########################
+############################.................######################################################################...##########################
+#####PPPPPPPPPPPPPPPPP#########...........#########################################################################...##########################
+#####P###############PP##########.......###########################################################################...##########################
+#####P################PPP#########.....############################################################################...##########################
+#####P################PPPP########.....############################################################################...##########################
+#####P##################PP#########...#############################################################################...##########################
+#####P##################PP#########...#############################################################################...##########################
+#####P#################PP##########...#############################################################################...##########################
+#####P################PP###########...#############################################################################...##########################
+#####PPPPPPPPPPPPPPPPPP############...#############################################################################...##########################
+###################################...#############################################################################...##########################
+#####...........###################...#############################################################################...##########################
+#####.PPPPPPPPP.###################...#############################################################################...##########################
+#####.PPPPPPPPP.###################...#############################################################################...##########################
+#####.PPPPPPPPP.###################...#############################################################################...##########################
+#####.PPPPPPPPP.###################...###########################################.###.#############################...##########################
+#####.PPPPPPPPP.###################...###########################################.###.#############################...##########################
+#####.PPPPPPPPP.###################...###########################################.###.#############################...##########################
+#####.PPPPPPPPP.###################...###########################################.###.#############################...##########################
+#####.PPPPPPPPP.###################...##########################################..###..############################...##########################
+#####.PPPPPPPPP.###################...#############################################################################...##########################
+#####...........###################...#############################################################################...##########################
+###################################...###########################################PPPPP#############################...##########################
+..#################################...#########################################PPP###PPP###########################...##########################
+..#################################...########################################PP#######PP##########################...##########################
+..#################################...#######################################PP#########PP#########################...##########################
+..#################################...#######################################P###########P#########################...##########################
+.........................................................................####P###########P####.....................RRR..........................
+.........................................................................###PP###########PP###.....................PPP..........................
+############################################################################P#############P#####################################################
+############################################################################P#############P#####################################################
+############################################################################P#############P#####################################################
+.........................................................................###PP###########PP###.....................PPP..........................
+.........................................................................####P###########P####.....................RRR..........................
+..#################################...#######################################P###########P###...................................................
+..#################################...#######################################PP#########PP###...................................................
+..#################################...########################################PP#######PP####...................................................
+..#################################...#########################################PPP###PPP####....................................................
+..#################################...###########################################PPPPP#####.....................................................
+###################################...####################################################......................................................
+###################################...##################################################........................................................
+###################################...#########################################...###ggggggggggggggggggggggggggg....~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+###################################...###########################################.###ggggggggggggggggggggggggggg....~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+###################################...###########################################.###ggggggggggggggggggggggggggg....~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+###################################...###########################################.###ggggggggggggggggggggggggggg....~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+###################################...###########################################.###ggggggggggggggggggggggggggg....~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+###################################...###########################################.###gggggTggggggggggggggggggggg....~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+###################################...###########################################.###ggggggggggggggggggggggggggg....~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+###################################...###########################################.###ggggggggggggggggggggTgggggg....~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+###################################...###########################################.###ggggggggggggggggggggggggggg....~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+###################################...###########################################.###ggggggggggggggggggggggggggg....~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+###################################...###########################################.###ggggggggggggggggggggggggggg....~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+###################################...###########################################.###ggggTgggggggggggggggggggggg....~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+###################################...###########################################.###ggggggggggggggggggggggggggg....~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+###################################...###########################################.###ggggggggggggggggggggggggggg....~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+###################################...###########################################.###ggggggggggggggggggggggggggg....~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+###################################...###########################################.###ggggggggggggggggggggggggggg....,,,,,,,,,,,,,,,,,,,,,,,,,,,,
+###################################...###########################################.###ggggggggggggggggggggggggggg....,,,,,,,,,,,,,,,,,,,,,,,,,,,,
+###################################...###########################################.###ggggggggggggggggggggggggggg....,,,,,,,,,,,,,,,,,,,,,,,,,,,,
+###################################...###########################################.###ggggggggggggggggggggggggggg....,,,,,,,,,,,,,,,,,,,,,,,,,,,,
+###################################...###########################################.###ggggggggggggggggggggggggggg....,,,,,,,,,,,,,,,,,,,,,,,,,,,,
+###################################...###########################################.###ggggggggggggggggggggggggggg....,,,,,,,,,,,,,,,,,,,,,,,,,,,,
+###################################...###########################################.###ggggggggggggggTgggggggggggg....,,,,,,,,,,,,,,,,,,,,,,,,,,,,
+###################################...###########################################.###ggggggggggggggggggggggggggg....,,,,,,,,,,,,,,,,,,,,,,,,,,,,
+###################################...###########################################.###ggggggggggggggggggggggggggg....,,,,,,,,,,,,,,,,,,,,,,,,,,,,
+###################################...###########################################.###ggggggggggggggggggggggggggg....,,,,,,,,,,,,,,,,,,,,,,,,,,,,
+###################################...###########################################.###ggggggggggggggggggggggggggg....,,,,,,,,,,,,,,,,,,,,,,,,,,,,
+###################################...###########################################.###ggggggggggggggggggggggggggg....,,,,,,,,,,,,,,,,,,,,,,,,,,,,
+###################################...###########################################.###ggggggggggggggggggggggggggg....,,,,,,,,,,,,,,,,,,,,,,,,,,,,
+###################################...###########################################.###ggggggggggggggggggggggggggg....,,,,,,,,,,,,,,,,,,,,,,,,,,,,
+###################################...###########################################.###ggggggggggggggggggggggggggg....,,,,,,,,,,,,,,,,,,,,,,,,,,,,
+###################################...###########################################.###ggggggggggggggggggggggggggg....,,,,,,,,,,,,,,,,,,,,,,,,,,,,
+###################################...###########################################.###PPPPPPPPPPPPPPPPPPPPPPPPPPP....PPPPPPPPPPPPPPPPPPPPPPPPPPP.
+###################################...###########################################.###P...P................PPP..........PPP...............P....P.
+###################################...###########################################.###P.#.P................PRP..........PRP.....P.P.P.P...P....P.
+###################################...###########################################.###P...P..............P.P.P..........P.P...............PPPP.P.
+###################################...###########################################.###PP.PPPPPPPPPPPPP.PPP.P.P..........P.P...............P....P.
+###################################...###########################################.###P...P........P.....PPP.P..........P.PPP...P.P.P.P...P....P.
+###################################...###########################################.###P...P........P.....P..................P.............P....P.
+###################################...###########################################.###P...P........P.....P..................PPPPPPP.PPPPPPPPPP.P.
+###################################...###########################################.###P...PPPP..PPPP...........................................P.
+###################################...###########################################.###P............P.....P..................PPPPPPPPPPPPPPPPPPPP.
+###################################...###########################################.###P...PPPP..PPPP.....P..................P###.........######P.
+###################################...###########################################.###P...P........PPPPPPPPPPPPPPPPPPPPPPPPPP###P######PPPPPP##P.
+###################################...###########################################.###P...P........P...P...P...P...P...P..P........##PR#####P##P.
+..#################################...##########################################..###P...P........P...P...P...P...P...P..P........##PR#####P##P.
+..#################################...##########################################..###P...PPPPPPPPPPP.PPP.PPP.PPP.PPP.PP.PP.P###P######PPPPPP##P.
+..#################################...##########################################..###P.....................................P###.........######P.
+..#################################...##########################################..###PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP.
+..................................................................................###..#........................................................
+..................................................................................###...........................................................
+Z=1 (must leave this line here)
+###########################################################################################################################################PPPPP
+###########################################################################################################################################PPPPP
+###########################################################################################################################################PPPPP
+###########################################################################################################################################PPPPP
+############################################################################################################################################PPPP
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+############################.................###################################################################################################
+############################.RRRRRRRRRRRRRRR.###################################################################################################
+############################.RPPPPPPPPPPPPPR.###################################################################################################
+############################.RP###########PR.###################################################################################################
+############################.RP###########PR.###################################################################################################
+############################.RP###########PR.###################################################################################################
+############################.RP###########PR.###################################################################################################
+############################.RP###########PR.###################################################################################################
+############################.RP###########PR.###################################################################################################
+############################.RP###########PR.###################################################################################################
+############################.RP###########PR.###################################################################################################
+############################.RP###########PR.###################################################################################################
+############################.RP###########PR.###################################################################################################
+############################.RP###########PR.###################################################################################################
+############################.RPPPPPPPPPPPPPR.###################################################################################################
+############################.RRRRRRRRRRRRRRR.###################################################################################################
+############################.................###################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+#########################PPP####################################################################################################################
+#########################PPP####################################################################################################################
+#########################PPP####################################################################################################################
+##########################P#####################################################################################################################
+##########################P#####################################################################################################################
+##########################P#####################################################################################################################
+##########################P#####################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+########PPPPP###################################################################################################################################
+########PPPPP###################################################################################################################################
+########PPPPP###################################################################################################################################
+########PPPPP###################################################################################################################################
+########PPPPP###################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+###################################################################################################################...##########################
+###################################################################################################################...##########################
+###################################################################################################################...##########################
+###################################################################################################################...##########################
+###################################################################################################################...##########################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+#####################################################################################FFFFFFFFFFFFFFFFFFFFFPPFFFPFFFFPFFFPPFFFFFFFFFFFFFFFFFFFFF#
+#####################################################################################F....................P..............P....................F#
+#####################################################################################F....................P#............#P....................F#
+#####################################################################################F....................P..............P....................F#
+#####################################################################################F....................P..............P....................F#
+#####################################################################################F....................PPPPPPP..PPPPPPP....................F#
+#####################################################################################F........................................................F#
+#####################################################################################F........................................................F#
+#####################################################################################F........................................................F#
+#####################################################################################PPPPPPPP..............................PPPPPPPPPPPPPPPPPPPP#
+#####################################################################################P......P..............................P#################PP#
+#####################################################################################P......P..............................P###P####.........RP#
+#####################################################################################P.RPP...........................................######.##P#
+#####################################################################################P.PPP...........................................######.##P#
+#####################################################################################P......P..............................P###P####.........RP#
+#####################################################################################P......P..............................P#################PP#
+#####################################################################################PPPPPPPPFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFPPPPPPPPPPPPPPPPPPPP#
+################################################################################################################################################
+################################################################################################################################################
+Z=2 (must leave this line here)
+###########################################################################################################################################PPPPP
+###########################################################################################################################################PPPPP
+###########################################################################################################################################PPPPP
+###########################################################################################################################################PPPPP
+############################################################################################################################################PPPP
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+##############################.............#####################################################################################################
+##############################.RRRRRRRRRRR.#####################################################################################################
+##############################.RPPPPPPPPPR.#####################################################################################################
+##############################.RP#######PR.#####################################################################################################
+##############################.RP#######PR.#####################################################################################################
+##############################.RP#######PR.#####################################################################################################
+##############################.RP#######PR.#####################################################################################################
+##############################.RP#######PR.#####################################################################################################
+##############################.RP#######PR.#####################################################################################################
+##############################.RP#######PR.#####################################################################################################
+##############################.RPPPPPPPPPR.#####################################################################################################
+##############################.RRRRRRRRRRR.#####################################################################################################
+##############################.............#####################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+##########################P#####################################################################################################################
+##########################P#####################################################################################################################
+##########################P#####################################################################################################################
+##########################P#####################################################################################################################
+##########################P#####################################################################################################################
+##########################P#####################################################################################################################
+#########PPP##############P#####################################################################################################################
+#########PPPPPPPPPPPPPPPPPP#####################################################################################################################
+#########PPP####################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+#####################################################################################PPPPPPPP##############################PPPPPPPPPPPPPPPPPPPP#
+#####################################################################################P......P##############################P..................P#
+#####################################################################################P......P##############################PR##P##############P#
+#####################################################################################P.#PPP.P##############################PP#################P#
+#####################################################################################P..PPR.P##############################PP#################P#
+#####################################################################################P......P##############################PR##P##############P#
+#####################################################################################P......P##############################P..................P#
+#####################################################################################PPPPPPPP##############################PPPPPPPPPPPPPPPPPPPP#
+################################################################################################################################################
+################################################################################################################################################
+Z=3 (must leave this line here)
+###########################################################################################################################################PPPPP
+###########################################################################################################################################PPPPP
+###########################################################################################################################################PPPPP
+###########################################################################################################################################PPPPP
+############################################################################################################################################PPPP
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################.........#######################################################################################################
+################################.RRRRRRR.#######################################################################################################
+################################.RPPPPPR.#######################################################################################################
+################################.RP###PR.#######################################################################################################
+################################.RP###PR.#######################################################################################################
+################################.RP###PR.#######################################################################################################
+################################.RPPPPPR.#######################################################################################################
+################################.RRRRRRR.#######################################################################################################
+################################.........#######################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+##########P#####################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+#####################################################################################PPFFFFPP##############################PPPPPPPPPPPPPPPPPPPP#
+#####################################################################################PR....RP##############################P################..P#
+#####################################################################################F......F##############################P###P############..P#
+#####################################################################################F......F##############################P..................P#
+#####################################################################################F....#.F##############################P..................P#
+#####################################################################################F......F##############################P###P############..P#
+#####################################################################################PR....RP##############################P################..P#
+#####################################################################################PPFFFFPP##############################PPPPPPPPPPPPPPPPPPPP#
+################################################################################################################################################
+################################################################################################################################################
+Z=4 (must leave this line here)
+###########################################################################################################################################.....
+###########################################################################################################################################.....
+###########################################################################################################################################.....
+###########################################################################################################################################.....
+############################################################################################################################################....
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+##################################.....#########################################################################################################
+##################################.....#########################################################################################################
+##################################.....#########################################################################################################
+##################################.....#########################################################################################################
+##################################.....#########################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+################################################################################################################################################
+###########################################################################################################################....................#
+###########################################################################################################################....................#
+###########################################################################################################################....................#
+###########################################################################################################################....................#
+###########################################################################################################################....................#
+###########################################################################################################################....................#
+###########################################################################################################################....................#
+###########################################################################################################################....................#
+################################################################################################################################################
+################################################################################################################################################ \ No newline at end of file
diff --git a/data/init/colors.txt b/data/init/colors.txt
new file mode 100755
index 0000000..49291bb
--- /dev/null
+++ b/data/init/colors.txt
@@ -0,0 +1,50 @@
+These are the display colors in RGB. The game is actually displaying extended ASCII characters in OpenGL, so you can modify the colors.
+
+[BLACK_R:0]
+[BLACK_G:0]
+[BLACK_B:0]
+[BLUE_R:0]
+[BLUE_G:0]
+[BLUE_B:128]
+[GREEN_R:0]
+[GREEN_G:128]
+[GREEN_B:0]
+[CYAN_R:0]
+[CYAN_G:128]
+[CYAN_B:128]
+[RED_R:128]
+[RED_G:0]
+[RED_B:0]
+[MAGENTA_R:128]
+[MAGENTA_G:0]
+[MAGENTA_B:128]
+[BROWN_R:128]
+[BROWN_G:128]
+[BROWN_B:0]
+[LGRAY_R:192]
+[LGRAY_G:192]
+[LGRAY_B:192]
+[DGRAY_R:128]
+[DGRAY_G:128]
+[DGRAY_B:128]
+[LBLUE_R:0]
+[LBLUE_G:0]
+[LBLUE_B:255]
+[LGREEN_R:0]
+[LGREEN_G:255]
+[LGREEN_B:0]
+[LCYAN_R:0]
+[LCYAN_G:255]
+[LCYAN_B:255]
+[LRED_R:255]
+[LRED_G:0]
+[LRED_B:0]
+[LMAGENTA_R:255]
+[LMAGENTA_G:0]
+[LMAGENTA_B:255]
+[YELLOW_R:255]
+[YELLOW_G:255]
+[YELLOW_B:0]
+[WHITE_R:255]
+[WHITE_G:255]
+[WHITE_B:255] \ No newline at end of file
diff --git a/data/init/d_init.txt b/data/init/d_init.txt
new file mode 100755
index 0000000..f329a76
--- /dev/null
+++ b/data/init/d_init.txt
@@ -0,0 +1,303 @@
+WARNING: Do NOT copy over the d_init.txt from an earlier version of DF.
+Always read the file carefully, including the comments.
+
+In general, you can copy savegames and tilesets from older DF
+versions, but you should not copy anything else. You should not, under any
+circumstances, unpack a new DF on top of an older one.
+
+
+Use these to control the automatic saving behavior in the dwarf fortress mode of game. AUTOSAVE can be set to NONE, SEASONAL or YEARLY. This updates your save at these intervals, so that some of your progress will be saved in case of system instability. You can set AUTOBACKUP to YES if you want the updated save to be copied to another folder so that you'll have several copies of your world at different times. Set AUTOSAVE_PAUSE to YES if you want the game to pause every time it autosaves.
+
+[AUTOSAVE:NONE]
+[AUTOBACKUP:NO]
+[AUTOSAVE_PAUSE:NO]
+
+Set this to YES if you want it to save the game when you start a new fortress. If AUTOBACKUP above is set to YES, it will also create a copy of this new save.
+
+[INITIAL_SAVE:NO]
+
+Set this to NO to make Dwarf Fortress remain in the saved pause state when you load an active game.
+
+[PAUSE_ON_LOAD:YES]
+
+Set this to YES if you want Dwarf Fortress to show the warning window for embark site selection even if there are no issues (as a way of confirming your choice).
+
+[EMBARK_WARNING_ALWAYS:NO]
+
+This option controls whether or not your choice to embark has a confirmation window after you have selected any dwarves and equipment. Valid choices are ALWAYS, IF_POINTS_REMAIN and NO.
+
+[POST_PREPARE_EMBARK_CONFIRMATION:IF_POINTS_REMAIN]
+
+You can change the option below to ALWAYS and NO. More restrictive world parameter settings override these. ALWAYS lets you see the features in the Local view during embark, and NO stops you from looking for features in the site finder (though if you really want to stop the finder, it might be better for you to generate worlds that restrict the use of this feature completely, in which case you don't need to change the settings here).
+
+[SHOW_EMBARK_TUNNEL:FINDER]
+
+Use these options to remove features from the game. Permitted values are YES and NO. Removal might speed the game up in the case of temperature and weather.
+
+[TEMPERATURE:YES]
+[WEATHER:YES]
+[ECONOMY:YES]
+[INVADERS:YES]
+[CAVEINS:YES]
+[ARTIFACTS:YES]
+[ZERO_RENT:NO]
+[TESTING_ARENA:YES]
+[WALKING_SPREADS_SPATTER_DWF:NO]
+[WALKING_SPREADS_SPATTER_ADV:YES]
+
+Change this to YES to output the reasons for world map rejection into a file.
+
+[LOG_MAP_REJECTS:NO]
+
+Change these numbers to make the embark rectangle start at a different size. The format is (EMBARK_RECTANGLE:<width>:<height>). Numbers may run from 2 to 16. The map size warning message will go by these numbers.
+
+[EMBARK_RECTANGLE:4:4]
+
+Change these numbers to set the default weights for traffic designations. If you make the last numbers too large, pathfinding might lag.
+The format is (PATH_COST:<high>:<normal>:<low>:<restricted>).
+
+[PATH_COST:1:2:5:25]
+
+Alter these options to control how aggressively your dwarves place objects in a container with like items (rather than an empty container). The default options are very aggressive. STORE_DIST_ITEM_DECREASE controls the cap on objects it will consider -- for each object it finds in a container, one tile is removed from its apparent distance to the dwarf, up to this cap. The others control how many tiles are removed for each combination type for any match at all. For instance, if ITEM_DECREASE is set to 20, and SEED_COMBINE is set to 100, a dwarf carrying seeds will see a seed bag with 15 seeds as 115 tiles closer than it actually is (and thus pass up any empties within that distance), whereas a seed bag with 30 seeds would be treated as 120 tiles closer (because it hits the ITEM_DECREASE cap). Values from 2 to 1000 are permitted. Before these init options, the behavior was roughly ITEM_DECREASE 2, SEED_COMBINE 2 and the rest at 1000.
+
+[STORE_DIST_ITEM_DECREASE:20]
+[STORE_DIST_SEED_COMBINE:1000]
+[STORE_DIST_BUCKET_COMBINE:1000]
+[STORE_DIST_BARREL_COMBINE:1000]
+[STORE_DIST_BIN_COMBINE:1000]
+
+Change this to YES to disallow pets from coffin burial as the default option.
+
+[COFFIN_NO_PETS_DEFAULT:NO]
+
+Use these to set the color of wounded body parts. The format is <foreground color>:<background color>:<brightness>.
+
+[WOUND_COLOR_NONE:7:0:1] No recorded active wounds on the part. Default = white
+[WOUND_COLOR_MINOR:6:0:0] Any damage that doesn't have functional/structural consequences (might be heavy bleeding though). Default = brown
+[WOUND_COLOR_INHIBITED:6:0:1] Any muscular, structural or functional damage without total loss. Default = yellow
+[WOUND_COLOR_FUNCTION_LOSS:3:0:1] An important function of the part is completely lost, but the part is structurally sound (or at least partially intact). Default = bright cyan
+[WOUND_COLOR_BROKEN:4:0:1] The part has lost all structural integrity or muscular ability. Default = bright red
+[WOUND_COLOR_MISSING:0:0:1] The part is completely gone. Default = dark gray
+
+This controls the display of areas that are far below outside. The format is SKY:<character>:<foreground color>:<background color>:<brightness>. The <character> can be either an ASCII tile number or a character in quotes, like '#'.
+
+[SKY:178:3:0:0]
+
+As above, for inside/subterranean areas.
+
+[CHASM:250:0:0:1]
+
+Pillar tile, <character> as above.
+
+[PILLAR_TILE:'O']
+
+Track tiles. I at the end inverts the material colors.
+
+[TRACK_N:208I]
+[TRACK_S:210I]
+[TRACK_E:198I]
+[TRACK_W:181I]
+[TRACK_NS:186I]
+[TRACK_NE:200I]
+[TRACK_NW:188I]
+[TRACK_SE:201I]
+[TRACK_SW:187I]
+[TRACK_EW:205I]
+[TRACK_NSE:204I]
+[TRACK_NSW:185I]
+[TRACK_NEW:202I]
+[TRACK_SEW:203I]
+[TRACK_NSEW:206I]
+[TRACK_RAMP_N:30I]
+[TRACK_RAMP_S:30I]
+[TRACK_RAMP_E:30I]
+[TRACK_RAMP_W:30I]
+[TRACK_RAMP_NS:30I]
+[TRACK_RAMP_NE:30I]
+[TRACK_RAMP_NW:30I]
+[TRACK_RAMP_SE:30I]
+[TRACK_RAMP_SW:30I]
+[TRACK_RAMP_EW:30I]
+[TRACK_RAMP_NSE:30I]
+[TRACK_RAMP_NSW:30I]
+[TRACK_RAMP_NEW:30I]
+[TRACK_RAMP_SEW:30I]
+[TRACK_RAMP_NSEW:30I]
+
+Tiles for the parts of trees.
+
+[TREE_ROOT_SLOPING:127]
+[TREE_TRUNK_SLOPING:127]
+[TREE_ROOT_SLOPING_DEAD:127]
+[TREE_TRUNK_SLOPING_DEAD:127]
+[TREE_ROOTS:172]
+[TREE_ROOTS_DEAD:172]
+[TREE_BRANCHES:172]
+[TREE_BRANCHES_DEAD:172]
+[TREE_SMOOTH_BRANCHES:'#']
+[TREE_SMOOTH_BRANCHES_DEAD:'#']
+[TREE_TRUNK_PILLAR:'O']
+[TREE_TRUNK_PILLAR_DEAD:'O']
+[TREE_CAP_PILLAR:'O']
+[TREE_CAP_PILLAR_DEAD:'O']
+[TREE_TRUNK_N:205]
+[TREE_TRUNK_S:205]
+[TREE_TRUNK_N_DEAD:205]
+[TREE_TRUNK_S_DEAD:205]
+[TREE_TRUNK_EW:205]
+[TREE_TRUNK_EW_DEAD:205]
+[TREE_CAP_WALL_N:205]
+[TREE_CAP_WALL_S:205]
+[TREE_CAP_WALL_N_DEAD:205]
+[TREE_CAP_WALL_S_DEAD:205]
+[TREE_TRUNK_E:186]
+[TREE_TRUNK_W:186]
+[TREE_TRUNK_E_DEAD:186]
+[TREE_TRUNK_W_DEAD:186]
+[TREE_TRUNK_NS:186]
+[TREE_TRUNK_NS_DEAD:186]
+[TREE_CAP_WALL_E:186]
+[TREE_CAP_WALL_W:186]
+[TREE_CAP_WALL_E_DEAD:186]
+[TREE_CAP_WALL_W_DEAD:186]
+[TREE_TRUNK_NW:201]
+[TREE_CAP_WALL_NW:201]
+[TREE_TRUNK_NW_DEAD:201]
+[TREE_CAP_WALL_NW_DEAD:201]
+[TREE_TRUNK_NE:187]
+[TREE_CAP_WALL_NE:187]
+[TREE_TRUNK_NE_DEAD:187]
+[TREE_CAP_WALL_NE_DEAD:187]
+[TREE_TRUNK_SW:200]
+[TREE_CAP_WALL_SW:200]
+[TREE_TRUNK_SW_DEAD:200]
+[TREE_CAP_WALL_SW_DEAD:200]
+[TREE_TRUNK_SE:188]
+[TREE_CAP_WALL_SE:188]
+[TREE_TRUNK_SE_DEAD:188]
+[TREE_CAP_WALL_SE_DEAD:188]
+[TREE_TRUNK_NSE:204]
+[TREE_TRUNK_NSE_DEAD:204]
+[TREE_TRUNK_NSW:185]
+[TREE_TRUNK_NSW_DEAD:185]
+[TREE_TRUNK_NEW:202]
+[TREE_TRUNK_NEW_DEAD:202]
+[TREE_TRUNK_SEW:203]
+[TREE_TRUNK_SEW_DEAD:203]
+[TREE_TRUNK_NSEW:206]
+[TREE_TRUNK_NSEW_DEAD:206]
+[TREE_TRUNK_BRANCH_N:207]
+[TREE_TRUNK_BRANCH_N_DEAD:207]
+[TREE_TRUNK_BRANCH_S:209]
+[TREE_TRUNK_BRANCH_S_DEAD:209]
+[TREE_TRUNK_BRANCH_E:199]
+[TREE_TRUNK_BRANCH_E_DEAD:199]
+[TREE_TRUNK_BRANCH_W:182]
+[TREE_TRUNK_BRANCH_W_DEAD:182]
+[TREE_BRANCH_NS:179]
+[TREE_BRANCH_NS_DEAD:179]
+[TREE_BRANCH_EW:196]
+[TREE_BRANCH_EW_DEAD:196]
+[TREE_BRANCH_NW:217]
+[TREE_BRANCH_NW_DEAD:217]
+[TREE_BRANCH_NE:192]
+[TREE_BRANCH_NE_DEAD:192]
+[TREE_BRANCH_SW:191]
+[TREE_BRANCH_SW_DEAD:191]
+[TREE_BRANCH_SE:218]
+[TREE_BRANCH_SE_DEAD:218]
+[TREE_BRANCH_NSE:195]
+[TREE_BRANCH_NSE_DEAD:195]
+[TREE_BRANCH_NSW:180]
+[TREE_BRANCH_NSW_DEAD:180]
+[TREE_BRANCH_NEW:193]
+[TREE_BRANCH_NEW_DEAD:193]
+[TREE_BRANCH_SEW:194]
+[TREE_BRANCH_SEW_DEAD:194]
+[TREE_BRANCH_NSEW:197]
+[TREE_BRANCH_NSEW_DEAD:197]
+[TREE_TWIGS:';']
+[TREE_TWIGS_DEAD:';']
+[TREE_CAP_RAMP:30]
+[TREE_CAP_RAMP_DEAD:30]
+[TREE_CAP_FLOOR1:249]
+[TREE_CAP_FLOOR2:249]
+[TREE_CAP_FLOOR1_DEAD:249]
+[TREE_CAP_FLOOR2_DEAD:249]
+[TREE_CAP_FLOOR3:249]
+[TREE_CAP_FLOOR4:249]
+[TREE_CAP_FLOOR3_DEAD:249]
+[TREE_CAP_FLOOR4_DEAD:249]
+[TREE_TRUNK_INTERIOR:10]
+[TREE_TRUNK_INTERIOR_DEAD:10]
+
+This controls the "IDLERS: <number>" that is displayed in dwarf mode. You can set it to TOP, BOTTOM or OFF.
+
+[IDLERS:TOP]
+
+You can have your dwarves start/arrive without any labor types enabled here by setting this to NO. You can also set it to SKILLS to make the labor list set by skill, or BY_UNIT_TYPE to have it done by overall unit type.
+
+[SET_LABOR_LISTS:SKILLS]
+
+You can set the maximum population of your fortress here. Keep in mind that your population must be at least 80 to get a king and 100 to obtain the current game features. The strict cap also stops fort births. Both caps can be violated by a few special cases, like the arrival of the monarch if you qualify.
+
+[POPULATION_CAP:200]
+[STRICT_POPULATION_CAP:220]
+
+This allows you to control the number of babies+children in your fortress. The first number is an absolute cap on the number of babies+children. The second is a percentage of the current number of adults in your fortress (the default is the essentially meaningless 1000% here). The lower number is used as the cap. The cap only prevents further pregancies, so migrant children, multiple births and existing pregnancies from old saves can still push you over the cap. Setting either number to zero will disallow pregnancies in the fortress.
+
+[BABY_CHILD_CAP:100:1000]
+
+Use the specific seed cap to set the maximum number of seeds of each kind generally allowed in the fortress. Use the fortress seed cap to control the overall number of seeds allowed. Seeds over the global cap will be periodically removed, starting with the oldest and most worthless seeds.
+
+[SPECIFIC_SEED_CAP:200]
+[FORTRESS_SEED_CAP:3000]
+
+If you don't like the ,.`' ground, try setting this to NO. The ground will turn into periods only.
+
+[VARIED_GROUND_TILES:YES]
+
+If you'd like your engravings to start off looking the same (you can toggle them on individual later), set this to YES.
+
+[ENGRAVINGS_START_OBSCURED:NO]
+
+If you get annoyed by seeing items like *<*sword*>* you can
+get rid of the outside ** by setting this to NO.
+
+[SHOW_IMP_QUALITY:YES]
+
+Set this to YES to display fluids as numbers indicating depth.
+
+[SHOW_FLOW_AMOUNTS:NO]
+
+If you'd prefer to leave the history behind every engraving for your adventurers to discover, then set this to NO.
+
+[SHOW_ALL_HISTORY_IN_DWARF_MODE:YES]
+
+This controls "more" in adventure mode. If MORE is set to NO, all announcements will be skipped. DISPLAY_LENGTH controls how many lines are printed before it gives you the "more" prompt.
+
+[MORE:YES]
+[DISPLAY_LENGTH:23]
+
+Set this to NO if you do not want traps to affect you in adventure mode. Cage traps are always disabled for now.
+
+[ADVENTURER_TRAPS:YES]
+
+Set this to NO if you want the game to recenter on your adventurer only when you've gotten close to the edge of the view.
+
+[ADVENTURER_ALWAYS_CENTER:YES]
+
+This controls the up/down views in adventure mode. The first parameter can be OFF, UNHIDDEN, CREATURE or ON. UNHIDDEN makes the view appear when it contains any unhidden square. CREATURE makes the view appear when it contains a creature. The second parameter is the size of the view. It can be 3, 5, 7 or 9. A smaller view lets it stack more of them in the column (3 at size 5, and 5 at size 3).
+
+[ADVENTURER_Z_VIEWS:UNHIDDEN:9]
+
+You can use these to say how nicknames are displayed in each mode
+Options are REPLACE_FIRST, CENTRALIZE (between first and last), REPLACE_ALL
+
+[NICKNAME_DWARF:REPLACE_FIRST]
+[NICKNAME_ADVENTURE:REPLACE_FIRST]
+[NICKNAME_LEGENDS:REPLACE_FIRST]
+
+Set this number to scale how often grazing animals need to eat. Larger numbers mean less food is necessary. Metabolism is always set according to the 3/4ths power of size.
+
+[GRAZE_COEFFICIENT:100] \ No newline at end of file
diff --git a/data/init/init.txt b/data/init/init.txt
new file mode 100755
index 0000000..5c51fe8
--- /dev/null
+++ b/data/init/init.txt
@@ -0,0 +1,150 @@
+WARNING: Do NOT copy over the init.txt from an earlier version of DF.
+Always read the file carefully, including the comments.
+
+In general, you can copy savegames and tilesets from older DF
+versions, but you should not copy anything else. You should not, under any
+circumstances, unpack a new DF on top of an older one.
+
+
+Change this to turn sound off.
+
+[SOUND:YES]
+
+The sound volume runs from 0 (off) to 255 (full). You can set the volume from the ESC options menu as well.
+
+[VOLUME:255]
+
+Change this to skip the wonderful intro movies.
+
+[INTRO:YES]
+
+This lets you set the starting windowed/fullscreen setting. Can be YES, NO or PROMPT.
+
+[WINDOWED:YES]
+
+This is the size and font for windowed mode. Changing to the 800x600 font might make you happier.
+If set below 256x256 it specifies the grid size instead, with a minimum of 80x25.
+
+[WINDOWEDX:80]
+[WINDOWEDY:25]
+[FONT:curses_640x300.png]
+
+You may disable window resizing if you wish.
+[RESIZABLE:YES]
+
+Full screen info. The 0s below mean that the game will choose a resolution for you, but you can set it yourself as well.
+
+[FULLSCREENX:0]
+[FULLSCREENY:0]
+[FULLFONT:curses_800x600.png]
+
+If this is set to NO, tiles will be stretched to fit the screen if there is a resolution mismatch.
+If this is set to YES, the tiles will not be stretched, but rather the game view will be centralized, surrounded by black space. Tiles that are too large will always be compressed rather than running off the screen.
+
+[BLACK_SPACE:YES]
+
+Graphics info, most of it as above. Set GRAPHICS to YES to turn it all on. This will use the "raw/graphics" folder for tile information. Currently this is limited to whatever creature graphics you have downloaded. The game comes with a few pictures to demonstrate. As of January 2015, the Dwarf Fortress Wiki has custom tilesets available at http://dwarffortresswiki.org/index.php/Tileset_repository and creature graphics at http://dwarffortresswiki.org/index.php/Graphics_set_repository.
+
+[GRAPHICS:NO]
+[GRAPHICS_WINDOWEDX:0]
+[GRAPHICS_WINDOWEDY:0]
+[GRAPHICS_FONT:curses_square_16x16.png]
+[GRAPHICS_FULLSCREENX:0]
+[GRAPHICS_FULLSCREENY:0]
+[GRAPHICS_FULLFONT:curses_square_16x16.png]
+[GRAPHICS_BLACK_SPACE:YES]
+
+These settings can have a significant impact on frame rate, especially for people that have slow frame rates on the title screen. Available modes are 2D, 2DSW, 2DASYNC, STANDARD, PARTIAL:<number>, ACCUM_BUFFER, FRAME_BUFFER and VBO. The number after PARTIAL refers to how many frames it will redo a printed tile before skipping it, so you might try increasing it a bit if you have flickering when PARTIAL is set. Please note that any of these combinations might cause frame rates to drop significantly or cause unpleasant side effects like flickering.
+
+By and large, 2D should be the most reliable, while STANDARD has a good combination of speed and reliability. However, all 2D modes are normally far slower than even STANDARD, which may be the slowest OpenGL mode.
+
+On a multi-core machine none of this is very likely to matter; stick to 2D.
+
+2DASYNC may be slightly more responsive than 2D on a multi-core machine, but this has recently become doubtful due to improvements to the other modes.
+
+Linux/OS X users may also use PRINT_MODE:TEXT for primitive ncurses output.
+
+[PRINT_MODE:2D]
+ Mode examples:
+ PRINT_MODE:2D
+ PRINT_MODE:TEXT
+ PRINT_MODE:FRAME_BUFFER
+ PRINT_MODE:PARTIAL:0
+[SINGLE_BUFFER:NO]
+
+Switches truetype on whenever the vertical tile size is this many pixels or larger. You may also use YES/NO to force it on/off. Turning it off may provide a minor speed boost (using font small enough that it doesn't activate won't).
+
+[TRUETYPE:24]
+
+Change this to YES to keep the DF window on top of your other windows.
+
+[TOPMOST:NO]
+
+Change this to YES if you want to see an FPS counter at the top left.
+
+[FPS:NO]
+
+Use this to set the maximum frame rate during play. The movies are always capped at 100. A frame in this case is not graphical but related to the movement speed of a creature. A healthy, unencumbered dwarven peasant takes one step every 10 frames.
+
+You may set FPS_CAP to 0 to make it uncapped.
+
+[FPS_CAP:100]
+
+Use this to set the maximum graphical frame refresh rate during play.
+
+[G_FPS_CAP:50]
+
+On cards that support the OpenGL ARB_sync extension, turning this on can improve framerates in GPU overload conditions. It defaults to NO, as many cards that claim to support this will crash if asked to do so.
+
+[ARB_SYNC:NO]
+
+This sets the applications vertical synchronization behavior. Changing this to YES can impact your FPS if your G_FPS is high. ARB_SYNC is a better option, if your system supports it.
+
+[VSYNC:NO]
+
+Change this to NEAREST if you want the texture values to use the nearest pixel without averaging.
+Change this to LINEAR if you want the texture values to be averaged over the adjacent pixels.
+
+[TEXTURE_PARAM:LINEAR]
+
+Change this to make the dwarfort.exe process have a different priority. From highest to lowest, the options are REALTIME, HIGH, ABOVE_NORMAL, NORMAL, BELOW_NORMAL and IDLE.
+
+[PRIORITY:NORMAL]
+
+Use this to set how fast the game zooms. The default corresponds to
+increasing grid size by 10 units each time you zoom.
+
+[ZOOM_SPEED:10]
+
+Change this to NO if you don't want to have the mouse involved at all.
+
+[MOUSE:YES]
+
+Change this to YES if you'd like to use a BMP for the mouse cursor. The image currently lags when the game is lagging however.
+
+[MOUSE_PICTURE:NO]
+
+This controls the number of milliseconds that must pass before a held key sends an initial repeat press to the game. You might need to adjust this.
+
+[KEY_HOLD_MS:250]
+
+This controls the number of milliseconds that must pass before a held key sends a repeat press to the game after the repeat process has begun.
+
+[KEY_REPEAT_MS:150]
+
+If you set KEY_REPEAT_ACCEL_LIMIT above one, then after KEY_REPEAT_ACCEL_START repetitions the repetition delay will smoothly decrease until repetition is this number of times faster than at the start.
+
+[KEY_REPEAT_ACCEL_LIMIT:8]
+[KEY_REPEAT_ACCEL_START:10]
+
+This controls the number of milliseconds between macro instructions.
+
+[MACRO_MS:15]
+
+This controls the number of milliseconds that must pass before input works again after the view recenters on an event in dwarf mode.
+
+[RECENTER_INTERFACE_SHUTDOWN_MS:0]
+
+Change this to NO if you want to leave save uncompressed (you might want to do this if you are experience save corruption).
+
+[COMPRESSED_SAVES:YES] \ No newline at end of file
diff --git a/data/init/interface.txt b/data/init/interface.txt
new file mode 100755
index 0000000..0c5270f
--- /dev/null
+++ b/data/init/interface.txt
@@ -0,0 +1,3006 @@
+
+[BIND:SELECT:REPEAT_NOT]
+[SYM:0:Enter]
+[SYM:0:Numpad Enter]
+[BIND:SEC_SELECT:REPEAT_NOT]
+[SYM:1:Enter]
+[SYM:1:Numpad Enter]
+[BIND:DESELECT:REPEAT_NOT]
+[KEY:z]
+[BIND:SELECT_ALL:REPEAT_NOT]
+[SYM:1:Enter]
+[SYM:1:Numpad Enter]
+[BIND:DESELECT_ALL:REPEAT_NOT]
+[KEY:Z]
+[BIND:LEAVESCREEN:REPEAT_NOT]
+[SYM:0:ESC]
+[BIND:LEAVESCREEN_ALL:REPEAT_NOT]
+[SYM:1:ESC]
+[BIND:CLOSE_MEGA_ANNOUNCEMENT:REPEAT_NOT]
+[SYM:0:Enter]
+[SYM:0:Numpad Enter]
+[BIND:OPTIONS:REPEAT_NOT]
+[SYM:0:ESC]
+[BIND:OPTION_EXPORT:REPEAT_NOT]
+[KEY:e]
+[BIND:HELP:REPEAT_NOT]
+[KEY:?]
+[BIND:TOGGLE_FULLSCREEN:REPEAT_NOT]
+[SYM:0:F11]
+[BIND:MOVIES:REPEAT_NOT]
+[KEY:;]
+[BIND:FPS_UP:REPEAT_SLOW]
+[SYM:4:Equals]
+[BIND:FPS_DOWN:REPEAT_SLOW]
+[SYM:4:Minus]
+[BIND:ZOOM_IN:REPEAT_SLOW]
+[BUTTON:0:5]
+[BIND:ZOOM_OUT:REPEAT_SLOW]
+[BUTTON:0:4]
+[BIND:ZOOM_TOGGLE:REPEAT_NOT]
+[SYM:2:F10]
+[BIND:ZOOM_RESET:REPEAT_NOT]
+[SYM:0:F10]
+[BIND:MOVIE_RECORD:REPEAT_NOT]
+[KEY:r]
+[BIND:MOVIE_PLAY:REPEAT_NOT]
+[KEY:p]
+[BIND:MOVIE_SAVE:REPEAT_NOT]
+[KEY:s]
+[BIND:MOVIE_LOAD:REPEAT_NOT]
+[KEY:l]
+[BIND:WORLD_PARAM_TITLE:REPEAT_NOT]
+[KEY:t]
+[BIND:WORLD_PARAM_ADD:REPEAT_NOT]
+[KEY:a]
+[BIND:WORLD_PARAM_COPY:REPEAT_NOT]
+[KEY:c]
+[BIND:WORLD_PARAM_DELETE:REPEAT_NOT]
+[KEY:d]
+[BIND:WORLD_PARAM_NAME_RANDOM:REPEAT_NOT]
+[KEY:N]
+[BIND:WORLD_PARAM_NAME_ENTER:REPEAT_NOT]
+[KEY:n]
+[BIND:WORLD_PARAM_SEED_RANDOM:REPEAT_NOT]
+[KEY:S]
+[BIND:WORLD_PARAM_SEED_ENTER:REPEAT_NOT]
+[KEY:s]
+[BIND:WORLD_PARAM_DIM_X_UP:REPEAT_NOT]
+[KEY:i]
+[BIND:WORLD_PARAM_DIM_X_DOWN:REPEAT_NOT]
+[KEY:u]
+[BIND:WORLD_PARAM_DIM_Y_UP:REPEAT_NOT]
+[KEY:p]
+[BIND:WORLD_PARAM_DIM_Y_DOWN:REPEAT_NOT]
+[KEY:o]
+[BIND:WORLD_PARAM_LOAD:REPEAT_NOT]
+[SYM:0:F1]
+[BIND:WORLD_PARAM_SAVE:REPEAT_NOT]
+[SYM:0:F6]
+[BIND:WORLD_PARAM_SET:REPEAT_NOT]
+[KEY:e]
+[BIND:WORLD_PARAM_INCREASE:REPEAT_NOT]
+[SYM:0:6]
+[SYM:0:Numpad 6]
+[SYM:0:Right]
+[BIND:WORLD_PARAM_DECREASE:REPEAT_NOT]
+[SYM:0:4]
+[SYM:0:Numpad 4]
+[SYM:0:Left]
+[BIND:WORLD_PARAM_ENTER_VALUE:REPEAT_NOT]
+[SYM:0:Enter]
+[SYM:0:Numpad Enter]
+[BIND:WORLD_PARAM_NULLIFY:REPEAT_NOT]
+[KEY:n]
+[BIND:WORLD_PARAM_PRESET:REPEAT_NOT]
+[KEY:p]
+[BIND:WORLD_PARAM_REJECT_CONTINUE:REPEAT_NOT]
+[KEY:c]
+[BIND:WORLD_PARAM_REJECT_ABORT:REPEAT_NOT]
+[KEY:a]
+[BIND:WORLD_PARAM_REJECT_ALLOW_THIS:REPEAT_NOT]
+[KEY:t]
+[BIND:WORLD_PARAM_REJECT_ALLOW_ALL:REPEAT_NOT]
+[KEY:p]
+[BIND:WORLD_GEN_CONTINUE:REPEAT_NOT]
+[KEY:c]
+[BIND:WORLD_GEN_USE:REPEAT_NOT]
+[KEY:u]
+[BIND:WORLD_GEN_ABORT:REPEAT_NOT]
+[KEY:a]
+[BIND:CHANGETAB:REPEAT_NOT]
+[SYM:0:Tab]
+[BIND:SEC_CHANGETAB:REPEAT_NOT]
+[SYM:1:Tab]
+[BIND:STANDARDSCROLL_UP:REPEAT_FAST]
+[SYM:0:8]
+[SYM:0:Numpad 8]
+[SYM:0:Up]
+[BIND:STANDARDSCROLL_DOWN:REPEAT_FAST]
+[SYM:0:2]
+[SYM:0:Numpad 2]
+[SYM:0:Down]
+[BIND:STANDARDSCROLL_LEFT:REPEAT_FAST]
+[SYM:0:4]
+[SYM:0:Numpad 4]
+[SYM:0:Left]
+[BIND:STANDARDSCROLL_RIGHT:REPEAT_FAST]
+[SYM:0:6]
+[SYM:0:Numpad 6]
+[SYM:0:Right]
+[BIND:STANDARDSCROLL_PAGEUP:REPEAT_SLOW]
+[SYM:0:9]
+[SYM:0:Numpad 9]
+[SYM:0:Page Up]
+[BIND:STANDARDSCROLL_PAGEDOWN:REPEAT_SLOW]
+[SYM:0:3]
+[SYM:0:Numpad 3]
+[SYM:0:Page Down]
+[BIND:SECONDSCROLL_UP:REPEAT_SLOW]
+[KEY:-]
+[BIND:SECONDSCROLL_DOWN:REPEAT_SLOW]
+[KEY:+]
+[BIND:SECONDSCROLL_PAGEUP:REPEAT_SLOW]
+[KEY:/]
+[BIND:SECONDSCROLL_PAGEDOWN:REPEAT_SLOW]
+[KEY:*]
+[BIND:CURSOR_UP:REPEAT_FAST]
+[SYM:0:8]
+[SYM:0:Numpad 8]
+[SYM:0:Up]
+[BIND:CURSOR_DOWN:REPEAT_FAST]
+[SYM:0:2]
+[SYM:0:Numpad 2]
+[SYM:0:Down]
+[BIND:CURSOR_LEFT:REPEAT_FAST]
+[SYM:0:4]
+[SYM:0:Numpad 4]
+[SYM:0:Left]
+[BIND:CURSOR_RIGHT:REPEAT_FAST]
+[SYM:0:6]
+[SYM:0:Numpad 6]
+[SYM:0:Right]
+[BIND:CURSOR_UPLEFT:REPEAT_FAST]
+[SYM:0:7]
+[SYM:0:Numpad 7]
+[BIND:CURSOR_UPRIGHT:REPEAT_FAST]
+[SYM:0:9]
+[SYM:0:Numpad 9]
+[SYM:0:Page Up]
+[BIND:CURSOR_DOWNLEFT:REPEAT_FAST]
+[SYM:0:1]
+[SYM:0:Numpad 1]
+[BIND:CURSOR_DOWNRIGHT:REPEAT_FAST]
+[SYM:0:3]
+[SYM:0:Numpad 3]
+[SYM:0:Page Down]
+[BIND:CURSOR_UP_FAST:REPEAT_FAST]
+[SYM:1:8]
+[SYM:1:Numpad 8]
+[SYM:1:Up]
+[BIND:CURSOR_DOWN_FAST:REPEAT_FAST]
+[SYM:1:2]
+[SYM:1:Numpad 2]
+[SYM:1:Down]
+[BIND:CURSOR_LEFT_FAST:REPEAT_FAST]
+[SYM:1:4]
+[SYM:1:Numpad 4]
+[SYM:1:Left]
+[BIND:CURSOR_RIGHT_FAST:REPEAT_FAST]
+[SYM:1:6]
+[SYM:1:Numpad 6]
+[SYM:1:Right]
+[BIND:CURSOR_UPLEFT_FAST:REPEAT_FAST]
+[SYM:1:7]
+[SYM:1:Numpad 7]
+[BIND:CURSOR_UPRIGHT_FAST:REPEAT_FAST]
+[SYM:1:9]
+[SYM:1:Numpad 9]
+[SYM:1:Page Up]
+[BIND:CURSOR_DOWNLEFT_FAST:REPEAT_FAST]
+[SYM:1:1]
+[SYM:1:Numpad 1]
+[BIND:CURSOR_DOWNRIGHT_FAST:REPEAT_FAST]
+[SYM:1:3]
+[SYM:1:Numpad 3]
+[SYM:1:Page Down]
+[BIND:CURSOR_UP_Z:REPEAT_SLOW]
+[KEY:<]
+[BIND:CURSOR_DOWN_Z:REPEAT_SLOW]
+[KEY:>]
+[BIND:CURSOR_UP_Z_AUX:REPEAT_SLOW]
+[SYM:1:5]
+[SYM:1:Numpad 5]
+[BIND:CURSOR_DOWN_Z_AUX:REPEAT_SLOW]
+[SYM:2:5]
+[SYM:2:Numpad 5]
+[BIND:WORLDGEN_EXPORT_MAP:REPEAT_NOT]
+[KEY:p]
+[BIND:LEGENDS_EXPORT_MAP:REPEAT_NOT]
+[KEY:p]
+[BIND:LEGENDS_EXPORT_XML:REPEAT_NOT]
+[KEY:x]
+[BIND:LEGENDS_EXPORT_DETAILED_MAP:REPEAT_NOT]
+[KEY:d]
+[BIND:LEGENDS_TOGGLE_CIVSITE:REPEAT_NOT]
+[KEY:c]
+[BIND:LEGENDS_STRING_FILTER:REPEAT_NOT]
+[KEY:f]
+[BIND:SETUP_EMBARK:REPEAT_NOT]
+[KEY:e]
+[BIND:SETUP_NAME_FORT:REPEAT_NOT]
+[KEY:F]
+[BIND:SETUP_NAME_GROUP:REPEAT_NOT]
+[KEY:G]
+[BIND:SETUP_RECLAIM:REPEAT_NOT]
+[KEY:R]
+[BIND:SETUP_FIND:REPEAT_NOT]
+[KEY:f]
+[BIND:SETUP_NOTES:REPEAT_NOT]
+[KEY:n]
+[BIND:SETUP_NOTES_TAKE_NOTES:REPEAT_NOT]
+[KEY:n]
+[BIND:SETUP_NOTES_DELETE_NOTE:REPEAT_NOT]
+[KEY:d]
+[BIND:SETUP_NOTES_CHANGE_SYMBOL_SELECTION:REPEAT_NOT]
+[KEY:c]
+[BIND:SETUP_NOTES_ADOPT_SYMBOL:REPEAT_NOT]
+[KEY:s]
+[BIND:SETUP_LOCAL_Y_UP:REPEAT_SLOW]
+[KEY:U]
+[BIND:SETUP_LOCAL_Y_DOWN:REPEAT_SLOW]
+[KEY:M]
+[BIND:SETUP_LOCAL_X_UP:REPEAT_SLOW]
+[KEY:K]
+[BIND:SETUP_LOCAL_X_DOWN:REPEAT_SLOW]
+[KEY:H]
+[BIND:SETUP_LOCAL_Y_MUP:REPEAT_SLOW]
+[KEY:u]
+[BIND:SETUP_LOCAL_Y_MDOWN:REPEAT_SLOW]
+[KEY:m]
+[BIND:SETUP_LOCAL_X_MUP:REPEAT_SLOW]
+[KEY:k]
+[BIND:SETUP_LOCAL_X_MDOWN:REPEAT_SLOW]
+[KEY:h]
+[BIND:SETUP_BIOME_1:REPEAT_NOT]
+[SYM:0:F1]
+[BIND:SETUP_BIOME_2:REPEAT_NOT]
+[SYM:0:F2]
+[BIND:SETUP_BIOME_3:REPEAT_NOT]
+[SYM:0:F3]
+[BIND:SETUP_BIOME_4:REPEAT_NOT]
+[SYM:0:F4]
+[BIND:SETUP_BIOME_5:REPEAT_NOT]
+[SYM:0:F5]
+[BIND:SETUP_BIOME_6:REPEAT_NOT]
+[SYM:0:F6]
+[BIND:SETUP_BIOME_7:REPEAT_NOT]
+[SYM:0:F7]
+[BIND:SETUP_BIOME_8:REPEAT_NOT]
+[SYM:0:F8]
+[BIND:SETUP_BIOME_9:REPEAT_NOT]
+[SYM:0:F9]
+[BIND:CHOOSE_NAME_RANDOM:REPEAT_NOT]
+[KEY:r]
+[BIND:CHOOSE_NAME_CLEAR:REPEAT_NOT]
+[KEY:c]
+[BIND:CHOOSE_NAME_TYPE:REPEAT_NOT]
+[KEY:e]
+[BIND:ITEM_DESCRIPTION:REPEAT_NOT]
+[KEY:v]
+[BIND:ITEM_FORBID:REPEAT_NOT]
+[KEY:f]
+[BIND:ITEM_MELT:REPEAT_NOT]
+[KEY:m]
+[BIND:ITEM_DUMP:REPEAT_NOT]
+[KEY:d]
+[BIND:ITEM_HIDE:REPEAT_NOT]
+[KEY:h]
+[BIND:A_COMBAT_ATTACK:REPEAT_NOT]
+[KEY:a]
+[BIND:A_COMBAT_DODGE:REPEAT_NOT]
+[KEY:d]
+[BIND:A_COMBAT_CHARGEDEF:REPEAT_NOT]
+[KEY:c]
+[BIND:A_STATUS:REPEAT_NOT]
+[KEY:z]
+[BIND:A_STATUS_WRESTLE:REPEAT_NOT]
+[KEY:c]
+[BIND:A_STATUS_CUSTOMIZE:REPEAT_NOT]
+[KEY:y]
+[BIND:A_STATUS_KILLS:REPEAT_NOT]
+[KEY:k]
+[BIND:A_STATUS_HEALTH:REPEAT_NOT]
+[KEY:h]
+[BIND:A_STATUS_ATT_SKILL:REPEAT_NOT]
+[KEY:s]
+[BIND:A_STATUS_DESC:REPEAT_NOT]
+[KEY:d]
+[BIND:UNITVIEW_CUSTOMIZE:REPEAT_NOT]
+[KEY:y]
+[BIND:UNITVIEW_HEALTH:REPEAT_NOT]
+[KEY:h]
+[BIND:UNITVIEW_RELATIONSHIPS:REPEAT_NOT]
+[KEY:r]
+[BIND:UNITVIEW_RELATIONSHIPS_ZOOM:REPEAT_NOT]
+[KEY:z]
+[BIND:UNITVIEW_RELATIONSHIPS_VIEW:REPEAT_NOT]
+[KEY:v]
+[BIND:UNITVIEW_KILLS:REPEAT_NOT]
+[KEY:k]
+[BIND:CUSTOMIZE_UNIT_NICKNAME:REPEAT_NOT]
+[KEY:n]
+[BIND:CUSTOMIZE_UNIT_PROFNAME:REPEAT_NOT]
+[KEY:p]
+[BIND:A_RETURN_TO_ARENA:REPEAT_NOT]
+[SYM:2:a]
+[BIND:A_MOVE_N:REPEAT_FAST]
+[SYM:0:8]
+[SYM:0:Numpad 8]
+[SYM:0:Up]
+[BIND:A_MOVE_S:REPEAT_FAST]
+[SYM:0:2]
+[SYM:0:Numpad 2]
+[SYM:0:Down]
+[BIND:A_MOVE_E:REPEAT_FAST]
+[SYM:0:6]
+[SYM:0:Numpad 6]
+[SYM:0:Right]
+[BIND:A_MOVE_W:REPEAT_FAST]
+[SYM:0:4]
+[SYM:0:Numpad 4]
+[SYM:0:Left]
+[BIND:A_MOVE_NW:REPEAT_FAST]
+[SYM:0:7]
+[SYM:0:Numpad 7]
+[BIND:A_MOVE_NE:REPEAT_FAST]
+[SYM:0:9]
+[SYM:0:Numpad 9]
+[SYM:0:Page Up]
+[BIND:A_MOVE_SW:REPEAT_FAST]
+[SYM:0:1]
+[SYM:0:Numpad 1]
+[BIND:A_MOVE_SE:REPEAT_FAST]
+[SYM:0:3]
+[SYM:0:Numpad 3]
+[SYM:0:Page Down]
+[BIND:A_MOVE_SAME_SQUARE:REPEAT_SLOW]
+[SYM:0:5]
+[SYM:0:Numpad 5]
+[BIND:A_CARE_MOVE_N:REPEAT_FAST]
+[SYM:4:8]
+[SYM:4:Numpad 8]
+[SYM:4:Up]
+[BIND:A_CARE_MOVE_S:REPEAT_FAST]
+[SYM:4:2]
+[SYM:4:Numpad 2]
+[SYM:4:Down]
+[BIND:A_CARE_MOVE_E:REPEAT_FAST]
+[SYM:4:6]
+[SYM:4:Numpad 6]
+[SYM:4:Right]
+[BIND:A_CARE_MOVE_W:REPEAT_FAST]
+[SYM:4:4]
+[SYM:4:Numpad 4]
+[SYM:4:Left]
+[BIND:A_CARE_MOVE_NW:REPEAT_FAST]
+[SYM:4:7]
+[SYM:4:Numpad 7]
+[BIND:A_CARE_MOVE_NE:REPEAT_FAST]
+[SYM:4:9]
+[SYM:4:Numpad 9]
+[SYM:4:Page Up]
+[BIND:A_CARE_MOVE_SW:REPEAT_FAST]
+[SYM:4:1]
+[SYM:4:Numpad 1]
+[BIND:A_CARE_MOVE_SE:REPEAT_FAST]
+[SYM:4:3]
+[SYM:4:Numpad 3]
+[SYM:4:Page Down]
+[BIND:A_CARE_MOVE_UPDOWN:REPEAT_SLOW]
+[SYM:4:5]
+[SYM:4:Numpad 5]
+[BIND:A_MOVE_N_UP:REPEAT_SLOW]
+[SYM:1:8]
+[SYM:1:Numpad 8]
+[SYM:1:Up]
+[BIND:A_MOVE_S_UP:REPEAT_SLOW]
+[SYM:1:2]
+[SYM:1:Numpad 2]
+[SYM:1:Down]
+[BIND:A_MOVE_E_UP:REPEAT_SLOW]
+[SYM:1:6]
+[SYM:1:Numpad 6]
+[SYM:1:Right]
+[BIND:A_MOVE_W_UP:REPEAT_SLOW]
+[SYM:1:4]
+[SYM:1:Numpad 4]
+[SYM:1:Left]
+[BIND:A_MOVE_NW_UP:REPEAT_SLOW]
+[SYM:1:7]
+[SYM:1:Numpad 7]
+[BIND:A_MOVE_NE_UP:REPEAT_SLOW]
+[SYM:1:9]
+[SYM:1:Numpad 9]
+[SYM:1:Page Up]
+[BIND:A_MOVE_SW_UP:REPEAT_SLOW]
+[SYM:1:1]
+[SYM:1:Numpad 1]
+[BIND:A_MOVE_SE_UP:REPEAT_SLOW]
+[SYM:1:3]
+[SYM:1:Numpad 3]
+[SYM:1:Page Down]
+[BIND:A_MOVE_UP:REPEAT_SLOW]
+[SYM:1:5]
+[SYM:1:Numpad 5]
+[BIND:A_MOVE_N_DOWN:REPEAT_SLOW]
+[SYM:2:8]
+[SYM:2:Numpad 8]
+[SYM:2:Up]
+[BIND:A_MOVE_S_DOWN:REPEAT_SLOW]
+[SYM:2:2]
+[SYM:2:Numpad 2]
+[SYM:2:Down]
+[BIND:A_MOVE_E_DOWN:REPEAT_SLOW]
+[SYM:2:6]
+[SYM:2:Numpad 6]
+[SYM:2:Right]
+[BIND:A_MOVE_W_DOWN:REPEAT_SLOW]
+[SYM:2:4]
+[SYM:2:Numpad 4]
+[SYM:2:Left]
+[BIND:A_MOVE_NW_DOWN:REPEAT_SLOW]
+[SYM:2:7]
+[SYM:2:Numpad 7]
+[BIND:A_MOVE_NE_DOWN:REPEAT_SLOW]
+[SYM:2:9]
+[SYM:2:Numpad 9]
+[SYM:2:Page Up]
+[BIND:A_MOVE_SW_DOWN:REPEAT_SLOW]
+[SYM:2:1]
+[SYM:2:Numpad 1]
+[BIND:A_MOVE_SE_DOWN:REPEAT_SLOW]
+[SYM:2:3]
+[SYM:2:Numpad 3]
+[SYM:2:Page Down]
+[BIND:A_MOVE_DOWN:REPEAT_SLOW]
+[SYM:2:5]
+[SYM:2:Numpad 5]
+[BIND:A_MOVE_UP_AUX:REPEAT_SLOW]
+[KEY:<]
+[BIND:A_MOVE_DOWN_AUX:REPEAT_SLOW]
+[KEY:>]
+[BIND:A_CLEAR_ANNOUNCEMENTS:REPEAT_SLOW]
+[SYM:0:Space]
+[BIND:A_SLEEP:REPEAT_NOT]
+[KEY:Z]
+[BIND:A_SLEEP_SLEEP:REPEAT_NOT]
+[KEY:s]
+[BIND:A_SLEEP_WAIT:REPEAT_NOT]
+[KEY:w]
+[BIND:A_SLEEP_DAWN:REPEAT_NOT]
+[KEY:d]
+[BIND:A_WAIT:REPEAT_NOT]
+[KEY:.]
+[BIND:A_SHORT_WAIT:REPEAT_NOT]
+[KEY:,]
+[BIND:A_ATTACK:REPEAT_NOT]
+[KEY:A]
+[BIND:A_ATTACK_CONFIRM:REPEAT_NOT]
+[SYM:4:y]
+[BIND:QUICK_ATTACK:REPEAT_NOT]
+[KEY:u]
+[BIND:HEAVY_ATTACK:REPEAT_NOT]
+[KEY:v]
+[BIND:WILD_ATTACK:REPEAT_NOT]
+[KEY:w]
+[BIND:PRECISE_ATTACK:REPEAT_NOT]
+[KEY:x]
+[BIND:CHARGE_ATTACK:REPEAT_NOT]
+[KEY:y]
+[BIND:MULTI_ATTACK:REPEAT_NOT]
+[KEY:z]
+[BIND:A_LOOK:REPEAT_NOT]
+[KEY:l]
+[BIND:A_SEARCH:REPEAT_NOT]
+[KEY:L]
+[BIND:A_ODOR:REPEAT_NOT]
+[KEY:o]
+[BIND:A_DISPLAY_ODOR:REPEAT_NOT]
+[KEY:O]
+[BIND:A_YIELD:REPEAT_NOT]
+[KEY:y]
+[BIND:A_DISPLAY_TRACKS:REPEAT_NOT]
+[KEY:K]
+[BIND:A_FRESHEST_TRACK:REPEAT_NOT]
+[SYM:4:k]
+[BIND:A_INV_DRAW_WEAPON:REPEAT_NOT]
+[KEY:q]
+[BIND:A_JUMP:REPEAT_NOT]
+[KEY:j]
+[BIND:A_HOLD:REPEAT_NOT]
+[KEY:h]
+[BIND:A_TALK:REPEAT_NOT]
+[KEY:k]
+[BIND:A_ACTION:REPEAT_NOT]
+[KEY:x]
+[BIND:A_ACTION_CREATE:REPEAT_NOT]
+[KEY:c]
+[BIND:A_ACTION_BUTCHER:REPEAT_NOT]
+[KEY:b]
+[BIND:A_ACTION_ABILITY:REPEAT_NOT]
+[KEY:a]
+[BIND:A_ACTION_POWER:REPEAT_NOT]
+[KEY:p]
+[BIND:A_INTERACT:REPEAT_NOT]
+[KEY:I]
+[BIND:A_INV_LOOK:REPEAT_NOT]
+[KEY:i]
+[BIND:A_INV_REMOVE:REPEAT_NOT]
+[KEY:r]
+[BIND:A_INV_WEAR:REPEAT_NOT]
+[KEY:w]
+[BIND:A_INV_EATDRINK:REPEAT_NOT]
+[KEY:e]
+[BIND:A_INV_PUTIN:REPEAT_NOT]
+[KEY:p]
+[BIND:A_INV_DROP:REPEAT_NOT]
+[KEY:d]
+[BIND:A_GROUND:REPEAT_NOT]
+[KEY:g]
+[BIND:A_THROW:REPEAT_NOT]
+[KEY:t]
+[BIND:A_SHOOT:REPEAT_NOT]
+[KEY:f]
+[BIND:A_ANNOUNCEMENTS:REPEAT_NOT]
+[KEY:a]
+[BIND:A_COMBAT:REPEAT_NOT]
+[KEY:C]
+[BIND:A_MOVEMENT:REPEAT_NOT]
+[KEY:m]
+[BIND:A_MOVEMENT_SWIM:REPEAT_NOT]
+[KEY:s]
+[BIND:A_SNEAK:REPEAT_NOT]
+[KEY:s]
+[BIND:A_SPEED_SNEAK:REPEAT_NOT]
+[KEY:S]
+[BIND:A_COMPANIONS:REPEAT_NOT]
+[KEY:c]
+[BIND:A_CENTER:REPEAT_NOT]
+[KEY:v]
+[BIND:A_BUILDING:REPEAT_NOT]
+[KEY:u]
+[BIND:A_TRAVEL:REPEAT_NOT]
+[KEY:T]
+[BIND:A_TRAVEL_SLEEP:REPEAT_NOT]
+[KEY:Z]
+[BIND:A_TRAVEL_MAP:REPEAT_NOT]
+[KEY:m]
+[BIND:A_TRAVEL_HIDE_INSTRUCTIONS:REPEAT_NOT]
+[KEY:h]
+[BIND:A_DATE:REPEAT_NOT]
+[KEY:D]
+[BIND:A_WEATHER:REPEAT_NOT]
+[KEY:W]
+[BIND:A_TEMPERATURE:REPEAT_NOT]
+[KEY:P]
+[BIND:A_STANCE:REPEAT_NOT]
+[KEY:s]
+[BIND:HOTKEY_MAKE_ASH:REPEAT_NOT]
+[KEY:a]
+[BIND:HOTKEY_MAKE_CHARCOAL:REPEAT_NOT]
+[KEY:c]
+[BIND:HOTKEY_MELT_OBJECT:REPEAT_NOT]
+[KEY:o]
+[BIND:HOTKEY_GLASS_GREEN:REPEAT_NOT]
+[KEY:e]
+[BIND:HOTKEY_GLASS_CLEAR:REPEAT_NOT]
+[KEY:c]
+[BIND:HOTKEY_GLASS_CRYSTAL:REPEAT_NOT]
+[KEY:k]
+[BIND:HOTKEY_COLLECT_SAND:REPEAT_NOT]
+[KEY:s]
+[BIND:HOTKEY_COLLECT_CLAY:REPEAT_NOT]
+[KEY:c]
+[BIND:HOTKEY_GLASS_ROUGH:REPEAT_NOT]
+[KEY:g]
+[BIND:HOTKEY_GLASS_ARMORSTAND:REPEAT_NOT]
+[KEY:a]
+[BIND:HOTKEY_GLASS_BOX:REPEAT_NOT]
+[KEY:h]
+[BIND:HOTKEY_GLASS_CABINET:REPEAT_NOT]
+[KEY:f]
+[BIND:HOTKEY_GLASS_COFFIN:REPEAT_NOT]
+[KEY:o]
+[BIND:HOTKEY_GLASS_FLOODGATE:REPEAT_NOT]
+[KEY:l]
+[BIND:HOTKEY_GLASS_HATCH_COVER:REPEAT_NOT]
+[KEY:H]
+[BIND:HOTKEY_GLASS_GRATE:REPEAT_NOT]
+[KEY:G]
+[BIND:HOTKEY_GLASS_GOBLET:REPEAT_NOT]
+[SYM:4:g]
+[BIND:HOTKEY_GLASS_TOY:REPEAT_NOT]
+[KEY:z]
+[BIND:HOTKEY_GLASS_INSTRUMENT:REPEAT_NOT]
+[KEY:m]
+[BIND:HOTKEY_GLASS_DOOR:REPEAT_NOT]
+[KEY:d]
+[BIND:HOTKEY_GLASS_STATUE:REPEAT_NOT]
+[KEY:u]
+[BIND:HOTKEY_GLASS_TABLE:REPEAT_NOT]
+[KEY:t]
+[BIND:HOTKEY_GLASS_CAGE:REPEAT_NOT]
+[KEY:j]
+[BIND:HOTKEY_GLASS_CHAIR:REPEAT_NOT]
+[KEY:r]
+[BIND:HOTKEY_GLASS_BLOCKS:REPEAT_NOT]
+[KEY:b]
+[BIND:HOTKEY_GLASS_FLASK:REPEAT_NOT]
+[KEY:q]
+[BIND:HOTKEY_GLASS_WEAPONRACK:REPEAT_NOT]
+[KEY:w]
+[BIND:HOTKEY_GLASS_WINDOW:REPEAT_NOT]
+[KEY:i]
+[BIND:HOTKEY_ASHERY_LYE:REPEAT_NOT]
+[KEY:l]
+[BIND:HOTKEY_ASHERY_POTASH:REPEAT_NOT]
+[KEY:p]
+[BIND:HOTKEY_ASHERY_POTASH_DIRECT:REPEAT_NOT]
+[KEY:a]
+[BIND:HOTKEY_CARPENTER_BARREL:REPEAT_NOT]
+[KEY:v]
+[BIND:HOTKEY_CARPENTER_BLOCKS:REPEAT_NOT]
+[KEY:o]
+[BIND:HOTKEY_CARPENTER_BUCKET:REPEAT_NOT]
+[KEY:e]
+[BIND:HOTKEY_CARPENTER_TRAP_ANIMAL:REPEAT_NOT]
+[KEY:p]
+[BIND:HOTKEY_CARPENTER_CAGE:REPEAT_NOT]
+[KEY:j]
+[BIND:HOTKEY_CARPENTER_ARMORSTAND:REPEAT_NOT]
+[KEY:a]
+[BIND:HOTKEY_CARPENTER_BED:REPEAT_NOT]
+[KEY:b]
+[BIND:HOTKEY_CARPENTER_CHAIR:REPEAT_NOT]
+[KEY:c]
+[BIND:HOTKEY_CARPENTER_COFFIN:REPEAT_NOT]
+[KEY:k]
+[BIND:HOTKEY_CARPENTER_DOOR:REPEAT_NOT]
+[KEY:d]
+[BIND:HOTKEY_CARPENTER_FLOODGATE:REPEAT_NOT]
+[KEY:l]
+[BIND:HOTKEY_CARPENTER_HATCH_COVER:REPEAT_NOT]
+[KEY:H]
+[BIND:HOTKEY_CARPENTER_GRATE:REPEAT_NOT]
+[KEY:G]
+[BIND:HOTKEY_CARPENTER_CABINET:REPEAT_NOT]
+[KEY:f]
+[BIND:HOTKEY_CARPENTER_BIN:REPEAT_NOT]
+[KEY:n]
+[BIND:HOTKEY_CARPENTER_BOX:REPEAT_NOT]
+[KEY:h]
+[BIND:HOTKEY_CARPENTER_WEAPONRACK:REPEAT_NOT]
+[KEY:w]
+[BIND:HOTKEY_CARPENTER_TABLE:REPEAT_NOT]
+[KEY:t]
+[BIND:HOTKEY_SIEGE_BALLISTA:REPEAT_NOT]
+[KEY:b]
+[BIND:HOTKEY_SIEGE_CATAPULT:REPEAT_NOT]
+[KEY:c]
+[BIND:HOTKEY_LEATHER_BOX:REPEAT_NOT]
+[KEY:n]
+[BIND:HOTKEY_LEATHER_FLASK:REPEAT_NOT]
+[KEY:q]
+[BIND:HOTKEY_LEATHER_SHIRT:REPEAT_NOT]
+[KEY:t]
+[BIND:HOTKEY_LEATHER_CLOAK:REPEAT_NOT]
+[KEY:k]
+[BIND:HOTKEY_LEATHER_BACKPACK:REPEAT_NOT]
+[KEY:r]
+[BIND:HOTKEY_LEATHER_QUIVER:REPEAT_NOT]
+[KEY:v]
+[BIND:HOTKEY_LEATHER_IMAGE:REPEAT_NOT]
+[KEY:i]
+[BIND:HOTKEY_CLOTHES_MAT_PLANT:REPEAT_NOT]
+[KEY:w]
+[BIND:HOTKEY_CLOTHES_MAT_SILK:REPEAT_NOT]
+[KEY:s]
+[BIND:HOTKEY_CLOTHES_MAT_YARN:REPEAT_NOT]
+[KEY:y]
+[BIND:HOTKEY_CLOTHES_SHIRT:REPEAT_NOT]
+[KEY:t]
+[BIND:HOTKEY_CLOTHES_CLOAK:REPEAT_NOT]
+[KEY:k]
+[BIND:HOTKEY_CLOTHES_BOX:REPEAT_NOT]
+[KEY:b]
+[BIND:HOTKEY_CLOTHES_CHAIN:REPEAT_NOT]
+[KEY:n]
+[BIND:HOTKEY_CLOTHES_IMAGE:REPEAT_NOT]
+[KEY:i]
+[BIND:HOTKEY_CRAFTS_MAT_STONE:REPEAT_NOT]
+[KEY:g]
+[BIND:HOTKEY_CRAFTS_MAT_WOOD:REPEAT_NOT]
+[KEY:w]
+[BIND:HOTKEY_CRAFTS_DEC_BONE:REPEAT_NOT]
+[KEY:B]
+[BIND:HOTKEY_CRAFTS_DEC_SHELL:REPEAT_NOT]
+[KEY:S]
+[BIND:HOTKEY_CRAFTS_DEC_TOOTH:REPEAT_NOT]
+[KEY:I]
+[BIND:HOTKEY_CRAFTS_DEC_HORN:REPEAT_NOT]
+[KEY:N]
+[BIND:HOTKEY_CRAFTS_DEC_PEARL:REPEAT_NOT]
+[KEY:P]
+[BIND:HOTKEY_CRAFTS_TOTEM:REPEAT_NOT]
+[KEY:t]
+[BIND:HOTKEY_CRAFTS_CLOTH:REPEAT_NOT]
+[KEY:h]
+[BIND:HOTKEY_CRAFTS_SILK:REPEAT_NOT]
+[KEY:k]
+[BIND:HOTKEY_CRAFTS_YARN:REPEAT_NOT]
+[KEY:y]
+[BIND:HOTKEY_CRAFTS_SEL_WOOD:REPEAT_NOT]
+[KEY:w]
+[BIND:HOTKEY_CRAFTS_SEL_BONE:REPEAT_NOT]
+[KEY:b]
+[BIND:HOTKEY_CRAFTS_SEL_SHELL:REPEAT_NOT]
+[KEY:s]
+[BIND:HOTKEY_CRAFTS_SHELL:REPEAT_NOT]
+[KEY:s]
+[BIND:HOTKEY_CRAFTS_TOOTH:REPEAT_NOT]
+[KEY:i]
+[BIND:HOTKEY_CRAFTS_HORN:REPEAT_NOT]
+[KEY:n]
+[BIND:HOTKEY_CRAFTS_PEARL:REPEAT_NOT]
+[KEY:p]
+[BIND:HOTKEY_CRAFTS_BONE:REPEAT_NOT]
+[KEY:b]
+[BIND:HOTKEY_CRAFTS_LEATHER:REPEAT_NOT]
+[KEY:l]
+[BIND:HOTKEY_CRAFTS_SLAB:REPEAT_NOT]
+[SYM:4:s]
+[BIND:HOTKEY_CRAFTS_MAT_CRAFTS:REPEAT_NOT]
+[KEY:c]
+[BIND:HOTKEY_CRAFTS_MAT_GOBLET:REPEAT_NOT]
+[SYM:4:g]
+[BIND:HOTKEY_CRAFTS_MAT_INSTRUMENT:REPEAT_NOT]
+[KEY:m]
+[BIND:HOTKEY_CRAFTS_MAT_TOY:REPEAT_NOT]
+[KEY:z]
+[BIND:HOTKEY_SMITH_WEAPON:REPEAT_NOT]
+[KEY:w]
+[BIND:HOTKEY_SMITH_ARMOR:REPEAT_NOT]
+[KEY:a]
+[BIND:HOTKEY_SMITH_FURNITURE:REPEAT_NOT]
+[KEY:f]
+[BIND:HOTKEY_SMITH_SIEGE:REPEAT_NOT]
+[KEY:p]
+[BIND:HOTKEY_SMITH_TRAP:REPEAT_NOT]
+[KEY:t]
+[BIND:HOTKEY_SMITH_OTHER:REPEAT_NOT]
+[KEY:o]
+[BIND:HOTKEY_SMITH_METAL:REPEAT_NOT]
+[KEY:n]
+[BIND:HOTKEY_BUILDING_ARMORSTAND:REPEAT_NOT]
+[KEY:a]
+[BIND:HOTKEY_BUILDING_BED:REPEAT_NOT]
+[KEY:b]
+[BIND:HOTKEY_BUILDING_CHAIR:REPEAT_NOT]
+[KEY:c]
+[BIND:HOTKEY_BUILDING_COFFIN:REPEAT_NOT]
+[KEY:n]
+[BIND:HOTKEY_BUILDING_DOOR:REPEAT_NOT]
+[KEY:d]
+[BIND:HOTKEY_BUILDING_FLOODGATE:REPEAT_NOT]
+[KEY:x]
+[BIND:HOTKEY_BUILDING_CABINET:REPEAT_NOT]
+[KEY:f]
+[BIND:HOTKEY_BUILDING_BOX:REPEAT_NOT]
+[KEY:h]
+[BIND:HOTKEY_BUILDING_KENNEL:REPEAT_NOT]
+[KEY:k]
+[BIND:HOTKEY_BUILDING_FARMPLOT:REPEAT_NOT]
+[KEY:p]
+[BIND:HOTKEY_BUILDING_WEAPONRACK:REPEAT_NOT]
+[KEY:r]
+[BIND:HOTKEY_BUILDING_STATUE:REPEAT_NOT]
+[KEY:s]
+[BIND:HOTKEY_BUILDING_TABLE:REPEAT_NOT]
+[KEY:t]
+[BIND:HOTKEY_BUILDING_ROAD_PAVED:REPEAT_NOT]
+[KEY:o]
+[BIND:HOTKEY_BUILDING_ROAD_DIRT:REPEAT_NOT]
+[KEY:O]
+[BIND:HOTKEY_BUILDING_BRIDGE:REPEAT_NOT]
+[KEY:g]
+[BIND:HOTKEY_BUILDING_WELL:REPEAT_NOT]
+[KEY:l]
+[BIND:HOTKEY_BUILDING_SIEGEENGINE:REPEAT_NOT]
+[KEY:i]
+[BIND:HOTKEY_BUILDING_WORKSHOP:REPEAT_NOT]
+[KEY:w]
+[BIND:HOTKEY_BUILDING_FURNACE:REPEAT_NOT]
+[KEY:e]
+[BIND:HOTKEY_BUILDING_WINDOW_GLASS:REPEAT_NOT]
+[KEY:y]
+[BIND:HOTKEY_BUILDING_WINDOW_GEM:REPEAT_NOT]
+[KEY:Y]
+[BIND:HOTKEY_BUILDING_CONSTRUCTION:REPEAT_NOT]
+[KEY:C]
+[BIND:HOTKEY_BUILDING_SHOP:REPEAT_NOT]
+[KEY:z]
+[BIND:HOTKEY_BUILDING_ANIMALTRAP:REPEAT_NOT]
+[KEY:m]
+[BIND:HOTKEY_BUILDING_CHAIN:REPEAT_NOT]
+[KEY:v]
+[BIND:HOTKEY_BUILDING_CAGE:REPEAT_NOT]
+[KEY:j]
+[BIND:HOTKEY_BUILDING_TRADEDEPOT:REPEAT_NOT]
+[KEY:D]
+[BIND:HOTKEY_BUILDING_TRAP:REPEAT_NOT]
+[KEY:T]
+[BIND:HOTKEY_BUILDING_MACHINE:REPEAT_NOT]
+[KEY:M]
+[BIND:HOTKEY_BUILDING_SUPPORT:REPEAT_NOT]
+[KEY:S]
+[BIND:HOTKEY_BUILDING_ARCHERYTARGET:REPEAT_NOT]
+[KEY:A]
+[BIND:HOTKEY_BUILDING_TRACTION_BENCH:REPEAT_NOT]
+[KEY:R]
+[BIND:HOTKEY_BUILDING_HATCH:REPEAT_NOT]
+[KEY:H]
+[BIND:HOTKEY_BUILDING_SLAB:REPEAT_NOT]
+[SYM:4:s]
+[BIND:HOTKEY_BUILDING_NEST_BOX:REPEAT_NOT]
+[KEY:N]
+[BIND:HOTKEY_BUILDING_HIVE:REPEAT_NOT]
+[SYM:4:h]
+[BIND:HOTKEY_BUILDING_GRATE_WALL:REPEAT_NOT]
+[KEY:W]
+[BIND:HOTKEY_BUILDING_GRATE_FLOOR:REPEAT_NOT]
+[KEY:G]
+[BIND:HOTKEY_BUILDING_BARS_VERTICAL:REPEAT_NOT]
+[KEY:B]
+[BIND:HOTKEY_BUILDING_BARS_FLOOR:REPEAT_NOT]
+[SYM:4:b]
+[BIND:HOTKEY_BUILDING_MACHINE_SCREW_PUMP:REPEAT_NOT]
+[KEY:s]
+[BIND:HOTKEY_BUILDING_MACHINE_WATER_WHEEL:REPEAT_NOT]
+[KEY:w]
+[BIND:HOTKEY_BUILDING_MACHINE_WINDMILL:REPEAT_NOT]
+[KEY:m]
+[BIND:HOTKEY_BUILDING_MACHINE_GEAR_ASSEMBLY:REPEAT_NOT]
+[KEY:g]
+[BIND:HOTKEY_BUILDING_MACHINE_AXLE_HORIZONTAL:REPEAT_NOT]
+[KEY:h]
+[BIND:HOTKEY_BUILDING_MACHINE_AXLE_VERTICAL:REPEAT_NOT]
+[KEY:v]
+[BIND:HOTKEY_BUILDING_MACHINE_ROLLERS:REPEAT_NOT]
+[KEY:r]
+[BIND:HOTKEY_BUILDING_SIEGEENGINE_BALLISTA:REPEAT_NOT]
+[KEY:b]
+[BIND:HOTKEY_BUILDING_SIEGEENGINE_CATAPULT:REPEAT_NOT]
+[KEY:c]
+[BIND:HOTKEY_BUILDING_TRAP_STONE:REPEAT_NOT]
+[KEY:s]
+[BIND:HOTKEY_BUILDING_TRAP_WEAPON:REPEAT_NOT]
+[KEY:w]
+[BIND:HOTKEY_BUILDING_TRAP_LEVER:REPEAT_NOT]
+[KEY:l]
+[BIND:HOTKEY_BUILDING_TRAP_TRIGGER:REPEAT_NOT]
+[KEY:p]
+[BIND:HOTKEY_BUILDING_TRAP_CAGE:REPEAT_NOT]
+[KEY:c]
+[BIND:HOTKEY_BUILDING_TRAP_SPIKE:REPEAT_NOT]
+[KEY:S]
+[BIND:HOTKEY_BUILDING_WORKSHOP_LEATHER:REPEAT_NOT]
+[KEY:e]
+[BIND:HOTKEY_BUILDING_WORKSHOP_QUERN:REPEAT_NOT]
+[KEY:q]
+[BIND:HOTKEY_BUILDING_WORKSHOP_MILLSTONE:REPEAT_NOT]
+[KEY:M]
+[BIND:HOTKEY_BUILDING_WORKSHOP_LOOM:REPEAT_NOT]
+[KEY:o]
+[BIND:HOTKEY_BUILDING_WORKSHOP_CLOTHES:REPEAT_NOT]
+[KEY:k]
+[BIND:HOTKEY_BUILDING_WORKSHOP_BOWYER:REPEAT_NOT]
+[KEY:b]
+[BIND:HOTKEY_BUILDING_WORKSHOP_CARPENTER:REPEAT_NOT]
+[KEY:c]
+[BIND:HOTKEY_BUILDING_WORKSHOP_METALSMITH:REPEAT_NOT]
+[KEY:f]
+[BIND:HOTKEY_BUILDING_WORKSHOP_LAVAMILL:REPEAT_NOT]
+[KEY:v]
+[BIND:HOTKEY_BUILDING_WORKSHOP_JEWELER:REPEAT_NOT]
+[KEY:j]
+[BIND:HOTKEY_BUILDING_WORKSHOP_MASON:REPEAT_NOT]
+[KEY:m]
+[BIND:HOTKEY_BUILDING_WORKSHOP_BUTCHER:REPEAT_NOT]
+[KEY:u]
+[BIND:HOTKEY_BUILDING_WORKSHOP_TANNER:REPEAT_NOT]
+[KEY:n]
+[BIND:HOTKEY_BUILDING_WORKSHOP_CRAFTSMAN:REPEAT_NOT]
+[KEY:r]
+[BIND:HOTKEY_BUILDING_WORKSHOP_SIEGE:REPEAT_NOT]
+[KEY:s]
+[BIND:HOTKEY_BUILDING_WORKSHOP_MECHANIC:REPEAT_NOT]
+[KEY:t]
+[BIND:HOTKEY_BUILDING_WORKSHOP_STILL:REPEAT_NOT]
+[KEY:l]
+[BIND:HOTKEY_BUILDING_WORKSHOP_FARMER:REPEAT_NOT]
+[KEY:w]
+[BIND:HOTKEY_BUILDING_WORKSHOP_KITCHEN:REPEAT_NOT]
+[KEY:z]
+[BIND:HOTKEY_BUILDING_WORKSHOP_FISHERY:REPEAT_NOT]
+[KEY:h]
+[BIND:HOTKEY_BUILDING_WORKSHOP_ASHERY:REPEAT_NOT]
+[KEY:y]
+[BIND:HOTKEY_BUILDING_WORKSHOP_DYER:REPEAT_NOT]
+[KEY:d]
+[BIND:HOTKEY_BUILDING_FURNACE_WOOD:REPEAT_NOT]
+[KEY:w]
+[BIND:HOTKEY_BUILDING_FURNACE_SMELTER:REPEAT_NOT]
+[KEY:s]
+[BIND:HOTKEY_BUILDING_FURNACE_GLASS:REPEAT_NOT]
+[KEY:g]
+[BIND:HOTKEY_BUILDING_FURNACE_KILN:REPEAT_NOT]
+[KEY:k]
+[BIND:HOTKEY_BUILDING_FURNACE_SMELTER_LAVA:REPEAT_NOT]
+[KEY:l]
+[BIND:HOTKEY_BUILDING_FURNACE_GLASS_LAVA:REPEAT_NOT]
+[KEY:a]
+[BIND:HOTKEY_BUILDING_FURNACE_KILN_LAVA:REPEAT_NOT]
+[KEY:n]
+[BIND:HIVE_INSTALL_COLONY:REPEAT_NOT]
+[KEY:c]
+[BIND:HIVE_GATHER_PRODUCTS:REPEAT_NOT]
+[KEY:g]
+[BIND:HOTKEY_BUILDING_CONSTRUCTION_WALL:REPEAT_NOT]
+[KEY:w]
+[BIND:HOTKEY_BUILDING_CONSTRUCTION_FLOOR:REPEAT_NOT]
+[KEY:f]
+[BIND:HOTKEY_BUILDING_CONSTRUCTION_RAMP:REPEAT_NOT]
+[KEY:r]
+[BIND:HOTKEY_BUILDING_CONSTRUCTION_STAIR_UP:REPEAT_NOT]
+[KEY:u]
+[BIND:HOTKEY_BUILDING_CONSTRUCTION_STAIR_DOWN:REPEAT_NOT]
+[KEY:d]
+[BIND:HOTKEY_BUILDING_CONSTRUCTION_STAIR_UPDOWN:REPEAT_NOT]
+[KEY:x]
+[BIND:HOTKEY_BUILDING_CONSTRUCTION_FORTIFICATION:REPEAT_NOT]
+[KEY:F]
+[BIND:HOTKEY_BUILDING_CONSTRUCTION_TRACK:REPEAT_NOT]
+[KEY:T]
+[BIND:HOTKEY_BUILDING_CONSTRUCTION_TRACK_STOP:REPEAT_NOT]
+[KEY:S]
+[BIND:D_ONESTEP:REPEAT_NOT]
+[KEY:.]
+[BIND:D_PAUSE:REPEAT_NOT]
+[SYM:0:Space]
+[BIND:D_DEPOT:REPEAT_NOT]
+[KEY:D]
+[BIND:D_HOT_KEYS:REPEAT_NOT]
+[KEY:H]
+[BIND:D_HOTKEY1:REPEAT_NOT]
+[SYM:0:F1]
+[BIND:D_HOTKEY2:REPEAT_NOT]
+[SYM:0:F2]
+[BIND:D_HOTKEY3:REPEAT_NOT]
+[SYM:0:F3]
+[BIND:D_HOTKEY4:REPEAT_NOT]
+[SYM:0:F4]
+[BIND:D_HOTKEY5:REPEAT_NOT]
+[SYM:0:F5]
+[BIND:D_HOTKEY6:REPEAT_NOT]
+[SYM:0:F6]
+[BIND:D_HOTKEY7:REPEAT_NOT]
+[SYM:0:F7]
+[BIND:D_HOTKEY8:REPEAT_NOT]
+[SYM:0:F8]
+[BIND:D_HOTKEY9:REPEAT_NOT]
+[SYM:1:F1]
+[BIND:D_HOTKEY10:REPEAT_NOT]
+[SYM:1:F2]
+[BIND:D_HOTKEY11:REPEAT_NOT]
+[SYM:1:F3]
+[BIND:D_HOTKEY12:REPEAT_NOT]
+[SYM:1:F4]
+[BIND:D_HOTKEY13:REPEAT_NOT]
+[SYM:1:F5]
+[BIND:D_HOTKEY14:REPEAT_NOT]
+[SYM:1:F6]
+[BIND:D_HOTKEY15:REPEAT_NOT]
+[SYM:1:F7]
+[BIND:D_HOTKEY16:REPEAT_NOT]
+[SYM:1:F8]
+[BIND:D_HOTKEY_CHANGE_NAME:REPEAT_NOT]
+[KEY:n]
+[BIND:D_HOTKEY_ZOOM:REPEAT_NOT]
+[KEY:z]
+[BIND:D_ANNOUNCE:REPEAT_NOT]
+[KEY:a]
+[BIND:D_REPORTS:REPEAT_NOT]
+[KEY:r]
+[BIND:D_BUILDING:REPEAT_NOT]
+[KEY:b]
+[BIND:D_CIVLIST:REPEAT_NOT]
+[KEY:c]
+[BIND:D_DESIGNATE:REPEAT_NOT]
+[KEY:d]
+[BIND:D_ARTLIST:REPEAT_NOT]
+[KEY:l]
+[BIND:D_NOBLES:REPEAT_NOT]
+[KEY:n]
+[BIND:D_ORDERS:REPEAT_NOT]
+[KEY:o]
+[BIND:D_MILITARY:REPEAT_NOT]
+[KEY:m]
+[BIND:D_MILITARY_CREATE_SQUAD:REPEAT_NOT]
+[KEY:c]
+[BIND:D_MILITARY_DISBAND_SQUAD:REPEAT_NOT]
+[KEY:d]
+[BIND:D_MILITARY_CREATE_SUB_SQUAD:REPEAT_NOT]
+[KEY:l]
+[BIND:D_MILITARY_CANCEL_ORDERS:REPEAT_NOT]
+[KEY:c]
+[BIND:D_MILITARY_POSITIONS:REPEAT_NOT]
+[KEY:p]
+[BIND:D_MILITARY_ALERTS:REPEAT_NOT]
+[KEY:a]
+[BIND:D_MILITARY_ALERTS_ADD:REPEAT_NOT]
+[KEY:c]
+[BIND:D_MILITARY_ALERTS_DELETE:REPEAT_NOT]
+[KEY:d]
+[BIND:D_MILITARY_ALERTS_SET:REPEAT_NOT]
+[SYM:0:Enter]
+[SYM:0:Numpad Enter]
+[BIND:D_MILITARY_ALERTS_NAME:REPEAT_NOT]
+[KEY:N]
+[BIND:D_MILITARY_ALERTS_SET_RETAIN:REPEAT_NOT]
+[SYM:1:Enter]
+[SYM:1:Numpad Enter]
+[BIND:D_MILITARY_EQUIP:REPEAT_NOT]
+[KEY:e]
+[BIND:D_MILITARY_EQUIP_CUSTOMIZE:REPEAT_NOT]
+[KEY:V]
+[BIND:D_MILITARY_EQUIP_UNIFORM:REPEAT_NOT]
+[KEY:U]
+[BIND:D_MILITARY_EQUIP_PRIORITY:REPEAT_NOT]
+[KEY:P]
+[BIND:D_MILITARY_UNIFORMS:REPEAT_NOT]
+[KEY:n]
+[BIND:D_MILITARY_SUPPLIES:REPEAT_NOT]
+[KEY:u]
+[BIND:D_MILITARY_SUPPLIES_WATER_DOWN:REPEAT_NOT]
+[KEY:-]
+[BIND:D_MILITARY_SUPPLIES_WATER_UP:REPEAT_NOT]
+[KEY:+]
+[BIND:D_MILITARY_SUPPLIES_FOOD_DOWN:REPEAT_NOT]
+[KEY:/]
+[BIND:D_MILITARY_SUPPLIES_FOOD_UP:REPEAT_NOT]
+[KEY:*]
+[BIND:D_MILITARY_AMMUNITION:REPEAT_NOT]
+[KEY:f]
+[BIND:D_MILITARY_AMMUNITION_ADD_ITEM:REPEAT_NOT]
+[KEY:c]
+[BIND:D_MILITARY_AMMUNITION_REMOVE_ITEM:REPEAT_NOT]
+[KEY:d]
+[BIND:D_MILITARY_AMMUNITION_LOWER_AMOUNT:REPEAT_NOT]
+[KEY:-]
+[BIND:D_MILITARY_AMMUNITION_RAISE_AMOUNT:REPEAT_NOT]
+[KEY:+]
+[BIND:D_MILITARY_AMMUNITION_LOWER_AMOUNT_LOTS:REPEAT_NOT]
+[KEY:/]
+[BIND:D_MILITARY_AMMUNITION_RAISE_AMOUNT_LOTS:REPEAT_NOT]
+[KEY:*]
+[BIND:D_MILITARY_AMMUNITION_MATERIAL:REPEAT_NOT]
+[KEY:M]
+[BIND:D_MILITARY_AMMUNITION_COMBAT:REPEAT_NOT]
+[KEY:C]
+[BIND:D_MILITARY_AMMUNITION_TRAINING:REPEAT_NOT]
+[KEY:T]
+[BIND:D_MILITARY_TRAINING:REPEAT_NOT]
+[KEY:t]
+[BIND:D_MILITARY_SCHEDULE:REPEAT_NOT]
+[KEY:s]
+[BIND:D_MILITARY_ADD_UNIFORM:REPEAT_NOT]
+[KEY:c]
+[BIND:D_MILITARY_DELETE_UNIFORM:REPEAT_NOT]
+[KEY:d]
+[BIND:D_MILITARY_NAME_UNIFORM:REPEAT_NOT]
+[KEY:N]
+[BIND:D_MILITARY_NAME_SQUAD:REPEAT_NOT]
+[KEY:N]
+[BIND:D_MILITARY_ADD_ARMOR:REPEAT_NOT]
+[KEY:A]
+[BIND:D_MILITARY_ADD_PANTS:REPEAT_NOT]
+[KEY:L]
+[BIND:D_MILITARY_ADD_HELM:REPEAT_NOT]
+[KEY:H]
+[BIND:D_MILITARY_ADD_GLOVES:REPEAT_NOT]
+[KEY:G]
+[BIND:D_MILITARY_ADD_BOOTS:REPEAT_NOT]
+[KEY:B]
+[BIND:D_MILITARY_ADD_SHIELD:REPEAT_NOT]
+[KEY:S]
+[BIND:D_MILITARY_ADD_WEAPON:REPEAT_NOT]
+[KEY:W]
+[BIND:D_MILITARY_ADD_MATERIAL:REPEAT_NOT]
+[KEY:M]
+[BIND:D_MILITARY_ADD_COLOR:REPEAT_NOT]
+[KEY:C]
+[BIND:D_MILITARY_REPLACE_CLOTHING:REPEAT_NOT]
+[KEY:r]
+[BIND:D_MILITARY_EXACT_MATCH:REPEAT_NOT]
+[KEY:m]
+[BIND:D_ROOMS:REPEAT_NOT]
+[KEY:R]
+[BIND:D_SQUADS:REPEAT_NOT]
+[KEY:s]
+[BIND:D_SQUADS_MOVE:REPEAT_NOT]
+[KEY:m]
+[BIND:D_SQUADS_KILL:REPEAT_NOT]
+[KEY:k]
+[BIND:D_SQUADS_KILL_LIST:REPEAT_NOT]
+[KEY:l]
+[BIND:D_SQUADS_KILL_RECT:REPEAT_NOT]
+[KEY:r]
+[BIND:D_SQUADS_SCHEDULE:REPEAT_NOT]
+[KEY:s]
+[BIND:D_SQUADS_CANCEL_ORDER:REPEAT_NOT]
+[KEY:o]
+[BIND:D_SQUADS_ALERT:REPEAT_NOT]
+[KEY:t]
+[BIND:D_SQUADS_SELECT_INDIVIDUALS:REPEAT_NOT]
+[KEY:p]
+[BIND:D_SQUADS_CENTER:REPEAT_NOT]
+[KEY:z]
+[BIND:D_SQUAD_SCH_SLEEP:REPEAT_NOT]
+[KEY:s]
+[BIND:D_SQUAD_SCH_CIVILIAN_UNIFORM:REPEAT_NOT]
+[KEY:u]
+[BIND:D_SQUAD_SCH_GIVE_ORDER:REPEAT_NOT]
+[KEY:o]
+[BIND:D_SQUAD_SCH_EDIT_ORDER:REPEAT_NOT]
+[KEY:e]
+[BIND:D_SQUAD_SCH_CANCEL_ORDER:REPEAT_NOT]
+[KEY:x]
+[BIND:D_SQUAD_SCH_COPY_ORDERS:REPEAT_NOT]
+[KEY:c]
+[BIND:D_SQUAD_SCH_PASTE_ORDERS:REPEAT_NOT]
+[KEY:p]
+[BIND:D_SQUAD_SCH_MS_NAME:REPEAT_NOT]
+[KEY:n]
+[BIND:D_STOCKPILES:REPEAT_NOT]
+[KEY:p]
+[BIND:D_CIVZONE:REPEAT_NOT]
+[KEY:i]
+[BIND:D_VIEWUNIT:REPEAT_NOT]
+[KEY:v]
+[BIND:D_JOBLIST:REPEAT_NOT]
+[KEY:j]
+[BIND:D_UNITLIST:REPEAT_NOT]
+[KEY:u]
+[BIND:D_LOOK:REPEAT_NOT]
+[KEY:k]
+[BIND:D_HAULING:REPEAT_NOT]
+[KEY:h]
+[BIND:D_HAULING_NEW_ROUTE:REPEAT_NOT]
+[KEY:r]
+[BIND:D_HAULING_NEW_STOP:REPEAT_NOT]
+[KEY:s]
+[BIND:D_HAULING_REMOVE:REPEAT_NOT]
+[KEY:x]
+[BIND:D_HAULING_PROMOTE:REPEAT_NOT]
+[KEY:p]
+[BIND:D_HAULING_VEHICLE:REPEAT_NOT]
+[KEY:v]
+[BIND:D_HAULING_NICKNAME:REPEAT_NOT]
+[KEY:n]
+[BIND:D_HAULING_STOP_NEW_DEPART:REPEAT_NOT]
+[KEY:n]
+[BIND:D_HAULING_STOP_NEW_LINK:REPEAT_NOT]
+[KEY:s]
+[BIND:D_HAULING_STOP_REMOVE:REPEAT_NOT]
+[KEY:x]
+[BIND:D_HAULING_STOP_SL_SELECT_PILE:REPEAT_NOT]
+[KEY:p]
+[BIND:D_HAULING_STOP_SL_TAKE_GIVE:REPEAT_NOT]
+[KEY:t]
+[BIND:D_HAULING_STOP_LC_DIR:REPEAT_NOT]
+[KEY:d]
+[BIND:D_HAULING_STOP_LC_MODE:REPEAT_NOT]
+[KEY:p]
+[BIND:D_HAULING_STOP_LC_TIMER_UP:REPEAT_NOT]
+[KEY:T]
+[BIND:D_HAULING_STOP_LC_TIMER_DOWN:REPEAT_NOT]
+[KEY:t]
+[BIND:D_HAULING_STOP_LC_FULLNESS_UP:REPEAT_NOT]
+[KEY:F]
+[BIND:D_HAULING_STOP_LC_FULLNESS_DOWN:REPEAT_NOT]
+[KEY:f]
+[BIND:D_HAULING_STOP_LC_MORE_LESS:REPEAT_NOT]
+[KEY:m]
+[BIND:D_HAULING_STOP_LC_DESIRED_TOTAL:REPEAT_NOT]
+[KEY:l]
+[BIND:D_HAULING_STOP_LC_CHANGE:REPEAT_NOT]
+[KEY:c]
+[BIND:D_HAULING_STOP_LC_ADVANCED:REPEAT_NOT]
+[KEY:C]
+[BIND:D_BURROWS:REPEAT_NOT]
+[KEY:w]
+[BIND:D_BURROWS_ADD:REPEAT_NOT]
+[KEY:a]
+[BIND:D_BURROWS_DELETE:REPEAT_NOT]
+[KEY:d]
+[BIND:D_BURROWS_DEFINE:REPEAT_NOT]
+[SYM:0:Enter]
+[SYM:0:Numpad Enter]
+[BIND:D_BURROWS_ADD_UNIT:REPEAT_NOT]
+[KEY:c]
+[BIND:D_BURROWS_WORKSHOP_LIMIT:REPEAT_NOT]
+[KEY:w]
+[BIND:D_BURROWS_CENTER:REPEAT_NOT]
+[KEY:z]
+[BIND:D_BURROWS_NAME:REPEAT_NOT]
+[KEY:n]
+[BIND:D_BURROWS_CHANGE_SELECTION:REPEAT_NOT]
+[KEY:c]
+[BIND:D_BURROWS_BRUSH:REPEAT_NOT]
+[KEY:b]
+[BIND:D_BURROWS_REMOVE:REPEAT_NOT]
+[KEY:r]
+[BIND:D_NOTE:REPEAT_NOT]
+[KEY:N]
+[BIND:D_NOTE_PLACE:REPEAT_NOT]
+[KEY:p]
+[BIND:D_NOTE_DELETE:REPEAT_NOT]
+[KEY:d]
+[BIND:D_NOTE_NAME:REPEAT_NOT]
+[KEY:n]
+[BIND:D_NOTE_ENTER:REPEAT_NOT]
+[KEY:t]
+[BIND:D_NOTE_ADOPT_SYMBOL:REPEAT_NOT]
+[KEY:s]
+[BIND:D_NOTE_CHANGE_SELECTION:REPEAT_NOT]
+[KEY:c]
+[BIND:D_NOTE_POINTS:REPEAT_NOT]
+[KEY:p]
+[BIND:D_NOTE_ROUTE:REPEAT_NOT]
+[KEY:r]
+[BIND:D_NOTE_ROUTE_ADD:REPEAT_NOT]
+[KEY:a]
+[BIND:D_NOTE_ROUTE_EDIT:REPEAT_NOT]
+[KEY:e]
+[BIND:D_NOTE_ROUTE_DELETE:REPEAT_NOT]
+[KEY:d]
+[BIND:D_NOTE_ROUTE_CENTER:REPEAT_NOT]
+[KEY:c]
+[BIND:D_NOTE_ROUTE_NAME:REPEAT_NOT]
+[KEY:n]
+[BIND:D_BUILDJOB:REPEAT_NOT]
+[KEY:q]
+[BIND:D_STATUS:REPEAT_NOT]
+[KEY:z]
+[BIND:D_STATUS_OVERALL_HEALTH_RECENTER:REPEAT_NOT]
+[KEY:r]
+[BIND:D_BUILDITEM:REPEAT_NOT]
+[KEY:t]
+[BIND:A_ENTER_NAME:REPEAT_NOT]
+[KEY:e]
+[BIND:A_CUST_NAME:REPEAT_NOT]
+[KEY:c]
+[BIND:A_RANDOM_NAME:REPEAT_NOT]
+[KEY:r]
+[BIND:A_CHANGE_GENDER:REPEAT_NOT]
+[KEY:g]
+[BIND:A_END_TRAVEL:REPEAT_NOT]
+[KEY:d]
+[BIND:A_TRAVEL_CLOUDS:REPEAT_NOT]
+[KEY:c]
+[BIND:A_LOG:REPEAT_NOT]
+[KEY:Q]
+[BIND:A_TRAVEL_LOG:REPEAT_NOT]
+[KEY:Q]
+[BIND:A_LOG_TASKS:REPEAT_NOT]
+[KEY:t]
+[BIND:A_LOG_ENTITIES:REPEAT_NOT]
+[KEY:g]
+[BIND:A_LOG_SITES:REPEAT_NOT]
+[KEY:s]
+[BIND:A_LOG_SUBREGIONS:REPEAT_NOT]
+[KEY:r]
+[BIND:A_LOG_FEATURE_LAYERS:REPEAT_NOT]
+[KEY:u]
+[BIND:A_LOG_PEOPLE:REPEAT_NOT]
+[KEY:p]
+[BIND:A_LOG_AGREEMENTS:REPEAT_NOT]
+[KEY:a]
+[BIND:A_LOG_EVENTS:REPEAT_NOT]
+[KEY:e]
+[BIND:A_LOG_BESTIARY:REPEAT_NOT]
+[KEY:b]
+[BIND:A_LOG_FILTER:REPEAT_NOT]
+[KEY:f]
+[BIND:A_LOG_ZOOM_CURRENT_LOCATION:REPEAT_NOT]
+[KEY:c]
+[BIND:A_LOG_ZOOM_SELECTED:REPEAT_NOT]
+[KEY:z]
+[BIND:A_LOG_LINE:REPEAT_NOT]
+[KEY:l]
+[BIND:A_LOG_MAP:REPEAT_NOT]
+[KEY:m]
+[BIND:ORDERS_AUTOFORBID:REPEAT_NOT]
+[KEY:F]
+[BIND:ORDERS_FORBID_PROJECTILE:REPEAT_NOT]
+[KEY:p]
+[BIND:ORDERS_FORBID_YOUR_CORPSE:REPEAT_NOT]
+[KEY:c]
+[BIND:ORDERS_FORBID_YOUR_ITEMS:REPEAT_NOT]
+[KEY:i]
+[BIND:ORDERS_FORBID_OTHER_CORPSE:REPEAT_NOT]
+[KEY:o]
+[BIND:ORDERS_FORBID_OTHER_ITEMS:REPEAT_NOT]
+[KEY:t]
+[BIND:ORDERS_REFUSE_GATHER:REPEAT_NOT]
+[KEY:r]
+[BIND:ORDERS_REFUSE_OUTSIDE:REPEAT_NOT]
+[KEY:o]
+[BIND:ORDERS_REFUSE_OUTSIDE_VERMIN:REPEAT_NOT]
+[KEY:v]
+[BIND:ORDERS_REFUSE_DUMP_CORPSE:REPEAT_NOT]
+[KEY:c]
+[BIND:ORDERS_REFUSE_DUMP_SKULL:REPEAT_NOT]
+[KEY:l]
+[BIND:ORDERS_REFUSE_DUMP_BONE:REPEAT_NOT]
+[KEY:b]
+[BIND:ORDERS_REFUSE_DUMP_SHELL:REPEAT_NOT]
+[KEY:s]
+[BIND:ORDERS_REFUSE_DUMP_SKIN:REPEAT_NOT]
+[KEY:i]
+[BIND:ORDERS_REFUSE_DUMP_OTHER:REPEAT_NOT]
+[KEY:k]
+[BIND:ORDERS_REFUSE_DUMP_STRAND_TISSUE:REPEAT_NOT]
+[KEY:h]
+[BIND:ORDERS_GATHER_FURNITURE:REPEAT_NOT]
+[KEY:u]
+[BIND:ORDERS_GATHER_ANIMALS:REPEAT_NOT]
+[KEY:a]
+[BIND:ORDERS_GATHER_FOOD:REPEAT_NOT]
+[KEY:f]
+[BIND:ORDERS_GATHER_BODIES:REPEAT_NOT]
+[KEY:g]
+[BIND:ORDERS_REFUSE:REPEAT_NOT]
+[KEY:r]
+[BIND:ORDERS_GATHER_STONE:REPEAT_NOT]
+[KEY:s]
+[BIND:ORDERS_GATHER_WOOD:REPEAT_NOT]
+[KEY:w]
+[BIND:ORDERS_ALL_HARVEST:REPEAT_NOT]
+[KEY:h]
+[BIND:ORDERS_SAMEPILE:REPEAT_NOT]
+[KEY:p]
+[BIND:ORDERS_MIXFOODS:REPEAT_NOT]
+[KEY:m]
+[BIND:ORDERS_WORKSHOP:REPEAT_NOT]
+[KEY:W]
+[BIND:ORDERS_COLLECT_WEB:REPEAT_NOT]
+[KEY:w]
+[BIND:ORDERS_SLAUGHTER:REPEAT_NOT]
+[KEY:s]
+[BIND:ORDERS_BUTCHER:REPEAT_NOT]
+[KEY:b]
+[BIND:ORDERS_TAN:REPEAT_NOT]
+[KEY:t]
+[BIND:ORDERS_LOOM:REPEAT_NOT]
+[KEY:l]
+[BIND:ORDERS_AUTO_FISHERY:REPEAT_NOT]
+[KEY:f]
+[BIND:ORDERS_AUTO_KITCHEN:REPEAT_NOT]
+[KEY:k]
+[BIND:ORDERS_AUTO_KILN:REPEAT_NOT]
+[KEY:K]
+[BIND:ORDERS_AUTO_SMELTER:REPEAT_NOT]
+[KEY:S]
+[BIND:ORDERS_AUTO_OTHER:REPEAT_NOT]
+[KEY:o]
+[BIND:ORDERS_ZONE:REPEAT_NOT]
+[KEY:z]
+[BIND:ORDERS_ZONE_DRINKING:REPEAT_NOT]
+[KEY:d]
+[BIND:ORDERS_ZONE_FISHING:REPEAT_NOT]
+[KEY:f]
+[BIND:ORDERS_DYED_CLOTH:REPEAT_NOT]
+[KEY:d]
+[BIND:ORDERS_EXCEPTIONS:REPEAT_NOT]
+[KEY:x]
+[BIND:DESTROYBUILDING:REPEAT_NOT]
+[KEY:x]
+[BIND:SUSPENDBUILDING:REPEAT_NOT]
+[KEY:s]
+[BIND:MENU_CONFIRM:REPEAT_NOT]
+[KEY:y]
+[BIND:SAVE_BINDINGS:REPEAT_NOT]
+[KEY:s]
+[BIND:LOAD_BINDINGS:REPEAT_NOT]
+[KEY:l]
+[BIND:HOTKEY_STILL_BREW:REPEAT_NOT]
+[KEY:b]
+[BIND:HOTKEY_STILL_EXTRACT:REPEAT_NOT]
+[KEY:e]
+[BIND:HOTKEY_LOOM_COLLECT_SILK:REPEAT_NOT]
+[KEY:c]
+[BIND:HOTKEY_LOOM_WEAVE_CLOTH:REPEAT_NOT]
+[KEY:w]
+[BIND:HOTKEY_LOOM_WEAVE_SILK:REPEAT_NOT]
+[KEY:s]
+[BIND:HOTKEY_LOOM_WEAVE_YARN:REPEAT_NOT]
+[KEY:y]
+[BIND:HOTKEY_LOOM_WEAVE_METAL:REPEAT_NOT]
+[KEY:a]
+[BIND:HOTKEY_KITCHEN_COOK_2:REPEAT_NOT]
+[KEY:a]
+[BIND:HOTKEY_KITCHEN_COOK_3:REPEAT_NOT]
+[KEY:b]
+[BIND:HOTKEY_KITCHEN_COOK_4:REPEAT_NOT]
+[KEY:c]
+[BIND:HOTKEY_KITCHEN_RENDER_FAT:REPEAT_NOT]
+[KEY:f]
+[BIND:HOTKEY_FARMER_PROCESS:REPEAT_NOT]
+[KEY:p]
+[BIND:HOTKEY_FARMER_PROCESS_VIAL:REPEAT_NOT]
+[KEY:v]
+[BIND:HOTKEY_FARMER_PROCESS_BARREL:REPEAT_NOT]
+[KEY:l]
+[BIND:HOTKEY_FARMER_CHEESE:REPEAT_NOT]
+[KEY:c]
+[BIND:HOTKEY_FARMER_MILK:REPEAT_NOT]
+[KEY:m]
+[BIND:HOTKEY_FARMER_SHEAR_CREATURE:REPEAT_NOT]
+[KEY:s]
+[BIND:HOTKEY_FARMER_SPIN_THREAD:REPEAT_NOT]
+[KEY:S]
+[BIND:HOTKEY_MILL_MILL:REPEAT_NOT]
+[KEY:p]
+[BIND:HOTKEY_KENNEL_CATCH_VERMIN:REPEAT_NOT]
+[KEY:a]
+[BIND:HOTKEY_KENNEL_TAME_VERMIN:REPEAT_NOT]
+[KEY:t]
+[BIND:HOTKEY_FISHERY_PROCESS:REPEAT_NOT]
+[KEY:p]
+[BIND:HOTKEY_FISHERY_EXTRACT:REPEAT_NOT]
+[KEY:e]
+[BIND:HOTKEY_FISHERY_CATCH:REPEAT_NOT]
+[KEY:f]
+[BIND:HOTKEY_BUTCHER_BUTCHER:REPEAT_NOT]
+[KEY:b]
+[BIND:HOTKEY_BUTCHER_EXTRACT:REPEAT_NOT]
+[KEY:e]
+[BIND:HOTKEY_BUTCHER_CATCH:REPEAT_NOT]
+[KEY:a]
+[BIND:HOTKEY_TANNER_TAN:REPEAT_NOT]
+[KEY:t]
+[BIND:HOTKEY_DYER_THREAD:REPEAT_NOT]
+[KEY:t]
+[BIND:HOTKEY_DYER_CLOTH:REPEAT_NOT]
+[KEY:c]
+[BIND:HOTKEY_JEWELER_FURNITURE:REPEAT_NOT]
+[KEY:f]
+[BIND:HOTKEY_JEWELER_FINISHED:REPEAT_NOT]
+[KEY:g]
+[BIND:HOTKEY_JEWELER_AMMO:REPEAT_NOT]
+[KEY:a]
+[BIND:HOTKEY_JEWELER_CUT:REPEAT_NOT]
+[KEY:c]
+[BIND:HOTKEY_JEWELER_ENCRUST:REPEAT_NOT]
+[KEY:e]
+[BIND:HOTKEY_MECHANIC_PARTS:REPEAT_NOT]
+[KEY:t]
+[BIND:HOTKEY_MECHANIC_TRACTION_BENCH:REPEAT_NOT]
+[KEY:R]
+[BIND:HOTKEY_MASON_ARMORSTAND:REPEAT_NOT]
+[KEY:a]
+[BIND:HOTKEY_MASON_BLOCKS:REPEAT_NOT]
+[KEY:b]
+[BIND:HOTKEY_MASON_CHAIR:REPEAT_NOT]
+[KEY:c]
+[BIND:HOTKEY_MASON_COFFIN:REPEAT_NOT]
+[KEY:p]
+[BIND:HOTKEY_MASON_DOOR:REPEAT_NOT]
+[KEY:d]
+[BIND:HOTKEY_MASON_FLOODGATE:REPEAT_NOT]
+[KEY:l]
+[BIND:HOTKEY_MASON_HATCH_COVER:REPEAT_NOT]
+[KEY:H]
+[BIND:HOTKEY_MASON_GRATE:REPEAT_NOT]
+[KEY:G]
+[BIND:HOTKEY_MASON_CABINET:REPEAT_NOT]
+[KEY:f]
+[BIND:HOTKEY_MASON_BOX:REPEAT_NOT]
+[KEY:h]
+[BIND:HOTKEY_MASON_STATUE:REPEAT_NOT]
+[KEY:u]
+[BIND:HOTKEY_MASON_TABLE:REPEAT_NOT]
+[KEY:t]
+[BIND:HOTKEY_MASON_WEAPONRACK:REPEAT_NOT]
+[KEY:w]
+[BIND:HOTKEY_MASON_QUERN:REPEAT_NOT]
+[KEY:q]
+[BIND:HOTKEY_MASON_MILLSTONE:REPEAT_NOT]
+[KEY:m]
+[BIND:HOTKEY_MASON_SLAB:REPEAT_NOT]
+[SYM:4:s]
+[BIND:HOTKEY_TRAP_BRIDGE:REPEAT_NOT]
+[KEY:b]
+[BIND:HOTKEY_TRAP_DOOR:REPEAT_NOT]
+[KEY:d]
+[BIND:HOTKEY_TRAP_FLOODGATE:REPEAT_NOT]
+[KEY:f]
+[BIND:HOTKEY_TRAP_HATCH:REPEAT_NOT]
+[KEY:h]
+[BIND:HOTKEY_TRAP_GRATE_WALL:REPEAT_NOT]
+[KEY:w]
+[BIND:HOTKEY_TRAP_GRATE_FLOOR:REPEAT_NOT]
+[KEY:g]
+[BIND:HOTKEY_TRAP_BARS_VERTICAL:REPEAT_NOT]
+[KEY:B]
+[BIND:HOTKEY_TRAP_BARS_FLOOR:REPEAT_NOT]
+[SYM:4:b]
+[BIND:HOTKEY_TRAP_SUPPORT:REPEAT_NOT]
+[KEY:s]
+[BIND:HOTKEY_TRAP_CHAIN:REPEAT_NOT]
+[KEY:c]
+[BIND:HOTKEY_TRAP_CAGE:REPEAT_NOT]
+[KEY:j]
+[BIND:HOTKEY_TRAP_SPIKE:REPEAT_NOT]
+[KEY:S]
+[BIND:HOTKEY_TRAP_GEAR_ASSEMBLY:REPEAT_NOT]
+[KEY:a]
+[BIND:HOTKEY_TRAP_TRACK_STOP:REPEAT_NOT]
+[KEY:T]
+[BIND:HOTKEY_TRAP_PULL_LEVER:REPEAT_NOT]
+[KEY:P]
+[BIND:BUILDJOB_ADD:REPEAT_NOT]
+[KEY:a]
+[BIND:BUILDJOB_CANCEL:REPEAT_NOT]
+[KEY:c]
+[BIND:BUILDJOB_PROMOTE:REPEAT_NOT]
+[KEY:p]
+[BIND:BUILDJOB_NOW:REPEAT_NOT]
+[KEY:n]
+[BIND:BUILDJOB_REPEAT:REPEAT_NOT]
+[KEY:r]
+[BIND:BUILDJOB_SUSPEND:REPEAT_NOT]
+[KEY:s]
+[BIND:BUILDJOB_WORKSHOP_PROFILE:REPEAT_NOT]
+[KEY:P]
+[BIND:BUILDJOB_WELL_FREE:REPEAT_NOT]
+[KEY:f]
+[BIND:BUILDJOB_WELL_SIZE:REPEAT_NOT]
+[KEY:r]
+[BIND:BUILDJOB_TARGET_FREE:REPEAT_NOT]
+[KEY:f]
+[BIND:BUILDJOB_TARGET_SIZE:REPEAT_NOT]
+[KEY:r]
+[BIND:BUILDJOB_TARGET_DOWN:REPEAT_NOT]
+[KEY:s]
+[BIND:BUILDJOB_TARGET_UP:REPEAT_NOT]
+[KEY:w]
+[BIND:BUILDJOB_TARGET_RIGHT:REPEAT_NOT]
+[KEY:d]
+[BIND:BUILDJOB_TARGET_LEFT:REPEAT_NOT]
+[KEY:a]
+[BIND:BUILDJOB_STATUE_ASSIGN:REPEAT_NOT]
+[KEY:a]
+[BIND:BUILDJOB_STATUE_FREE:REPEAT_NOT]
+[KEY:f]
+[BIND:BUILDJOB_STATUE_SIZE:REPEAT_NOT]
+[KEY:r]
+[BIND:BUILDJOB_CAGE_JUSTICE:REPEAT_NOT]
+[KEY:j]
+[BIND:BUILDJOB_CAGE_FREE:REPEAT_NOT]
+[KEY:f]
+[BIND:BUILDJOB_CAGE_SIZE:REPEAT_NOT]
+[KEY:r]
+[BIND:BUILDJOB_CAGE_ASSIGN_OCC:REPEAT_NOT]
+[KEY:a]
+[BIND:BUILDJOB_CAGE_WATER:REPEAT_NOT]
+[KEY:w]
+[BIND:BUILDJOB_CAGE_ASSIGN:REPEAT_NOT]
+[KEY:o]
+[BIND:BUILDJOB_CHAIN_ASSIGN_OCC:REPEAT_NOT]
+[KEY:a]
+[BIND:BUILDJOB_CHAIN_JUSTICE:REPEAT_NOT]
+[KEY:j]
+[BIND:BUILDJOB_CHAIN_ASSIGN:REPEAT_NOT]
+[KEY:o]
+[BIND:BUILDJOB_CHAIN_FREE:REPEAT_NOT]
+[KEY:f]
+[BIND:BUILDJOB_CHAIN_SIZE:REPEAT_NOT]
+[KEY:r]
+[BIND:BUILDJOB_SIEGE_FIRING:REPEAT_NOT]
+[KEY:f]
+[BIND:BUILDJOB_SIEGE_ORIENT:REPEAT_NOT]
+[KEY:o]
+[BIND:BUILDJOB_DOOR_INTERNAL:REPEAT_NOT]
+[KEY:s]
+[BIND:BUILDJOB_DOOR_LOCK:REPEAT_NOT]
+[KEY:l]
+[BIND:BUILDJOB_DOOR_AJAR:REPEAT_NOT]
+[KEY:o]
+[BIND:BUILDJOB_COFFIN_ASSIGN:REPEAT_NOT]
+[KEY:a]
+[BIND:BUILDJOB_COFFIN_FREE:REPEAT_NOT]
+[KEY:f]
+[BIND:BUILDJOB_COFFIN_SIZE:REPEAT_NOT]
+[KEY:r]
+[BIND:BUILDJOB_COFFIN_BURIAL:REPEAT_NOT]
+[KEY:b]
+[BIND:BUILDJOB_COFFIN_CIV:REPEAT_NOT]
+[KEY:c]
+[BIND:BUILDJOB_COFFIN_PET:REPEAT_NOT]
+[KEY:p]
+[BIND:BUILDJOB_CHAIR_ASSIGN:REPEAT_NOT]
+[KEY:a]
+[BIND:BUILDJOB_CHAIR_FREE:REPEAT_NOT]
+[KEY:f]
+[BIND:BUILDJOB_CHAIR_SIZE:REPEAT_NOT]
+[KEY:r]
+[BIND:BUILDJOB_TABLE_ASSIGN:REPEAT_NOT]
+[KEY:a]
+[BIND:BUILDJOB_TABLE_HALL:REPEAT_NOT]
+[KEY:h]
+[BIND:BUILDJOB_TABLE_FREE:REPEAT_NOT]
+[KEY:f]
+[BIND:BUILDJOB_TABLE_SIZE:REPEAT_NOT]
+[KEY:r]
+[BIND:BUILDJOB_BED_ASSIGN:REPEAT_NOT]
+[KEY:a]
+[BIND:BUILDJOB_BED_FREE:REPEAT_NOT]
+[KEY:f]
+[BIND:BUILDJOB_BED_BARRACKS:REPEAT_NOT]
+[KEY:b]
+[BIND:BUILDJOB_BED_DORMITORY:REPEAT_NOT]
+[KEY:d]
+[BIND:BUILDJOB_BED_RENT:REPEAT_NOT]
+[KEY:R]
+[BIND:BUILDJOB_BED_SIZE:REPEAT_NOT]
+[KEY:r]
+[BIND:BUILDJOB_BED_NAME:REPEAT_NOT]
+[KEY:n]
+[BIND:BUILDJOB_BED_SLEEP:REPEAT_NOT]
+[KEY:z]
+[BIND:BUILDJOB_BED_TRAIN:REPEAT_NOT]
+[KEY:t]
+[BIND:BUILDJOB_BED_INDIV_EQ:REPEAT_NOT]
+[KEY:i]
+[BIND:BUILDJOB_BED_SQUAD_EQ:REPEAT_NOT]
+[KEY:q]
+[BIND:BUILDJOB_BED_POSITION:REPEAT_NOT]
+[KEY:p]
+[BIND:BUILDJOB_DEPOT_BRING:REPEAT_NOT]
+[KEY:g]
+[BIND:BUILDJOB_DEPOT_TRADE:REPEAT_NOT]
+[KEY:t]
+[BIND:BUILDJOB_DEPOT_REQUEST_TRADER:REPEAT_NOT]
+[KEY:r]
+[BIND:BUILDJOB_DEPOT_BROKER_ONLY:REPEAT_NOT]
+[KEY:b]
+[BIND:BUILDJOB_ANIMALTRAP_BAIT_NONE:REPEAT_NOT]
+[KEY:z]
+[BIND:BUILDJOB_ANIMALTRAP_BAIT_MEAT:REPEAT_NOT]
+[KEY:m]
+[BIND:BUILDJOB_ANIMALTRAP_BAIT_FISH:REPEAT_NOT]
+[KEY:f]
+[BIND:BUILDJOB_ANIMALTRAP_BAIT_GEM:REPEAT_NOT]
+[KEY:g]
+[BIND:BUILDJOB_FARM_FALLOW:REPEAT_NOT]
+[KEY:z]
+[BIND:BUILDJOB_FARM_FERTILIZE:REPEAT_NOT]
+[KEY:f]
+[BIND:BUILDJOB_FARM_SEASFERT:REPEAT_NOT]
+[KEY:s]
+[BIND:BUILDJOB_FARM_SPRING:REPEAT_NOT]
+[KEY:a]
+[BIND:BUILDJOB_FARM_SUMMER:REPEAT_NOT]
+[KEY:b]
+[BIND:BUILDJOB_FARM_AUTUMN:REPEAT_NOT]
+[KEY:c]
+[BIND:BUILDJOB_FARM_WINTER:REPEAT_NOT]
+[KEY:d]
+[BIND:BUILDJOB_STOCKPILE_MASTER:REPEAT_NOT]
+[KEY:t]
+[BIND:BUILDJOB_STOCKPILE_GIVE_TO:REPEAT_NOT]
+[KEY:g]
+[BIND:BUILDJOB_STOCKPILE_LINK_ANYWHERE:REPEAT_NOT]
+[KEY:a]
+[BIND:BUILDJOB_STOCKPILE_DELETE_CHILD:REPEAT_NOT]
+[KEY:d]
+[BIND:BUILDJOB_STOCKPILE_SETTINGS:REPEAT_NOT]
+[KEY:s]
+[BIND:BUILDJOB_STOCKPILE_BARREL_UP:REPEAT_NOT]
+[KEY:r]
+[BIND:BUILDJOB_STOCKPILE_BARREL_DOWN:REPEAT_NOT]
+[KEY:e]
+[BIND:BUILDJOB_STOCKPILE_BARREL_ZERO:REPEAT_NOT]
+[KEY:E]
+[BIND:BUILDJOB_STOCKPILE_BARREL_MAX:REPEAT_NOT]
+[KEY:R]
+[BIND:BUILDJOB_STOCKPILE_BIN_UP:REPEAT_NOT]
+[KEY:v]
+[BIND:BUILDJOB_STOCKPILE_BIN_DOWN:REPEAT_NOT]
+[KEY:c]
+[BIND:BUILDJOB_STOCKPILE_BIN_ZERO:REPEAT_NOT]
+[KEY:C]
+[BIND:BUILDJOB_STOCKPILE_BIN_MAX:REPEAT_NOT]
+[KEY:V]
+[BIND:BUILDJOB_STOCKPILE_WHEELBARROW:REPEAT_NOT]
+[KEY:w]
+[BIND:BUILDJOB_RACK_MAT_BONE:REPEAT_NOT]
+[KEY:b]
+[BIND:BUILDJOB_RACK_MAT_BRONZE:REPEAT_NOT]
+[KEY:z]
+[BIND:BUILDJOB_RACK_MAT_COPPER:REPEAT_NOT]
+[KEY:c]
+[BIND:BUILDJOB_RACK_MAT_IRON:REPEAT_NOT]
+[KEY:i]
+[BIND:BUILDJOB_RACK_MAT_STEEL:REPEAT_NOT]
+[KEY:e]
+[BIND:BUILDJOB_RACK_MAT_WOOD:REPEAT_NOT]
+[KEY:w]
+[BIND:BUILDJOB_RACK_MAT_METAL:REPEAT_NOT]
+[KEY:a]
+[BIND:BUILDJOB_STAND_MAT_BONE:REPEAT_NOT]
+[KEY:b]
+[BIND:BUILDJOB_STAND_MAT_LEATHER:REPEAT_NOT]
+[KEY:l]
+[BIND:BUILDJOB_STAND_MAT_COPPER:REPEAT_NOT]
+[KEY:c]
+[BIND:BUILDJOB_STAND_MAT_BRONZE:REPEAT_NOT]
+[KEY:z]
+[BIND:BUILDJOB_STAND_MAT_STEEL:REPEAT_NOT]
+[KEY:e]
+[BIND:BUILDJOB_STAND_MAT_IRON:REPEAT_NOT]
+[KEY:i]
+[BIND:BUILDJOB_STAND_MAT_WOOD:REPEAT_NOT]
+[KEY:w]
+[BIND:BUILDJOB_STAND_MAT_METAL:REPEAT_NOT]
+[KEY:a]
+[BIND:BUILDJOB_RACKSTAND_ASSIGN:REPEAT_NOT]
+[KEY:a]
+[BIND:BUILDJOB_RACKSTAND_FREE:REPEAT_NOT]
+[KEY:f]
+[BIND:BUILDJOB_RACKSTAND_SIZE:REPEAT_NOT]
+[KEY:r]
+[BIND:BUILDJOB_RACKSTAND_ITEM:REPEAT_NOT]
+[KEY:i]
+[BIND:BUILDJOB_RACKSTAND_MAT:REPEAT_NOT]
+[KEY:m]
+[BIND:BUILDJOB_RACKSTAND_DEFAULTS1:REPEAT_NOT]
+[KEY:s]
+[BIND:BUILDJOB_RACKSTAND_KILL1:REPEAT_NOT]
+[KEY:c]
+[BIND:BUILDJOB_RACKSTAND_DEFAULTS2:REPEAT_NOT]
+[KEY:b]
+[BIND:BUILDJOB_RACKSTAND_KILL2:REPEAT_NOT]
+[KEY:d]
+[BIND:STOCKPILE_SETTINGS_ENABLE:REPEAT_NOT]
+[KEY:e]
+[BIND:STOCKPILE_SETTINGS_DISABLE:REPEAT_NOT]
+[KEY:d]
+[BIND:STOCKPILE_SETTINGS_PERMIT_ALL:REPEAT_NOT]
+[KEY:a]
+[BIND:STOCKPILE_SETTINGS_FORBID_ALL:REPEAT_NOT]
+[KEY:b]
+[BIND:STOCKPILE_SETTINGS_PERMIT_SUB:REPEAT_NOT]
+[KEY:p]
+[BIND:STOCKPILE_SETTINGS_FORBID_SUB:REPEAT_NOT]
+[KEY:f]
+[BIND:STOCKPILE_SETTINGS_SPECIFIC1:REPEAT_NOT]
+[KEY:u]
+[BIND:STOCKPILE_SETTINGS_SPECIFIC2:REPEAT_NOT]
+[KEY:j]
+[BIND:D_BITEM_FORBID:REPEAT_NOT]
+[KEY:f]
+[BIND:D_BITEM_DUMP:REPEAT_NOT]
+[KEY:d]
+[BIND:D_BITEM_MELT:REPEAT_NOT]
+[KEY:m]
+[BIND:D_BITEM_HIDE:REPEAT_NOT]
+[KEY:h]
+[BIND:D_LOOK_FORBID:REPEAT_NOT]
+[KEY:f]
+[BIND:D_LOOK_DUMP:REPEAT_NOT]
+[KEY:d]
+[BIND:D_LOOK_MELT:REPEAT_NOT]
+[KEY:m]
+[BIND:D_LOOK_HIDE:REPEAT_NOT]
+[KEY:h]
+[BIND:D_LOOK_FOLLOW:REPEAT_NOT]
+[KEY:F]
+[BIND:D_LOOK_ARENA_CREATURE:REPEAT_NOT]
+[KEY:c]
+[BIND:D_LOOK_ARENA_ADV_MODE:REPEAT_NOT]
+[KEY:a]
+[BIND:D_LOOK_ARENA_WATER:REPEAT_NOT]
+[KEY:w]
+[BIND:D_LOOK_ARENA_MAGMA:REPEAT_NOT]
+[KEY:l]
+[BIND:ARENA_CREATURE_SIDE_DOWN:REPEAT_NOT]
+[KEY:s]
+[BIND:ARENA_CREATURE_SIDE_UP:REPEAT_NOT]
+[KEY:d]
+[BIND:ARENA_CREATURE_NEW_ITEM:REPEAT_NOT]
+[KEY:n]
+[BIND:ARENA_CREATURE_BLANK_LIST:REPEAT_NOT]
+[KEY:b]
+[BIND:ARENA_CREATURE_REMOVE_ITEM:REPEAT_NOT]
+[KEY:r]
+[BIND:ARENA_CREATURE_UNDEAD:REPEAT_NOT]
+[KEY:u]
+[BIND:ARENA_CREATURE_STRING:REPEAT_NOT]
+[KEY:f]
+[BIND:ARENA_CONFLICT_STATE_1:REPEAT_NOT]
+[KEY:c]
+[BIND:ARENA_CONFLICT_STATE_2:REPEAT_NOT]
+[KEY:C]
+[BIND:ARENA_MORALE:REPEAT_NOT]
+[KEY:m]
+[BIND:ARENA_WEATHER:REPEAT_NOT]
+[KEY:w]
+[BIND:ARENA_WEATHER_SNOW:REPEAT_NOT]
+[KEY:s]
+[BIND:ARENA_WEATHER_MUD:REPEAT_NOT]
+[KEY:m]
+[BIND:ARENA_WEATHER_CLEAR_SPATTER:REPEAT_NOT]
+[KEY:x]
+[BIND:D_LOOK_ARENA_TREE:REPEAT_NOT]
+[KEY:t]
+[BIND:ARENA_TREE_FILTER:REPEAT_NOT]
+[KEY:f]
+[BIND:ARENA_TREE_AGE:REPEAT_NOT]
+[KEY:a]
+[BIND:D_LOOK_ARENA_MOUNT:REPEAT_NOT]
+[KEY:r]
+[BIND:ASSIGNTRADE_VIEW:REPEAT_NOT]
+[KEY:v]
+[BIND:ASSIGNTRADE_STRING:REPEAT_NOT]
+[KEY:s]
+[BIND:ASSIGNTRADE_EXCLUDE_PROHIBITED:REPEAT_NOT]
+[KEY:m]
+[BIND:ASSIGNTRADE_PENDING:REPEAT_NOT]
+[KEY:p]
+[BIND:ASSIGNTRADE_SORT:REPEAT_NOT]
+[KEY:d]
+[BIND:NOBLELIST_REPLACE:REPEAT_NOT]
+[KEY:r]
+[BIND:NOBLELIST_SETTINGS:REPEAT_NOT]
+[KEY:s]
+[BIND:NOBLELIST_CAPITAL:REPEAT_NOT]
+[KEY:c]
+[BIND:NOBLELIST_VIEW_CANDIDATE:REPEAT_NOT]
+[KEY:v]
+[BIND:A_BARTER_VIEW:REPEAT_NOT]
+[KEY:v]
+[BIND:A_BARTER_CURRENCY_1:REPEAT_NOT]
+[KEY:a]
+[BIND:A_BARTER_CURRENCY_2:REPEAT_NOT]
+[KEY:o]
+[BIND:A_BARTER_TRADE:REPEAT_NOT]
+[KEY:t]
+[BIND:TRADE_VIEW:REPEAT_NOT]
+[KEY:v]
+[BIND:TRADE_TRADE:REPEAT_NOT]
+[KEY:t]
+[BIND:TRADE_OFFER:REPEAT_NOT]
+[KEY:o]
+[BIND:TRADE_SEIZE:REPEAT_NOT]
+[KEY:s]
+[BIND:STORES_VIEW:REPEAT_NOT]
+[KEY:v]
+[BIND:STORES_ZOOM:REPEAT_NOT]
+[KEY:z]
+[BIND:STORES_FORBID:REPEAT_NOT]
+[KEY:f]
+[BIND:STORES_MELT:REPEAT_NOT]
+[KEY:m]
+[BIND:STORES_DUMP:REPEAT_NOT]
+[KEY:d]
+[BIND:STORES_HIDE:REPEAT_NOT]
+[KEY:h]
+[BIND:MILITARY_ACTIVATE:REPEAT_NOT]
+[KEY:a]
+[BIND:MILITARY_VIEW:REPEAT_NOT]
+[KEY:v]
+[BIND:MILITARY_WEAPON:REPEAT_NOT]
+[KEY:w]
+[BIND:MILITARY_ZOOM:REPEAT_NOT]
+[KEY:c]
+[BIND:ANNOUNCE_ZOOM:REPEAT_NOT]
+[KEY:z]
+[BIND:UNITJOB_REMOVE_CRE:REPEAT_NOT]
+[KEY:x]
+[BIND:UNITJOB_ZOOM_CRE:REPEAT_NOT]
+[KEY:z]
+[BIND:UNITJOB_ZOOM_BUILD:REPEAT_NOT]
+[KEY:b]
+[BIND:UNITJOB_VIEW:REPEAT_NOT]
+[KEY:v]
+[BIND:UNITJOB_MANAGER:REPEAT_NOT]
+[KEY:m]
+[BIND:MANAGER_NEW_ORDER:REPEAT_NOT]
+[KEY:q]
+[BIND:MANAGER_REMOVE:REPEAT_NOT]
+[KEY:r]
+[BIND:MANAGER_PROMOTE:REPEAT_NOT]
+[KEY:p]
+[BIND:MANAGER_MAX:REPEAT_NOT]
+[KEY:t]
+[BIND:MANAGER_WAGES:REPEAT_NOT]
+[KEY:w]
+[BIND:PET_BUTCHER:REPEAT_NOT]
+[KEY:b]
+[BIND:PET_GELD:REPEAT_NOT]
+[KEY:x]
+[BIND:ANIMAL_SELECT_TRAINER:REPEAT_NOT]
+[KEY:t]
+[BIND:ANIMAL_WAR_TRAINING:REPEAT_NOT]
+[KEY:w]
+[BIND:ANIMAL_HUNTING_TRAINING:REPEAT_NOT]
+[KEY:h]
+[BIND:KITCHEN_COOK:REPEAT_NOT]
+[KEY:c]
+[BIND:KITCHEN_BREW:REPEAT_NOT]
+[KEY:b]
+[BIND:SETUPGAME_NEW:REPEAT_NOT]
+[KEY:n]
+[BIND:SETUPGAME_VIEW:REPEAT_NOT]
+[KEY:v]
+[BIND:SETUPGAME_CUSTOMIZE_UNIT:REPEAT_NOT]
+[KEY:c]
+[BIND:SETUPGAME_SAVE_PROFILE:REPEAT_NOT]
+[KEY:s]
+[BIND:SETUPGAME_SAVE_PROFILE_ABORT:REPEAT_NOT]
+[SYM:1:Space]
+[BIND:SETUPGAME_SAVE_PROFILE_GO:REPEAT_NOT]
+[SYM:0:Enter]
+[SYM:0:Numpad Enter]
+[BIND:SETUPGAME_VIEW_PROFILE_PROBLEMS:REPEAT_NOT]
+[KEY:p]
+[BIND:CIVZONE_REMOVE:REPEAT_NOT]
+[KEY:x]
+[BIND:CIVZONE_REMOVE_ZONE:REPEAT_NOT]
+[KEY:X]
+[BIND:CIVZONE_SHAPE:REPEAT_NOT]
+[KEY:e]
+[BIND:CIVZONE_NEXT:REPEAT_NOT]
+[KEY:v]
+[BIND:CIVZONE_WATER_SOURCE:REPEAT_NOT]
+[KEY:w]
+[BIND:CIVZONE_FISH:REPEAT_NOT]
+[KEY:f]
+[BIND:CIVZONE_GATHER:REPEAT_NOT]
+[KEY:g]
+[BIND:CIVZONE_DUMP:REPEAT_NOT]
+[KEY:d]
+[BIND:CIVZONE_POND:REPEAT_NOT]
+[KEY:p]
+[BIND:CIVZONE_PEN:REPEAT_NOT]
+[KEY:n]
+[BIND:CIVZONE_HOSPITAL:REPEAT_NOT]
+[KEY:h]
+[BIND:CIVZONE_SAND_COLLECT:REPEAT_NOT]
+[KEY:s]
+[BIND:CIVZONE_CLAY_COLLECT:REPEAT_NOT]
+[KEY:c]
+[BIND:CIVZONE_MEETING:REPEAT_NOT]
+[KEY:m]
+[BIND:CIVZONE_ANIMAL_TRAINING:REPEAT_NOT]
+[KEY:t]
+[BIND:CIVZONE_ACTIVE:REPEAT_NOT]
+[KEY:a]
+[BIND:CIVZONE_POND_OPTIONS:REPEAT_NOT]
+[KEY:P]
+[BIND:CIVZONE_PEN_OPTIONS:REPEAT_NOT]
+[KEY:N]
+[BIND:CIVZONE_POND_WATER:REPEAT_NOT]
+[KEY:f]
+[BIND:CIVZONE_HOSPITAL_OPTIONS:REPEAT_NOT]
+[KEY:H]
+[BIND:CIVZONE_GATHER_OPTIONS:REPEAT_NOT]
+[KEY:G]
+[BIND:CIVZONE_GATHER_OPTIONS_PICK_TREES:REPEAT_NOT]
+[KEY:t]
+[BIND:CIVZONE_GATHER_OPTIONS_PICK_SHRUBS:REPEAT_NOT]
+[KEY:s]
+[BIND:CIVZONE_GATHER_OPTIONS_GATHER_FALLEN:REPEAT_NOT]
+[KEY:f]
+[BIND:STOCKPILE_ANIMAL:REPEAT_NOT]
+[KEY:a]
+[BIND:STOCKPILE_FOOD:REPEAT_NOT]
+[KEY:f]
+[BIND:STOCKPILE_FURNITURE:REPEAT_NOT]
+[KEY:u]
+[BIND:STOCKPILE_GRAVEYARD:REPEAT_NOT]
+[KEY:y]
+[BIND:STOCKPILE_REFUSE:REPEAT_NOT]
+[KEY:r]
+[BIND:STOCKPILE_WOOD:REPEAT_NOT]
+[KEY:w]
+[BIND:STOCKPILE_STONE:REPEAT_NOT]
+[KEY:s]
+[BIND:STOCKPILE_GEM:REPEAT_NOT]
+[KEY:e]
+[BIND:STOCKPILE_BARBLOCK:REPEAT_NOT]
+[KEY:b]
+[BIND:STOCKPILE_CLOTH:REPEAT_NOT]
+[KEY:h]
+[BIND:STOCKPILE_LEATHER:REPEAT_NOT]
+[KEY:l]
+[BIND:STOCKPILE_AMMO:REPEAT_NOT]
+[KEY:z]
+[BIND:STOCKPILE_COINS:REPEAT_NOT]
+[KEY:n]
+[BIND:STOCKPILE_FINISHED:REPEAT_NOT]
+[KEY:g]
+[BIND:STOCKPILE_WEAPON:REPEAT_NOT]
+[KEY:p]
+[BIND:STOCKPILE_ARMOR:REPEAT_NOT]
+[KEY:d]
+[BIND:STOCKPILE_CUSTOM:REPEAT_NOT]
+[KEY:c]
+[BIND:STOCKPILE_CUSTOM_SETTINGS:REPEAT_NOT]
+[KEY:t]
+[BIND:STOCKPILE_NONE:REPEAT_NOT]
+[KEY:x]
+[BIND:DESIGNATE_BITEM:REPEAT_NOT]
+[KEY:b]
+[BIND:DESIGNATE_CLAIM:REPEAT_NOT]
+[KEY:c]
+[BIND:DESIGNATE_UNCLAIM:REPEAT_NOT]
+[KEY:f]
+[BIND:DESIGNATE_MELT:REPEAT_NOT]
+[KEY:m]
+[BIND:DESIGNATE_NO_MELT:REPEAT_NOT]
+[KEY:M]
+[BIND:DESIGNATE_DUMP:REPEAT_NOT]
+[KEY:d]
+[BIND:DESIGNATE_NO_DUMP:REPEAT_NOT]
+[KEY:D]
+[BIND:DESIGNATE_HIDE:REPEAT_NOT]
+[KEY:h]
+[BIND:DESIGNATE_NO_HIDE:REPEAT_NOT]
+[KEY:H]
+[BIND:DESIGNATE_DIG:REPEAT_NOT]
+[KEY:d]
+[BIND:DESIGNATE_DIG_REMOVE_STAIRS_RAMPS:REPEAT_NOT]
+[KEY:z]
+[BIND:DESIGNATE_STAIR_UP:REPEAT_NOT]
+[KEY:u]
+[BIND:DESIGNATE_STAIR_DOWN:REPEAT_NOT]
+[KEY:j]
+[BIND:DESIGNATE_STAIR_UPDOWN:REPEAT_NOT]
+[KEY:i]
+[BIND:DESIGNATE_TRAFFIC:REPEAT_NOT]
+[KEY:o]
+[BIND:DESIGNATE_TRAFFIC_HIGH:REPEAT_NOT]
+[KEY:h]
+[BIND:DESIGNATE_TRAFFIC_NORMAL:REPEAT_NOT]
+[KEY:n]
+[BIND:DESIGNATE_TRAFFIC_LOW:REPEAT_NOT]
+[KEY:l]
+[BIND:DESIGNATE_TRAFFIC_RESTRICTED:REPEAT_NOT]
+[KEY:r]
+[BIND:DESIGNATE_TRAFFIC_INCREASE_WEIGHT:REPEAT_NOT]
+[KEY:w]
+[BIND:DESIGNATE_TRAFFIC_DECREASE_WEIGHT:REPEAT_NOT]
+[KEY:q]
+[BIND:DESIGNATE_TRAFFIC_INCREASE_WEIGHT_MORE:REPEAT_NOT]
+[KEY:W]
+[BIND:DESIGNATE_TRAFFIC_DECREASE_WEIGHT_MORE:REPEAT_NOT]
+[KEY:Q]
+[BIND:DESIGNATE_RAMP:REPEAT_NOT]
+[KEY:r]
+[BIND:DESIGNATE_CHANNEL:REPEAT_NOT]
+[KEY:h]
+[BIND:DESIGNATE_CHOP:REPEAT_NOT]
+[KEY:t]
+[BIND:DESIGNATE_PLANTS:REPEAT_NOT]
+[KEY:p]
+[BIND:DESIGNATE_SMOOTH:REPEAT_NOT]
+[KEY:s]
+[BIND:DESIGNATE_ENGRAVE:REPEAT_NOT]
+[KEY:e]
+[BIND:DESIGNATE_FORTIFY:REPEAT_NOT]
+[KEY:F]
+[BIND:DESIGNATE_TRACK:REPEAT_NOT]
+[KEY:T]
+[BIND:DESIGNATE_TOGGLE_ENGRAVING:REPEAT_NOT]
+[KEY:v]
+[BIND:DESIGNATE_TOGGLE_MARKER:REPEAT_NOT]
+[KEY:M]
+[BIND:DESIGNATE_STANDARD_MARKER:REPEAT_NOT]
+[KEY:m]
+[BIND:DESIGNATE_MINE_MODE:REPEAT_NOT]
+[KEY:a]
+[BIND:DESIGNATE_UNDO:REPEAT_NOT]
+[KEY:x]
+[BIND:DESIGNATE_REMOVE_CONSTRUCTION:REPEAT_NOT]
+[KEY:n]
+[BIND:BUILDING_DIM_Y_UP:REPEAT_NOT]
+[KEY:u]
+[BIND:BUILDING_DIM_Y_DOWN:REPEAT_NOT]
+[KEY:m]
+[BIND:BUILDING_DIM_X_UP:REPEAT_NOT]
+[KEY:k]
+[BIND:BUILDING_DIM_X_DOWN:REPEAT_NOT]
+[KEY:h]
+[BIND:BUILDING_ORIENT_UP:REPEAT_NOT]
+[KEY:w]
+[BIND:BUILDING_ORIENT_LEFT:REPEAT_NOT]
+[KEY:a]
+[BIND:BUILDING_ORIENT_RIGHT:REPEAT_NOT]
+[KEY:d]
+[BIND:BUILDING_ORIENT_DOWN:REPEAT_NOT]
+[KEY:x]
+[BIND:BUILDING_ORIENT_NONE:REPEAT_NOT]
+[KEY:s]
+[BIND:BUILDING_VIEW_ITEM:REPEAT_NOT]
+[KEY:v]
+[BIND:BUILDING_ADVANCE_STAGE:REPEAT_NOT]
+[KEY:d]
+[BIND:BUILDING_EXPAND_CONTRACT:REPEAT_NOT]
+[KEY:x]
+[BIND:BUILDING_TRIGGER_ENABLE_WATER:REPEAT_NOT]
+[KEY:w]
+[BIND:BUILDING_TRIGGER_MIN_WATER_UP:REPEAT_NOT]
+[KEY:s]
+[BIND:BUILDING_TRIGGER_MIN_WATER_DOWN:REPEAT_NOT]
+[KEY:a]
+[BIND:BUILDING_TRIGGER_MAX_WATER_UP:REPEAT_NOT]
+[KEY:x]
+[BIND:BUILDING_TRIGGER_MAX_WATER_DOWN:REPEAT_NOT]
+[KEY:z]
+[BIND:BUILDING_TRIGGER_ENABLE_MAGMA:REPEAT_NOT]
+[KEY:m]
+[BIND:BUILDING_TRIGGER_MIN_MAGMA_UP:REPEAT_NOT]
+[KEY:i]
+[BIND:BUILDING_TRIGGER_MIN_MAGMA_DOWN:REPEAT_NOT]
+[KEY:u]
+[BIND:BUILDING_TRIGGER_MAX_MAGMA_UP:REPEAT_NOT]
+[KEY:k]
+[BIND:BUILDING_TRIGGER_MAX_MAGMA_DOWN:REPEAT_NOT]
+[KEY:j]
+[BIND:BUILDING_TRIGGER_ENABLE_TRACK_CART:REPEAT_NOT]
+[KEY:T]
+[BIND:BUILDING_TRIGGER_MIN_TRACK_CART_UP:REPEAT_NOT]
+[KEY:y]
+[BIND:BUILDING_TRIGGER_MIN_TRACK_CART_DOWN:REPEAT_NOT]
+[KEY:t]
+[BIND:BUILDING_TRIGGER_MAX_TRACK_CART_UP:REPEAT_NOT]
+[KEY:h]
+[BIND:BUILDING_TRIGGER_MAX_TRACK_CART_DOWN:REPEAT_NOT]
+[KEY:g]
+[BIND:BUILDING_TRIGGER_ENABLE_CREATURE:REPEAT_NOT]
+[KEY:c]
+[BIND:BUILDING_TRIGGER_ENABLE_LOCALS:REPEAT_NOT]
+[KEY:l]
+[BIND:BUILDING_TRIGGER_MIN_SIZE_UP:REPEAT_NOT]
+[KEY:r]
+[BIND:BUILDING_TRIGGER_MIN_SIZE_DOWN:REPEAT_NOT]
+[KEY:e]
+[BIND:BUILDING_TRIGGER_MAX_SIZE_UP:REPEAT_NOT]
+[KEY:f]
+[BIND:BUILDING_TRIGGER_MAX_SIZE_DOWN:REPEAT_NOT]
+[KEY:d]
+[BIND:BUILDING_TRIGGER_MIN_SIZE_UP_PLUS:REPEAT_NOT]
+[KEY:R]
+[BIND:BUILDING_TRIGGER_MIN_SIZE_DOWN_PLUS:REPEAT_NOT]
+[KEY:E]
+[BIND:BUILDING_TRIGGER_MAX_SIZE_UP_PLUS:REPEAT_NOT]
+[KEY:F]
+[BIND:BUILDING_TRIGGER_MAX_SIZE_DOWN_PLUS:REPEAT_NOT]
+[KEY:D]
+[BIND:BUILDING_TRIGGER_RESETS:REPEAT_NOT]
+[KEY:o]
+[BIND:BUILDING_TRACK_STOP_FRICTION_UP:REPEAT_NOT]
+[KEY:s]
+[BIND:BUILDING_TRACK_STOP_FRICTION_DOWN:REPEAT_NOT]
+[KEY:a]
+[BIND:BUILDING_TRACK_STOP_DUMP:REPEAT_NOT]
+[KEY:d]
+[BIND:BUILDING_ROLLERS_SPEED_UP:REPEAT_NOT]
+[KEY:w]
+[BIND:BUILDING_ROLLERS_SPEED_DOWN:REPEAT_NOT]
+[KEY:q]
+[BIND:UNITVIEW_GEN:REPEAT_NOT]
+[KEY:g]
+[BIND:UNITVIEW_INV:REPEAT_NOT]
+[KEY:i]
+[BIND:UNITVIEW_PRF:REPEAT_NOT]
+[KEY:p]
+[BIND:UNITVIEW_WND:REPEAT_NOT]
+[KEY:w]
+[BIND:UNITVIEW_FOLLOW:REPEAT_NOT]
+[KEY:f]
+[BIND:UNITVIEW_NEXT:REPEAT_NOT]
+[KEY:v]
+[BIND:UNITVIEW_SLAUGHTER:REPEAT_NOT]
+[KEY:s]
+[BIND:UNITVIEW_GELD:REPEAT_NOT]
+[KEY:x]
+[BIND:UNITVIEW_GEN_COMBAT:REPEAT_NOT]
+[KEY:c]
+[BIND:UNITVIEW_GEN_LABOR:REPEAT_NOT]
+[KEY:b]
+[BIND:UNITVIEW_GEN_MISC:REPEAT_NOT]
+[KEY:m]
+[BIND:UNITVIEW_PRF_PROF:REPEAT_NOT]
+[KEY:l]
+[BIND:UNITVIEW_PRF_PET:REPEAT_NOT]
+[KEY:e]
+[BIND:UNITVIEW_PRF_NEW_SQUAD:REPEAT_NOT]
+[KEY:n]
+[BIND:UNITVIEW_PRF_REMOVE_FROM_SQUAD:REPEAT_NOT]
+[KEY:x]
+[BIND:UNITVIEW_PRF_NAME_CURRENT_SQUAD:REPEAT_NOT]
+[KEY:N]
+[BIND:UNITVIEW_PRF_NAME_SELECTED_SQUAD:REPEAT_NOT]
+[KEY:M]
+[BIND:UNITVIEW_PRF_VIEW:REPEAT_NOT]
+[KEY:z]
+[BIND:BUILDINGLIST_ZOOM_T:REPEAT_NOT]
+[KEY:t]
+[BIND:BUILDINGLIST_ZOOM_Q:REPEAT_NOT]
+[KEY:q]
+[BIND:RECENTER_ON_LEVER:REPEAT_NOT]
+[KEY:l]
+[BIND:OPTION1:REPEAT_NOT]
+[KEY:a]
+[BIND:OPTION2:REPEAT_NOT]
+[KEY:b]
+[BIND:OPTION3:REPEAT_NOT]
+[KEY:c]
+[BIND:OPTION4:REPEAT_NOT]
+[KEY:d]
+[BIND:OPTION5:REPEAT_NOT]
+[KEY:e]
+[BIND:OPTION6:REPEAT_NOT]
+[KEY:f]
+[BIND:OPTION7:REPEAT_NOT]
+[KEY:g]
+[BIND:OPTION8:REPEAT_NOT]
+[KEY:h]
+[BIND:OPTION9:REPEAT_NOT]
+[KEY:i]
+[BIND:OPTION10:REPEAT_NOT]
+[KEY:j]
+[BIND:OPTION11:REPEAT_NOT]
+[KEY:k]
+[BIND:OPTION12:REPEAT_NOT]
+[KEY:l]
+[BIND:OPTION13:REPEAT_NOT]
+[KEY:m]
+[BIND:OPTION14:REPEAT_NOT]
+[KEY:n]
+[BIND:OPTION15:REPEAT_NOT]
+[KEY:o]
+[BIND:OPTION16:REPEAT_NOT]
+[KEY:p]
+[BIND:OPTION17:REPEAT_NOT]
+[KEY:q]
+[BIND:OPTION18:REPEAT_NOT]
+[KEY:r]
+[BIND:OPTION19:REPEAT_NOT]
+[KEY:s]
+[BIND:OPTION20:REPEAT_NOT]
+[KEY:t]
+[BIND:SEC_OPTION1:REPEAT_NOT]
+[KEY:A]
+[BIND:SEC_OPTION2:REPEAT_NOT]
+[KEY:B]
+[BIND:SEC_OPTION3:REPEAT_NOT]
+[KEY:C]
+[BIND:SEC_OPTION4:REPEAT_NOT]
+[KEY:D]
+[BIND:SEC_OPTION5:REPEAT_NOT]
+[KEY:E]
+[BIND:SEC_OPTION6:REPEAT_NOT]
+[KEY:F]
+[BIND:SEC_OPTION7:REPEAT_NOT]
+[KEY:G]
+[BIND:SEC_OPTION8:REPEAT_NOT]
+[KEY:H]
+[BIND:SEC_OPTION9:REPEAT_NOT]
+[KEY:I]
+[BIND:SEC_OPTION10:REPEAT_NOT]
+[KEY:J]
+[BIND:SEC_OPTION11:REPEAT_NOT]
+[KEY:K]
+[BIND:SEC_OPTION12:REPEAT_NOT]
+[KEY:L]
+[BIND:SEC_OPTION13:REPEAT_NOT]
+[KEY:M]
+[BIND:SEC_OPTION14:REPEAT_NOT]
+[KEY:N]
+[BIND:SEC_OPTION15:REPEAT_NOT]
+[KEY:O]
+[BIND:SEC_OPTION16:REPEAT_NOT]
+[KEY:P]
+[BIND:SEC_OPTION17:REPEAT_NOT]
+[KEY:Q]
+[BIND:SEC_OPTION18:REPEAT_NOT]
+[KEY:R]
+[BIND:SEC_OPTION19:REPEAT_NOT]
+[KEY:S]
+[BIND:SEC_OPTION20:REPEAT_NOT]
+[KEY:T]
+[BIND:STRING_A000:REPEAT_SLOW]
+[SYM:0:Backspace]
+[BIND:STRING_A032:REPEAT_SLOW]
+[KEY: ]
+[BIND:STRING_A033:REPEAT_SLOW]
+[KEY:!]
+[BIND:STRING_A034:REPEAT_SLOW]
+[KEY:"]
+[BIND:STRING_A035:REPEAT_SLOW]
+[KEY:#]
+[BIND:STRING_A036:REPEAT_SLOW]
+[KEY:$]
+[BIND:STRING_A037:REPEAT_SLOW]
+[KEY:%]
+[BIND:STRING_A038:REPEAT_SLOW]
+[KEY:&]
+[BIND:STRING_A039:REPEAT_SLOW]
+[KEY:']
+[BIND:STRING_A040:REPEAT_SLOW]
+[KEY:(]
+[BIND:STRING_A041:REPEAT_SLOW]
+[KEY:)]
+[BIND:STRING_A042:REPEAT_SLOW]
+[KEY:*]
+[BIND:STRING_A043:REPEAT_SLOW]
+[KEY:+]
+[BIND:STRING_A044:REPEAT_SLOW]
+[KEY:,]
+[BIND:STRING_A045:REPEAT_SLOW]
+[KEY:-]
+[BIND:STRING_A046:REPEAT_SLOW]
+[KEY:.]
+[BIND:STRING_A047:REPEAT_SLOW]
+[KEY:/]
+[BIND:STRING_A048:REPEAT_SLOW]
+[KEY:0]
+[BIND:STRING_A049:REPEAT_SLOW]
+[KEY:1]
+[BIND:STRING_A050:REPEAT_SLOW]
+[KEY:2]
+[BIND:STRING_A051:REPEAT_SLOW]
+[KEY:3]
+[BIND:STRING_A052:REPEAT_SLOW]
+[KEY:4]
+[BIND:STRING_A053:REPEAT_SLOW]
+[KEY:5]
+[BIND:STRING_A054:REPEAT_SLOW]
+[KEY:6]
+[BIND:STRING_A055:REPEAT_SLOW]
+[KEY:7]
+[BIND:STRING_A056:REPEAT_SLOW]
+[KEY:8]
+[BIND:STRING_A057:REPEAT_SLOW]
+[KEY:9]
+[BIND:STRING_A058:REPEAT_SLOW]
+[KEY::]
+[BIND:STRING_A059:REPEAT_SLOW]
+[KEY:;]
+[BIND:STRING_A060:REPEAT_SLOW]
+[KEY:<]
+[BIND:STRING_A061:REPEAT_SLOW]
+[KEY:=]
+[BIND:STRING_A062:REPEAT_SLOW]
+[KEY:>]
+[BIND:STRING_A063:REPEAT_SLOW]
+[KEY:?]
+[BIND:STRING_A064:REPEAT_SLOW]
+[KEY:@]
+[BIND:STRING_A065:REPEAT_SLOW]
+[KEY:A]
+[BIND:STRING_A066:REPEAT_SLOW]
+[KEY:B]
+[BIND:STRING_A067:REPEAT_SLOW]
+[KEY:C]
+[BIND:STRING_A068:REPEAT_SLOW]
+[KEY:D]
+[BIND:STRING_A069:REPEAT_SLOW]
+[KEY:E]
+[BIND:STRING_A070:REPEAT_SLOW]
+[KEY:F]
+[BIND:STRING_A071:REPEAT_SLOW]
+[KEY:G]
+[BIND:STRING_A072:REPEAT_SLOW]
+[KEY:H]
+[BIND:STRING_A073:REPEAT_SLOW]
+[KEY:I]
+[BIND:STRING_A074:REPEAT_SLOW]
+[KEY:J]
+[BIND:STRING_A075:REPEAT_SLOW]
+[KEY:K]
+[BIND:STRING_A076:REPEAT_SLOW]
+[KEY:L]
+[BIND:STRING_A077:REPEAT_SLOW]
+[KEY:M]
+[BIND:STRING_A078:REPEAT_SLOW]
+[KEY:N]
+[BIND:STRING_A079:REPEAT_SLOW]
+[KEY:O]
+[BIND:STRING_A080:REPEAT_SLOW]
+[KEY:P]
+[BIND:STRING_A081:REPEAT_SLOW]
+[KEY:Q]
+[BIND:STRING_A082:REPEAT_SLOW]
+[KEY:R]
+[BIND:STRING_A083:REPEAT_SLOW]
+[KEY:S]
+[BIND:STRING_A084:REPEAT_SLOW]
+[KEY:T]
+[BIND:STRING_A085:REPEAT_SLOW]
+[KEY:U]
+[BIND:STRING_A086:REPEAT_SLOW]
+[KEY:V]
+[BIND:STRING_A087:REPEAT_SLOW]
+[KEY:W]
+[BIND:STRING_A088:REPEAT_SLOW]
+[KEY:X]
+[BIND:STRING_A089:REPEAT_SLOW]
+[KEY:Y]
+[BIND:STRING_A090:REPEAT_SLOW]
+[KEY:Z]
+[BIND:STRING_A091:REPEAT_SLOW]
+[KEY:[]
+[BIND:STRING_A092:REPEAT_SLOW]
+[KEY:\]
+[BIND:STRING_A093:REPEAT_SLOW]
+[KEY:]]
+[BIND:STRING_A094:REPEAT_SLOW]
+[KEY:^]
+[BIND:STRING_A095:REPEAT_SLOW]
+[KEY:_]
+[BIND:STRING_A096:REPEAT_SLOW]
+[KEY:`]
+[BIND:STRING_A097:REPEAT_SLOW]
+[KEY:a]
+[BIND:STRING_A098:REPEAT_SLOW]
+[KEY:b]
+[BIND:STRING_A099:REPEAT_SLOW]
+[KEY:c]
+[BIND:STRING_A100:REPEAT_SLOW]
+[KEY:d]
+[BIND:STRING_A101:REPEAT_SLOW]
+[KEY:e]
+[BIND:STRING_A102:REPEAT_SLOW]
+[KEY:f]
+[BIND:STRING_A103:REPEAT_SLOW]
+[KEY:g]
+[BIND:STRING_A104:REPEAT_SLOW]
+[KEY:h]
+[BIND:STRING_A105:REPEAT_SLOW]
+[KEY:i]
+[BIND:STRING_A106:REPEAT_SLOW]
+[KEY:j]
+[BIND:STRING_A107:REPEAT_SLOW]
+[KEY:k]
+[BIND:STRING_A108:REPEAT_SLOW]
+[KEY:l]
+[BIND:STRING_A109:REPEAT_SLOW]
+[KEY:m]
+[BIND:STRING_A110:REPEAT_SLOW]
+[KEY:n]
+[BIND:STRING_A111:REPEAT_SLOW]
+[KEY:o]
+[BIND:STRING_A112:REPEAT_SLOW]
+[KEY:p]
+[BIND:STRING_A113:REPEAT_SLOW]
+[KEY:q]
+[BIND:STRING_A114:REPEAT_SLOW]
+[KEY:r]
+[BIND:STRING_A115:REPEAT_SLOW]
+[KEY:s]
+[BIND:STRING_A116:REPEAT_SLOW]
+[KEY:t]
+[BIND:STRING_A117:REPEAT_SLOW]
+[KEY:u]
+[BIND:STRING_A118:REPEAT_SLOW]
+[KEY:v]
+[BIND:STRING_A119:REPEAT_SLOW]
+[KEY:w]
+[BIND:STRING_A120:REPEAT_SLOW]
+[KEY:x]
+[BIND:STRING_A121:REPEAT_SLOW]
+[KEY:y]
+[BIND:STRING_A122:REPEAT_SLOW]
+[KEY:z]
+[BIND:STRING_A123:REPEAT_SLOW]
+[KEY:}]
+[BIND:STRING_A124:REPEAT_SLOW]
+[KEY:|]
+[BIND:STRING_A125:REPEAT_SLOW]
+[KEY:}]
+[BIND:STRING_A126:REPEAT_SLOW]
+[KEY:~]
+[BIND:STRING_A128:REPEAT_SLOW]
+[KEY:€]
+[BIND:STRING_A129:REPEAT_SLOW]
+[KEY:]
+[BIND:STRING_A130:REPEAT_SLOW]
+[KEY:‚]
+[BIND:STRING_A131:REPEAT_SLOW]
+[KEY:ƒ]
+[BIND:STRING_A132:REPEAT_SLOW]
+[KEY:„]
+[BIND:STRING_A133:REPEAT_SLOW]
+[KEY:…]
+[BIND:STRING_A134:REPEAT_SLOW]
+[KEY:†]
+[BIND:STRING_A135:REPEAT_SLOW]
+[KEY:‡]
+[BIND:STRING_A136:REPEAT_SLOW]
+[KEY:ˆ]
+[BIND:STRING_A137:REPEAT_SLOW]
+[KEY:‰]
+[BIND:STRING_A138:REPEAT_SLOW]
+[KEY:Š]
+[BIND:STRING_A139:REPEAT_SLOW]
+[KEY:‹]
+[BIND:STRING_A140:REPEAT_SLOW]
+[KEY:Œ]
+[BIND:STRING_A141:REPEAT_SLOW]
+[KEY:]
+[BIND:STRING_A142:REPEAT_SLOW]
+[KEY:Ž]
+[BIND:STRING_A143:REPEAT_SLOW]
+[KEY:]
+[BIND:STRING_A144:REPEAT_SLOW]
+[KEY:]
+[BIND:STRING_A145:REPEAT_SLOW]
+[KEY:‘]
+[BIND:STRING_A146:REPEAT_SLOW]
+[KEY:’]
+[BIND:STRING_A147:REPEAT_SLOW]
+[KEY:“]
+[BIND:STRING_A148:REPEAT_SLOW]
+[KEY:”]
+[BIND:STRING_A149:REPEAT_SLOW]
+[KEY:•]
+[BIND:STRING_A150:REPEAT_SLOW]
+[KEY:–]
+[BIND:STRING_A151:REPEAT_SLOW]
+[KEY:—]
+[BIND:STRING_A152:REPEAT_SLOW]
+[KEY:˜]
+[BIND:STRING_A153:REPEAT_SLOW]
+[KEY:™]
+[BIND:STRING_A154:REPEAT_SLOW]
+[KEY:š]
+[BIND:STRING_A155:REPEAT_SLOW]
+[KEY:›]
+[BIND:STRING_A156:REPEAT_SLOW]
+[KEY:œ]
+[BIND:STRING_A157:REPEAT_SLOW]
+[KEY:]
+[BIND:STRING_A158:REPEAT_SLOW]
+[KEY:ž]
+[BIND:STRING_A159:REPEAT_SLOW]
+[KEY:Ÿ]
+[BIND:STRING_A160:REPEAT_SLOW]
+[KEY: ]
+[BIND:STRING_A161:REPEAT_SLOW]
+[KEY:¡]
+[BIND:STRING_A162:REPEAT_SLOW]
+[KEY:¢]
+[BIND:STRING_A163:REPEAT_SLOW]
+[KEY:£]
+[BIND:STRING_A164:REPEAT_SLOW]
+[KEY:¤]
+[BIND:STRING_A165:REPEAT_SLOW]
+[KEY:¥]
+[BIND:STRING_A166:REPEAT_SLOW]
+[KEY:¦]
+[BIND:STRING_A167:REPEAT_SLOW]
+[KEY:§]
+[BIND:STRING_A168:REPEAT_SLOW]
+[KEY:¨]
+[BIND:STRING_A169:REPEAT_SLOW]
+[KEY:©]
+[BIND:STRING_A170:REPEAT_SLOW]
+[KEY:ª]
+[BIND:STRING_A171:REPEAT_SLOW]
+[KEY:«]
+[BIND:STRING_A172:REPEAT_SLOW]
+[KEY:¬]
+[BIND:STRING_A173:REPEAT_SLOW]
+[KEY:­]
+[BIND:STRING_A174:REPEAT_SLOW]
+[KEY:®]
+[BIND:STRING_A175:REPEAT_SLOW]
+[KEY:¯]
+[BIND:STRING_A176:REPEAT_SLOW]
+[KEY:°]
+[BIND:STRING_A177:REPEAT_SLOW]
+[KEY:±]
+[BIND:STRING_A178:REPEAT_SLOW]
+[KEY:²]
+[BIND:STRING_A179:REPEAT_SLOW]
+[KEY:³]
+[BIND:STRING_A180:REPEAT_SLOW]
+[KEY:´]
+[BIND:STRING_A181:REPEAT_SLOW]
+[KEY:µ]
+[BIND:STRING_A182:REPEAT_SLOW]
+[KEY:¶]
+[BIND:STRING_A183:REPEAT_SLOW]
+[KEY:·]
+[BIND:STRING_A184:REPEAT_SLOW]
+[KEY:¸]
+[BIND:STRING_A185:REPEAT_SLOW]
+[KEY:¹]
+[BIND:STRING_A186:REPEAT_SLOW]
+[KEY:º]
+[BIND:STRING_A187:REPEAT_SLOW]
+[KEY:»]
+[BIND:STRING_A188:REPEAT_SLOW]
+[KEY:¼]
+[BIND:STRING_A189:REPEAT_SLOW]
+[KEY:½]
+[BIND:STRING_A190:REPEAT_SLOW]
+[KEY:¾]
+[BIND:STRING_A191:REPEAT_SLOW]
+[KEY:¿]
+[BIND:STRING_A192:REPEAT_SLOW]
+[KEY:À]
+[BIND:STRING_A193:REPEAT_SLOW]
+[KEY:Á]
+[BIND:STRING_A194:REPEAT_SLOW]
+[KEY:Â]
+[BIND:STRING_A195:REPEAT_SLOW]
+[KEY:Ã]
+[BIND:STRING_A196:REPEAT_SLOW]
+[KEY:Ä]
+[BIND:STRING_A197:REPEAT_SLOW]
+[KEY:Å]
+[BIND:STRING_A198:REPEAT_SLOW]
+[KEY:Æ]
+[BIND:STRING_A199:REPEAT_SLOW]
+[KEY:Ç]
+[BIND:STRING_A200:REPEAT_SLOW]
+[KEY:È]
+[BIND:STRING_A201:REPEAT_SLOW]
+[KEY:É]
+[BIND:STRING_A202:REPEAT_SLOW]
+[KEY:Ê]
+[BIND:STRING_A203:REPEAT_SLOW]
+[KEY:Ë]
+[BIND:STRING_A204:REPEAT_SLOW]
+[KEY:Ì]
+[BIND:STRING_A205:REPEAT_SLOW]
+[KEY:Í]
+[BIND:STRING_A206:REPEAT_SLOW]
+[KEY:Î]
+[BIND:STRING_A207:REPEAT_SLOW]
+[KEY:Ï]
+[BIND:STRING_A208:REPEAT_SLOW]
+[KEY:Ð]
+[BIND:STRING_A209:REPEAT_SLOW]
+[KEY:Ñ]
+[BIND:STRING_A210:REPEAT_SLOW]
+[KEY:Ò]
+[BIND:STRING_A211:REPEAT_SLOW]
+[KEY:Ó]
+[BIND:STRING_A212:REPEAT_SLOW]
+[KEY:Ô]
+[BIND:STRING_A213:REPEAT_SLOW]
+[KEY:Õ]
+[BIND:STRING_A214:REPEAT_SLOW]
+[KEY:Ö]
+[BIND:STRING_A215:REPEAT_SLOW]
+[KEY:×]
+[BIND:STRING_A216:REPEAT_SLOW]
+[KEY:Ø]
+[BIND:STRING_A217:REPEAT_SLOW]
+[KEY:Ù]
+[BIND:STRING_A218:REPEAT_SLOW]
+[KEY:Ú]
+[BIND:STRING_A219:REPEAT_SLOW]
+[KEY:Û]
+[BIND:STRING_A220:REPEAT_SLOW]
+[KEY:Ü]
+[BIND:STRING_A221:REPEAT_SLOW]
+[KEY:Ý]
+[BIND:STRING_A222:REPEAT_SLOW]
+[KEY:Þ]
+[BIND:STRING_A223:REPEAT_SLOW]
+[KEY:ß]
+[BIND:STRING_A224:REPEAT_SLOW]
+[KEY:à]
+[BIND:STRING_A225:REPEAT_SLOW]
+[KEY:á]
+[BIND:STRING_A226:REPEAT_SLOW]
+[KEY:â]
+[BIND:STRING_A227:REPEAT_SLOW]
+[KEY:ã]
+[BIND:STRING_A228:REPEAT_SLOW]
+[KEY:ä]
+[BIND:STRING_A229:REPEAT_SLOW]
+[KEY:å]
+[BIND:STRING_A230:REPEAT_SLOW]
+[KEY:æ]
+[BIND:STRING_A231:REPEAT_SLOW]
+[KEY:ç]
+[BIND:STRING_A232:REPEAT_SLOW]
+[KEY:è]
+[BIND:STRING_A233:REPEAT_SLOW]
+[KEY:é]
+[BIND:STRING_A234:REPEAT_SLOW]
+[KEY:ê]
+[BIND:STRING_A235:REPEAT_SLOW]
+[KEY:ë]
+[BIND:STRING_A236:REPEAT_SLOW]
+[KEY:ì]
+[BIND:STRING_A237:REPEAT_SLOW]
+[KEY:í]
+[BIND:STRING_A238:REPEAT_SLOW]
+[KEY:î]
+[BIND:STRING_A239:REPEAT_SLOW]
+[KEY:ï]
+[BIND:STRING_A240:REPEAT_SLOW]
+[KEY:ð]
+[BIND:STRING_A241:REPEAT_SLOW]
+[KEY:ñ]
+[BIND:STRING_A242:REPEAT_SLOW]
+[KEY:ò]
+[BIND:STRING_A243:REPEAT_SLOW]
+[KEY:ó]
+[BIND:STRING_A244:REPEAT_SLOW]
+[KEY:ô]
+[BIND:STRING_A245:REPEAT_SLOW]
+[KEY:õ]
+[BIND:STRING_A246:REPEAT_SLOW]
+[KEY:ö]
+[BIND:STRING_A247:REPEAT_SLOW]
+[KEY:÷]
+[BIND:STRING_A248:REPEAT_SLOW]
+[KEY:ø]
+[BIND:STRING_A249:REPEAT_SLOW]
+[KEY:ù]
+[BIND:STRING_A250:REPEAT_SLOW]
+[KEY:ú]
+[BIND:STRING_A251:REPEAT_SLOW]
+[KEY:û]
+[BIND:STRING_A252:REPEAT_SLOW]
+[KEY:ü]
+[BIND:STRING_A253:REPEAT_SLOW]
+[KEY:ý]
+[BIND:STRING_A254:REPEAT_SLOW]
+[KEY:þ]
+[BIND:STRING_A255:REPEAT_SLOW]
+[KEY:ÿ]
+[BIND:CUSTOM_A:REPEAT_NOT]
+[KEY:a]
+[BIND:CUSTOM_B:REPEAT_NOT]
+[KEY:b]
+[BIND:CUSTOM_C:REPEAT_NOT]
+[KEY:c]
+[BIND:CUSTOM_D:REPEAT_NOT]
+[KEY:d]
+[BIND:CUSTOM_E:REPEAT_NOT]
+[KEY:e]
+[BIND:CUSTOM_F:REPEAT_NOT]
+[KEY:f]
+[BIND:CUSTOM_G:REPEAT_NOT]
+[KEY:g]
+[BIND:CUSTOM_H:REPEAT_NOT]
+[KEY:h]
+[BIND:CUSTOM_I:REPEAT_NOT]
+[KEY:i]
+[BIND:CUSTOM_J:REPEAT_NOT]
+[KEY:j]
+[BIND:CUSTOM_K:REPEAT_NOT]
+[KEY:k]
+[BIND:CUSTOM_L:REPEAT_NOT]
+[KEY:l]
+[BIND:CUSTOM_M:REPEAT_NOT]
+[KEY:m]
+[BIND:CUSTOM_N:REPEAT_NOT]
+[KEY:n]
+[BIND:CUSTOM_O:REPEAT_NOT]
+[KEY:o]
+[BIND:CUSTOM_P:REPEAT_NOT]
+[KEY:p]
+[BIND:CUSTOM_Q:REPEAT_NOT]
+[KEY:q]
+[BIND:CUSTOM_R:REPEAT_NOT]
+[KEY:r]
+[BIND:CUSTOM_S:REPEAT_NOT]
+[KEY:s]
+[BIND:CUSTOM_T:REPEAT_NOT]
+[KEY:t]
+[BIND:CUSTOM_U:REPEAT_NOT]
+[KEY:u]
+[BIND:CUSTOM_V:REPEAT_NOT]
+[KEY:v]
+[BIND:CUSTOM_W:REPEAT_NOT]
+[KEY:w]
+[BIND:CUSTOM_X:REPEAT_NOT]
+[KEY:x]
+[BIND:CUSTOM_Y:REPEAT_NOT]
+[KEY:y]
+[BIND:CUSTOM_Z:REPEAT_NOT]
+[KEY:z]
+[BIND:CUSTOM_SHIFT_A:REPEAT_NOT]
+[KEY:A]
+[BIND:CUSTOM_SHIFT_B:REPEAT_NOT]
+[KEY:B]
+[BIND:CUSTOM_SHIFT_C:REPEAT_NOT]
+[KEY:C]
+[BIND:CUSTOM_SHIFT_D:REPEAT_NOT]
+[KEY:D]
+[BIND:CUSTOM_SHIFT_E:REPEAT_NOT]
+[KEY:E]
+[BIND:CUSTOM_SHIFT_F:REPEAT_NOT]
+[KEY:F]
+[BIND:CUSTOM_SHIFT_G:REPEAT_NOT]
+[KEY:G]
+[BIND:CUSTOM_SHIFT_H:REPEAT_NOT]
+[KEY:H]
+[BIND:CUSTOM_SHIFT_I:REPEAT_NOT]
+[KEY:I]
+[BIND:CUSTOM_SHIFT_J:REPEAT_NOT]
+[KEY:J]
+[BIND:CUSTOM_SHIFT_K:REPEAT_NOT]
+[KEY:K]
+[BIND:CUSTOM_SHIFT_L:REPEAT_NOT]
+[KEY:L]
+[BIND:CUSTOM_SHIFT_M:REPEAT_NOT]
+[KEY:M]
+[BIND:CUSTOM_SHIFT_N:REPEAT_NOT]
+[KEY:N]
+[BIND:CUSTOM_SHIFT_O:REPEAT_NOT]
+[KEY:O]
+[BIND:CUSTOM_SHIFT_P:REPEAT_NOT]
+[KEY:P]
+[BIND:CUSTOM_SHIFT_Q:REPEAT_NOT]
+[KEY:Q]
+[BIND:CUSTOM_SHIFT_R:REPEAT_NOT]
+[KEY:R]
+[BIND:CUSTOM_SHIFT_S:REPEAT_NOT]
+[KEY:S]
+[BIND:CUSTOM_SHIFT_T:REPEAT_NOT]
+[KEY:T]
+[BIND:CUSTOM_SHIFT_U:REPEAT_NOT]
+[KEY:U]
+[BIND:CUSTOM_SHIFT_V:REPEAT_NOT]
+[KEY:V]
+[BIND:CUSTOM_SHIFT_W:REPEAT_NOT]
+[KEY:W]
+[BIND:CUSTOM_SHIFT_X:REPEAT_NOT]
+[KEY:X]
+[BIND:CUSTOM_SHIFT_Y:REPEAT_NOT]
+[KEY:Y]
+[BIND:CUSTOM_SHIFT_Z:REPEAT_NOT]
+[KEY:Z]
+[BIND:CUSTOM_CTRL_A:REPEAT_NOT]
+[SYM:2:a]
+[BIND:CUSTOM_CTRL_B:REPEAT_NOT]
+[SYM:2:b]
+[BIND:CUSTOM_CTRL_C:REPEAT_NOT]
+[SYM:2:c]
+[BIND:CUSTOM_CTRL_D:REPEAT_NOT]
+[SYM:2:d]
+[BIND:CUSTOM_CTRL_E:REPEAT_NOT]
+[SYM:2:e]
+[BIND:CUSTOM_CTRL_F:REPEAT_NOT]
+[SYM:2:f]
+[BIND:CUSTOM_CTRL_G:REPEAT_NOT]
+[SYM:2:g]
+[BIND:CUSTOM_CTRL_H:REPEAT_NOT]
+[SYM:2:h]
+[BIND:CUSTOM_CTRL_I:REPEAT_NOT]
+[SYM:2:i]
+[BIND:CUSTOM_CTRL_J:REPEAT_NOT]
+[SYM:2:j]
+[BIND:CUSTOM_CTRL_K:REPEAT_NOT]
+[SYM:2:k]
+[BIND:CUSTOM_CTRL_L:REPEAT_NOT]
+[SYM:2:l]
+[BIND:CUSTOM_CTRL_M:REPEAT_NOT]
+[SYM:2:m]
+[BIND:CUSTOM_CTRL_N:REPEAT_NOT]
+[SYM:2:n]
+[BIND:CUSTOM_CTRL_O:REPEAT_NOT]
+[SYM:2:o]
+[BIND:CUSTOM_CTRL_P:REPEAT_NOT]
+[SYM:2:p]
+[BIND:CUSTOM_CTRL_Q:REPEAT_NOT]
+[SYM:2:q]
+[BIND:CUSTOM_CTRL_R:REPEAT_NOT]
+[SYM:2:r]
+[BIND:CUSTOM_CTRL_S:REPEAT_NOT]
+[SYM:2:s]
+[BIND:CUSTOM_CTRL_T:REPEAT_NOT]
+[SYM:2:t]
+[BIND:CUSTOM_CTRL_U:REPEAT_NOT]
+[SYM:2:u]
+[BIND:CUSTOM_CTRL_V:REPEAT_NOT]
+[SYM:2:v]
+[BIND:CUSTOM_CTRL_W:REPEAT_NOT]
+[SYM:2:w]
+[BIND:CUSTOM_CTRL_X:REPEAT_NOT]
+[SYM:2:x]
+[BIND:CUSTOM_CTRL_Y:REPEAT_NOT]
+[SYM:2:y]
+[BIND:CUSTOM_CTRL_Z:REPEAT_NOT]
+[SYM:2:z]
+[BIND:CUSTOM_ALT_A:REPEAT_NOT]
+[SYM:4:a]
+[BIND:CUSTOM_ALT_B:REPEAT_NOT]
+[SYM:4:b]
+[BIND:CUSTOM_ALT_C:REPEAT_NOT]
+[SYM:4:c]
+[BIND:CUSTOM_ALT_D:REPEAT_NOT]
+[SYM:4:d]
+[BIND:CUSTOM_ALT_E:REPEAT_NOT]
+[SYM:4:e]
+[BIND:CUSTOM_ALT_F:REPEAT_NOT]
+[SYM:4:f]
+[BIND:CUSTOM_ALT_G:REPEAT_NOT]
+[SYM:4:g]
+[BIND:CUSTOM_ALT_H:REPEAT_NOT]
+[SYM:4:h]
+[BIND:CUSTOM_ALT_I:REPEAT_NOT]
+[SYM:4:i]
+[BIND:CUSTOM_ALT_J:REPEAT_NOT]
+[SYM:4:j]
+[BIND:CUSTOM_ALT_K:REPEAT_NOT]
+[SYM:4:k]
+[BIND:CUSTOM_ALT_L:REPEAT_NOT]
+[SYM:4:l]
+[BIND:CUSTOM_ALT_M:REPEAT_NOT]
+[SYM:4:m]
+[BIND:CUSTOM_ALT_N:REPEAT_NOT]
+[SYM:4:n]
+[BIND:CUSTOM_ALT_O:REPEAT_NOT]
+[SYM:4:o]
+[BIND:CUSTOM_ALT_P:REPEAT_NOT]
+[SYM:4:p]
+[BIND:CUSTOM_ALT_Q:REPEAT_NOT]
+[SYM:4:q]
+[BIND:CUSTOM_ALT_R:REPEAT_NOT]
+[SYM:4:r]
+[BIND:CUSTOM_ALT_S:REPEAT_NOT]
+[SYM:4:s]
+[BIND:CUSTOM_ALT_T:REPEAT_NOT]
+[SYM:4:t]
+[BIND:CUSTOM_ALT_U:REPEAT_NOT]
+[SYM:4:u]
+[BIND:CUSTOM_ALT_V:REPEAT_NOT]
+[SYM:4:v]
+[BIND:CUSTOM_ALT_W:REPEAT_NOT]
+[SYM:4:w]
+[BIND:CUSTOM_ALT_X:REPEAT_NOT]
+[SYM:4:x]
+[BIND:CUSTOM_ALT_Y:REPEAT_NOT]
+[SYM:4:y]
+[BIND:CUSTOM_ALT_Z:REPEAT_NOT]
+[SYM:4:z]
+[BIND:RECORD_MACRO:REPEAT_NOT]
+[SYM:2:r]
+[BIND:PLAY_MACRO:REPEAT_SLOW]
+[SYM:2:p]
+[BIND:SAVE_MACRO:REPEAT_NOT]
+[SYM:2:s]
+[BIND:LOAD_MACRO:REPEAT_NOT]
+[SYM:2:l]
+[BIND:TOGGLE_TTF:REPEAT_NOT]
+[SYM:0:F12]
+[BIND:PREFIX:REPEAT_SLOW]
+[SYM:2:u] \ No newline at end of file
diff --git a/data/init/world_gen.txt b/data/init/world_gen.txt
new file mode 100755
index 0000000..1c958c8
--- /dev/null
+++ b/data/init/world_gen.txt
@@ -0,0 +1,890 @@
+[WORLD_GEN]
+ [TITLE:LARGE ISLAND]
+ [DIM:257:257]
+ [EMBARK_POINTS:1504]
+ [END_YEAR:1050]
+ [BEAST_END_YEAR:300:80]
+ [REVEAL_ALL_HISTORY:1]
+ [CULL_HISTORICAL_FIGURES:0]
+ [ELEVATION:1:400:1600:1600]
+ [RAINFALL:0:100:400:400]
+ [TEMPERATURE:25:75:400:400]
+ [DRAINAGE:0:100:400:400]
+ [VOLCANISM:0:100:400:400]
+ [SAVAGERY:0:100:400:400]
+ [ELEVATION_FREQUENCY:1:1:1:1:1:1]
+ [RAIN_FREQUENCY:1:1:1:1:1:1]
+ [DRAINAGE_FREQUENCY:1:1:1:1:1:1]
+ [TEMPERATURE_FREQUENCY:1:1:1:1:1:1]
+ [SAVAGERY_FREQUENCY:1:1:1:1:1:1]
+ [VOLCANISM_FREQUENCY:1:1:1:1:1:1]
+ [POLE:NORTH_AND_OR_SOUTH]
+ [MINERAL_SCARCITY:2500]
+ [MEGABEAST_CAP:75]
+ [SEMIMEGABEAST_CAP:150]
+ [TITAN_NUMBER:33]
+ [TITAN_ATTACK_TRIGGER:80:0:100000]
+ [DEMON_NUMBER:52]
+ [NIGHT_TROLL_NUMBER:26]
+ [BOGEYMAN_NUMBER:26]
+ [VAMPIRE_NUMBER:26]
+ [WEREBEAST_NUMBER:26]
+ [SECRET_NUMBER:52]
+ [REGIONAL_INTERACTION_NUMBER:52]
+ [DISTURBANCE_INTERACTION_NUMBER:52]
+ [EVIL_CLOUD_NUMBER:26]
+ [EVIL_RAIN_NUMBER:26]
+ [GENERATE_DIVINE_MATERIALS:1]
+ [GOOD_SQ_COUNTS:24:244:0]
+ [EVIL_SQ_COUNTS:24:244:0]
+ [PEAK_NUMBER_MIN:12]
+ [PARTIAL_OCEAN_EDGE_MIN:0]
+ [COMPLETE_OCEAN_EDGE_MIN:4]
+ [VOLCANO_MIN:4]
+ [REGION_COUNTS:SWAMP:252:1:1]
+ [REGION_COUNTS:DESERT:252:1:1]
+ [REGION_COUNTS:FOREST:1008:3:2]
+ [REGION_COUNTS:MOUNTAINS:2016:2:2]
+ [REGION_COUNTS:OCEAN:2016:1:1]
+ [REGION_COUNTS:GLACIER:63:0:0]
+ [REGION_COUNTS:TUNDRA:126:0:0]
+ [REGION_COUNTS:GRASSLAND:2016:3:2]
+ [REGION_COUNTS:HILLS:2016:3:2]
+ [EROSION_CYCLE_COUNT:250]
+ [RIVER_MINS:100:100]
+ [PERIODICALLY_ERODE_EXTREMES:1]
+ [OROGRAPHIC_PRECIPITATION:1]
+ [SUBREGION_MAX:3500]
+ [CAVERN_LAYER_COUNT:3]
+ [CAVERN_LAYER_OPENNESS_MIN:0]
+ [CAVERN_LAYER_OPENNESS_MAX:100]
+ [CAVERN_LAYER_PASSAGE_DENSITY_MIN:0]
+ [CAVERN_LAYER_PASSAGE_DENSITY_MAX:100]
+ [CAVERN_LAYER_WATER_MIN:0]
+ [CAVERN_LAYER_WATER_MAX:100]
+ [HAVE_BOTTOM_LAYER_1:1]
+ [HAVE_BOTTOM_LAYER_2:1]
+ [LEVELS_ABOVE_GROUND:15]
+ [LEVELS_ABOVE_LAYER_1:5]
+ [LEVELS_ABOVE_LAYER_2:1]
+ [LEVELS_ABOVE_LAYER_3:1]
+ [LEVELS_ABOVE_LAYER_4:1]
+ [LEVELS_ABOVE_LAYER_5:2]
+ [LEVELS_AT_BOTTOM:1]
+ [CAVE_MIN_SIZE:5]
+ [CAVE_MAX_SIZE:25]
+ [MOUNTAIN_CAVE_MIN:40]
+ [NON_MOUNTAIN_CAVE_MIN:60]
+ [ALL_CAVES_VISIBLE:0]
+ [SHOW_EMBARK_TUNNEL:2]
+ [TOTAL_CIV_NUMBER:40]
+ [TOTAL_CIV_POPULATION:15000]
+ [SITE_CAP:1500]
+ [PLAYABLE_CIVILIZATION_REQUIRED:1]
+ [ELEVATION_RANGES:33000:4032:2016]
+ [RAIN_RANGES:2016:4032:2016]
+ [DRAINAGE_RANGES:2016:4032:2016]
+ [SAVAGERY_RANGES:2016:4032:2016]
+ [VOLCANISM_RANGES:2016:4032:2016]
+
+[WORLD_GEN]
+ [TITLE:LARGE REGION]
+ [DIM:257:257]
+ [EMBARK_POINTS:1504]
+ [END_YEAR:1050]
+ [BEAST_END_YEAR:300:80]
+ [REVEAL_ALL_HISTORY:1]
+ [CULL_HISTORICAL_FIGURES:1]
+ [ELEVATION:1:400:800:800]
+ [RAINFALL:0:100:400:400]
+ [TEMPERATURE:25:75:400:400]
+ [DRAINAGE:0:100:400:400]
+ [VOLCANISM:0:100:400:400]
+ [SAVAGERY:0:100:400:400]
+ [ELEVATION_FREQUENCY:1:1:1:1:1:1]
+ [RAIN_FREQUENCY:1:1:1:1:1:1]
+ [DRAINAGE_FREQUENCY:1:1:1:1:1:1]
+ [TEMPERATURE_FREQUENCY:1:1:1:1:1:1]
+ [SAVAGERY_FREQUENCY:1:1:1:1:1:1]
+ [VOLCANISM_FREQUENCY:1:1:1:1:1:1]
+ [POLE:NORTH_AND_OR_SOUTH]
+ [MINERAL_SCARCITY:2500]
+ [MEGABEAST_CAP:75]
+ [SEMIMEGABEAST_CAP:150]
+ [TITAN_NUMBER:33]
+ [TITAN_ATTACK_TRIGGER:80:0:100000]
+ [DEMON_NUMBER:52]
+ [NIGHT_TROLL_NUMBER:26]
+ [BOGEYMAN_NUMBER:26]
+ [VAMPIRE_NUMBER:26]
+ [WEREBEAST_NUMBER:26]
+ [SECRET_NUMBER:52]
+ [REGIONAL_INTERACTION_NUMBER:52]
+ [DISTURBANCE_INTERACTION_NUMBER:52]
+ [EVIL_CLOUD_NUMBER:26]
+ [EVIL_RAIN_NUMBER:26]
+ [GENERATE_DIVINE_MATERIALS:1]
+ [GOOD_SQ_COUNTS:100:1000:2000]
+ [EVIL_SQ_COUNTS:100:1000:2000]
+ [PEAK_NUMBER_MIN:50]
+ [PARTIAL_OCEAN_EDGE_MIN:2]
+ [COMPLETE_OCEAN_EDGE_MIN:0]
+ [VOLCANO_MIN:15]
+ [REGION_COUNTS:SWAMP:1032:7:6]
+ [REGION_COUNTS:DESERT:1032:7:6]
+ [REGION_COUNTS:FOREST:4128:13:12]
+ [REGION_COUNTS:MOUNTAINS:8256:9:9]
+ [REGION_COUNTS:OCEAN:8256:7:6]
+ [REGION_COUNTS:GLACIER:0:0:0]
+ [REGION_COUNTS:TUNDRA:0:0:0]
+ [REGION_COUNTS:GRASSLAND:8256:13:12]
+ [REGION_COUNTS:HILLS:8256:13:12]
+ [EROSION_CYCLE_COUNT:250]
+ [RIVER_MINS:400:400]
+ [PERIODICALLY_ERODE_EXTREMES:1]
+ [OROGRAPHIC_PRECIPITATION:1]
+ [SUBREGION_MAX:2750]
+ [CAVERN_LAYER_COUNT:3]
+ [CAVERN_LAYER_OPENNESS_MIN:0]
+ [CAVERN_LAYER_OPENNESS_MAX:100]
+ [CAVERN_LAYER_PASSAGE_DENSITY_MIN:0]
+ [CAVERN_LAYER_PASSAGE_DENSITY_MAX:100]
+ [CAVERN_LAYER_WATER_MIN:0]
+ [CAVERN_LAYER_WATER_MAX:100]
+ [HAVE_BOTTOM_LAYER_1:1]
+ [HAVE_BOTTOM_LAYER_2:1]
+ [LEVELS_ABOVE_GROUND:15]
+ [LEVELS_ABOVE_LAYER_1:5]
+ [LEVELS_ABOVE_LAYER_2:1]
+ [LEVELS_ABOVE_LAYER_3:1]
+ [LEVELS_ABOVE_LAYER_4:1]
+ [LEVELS_ABOVE_LAYER_5:2]
+ [LEVELS_AT_BOTTOM:1]
+ [CAVE_MIN_SIZE:5]
+ [CAVE_MAX_SIZE:25]
+ [MOUNTAIN_CAVE_MIN:100]
+ [NON_MOUNTAIN_CAVE_MIN:200]
+ [ALL_CAVES_VISIBLE:0]
+ [SHOW_EMBARK_TUNNEL:2]
+ [TOTAL_CIV_NUMBER:40]
+ [TOTAL_CIV_POPULATION:15000]
+ [SITE_CAP:1500]
+ [PLAYABLE_CIVILIZATION_REQUIRED:1]
+ [ELEVATION_RANGES:8256:16512:8256]
+ [RAIN_RANGES:8256:16512:8256]
+ [DRAINAGE_RANGES:8256:16512:8256]
+ [SAVAGERY_RANGES:8256:16512:8256]
+ [VOLCANISM_RANGES:8256:16512:8256]
+
+[WORLD_GEN]
+ [TITLE:MEDIUM ISLAND]
+ [DIM:129:129]
+ [EMBARK_POINTS:1504]
+ [END_YEAR:1050]
+ [BEAST_END_YEAR:200:80]
+ [REVEAL_ALL_HISTORY:1]
+ [CULL_HISTORICAL_FIGURES:0]
+ [ELEVATION:1:400:1600:1600]
+ [RAINFALL:0:100:200:200]
+ [TEMPERATURE:25:75:200:200]
+ [DRAINAGE:0:100:200:200]
+ [VOLCANISM:0:100:200:200]
+ [SAVAGERY:0:100:200:200]
+ [ELEVATION_FREQUENCY:4:2:0:1:0:1]
+ [RAIN_FREQUENCY:1:1:1:1:1:1]
+ [DRAINAGE_FREQUENCY:1:1:1:1:1:1]
+ [TEMPERATURE_FREQUENCY:1:1:1:1:1:1]
+ [SAVAGERY_FREQUENCY:1:1:1:1:1:1]
+ [VOLCANISM_FREQUENCY:1:1:1:1:1:1]
+ [POLE:NORTH_AND_OR_SOUTH]
+ [MINERAL_SCARCITY:2500]
+ [MEGABEAST_CAP:18]
+ [SEMIMEGABEAST_CAP:37]
+ [TITAN_NUMBER:9]
+ [TITAN_ATTACK_TRIGGER:80:0:100000]
+ [DEMON_NUMBER:28]
+ [NIGHT_TROLL_NUMBER:14]
+ [BOGEYMAN_NUMBER:14]
+ [VAMPIRE_NUMBER:14]
+ [WEREBEAST_NUMBER:14]
+ [SECRET_NUMBER:28]
+ [REGIONAL_INTERACTION_NUMBER:28]
+ [DISTURBANCE_INTERACTION_NUMBER:28]
+ [EVIL_CLOUD_NUMBER:14]
+ [EVIL_RAIN_NUMBER:14]
+ [GENERATE_DIVINE_MATERIALS:1]
+ [GOOD_SQ_COUNTS:6:63:0]
+ [EVIL_SQ_COUNTS:6:63:0]
+ [PEAK_NUMBER_MIN:3]
+ [PARTIAL_OCEAN_EDGE_MIN:0]
+ [COMPLETE_OCEAN_EDGE_MIN:4]
+ [VOLCANO_MIN:1]
+ [REGION_COUNTS:SWAMP:66:0:0]
+ [REGION_COUNTS:DESERT:66:0:0]
+ [REGION_COUNTS:FOREST:264:0:0]
+ [REGION_COUNTS:MOUNTAINS:528:0:0]
+ [REGION_COUNTS:OCEAN:528:0:0]
+ [REGION_COUNTS:GLACIER:16:0:0]
+ [REGION_COUNTS:TUNDRA:33:0:0]
+ [REGION_COUNTS:GRASSLAND:528:0:0]
+ [REGION_COUNTS:HILLS:528:0:0]
+ [EROSION_CYCLE_COUNT:250]
+ [RIVER_MINS:25:25]
+ [PERIODICALLY_ERODE_EXTREMES:1]
+ [OROGRAPHIC_PRECIPITATION:1]
+ [SUBREGION_MAX:2750]
+ [CAVERN_LAYER_COUNT:3]
+ [CAVERN_LAYER_OPENNESS_MIN:0]
+ [CAVERN_LAYER_OPENNESS_MAX:100]
+ [CAVERN_LAYER_PASSAGE_DENSITY_MIN:0]
+ [CAVERN_LAYER_PASSAGE_DENSITY_MAX:100]
+ [CAVERN_LAYER_WATER_MIN:0]
+ [CAVERN_LAYER_WATER_MAX:100]
+ [HAVE_BOTTOM_LAYER_1:1]
+ [HAVE_BOTTOM_LAYER_2:1]
+ [LEVELS_ABOVE_GROUND:15]
+ [LEVELS_ABOVE_LAYER_1:5]
+ [LEVELS_ABOVE_LAYER_2:1]
+ [LEVELS_ABOVE_LAYER_3:1]
+ [LEVELS_ABOVE_LAYER_4:1]
+ [LEVELS_ABOVE_LAYER_5:2]
+ [LEVELS_AT_BOTTOM:1]
+ [CAVE_MIN_SIZE:5]
+ [CAVE_MAX_SIZE:25]
+ [MOUNTAIN_CAVE_MIN:15]
+ [NON_MOUNTAIN_CAVE_MIN:25]
+ [ALL_CAVES_VISIBLE:0]
+ [SHOW_EMBARK_TUNNEL:2]
+ [TOTAL_CIV_NUMBER:40]
+ [TOTAL_CIV_POPULATION:15000]
+ [SITE_CAP:1040]
+ [PLAYABLE_CIVILIZATION_REQUIRED:1]
+ [ELEVATION_RANGES:8000:1056:528]
+ [RAIN_RANGES:528:1056:528]
+ [DRAINAGE_RANGES:528:1056:528]
+ [SAVAGERY_RANGES:528:1056:528]
+ [VOLCANISM_RANGES:528:1056:528]
+
+[WORLD_GEN]
+ [TITLE:MEDIUM REGION]
+ [DIM:129:129]
+ [EMBARK_POINTS:1504]
+ [END_YEAR:1050]
+ [BEAST_END_YEAR:200:80]
+ [REVEAL_ALL_HISTORY:1]
+ [CULL_HISTORICAL_FIGURES:0]
+ [ELEVATION:1:400:401:401]
+ [RAINFALL:0:100:200:200]
+ [TEMPERATURE:25:75:200:200]
+ [DRAINAGE:0:100:200:200]
+ [VOLCANISM:0:100:200:200]
+ [SAVAGERY:0:100:200:200]
+ [ELEVATION_FREQUENCY:1:1:1:1:1:1]
+ [RAIN_FREQUENCY:1:1:1:1:1:1]
+ [DRAINAGE_FREQUENCY:1:1:1:1:1:1]
+ [TEMPERATURE_FREQUENCY:1:1:1:1:1:1]
+ [SAVAGERY_FREQUENCY:1:1:1:1:1:1]
+ [VOLCANISM_FREQUENCY:1:1:1:1:1:1]
+ [POLE:NORTH_AND_OR_SOUTH]
+ [MINERAL_SCARCITY:2500]
+ [MEGABEAST_CAP:18]
+ [SEMIMEGABEAST_CAP:37]
+ [TITAN_NUMBER:9]
+ [TITAN_ATTACK_TRIGGER:80:0:100000]
+ [DEMON_NUMBER:28]
+ [NIGHT_TROLL_NUMBER:14]
+ [BOGEYMAN_NUMBER:14]
+ [VAMPIRE_NUMBER:14]
+ [WEREBEAST_NUMBER:14]
+ [SECRET_NUMBER:28]
+ [REGIONAL_INTERACTION_NUMBER:28]
+ [DISTURBANCE_INTERACTION_NUMBER:28]
+ [EVIL_CLOUD_NUMBER:14]
+ [EVIL_RAIN_NUMBER:14]
+ [GENERATE_DIVINE_MATERIALS:1]
+ [GOOD_SQ_COUNTS:25:251:503]
+ [EVIL_SQ_COUNTS:25:251:503]
+ [PEAK_NUMBER_MIN:12]
+ [PARTIAL_OCEAN_EDGE_MIN:1]
+ [COMPLETE_OCEAN_EDGE_MIN:0]
+ [VOLCANO_MIN:3]
+ [REGION_COUNTS:SWAMP:260:1:1]
+ [REGION_COUNTS:DESERT:260:1:1]
+ [REGION_COUNTS:FOREST:1040:3:3]
+ [REGION_COUNTS:MOUNTAINS:2080:2:2]
+ [REGION_COUNTS:OCEAN:2080:1:1]
+ [REGION_COUNTS:GLACIER:0:0:0]
+ [REGION_COUNTS:TUNDRA:0:0:0]
+ [REGION_COUNTS:GRASSLAND:2080:3:3]
+ [REGION_COUNTS:HILLS:2080:3:3]
+ [EROSION_CYCLE_COUNT:250]
+ [RIVER_MINS:100:100]
+ [PERIODICALLY_ERODE_EXTREMES:1]
+ [OROGRAPHIC_PRECIPITATION:1]
+ [SUBREGION_MAX:2750]
+ [CAVERN_LAYER_COUNT:3]
+ [CAVERN_LAYER_OPENNESS_MIN:0]
+ [CAVERN_LAYER_OPENNESS_MAX:100]
+ [CAVERN_LAYER_PASSAGE_DENSITY_MIN:0]
+ [CAVERN_LAYER_PASSAGE_DENSITY_MAX:100]
+ [CAVERN_LAYER_WATER_MIN:0]
+ [CAVERN_LAYER_WATER_MAX:100]
+ [HAVE_BOTTOM_LAYER_1:1]
+ [HAVE_BOTTOM_LAYER_2:1]
+ [LEVELS_ABOVE_GROUND:15]
+ [LEVELS_ABOVE_LAYER_1:5]
+ [LEVELS_ABOVE_LAYER_2:1]
+ [LEVELS_ABOVE_LAYER_3:1]
+ [LEVELS_ABOVE_LAYER_4:1]
+ [LEVELS_ABOVE_LAYER_5:2]
+ [LEVELS_AT_BOTTOM:1]
+ [CAVE_MIN_SIZE:5]
+ [CAVE_MAX_SIZE:25]
+ [MOUNTAIN_CAVE_MIN:25]
+ [NON_MOUNTAIN_CAVE_MIN:50]
+ [ALL_CAVES_VISIBLE:0]
+ [SHOW_EMBARK_TUNNEL:2]
+ [TOTAL_CIV_NUMBER:40]
+ [TOTAL_CIV_POPULATION:15000]
+ [SITE_CAP:1040]
+ [PLAYABLE_CIVILIZATION_REQUIRED:1]
+ [ELEVATION_RANGES:2080:4160:2080]
+ [RAIN_RANGES:2080:4160:2080]
+ [DRAINAGE_RANGES:2080:4160:2080]
+ [SAVAGERY_RANGES:2080:4160:2080]
+ [VOLCANISM_RANGES:2080:4160:2080]
+
+[WORLD_GEN]
+ [TITLE:SMALL ISLAND]
+ [DIM:65:65]
+ [EMBARK_POINTS:1504]
+ [END_YEAR:1050]
+ [BEAST_END_YEAR:100:80]
+ [REVEAL_ALL_HISTORY:1]
+ [CULL_HISTORICAL_FIGURES:0]
+ [ELEVATION:1:400:800:800]
+ [RAINFALL:0:100:101:101]
+ [TEMPERATURE:25:75:101:101]
+ [DRAINAGE:0:100:101:101]
+ [VOLCANISM:0:100:101:101]
+ [SAVAGERY:0:100:101:101]
+ [ELEVATION_FREQUENCY:3:2:0:1:0:1]
+ [RAIN_FREQUENCY:1:1:1:1:1:1]
+ [DRAINAGE_FREQUENCY:1:1:1:1:1:1]
+ [TEMPERATURE_FREQUENCY:1:1:1:1:1:1]
+ [SAVAGERY_FREQUENCY:1:1:1:1:1:1]
+ [VOLCANISM_FREQUENCY:1:1:1:1:1:1]
+ [POLE:NORTH_AND_OR_SOUTH]
+ [MINERAL_SCARCITY:2500]
+ [MEGABEAST_CAP:4]
+ [SEMIMEGABEAST_CAP:9]
+ [TITAN_NUMBER:3]
+ [TITAN_ATTACK_TRIGGER:80:0:100000]
+ [DEMON_NUMBER:22]
+ [NIGHT_TROLL_NUMBER:11]
+ [BOGEYMAN_NUMBER:11]
+ [VAMPIRE_NUMBER:11]
+ [WEREBEAST_NUMBER:11]
+ [SECRET_NUMBER:22]
+ [REGIONAL_INTERACTION_NUMBER:22]
+ [DISTURBANCE_INTERACTION_NUMBER:22]
+ [EVIL_CLOUD_NUMBER:11]
+ [EVIL_RAIN_NUMBER:11]
+ [GENERATE_DIVINE_MATERIALS:1]
+ [GOOD_SQ_COUNTS:1:16:0]
+ [EVIL_SQ_COUNTS:1:16:0]
+ [PEAK_NUMBER_MIN:1]
+ [PARTIAL_OCEAN_EDGE_MIN:0]
+ [COMPLETE_OCEAN_EDGE_MIN:4]
+ [VOLCANO_MIN:1]
+ [REGION_COUNTS:SWAMP:0:0:0]
+ [REGION_COUNTS:DESERT:0:0:0]
+ [REGION_COUNTS:FOREST:0:0:0]
+ [REGION_COUNTS:MOUNTAINS:0:0:0]
+ [REGION_COUNTS:OCEAN:0:0:0]
+ [REGION_COUNTS:GLACIER:0:0:0]
+ [REGION_COUNTS:TUNDRA:0:0:0]
+ [REGION_COUNTS:GRASSLAND:0:0:0]
+ [REGION_COUNTS:HILLS:0:0:0]
+ [EROSION_CYCLE_COUNT:250]
+ [RIVER_MINS:5:5]
+ [PERIODICALLY_ERODE_EXTREMES:1]
+ [OROGRAPHIC_PRECIPITATION:1]
+ [SUBREGION_MAX:2750]
+ [CAVERN_LAYER_COUNT:3]
+ [CAVERN_LAYER_OPENNESS_MIN:0]
+ [CAVERN_LAYER_OPENNESS_MAX:100]
+ [CAVERN_LAYER_PASSAGE_DENSITY_MIN:0]
+ [CAVERN_LAYER_PASSAGE_DENSITY_MAX:100]
+ [CAVERN_LAYER_WATER_MIN:0]
+ [CAVERN_LAYER_WATER_MAX:100]
+ [HAVE_BOTTOM_LAYER_1:1]
+ [HAVE_BOTTOM_LAYER_2:1]
+ [LEVELS_ABOVE_GROUND:15]
+ [LEVELS_ABOVE_LAYER_1:5]
+ [LEVELS_ABOVE_LAYER_2:1]
+ [LEVELS_ABOVE_LAYER_3:1]
+ [LEVELS_ABOVE_LAYER_4:1]
+ [LEVELS_ABOVE_LAYER_5:2]
+ [LEVELS_AT_BOTTOM:1]
+ [CAVE_MIN_SIZE:5]
+ [CAVE_MAX_SIZE:25]
+ [MOUNTAIN_CAVE_MIN:4]
+ [NON_MOUNTAIN_CAVE_MIN:6]
+ [ALL_CAVES_VISIBLE:0]
+ [SHOW_EMBARK_TUNNEL:2]
+ [TOTAL_CIV_NUMBER:10]
+ [TOTAL_CIV_POPULATION:15000]
+ [SITE_CAP:264]
+ [PLAYABLE_CIVILIZATION_REQUIRED:1]
+ [ELEVATION_RANGES:136:272:136]
+ [RAIN_RANGES:0:0:0]
+ [DRAINAGE_RANGES:0:0:0]
+ [SAVAGERY_RANGES:0:0:0]
+ [VOLCANISM_RANGES:0:0:0]
+
+[WORLD_GEN]
+ [TITLE:SMALL REGION]
+ [DIM:65:65]
+ [EMBARK_POINTS:1504]
+ [END_YEAR:1050]
+ [BEAST_END_YEAR:100:80]
+ [REVEAL_ALL_HISTORY:1]
+ [CULL_HISTORICAL_FIGURES:0]
+ [ELEVATION:1:400:202:202]
+ [RAINFALL:0:100:101:101]
+ [TEMPERATURE:25:75:101:101]
+ [DRAINAGE:0:100:101:101]
+ [VOLCANISM:0:100:101:101]
+ [SAVAGERY:0:100:101:101]
+ [ELEVATION_FREQUENCY:1:1:1:1:1:1]
+ [RAIN_FREQUENCY:1:1:1:1:1:1]
+ [DRAINAGE_FREQUENCY:1:1:1:1:1:1]
+ [TEMPERATURE_FREQUENCY:1:1:1:1:1:1]
+ [SAVAGERY_FREQUENCY:1:1:1:1:1:1]
+ [VOLCANISM_FREQUENCY:1:1:1:1:1:1]
+ [POLE:NORTH_AND_OR_SOUTH]
+ [MINERAL_SCARCITY:2500]
+ [MEGABEAST_CAP:4]
+ [SEMIMEGABEAST_CAP:9]
+ [TITAN_NUMBER:3]
+ [TITAN_ATTACK_TRIGGER:80:0:100000]
+ [DEMON_NUMBER:22]
+ [NIGHT_TROLL_NUMBER:11]
+ [BOGEYMAN_NUMBER:11]
+ [VAMPIRE_NUMBER:11]
+ [WEREBEAST_NUMBER:11]
+ [SECRET_NUMBER:22]
+ [REGIONAL_INTERACTION_NUMBER:22]
+ [DISTURBANCE_INTERACTION_NUMBER:22]
+ [EVIL_CLOUD_NUMBER:11]
+ [EVIL_RAIN_NUMBER:11]
+ [GENERATE_DIVINE_MATERIALS:1]
+ [GOOD_SQ_COUNTS:6:63:127]
+ [EVIL_SQ_COUNTS:6:63:127]
+ [PEAK_NUMBER_MIN:3]
+ [PARTIAL_OCEAN_EDGE_MIN:1]
+ [COMPLETE_OCEAN_EDGE_MIN:0]
+ [VOLCANO_MIN:1]
+ [REGION_COUNTS:SWAMP:66:0:0]
+ [REGION_COUNTS:DESERT:66:0:0]
+ [REGION_COUNTS:FOREST:264:0:0]
+ [REGION_COUNTS:MOUNTAINS:528:0:0]
+ [REGION_COUNTS:OCEAN:528:0:0]
+ [REGION_COUNTS:GLACIER:0:0:0]
+ [REGION_COUNTS:TUNDRA:0:0:0]
+ [REGION_COUNTS:GRASSLAND:528:0:0]
+ [REGION_COUNTS:HILLS:528:0:0]
+ [EROSION_CYCLE_COUNT:250]
+ [RIVER_MINS:25:25]
+ [PERIODICALLY_ERODE_EXTREMES:1]
+ [OROGRAPHIC_PRECIPITATION:1]
+ [SUBREGION_MAX:2750]
+ [CAVERN_LAYER_COUNT:3]
+ [CAVERN_LAYER_OPENNESS_MIN:0]
+ [CAVERN_LAYER_OPENNESS_MAX:100]
+ [CAVERN_LAYER_PASSAGE_DENSITY_MIN:0]
+ [CAVERN_LAYER_PASSAGE_DENSITY_MAX:100]
+ [CAVERN_LAYER_WATER_MIN:0]
+ [CAVERN_LAYER_WATER_MAX:100]
+ [HAVE_BOTTOM_LAYER_1:1]
+ [HAVE_BOTTOM_LAYER_2:1]
+ [LEVELS_ABOVE_GROUND:15]
+ [LEVELS_ABOVE_LAYER_1:5]
+ [LEVELS_ABOVE_LAYER_2:1]
+ [LEVELS_ABOVE_LAYER_3:1]
+ [LEVELS_ABOVE_LAYER_4:1]
+ [LEVELS_ABOVE_LAYER_5:2]
+ [LEVELS_AT_BOTTOM:1]
+ [CAVE_MIN_SIZE:5]
+ [CAVE_MAX_SIZE:25]
+ [MOUNTAIN_CAVE_MIN:6]
+ [NON_MOUNTAIN_CAVE_MIN:12]
+ [ALL_CAVES_VISIBLE:0]
+ [SHOW_EMBARK_TUNNEL:2]
+ [TOTAL_CIV_NUMBER:10]
+ [TOTAL_CIV_POPULATION:15000]
+ [SITE_CAP:264]
+ [PLAYABLE_CIVILIZATION_REQUIRED:1]
+ [ELEVATION_RANGES:528:1056:528]
+ [RAIN_RANGES:264:528:264]
+ [DRAINAGE_RANGES:264:528:264]
+ [SAVAGERY_RANGES:264:528:264]
+ [VOLCANISM_RANGES:264:528:264]
+
+[WORLD_GEN]
+ [TITLE:SMALLER ISLAND]
+ [DIM:33:33]
+ [EMBARK_POINTS:1504]
+ [END_YEAR:1050]
+ [BEAST_END_YEAR:50:80]
+ [REVEAL_ALL_HISTORY:1]
+ [CULL_HISTORICAL_FIGURES:0]
+ [ELEVATION:1:400:401:401]
+ [RAINFALL:0:100:51:51]
+ [TEMPERATURE:25:75:51:51]
+ [DRAINAGE:0:100:51:51]
+ [VOLCANISM:0:100:51:51]
+ [SAVAGERY:0:100:51:51]
+ [ELEVATION_FREQUENCY:1:1:1:1:1:1]
+ [RAIN_FREQUENCY:1:1:1:1:1:1]
+ [DRAINAGE_FREQUENCY:1:1:1:1:1:1]
+ [TEMPERATURE_FREQUENCY:1:1:1:1:1:1]
+ [SAVAGERY_FREQUENCY:1:1:1:1:1:1]
+ [VOLCANISM_FREQUENCY:1:1:1:1:1:1]
+ [POLE:NORTH_OR_SOUTH]
+ [MINERAL_SCARCITY:2500]
+ [MEGABEAST_CAP:1]
+ [SEMIMEGABEAST_CAP:2]
+ [TITAN_NUMBER:1]
+ [TITAN_ATTACK_TRIGGER:80:0:100000]
+ [DEMON_NUMBER:20]
+ [NIGHT_TROLL_NUMBER:10]
+ [BOGEYMAN_NUMBER:10]
+ [VAMPIRE_NUMBER:10]
+ [WEREBEAST_NUMBER:10]
+ [SECRET_NUMBER:20]
+ [REGIONAL_INTERACTION_NUMBER:20]
+ [DISTURBANCE_INTERACTION_NUMBER:20]
+ [EVIL_CLOUD_NUMBER:10]
+ [EVIL_RAIN_NUMBER:10]
+ [GENERATE_DIVINE_MATERIALS:1]
+ [GOOD_SQ_COUNTS:1:0:0]
+ [EVIL_SQ_COUNTS:1:0:0]
+ [PEAK_NUMBER_MIN:1]
+ [PARTIAL_OCEAN_EDGE_MIN:0]
+ [COMPLETE_OCEAN_EDGE_MIN:4]
+ [VOLCANO_MIN:1]
+ [REGION_COUNTS:SWAMP:0:0:0]
+ [REGION_COUNTS:DESERT:0:0:0]
+ [REGION_COUNTS:FOREST:0:0:0]
+ [REGION_COUNTS:MOUNTAINS:0:0:0]
+ [REGION_COUNTS:OCEAN:0:0:0]
+ [REGION_COUNTS:GLACIER:0:0:0]
+ [REGION_COUNTS:TUNDRA:0:0:0]
+ [REGION_COUNTS:GRASSLAND:0:0:0]
+ [REGION_COUNTS:HILLS:0:0:0]
+ [EROSION_CYCLE_COUNT:250]
+ [RIVER_MINS:1:1]
+ [PERIODICALLY_ERODE_EXTREMES:1]
+ [OROGRAPHIC_PRECIPITATION:1]
+ [SUBREGION_MAX:2750]
+ [CAVERN_LAYER_COUNT:3]
+ [CAVERN_LAYER_OPENNESS_MIN:0]
+ [CAVERN_LAYER_OPENNESS_MAX:100]
+ [CAVERN_LAYER_PASSAGE_DENSITY_MIN:0]
+ [CAVERN_LAYER_PASSAGE_DENSITY_MAX:100]
+ [CAVERN_LAYER_WATER_MIN:0]
+ [CAVERN_LAYER_WATER_MAX:100]
+ [HAVE_BOTTOM_LAYER_1:1]
+ [HAVE_BOTTOM_LAYER_2:1]
+ [LEVELS_ABOVE_GROUND:15]
+ [LEVELS_ABOVE_LAYER_1:5]
+ [LEVELS_ABOVE_LAYER_2:1]
+ [LEVELS_ABOVE_LAYER_3:1]
+ [LEVELS_ABOVE_LAYER_4:1]
+ [LEVELS_ABOVE_LAYER_5:2]
+ [LEVELS_AT_BOTTOM:1]
+ [CAVE_MIN_SIZE:5]
+ [CAVE_MAX_SIZE:25]
+ [MOUNTAIN_CAVE_MIN:2]
+ [NON_MOUNTAIN_CAVE_MIN:3]
+ [ALL_CAVES_VISIBLE:0]
+ [SHOW_EMBARK_TUNNEL:2]
+ [TOTAL_CIV_NUMBER:10]
+ [TOTAL_CIV_POPULATION:15000]
+ [SITE_CAP:68]
+ [PLAYABLE_CIVILIZATION_REQUIRED:1]
+ [ELEVATION_RANGES:36:72:36]
+ [RAIN_RANGES:0:0:0]
+ [DRAINAGE_RANGES:0:0:0]
+ [SAVAGERY_RANGES:0:0:0]
+ [VOLCANISM_RANGES:0:0:0]
+
+[WORLD_GEN]
+ [TITLE:SMALLER REGION]
+ [DIM:33:33]
+ [EMBARK_POINTS:1504]
+ [END_YEAR:1050]
+ [BEAST_END_YEAR:50:80]
+ [REVEAL_ALL_HISTORY:1]
+ [CULL_HISTORICAL_FIGURES:0]
+ [ELEVATION:1:400:102:102]
+ [RAINFALL:0:100:51:51]
+ [TEMPERATURE:25:75:51:51]
+ [DRAINAGE:0:100:51:51]
+ [VOLCANISM:0:100:51:51]
+ [SAVAGERY:0:100:51:51]
+ [ELEVATION_FREQUENCY:1:1:1:1:1:1]
+ [RAIN_FREQUENCY:1:1:1:1:1:1]
+ [DRAINAGE_FREQUENCY:1:1:1:1:1:1]
+ [TEMPERATURE_FREQUENCY:1:1:1:1:1:1]
+ [SAVAGERY_FREQUENCY:1:1:1:1:1:1]
+ [VOLCANISM_FREQUENCY:1:1:1:1:1:1]
+ [POLE:NORTH_OR_SOUTH]
+ [MINERAL_SCARCITY:2500]
+ [MEGABEAST_CAP:1]
+ [SEMIMEGABEAST_CAP:2]
+ [TITAN_NUMBER:1]
+ [TITAN_ATTACK_TRIGGER:80:0:100000]
+ [DEMON_NUMBER:20]
+ [NIGHT_TROLL_NUMBER:10]
+ [BOGEYMAN_NUMBER:10]
+ [VAMPIRE_NUMBER:10]
+ [WEREBEAST_NUMBER:10]
+ [SECRET_NUMBER:20]
+ [REGIONAL_INTERACTION_NUMBER:20]
+ [DISTURBANCE_INTERACTION_NUMBER:20]
+ [EVIL_CLOUD_NUMBER:10]
+ [EVIL_RAIN_NUMBER:10]
+ [GENERATE_DIVINE_MATERIALS:1]
+ [GOOD_SQ_COUNTS:1:16:0]
+ [EVIL_SQ_COUNTS:1:16:0]
+ [PEAK_NUMBER_MIN:1]
+ [PARTIAL_OCEAN_EDGE_MIN:1]
+ [COMPLETE_OCEAN_EDGE_MIN:0]
+ [VOLCANO_MIN:1]
+ [REGION_COUNTS:SWAMP:0:0:0]
+ [REGION_COUNTS:DESERT:0:0:0]
+ [REGION_COUNTS:FOREST:0:0:0]
+ [REGION_COUNTS:MOUNTAINS:0:0:0]
+ [REGION_COUNTS:OCEAN:0:0:0]
+ [REGION_COUNTS:GLACIER:0:0:0]
+ [REGION_COUNTS:TUNDRA:0:0:0]
+ [REGION_COUNTS:GRASSLAND:0:0:0]
+ [REGION_COUNTS:HILLS:0:0:0]
+ [EROSION_CYCLE_COUNT:250]
+ [RIVER_MINS:6:6]
+ [PERIODICALLY_ERODE_EXTREMES:1]
+ [OROGRAPHIC_PRECIPITATION:1]
+ [SUBREGION_MAX:2750]
+ [CAVERN_LAYER_COUNT:3]
+ [CAVERN_LAYER_OPENNESS_MIN:0]
+ [CAVERN_LAYER_OPENNESS_MAX:100]
+ [CAVERN_LAYER_PASSAGE_DENSITY_MIN:0]
+ [CAVERN_LAYER_PASSAGE_DENSITY_MAX:100]
+ [CAVERN_LAYER_WATER_MIN:0]
+ [CAVERN_LAYER_WATER_MAX:100]
+ [HAVE_BOTTOM_LAYER_1:1]
+ [HAVE_BOTTOM_LAYER_2:1]
+ [LEVELS_ABOVE_GROUND:15]
+ [LEVELS_ABOVE_LAYER_1:5]
+ [LEVELS_ABOVE_LAYER_2:1]
+ [LEVELS_ABOVE_LAYER_3:1]
+ [LEVELS_ABOVE_LAYER_4:1]
+ [LEVELS_ABOVE_LAYER_5:2]
+ [LEVELS_AT_BOTTOM:1]
+ [CAVE_MIN_SIZE:5]
+ [CAVE_MAX_SIZE:25]
+ [MOUNTAIN_CAVE_MIN:1]
+ [NON_MOUNTAIN_CAVE_MIN:3]
+ [ALL_CAVES_VISIBLE:0]
+ [SHOW_EMBARK_TUNNEL:2]
+ [TOTAL_CIV_NUMBER:5]
+ [TOTAL_CIV_POPULATION:15000]
+ [SITE_CAP:68]
+ [PLAYABLE_CIVILIZATION_REQUIRED:1]
+ [ELEVATION_RANGES:136:272:136]
+ [RAIN_RANGES:0:0:0]
+ [DRAINAGE_RANGES:0:0:0]
+ [SAVAGERY_RANGES:0:0:0]
+ [VOLCANISM_RANGES:0:0:0]
+
+[WORLD_GEN]
+ [TITLE:POCKET ISLAND]
+ [DIM:17:17]
+ [EMBARK_POINTS:1504]
+ [END_YEAR:1050]
+ [BEAST_END_YEAR:30:80]
+ [REVEAL_ALL_HISTORY:1]
+ [CULL_HISTORICAL_FIGURES:0]
+ [ELEVATION:1:400:401:401]
+ [RAINFALL:0:100:26:26]
+ [TEMPERATURE:25:75:26:26]
+ [DRAINAGE:0:100:26:26]
+ [VOLCANISM:0:100:26:26]
+ [SAVAGERY:0:100:26:26]
+ [ELEVATION_FREQUENCY:1:1:1:1:1:1]
+ [RAIN_FREQUENCY:1:1:1:1:1:1]
+ [DRAINAGE_FREQUENCY:1:1:1:1:1:1]
+ [TEMPERATURE_FREQUENCY:1:1:1:1:1:1]
+ [SAVAGERY_FREQUENCY:1:1:1:1:1:1]
+ [VOLCANISM_FREQUENCY:1:1:1:1:1:1]
+ [POLE:NORTH_OR_SOUTH]
+ [MINERAL_SCARCITY:2500]
+ [MEGABEAST_CAP:1]
+ [SEMIMEGABEAST_CAP:2]
+ [TITAN_NUMBER:1]
+ [TITAN_ATTACK_TRIGGER:80:0:100000]
+ [DEMON_NUMBER:20]
+ [NIGHT_TROLL_NUMBER:10]
+ [BOGEYMAN_NUMBER:10]
+ [VAMPIRE_NUMBER:10]
+ [WEREBEAST_NUMBER:10]
+ [SECRET_NUMBER:20]
+ [REGIONAL_INTERACTION_NUMBER:20]
+ [DISTURBANCE_INTERACTION_NUMBER:20]
+ [EVIL_CLOUD_NUMBER:10]
+ [EVIL_RAIN_NUMBER:10]
+ [GENERATE_DIVINE_MATERIALS:1]
+ [GOOD_SQ_COUNTS:1:0:0]
+ [EVIL_SQ_COUNTS:1:0:0]
+ [PEAK_NUMBER_MIN:1]
+ [PARTIAL_OCEAN_EDGE_MIN:0]
+ [COMPLETE_OCEAN_EDGE_MIN:4]
+ [VOLCANO_MIN:1]
+ [REGION_COUNTS:SWAMP:0:0:0]
+ [REGION_COUNTS:DESERT:0:0:0]
+ [REGION_COUNTS:FOREST:0:0:0]
+ [REGION_COUNTS:MOUNTAINS:0:0:0]
+ [REGION_COUNTS:OCEAN:0:0:0]
+ [REGION_COUNTS:GLACIER:0:0:0]
+ [REGION_COUNTS:TUNDRA:0:0:0]
+ [REGION_COUNTS:GRASSLAND:0:0:0]
+ [REGION_COUNTS:HILLS:0:0:0]
+ [EROSION_CYCLE_COUNT:10]
+ [RIVER_MINS:1:1]
+ [PERIODICALLY_ERODE_EXTREMES:1]
+ [OROGRAPHIC_PRECIPITATION:1]
+ [SUBREGION_MAX:2750]
+ [CAVERN_LAYER_COUNT:3]
+ [CAVERN_LAYER_OPENNESS_MIN:0]
+ [CAVERN_LAYER_OPENNESS_MAX:100]
+ [CAVERN_LAYER_PASSAGE_DENSITY_MIN:0]
+ [CAVERN_LAYER_PASSAGE_DENSITY_MAX:100]
+ [CAVERN_LAYER_WATER_MIN:0]
+ [CAVERN_LAYER_WATER_MAX:100]
+ [HAVE_BOTTOM_LAYER_1:1]
+ [HAVE_BOTTOM_LAYER_2:1]
+ [LEVELS_ABOVE_GROUND:15]
+ [LEVELS_ABOVE_LAYER_1:5]
+ [LEVELS_ABOVE_LAYER_2:1]
+ [LEVELS_ABOVE_LAYER_3:1]
+ [LEVELS_ABOVE_LAYER_4:1]
+ [LEVELS_ABOVE_LAYER_5:2]
+ [LEVELS_AT_BOTTOM:1]
+ [CAVE_MIN_SIZE:5]
+ [CAVE_MAX_SIZE:25]
+ [MOUNTAIN_CAVE_MIN:1]
+ [NON_MOUNTAIN_CAVE_MIN:2]
+ [ALL_CAVES_VISIBLE:0]
+ [SHOW_EMBARK_TUNNEL:2]
+ [TOTAL_CIV_NUMBER:5]
+ [TOTAL_CIV_POPULATION:15000]
+ [SITE_CAP:18]
+ [PLAYABLE_CIVILIZATION_REQUIRED:1]
+ [ELEVATION_RANGES:36:72:36]
+ [RAIN_RANGES:0:0:0]
+ [DRAINAGE_RANGES:0:0:0]
+ [SAVAGERY_RANGES:0:0:0]
+ [VOLCANISM_RANGES:0:0:0]
+
+[WORLD_GEN]
+ [TITLE:POCKET REGION]
+ [DIM:17:17]
+ [EMBARK_POINTS:1504]
+ [END_YEAR:1050]
+ [BEAST_END_YEAR:30:80]
+ [REVEAL_ALL_HISTORY:1]
+ [CULL_HISTORICAL_FIGURES:0]
+ [ELEVATION:1:400:52:52]
+ [RAINFALL:0:100:26:26]
+ [TEMPERATURE:25:75:26:26]
+ [DRAINAGE:0:100:26:26]
+ [VOLCANISM:0:100:26:26]
+ [SAVAGERY:0:100:26:26]
+ [ELEVATION_FREQUENCY:1:1:1:1:1:1]
+ [RAIN_FREQUENCY:1:1:1:1:1:1]
+ [DRAINAGE_FREQUENCY:1:1:1:1:1:1]
+ [TEMPERATURE_FREQUENCY:1:1:1:1:1:1]
+ [SAVAGERY_FREQUENCY:1:1:1:1:1:1]
+ [VOLCANISM_FREQUENCY:1:1:1:1:1:1]
+ [POLE:NORTH_OR_SOUTH]
+ [MINERAL_SCARCITY:2500]
+ [MEGABEAST_CAP:1]
+ [SEMIMEGABEAST_CAP:2]
+ [TITAN_NUMBER:1]
+ [TITAN_ATTACK_TRIGGER:80:0:100000]
+ [DEMON_NUMBER:20]
+ [NIGHT_TROLL_NUMBER:10]
+ [BOGEYMAN_NUMBER:10]
+ [VAMPIRE_NUMBER:10]
+ [WEREBEAST_NUMBER:10]
+ [SECRET_NUMBER:20]
+ [REGIONAL_INTERACTION_NUMBER:20]
+ [DISTURBANCE_INTERACTION_NUMBER:20]
+ [EVIL_CLOUD_NUMBER:10]
+ [EVIL_RAIN_NUMBER:10]
+ [GENERATE_DIVINE_MATERIALS:1]
+ [GOOD_SQ_COUNTS:1:0:0]
+ [EVIL_SQ_COUNTS:1:0:0]
+ [PEAK_NUMBER_MIN:1]
+ [PARTIAL_OCEAN_EDGE_MIN:1]
+ [COMPLETE_OCEAN_EDGE_MIN:0]
+ [VOLCANO_MIN:1]
+ [REGION_COUNTS:SWAMP:0:0:0]
+ [REGION_COUNTS:DESERT:0:0:0]
+ [REGION_COUNTS:FOREST:0:0:0]
+ [REGION_COUNTS:MOUNTAINS:0:0:0]
+ [REGION_COUNTS:OCEAN:0:0:0]
+ [REGION_COUNTS:GLACIER:0:0:0]
+ [REGION_COUNTS:TUNDRA:0:0:0]
+ [REGION_COUNTS:GRASSLAND:0:0:0]
+ [REGION_COUNTS:HILLS:0:0:0]
+ [EROSION_CYCLE_COUNT:250]
+ [RIVER_MINS:1:1]
+ [PERIODICALLY_ERODE_EXTREMES:1]
+ [OROGRAPHIC_PRECIPITATION:1]
+ [SUBREGION_MAX:2750]
+ [CAVERN_LAYER_COUNT:3]
+ [CAVERN_LAYER_OPENNESS_MIN:0]
+ [CAVERN_LAYER_OPENNESS_MAX:100]
+ [CAVERN_LAYER_PASSAGE_DENSITY_MIN:0]
+ [CAVERN_LAYER_PASSAGE_DENSITY_MAX:100]
+ [CAVERN_LAYER_WATER_MIN:0]
+ [CAVERN_LAYER_WATER_MAX:100]
+ [HAVE_BOTTOM_LAYER_1:1]
+ [HAVE_BOTTOM_LAYER_2:1]
+ [LEVELS_ABOVE_GROUND:15]
+ [LEVELS_ABOVE_LAYER_1:5]
+ [LEVELS_ABOVE_LAYER_2:1]
+ [LEVELS_ABOVE_LAYER_3:1]
+ [LEVELS_ABOVE_LAYER_4:1]
+ [LEVELS_ABOVE_LAYER_5:2]
+ [LEVELS_AT_BOTTOM:1]
+ [CAVE_MIN_SIZE:5]
+ [CAVE_MAX_SIZE:25]
+ [MOUNTAIN_CAVE_MIN:1]
+ [NON_MOUNTAIN_CAVE_MIN:2]
+ [ALL_CAVES_VISIBLE:0]
+ [SHOW_EMBARK_TUNNEL:2]
+ [TOTAL_CIV_NUMBER:5]
+ [TOTAL_CIV_POPULATION:15000]
+ [SITE_CAP:18]
+ [PLAYABLE_CIVILIZATION_REQUIRED:1]
+ [ELEVATION_RANGES:36:72:36]
+ [RAIN_RANGES:0:0:0]
+ [DRAINAGE_RANGES:0:0:0]
+ [SAVAGERY_RANGES:0:0:0]
+ [VOLCANISM_RANGES:0:0:0]
+
diff --git a/data/initial_movies/bay12games.cmv b/data/initial_movies/bay12games.cmv
new file mode 100755
index 0000000..47d5b3f
--- /dev/null
+++ b/data/initial_movies/bay12games.cmv
Binary files differ
diff --git a/data/initial_movies/dwarf_fortress.cmv b/data/initial_movies/dwarf_fortress.cmv
new file mode 100755
index 0000000..68ce615
--- /dev/null
+++ b/data/initial_movies/dwarf_fortress.cmv
Binary files differ
diff --git a/data/initial_movies/toadyone.cmv b/data/initial_movies/toadyone.cmv
new file mode 100755
index 0000000..a7761a5
--- /dev/null
+++ b/data/initial_movies/toadyone.cmv
Binary files differ
diff --git a/data/shader.fs b/data/shader.fs
new file mode 100755
index 0000000..a79c8fd
--- /dev/null
+++ b/data/shader.fs
@@ -0,0 +1,20 @@
+#version 140
+// -*- mode: C -*-
+// Defines emitted by gridrectst::init_gl at load:
+// dimx, dimy: Grid size of the screen array
+// dispx, dispy: Grid-cell (font) size
+// vec4 colors[16]: Color palette; first non-bold, then bold
+
+out vec4 gl_FragColor;
+
+flat in vec4 frontColor;
+flat in vec4 backColor;
+
+smooth in vec2 texCoords;
+uniform sampler2D textures;
+
+void main() {
+ vec4 texColor = texture2D(textures, texCoords);
+
+ gl_FragColor = mix(backColor, frontColor * texColor, texColor.a);
+}
diff --git a/data/shader.vs b/data/shader.vs
new file mode 100755
index 0000000..8ce286e
--- /dev/null
+++ b/data/shader.vs
@@ -0,0 +1,69 @@
+#version 140 // -*- mode: C -*-
+// Defines emitted by gridrectst::init_gl at load:
+// dimx, dimy: Grid size of the screen array
+// dispx, dispy: Grid-cell (font) size
+// vec4 colors[16]: Color palette; first non-bold, then bold
+#ifdef GRAPHICS
+// offset_texpos, offset_addcolor, offset_grayscale, offset_cf, offset_cbr:
+// offsets of the corresponding graphicst arrays in data
+#endif
+
+uniform usamplerBuffer data;
+uniform samplerBuffer coords;
+uniform isamplerBuffer fontmap;
+
+uniform uint frame; // Counts up from 0
+
+in vec4 gl_Vertex;
+in int gl_VertexID;
+
+flat out vec4 frontColor;
+flat out vec4 backColor;
+smooth out vec2 texCoords;
+
+void main() {
+ int tile = gl_VertexID / 6;
+ int offset_tile = tile * 4;
+
+ int ch = int(texelFetch(data, offset_tile).a);
+ int fg = int(texelFetch(data, offset_tile+1).a);
+ int bg = int(texelFetch(data, offset_tile+2).a);
+ int bold = clamp(int(texelFetch(data, offset_tile+3).a), 0, 1);
+
+#ifdef GRAPHICS
+ uint texpos = texelFetch(data, offset_texpos + offset_tile).a;
+ texpos += texelFetch(data, offset_texpos + offset_tile + 1).a * 256u;
+ texpos += texelFetch(data, offset_texpos + offset_tile + 2).a * 65536u;
+ texpos += texelFetch(data, offset_texpos + offset_tile + 3).a * 16777216u;
+ uint addcolor = texelFetch(data, offset_addcolor + offset_tile).a;
+ uint grayscale = texelFetch(data, offset_grayscale + offset_tile).a;
+ uint cf = texelFetch(data, offset_cf + offset_tile).a;
+ uint cbr = texelFetch(data, offset_cbr + offset_tile).a;
+
+
+ vec4 tex_square;
+ if (texpos != 0u && ch != 0) {
+ tex_square = texelFetch(coords, int(texpos));
+ if (grayscale != 0u) {
+ frontColor = colors[int(cf + cbr * 8u)];
+ } else if (addcolor != 0u) {
+ frontColor = colors[fg + bold * 8];
+ } else {
+ frontColor = vec4(1);
+ }
+ } else {
+ tex_square = texelFetch(coords, texelFetch(fontmap, ch).a);
+ frontColor = colors[fg + bold * 8];
+ }
+#else
+ vec4 tex_square = texelFetch(coords, texelFetch(fontmap, ch).a);
+ frontColor = colors[fg + bold * 8];
+#endif
+
+ vec2 coords[6] = vec2[](tex_square.sq, tex_square.tq, tex_square.tp,
+ tex_square.sq, tex_square.tp, tex_square.sp);
+ texCoords = coords[gl_VertexID % 6];
+
+ gl_Position = gl_Vertex;
+ backColor = colors[bg];
+}
diff --git a/data/sound/DFINTRO.ogg b/data/sound/DFINTRO.ogg
new file mode 100755
index 0000000..0ad2f4f
--- /dev/null
+++ b/data/sound/DFINTRO.ogg
Binary files differ
diff --git a/data/sound/DFINTROEND.ogg b/data/sound/DFINTROEND.ogg
new file mode 100755
index 0000000..7100dd2
--- /dev/null
+++ b/data/sound/DFINTROEND.ogg
Binary files differ
diff --git a/data/sound/DFPICK.ogg b/data/sound/DFPICK.ogg
new file mode 100755
index 0000000..d96da79
--- /dev/null
+++ b/data/sound/DFPICK.ogg
Binary files differ
diff --git a/data/sound/DFRUBBLE.ogg b/data/sound/DFRUBBLE.ogg
new file mode 100755
index 0000000..d33e859
--- /dev/null
+++ b/data/sound/DFRUBBLE.ogg
Binary files differ
diff --git a/data/sound/baybeyond.ogg b/data/sound/baybeyond.ogg
new file mode 100755
index 0000000..984ebf1
--- /dev/null
+++ b/data/sound/baybeyond.ogg
Binary files differ
diff --git a/data/sound/bayend.ogg b/data/sound/bayend.ogg
new file mode 100755
index 0000000..91d6096
--- /dev/null
+++ b/data/sound/bayend.ogg
Binary files differ
diff --git a/data/sound/bayquality.ogg b/data/sound/bayquality.ogg
new file mode 100755
index 0000000..a52f2ca
--- /dev/null
+++ b/data/sound/bayquality.ogg
Binary files differ
diff --git a/data/sound/baystart.ogg b/data/sound/baystart.ogg
new file mode 100755
index 0000000..06ae493
--- /dev/null
+++ b/data/sound/baystart.ogg
Binary files differ
diff --git a/data/sound/song_game.ogg b/data/sound/song_game.ogg
new file mode 100755
index 0000000..16b85f6
--- /dev/null
+++ b/data/sound/song_game.ogg
Binary files differ
diff --git a/data/sound/song_title.ogg b/data/sound/song_title.ogg
new file mode 100755
index 0000000..bff717c
--- /dev/null
+++ b/data/sound/song_title.ogg
Binary files differ
diff --git a/data/speech/ab_specific_hf_seeker.txt b/data/speech/ab_specific_hf_seeker.txt
new file mode 100755
index 0000000..ceb576d
--- /dev/null
+++ b/data/speech/ab_specific_hf_seeker.txt
@@ -0,0 +1 @@
+seek out [CONTEXT:HIST_FIG:TRANS_NAME] at [CONTEXT:ABSTRACT_BUILDING:TRANS_NAME] over in [CONTEXT:SITE:TRANS_NAME] \ No newline at end of file
diff --git a/data/speech/animal_slayer.txt b/data/speech/animal_slayer.txt
new file mode 100755
index 0000000..e3df61a
--- /dev/null
+++ b/data/speech/animal_slayer.txt
@@ -0,0 +1 @@
+I have taken down [CONTEXT:NUMBER] [CONTEXT:RACE:NUMBERED_NAME] while stalking [CONTEXT:PLACE:TRANS_NAME]. \ No newline at end of file
diff --git a/data/speech/arch_info_justification.txt b/data/speech/arch_info_justification.txt
new file mode 100755
index 0000000..7b4f8e3
--- /dev/null
+++ b/data/speech/arch_info_justification.txt
@@ -0,0 +1 @@
+It is said that the [CONTEXT:ARCH_ELEMENT] of [CONTEXT:ABSTRACT_BUILDING:TRANS_NAME] [CONTEXT:JUSTIFICATION] [CONTEXT:DEF_SPHERE] for the glory of [CONTEXT:HIST_FIG:TRANS_NAME]. \ No newline at end of file
diff --git a/data/speech/child_age_proclamation.txt b/data/speech/child_age_proclamation.txt
new file mode 100755
index 0000000..9975001
--- /dev/null
+++ b/data/speech/child_age_proclamation.txt
@@ -0,0 +1 @@
+I'm [CONTEXT:NUMBER]! \ No newline at end of file
diff --git a/data/speech/current_profession_no_year.txt b/data/speech/current_profession_no_year.txt
new file mode 100755
index 0000000..556a1b2
--- /dev/null
+++ b/data/speech/current_profession_no_year.txt
@@ -0,0 +1 @@
+I am a [CONTEXT:UNIT_NAME]. \ No newline at end of file
diff --git a/data/speech/current_profession_year.txt b/data/speech/current_profession_year.txt
new file mode 100755
index 0000000..1dc2ae9
--- /dev/null
+++ b/data/speech/current_profession_year.txt
@@ -0,0 +1 @@
+This is my [CONTEXT:ORDINAL] year as a [CONTEXT:UNIT_NAME]. \ No newline at end of file
diff --git a/data/speech/curse.txt b/data/speech/curse.txt
new file mode 100755
index 0000000..ad859c8
--- /dev/null
+++ b/data/speech/curse.txt
@@ -0,0 +1 @@
+Who dares to enter my house? I curse you! \ No newline at end of file
diff --git a/data/speech/dwarf.txt b/data/speech/dwarf.txt
new file mode 100755
index 0000000..25dc829
--- /dev/null
+++ b/data/speech/dwarf.txt
@@ -0,0 +1,7 @@
+who was too short to live
+who tunneled away from me like a frightened mole
+who sucked plump helmets like a purring maggot
+whose hammer shattered on the anvil of my power
+who forged [PRO_POS] own doom by challenging me
+who was returned to the rock and muck from which it was spawned
+whose tall tales of bravery were all the more embarrassing because of [PRO_POS] height \ No newline at end of file
diff --git a/data/speech/elf.txt b/data/speech/elf.txt
new file mode 100755
index 0000000..22bf157
--- /dev/null
+++ b/data/speech/elf.txt
@@ -0,0 +1,5 @@
+whom was felled like a slender sapling
+whom I sent back to the home-tree as fertilizer
+whose fragile bones shattered before the power of my contempt
+who came down from the home-tree and was devoured
+who should have stayed in the trees when the real elves came down to fight \ No newline at end of file
diff --git a/data/speech/family_relationship_additional.txt b/data/speech/family_relationship_additional.txt
new file mode 100755
index 0000000..63a8008
--- /dev/null
+++ b/data/speech/family_relationship_additional.txt
@@ -0,0 +1 @@
+[CONTEXT:HIST_FIG:PRO_SUB] is also my [CONTEXT:FAMILY_RELATIONSHIP] \ No newline at end of file
diff --git a/data/speech/family_relationship_additional_dead.txt b/data/speech/family_relationship_additional_dead.txt
new file mode 100755
index 0000000..8d01e0e
--- /dev/null
+++ b/data/speech/family_relationship_additional_dead.txt
@@ -0,0 +1 @@
+[CONTEXT:HIST_FIG:PRO_SUB] was also my [CONTEXT:FAMILY_RELATIONSHIP] \ No newline at end of file
diff --git a/data/speech/family_relationship_no_spec.txt b/data/speech/family_relationship_no_spec.txt
new file mode 100755
index 0000000..21e5229
--- /dev/null
+++ b/data/speech/family_relationship_no_spec.txt
@@ -0,0 +1 @@
+I have [CONTEXT:INDEF_FAMILY_RELATIONSHIP] named [CONTEXT:HIST_FIG:TRANS_NAME] \ No newline at end of file
diff --git a/data/speech/family_relationship_no_spec_dead.txt b/data/speech/family_relationship_no_spec_dead.txt
new file mode 100755
index 0000000..3ab5414
--- /dev/null
+++ b/data/speech/family_relationship_no_spec_dead.txt
@@ -0,0 +1 @@
+I had [CONTEXT:INDEF_FAMILY_RELATIONSHIP] named [CONTEXT:HIST_FIG:TRANS_NAME] \ No newline at end of file
diff --git a/data/speech/family_relationship_spec.txt b/data/speech/family_relationship_spec.txt
new file mode 100755
index 0000000..068efde
--- /dev/null
+++ b/data/speech/family_relationship_spec.txt
@@ -0,0 +1 @@
+my [CONTEXT:FAMILY_RELATIONSHIP] is named [CONTEXT:HIST_FIG:TRANS_NAME] \ No newline at end of file
diff --git a/data/speech/family_relationship_spec_dead.txt b/data/speech/family_relationship_spec_dead.txt
new file mode 100755
index 0000000..8f51f4b
--- /dev/null
+++ b/data/speech/family_relationship_spec_dead.txt
@@ -0,0 +1 @@
+my [CONTEXT:FAMILY_RELATIONSHIP] was named [CONTEXT:HIST_FIG:TRANS_NAME] \ No newline at end of file
diff --git a/data/speech/general.txt b/data/speech/general.txt
new file mode 100755
index 0000000..03f8abf
--- /dev/null
+++ b/data/speech/general.txt
@@ -0,0 +1,7 @@
+whose cries for mercy went unheeded by my wrath
+whose insignificant name I struggle to recall
+a spineless slug whom was crushed under my might
+whom I buried alive under a mountain of hatred
+who lies dead, now only an embarrassing memory
+who sought my praise, only to be rejected in death
+once revered by those who didn't know any better
diff --git a/data/speech/goodbye_worship_1.txt b/data/speech/goodbye_worship_1.txt
new file mode 100755
index 0000000..5cef33c
--- /dev/null
+++ b/data/speech/goodbye_worship_1.txt
@@ -0,0 +1,14 @@
+upon arising in the mornings,
+when going on a long journey,
+before retiring in the evening,
+as sure as I am here now,
+and lo,
+it cannot be said enough;
+these are dangerous times, so
+I say again
+yes,
+before every meal,
+whenever the tide turns,
+when you return to this place,
+when you arrive at your destination,
+at this juncture in your life, \ No newline at end of file
diff --git a/data/speech/goodbye_worship_2.txt b/data/speech/goodbye_worship_2.txt
new file mode 100755
index 0000000..b9d4a0b
--- /dev/null
+++ b/data/speech/goodbye_worship_2.txt
@@ -0,0 +1,11 @@
+don't forget to
+always remember to
+it would be wise to
+you should
+you must
+prudence demands that you
+even for a moment
+follow my advice and
+heed my words and
+remember to
+show devotion and \ No newline at end of file
diff --git a/data/speech/goodbye_worship_3.txt b/data/speech/goodbye_worship_3.txt
new file mode 100755
index 0000000..44fe569
--- /dev/null
+++ b/data/speech/goodbye_worship_3.txt
@@ -0,0 +1,12 @@
+speak the praises of [SPEAKER:HF_LINK:DEITY:TRANS_NAME]
+speak the praises of [SPEAKER:HF_LINK:DEITY:RANDOM_DEF_SPHERE]
+go with [SPEAKER:HF_LINK:DEITY:TRANS_NAME]
+go with [SPEAKER:HF_LINK:DEITY:RANDOM_DEF_SPHERE]
+put your faith in [SPEAKER:HF_LINK:DEITY:TRANS_NAME]
+put your faith in [SPEAKER:HF_LINK:DEITY:RANDOM_DEF_SPHERE]
+experience [SPEAKER:HF_LINK:DEITY:TRANS_NAME]
+experience [SPEAKER:HF_LINK:DEITY:RANDOM_DEF_SPHERE]
+consider [SPEAKER:HF_LINK:DEITY:TRANS_NAME]
+consider [SPEAKER:HF_LINK:DEITY:RANDOM_DEF_SPHERE]
+give yourself to [SPEAKER:HF_LINK:DEITY:TRANS_NAME]
+give yourself to [SPEAKER:HF_LINK:DEITY:RANDOM_DEF_SPHERE] \ No newline at end of file
diff --git a/data/speech/greet.txt b/data/speech/greet.txt
new file mode 100755
index 0000000..cd4eb77
--- /dev/null
+++ b/data/speech/greet.txt
@@ -0,0 +1 @@
+Greetings. My name is [SPEAKER:TRANS_NAME]. \ No newline at end of file
diff --git a/data/speech/greet_baby.txt b/data/speech/greet_baby.txt
new file mode 100755
index 0000000..fff9259
--- /dev/null
+++ b/data/speech/greet_baby.txt
@@ -0,0 +1,3 @@
+Hellooo!
+Look at you!
+A baby! How adorable! \ No newline at end of file
diff --git a/data/speech/greet_reply.txt b/data/speech/greet_reply.txt
new file mode 100755
index 0000000..2569d1c
--- /dev/null
+++ b/data/speech/greet_reply.txt
@@ -0,0 +1 @@
+Ah, hello. I'm [SPEAKER:TRANS_NAME]. \ No newline at end of file
diff --git a/data/speech/greet_reply_after_hero.txt b/data/speech/greet_reply_after_hero.txt
new file mode 100755
index 0000000..71c54bd
--- /dev/null
+++ b/data/speech/greet_reply_after_hero.txt
@@ -0,0 +1,2 @@
+I am [SPEAKER:TRANS_NAME]. Can I be of some help?
+I am [SPEAKER:TRANS_NAME]. How can I be of service? \ No newline at end of file
diff --git a/data/speech/greet_reply_diff_language.txt b/data/speech/greet_reply_diff_language.txt
new file mode 100755
index 0000000..bfc923c
--- /dev/null
+++ b/data/speech/greet_reply_diff_language.txt
@@ -0,0 +1 @@
+Hello, [AUDIENCE:RACE]. I am [SPEAKER:TRANS_NAME]. \ No newline at end of file
diff --git a/data/speech/greet_reply_unusual_first.txt b/data/speech/greet_reply_unusual_first.txt
new file mode 100755
index 0000000..d93851b
--- /dev/null
+++ b/data/speech/greet_reply_unusual_first.txt
@@ -0,0 +1,5 @@
+[AUDIENCE:FIRST_NAME]... your parents must have been interesting!
+You know, you don't meet many people with the name [AUDIENCE:FIRST_NAME].
+So, [AUDIENCE:FIRST_NAME]... [AUDIENCE:FIRST_NAME], was it?
+[AUDIENCE:FIRST_NAME]. Does that mean something?
+[AUDIENCE:FIRST_NAME]. I can't say I've heard that before. \ No newline at end of file
diff --git a/data/speech/greet_worship.txt b/data/speech/greet_worship.txt
new file mode 100755
index 0000000..ca81c6e
--- /dev/null
+++ b/data/speech/greet_worship.txt
@@ -0,0 +1,5 @@
+Praise be to [SPEAKER:HF_LINK:DEITY:TRANS_NAME].
+Praise [SPEAKER:HF_LINK:DEITY:RANDOM_DEF_SPHERE].
+Life is, in a word, [SPEAKER:HF_LINK:DEITY:RANDOM_DEF_SPHERE].
+This servant of [SPEAKER:HF_LINK:DEITY:TRANS_NAME] greets you.
+This servant of [SPEAKER:HF_LINK:DEITY:RANDOM_DEF_SPHERE] greets you. \ No newline at end of file
diff --git a/data/speech/guard_profession.txt b/data/speech/guard_profession.txt
new file mode 100755
index 0000000..9ce0aca
--- /dev/null
+++ b/data/speech/guard_profession.txt
@@ -0,0 +1 @@
+I am a guard. \ No newline at end of file
diff --git a/data/speech/guard_warning.txt b/data/speech/guard_warning.txt
new file mode 100755
index 0000000..9c3b28a
--- /dev/null
+++ b/data/speech/guard_warning.txt
@@ -0,0 +1 @@
+Don't start any trouble. \ No newline at end of file
diff --git a/data/speech/hist_fig_slayer.txt b/data/speech/hist_fig_slayer.txt
new file mode 100755
index 0000000..08cf431
--- /dev/null
+++ b/data/speech/hist_fig_slayer.txt
@@ -0,0 +1 @@
+It is I that felled [CONTEXT:HIST_FIG:TRANS_NAME] the [CONTEXT:HIST_FIG:RACE]. \ No newline at end of file
diff --git a/data/speech/hunting_profession.txt b/data/speech/hunting_profession.txt
new file mode 100755
index 0000000..57cffd1
--- /dev/null
+++ b/data/speech/hunting_profession.txt
@@ -0,0 +1 @@
+I hunt great beasts in [CONTEXT:PLACE:TRANS_NAME]. \ No newline at end of file
diff --git a/data/speech/hunting_profession_year.txt b/data/speech/hunting_profession_year.txt
new file mode 100755
index 0000000..d8a7f79
--- /dev/null
+++ b/data/speech/hunting_profession_year.txt
@@ -0,0 +1 @@
+I have hunted great beasts in [CONTEXT:PLACE:TRANS_NAME] for [CONTEXT:NUMBER] of my years. \ No newline at end of file
diff --git a/data/speech/justification_antithetical.txt b/data/speech/justification_antithetical.txt
new file mode 100755
index 0000000..3909b60
--- /dev/null
+++ b/data/speech/justification_antithetical.txt
@@ -0,0 +1 @@
+can be thought of as the antithesis of \ No newline at end of file
diff --git a/data/speech/justification_experience.txt b/data/speech/justification_experience.txt
new file mode 100755
index 0000000..f6ed5e0
--- /dev/null
+++ b/data/speech/justification_experience.txt
@@ -0,0 +1 @@
+can allow one to experience \ No newline at end of file
diff --git a/data/speech/justification_proximity.txt b/data/speech/justification_proximity.txt
new file mode 100755
index 0000000..5ad0704
--- /dev/null
+++ b/data/speech/justification_proximity.txt
@@ -0,0 +1 @@
+can bring one near to \ No newline at end of file
diff --git a/data/speech/justification_reminder.txt b/data/speech/justification_reminder.txt
new file mode 100755
index 0000000..7919453
--- /dev/null
+++ b/data/speech/justification_reminder.txt
@@ -0,0 +1 @@
+can remind one of \ No newline at end of file
diff --git a/data/speech/justification_representation.txt b/data/speech/justification_representation.txt
new file mode 100755
index 0000000..57bf8d2
--- /dev/null
+++ b/data/speech/justification_representation.txt
@@ -0,0 +1 @@
+can be thought of as a representation of \ No newline at end of file
diff --git a/data/speech/lair_hunter_minotaur.txt b/data/speech/lair_hunter_minotaur.txt
new file mode 100755
index 0000000..f10b8a8
--- /dev/null
+++ b/data/speech/lair_hunter_minotaur.txt
@@ -0,0 +1,3 @@
+I want your bones for my bone mill!
+I'll grind you into porridge!
+I'll eat you whole! \ No newline at end of file
diff --git a/data/speech/mercenary_profession.txt b/data/speech/mercenary_profession.txt
new file mode 100755
index 0000000..000ddd7
--- /dev/null
+++ b/data/speech/mercenary_profession.txt
@@ -0,0 +1 @@
+I seek fortune and glory by offering my skill at arms in [CONTEXT:PLACE:TRANS_NAME]. \ No newline at end of file
diff --git a/data/speech/mercenary_profession_year.txt b/data/speech/mercenary_profession_year.txt
new file mode 100755
index 0000000..4e163c5
--- /dev/null
+++ b/data/speech/mercenary_profession_year.txt
@@ -0,0 +1 @@
+I have sought fortune and glory by offering my skill at arms in [CONTEXT:PLACE:TRANS_NAME] for [CONTEXT:NUMBER] of my years. \ No newline at end of file
diff --git a/data/speech/no_family.txt b/data/speech/no_family.txt
new file mode 100755
index 0000000..5d59e8d
--- /dev/null
+++ b/data/speech/no_family.txt
@@ -0,0 +1 @@
+I have no family to speak of \ No newline at end of file
diff --git a/data/speech/past_hunting_profession.txt b/data/speech/past_hunting_profession.txt
new file mode 100755
index 0000000..dd7f2d9
--- /dev/null
+++ b/data/speech/past_hunting_profession.txt
@@ -0,0 +1,2 @@
+In the past, I hunted great beasts.
+I was a hunter of mighty beasts for [CONTEXT:NUMBER] of my years. \ No newline at end of file
diff --git a/data/speech/past_mercenary_profession.txt b/data/speech/past_mercenary_profession.txt
new file mode 100755
index 0000000..777c6c1
--- /dev/null
+++ b/data/speech/past_mercenary_profession.txt
@@ -0,0 +1,2 @@
+In the past, I sought fortune and glory by offering my skill at arms.
+I sought fortune and glory by offering my skill at arms for [CONTEXT:NUMBER] of my years. \ No newline at end of file
diff --git a/data/speech/past_profession_no_year.txt b/data/speech/past_profession_no_year.txt
new file mode 100755
index 0000000..4752194
--- /dev/null
+++ b/data/speech/past_profession_no_year.txt
@@ -0,0 +1 @@
+I was once a [CONTEXT:UNIT_NAME]. \ No newline at end of file
diff --git a/data/speech/past_profession_year.txt b/data/speech/past_profession_year.txt
new file mode 100755
index 0000000..f4d9147
--- /dev/null
+++ b/data/speech/past_profession_year.txt
@@ -0,0 +1 @@
+I was a [CONTEXT:UNIT_NAME] for [CONTEXT:NUMBER] of the years of my life. \ No newline at end of file
diff --git a/data/speech/past_scouting_profession.txt b/data/speech/past_scouting_profession.txt
new file mode 100755
index 0000000..1eb1120
--- /dev/null
+++ b/data/speech/past_scouting_profession.txt
@@ -0,0 +1,2 @@
+At one time, I was a scout.
+For [CONTEXT:NUMBER] of my years, I was a scout. \ No newline at end of file
diff --git a/data/speech/past_snatcher_profession.txt b/data/speech/past_snatcher_profession.txt
new file mode 100755
index 0000000..9cc47cb
--- /dev/null
+++ b/data/speech/past_snatcher_profession.txt
@@ -0,0 +1,2 @@
+Once it was my calling to rescue lost children.
+For [CONTEXT:NUMBER] of my years, I rescued lost children. \ No newline at end of file
diff --git a/data/speech/past_thief_profession.txt b/data/speech/past_thief_profession.txt
new file mode 100755
index 0000000..6377e19
--- /dev/null
+++ b/data/speech/past_thief_profession.txt
@@ -0,0 +1,2 @@
+I once sought great treasures.
+I sought great treasures for [CONTEXT:NUMBER] of my years. \ No newline at end of file
diff --git a/data/speech/past_wandering_profession.txt b/data/speech/past_wandering_profession.txt
new file mode 100755
index 0000000..da02464
--- /dev/null
+++ b/data/speech/past_wandering_profession.txt
@@ -0,0 +1,2 @@
+I once wandered the wilds.
+For [CONTEXT:NUMBER] of my years, I wandered the wilds. \ No newline at end of file
diff --git a/data/speech/positive.txt b/data/speech/positive.txt
new file mode 100755
index 0000000..039cf79
--- /dev/null
+++ b/data/speech/positive.txt
@@ -0,0 +1,10 @@
+fantastic!
+wonderful!
+I'm thrilled to hear that.
+I'm pleased to hear that.
+that is good news.
+that is wonderful news.
+this is encouraging.
+very good.
+I'm proud of you.
+that is a good turn of affairs. \ No newline at end of file
diff --git a/data/speech/same_site_ab_specific_hf_seeker.txt b/data/speech/same_site_ab_specific_hf_seeker.txt
new file mode 100755
index 0000000..8cdd28b
--- /dev/null
+++ b/data/speech/same_site_ab_specific_hf_seeker.txt
@@ -0,0 +1 @@
+seek out [CONTEXT:HIST_FIG:TRANS_NAME] here in [CONTEXT:SITE:TRANS_NAME] at [CONTEXT:ABSTRACT_BUILDING:TRANS_NAME] \ No newline at end of file
diff --git a/data/speech/same_site_specific_hf_seeker.txt b/data/speech/same_site_specific_hf_seeker.txt
new file mode 100755
index 0000000..e02d24d
--- /dev/null
+++ b/data/speech/same_site_specific_hf_seeker.txt
@@ -0,0 +1 @@
+seek out [CONTEXT:HIST_FIG:TRANS_NAME] here in [CONTEXT:SITE:TRANS_NAME] \ No newline at end of file
diff --git a/data/speech/scouting_profession.txt b/data/speech/scouting_profession.txt
new file mode 100755
index 0000000..1c961ec
--- /dev/null
+++ b/data/speech/scouting_profession.txt
@@ -0,0 +1 @@
+It is my duty to scout the area around [CONTEXT:PLACE:TRANS_NAME]. \ No newline at end of file
diff --git a/data/speech/scouting_profession_year.txt b/data/speech/scouting_profession_year.txt
new file mode 100755
index 0000000..2acb646
--- /dev/null
+++ b/data/speech/scouting_profession_year.txt
@@ -0,0 +1 @@
+I have been scouting the area around [CONTEXT:PLACE:TRANS_NAME] for [CONTEXT:NUMBER] of my years. \ No newline at end of file
diff --git a/data/speech/site_specific_hf_seeker.txt b/data/speech/site_specific_hf_seeker.txt
new file mode 100755
index 0000000..06cd92c
--- /dev/null
+++ b/data/speech/site_specific_hf_seeker.txt
@@ -0,0 +1 @@
+seek out [CONTEXT:HIST_FIG:TRANS_NAME] over in [CONTEXT:SITE:TRANS_NAME] \ No newline at end of file
diff --git a/data/speech/slayer.txt b/data/speech/slayer.txt
new file mode 100755
index 0000000..0819e58
--- /dev/null
+++ b/data/speech/slayer.txt
@@ -0,0 +1,14 @@
+bane
+conqueror
+death
+foe
+killer
+lord
+master
+nemesis
+slayer
+vanquisher
+murderer
+crusher
+extinguisher
+strangler \ No newline at end of file
diff --git a/data/speech/snatcher_profession.txt b/data/speech/snatcher_profession.txt
new file mode 100755
index 0000000..d449533
--- /dev/null
+++ b/data/speech/snatcher_profession.txt
@@ -0,0 +1 @@
+I rescue lost children and bring them back to [CONTEXT:PLACE:TRANS_NAME]. \ No newline at end of file
diff --git a/data/speech/snatcher_profession_year.txt b/data/speech/snatcher_profession_year.txt
new file mode 100755
index 0000000..1e98665
--- /dev/null
+++ b/data/speech/snatcher_profession_year.txt
@@ -0,0 +1 @@
+For [CONTEXT:NUMBER] of my years, I have been rescuing lost children and bringing them back to [CONTEXT:PLACE:TRANS_NAME]. \ No newline at end of file
diff --git a/data/speech/soldier_profession.txt b/data/speech/soldier_profession.txt
new file mode 100755
index 0000000..78d87d5
--- /dev/null
+++ b/data/speech/soldier_profession.txt
@@ -0,0 +1 @@
+I am a soldier. \ No newline at end of file
diff --git a/data/speech/task_recommendation.txt b/data/speech/task_recommendation.txt
new file mode 100755
index 0000000..2013df3
--- /dev/null
+++ b/data/speech/task_recommendation.txt
@@ -0,0 +1 @@
+[CONTEXT:ANY:TRANS_NAME] might have a task for you \ No newline at end of file
diff --git a/data/speech/temple_already_member.txt b/data/speech/temple_already_member.txt
new file mode 100755
index 0000000..e531c3c
--- /dev/null
+++ b/data/speech/temple_already_member.txt
@@ -0,0 +1,5 @@
+simply
+it is enough to
+your task is simple;
+just
+all you need is to \ No newline at end of file
diff --git a/data/speech/temple_become_member.txt b/data/speech/temple_become_member.txt
new file mode 100755
index 0000000..bce7f34
--- /dev/null
+++ b/data/speech/temple_become_member.txt
@@ -0,0 +1,4 @@
+Welcome to [CONTEXT:ENTITY:TRANS_NAME]. Praise be to [CONTEXT:ENTITY:WORSHIP_HF:TRANS_NAME]!
+Welcome to [CONTEXT:ENTITY:TRANS_NAME]. Praise be to [CONTEXT:ENTITY:WORSHIP_HF:RANDOM_DEF_SPHERE]!
+As a member of [CONTEXT:ENTITY:TRANS_NAME], you can now seek the higher mysteries of [CONTEXT:ENTITY:WORSHIP_HF:TRANS_NAME].
+As a member of [CONTEXT:ENTITY:TRANS_NAME], you can now seek the higher mysteries of [CONTEXT:ENTITY:WORSHIP_HF:RANDOM_DEF_SPHERE]. \ No newline at end of file
diff --git a/data/speech/thief_profession.txt b/data/speech/thief_profession.txt
new file mode 100755
index 0000000..9557778
--- /dev/null
+++ b/data/speech/thief_profession.txt
@@ -0,0 +1 @@
+I seek treasures and bring them back to [CONTEXT:PLACE:TRANS_NAME]. \ No newline at end of file
diff --git a/data/speech/thief_profession_year.txt b/data/speech/thief_profession_year.txt
new file mode 100755
index 0000000..eb8dd0c
--- /dev/null
+++ b/data/speech/thief_profession_year.txt
@@ -0,0 +1 @@
+I seek treasures and bring them back to [CONTEXT:PLACE:TRANS_NAME] and have done so for [CONTEXT:NUMBER] of the years of my life. \ No newline at end of file
diff --git a/data/speech/threat.txt b/data/speech/threat.txt
new file mode 100755
index 0000000..ec7fe2a
--- /dev/null
+++ b/data/speech/threat.txt
@@ -0,0 +1 @@
+Prepare to die! \ No newline at end of file
diff --git a/data/speech/unknown_hf_seeker.txt b/data/speech/unknown_hf_seeker.txt
new file mode 100755
index 0000000..c17925b
--- /dev/null
+++ b/data/speech/unknown_hf_seeker.txt
@@ -0,0 +1 @@
+seek out [CONTEXT:HIST_FIG:TRANS_NAME], wherever [CONTEXT:HIST_FIG:PRO_SUB] might be \ No newline at end of file
diff --git a/data/speech/wandering_profession.txt b/data/speech/wandering_profession.txt
new file mode 100755
index 0000000..8aa7261
--- /dev/null
+++ b/data/speech/wandering_profession.txt
@@ -0,0 +1 @@
+I wander [CONTEXT:PLACE:TRANS_NAME]. \ No newline at end of file
diff --git a/data/speech/wandering_profession_year.txt b/data/speech/wandering_profession_year.txt
new file mode 100755
index 0000000..b5f8582
--- /dev/null
+++ b/data/speech/wandering_profession_year.txt
@@ -0,0 +1 @@
+I have wandered [CONTEXT:PLACE:TRANS_NAME] for [CONTEXT:NUMBER] of my years. \ No newline at end of file
diff --git a/df b/df
new file mode 100755
index 0000000..d274527
--- /dev/null
+++ b/df
@@ -0,0 +1,7 @@
+#!/bin/sh
+DF_DIR=$(dirname "$0")
+cd "${DF_DIR}"
+export SDL_DISABLE_LOCK_KEYS=1 # Work around for bug in Debian/Ubuntu SDL patch.
+#export SDL_VIDEO_CENTERED=1 # Centre the screen. Messes up resizing.
+./libs/Dwarf_Fortress "$@" # Go, go, go! :)
+
diff --git a/file changes.txt b/file changes.txt
new file mode 100755
index 0000000..52357c6
--- /dev/null
+++ b/file changes.txt
@@ -0,0 +1,2494 @@
+See readme.txt for general information about the release.
+See release_notes.txt for information on handling saves and a brief writeup on the changes for this version.
+See command_line.txt for information on world generation from command lines.
+
+******************************************************
+
+Auxiliary file changes for 0.40.24:
+
+ plant_standard:
+ muck root, bloated tubers got seeds
+ creature_tropical_new:
+ pangolin [REMOVE_TISSUE:SKIN]
+ creature_small_ocean:
+ mussel and oyster got leather/tallow/soap
+ creature_other:
+ wambler got leather/tallow/soap, changed FLUFF/PUDGE tokens to HAIR/FAT to avoid template conflict (still named the same)
+ creature_next_underground:
+ floater and blog got leather
+ pond grabber stopped using claw template -- did manual name change instead
+ flesh ball FLESH token to MUSCLE to avoid template conflicts, also added flesh name change
+
+******************************************************
+
+Auxiliary file changes for 0.40.23:
+
+ creature_small_riverlake and creature_standard
+ breath -> breathe a few places (Gorobay)
+
+******************************************************
+
+Auxiliary file changes for 0.40.22:
+
+ Just the usual.
+
+******************************************************
+
+Auxiliary file changes for 0.40.21:
+
+ Just the usual.
+
+******************************************************
+
+Auxiliary file changes for 0.40.20:
+
+ new keys
+ DESIGNATE_STANDARD_MARKER:m
+ DESIGNATE_MINE_MODE:a
+ DESIGNATE_TOGGLE_MARKER:M
+ BUILDJOB_NOW:n
+
+ changed key
+ DESIGNATE_FORTIFY a -> F
+
+Auxiliary file changes for 0.40.19:
+
+ new keys
+ INTERFACEKEY_UNITVIEW_GELD:x
+ INTERFACEKEY_PET_GELD:x
+
+ creatures
+ GELDABLE information added to many creatures.
+ new commands: BP_ADD_TYPE:<tag>, BP_REMOVE_TYPE:<tag> used with SET_BP_GROUP
+ legal tags:
+ HEAD
+ UPPERBODY
+ LOWERBODY
+ SIGHT
+ EMBEDDED
+ INTERNAL
+ CIRCULATION
+ SKELETON
+ LIMB
+ GRASP
+ STANCE
+ GUTS
+ GELDABLE
+ BREATHE
+ SMALL
+ THROAT
+ JOINT
+ THOUGHT
+ NERVOUS
+ RIGHT
+ LEFT
+ HEAR
+ SMELL
+ FLIER
+ DIGIT
+ CONNECTOR
+ PREVENTS_PARENT_COLLAPSE
+ MOUTH
+ APERTURE
+ SOCKET
+ TOTEMABLE
+ UNDER_PRESSURE
+ VERMIN_BUTCHER_ITEM
+
+ new announcements
+ [MOVED_OUT_OF_RANGE:A_D:D_D]
+ [CANNOT_JUMP:A_D:D_D]
+ [NO_TRACKS:A_D:D_D]
+ [ALREADY_SEARCHED_AREA:A_D:D_D]
+ [SEARCH_FOUND_SOMETHING:A_D:D_D]
+ [SEARCH_FOUND_NOTHING:A_D:D_D]
+ [NOTHING_TO_INTERACT:A_D:D_D]
+ [NOTHING_TO_EXAMINE:A_D:D_D]
+ [YOU_YIELDED:A_D:D_D]
+ [YOU_UNYIELDED:A_D:D_D]
+ [YOU_STRAP_ITEM:A_D:D_D]
+ [YOU_DRAW_ITEM:A_D:D_D]
+ [NO_GRASP_TO_DRAW_ITEM:A_D:D_D]
+ [NO_ITEM_TO_STRAP:A_D:D_D]
+ [NO_INV_TO_REMOVE:A_D:D_D]
+ [NO_INV_TO_WEAR:A_D:D_D]
+ [NO_INV_TO_EAT:A_D:D_D]
+ [NO_INV_TO_CONTAIN:A_D:D_D]
+ [NO_INV_TO_DROP:A_D:D_D]
+ [NOTHING_TO_PICK_UP:A_D:D_D]
+ [NO_INV_TO_THROW:A_D:D_D]
+ [NO_INV_TO_FIRE:A_D:D_D]
+ [CURRENT_SMELL:A_D:D_D]
+ [CURRENT_WEATHER:A_D:D_D]
+ [CURRENT_TEMPERATURE:A_D:D_D]
+ [CURRENT_DATE:A_D:D_D]
+ [NO_GRASP_FOR_PICKUP:A_D:D_D]
+ [TRAVEL_ADVISORY:A_D:D_D]
+ [CANNOT_CLIMB:A_D:D_D]
+ [CANNOT_STAND:A_D:D_D]
+ [MUST_UNRETRACT_FIRST:A_D:D_D]
+ [CANNOT_REST:A_D:D_D]
+ [CANNOT_MAKE_CAMPFIRE:A_D:D_D]
+ [MADE_CAMPFIRE:A_D:D_D]
+ [CANNOT_SET_FIRE:A_D:D_D]
+ [SET_FIRE:A_D:D_D]
+ [DAWN_BREAKS:A_D:D_D]
+ [NOON:A_D:D_D]
+ [NIGHTFALL:A_D:D_D]
+ [NO_INV_INTERACTION:A_D:D_D]
+ [EMPTY_CONTAINER:A_D:D_D]
+ [TAKE_OUT_OF_CONTAINER:A_D:D_D]
+ [NO_CONTAINER_FOR_ITEM:A_D:D_D]
+ [PUT_INTO_CONTAINER:A_D:D_D]
+ [EAT_ITEM:A_D:D_D]
+ [DRINK_ITEM:A_D:D_D]
+ [CONSUME_FAILURE:A_D:D_D]
+ [DROP_ITEM:A_D:D_D]
+ [PICK_UP_ITEM:A_D:D_D]
+ [YOU_BUILDING_INTERACTION:A_D:D_D]
+ [YOU_ITEM_INTERACTION:A_D:D_D]
+ [YOU_TEMPERATURE_EFFECTS:A_D:D_D]
+ [RESOLVE_SHARED_ITEMS:A_D:D_D]
+ [COUGH_BLOOD:A_D:D_D]
+ [VOMIT_BLOOD:A_D:D_D]
+ [POWER_LEARNED:A_D:D_D]
+ [YOU_FEED_ON_SUCKEE:A_D:D_D]
+ [PROFESSION_CHANGES:A_D:D_D]
+ [RECRUIT_PROMOTED:A_D:D_D]
+ [SOLDIER_BECOMES_MASTER:A_D:D_D]
+ [MERCHANTS_UNLOADING:A_D:D_D]
+ [MERCHANTS_NEED_DEPOT:A_D:D_D]
+ [MERCHANT_WAGONS_BYPASSED:A_D:D_D]
+ [MERCHANTS_LEAVING_SOON:A_D:D_D]
+ [MERCHANTS_EMBARKED:A_D:D_D]
+ [PET_LOSES_DEAD_OWNER:A_D:D_D]
+ [PET_ADOPTS_OWNER:A_D:D_D]
+ [VERMIN_BITE:A_D:D_D]
+ [UNABLE_TO_COMPLETE_BUILDING:A_D:D_D]
+ [JOBS_REMOVED_FROM_UNPOWERED_BUILDING:A_D:D_D]
+ [CITIZEN_SNATCHED:A_D:D_D]
+ [VERMIN_DISTURBED:A_D:D_D]
+ [LAND_GAINS_STATUS:A_D:D_D]
+ [LAND_ELEVATED_STATUS:A_D:D_D]
+ [MASTERPIECE_CRAFTED:A_D:D_D]
+ [ARTWORK_DEFACED:A_D:D_D]
+ [ANIMAL_TRAINED:A_D:D_D]
+ [DYED_MASTERPIECE:A_D:D_D]
+ [COOKED_MASTERPIECE:A_D:D_D]
+ [MANDATE_ENDS:A_D:D_D]
+ [SLOWDOWN_ENDS:A_D:D_D]
+ [FAREWELL_HELPER:A_D:D_D]
+ [ELECTION_RESULTS:A_D:D_D]
+ [SITE_PRESENT:A_D:D_D]
+ [CONSTRUCTION_SUSPENDED:A_D:D_D]
+ [LINKAGE_SUSPENDED:A_D:D_D]
+ [QUOTA_FILLED:A_D:D_D]
+ [JOB_OVERWRITTEN:A_D:D_D]
+ [NOTHING_TO_CATCH_IN_WATER:A_D:D_D]
+ [DEMAND_FORGOTTEN:A_D:D_D]
+ [NEW_DEMAND:A_D:D_D]
+ [NEW_MANDATE:A_D:D_D]
+ [PRICES_ALTERED:A_D:D_D]
+ [NAMED_RESIDENT_CREATURE:A_D:D_D]
+ [SOMEBODY_GROWS_UP:A_D:D_D]
+ [GUILD_REQUEST_TAKEN:A_D:D_D]
+ [GUILD_WAGES_CHANGED:A_D:D_D]
+ [NEW_WORK_MANDATE:A_D:D_D]
+ [CITIZEN_BECOMES_SOLDIER:A_D:D_D]
+ [CITIZEN_BECOMES_NONSOLDIER:A_D:D_D]
+ [PARTY_ORGANIZED:A_D:D_D]
+ [POSSESSED_TANTRUM:A_D:D_D]
+ [BUILDING_TOPPLED_BY_GHOST:A_D:D_D]
+ [MASTERFUL_IMPROVEMENT:A_D:D_D]
+ [MASTERPIECE_ENGRAVING:A_D:D_D]
+ [MARRIAGE:A_D:D_D]
+ [NO_MARRIAGE_CELEBRATION:A_D:D_D]
+ [CURIOUS_GUZZLER:A_D:D_D]
+ [WEATHER_BECOMES_CLEAR:A_D:D_D]
+ [WEATHER_BECOMES_SNOW:A_D:D_D]
+ [WEATHER_BECOMES_RAIN:A_D:D_D]
+ [SEASON_WET:A_D:D_D]
+ [SEASON_DRY:A_D:D_D]
+ [SEASON_SPRING:A_D:D_D]
+ [SEASON_SUMMER:A_D:D_D]
+ [SEASON_AUTUMN:A_D:D_D]
+ [SEASON_WINTER:A_D:D_D]
+
+******************************************************
+
+Auxiliary file changes for 0.40.18:
+
+ Just the usual.
+
+******************************************************
+
+Auxiliary file changes for 0.40.17:
+
+ Just the usual.
+
+******************************************************
+
+Auxiliary file changes for 0.40.16:
+
+ Just the usual.
+
+******************************************************
+
+Auxiliary file changes for 0.40.15:
+
+ new announcements
+ STRESSED_CITIZEN:A_D:D_D
+ for any of the temporary stress states aside from tantrum
+ CITIZEN_LOST_TO_STRESS:A_D:D_D
+ for any of the permanent states aside from berserk
+ CITIZEN_TANTRUM:A_D:D_D
+
+******************************************************
+
+Auxiliary file changes for 0.40.14:
+
+ new/changed keys
+ CIVZONE_DUMP g -> d
+ CIVZONE_GATHER g
+ CIVZONE_GATHER_OPTIONS G
+ CIVZONE_GATHER_OPTIONS_PICK_TREES t
+ CIVZONE_GATHER_OPTIONS_PICK_SHRUBS s
+ CIVZONE_GATHER_OPTIONS_GATHER_FALLEN f
+
+ creatures
+ retired LIKES_FIGHTING, though it shouldn't give an error for the time being
+
+ item_tool
+ added stepladder
+
+ entity_default
+ added stepladder tool to MOUNTAIN
+
+******************************************************
+
+Auxiliary file changes for 0.40.13:
+
+ creature_standard
+ (semi)megabeasts that were missing LARGE_PREDATOR received it
+
+ grazing creatures
+ STANDARD_GRAZER added to replace all grazing numbers, can set coefficient in d_init
+
+ d_init
+ GRAZE_COEFFICIENT to scale grazing amounts
+
+
+******************************************************
+
+Auxiliary file changes for 0.40.12:
+
+ changed keys
+ UNITJOB_REMOVE_CRE from r -> x
+ UNITJOB_ZOOM_CRE from c -> z
+
+******************************************************
+
+Auxiliary file changes for 0.40.11:
+
+ material templates
+ added very basic fruit/flower/bud/mushroom template based on leaf
+
+ plants
+ used new templates instead of structural_plant_template for leaves etc.
+
+******************************************************
+
+Auxiliary file changes for 0.40.10:
+
+ Just the usual.
+
+******************************************************
+
+Auxiliary file changes for 0.40.09:
+
+ plants
+ finished conversion of pineapple plant out of tree format
+ added seed mat reaction product to quarry bush
+
+ reaction
+ added seeds to bag job, made bag not determine reaction amount
+
+ manual
+ typos and a few updates (Gorobay)
+
+******************************************************
+
+Auxiliary file changes for 0.40.08:
+
+ Just the usual.
+
+******************************************************
+
+Auxiliary file changes for 0.40.07:
+
+ plants
+ acacia flowers/seed pods got GROWTH_HOST_TILE
+
+ keys
+ [BUILDING_TRIGGER_MIN_SIZE_UP_PLUS:SHIFT+R]
+ [BUILDING_TRIGGER_MIN_SIZE_DOWN_PLUS:SHIFT+E]
+ [BUILDING_TRIGGER_MAX_SIZE_UP_PLUS:SHIFT+F]
+ [BUILDING_TRIGGER_MAX_SIZE_DOWN_PLUS:SHIFT+D]
+ STRING_A124 -> | for SDL versions
+ removed STRING_A127 as it was causing a conflict on OSX
+
+******************************************************
+
+Auxiliary file changes for 0.40.06:
+
+ creatures
+ removed leathery egg materials from copperhead in creature_temperate_new
+ went ahead and updated the "evil" animal people pops as with other animal people for completeness
+
+ keys
+ fixed utf-8 encoding for sdl interface.txt
+
+ plants
+ made soybeans edible when cooked
+
+******************************************************
+
+Auxiliary file changes for 0.40.05:
+
+ creatures
+ added removal of UBIQUITOUS/FREQUENCY in animal person/giant variations (ab9rf)
+ allowed frequencies to be modified by percentage in creature variations
+ changed frequencies/population numbers for animal people
+ moved tiger man to large_tropical after tiger and made it use the standard animal person variation
+ fixed various broken eyelash color/descriptions
+ used correct legless variation for king cobra people
+ added LARGE_ROAMING to desert tortoise and giant tortoise
+ removed lots of HOMEOTHERM tags from bugs
+ added a missing CONNECTOR to generated lower spines, and PREVENTS_PARENT_COLLAPSE to generated upper spines
+ fixed duck/goose root around part category
+ fixed antlers for reindeer/moose/elk/deer, added them to elk bird
+ fixed typo in tapir description
+ fixed typo in dragon description
+ fixed reversed stoat caste names
+ fixed reversed giant armadillo caste names
+ fixed problem with squid skin coloration
+ gave crabs, horseshoe crabs, oysters and mussels blue blood
+ fixed proboscis plural
+ perseverence->ance in creature standard
+ 'curiousity' fixed in creature large ocean
+
+ plants
+ fixed several density placement mistakes in the older trees/underground megafungi of plant_standard
+ fixed strawberry plural
+ 'buckwheet' fixed in a few places in plant crops
+
+ materials
+ set obsidian's material values properly (UristDaVinci)
+ fixed topaz plural
+
+ entities
+ perseverence->ance in entity values
+ added elven diplomat
+
+ announcements
+ fixed ruler arrival announcement
+
+ manual
+ added a line break so TSK shows up properly in building items page of manual
+
+ language
+ additional typos in language_words fixed
+
+******************************************************
+
+Auxiliary file changes for 0.40.04:
+
+ Changed key
+ A_LOG_ENTITIES was e in SDL, n in legacy, now it is g
+ index/manual technical
+
+******************************************************
+
+Auxiliary file changes for 0.40.03:
+
+ Just the usual (index/manual technical).
+
+******************************************************
+
+Auxiliary file changes for 0.40.02:
+
+ Fixed the tracking key for the SDL version in data/init/interface.txt.
+ Added A_SHORT_WAIT to the manual (you can use , instead of . to wait for just one instant instead of ten).
+ Changed raw/objects/plant_standard.txt so that quarry bushes process to the correct edible leaf material.
+
+******************************************************
+
+Auxiliary file changes for 0.40.01:
+
+ As with the 0.31.01 release, managing the file changes list would be a daunting task this time. There are the new plant files, and creature now have gait information among other things like odor, sweat, tears, and so on (along with some material templates and creature variations to support them). The material emission interaction has been tweaked to allow specific creature targeting, and items have some new attack information. There are new reactions to respect the new plant growths.
+
+ There are many new keys of course. This is a partial list:
+ QUICK_ATTACK
+ HEAVY_ATTACK
+ WILD_ATTACK
+ PRECISE_ATTACK
+ CHARGE_ATTACK
+ MULTI_ATTACK
+ A_DISPLAY_TRACKS
+ A_FRESHEST_TRACK
+ A_ODOR
+ A_DISPLAY_ODOR
+ A_YIELD
+ A_INV_DRAW_WEAPON
+ A_LOG_PEOPLE
+ A_LOG_AGREEMENTS
+ A_LOG_EVENTS
+ A_LOG_BESTIARY
+ A_LOG_FILTER
+ A_SPEED_SNEAK
+ A_JUMP
+ A_HOLD
+ ARENA_CONFLICT_STATE_1
+ ARENA_CONFLICT_STATE_2
+ ARENA_MORALE
+ ARENA_WEATHER
+ ARENA_WEATHER_SNOW
+ ARENA_WEATHER_MUD
+ ARENA_WEATHER_CLEAR_SPATTER
+ D_LOOK_ARENA_TREE
+ ARENA_TREE_FILTER
+ ARENA_TREE_AGE
+ RECENTER_ON_LEVER
+ D_LOOK_ARENA_MOUNT
+
+
+******************************************************
+
+Auxiliary file changes for 0.34.11:
+
+ armor items
+ mail shirt layering moved from ARMOR to OVER
+
+******************************************************
+
+Auxiliary file changes for 0.34.09:
+
+ inorganic soil
+ fixed white sand density (got rid of the second entry)
+ smelter reactions
+ coke output up to 9 and 5 from 3 and 2
+
+******************************************************
+
+Auxiliary file changes for 0.34.08:
+
+ arena
+ added bottomless chasm tiles (C)
+ changed keys
+ D_HOT_KEYS = capital H
+ new keys
+ DESIGNATE_TRACK
+ D_HAULING
+ D_HAULING_NEW_ROUTE
+ D_HAULING_NEW_STOP
+ D_HAULING_REMOVE
+ D_HAULING_PROMOTE
+ D_HAULING_VEHICLE
+ D_HAULING_NICKNAME
+ BUILDING_TRIGGER_ENABLE_TRACK_CART
+ BUILDING_TRIGGER_MIN_TRACK_CART_DOWN
+ BUILDING_TRIGGER_MIN_TRACK_CART_UP
+ BUILDING_TRIGGER_MAX_TRACK_CART_DOWN
+ BUILDING_TRIGGER_MAX_TRACK_CART_UP
+ HOTKEY_BUILDING_CONSTRUCTION_TRACK
+ HOTKEY_BUILDING_CONSTRUCTION_TRACK_STOP
+ HOTKEY_BUILDING_MACHINE_ROLLERS
+ HOTKEY_TRAP_TRACK_STOP
+ D_LOOK_FOLLOW
+ UNITVIEW_FOLLOW
+ D_HAULING_STOP_NEW_DEPART
+ D_HAULING_STOP_NEW_LINK
+ D_HAULING_STOP_REMOVE
+ D_HAULING_STOP_SL_SELECT_PILE
+ D_HAULING_STOP_SL_TAKE_GIVE
+ D_HAULING_STOP_LC_DIR
+ D_HAULING_STOP_LC_MODE
+ D_HAULING_STOP_LC_TIMER_UP
+ D_HAULING_STOP_LC_TIMER_DOWN
+ D_HAULING_STOP_LC_FULLNESS_UP
+ D_HAULING_STOP_LC_FULLNESS_DOWN
+ D_HAULING_STOP_LC_MORE_LESS
+ D_HAULING_STOP_LC_DESIRED_TOTAL
+ D_HAULING_STOP_LC_CHANGE
+ D_HAULING_STOP_LC_ADVANCED
+ BUILDING_TRACK_STOP_FRICTION_UP
+ BUILDING_TRACK_STOP_FRICTION_DOWN
+ BUILDING_TRACK_STOP_DUMP
+ BUILDJOB_STOCKPILE_LINK_ANYWHERE
+ BUILDJOB_STOCKPILE_GIVE_TO
+ ARENA_CREATURE_STRING
+ BUILDJOB_STOCKPILE_WHEELBARROW
+ BUILDING_ROLLERS_SPEED_UP
+ BUILDING_ROLLERS_SPEED_DOWN
+ UNITVIEW_PRF_NEW_SQUAD
+ UNITVIEW_PRF_REMOVE_FROM_SQUAD
+ UNITVIEW_PRF_NAME_CURRENT_SQUAD
+ UNITVIEW_PRF_NAME_SELECTED_SQUAD
+ D_MILITARY_NAME_SQUAD
+ entity
+ dwarves can build minecart/wheelbarrow tools
+ tools
+ minecart/wheelbarrow
+ new use TRACK_CART
+ new tag WOOD_MAT
+ new tag INVERTED_TILE
+ new tag FURNITURE
+ new announcements
+ [SKIP_ON_LIQUID:A_D:UCR_A]
+ [DODGE_FLYING_OBJECT:A_D:UCR_A]
+ material raws
+ adopted a bunch of densities/colors from topic 80022
+ toys/instruments
+ HARD_MAT on puzzlebox/drum for now
+ creature variation
+ fixed ATTACL typo
+
+******************************************************
+
+Auxiliary file changes for 0.34.07:
+
+ creatures
+ rat gets [CREATURE_CLASS:GENERAL_POISON]
+ sponge man -> [CV_REMOVE_TAG:BODY:BASIC_1PARTBODY_THOUGHT]
+ giant bushtit -> [PREFSTRING:small size] -> [PREFSTRING:somewhat great size]
+ weasel ANY_LAND -> NOT_FREEZING + TUNDRA
+ teeth and teeth attacks for
+ great barracuda
+ longnose gar
+ tigerfish
+ pike
+ reef sharks S->s
+ coelacanth plural gets s and c->C
+ great barracuda B->b
+ deer d->D
+ cougar C->c
+ warthog w->W
+ leopard L->l
+ new seal men got
+ [CV_CONVERT_TAG]
+ [CVCT_MASTER:BODY]
+ [CVCT_TARGET:FRONT_BODY_FLIPPERS:REAR_BODY_FLIPPERS]
+ [CVCT_REPLACEMENT:REAR_BODY_FLIPPERS]
+ [APPLY_CURRENT_CREATURE_VARIATION]
+ and lost their KICK_ATTACK
+ cave swallow man gets new body
+ underground people get attacks
+ creature variations
+ animal people ones get
+ [CV_REMOVE_TAG:SPECIALATTACK_INJECT_EXTRACT]
+ [CV_REMOVE_TAG:SPECIALATTACK_SUCK_BLOOD]
+ [CV_REMOVE_TAG:ATTACL_VELOCITY_MODIFIER]
+ [CV_CONVERT_TAG]
+ [CVCT_MASTER:BODY]
+ [CVCT_TARGET:QUADRUPED_NECK]
+ [CVCT_REPLACEMENT:HUMANOID_NECK:3FINGERS]
+ or
+ [CVCT_REPLACEMENT:HUMANOID_LEGLESS_NECK:3FINGERS]
+ d_init
+ [SET_LABOR_LISTS:SKILLS]
+
+******************************************************
+
+Auxiliary file changes for 0.34.06:
+
+ entity_default.txt
+ removed dungeon master and tax collector from MOUNTAIN
+ creatures
+ jabberer/cave dragon get TRAINABLE
+ new keys
+ ANIMAL_SELECT_TRAINER
+ ANIMAL_WAR_TRAINING
+ ANIMAL_HUNTING_TRAINING
+ CIVZONE_ANIMAL_TRAINING
+ removed keys
+ UNITVIEW_PRF_PET_HUNT
+ UNITVIEW_PRF_PET_WAR
+ HOTKEY_KENNEL_TRAIN_HUNT
+ HOTKEY_KENNEL_TRAIN_WAR
+ HOTKEY_KENNEL_TAME_UNIT
+ announcement
+ [TRAINING_DOWN_TO_SEMI_WILD:A_D:D_D]
+ [TRAINING_FULL_REVERSION:A_D:D_D:P:R]
+ [ANIMAL_TRAINING_KNOWLEDGE:A_D:D_D]
+ items
+ added [SHAPED] to various headwear
+
+
+******************************************************
+
+Auxiliary file changes for 0.34.05:
+
+ body parts
+ new eyelids in rcp body
+ body plans
+ fixed r_eye/l_eye
+ creatures
+ red panda: will -> with
+ giant desert scorp: description typo
+ mules -> gray M, muskox -> brown M and brown color and brown description
+ crab -> [AMPHIBIOUS]
+ horseshoe crab -> [AMPHIBIOUS][UNDERSWIM]
+ added benign to
+ BIRD_FALCON_PEREGRINE,BIRD_CROW,BIRD_RAVEN,BIRD_OWL_SNOWY,
+ SPARROW,BIRD_OWL_BARN,BIRD_PARAKEET,BIRD_PARROT_GREY,
+ BIRD_LORIKEET,BIRD_WREN,BIRD_OSPREY,GIANT_COCKATIEL,
+ BIRD_MAGPIE,GIANT_KESTREL,BIRD_EAGLE,GIANT_HORNBILL,
+ BIRD_BUSHTIT,MOTH,GRASSHOPPER,THRIPS,SLUG,SNAIL,
+ DESERT TORTOISE,GIANT TORTOISE,SPONGE,HORSESHOE_CRAB,
+ POND_TURTLE,HAMSTER,HEDGEHOG,SQUIRREL_FLYING,
+ GREEN_TREE_FROG,CAPUCHIN,SLOTH,SPIDER_MONKEY,AYE-AYE,
+ LION_TAMARIN
+
+******************************************************
+
+Auxiliary file changes for 0.34.03:
+
+ creatures
+ horseshoe crab gets heart/brain, removed NOT_BUTCHERABLE (not sure what the deal is in reality)
+ horseshoe crab man gets working body
+ kea gets LOOSE_CLUSTERS
+ entities
+ changed TOLERATES_SITE for entities, it only controls which cities world gen people will migrate too
+ keep in mind that an elf can be found in a dwarf town if it moves to a human city first, since they'll be in the human entity
+ interaction examples
+ LIKES_FIGHTING:MISCHIEVOUS instead of misspellings
+ added STERILE to mummy interaction examples (zombie don't need the tag since it applies to all animations)
+ material templates
+ removed extra [BUTCHER_SPECIAL:MEAT:NONE] from gizzard
+ d_init
+ SET_LABOR_LISTS:YES
+
+******************************************************
+
+Auxiliary file changes for 0.34.02:
+
+ inorganic
+ added BUILD_COLOR for all metals
+ creatures
+ rodent men given skin and hair properly
+ amphibian man changed
+ missing tapir sponsor information added
+ rodent removed from rabbit description
+ fixed material value in unicorn
+ fixed iron/mud man depths
+ reindeer plural fixed
+ peacock color fixed
+ creature variations
+ removed POPULATION_NUMBER and CLUSTER_NUMBER and COLOR and MOUNT and MOUNT_EXOTIC from GIANT
+ language
+ changed SQUASH from MAGIC to VIOLENT symbol
+ manual files updated
+
+******************************************************
+
+Auxiliary file changes for 0.34.01:
+
+ interactions
+ interaction_standard.txt has some basic processes
+ the examples are in "raw/interaction examples"
+ creatures
+ ability to do the interactions, using [CAN_DO_INTERACTION:<token>] -- this includes cleaning, ink spray, and physical social stuff
+ [CAN_DO_INTERACTION:MATERIAL_EMISSION] taken from fire imp, MATERIAL_EMISSION is defined in interaction_standard.txt
+ [CDI:ADV_NAME:Hurl fireball]
+ [CDI:USAGE_HINT:ATTACK]
+ [CDI:BP_REQUIRED:BY_CATEGORY:HAND]
+ [CDI:FLOW:FIREBALL]
+ [CDI:TARGET:C:LINE_OF_SIGHT]
+ [CDI:TARGET_RANGE:C:15]
+ [CDI:MAX_TARGET_NUMBER:C:1]
+ [CDI:WAIT_PERIOD:30]
+ [CAN_DO_INTERACTION:MATERIAL_EMISSION_WITH_HIDE_EFFECT] taken from squid
+ [CDI:ADV_NAME:Squirt ink]
+ [CDI:USAGE_HINT:FLEEING]
+ [CDI:LOCATION_HINT:IN_WATER]
+ [CDI:BP_REQUIRED:BY_TYPE:UPPERBODY]
+ [CDI:MATERIAL:LOCAL_CREATURE_MAT:INK:SPATTER_LIQUID] <-- SPATTER_LIQUID is a new "breath" attack, SPATTER_POWDER too
+ [CDI:VERB:squirt ink:squirts ink:NA]
+ [CDI:TARGET:C:SELF_ONLY] <-- this is basically book-keeping for the two effects in the interaction
+ [CDI:TARGET:D:SELF_ONLY]
+ [CDI:WAIT_PERIOD:200]
+ [CDI:FREE_ACTION] <-- they can spray ink and also move away
+ [CAN_DO_INTERACTION:CLEANING] taken from cat
+ [CDI:ADV_NAME:Clean]
+ [CDI:USAGE_HINT:CLEAN_SELF]
+ [CDI:USAGE_HINT:CLEAN_FRIEND]
+ [CDI:BP_REQUIRED:BY_CATEGORY:TONGUE]
+ [CDI:VERB:lick:licks:lick each other]
+ [CDI:CAN_BE_MUTUAL] <-- not yet implemented
+ [CDI:TARGET:A:SELF_ALLOWED:TOUCHABLE] <-- so the animal can lick themselves or anybody nearby
+ [CDI:TARGET_RANGE:A:1]
+ [CDI:MAX_TARGET_NUMBER:A:1]
+ [CDI:WAIT_PERIOD:10]
+ [CAN_DO_INTERACTION:BP_BUMP] taken from cat
+ [CDI:ADV_NAME:Head bump]
+ [CDI:USAGE_HINT:GREETING]
+ [CDI:BP_REQUIRED:BY_CATEGORY:HEAD]
+ [CDI:VERB:head-bump:head-bumps:bump heads]
+ [CDI:CAN_BE_MUTUAL] <-- not yet implemented
+ [CDI:TARGET:A:SELF_ONLY]
+ [CDI:TARGET:B:TOUCHABLE]
+ [CDI:TARGET_RANGE:B:1]
+ [CDI:MAX_TARGET_NUMBER:B:1]
+ [CDI:WAIT_PERIOD:20]
+ they can retract into bodyparts/roll into balls using RETRACT_INTO_BP
+ [RETRACT_INTO_BP:BY_CATEGORY:BODY_UPPER:roll into a ball:rolls into a ball:unroll:unrolls]
+ they will retract when they are frightened and near to an enemy
+ attacks while retracted will be much more likely to hit the retract part
+ they can root around and stir up vermin using ROOT_AROUND
+ [ROOT_AROUND:BY_CATEGORY:BILL:root around in:roots around in]
+ they can be made to eat vermin using GOBBLE_VERMIN_CREATURE and GOBBLE_VERMIN_CLASS
+ [GOBBLE_VERMIN_CREATURE:<creature>:<caste>] where <caste> can be ALL
+ [GOBBLE_VERMIN_CLASS:<class>] where class is a CREATURE_CLASS like the new EDIBLE_GROUND_BUG
+ they can drop extra objects during butchery with EXTRA_BUTCHER_OBJECT
+ [EXTRA_BUTCHER_OBJECT:BY_CATEGORY:GIZZARD]
+ [EBO_ITEM:SMALLGEM:NONE:ANY_HARD_STONE] <-- ANY_HARD_STONE is special, but you can use the standard material token list too
+ [EBO_SHAPE:GIZZARD_STONE] <-- this is a shape for a gem from descriptor_shape_standard.txt
+ DIVE_HUNTS_VERMIN is a new vermin hunting behavior, although it is limited for fortress pets because of the known flier troubles there
+ removed werewolf and whale and some redundant animal people from the old files
+ a ton of new sponsorship creatures -- the eight that got new tags are in the old files, the 112 that didn't get their own tags are in probationary new files, although I don't promise to give every one of them a special tag over time
+ NOT_LIVING replaces CANNOT_UNDEAD
+ material force multiplier, general material force multiplier
+ syndromes
+ SYN_INGESTED will work now
+ there are new tags here -- see the interaction examples in "raw/interaction examples" for syntax, here are some examples:
+ CE_ADD_TAG -- It's a pretty zombie-centric list (basically whatever came up for us). Support for other creature tags will be added.
+ EXTRAVISION
+ OPPOSED_TO_LIFE
+ SUPERNATURAL
+ NOT_LIVING
+ NOEXERT
+ CRAZED
+ BLOODSUCKER
+ NOPAIN
+ NOBREATHE
+ HAS_BLOOD
+ NOSTUN
+ NONAUSEA
+ NO_DIZZINESS
+ NO_FEVERS
+ TRANCES
+ NOEMOTION
+ LIKESFIGHTING
+ PARALYZEIMMUNE
+ NOFEAR
+ NO_EAT
+ NO_DRINK
+ NO_SLEEP
+ MISCHIEVOUS
+ NO_PHYS_ATT_GAIN
+ NO_PHYS_ATT_RUST
+ NOTHOUGHT
+ NO_THOUGHT_CENTER_FOR_MOVEMENT
+ NO_CONNECTIONS_FOR_MOVEMENT
+ CAN_SPEAK
+ CAN_LEARN
+ UTTERANCES
+ MORTAL
+ NO_AGING
+ STERILE
+ FIT_FOR_ANIMATION
+ FIT_FOR_RESURRECTION
+ CE_REMOVE_TAG
+ CE_DISPLAY_TILE
+ CE_DISPLAY_NAME
+ CE_FLASH_TILE
+ CE_PHYS_ATT_CHANGE
+ CE_MENT_ATT_CHANGE
+ CE_BODY_APPEARANCE_MODIFIER
+ CE_BP_APPEARANCE_MODIFIER
+ CE_MATERIAL_FORCE_MULTIPLIER
+ CE_SPEED_CHANGE
+ CE_BODY_MAT_INTERACTION -- only works on hist figs, causes that hist figs body material to cause interaction as a syndrome mat.
+ CE_CAN_DO_INTERACTION
+ CE_BODY_TRANSFORMATION
+ CE_SKILL_ROLL_ADJUST
+ xml
+ the legends xml has a lot of new info for historical figures
+ entities
+ PLAINS gets BUILDS_OUTDOOR_TOMBS
+ PLAINS gets all the trap comps
+ world gen params
+ some have been replaced, here are the new ones (might be missing some):
+ NIGHT_TROLL_NUMBER -- all of the following control how many random definitions are created, if set to zero that world won't have any
+ BOGEYMAN_NUMBER
+ VAMPIRE_NUMBER
+ WEREBEAST_NUMBER
+ SECRET_NUMBER
+ REGIONAL_INTERACTION_NUMBER
+ DISTURBANCE_INTERACTION_NUMBER
+ EVIL_CLOUD_NUMBER
+ EVIL_RAIN_NUMBER
+ graphics
+ SKELETON/ZOMBIE -> ANIMATED
+ announcements
+ there are some new ones, mostly or all at the bottom of the file
+ reactions
+ you can make BOOK items in reactions, and add PAGES improvements to them
+ pages are always blank though
+ new keys (this might not be it, but it wasn't many)
+ A_ACTION_ABILITY:A
+ A_ACTION_POWER:P
+ changed keys
+ A_BARTER_CURRENCY_2 -> O
+ removed keys
+ A_BARTER_CURRENCY_3 to 9
+
+******************************************************
+
+Auxiliary file changes for 0.31.25:
+
+ cave dragon stance strike skill removed, given claw attack
+
+******************************************************
+
+Auxiliary file changes for 0.31.24:
+
+ moved clay crafts key over to C (was conflicting with clay statue's s)
+ NECK_SPINE bodypart token correction (had NECK)
+ rodent man bite attack uses teeth now
+ dragon/hydra stance strike skill removed, given claw attack
+ guineachick -> keet
+
+******************************************************
+
+Auxiliary file changes for 0.31.23:
+
+ creature changes
+ added rodent man teeth
+ added ribcages to various underground animal peoples
+ penguins 2WINGS -> SIDE_FLIPPERS
+ platypus get AMPHIBIOUS/UNDERSWIM
+ changed sizes for most giant creatures
+ domestic birds and penguins get MUNDANE
+ reptile men get GENERIC_TEETH
+ prefstrings for some of the new giant creatures
+
+******************************************************
+
+Auxiliary file changes for 0.31.22:
+
+ new creature tag
+ [PRONE_TO_RAGE:<rate>] -- the creature follow its normal behavior, but flip out on occasion, higher rate = more flipping out
+ body detail
+ leathery egg shell
+ new material template
+ leathery egg shell
+ body parts
+ QUADRUPED_NECK, NECK_SPINE
+ various reptiles and others
+ leathery egg shell
+ temperate creatures
+ 4134: capybara sound typos
+ capybara tail removed
+ fixed some tokens in panda bp color tags
+ badger and allies
+ moose and allies
+ river/lake creatures
+ platypus and allies
+ tropical creatures
+ honey badger
+ giraffe tweaks
+ tundra creatures
+ some penguins and allies
+ subterranean creatures
+ rodent man
+
+******************************************************
+
+Auxiliary file changes for 0.31.20/21:
+
+ material changes
+ added [DO_NOT_CLEAN_GLOB] to fat, seed and wax materials
+ added [NO_STONE_STOCKPILE] to all inorganic_other entries
+ creature changes
+ deer antlers
+ fixed length text for shearable sheep
+ fixed some biome description issues in fish/cougar, other description issues
+ got rid of left/right on rhino horns
+ added numbing phantom spider bite
+ made reptile man bite attack secondary
+ fixed text for serpent man tail attack
+ closed some brackets
+ bullhead scale color
+ density/text fixes for eggs
+ PET_VALUE_DIVISOR to control bee value
+ changed the hair tissue plan to include wings
+ added EXTRAVISION to some more eyeless critters
+ added tissue layer thickness to alpaca/llama wool
+ honey bee wax gets [STOCKPILE_GLOB_PRESSED]
+ broke up VERMINHUNTER
+ AT_PEACE_WITH_WILDLIFE
+ RETURNS_VERMIN_KILLS_TO_OWNER
+ HUNTS_VERMIN
+ ADOPTS_OWNER
+ [SPECIFIC_FOOD:PLANT:<token>]
+ [SPECIFIC_FOOD:CREATURE:<token>]
+ [SOUND:<type>:<range>:<approximate period/timer>:<VOCALIZATION or NONE>:<verbs/out-of-sight noun>]
+ reaction changes
+ added [FOOD_STORAGE_CONTAINER] for mead reaction
+ changed key for jug glazing
+ language
+ betwitch -> bewitch
+ new announcement
+ CREATURE_SOUND
+
+******************************************************
+
+Auxiliary file changes for 0.31.19:
+
+ new soil - fired clay, added ceramic reaction information to clay and kaolinite
+ new inorganics - earthenware, stoneware, porcelain
+ new material tag
+ [YARN]
+ new creature tags
+ [APP_MOD_DESC_RANGE:<6 range numbers>] -- adjusts the numeric ranges for getting different adjectives in descriptions
+ [SHEARABLE_TISSUE_LAYER:<body part modifier like LENGTH>:<modifier level when ready>]
+ [LAYS_EGGS]
+ [EGG_MATERIAL:<mat tokens>]
+ [LAYS_UNUSUAL_EGGS:<item tokens>]
+ [EGG_SIZE:<size>]
+ [CLUTCH_SIZE:<min>:<max>]
+ [GRAZER:<amount of hunger removed per bite>] -- only grazer animals in your fort need to eat at this point
+ [ARTIFICIAL_HIVEABLE]
+ [HIVE_PRODUCT:<max in hive>:<timer>:<item/mat tags>]
+ [COLONY_EXTERNAL] -- this caste appears around the colony
+ [DIE_WHEN_VERMIN_BITE]
+ [REMAINS_ON_VERMIN_BITE_DEATH]
+ [UBIQUITOUS] -- creature will occur in absolutely every region that is a biome match (does not apply to evil/good)
+ new tool tag
+ [CONTAINER_CAPACITY:<amount>]
+ new reaction tags
+ [NOT_IMPROVED]
+ [DOES_NOT_ABSORB]
+ [PRODUCT_PASTE]
+ [PRODUCT_PRESSED]
+ [NOT_PRESSED]
+ [DOES_NOT_DETERMINE_PRODUCT_AMOUNT]
+ [CONTAINS:<reagent token>]
+ not respected in adv mode interface, didn't try nesting containers
+ multiple CONTAINS on one reagent supported if they don't overlap
+ new grass raws
+ added CAN_GLAZE reaction glass to STONE_TEMPLATE
+ added egg/plant oil/plant soap material templates
+ added egg tags to creatures all over (no amphibians/fish/insects yet)
+ rocknuts got oil (instead of adding a new plant)
+ new reactions for milling seeds with new paste tag for glob products
+ new reactions for firing and glazing jugs and other ceramics
+ new reactions related to beekeeping
+ new entries in dwarf/human entity entries for new jobs/reactions
+ creature_standard.txt
+ gobs: [NO_DRINK][NO_EAT] (they keep bonecarn)
+ creature_domestic.txt
+ many new entries
+ new unit types
+ SHEARER
+ SPINNER
+ POTTER
+ GLAZER
+ PRESSER
+ BEEKEEPER
+ WAX_WORKER
+ new labor types
+ SHEARER
+ SPINNER
+ POTTERY
+ GLAZING
+ BEEKEEPING
+ WAX_WORKING
+ new skill type
+ SHEARING
+ SPINNING
+ POTTERY
+ GLAZING
+ BEEKEEPING
+ WAX_WORKING
+ new job item flag
+ ANY_STRAND_TISSUE
+ ANY_YARN_MATERIAL
+ new keys
+ [HOTKEY_FARMER_SHEAR_CREATURE:S]
+ [HOTKEY_FARMER_SPIN_THREAD:SHIFT+S]
+ [ORDERS_REFUSE_DUMP_STRAND_TISSUE:H]
+ [HOTKEY_CLOTHES_MAT_YARN:Y]
+ [HOTKEY_LOOM_WEAVE_YARN:Y]
+ [HOTKEY_BUILDING_NEST_BOX:SHIFT+N]
+ [HOTKEY_BUILDING_HIVE:ALT+H]
+ [CIVZONE_PEN:N]
+ [CIVZONE_PEN_OPTIONS:SHIFT+N]
+ [CIVZONE_CLAY_COLLECT:C]
+ [HOTKEY_COLLECT_CLAY:C]
+ [HIVE_INSTALL_COLONY:C]
+ [HIVE_GATHER_PRODUCTS:G]
+ [HOTKEY_CRAFTS_YARN:Y]
+ [HOTKEY_CRAFTS_SEL_WOOD:W]
+ [HOTKEY_CRAFTS_SEL_BONE:B]
+ [HOTKEY_CRAFTS_SEL_SHELL:S]
+ changed goblet keys to ALT+G
+
+******************************************************
+
+Auxiliary file changes for 0.31.18:
+
+ data/index
+
+ creature_standard.txt
+ added elite ranged unit names for dwarves
+ entity_default.txt
+ gave humans METAL/GEM/STONE_PREF
+ gave gobs METAL_PREF and got rid of gem professions
+ gave kobs METAL_PREF/STONE_PREF/FURNACE_OPERATOR for the time being at least, though this will probably change
+ item_weapon.txt
+ changed a few two-handed sizes
+
+******************************************************
+
+Auxiliary file changes for 0.31.17:
+
+ data/index
+
+ announcements.txt
+ [NIGHT_ATTACK_STARTS:A_D:D_D:BOX]
+ [NIGHT_ATTACK_ENDS:A_D:D_D:BOX]
+ [NIGHT_ATTACK_TRAVEL:A_D:D_D]
+ [GHOST_ATTACK:A_D:D_D]
+ [LAIR_HUNTER:A_D:D_D]
+ [TRAVEL_SITE_DISCOVERY:A_D:D_D:BOX]
+ [TRAVEL_SITE_BUMP:A_D:D_D]
+ [ADVENTURE_INTRO:BOX]
+ removed
+ COMBAT_WRESTLE_PINCH
+ COMBAT_WRESTLE_GOUGE
+ COMBAT_WRESTLE_STRANGLE
+ COMBAT_SHAKE
+ world_gen.txt
+ [NIGHT_CREATURE_NUMBER:<number of definitions>]
+ body_default/rcp.txt
+ neck changed over to upper spine (left NECK token), category SPINE
+ neck and lower spine get CONNECTOR
+ upper spine in lower body changed to middle spine
+ creature_large_mountain.txt
+ voice mannerisms neck -> throat
+ creature_standard.txt
+ humans, elves and dwarves get [SPOUSE_CONVERSION_TARGET]
+ added ogress caste name to ogre
+ minotaur gets lair, habit and [NATURAL_SKILL] tags
+ other semis/megas get basic lair stuff
+ dragon/hydra get NOEXERT
+ dragon got willpower boost, skill tags
+ hydra gets skill tags
+ gremlin gets skill tag
+ removed cluster numbers from all semimegabeasts, (unused) pop number from bronze colossus
+ voice mannerisms neck -> throat
+ creature_subterranean.txt
+ voice mannerisms neck -> throat
+ creature_next_underground.txt
+ tweaked DIFFICULTY numbers, which are used for fame rewards now
+ gave blind cave ogre extra vision
+ entity_default.txt
+ BUILDS_OUTDOOR_FORTIFICATIONS added to PLAINS entity
+ banditry tags on humans, goblins and kobolds
+ BANDITRY:<perc>
+ LOCAL_BANDITRY
+ inorganic_stone_soil.txt
+ went over to new SOIL_TEMPLATE
+ xml
+ new historical events: change creature type, hist figure revived
+ added "put to rest", "vanish" and "scared to death" kill causes
+ new site names "hamlet" "town" "fortress" "labyrinth" "lair" "shrine"
+ item_tool.txt
+ new file, used only by adv mode peasants and lair creatures at this point
+ new keys
+ [HOTKEY_BUILDING_SLAB:ALT+S]
+ [HOTKEY_MASON_SLAB:ALT+S]
+ [HOTKEY_CRAFTS_SLAB:ALT+S]
+ [A_TRAVEL_SLEEP:SHIFT+Z]
+ [A_TRAVEL_MAP:M]
+ [A_TRAVEL_HIDE_INSTRUCTIONS:H]
+ [A_SLEEP_SLEEP:S]
+ [A_SLEEP_WAIT:W]
+ [A_SLEEP_DAWN:D]
+ [ORDERS_REFUSE_OUTSIDE_VERMIN:V]
+ [A_COMPANIONS:C]
+ [A_ATTACK_CONFIRM:ALT+Y]
+ renamed
+ A_MOVE_WAIT -> A_MOVE_SAME_SQUARE
+ changed
+ [A_CENTER:V]
+ [A_COMBAT:SHIFT+C]
+ graphics example
+ added GHOST to the list of texture options
+ new bp tag
+ CONNECTOR -- child part with CONNECTOR keeps parent unsevered until receiving severing damage itself
+ new creature tags
+ NIGHT_CREATURE_HUNTER
+ NIGHT_CREATURE_BOGEYMAN
+ SPOUSE_CONVERTER
+ CONVERTED_SPOUSE
+ SPOUSE_CONVERSION_TARGET
+ LAIR_HUNTER
+ LAIR_HUNTER_SPEECH:<speech file>
+ HABIT:<habit token>:<percentage>
+ HABIT_NUM:<TEST_ALL or a number>
+ NATURAL_SKILL:<skill token>:<amount>
+ skill starts here and cannot rust below here
+ CREATURE_SOLDIER_TILE:<tile>
+ SOLDIER_ALTTILE:<tile>
+ CASTE_SOLDIER_TILE:<tile>
+ CASTE_SOLDIER_ALTTILE:<tile>
+ SKILL_LEARN_RATES:<percentage>
+ SKILL_RUST_RATES:<3 rust tags from SKILL_RATES>
+ SKILL_RATE:<skill token>:<4 tags from SKILL_RATES>
+ SKILL_LEARN_RATE:<skill token>:<percentage>
+ SKILL_RUST_RATE:<skill token>:<3 rust tags from SKILL_RATES>
+
+******************************************************
+
+Auxiliary file changes for 0.31.16:
+
+ data/index
+
+ d_init.txt
+ [WALKING_SPREADS_SPATTER_DWF:NO]
+ [WALKING_SPREADS_SPATTER_ADV:YES]
+
+******************************************************
+
+Auxiliary file changes for 0.31.15:
+
+ data/index
+
+ building_custom.txt
+ added blocked tiles to soap maker
+ body_default.txt
+ 3EYES added
+ body_rcp.txt
+ RCP_3_EYES has [LEFT] removed from center eye
+ creature_large_temperate.txt
+ gave rhesus tail
+ creature_large_tropical.txt
+ made elephant tusk attack co-MAIN with kicks
+ creature_next_underground.txt
+ added EXTRAVISION to voracious cave crawler
+ added 2HEAD_HORN to crundle BODY and made them grow up faster
+ added LARGE_ROAMING and NOBREATHE to magma crab
+ added LARGE_ROAMING and LARGE_PREDATOR to helmet snake
+ added LARGE_ROAMING to cave dragon
+ added LARGE_ROAMING to giant earthworm
+ made amethyst men die as ROUGH instead of BOULDER
+ fixed blind cave bear rear toes (they were front instead of rear)
+ creature_savage_tropical.txt
+ moved giant desert scorpion over to chitin templates
+ gave tigermen ears and ribcages
+ creature_standard.txt
+ strangler gets 3EYES instead of 2EYES:1EYE and gave them MALE/FEMALE castes
+ added nouns for eye modifiers for cyclops to fix description typos and got rid of their large iris modifier
+ because of some announces with noun/verb agreement there
+ removed humanoid head/ribcage positioning from grimelings
+ creature_subterranean.txt
+ fixed melting point on fire imp blood
+ gave cave swallow man wings in addition to arms
+ stuck tail on olm
+ removed MUNDANE from fire snake
+ made all the ant man castes grow up faster and made them live a little longer
+ made amphibian men grow up faster
+ inorganic_metal.txt
+ put bending values back in sterling silver
+ item_weapon.txt
+ fixed short sword and battle axe pommel attack contact area (1000 -> 100 like other weapons)
+ material_template_default.txt
+ added [ROTS] to STRUCTURAL_PLANT_TEMPLATE and LEAF_TEMPLATE
+ plant_standard.txt
+ fixed quarry bush LEAVES tile/color mix up
+ world_gen.txt
+ stopped doubling up CAVE_MIN_SIZE in the exporter and initial file
+
+******************************************************
+
+Auxiliary file changes for 0.31.14:
+ data/index
+
+ raws
+ new mineral tag for slade -- [UNDIGGABLE] until digging accounts for things properly
+ changed material properties for raw adamantine
+
+ New world gen parameters
+ [SITE_CAP:<number>]
+ Limits overall number of sites to this.
+ Caves and ruins are included in this number, so world gen civ spread stops cold once it is attained the way things currently go.
+
+ [MEGABEAST_CAP:<number>]
+ Attempts to place this many megabeast groups (also effectively capped by total cave number).
+ In vanilla DF, there are no megabeasts that actually occur in groups, but it is possible in mods.
+ Placing more beasts than caves will cause all caves to be filled by megabeasts. This will leave nothing for races like kobolds.
+ Can be zero if you don't want any megabeasts.
+
+ [SEMIMEGABEAST_CAP:<number>]
+ Attempts to place this many semimegabeast groups (they get the last cave remnants).
+ Because they get the last available caves, setting this to maximum causes all remaining caves to be filled with civs unaffected.
+ Can be zero if you don't want any semimegabeasts.
+
+******************************************************
+
+Auxiliary file changes for 0.31.13:
+ data/index
+ raws
+ entity_default.txt -- START_GROUP NUMBER is gone
+ made horn silver use the stone template
+ moved all native metals off of metal template
+
+******************************************************
+
+Auxiliary file changes for 0.31.12:
+ data/index
+ raws
+ creature_standard.txt -- added an extra NONE to kobold rates
+
+******************************************************
+
+Auxiliary file changes for 0.31.11:
+ data/index
+ data/help -- a few typos in files here
+ raws
+ creature_large_ocean.txt -- removed duplicate cluster number on tuna
+ creature_large_temperate.txt -- buzzard given MUNDANE flag, corrected typo in deer description
+ creature_large_tropical.txt -- vulture given MUNDANE flag
+ creature_large_tundra.txt -- corrected hair name for musk ox (was skin)
+ creature_next_underground.txt -- gave giant earthworm larger size
+ creature_other.txt -- removed duplicate natural tag from a few entries
+ creature_small_mammals.txt -- removed duplicate natural tag from all entries
+ creature_subterranean.txt -- removed duplicate natural tag from a few entries
+
+******************************************************
+
+Auxiliary file changes for 0.31.10:
+ data/index
+ data/help/a_keys -- added the 'x' instructions
+
+******************************************************
+
+Auxiliary file changes for 0.31.09:
+ data/index
+ data/speech
+ several files shortened
+ interface.txt
+ new keys
+ [A_ACTION:X]
+ [A_ACTION_CREATE:C]
+ [A_ACTION_BUTCHER:B]
+ raws
+ various numbers changed for weapons, ammo, materials (esp. metals)
+ rock sharpening reaction in reaction_other
+ new announcement
+ ANNOUNCEMENT_ADV_REACTION_PRODUCTS
+
+******************************************************
+
+Auxiliary file changes for 0.31.07:
+ data/index
+ data/init/init.txt, SDL version
+ mode examples added
+ data/init/d_init.txt
+ [PILLAR_TILE:'O']
+ interface.txt, SDL version
+ new keys
+ [BIND:FPS_UP:REPEAT_SLOW]
+ [SYM:4:Equals]
+ [BIND:FPS_DOWN:REPEAT_SLOW]
+ [SYM:4:Minus]
+
+******************************************************
+
+Auxiliary file changes for 0.31.06:
+ data/index
+ Non-legacy init.txt is set to 2D mode by default now
+ raw/objects/creature_annelids.txt
+ removed duplicate natural tag from worm
+ raw/objects/creature_domestic.txt
+ removed duplicate child tag from donkey
+ added trade capacity to horse
+ raw/objects/creature_insects.txt
+ removed duplicate color/tile tag from monarch butterfly
+ raw/objects/creature_large_tropical.txt
+ removed common domestic and pack animal from warthog
+ raw/objects/creature_small_ocean.txt
+ removed duplicate no sleep tags from oyster and mussel
+ raw/objects/creature_standard.txt
+ removed duplicate pet value tags from ice wolf, nightwing and werewolf
+ removed extra NECK from hydra body
+ raw/objects/inorganic_stone_layer.txt
+ removed duplicate obsidian melting point
+ raw/objects/language_words.txt
+ firey -> fiery
+ raw/objects/material_template_default.txt
+ updated many of the values so that for instance teeth aren't like skin in many ways
+
+******************************************************
+
+Auxiliary file changes for 0.31.05:
+ data/index
+ Non-legacy init.txt has new options:
+ [KEY_REPEAT_ACCEL_LIMIT:8]
+ [KEY_REPEAT_ACCEL_START:10]
+
+******************************************************
+
+Auxiliary file changes for 0.31.04:
+ data/index
+ init.txt has been broken up into init.txt, d_init.txt and colors.txt
+ For non-legacy versions, interface.txt has a different format and a few extra keys related to zoom and macros.
+
+******************************************************
+
+Auxiliary file changes for 0.31.03:
+ data/index
+
+New keys
+ [ARENA_CREATURE_UNDEAD:U]
+
+Creature raws
+ Fixed some broken apostrophes (mountain gnome, ocean sunfish, hungry head, harpy).
+ Moved [STANCE] to hands for ARMS_STANCE body parts.
+ Remove eye appearance modifiers from minotaurs.
+
+Entity raws
+ Removed the SOLDIER_COLOR] thing -- it corresponded to a note to myself to handle soldier-like entity position colors, but it was confusing people, so it's just in the notes themselves now.
+
+******************************************************
+
+Auxiliary file changes for 0.31.02:
+ data/index
+ readme.txt (added to and alphabetized 2010 tester credits)
+
+Creature raws
+ corrected gorlak display color
+ made blind cave bears eyeless and gave them extravision
+ corrected first line of body_rcp.txt
+ fixed broken eyelid relationships
+ fixed broken child names for goat/unicorn/cave swallow
+ swapped giant caste names
+ fixed giant cave spider bite (was blunt)
+ fixed alligator eye text
+ made soap bars instead of globs
+ fixed horn silver environment
+ added cookability/vermin eating to meat material templates
+ added cookability/vermin eating to plant leaf/seed materials
+
+******************************************************
+
+Auxiliary file changes for 0.31.01:
+ Most everything -- I can't compile a list of all of the changes here, but I've included more help notes in the raws themselves.
+
+******************************************************
+
+Auxiliary file changes for 0.28.181.40d:
+ data/index
+ data/init/init.txt (just the wiki date)
+
+******************************************************
+
+Auxiliary file changes for 0.28.181.40c:
+ data/index
+ data/init/init.txt
+
+Changed init options
+ [PARTIAL_PRINT:NO:2]
+
+******************************************************
+
+Auxiliary file changes for 0.28.181.40b:
+ data/index
+ data/init/init.txt
+
+New init options
+ [FULLGRID:80:25]
+ [PARTIAL_PRINT:NO]
+
+******************************************************
+
+Auxiliary file changes for 0.28.181.40a:
+ data/index
+ data/init/init.txt
+ data/init/interface.txt
+
+New keys
+ [SETUPGAME_SAVE_PROFILE:S]
+ [SETUPGAME_SAVE_PROFILE_ABORT:SHIFT+SPACE]
+ [SETUPGAME_SAVE_PROFILE_GO:ENTER]
+ [SETUPGAME_VIEW_PROFILE_PROBLEMS:P]
+ [ORDERS_AUTOFORBID:SHIFT+F]
+ [ORDERS_FORBID_PROJECTILE:P]
+ [ORDERS_FORBID_YOUR_CORPSE:C]
+ [ORDERS_FORBID_YOUR_ITEMS:I]
+ [ORDERS_FORBID_OTHER_CORPSE:O]
+ [ORDERS_FORBID_OTHER_ITEMS:T]
+ [SETUP_NOTES:N]
+ [SETUP_NOTES_TAKE_NOTES:N]
+ [SETUP_NOTES_DELETE_NOTE:D]
+ [SETUP_NOTES_CHANGE_SYMBOL_SELECTION:C]
+ [SETUP_NOTES_ADOPT_SYMBOL:S]
+
+New init options
+ [STORE_DIST_ITEM_DECREASE:1000]
+ [STORE_DIST_SEED_COMBINE:1000]
+ [STORE_DIST_BUCKET_COMBINE:1000]
+ [STORE_DIST_BARREL_COMBINE:1000]
+ [STORE_DIST_BIN_COMBINE:1000]
+
+******************************************************
+
+Auxiliary file changes for 0.28.181.39d:
+
+New keys
+ [D_NOTE:SHIFT+N]
+ [D_NOTE_PLACE:P]
+ [D_NOTE_DELETE:D]
+ [D_NOTE_ENTER:N]
+ [D_NOTE_ADOPT_SYMBOL:S]
+ [D_NOTE_CHANGE_SELECTION:C]
+ [WORLD_PARAM_REJECT_CONTINUE:C]
+ [WORLD_PARAM_REJECT_ABORT:A]
+ [WORLD_PARAM_REJECT_ALLOW_THIS:T]
+ [WORLD_PARAM_REJECT_ALLOW_ALL:P]
+ [WORLD_GEN_CONTINUE:C]
+ [WORLD_GEN_USE:U]
+ [WORLD_GEN_ABORT:A]
+ [SETUP_FIND:F]
+
+New init options
+ [SHOW_EMBARK_RIVER:FINDER]
+ [SHOW_EMBARK_POOL:FINDER]
+ [SHOW_EMBARK_M_PIPE:FINDER]
+ [SHOW_EMBARK_M_POOL:FINDER]
+ [SHOW_EMBARK_CHASM:FINDER]
+ [SHOW_EMBARK_PIT:FINDER]
+ [SHOW_EMBARK_OTHER:FINDER]
+ [SHOW_EMBARK_TUNNEL:FINDER]
+
+New world gen param
+ [CAVE_MIN_SIZE:<number>]
+ [SHOW_EMBARK_RIVER:<0=NO,1=FINDER,2=ALWAYS>]
+ [SHOW_EMBARK_POOL:<0=NO,1=FINDER,2=ALWAYS>]
+ [SHOW_EMBARK_M_POOL:<0=NO,1=FINDER,2=ALWAYS>]
+ [SHOW_EMBARK_M_PIPE:<0=NO,1=FINDER,2=ALWAYS>]
+ [SHOW_EMBARK_CHASM:<0=NO,1=FINDER,2=ALWAYS>]
+ [SHOW_EMBARK_PIT:<0=NO,1=FINDER,2=ALWAYS>]
+ [SHOW_EMBARK_OTHER:<0=NO,1=FINDER,2=ALWAYS>]
+ [SHOW_EMBARK_TUNNEL:<0=NO,1=FINDER,2=ALWAYS>]
+
+******************************************************
+
+Auxiliary file changes for 0.28.181.39a:
+
+New keys
+ [LEGENDS_TOGGLE_CIVSITE:C]
+ [LEGENDS_STRING_FILTER:F]
+ [WORLD_PARAM_COPY:C]
+ [WORLD_PARAM_SET:E]
+ [WORLD_PARAM_INCREASE:6]
+ [WORLD_PARAM_DECREASE:4]
+ [WORLD_PARAM_ENTER_VALUE:ENTER]
+ [WORLD_PARAM_NULLIFY:N]
+ [WORLD_PARAM_PRESET:P]
+ [SELECT_ALL:SHIFT+ENTER]
+ [DESELECT_ALL:SHIFT+Z]
+ [STORES_HIDE:H]
+ [ITEM_HIDE:H]
+ [D_BITEM_DUMP:H]
+ [D_LOOK_HIDE:H]
+ [DESIGNATE_BITEM:B]
+ [DESIGNATE_MELT:M]
+ [DESIGNATE_NO_MELT:SHIFT+M]
+ [DESIGNATE_DUMP:D]
+ [DESIGNATE_NO_DUMP:SHIFT+D]
+ [DESIGNATE_HIDE:H]
+ [DESIGNATE_NO_HIDE:SHIFT+H]
+ [UNITVIEW_KILLS:K]
+ [A_STATUS_KILLS:K]
+
+Changed keys
+ [DESELECT:Z]
+
+Creature raws
+ [CANNOT_UNDEAD]
+ [CURIOUSBEAST] -> [CURIOUSBEAST_EATER]
+ [SLOW_LEARNER]
+ got rid of [RECKLESS] because it wasn't used
+ [BUTCHERABLE_NONSTANDARD] is gone, replaced by civ ethics
+ [MUNDANE]
+ Marks if the creature is an actual real-life creature. Only used for age-names at present.
+ added/removed [NATURAL] from a few creatures
+
+Entity raws
+ messed with caps and lowered all biome numbers
+ [WANDERER]
+ [BEAST_HUNTER]
+ [SCOUT]
+ [PERMITTED_JOB:<x>]
+ [WORLD_CONSTRUCTION:<type>]
+ got rid of entity grouping
+ [ETHIC:<action>:<response>]
+ [WILL_ACCEPT_TRIBUTE]
+ got rid of respect animals/trees
+
+"TRACKING" is acceptable for skill token now
+
+Lots of new params for data/init/world_gen.txt
+
+New init options
+ [SHOW_ALL_HISTORY_IN_DWARF_MODE:NO]
+
+New graphics tokens:
+ SLAVE, PRISONER
+
+******************************************************
+
+Auxiliary file changes for 0.27.176.38b:
+
+Entity raws
+ removed *_SETTLEMENTS tags (they haven't done anything since the biome tags went in)
+ in addition to COMMON, UNCOMMON and RARE, armor/clothing types can also have FORCED, which forces the item to appear in all realizations of the entity
+
+New keys
+ [LEAVESCREEN_ALL:SHIFT+SPACE]
+ [MILITARY_ZOOM:C]
+ [STORES_FORBID:F]
+ [WORLD_PARAM_DIM_X_UP:I]
+ [WORLD_PARAM_DIM_X_DOWN:U]
+ [WORLD_PARAM_DIM_Y_UP:P]
+ [WORLD_PARAM_DIM_Y_DOWN:O]
+
+New init options
+ [AUTOSAVE_PAUSE:NO]
+ [EMBARK_WARNING_ALWAYS:NO]
+
+******************************************************
+
+Auxiliary file changes for 0.27.176.38a:
+
+Plant raws
+ [DROWN_LEVEL:<number from 0 to 7>]
+ The fluid level at which the plant dies in any liquid. Temperature effects from lava are separate.
+ 0 means that fluid level does not affect the plant. Default is 4.
+
+Wood raws
+ [TREE_DROWN_LEVEL:<number from 0 to 7>]
+ [SAPLING_DROWN_LEVEL:<number from 0 to 7>]
+ As above for plants (irrelevant for full-grown trees at this point).
+ Default is 4 for saplings and 7 for trees.
+
+New keys
+ [UNITVIEW_RELATIONSHIPS:R]
+ [UNITVIEW_RELATIONSHIPS_ZOOM:Z]
+ [UNITVIEW_RELATIONSHIPS_VIEW:V]
+ [BUILDINGLIST_ZOOM_T:T]
+ [BUILDINGLIST_ZOOM_Q:Q]
+
+New init options
+ [ZERO_RENT:NO]
+ [BABY_CHILD_CAP:100:1000]
+
+******************************************************
+
+Auxiliary file changes for 0.27.173.38a:
+
+New entity tags
+ [USE_EVIL_WOOD]
+ [USE_GOOD_WOOD]
+ [USE_EVIL_PLANTS]
+ [USE_GOOD_PLANTS]
+ [USE_GOOD_ANIMALS]
+ [USE_ANY_PET_RACE]
+ [USE_MISC_PROCESSED_WOOD_PRODUCTS]
+ [IMPROVED_BOWS]
+ [RESPECT_ANIMALS]
+ [RESPECT_TREES]
+ [LOW_SKILL]
+ [INVADERS_IGNORE_NEUTRALS]
+ [AT_PEACE_WITH_WILDLIFE]
+ [EQUIPMENT_IMPROVEMENTS]
+ [ABUSE_BODIES]
+ [SPHERE_ALIGNMENT:<sphere>:<amount>]
+ <amount> is a multiplicative modifier that runs from 0 to 25600 with 256 being the neutral value
+ [ART_FACET_MODIFIER:<facet>:<amount>]
+ <facet> is one of: OWN_RACE, FANCIFUL, EVIL, GOOD
+ <amount> as above
+ [ART_IMAGE_ELEMENT_MODIFIER:<art image element>:<amount>]
+ <art image element> is one of: CREATURE, PLANT, TREE, SHAPE, ITEM
+ <amount> as above
+ [ITEM_IMPROVEMENT_MODIFIER:<item improvement>:<amount>]
+ <item improvement> is one of:
+ ART_IMAGE
+ COVERED
+ RINGS_HANGING
+ BANDS
+ SPIKES
+ ITEMSPECIFIC
+ THREAD
+ CLOTH
+ SEWN_IMAGE
+ <amount> as above
+ [ADVENTURE_TIER:<placement>]
+ <placement> can run from 0 to 1000. 0 (the default) means the entity's sites won't be listed for adventure mode character creation.
+ Those entities with positive numbers are listed starting at tier 1. Within a tier, they are ordered by race index.
+ [FRIENDLY_COLOR:<front>:<back>:<brightness>]
+ [DEFAULT_SITE_TYPE:<site>]
+ Used during world gen.
+ <site> is one of:
+ DARK_FORTRESS
+ CAVE
+ CAVE_DETAILED
+ TREE_CITY
+ CITY
+ RUIN
+ [LIKES_SITE:<site>]
+ Used during hist fig sorting after play.
+ [TOLERATES_SITE:<site>]
+ Used by migrants.
+ [LEADER_TYPE:<unit>]
+ [SITE_LEADER_TYPE:<unit>]
+ [CAN_HAVE_MILITARY_LEADER]
+ [CAN_HAVE_MILITARY_SITE_LEADER]
+ [BIOME_SUPPORT:<biome>:<amount>]
+ <amount> ranges from 0 to 10.
+ <biome> can be any of the biome tags used for creatures, including the general groups. Don't put "BIOME_" in front.
+ [START_BIOME:<biome>]
+ [DIPLOMAT]
+ [MERCHANT_NOBILITY]
+ [TREE_CAP_DIPLOMACY]
+ [DIPLOMAT_BODYGUARDS]
+ [MERCHANT_BODYGUARDS]
+ [ACTIVE_SEASON:<season>]
+ [PROGRESS_TRIGGER_POPULATION:<number>]
+ [PROGRESS_TRIGGER_PRODUCTION:<number>]
+ [PROGRESS_TRIGGER_TRADE:<number>]
+ <number> is from 0 to 5.
+ [ENTITY_GROUPING:<group>]
+ <group> can be one of: FRIENDLY (default), EVIL, NUISANCE
+ Until things become more complicated, this tracks who they side with in fights and during dwarf mode diplomacy/trade.
+ [ITEM_THIEF]
+ [SKULKING]
+ This makes the severity of attacks depend on the extent of item/baby thievery rather than the passage of time.
+ [START_GROUP_NUMBER:<number>]
+ How many mated pairs (or single creatures if forced gender) are created at the beginning of world generation, counting any nobles/diplomats.
+ [MAX_SITE_POP_NUMBER:<number>]
+ How many members the entity can have during world generation in a single site.
+ [MAX_POP_NUMBER:<number]
+ How many members the entity can have during world generation total.
+ [RELIGION:<type>]
+ <type> can be PANTHEON, ANY_APPROPRIATE_POWER or REGIONAL_FORCE.
+ You can have more than one. It will choose one at random for each entity created using this template.
+ [RELIGION_SPHERE:<sphere>]
+ You can have more than one. In the case of a pantheon, gods will be created with the goal of covering all of the spheres either a directly or with an umbrella sphere. In the case of appropriate powers, the spheres are checked against the sphere's of the candidate power's race. [USE_GOOD_ANIMALS], [USE_GOOD_PLANTS] match with [GOOD] and similarly for [EVIL]. In this case, a sphere match is not required.
+ [MAYOR]
+ [MAX_STARTING_CIV_NUMBER:<number>]
+ How many of this entity it tries to place at the beginning of world generation, cycling through the available races.
+ It will currently place the total of these numbers or 50 civilizations, whichever is lower.
+
+New creature tags
+ [POWER]
+ Lets the creature be picked as a world generation civ leader by entities with [ANY_APPROPRIATE_POWER], provided the race is also immortal and has either matching good/evil tags or matching sphere tags.
+
+New sphere list (old ones included here, only old ones have endgame effects):
+ AGRICULTURE
+ ANIMALS
+ ART
+ BALANCE
+ BEAUTY
+ BIRTH
+ BLIGHT
+ BOUNDARIES
+ CAVERNS
+ CHAOS
+ CHARITY
+ CHILDREN
+ COASTS
+ CONSOLATION
+ COURAGE
+ CRAFTS
+ CREATION
+ DANCE
+ DARKNESS
+ DAWN
+ DAY
+ DEATH
+ DEFORMITY
+ DEPRAVITY
+ DISCIPLINE
+ DISEASE
+ DREAMS
+ DUSK
+ DUTY
+ EARTH
+ FAMILY
+ FAME
+ FATE
+ FERTILITY
+ FESTIVALS
+ FIRE
+ FISH
+ FISHING
+ FOOD
+ FORGIVENESS
+ FORTRESSES
+ FREEDOM
+ GAMBLING
+ GAMES
+ GENEROSITY
+ HAPPINESS
+ HEALING
+ HOSPITALITY
+ HUNTING
+ INSPIRATION
+ JEALOUSY
+ JEWELS
+ JUSTICE
+ LABOR
+ LAKES
+ LAWS
+ LIES
+ LIGHT
+ LIGHTNING
+ LONGEVITY
+ LOVE
+ LOYALTY
+ LUCK
+ LUST
+ MARRIAGE
+ MERCY
+ METALS
+ MINERALS
+ MISERY
+ MIST
+ MOON
+ MOUNTAINS
+ MUCK
+ MURDER
+ MUSIC
+ NATURE
+ NIGHT
+ NIGHTMARES
+ OATHS
+ OCEANS
+ ORDER
+ PAINTING
+ PEACE
+ PERSUASION
+ PLANTS
+ POETRY
+ PREGNANCY
+ RAIN
+ RAINBOWS
+ REBIRTH
+ REVELRY
+ REVENGE
+ RIVERS
+ RULERSHIP
+ RUMORS
+ SACRIFICE
+ SALT
+ SCHOLARSHIP
+ SEASONS
+ SILENCE
+ SKY
+ SONG
+ SPEECH
+ STARS
+ STORMS
+ STRENGTH
+ SUICIDE
+ SUN
+ THEFT
+ THRALLDOM
+ THUNDER
+ TORTURE
+ TRADE
+ TRAVELERS
+ TREACHERY
+ TREES
+ TRICKERY
+ TRUTH
+ TWILIGHT
+ VALOR
+ VICTORY
+ VOLCANOS
+ WAR
+ WATER
+ WEALTH
+ WEATHER
+ WIND
+ WISDOM
+ WRITING
+ YOUTH
+
+New graphics tokens
+ HIGH_PRIEST
+ PRIEST
+ SHOPKEEPER
+
+
+******************************************************
+
+Auxiliary file changes for 0.27.169.33g:
+
+New keys
+ [ASSIGNTRADE_STRING:S]
+ [ASSIGNTRADE_EXCLUDE_PROHIBITED:M]
+ [ASSIGNTRADE_PENDING:P]
+ [ASSIGNTRADE_SORT:D]
+
+New init options
+ [PAUSE_ON_LOAD:NO]
+ [EMBARK_RECTANGLE:6:6]
+
+******************************************************
+
+Auxiliary file changes for 0.27.169.33f:
+
+New graphics tokens
+ "MAYOR"
+ "LEADER"
+ "CAPTAIN_OF_THE_GUARD"
+ "SHERIFF"
+ "MANAGER"
+ "BOOKKEEPER"
+ "BROKER"
+
+In the absence of one of these, it will use their standard creature/profession tile, but you should include all seven of these for a given creature if you want multiple appointments to display properly. The picture multiple appointments is selected in the order given above, but if a tile doesn't exist for the first appointment, it will jump down to the regular profession tile.
+
+******************************************************
+
+Auxiliary file changes for 0.27.169.33e:
+
+Body raws
+ Allowed use of [SKELETON] to distinguish things like the spine that shouldn't be removed from skeletons. Temporary fix.
+
+******************************************************
+
+Auxiliary file changes for 0.27.169.33c:
+
+New init options
+ [PRIORITY:NORMAL]
+
+******************************************************
+
+Auxiliary file changes for 0.27.169.33a:
+
+New keys
+ [HOTKEY_CARPENTER_BLOCKS:O]
+
+******************************************************
+
+Auxiliary file changes for 0.27.169.32a:
+
+New init options
+ [VOLUME:255]
+ [TOPMOST:NO]
+ [SHOW_IMP_QUALITY:YES]
+ [SHOW_FLOW_AMOUNTS:NO]
+ [ECONOMY:YES]
+ [INVADERS:YES]
+ [CAVEINS:YES]
+ [ARTIFACTS:YES]
+ [PATH_COST:1:2:5:25]
+ [COFFIN_NO_PETS_DEFAULT:NO]
+ [RECENTER_INTERFACE_SHUTDOWN_MS:0]
+ [SKY:178:3:0:0]
+ [SKY:250:0:0:1]
+ [VSYNC:OFF]
+ [G_FPS_CAP:50]
+ [AUTOSAVE:NONE]
+ [AUTOBACKUP:NO]
+ [INITIAL_SAVE:NO]
+ [ADVENTURER_ALWAYS_CENTER:YES]
+
+New keys
+ [DESELECT:SHIFT+ENTER]
+ [OPTION_EXPORT:E]
+ [SETUPGAME_CUSTOMIZE_UNIT:C]
+ [LEGENDS_EXPORT_DETAILED_MAP:D]
+ [WORLD_PARAM_TITLE:T]
+ [WORLD_PARAM_ADD:A]
+ [WORLD_PARAM_DELETE:D]
+ [WORLD_PARAM_NAME_RANDOM:SHIFT+N]
+ [WORLD_PARAM_NAME_ENTER:N]
+ [WORLD_PARAM_SEED_RANDOM:SHIFT+S]
+ [WORLD_PARAM_SEED_ENTER:S]
+ [WORLD_PARAM_LOAD:F1]
+ [WORLD_PARAM_SAVE:F6]
+ [DESIGNATE_STAIR_UP:U]
+ [DESIGNATE_STAIR_DOWN:J]
+ [DESIGNATE_STAIR_UPDOWN:I]
+ [DESIGNATE_TRAFFIC:O]
+ [DESIGNATE_TRAFFIC_HIGH:H]
+ [DESIGNATE_TRAFFIC_NORMAL:N]
+ [DESIGNATE_TRAFFIC_LOW:L]
+ [DESIGNATE_TRAFFIC_RESTRICTED:R]
+ [DESIGNATE_TRAFFIC_INCREASE_WEIGHT:W]
+ [DESIGNATE_TRAFFIC_DECREASE_WEIGHT:Q]
+ [DESIGNATE_RAMP:R]
+ [DESIGNATE_CHANNEL:H]
+ [D_DEPOT:SHIFT+D]
+ [D_HOT_KEYS:H]
+ [D_HOTKEY1:F1]
+ [D_HOTKEY2:F2]
+ [D_HOTKEY3:F3]
+ [D_HOTKEY4:F4]
+ [D_HOTKEY5:F5]
+ [D_HOTKEY6:F6]
+ [D_HOTKEY7:F7]
+ [D_HOTKEY8:F8]
+ [D_HOTKEY9:SHIFT+F1]
+ [D_HOTKEY10:SHIFT+F2]
+ [D_HOTKEY11:SHIFT+F3]
+ [D_HOTKEY12:SHIFT+F4]
+ [D_HOTKEY13:SHIFT+F5]
+ [D_HOTKEY14:SHIFT+F6]
+ [D_HOTKEY15:SHIFT+F7]
+ [D_HOTKEY16:SHIFT+F8]
+ [BUILDING_ADVANCE_STAGE:D]
+ [BUILDING_EXPAND_CONTRACT:X]
+ [BUILDING_TRIGGER_ENABLE_WATER:W]
+ [BUILDING_TRIGGER_MIN_WATER_UP:S]
+ [BUILDING_TRIGGER_MIN_WATER_DOWN:A]
+ [BUILDING_TRIGGER_MAX_WATER_UP:X]
+ [BUILDING_TRIGGER_MAX_WATER_DOWN:Z]
+ [BUILDING_TRIGGER_ENABLE_MAGMA:M]
+ [BUILDING_TRIGGER_MIN_MAGMA_UP:I]
+ [BUILDING_TRIGGER_MIN_MAGMA_DOWN:U]
+ [BUILDING_TRIGGER_MAX_MAGMA_UP:K]
+ [BUILDING_TRIGGER_MAX_MAGMA_DOWN:J]
+ [BUILDING_TRIGGER_ENABLE_CREATURE:C]
+ [BUILDING_TRIGGER_ENABLE_LOCALS:L]
+ [BUILDING_TRIGGER_MIN_SIZE_UP:R]
+ [BUILDING_TRIGGER_MIN_SIZE_DOWN:E]
+ [BUILDING_TRIGGER_MAX_SIZE_UP:F]
+ [BUILDING_TRIGGER_MAX_SIZE_DOWN:D]
+ [BUILDING_TRIGGER_RESETS:O]
+ [HOTKEY_BUILDING_TRADEDEPOT:SHIFT+D]
+ [HOTKEY_BUILDING_TRAP:SHIFT+T]
+ [HOTKEY_BUILDING_SUPPORT:SHIFT+S]
+ [HOTKEY_BUILDING_ARCHERYTARGET:SHIFT+A]
+ [HOTKEY_BUILDING_MACHINE:SHIFT+M]
+ [HOTKEY_BUILDING_MACHINE_SCREW_PUMP:S]
+ [HOTKEY_BUILDING_MACHINE_WATER_WHEEL:W]
+ [HOTKEY_BUILDING_MACHINE_WINDMILL:M]
+ [HOTKEY_BUILDING_MACHINE_GEAR_ASSEMBLY:G]
+ [HOTKEY_BUILDING_MACHINE_AXLE_HORIZONTAL:H]
+ [HOTKEY_BUILDING_MACHINE_AXLE_VERTICAL:V]
+ [HOTKEY_BUILDING_ROAD_PAVED:O]
+ [HOTKEY_BUILDING_ROAD_DIRT:SHIFT+O]
+ [HOTKEY_BUILDING_HATCH:SHIFT+H]
+ [HOTKEY_BUILDING_GRATE_WALL:SHIFT+W]
+ [HOTKEY_BUILDING_GRATE_FLOOR:SHIFT+G]
+ [HOTKEY_BUILDING_BARS_VERTICAL:SHIFT+B]
+ [HOTKEY_BUILDING_BARS_FLOOR:ALT+B]
+ [HOTKEY_BUILDING_CONSTRUCTION:SHIFT+C]
+ [HOTKEY_BUILDING_CONSTRUCTION_WALL:W]
+ [HOTKEY_BUILDING_CONSTRUCTION_FLOOR:F]
+ [HOTKEY_BUILDING_CONSTRUCTION_RAMP:R]
+ [HOTKEY_BUILDING_CONSTRUCTION_STAIR_UP:U]
+ [HOTKEY_BUILDING_CONSTRUCTION_STAIR_DOWN:D]
+ [HOTKEY_BUILDING_CONSTRUCTION_STAIR_UPDOWN:X]
+ [HOTKEY_BUILDING_CONSTRUCTION_FORTIFICATION:SHIFT+F]
+ [HOTKEY_BUILDING_TRAP_SPIKE:SHIFT+S]
+ [HOTKEY_GLASS_HATCH_COVER:SHIFT+H]
+ [HOTKEY_GLASS_GRATE:SHIFT+G]
+ [HOTKEY_CARPENTER_HATCH_COVER:SHIFT+H]
+ [HOTKEY_CARPENTER_GRATE:SHIFT+G]
+ [HOTKEY_MASON_HATCH_COVER:SHIFT+H]
+ [HOTKEY_MASON_GRATE:SHIFT+G]
+ [HOTKEY_TRAP_HATCH:H]
+ [HOTKEY_TRAP_GRATE_WALL:W]
+ [HOTKEY_TRAP_GRATE_FLOOR:G]
+ [HOTKEY_TRAP_BARS_VERTICAL:SHIFT+B]
+ [HOTKEY_TRAP_BARS_FLOOR:ALT+B]
+ [HOTKEY_TRAP_SPIKE:SHIFT+S]
+ [HOTKEY_TRAP_GEAR_ASSEMBLY:A]
+ [SETUP_NAME_FORT:SHIFT+F]
+ [SETUP_NAME_GROUP:SHIFT+G]
+ [SETUP_RECLAIM:SHIFT+R]
+ [SETUP_LOCAL_Y_UP:SHIFT+U]
+ [SETUP_LOCAL_Y_DOWN:SHIFT+M]
+ [SETUP_LOCAL_X_UP:SHIFT+K]
+ [SETUP_LOCAL_X_DOWN:SHIFT+H]
+ [SETUP_LOCAL_Y_MUP:U]
+ [SETUP_LOCAL_Y_MDOWN:M]
+ [SETUP_LOCAL_X_MUP:K]
+ [SETUP_LOCAL_X_MDOWN:H]
+ [SETUP_BIOME_1:F1]
+ [SETUP_BIOME_2:F2]
+ [SETUP_BIOME_3:F3]
+ [SETUP_BIOME_4:F4]
+ [SETUP_BIOME_5:F5]
+ [SETUP_BIOME_6:F6]
+ [SETUP_BIOME_7:F7]
+ [SETUP_BIOME_8:F8]
+ [SETUP_BIOME_9:F9]
+ [CHOOSE_NAME_RANDOM:R]
+ [CHOOSE_NAME_CLEAR:C]
+ [CHOOSE_NAME_TYPE:T]
+ [D_CIVZONE:I]
+ [CIVZONE_REMOVE:X]
+ [CIVZONE_WATER_SOURCE:W]
+ [CIVZONE_FISH:F]
+ [CIVZONE_DUMP:G]
+ [CIVZONE_DUMP:P]
+ [CIVZONE_SAND_COLLECT:S]
+ [CIVZONE_MEETING:M]
+ [CIVZONE_ACTIVE:A]
+ [CIVZONE_POND_OPTIONS:SHIFT+P]
+ [CIVZONE_POND_WATER:F]
+ [D_BITEM_FORBID:F]
+ [D_BITEM_DUMP:D]
+ [D_BITEM_MELT:M]
+ [D_LOOK_FORBID:F]
+ [D_LOOK_DUMP:D]
+ [D_LOOK_MELT:M]
+ [DESIGNATE_SMOOTH:S]
+ [DESIGNATE_ENGRAVE:E]
+ Various STRING keys
+ [A_MOVE_N:8]
+ [A_MOVE_S:2]
+ [A_MOVE_E:6]
+ [A_MOVE_W:4]
+ [A_MOVE_NW:7]
+ [A_MOVE_NE:9]
+ [A_MOVE_SW:1]
+ [A_MOVE_SE:3]
+ [A_MOVE_WAIT:5]
+ [A_CARE_MOVE_N:ALT+8]
+ [A_CARE_MOVE_S:ALT+2]
+ [A_CARE_MOVE_E:ALT+6]
+ [A_CARE_MOVE_W:ALT+4]
+ [A_CARE_MOVE_NW:ALT+7]
+ [A_CARE_MOVE_NE:ALT+9]
+ [A_CARE_MOVE_SW:ALT+1]
+ [A_CARE_MOVE_SE:ALT+3]
+ [A_CARE_MOVE_UPDOWN:ALT+5]
+ [A_MOVE_N_UP:SHIFT+8]
+ [A_MOVE_S_UP:SHIFT+2]
+ [A_MOVE_E_UP:SHIFT+6]
+ [A_MOVE_W_UP:SHIFT+4]
+ [A_MOVE_NW_UP:SHIFT+7]
+ [A_MOVE_NE_UP:SHIFT+9]
+ [A_MOVE_SW_UP:SHIFT+1]
+ [A_MOVE_SE_UP:SHIFT+3]
+ [A_MOVE_UP:SHIFT+5]
+ [A_MOVE_N_DOWN:CTRL+8]
+ [A_MOVE_S_DOWN:CTRL+2]
+ [A_MOVE_E_DOWN:CTRL+6]
+ [A_MOVE_W_DOWN:CTRL+4]
+ [A_MOVE_NW_DOWN:CTRL+7]
+ [A_MOVE_NE_DOWN:CTRL+9]
+ [A_MOVE_SW_DOWN:CTRL+1]
+ [A_MOVE_SE_DOWN:CTRL+3]
+ [A_MOVE_DOWN:CTRL+5]
+ [A_MOVE_UP_AUX:SHIFT+COMMA]
+ [A_MOVE_DOWN_AUX:SHIFT+PERIOD]
+ [A_MOVEMENT:M]
+ [A_MOVEMENT_SWIM:S]
+ [CURSOR_UP_Z_AUX:SHIFT+5]
+ [CURSOR_DOWN_Z_AUX:CTRL+5]
+ [NOBLELIST_REPLACE:R]
+ [NOBLELIST_SETTINGS:S]
+ [NOBLELIST_VIEW_CANDIDATE:V]
+ [BUILDJOB_DEPOT_REQUEST_TRADER:R]
+ [BUILDJOB_DEPOT_BROKER_ONLY:B]
+ [BUILDJOB_FARM_WINTER:D]
+ [A_CUST_NAME:C]
+ [A_RANDOM_NAME:R]
+ [A_CHANGE_GENDER:G]
+
+Changed keys
+ [DESIGNATE_TOGGLE_ENGRAVING:V]
+ all CHASM keys changed to DUMP
+
+Removed keys
+ All STRING keys except BACKSPACE
+ old adamantine keys
+ [BUILDING_PLACE:P]
+ [HOTKEY_BUILDING_ROAD:O]
+ [HOTKEY_BUILDING_AQUEDUCT:Q]
+ [HOTKEY_BUILDING_CHANNEL:U]
+ [HOTKEY_MASON_MAT_GRAY:G]
+ [HOTKEY_MASON_MAT_LIGHT:O]
+ [HOTKEY_MASON_MAT_DARK:M]
+ [HOTKEY_CRAFTS_MAT_STONE_L:M]
+ [HOTKEY_CRAFTS_MAT_STONE_D:O]
+ [HOTKEY_SMELT_COPPER:C]
+ [HOTKEY_SMELT_TIN:T]
+ [HOTKEY_SMELT_BRONZE:Z]
+ [HOTKEY_SMELT_BRASS:R]
+ [HOTKEY_SMELT_IRON:I]
+ [HOTKEY_SMELT_PIGIRON:P]
+ [HOTKEY_SMELT_STEEL:E]
+ [HOTKEY_SMELT_SILVER:S]
+ [HOTKEY_SMELT_ELECTRUM:M]
+ [HOTKEY_SMELT_GOLD:G]
+ [HOTKEY_SMELT_PLATINUM:A]
+ [HOTKEY_SMELT_COAL:Q]
+ [HOTKEY_TRAP_TRIGGERTEMP:T]
+ [DESIGNATE_DETAIL:S]
+ [D_GATE:G]
+ [D_SET_GATE:SHIFT+G]
+ [A_SAMESQUARE:5]
+ [BUILDJOB_CHANNEL_ASSIGN_OCC:A]
+ [BUILDJOB_CHANNEL_WATER:W]
+
+Material tokens
+ [BLOOD_SPECIFIC:<creature token>]
+ [BLOOD_NONSPECIFIC:<any combination of RGCBMWY0, must have at least one>]
+ [PLANT_ALCOHOL]
+
+Creature raws
+ Allowed any matgloss for itemgloss drops, any standard racegloss permitted, body mat can use matgloss WOOD,STONE,PLANT,GEM, for stone can use USE_LAVA_STONE
+ Things like [LARGE_CHASM] are gone, all replaced by [LARGE_ROAMING] + biome, some vermin types condensed/added
+ Got rid of [ADD_VERSION]
+ [SESSILE_LAND] -> [IMMOBILE_LAND]
+
+Wood raws
+ Now uses frequency
+ [TILE:<symbol>]
+ [COLOR:<front>:<back>:<brightness>]
+ [DEAD_TILE:<symbol>]
+ [DEAD_COLOR:<front>:<back>:<brightness>]
+ [SAPLING_TILE:<symbol>]
+ [SAPLING_COLOR:<front>:<back>:<brightness>]
+ [DEAD_SAPLING_TILE:<symbol>]
+ [DEAD_SAPLING_COLOR:<front>:<back>:<brightness>]
+
+Plant raws
+ [DEAD_TILE:<symbol>]
+ [DEAD_COLOR:<front>:<back>:<brightness>]
+ [SHRUB_TILE:<symbol>]
+ [SHRUB_COLOR:<front>:<back>:<brightness>]
+ [DEAD_SHRUB_TILE:<symbol>]
+ [DEAD_SHRUB_COLOR:<front>:<back>:<brightness>]
+
+Stone raws
+ got rid of [RIVER], [LIGHT], [DARK]
+ [VALUE]
+ Various layering information
+ Got rid of gem subtypes, folded gems into stone
+
+Added metal and reaction raws
+
+Trap component raws
+ [IS_SCREW]
+ [WOOD]
+ [METAL]
+
+Misc. Raws
+ [BIOME_ANY_WETLAND]
+ New biomes for lakes/river/pools/ocean
+ Added density values
+
+******************************************************
+
+Auxiliary file changes for 0.23.125.23a:
+
+New init options
+ [POPULATION_CAP:200]
+ [FPS_CAP:100]
+
+New keys
+ [BUILDJOB_COFFIN_CIV:C]
+ [BUILDJOB_COFFIN_PET:P]
+ [UNITVIEW_SLAUGHTER:S]
+
+******************************************************
+
+Auxiliary file changes for 0.22.123.23a:
+
+New keys
+ [ORDERS_WORKSHOP:SHIFT+W]
+ [ORDERS_COLLECT_WEB:W]
+ [ORDERS_SLAUGHTER:S]
+ [ORDERS_BUTCHER:B]
+ [ORDERS_TAN:T]
+
+Weapon raws
+ [STICK_CHANCE:0] this modifies the stick-in chance from the default for the damage type
+
+Creature raws
+ [SPECNAME:<type>:<sing>:<plural>:<adj>] the only terms it takes for the type entry are MALE and FEMALE
+ example: [SPECNAME:MALE:bull:bulls:bull]
+
+******************************************************
+
+Auxiliary file changes for 0.22.121.23b:
+
+New init options
+ [TEMPERATURE:YES]
+ [WEATHER:YES]
+
+Creature raws
+ [ALCOHOL_DEPENDENT] for dwarves
+
+******************************************************
+
+Auxiliary file changes for 0.22.120.23b:
+
+New keys
+[CURSOR_UP_FAST:SHIFT+8]
+[CURSOR_DOWN_FAST:SHIFT+2]
+[CURSOR_LEFT_FAST:SHIFT+4]
+[CURSOR_RIGHT_FAST:SHIFT+6]
+[CURSOR_UPLEFT_FAST:SHIFT+7]
+[CURSOR_UPRIGHT_FAST:SHIFT+9]
+[CURSOR_DOWNLEFT_FAST:SHIFT+1]
+[CURSOR_DOWNRIGHT_FAST:SHIFT+3]
+
+Removed keys
+[INTERFACEKEY_SQUAD_CURSOR]
+
+Temperature in the raws:
+
+The temperature scale has freezing of water at 10000, and moves roughly at a fahrenheit scale. Water boils at 10180, for example.
+This means that temperatures can go well below absolute zero, but fantasy runs that way.
+Water has spec heat 4.181 J/gC, and this is stored as 4181 in the raws.
+Spec heat changes with change of state are not currently supported.
+
+Creature raws
+ [SPEC_HEAT:amount 0-60000 or NONE]/default NONE
+ [HEATDAM_POINT:temp 0-60000 or NONE]/default NONE
+ [COLDDAM_POINT:temp 0-60000 or NONE]/default NONE
+ [IGNITE_POINT:temp 0-60000 or NONE]/default NONE
+ [MELTING_POINT:temp 0-60000 or NONE]/default NONE
+ [BOILING_POINT:temp 0-60000 or NONE]/default NONE
+ [FIXED_TEMP:temp 0-60000 or NONE]/default NONE
+
+ You can also add the words "LEATHER" "BONE" "EXTRACT" "CHEESE" "DRINK" "SILK" in front of these, e.g. [SILK_IGNITE_POINT:10300].
+
+ [STANDARD_FLESH]/sets values above to reasonable numbers for a standard fleshy creature
+ [MATERIAL:mat:matg]/sets values above to the numbers matching the given material
+ [HOMEOTHERM:temp 0-60000 or NONE]/default NONE
+
+Plant raws
+ [SPEC_HEAT:amount 0-60000 or NONE]/default 420
+ [HEATDAM_POINT:temp 0-60000 or NONE]/default 10250
+ [COLDDAM_POINT:temp 0-60000 or NONE]/default 9900
+ [IGNITE_POINT:temp 0-60000 or NONE]/default 10508
+ [MELTING_POINT:temp 0-60000 or NONE]/default NONE
+ [BOILING_POINT:temp 0-60000 or NONE]/default NONE
+ [FIXED_TEMP:temp 0-60000 or NONE]/default NONE
+
+ You can also add the words "CLOTH" "EXTRACT" "CHEESE" "DRINK" in front of these
+ as in [CLOTH_IGNITE_POINT:10300].
+
+Stone raws
+ [SPEC_HEAT:amount 0-60000 or NONE]/default 800
+ [HEATDAM_POINT:temp 0-60000 or NONE]/default NONE
+ [COLDDAM_POINT:temp 0-60000 or NONE]/default NONE
+ [IGNITE_POINT:temp 0-60000 or NONE]/default NONE
+ [MELTING_POINT:temp 0-60000 or NONE]/default 11500
+ [BOILING_POINT:temp 0-60000 or NONE]/default 14000
+ [FIXED_TEMP:temp 0-60000 or NONE]/default NONE
+
+Gem raws
+ [SPEC_HEAT:amount 0-60000 or NONE]/default 1800
+ [HEATDAM_POINT:temp 0-60000 or NONE]/default NONE
+ [COLDDAM_POINT:temp 0-60000 or NONE]/default NONE
+ [IGNITE_POINT:temp 0-60000 or NONE]/default NONE
+ [MELTING_POINT:temp 0-60000 or NONE]/default 12268
+ [BOILING_POINT:temp 0-60000 or NONE]/default 14368
+ [FIXED_TEMP:temp 0-60000 or NONE]/default NONE
+
+Wood raws
+ [SPEC_HEAT:amount 0-60000 or NONE]/default 420
+ [HEATDAM_POINT:temp 0-60000 or NONE]/default 10250
+ [COLDDAM_POINT:temp 0-60000 or NONE]/default 9900
+ [IGNITE_POINT:temp 0-60000 or NONE]/default 10508
+ [MELTING_POINT:temp 0-60000 or NONE]/default NONE
+ [BOILING_POINT:temp 0-60000 or NONE]/default NONE
+ [FIXED_TEMP:temp 0-60000 or NONE]/default NONE
+
+******************************************************
+
+Auxiliary file changes for 0.22.120.23a:
+
+New keys
+[BUILDJOB_STOCKPILE_BARREL_ZERO:SHIFT+E]
+[BUILDJOB_STOCKPILE_BARREL_MAX:SHIFT+R]
+[BUILDJOB_STOCKPILE_BIN_ZERO:SHIFT+C]
+[BUILDJOB_STOCKPILE_BIN_MAX:SHIFT+V]
+
+MATGLOSS Raws
+
+ Added plurals to gem names
+
+There is now a graphics subfolder in the raw folder. See graphics_example.txt in that folder for a sample. In order to see your creature tiles, you have to go into the init.txt file and set [GRAPHICS:YES]. You'll find other options there as well.
+
+******************************************************
+
+Auxiliary file changes for 0.22.110.23a:
+
+New init options
+[ADVENTURER_TRAPS:NO]
+
+New keys
+[HOTKEY_BUILDING_WORKSHOP_DYER:D]
+[HOTKEY_DYER_THREAD:T]
+[HOTKEY_DYER_CLOTH:C]
+[HOTKEY_CLOTHES_IMAGE:I]
+[HOTKEY_LEATHER_IMAGE:I]
+[ORDERS_LOOM:L]
+[ORDERS_DYED_CLOTH:D]
+
+DESCRIPTOR Raws
+
+ These are a new class of raws that handle colors and shapes.
+
+ [COLOR:<identifier>]/[COLOR:RED]
+ [NAME:<text you want to see>]/[NAME:red]
+ [WORD:<word token>]/[WORD:RED] -- not currently used but will be handy later
+ [RGB:<r>:<g>:<b>]/[RGB:255:0:0] -- uses the init.txt values and picks nearest as the representation
+ [SHAPE:identifier]/[SHAPE:CRESCENT]
+ [NAME:<text>:<text plural>]/[NAME:crescent:crescents]
+ [WORD:<word token>]/[WORD:CRESCENT] -- not currently used but will be handy later
+ [ADJ:<text>]/[ADJ:narrow][ADJ:thick] -- it will choose one of these at random
+ [TILE:<tile>]/[TILE:'('] or [TILE:40]
+
+MATGLOSS Raws
+
+ [MILL_DYE:<color identifier>]/[COLOR:BLUE]
+
+******************************************************
+
+Auxiliary file changes for 0.22.110.22c:
+
+New keys
+[STOCKPILE_WEAPON:P]
+[STOCKPILE_ARMOR:D]
+[STOCKPILE_CUSTOM:C]
+[STOCKPILE_CUSTOM_SETTINGS:T]
+[BUILDJOB_STOCKPILE_DELETE_CHILD:D]
+[BUILDJOB_STOCKPILE_SETTINGS:S]
+[BUILDJOB_STOCKPILE_BARREL_UP:R]
+[BUILDJOB_STOCKPILE_BARREL_DOWN:E]
+[BUILDJOB_STOCKPILE_BIN_UP:V]
+[BUILDJOB_STOCKPILE_BIN_DOWN:C]
+[STOCKPILE_SETTINGS_ENABLE:E]
+[STOCKPILE_SETTINGS_DISABLE:D]
+[STOCKPILE_SETTINGS_PERMIT_ALL:P]
+[STOCKPILE_SETTINGS_FORBID_ALL:F]
+[STOCKPILE_SETTINGS_PERMIT_SUB:T]
+[STOCKPILE_SETTINGS_FORBID_SUB:G]
+[STOCKPILE_SETTINGS_SPECIFIC1:U]
+[STOCKPILE_SETTINGS_SPECIFIC2:J]
+
+******************************************************
+
+Auxiliary file changes for 0.22.110.22a:
+
+Various changes to the item raws.
+
+******************************************************
+
+Auxiliary file changes for 0.22.107.21a:
+
+New keys
+[A_WAIT:PERIOD]
+
+******************************************************
+
+Auxiliary file changes for 0.21.104.21c:
+
+New keys
+[HOTKEY_ASHERY_POTASH_DIRECT:A]
+
+******************************************************
+
+Auxiliary file changes for 0.21.104.21b:
+
+New keys
+[BUILDJOB_WORKSHOP_PROFILE:SHIFT+P]
+
+******************************************************
+
+Auxiliary file changes for 0.21.104.21a:
+
+New init options
+[MOUSE:YES]
+[MOUSE_PICTURE:NO]
+
+******************************************************
+
+Auxiliary file changes for 0.21.104.19c:
+
+New init options
+[ENGRAVINGS_START_OBSCURED:NO] -- lets you have your engravings look the same if you want
+
+New keys
+[DESIGNATE_TOGGLE_ENGRAVING:E]
+
+******************************************************
+
+Auxiliary file changes for 0.21.104.19a:
+
+New keys
+[STORES_CHASM:C]
+[ORDERS_REFUSE_CHASM_CORPSE:C]
+[ORDERS_REFUSE_CHASM_SKIN:I]
+[ORDERS_REFUSE_CHASM_SKULL:L]
+
+******************************************************
+
+Auxiliary file changes for 0.21.102.19a:
+
+New init options
+[NICKNAME_DWARF:REPLACE_FIRST] -- these say how nicknames are handled
+[NICKNAME_ADVENTURE:REPLACE_FIRST]
+[NICKNAME_LEGENDS:REPLACE_FIRST]
+[WINDOWED:PROMPT] -- set if you want fullscreen/windowed mode
+
+New keys
+[A_STATUS_CUSTOMIZE:Y]
+[UNITVIEW_CUSTOMIZE:Y]
+[CUSTOMIZE_UNIT_NICKNAME:N]
+[CUSTOMIZE_UNIT_PROFNAME:P]
+[TOGGLE_FULLSCREEN:F11] -- toggle fullscreen/windowed mode
+
+Removed a few superfluous entries from interface.txt.
+
+******************************************************
+
+Auxiliary file changes for 0.21.101.19a:
+
+New init options
+[KEY_HELD_MS:150] -- controls how long a key must be held before it sends a repeat message
+
+New keys for alphabetic string entry
+[STRING_<x>:<x>] pretty much
+[A_ENTER_NAME:E]
+
+******************************************************
+
+Auxiliary file changes for 0.21.100.19a:
+
+New init options, and new help inside the file itself
+[SOUND:ON]
+[INTRO:ON]
+
+Added all of the display strings to the interface file.
+
+******************************************************
+
+Auxiliary file changes for 0.21.95.19c:
+
+New keys -- add/adjust these to any interface.txt files you are saving for yourself
+[BUILDJOB_FARM_FERTILIZE:F]
+[BUILDJOB_FARM_SEASFERT:S]
+
+Changed keys
+[CHANGE_BINDINGS:K] \ No newline at end of file
diff --git a/g_src/KeybindingScreen.cpp b/g_src/KeybindingScreen.cpp
new file mode 100755
index 0000000..02cbd81
--- /dev/null
+++ b/g_src/KeybindingScreen.cpp
@@ -0,0 +1,409 @@
+#ifdef __APPLE__
+# include "osx_messagebox.h"
+#elif defined(unix)
+# include <gtk/gtk.h>
+#endif
+
+#include "GL/glew.h"
+
+#ifdef WIN32
+
+#ifndef INTEGER_TYPES
+ #define INTEGER_TYPES
+ typedef short int16_t;
+ typedef int int32_t;
+ typedef long long int64_t;
+ typedef unsigned short uint16_t;
+ typedef unsigned int uint32_t;
+ typedef unsigned long long uint64_t;
+#endif
+
+typedef int32_t VIndex;
+typedef int32_t Ordinal;
+
+#endif
+
+#include "graphics.h"
+#include "init.h"
+#include "keybindings.h"
+#include "KeybindingScreen.h"
+
+#include <list>
+#include <map>
+#include <iostream>
+#include <sstream>
+#include <ctype.h>
+
+using namespace std;
+
+struct BindingGroup {
+ string name;
+ InterfaceKey start, end;
+};
+
+const BindingGroup groups[] = {
+ {"General" , INTERFACEKEY_NONE, WORLDKEY_START-1},
+ {"World" , WORLDKEY_START, ADVENTURERKEY_START-1},
+ {"Adventurer" , ADVENTURERKEY_START, EMBARKKEY_START-1},
+ {"Dwarf mode" , DWARFMAINKEY_START, MILITIAKEY_START-1},
+ {"Embark" , EMBARKKEY_START, BUILDINGKEY_START-1},
+ {"Building" , BUILDINGKEY_START, WORKSHOPKEY_START-1},
+ {"Workshop" , WORKSHOPKEY_START, PILEZONEKEY_START-1},
+ {"Pilezone" , PILEZONEKEY_START, STOCKORDERKEY_START-1},
+ {"Stockorder" , STOCKORDERKEY_START, DWARFMAINKEY_START-1},
+ {"Militia" , MILITIAKEY_START, INTERFACEKEY_STRING_A000-1},
+ {"Text entry" , INTERFACEKEY_STRING_A000, INTERFACEKEY_STRING_A255}
+};
+
+KeybindingScreen::KeybindingScreen() {
+ gview.addscreen(this, INTERFACE_PUSH_AT_BACK, NULL); // HACK
+ mode = mode_main;
+
+ main.add("Macros", sel_macros);
+ for (int i = 0; i < ARRSZ(groups); i++)
+ main.set(i+2, groups[i].name, sel_first_group + i);
+ main.set(ARRSZ(groups)+3, "Save and exit", sel_save_exit);
+ main.add("Exit, discard changes when DF quits", sel_just_exit);
+ enabler.flag |= ENABLERFLAG_RENDER;
+}
+
+void KeybindingScreen::feed(set<InterfaceKey> &input) {
+ enabler.flag|=ENABLERFLAG_RENDER;
+ if (input.count(INTERFACEKEY_KEYBINDING_COMPLETE)) {
+ list<RegisteredKey> keys = enabler.getRegisteredKey();
+ if (keys.size() == 0) {
+ puts("No keys registered ?!");
+ mode = mode_keyR;
+ } else {
+ keyRegister.clear();
+ list<RegisteredKey> keys = enabler.getRegisteredKey();
+ for (list<RegisteredKey>::iterator it = keys.begin(); it != keys.end(); ++it) {
+ string display;
+ switch (it->type) {
+ case type_button: display = "Mouse button: "; break;
+ case type_key: display = "By position: "; break;
+ case type_unicode: display = "By letter: "; break;
+ }
+ keyRegister.add(display + it->display, it->type);
+ }
+ }
+ } else if (input.count(INTERFACEKEY_STANDARDSCROLL_PAGEUP) ||
+ input.count(INTERFACEKEY_STANDARDSCROLL_PAGEDOWN) ||
+ input.count(INTERFACEKEY_STANDARDSCROLL_UP) ||
+ input.count(INTERFACEKEY_STANDARDSCROLL_DOWN)) {
+ switch (mode) {
+ case mode_main: main.feed(input); break;
+ case mode_keyL: keyL.feed(input); reset_keyR(); break;
+ case mode_keyR: keyR.feed(input); break;
+ case mode_macro: macro.feed(input); break;
+ case mode_register: keyRegister.feed(input); break;
+ }
+ } else if (mode == mode_keyL && input.count(INTERFACEKEY_STANDARDSCROLL_RIGHT))
+ mode = mode_keyR;
+ else if (mode == mode_main && input.count(INTERFACEKEY_STANDARDSCROLL_RIGHT)) {
+ if (main.get_selection() == sel_macros) enter_macros();
+ if (main.get_selection() >= sel_first_group)
+ enter_key(main.get_selection() - sel_first_group);
+ } else if (mode == mode_keyR && input.count(INTERFACEKEY_STANDARDSCROLL_LEFT))
+ mode = mode_keyL;
+ else if ((mode == mode_keyL || mode == mode_macro) && input.count(INTERFACEKEY_STANDARDSCROLL_LEFT))
+ mode = mode_main;
+ else if (input.count(INTERFACEKEY_STRING_A000)) { // Backspace: Delete something.
+ switch (mode) {
+ case mode_macro:
+ if (macro.get_selection() != "") {
+ enabler.delete_macro(macro.get_selection());
+ macro.del_selection();
+ if (!macro.size())
+ macro.add("No macros!", "");
+ }
+ break;
+ case mode_keyR:
+ keyR_selector sel = keyR.get_selection();
+ if (sel.sel == sel_event) {
+ enabler.remove_key(keyL.get_selection(), sel.event);
+ reset_keyR();
+ }
+ break;
+ }
+ } else if (input.count(INTERFACEKEY_SELECT)) {
+ switch (mode) {
+ case mode_main:
+ if (main.get_selection() == sel_macros) { // Macros
+ enter_macros();
+ } else if (main.get_selection() == sel_save_exit) { // Save and exit
+ enabler.save_keybindings();
+ breakdownlevel = INTERFACE_BREAKDOWN_STOPSCREEN;
+ return;
+ } else if (main.get_selection() == sel_just_exit) { // Just exit
+ breakdownlevel = INTERFACE_BREAKDOWN_STOPSCREEN;
+ return;
+ } else { // Some key-binding group
+ enter_key(main.get_selection() - sel_first_group);
+ }
+ break;
+ case mode_keyR: {
+ InterfaceKey key = keyL.get_selection();
+ switch (keyR.get_selection().sel) {
+ case sel_add:
+ enabler.register_key();
+ mode = mode_register;
+ break;
+ case sel_rep_none:
+ enabler.key_repeat(key, REPEAT_NOT);
+ reset_keyR();
+ break;
+ case sel_rep_slow:
+ enabler.key_repeat(key, REPEAT_SLOW);
+ reset_keyR();
+ break;
+ case sel_rep_fast:
+ enabler.key_repeat(key, REPEAT_FAST);
+ reset_keyR();
+ break;
+ }}
+ break;
+ case mode_register:
+ enabler.bindRegisteredKey(keyRegister.get_selection(), keyL.get_selection());
+ mode = mode_keyR;
+ reset_keyR();
+ break;
+ }
+ } else if (input.count(INTERFACEKEY_LEAVESCREEN) || input.count(INTERFACEKEY_OPTIONS)) {
+ if (mode == mode_register)
+ mode = mode_keyR;
+ else
+ mode = mode_main;
+ }
+}
+
+void KeybindingScreen::logic() {
+ if (mode == mode_register)
+ enabler.flag|=ENABLERFLAG_RENDER;
+}
+
+void KeybindingScreen::enter_macros() {
+ mode = mode_macro;
+ macro.clear();
+ list<string> macros = enabler.list_macros();
+ for (list<string>::iterator it = macros.begin(); it != macros.end(); ++it)
+ macro.add(*it, *it);
+ if (!macros.size())
+ macro.add("No macros!", "");
+}
+
+void KeybindingScreen::enter_key(int group) {
+ mode = mode_keyL;
+ keyL.clear();
+ for (InterfaceKey i = groups[group].start; i <= groups[group].end; i++) {
+ if (i != INTERFACEKEY_NONE)
+ keyL.add(enabler.GetBindingTextDisplay(i), i);
+ }
+ reset_keyR();
+}
+
+void KeybindingScreen::reset_keyR() {
+ int lastpos = keyR.get_pos();
+ keyR.clear();
+ struct keyR_selector sel;
+ sel.sel = sel_add;
+ keyR.add("Add binding", sel);
+ InterfaceKey key = keyL.get_selection();
+ list<EventMatch> matchers = enabler.list_keys(key);
+ Repeat rep = enabler.key_repeat(key);
+ sel.sel = sel_rep_none;
+ keyR.set(2, "Don't repeat", sel);
+ if (rep == REPEAT_NOT) keyR.set_color(2, 4, 0);
+ sel.sel = sel_rep_slow;
+ keyR.set(3, "Delayed repeat", sel);
+ if (rep == REPEAT_SLOW) keyR.set_color(3, 4, 0);
+ sel.sel = sel_rep_fast;
+ keyR.set(4, "Immediate repeat", sel);
+ if (rep == REPEAT_FAST) keyR.set_color(4, 4, 0);
+ int i = 6;
+ for (list<EventMatch>::iterator it = matchers.begin(); it != matchers.end(); ++it, ++i) {
+ ostringstream desc;
+ switch (it->type) {
+ case type_unicode:
+ desc << "By letter: ";
+ if (it->unicode < 256 && isgraph(it->unicode)) // Is it printable?
+ desc << (char)it->unicode;
+ else
+ desc << "U+" << hex << uppercase << it->unicode;
+ break;
+ case type_key:
+ desc << "By position: " << translate_mod(it->mod) << sdlNames.left[it->key];
+ break;
+ case type_button:
+ desc << "Mouse: " << (int)it->button;
+ break;
+ }
+ sel.sel = sel_event;
+ sel.event = *it;
+ keyR.set(i, desc.str(), sel);
+ }
+ keyR.set_pos(lastpos);
+}
+
+void KeybindingScreen::render_macro() {
+ drawborder("Macros");
+ gps.locate(3, 3);
+ gps.changecolor(4,0,1);
+ gps.addst("Select a macro, then press " + enabler.GetKeyDisplay(INTERFACEKEY_STRING_A000) + " to delete.");
+ macro.render(6, init.display.grid_x-2, 5, init.display.grid_y-2);
+}
+
+void KeybindingScreen::render_key() {
+ if (enabler.is_registering()) {
+ gps.changecolor(4,0,1);
+ drawborder("Keybinding - currently registering new key");
+ } else
+ drawborder("Keybinding");
+ gps.locate(3, 6);
+ gps.changecolor(4,0,1);
+ gps.addst("Select a binding, then press " + enabler.GetKeyDisplay(INTERFACEKEY_STRING_A000) + " to delete.");
+ keyL.render(6, init.display.grid_x/2 - 1, 5, init.display.grid_y-2);
+ if (mode == mode_keyL || mode == mode_register)
+ keyR.bleach(true);
+ else
+ keyR.bleach(false);
+ keyR.render(init.display.grid_x/2 + 1, init.display.grid_x-2, 5, init.display.grid_y-2);
+}
+
+void KeybindingScreen::render_register() {
+ int x1 = init.display.grid_x / 2 - 20,
+ x2 = init.display.grid_x / 2 + 20,
+ y1 = init.display.grid_y / 2 - 1,
+ y2 = init.display.grid_y / 2 + 1;
+ if (!enabler.is_registering()) {
+ y2 = y1 + keyRegister.size() + 1;
+ }
+ gps.erasescreen_rect(x1, x2, y1, y2);
+ gps.changecolor(1,1,1);
+ for (int x = x1; x <= x2; x++) {
+ gps.locate(y1, x); gps.addchar(' ');
+ gps.locate(y2, x); gps.addchar(' ');
+ }
+ for (int y = y1 + 1; y < y2; y++) {
+ gps.locate(y, x1); gps.addchar(' ');
+ gps.locate(y, x2); gps.addchar(' ');
+ }
+ if (enabler.is_registering()) {
+ gps.changecolor(7,0,1);
+ gps.locate(y1+1, x1+2);
+ gps.addst(translate_mod(getModState()));
+ } else {
+ keyRegister.render(x1+1, x2-1, y1+1, y2-1);
+ gps.locate(y2, x1+2);
+ gps.changecolor(7,1,1);
+ gps.addst("Select binding, or press " + enabler.GetKeyDisplay(INTERFACEKEY_LEAVESCREEN) + " to abort");
+ }
+}
+
+// Render the main menu
+void KeybindingScreen::render_main() {
+ drawborder("Key binding & macro center");
+ main.render(6, init.display.grid_x - 3, 3, init.display.grid_y - 4);
+}
+
+void KeybindingScreen::render() {
+ switch(mode) {
+ case mode_main: render_main(); break;
+ case mode_keyL: case mode_keyR: render_key(); break;
+ case mode_macro: render_macro(); break;
+ case mode_register:
+ render_key();
+ render_register();
+ break;
+ }
+}
+
+void KeybindingScreen::help() {
+}
+
+
+MacroScreenLoad::MacroScreenLoad() {
+ list<string> macros = enabler.list_macros();
+ width = 10;
+ if (!macros.size()) {
+ menu.add("No macros!", "");
+ height = 1;
+ } else
+ height = macros.size();
+
+ for (list<string>::iterator it = macros.begin(); it != macros.end(); ++it) {
+ if (it->length() > width) width = it->length();
+ menu.add(*it, *it);
+ }
+ enabler.flag |= ENABLERFLAG_RENDER;
+ // render();
+ // gps.renewscreen();
+}
+
+void MacroScreenLoad::feed(set<InterfaceKey> &input) {
+ enabler.flag|=ENABLERFLAG_RENDER;
+ if (input.count(INTERFACEKEY_SELECT)) {
+ string id = menu.get_selection();
+ if (id != "") enabler.load_macro(id);
+ breakdownlevel = INTERFACE_BREAKDOWN_STOPSCREEN;
+ return;
+ } else if (input.count(INTERFACEKEY_LEAVESCREEN)) {
+ breakdownlevel = INTERFACE_BREAKDOWN_STOPSCREEN;
+ return;
+ } else {
+ menu.feed(input);
+ }
+ if (input.count(INTERFACEKEY_OPTIONS)) {
+ breakdownlevel = INTERFACE_BREAKDOWN_STOPSCREEN;
+ }
+}
+
+void MacroScreenLoad::logic() {
+}
+
+void MacroScreenLoad::render() {
+ if (parent) parent->render();
+ const int x1 = MAX(init.display.grid_x/2 - ((width + 2) / 2), 0);
+ const int x2 = MIN(x1+width+1, init.display.grid_x-1);
+ const int y1 = MAX(init.display.grid_y/2 - ((height + 2) / 2), 0);
+ const int y2 = MIN(y1 + height + 1, init.display.grid_y-1);
+ gps.changecolor(0,3,1);
+ gps.draw_border(x1, x2, y1, y2);
+ menu.render(x1+1, x2-1, y1+1, y2-1);
+ // gps.renewscreen();
+}
+
+MacroScreenSave::MacroScreenSave() {
+ enabler.flag |= ENABLERFLAG_RENDER;
+}
+
+void MacroScreenSave::logic() {
+}
+
+void MacroScreenSave::feed(set<InterfaceKey> &input) {
+ enabler.flag|=ENABLERFLAG_RENDER;
+ id.feed(input);
+ if (input.count(INTERFACEKEY_SELECT)) {
+ string n = id.get_text();
+ if (n.length())
+ enabler.save_macro(n);
+ breakdownlevel = INTERFACE_BREAKDOWN_STOPSCREEN;
+ return;
+ }
+ if (input.count(INTERFACEKEY_OPTIONS)) {
+ breakdownlevel = INTERFACE_BREAKDOWN_STOPSCREEN;
+ }
+}
+
+void MacroScreenSave::render() {
+ if (parent) parent->render();
+ const int x1 = 3,
+ x2 = init.display.grid_x-4,
+ y1 = init.display.grid_y/2-1,
+ y2 = init.display.grid_y/2+1;
+ gps.changecolor(0,3,1);
+ gps.draw_border(x1, x2, y1, y2);
+ id.render(x1+1,x2-1,y1+1,y2-1);
+ // gps.renewscreen();
+}
+
diff --git a/g_src/KeybindingScreen.h b/g_src/KeybindingScreen.h
new file mode 100755
index 0000000..fc29f2e
--- /dev/null
+++ b/g_src/KeybindingScreen.h
@@ -0,0 +1,69 @@
+#ifndef KEYBINDINGSCREEN_H
+#define KEYBINDINGSCREEN_H
+
+#include "interface.h"
+#include "ViewBase.h"
+#include "enabler.h"
+
+#include <set>
+#include <string>
+
+class KeybindingScreen : public viewscreenst {
+ enum { mode_main, mode_keyL, mode_keyR, mode_macro, mode_register } mode;
+ enum keyR_type { sel_add, sel_rep_none, sel_rep_slow, sel_rep_fast, sel_event };
+ enum main_selector { sel_macros, sel_just_exit, sel_save_exit, sel_first_group };
+
+ struct keyR_selector {
+ keyR_type sel;
+ EventMatch event; // Uninitialized if sel != sel_event
+ };
+
+ widgets::menu<int> main; // Representing main_selector
+ widgets::menu<InterfaceKey> keyL;
+ widgets::menu<keyR_selector> keyR;
+ widgets::menu<std::string> macro;
+ widgets::menu<MatchType> keyRegister;
+
+ void render_main();
+ void render_macro();
+ void render_key();
+ void render_register();
+
+ void reset_keyR();
+
+ void enter_key(int group);
+ void enter_macros();
+
+public:
+ KeybindingScreen();
+ virtual void feed(std::set<InterfaceKey> &events);
+ virtual void render();
+ virtual void help();
+ virtual void logic();
+ virtual char is_option_screen() { return 2; }
+};
+
+class MacroScreenLoad : public viewscreenst {
+ widgets::menu<string> menu;
+ int width, height;
+
+ public:
+ MacroScreenLoad();
+ virtual void logic();
+ virtual void render();
+ virtual void feed(std::set<InterfaceKey> &events);
+ virtual char is_option_screen() { return 1; }
+};
+
+class MacroScreenSave : public viewscreenst {
+ widgets::textbox id;
+public:
+ MacroScreenSave();
+ virtual void logic();
+ virtual void render();
+ virtual void feed(std::set<InterfaceKey> &events);
+ virtual char is_option_screen() { return 1; }
+};
+
+
+#endif
diff --git a/g_src/ViewBase.cpp b/g_src/ViewBase.cpp
new file mode 100755
index 0000000..6063732
--- /dev/null
+++ b/g_src/ViewBase.cpp
@@ -0,0 +1,38 @@
+#include <assert.h>
+#include <iostream>
+#include "ViewBase.h"
+
+using namespace std;
+using namespace widgets;
+
+void textbox::feed(set<InterfaceKey> &input) {
+ // Backspace
+ if (input.count(INTERFACEKEY_STRING_A000) && text.size())
+ text.resize(text.size() - 1);
+ // Hopefully we'll never get multiple characters in one input set,
+ // but it's possible. We deal with this by inserting them in
+ // alphabetical order.
+ for (set<InterfaceKey>::iterator it = input.lower_bound(INTERFACEKEY_STRING_A001);
+ it != input.end() && *it <= INTERFACEKEY_STRING_A255;
+ ++it) {
+ if (keep == false) {
+ keep = true;
+ text.clear();
+ }
+ char c = *it - INTERFACEKEY_STRING_A000;
+ text += c;
+ }
+}
+
+void textbox::render(int x1, int x2, int y1, int y2) {
+ // We need to do some kind of line-breaking for multi-line text
+ // entry boxes. This shall be implemented at need, and there is none
+ // yet.
+ assert(y1 == y2);
+ gps.erasescreen_rect(x1,x2,y1,y2);
+ gps.locate(y1,x1);
+ gps.changecolor(7,0,keep);
+ int width = x2 - x1 + 1;
+ int start = text.length() - width;
+ gps.addst(text.substr(MAX(start,0)));
+}
diff --git a/g_src/ViewBase.h b/g_src/ViewBase.h
new file mode 100755
index 0000000..315abf3
--- /dev/null
+++ b/g_src/ViewBase.h
@@ -0,0 +1,197 @@
+#ifndef VIEWBASE_H
+#define VIEWBASE_H
+
+#include <set>
+#include <map>
+#include <string>
+
+#include "keybindings.h"
+#include "graphics.h"
+
+enum InterfaceBreakdownTypes
+{
+ INTERFACE_BREAKDOWN_NONE,
+ INTERFACE_BREAKDOWN_QUIT,
+ INTERFACE_BREAKDOWN_STOPSCREEN,
+ INTERFACE_BREAKDOWN_TOFIRST,
+ INTERFACE_BREAKDOWNNUM
+};
+
+class viewscreenst
+{
+ public:
+ viewscreenst *child;
+ viewscreenst *parent;
+ char breakdownlevel;
+
+ char option_key_pressed;
+ virtual void feed(std::set<InterfaceKey> &events){}
+ virtual void logic(){}
+ virtual void render(){}
+ virtual void resize(int w, int h){}
+
+ virtual void help();
+ virtual char movies_okay(){return 1;}
+ virtual char is_option_screen(){return 0;}
+ virtual char is_save_screen(){return 0;}
+ viewscreenst()
+ {
+ child=0;
+ parent=0;
+ breakdownlevel=INTERFACE_BREAKDOWN_NONE;
+ option_key_pressed=0;
+ }
+ virtual ~viewscreenst(){}
+
+ virtual bool key_conflict(InterfaceKey test_key);
+};
+
+namespace widgets {
+
+ using namespace std;
+
+ template <typename T>
+ class menu {
+ typedef map<int,pair<string, T> > dict;
+ dict lines;
+ int selection;
+ int last_displayheight;
+ bool bleached;
+ map<int, pair<int,int> > colors;
+
+ // Given 'total' lines, with 'sel' selected, and 'space' to draw in,
+ // returns the first line that should be drawn.
+ int first_line(int total, int sel, int space) {
+ // There is no doubt some clever math to do this, but I'm tired and don't care.
+ for (int start = 0;; start += space / 2) {
+ if (start + space/2 >= sel) return start;
+ if (start + space >= total) return start;
+ }
+ }
+ pair<string,T> mp(string s, T t) { return make_pair(s,t); }
+
+ // Scrolls N lines up/down; positive = down
+ void scroll(int n) {
+ typename dict::iterator it = lines.find(selection);
+ for (int i = 0; i < abs(n); i++) {
+ if (n < 0 && it == lines.begin()) { // We've hit the top
+ if (i) break;
+ else {
+ it = --(lines.end());
+ break;
+ }
+ }
+ if (n < 0) --it; else ++it; // Scroll one line
+ if (it == lines.end()) { // We've hit the bottom
+ if (i) {
+ --it;
+ break;
+ }
+ else {
+ it = lines.begin();
+ break;
+ }
+ }
+ // If we hit neither the top nor bottom, loop.
+ }
+
+ selection = it->first;
+ }
+
+ public:
+ menu() { clear(); }
+ int size() { return lines.size(); }
+ // Adds a line just past the last taken position
+ void add(string text, T token) {
+ if (!lines.size()) {
+ lines[0] = mp(text,token);
+ } else {
+ typename dict::iterator it = --(lines.end());
+ lines[it->first + 1] = mp(text,token);
+ }
+ }
+ // (Re)sets the text of the given line
+ void set(int line, string text, T token) {
+ lines[line] = mp(text,token);
+ }
+ // Set the color of a line
+ void set_color(int line, int fg, int bg) {
+ colors[line] = make_pair(fg,bg);
+ }
+ // Handles (page) up/down
+ void feed(std::set<InterfaceKey> &input) {
+ if (!lines.size()) return;
+ if (input.count(INTERFACEKEY_STANDARDSCROLL_UP)) scroll(-1);
+ if (input.count(INTERFACEKEY_STANDARDSCROLL_DOWN)) scroll(1);
+ if (input.count(INTERFACEKEY_STANDARDSCROLL_PAGEUP)) scroll(-(last_displayheight / 2));
+ if (input.count(INTERFACEKEY_STANDARDSCROLL_PAGEDOWN)) scroll(last_displayheight / 2);
+ }
+ void render(int x1, int x2, int y1, int y2) {
+ gps.erasescreen_rect(x1,x2,y1,y2);
+ int h = y2 - y1 + 1,
+ w = x2 - x1 + 1,
+ x = x1, y = y1;
+ last_displayheight = h;
+ if (!lines.size()) return;
+ int total = (--lines.end())->first + 1;
+ int first = first_line(total, selection, h);
+ typename dict::iterator it = lines.lower_bound(first);
+ for (; it != lines.end() && it->first - first < h; ++it) {
+ gps.locate(it->first - first + y, x);
+ map<int,pair<int,int> >::iterator color = colors.find(it->first - first);
+ int fg = 7, bg = 0;
+ if (color != colors.end()) {
+ fg = color->second.first;
+ bg = color->second.second;
+ }
+ gps.changecolor(fg, bg, it->first == selection && !bleached);
+ gps.addst(it->second.first.substr(0, w));
+ }
+ }
+ // Read out the current selection
+ T get_selection() { return lines[selection].second; }
+ int get_pos() { return selection; }
+ // Set the position by line
+ void set_pos(int pos) {
+ if (pos < size())
+ selection = pos;
+ }
+ // Delete the currently selected line
+ void del_selection() {
+ typename dict::iterator it = lines.find(selection);
+ typename dict::iterator newsel = it;
+ ++newsel;
+ if (newsel == lines.end()) {
+ newsel = it;
+ --newsel;
+ }
+ lines.erase(it);
+ if (lines.size()) selection = newsel->first;
+ }
+ // If true, don't draw a highlight
+ void bleach(bool b) { bleached = b; }
+ // Reset the menu
+ void clear() {
+ selection = 0;
+ lines.clear();
+ last_displayheight = 10;
+ bleached = false;
+ colors.clear();
+ }
+ };
+
+ class textbox {
+ string text;
+ bool keep;
+ public:
+ textbox() { textbox("", false); }
+ textbox(string initializer, bool keep) { this->keep = keep; text = initializer; }
+ string get_text() { return text; }
+ // Only cares about INTERFACEKEY_STRING events
+ void feed(std::set<InterfaceKey> &input);
+ void render(int x1, int x2, int y1, int y2);
+ };
+
+}
+
+#endif
diff --git a/g_src/basics.cpp b/g_src/basics.cpp
new file mode 100755
index 0000000..a56145d
--- /dev/null
+++ b/g_src/basics.cpp
@@ -0,0 +1,792 @@
+#include "platform.h"
+#include <string.h>
+#include <math.h>
+#include <iosfwd>
+#include <iostream>
+#include <ios>
+#include <streambuf>
+#include <istream>
+#include <ostream>
+#include <iomanip>
+#include <sstream>
+#include <cstdlib>
+#include <fstream>
+#include <zlib.h>
+
+#include "svector.h"
+using std::string;
+using std::endl;
+using std::ofstream;
+
+#include "endian.h"
+
+#ifdef WIN32
+
+#ifndef INTEGER_TYPES
+ #define INTEGER_TYPES
+ typedef short int16_t;
+ typedef int int32_t;
+ typedef long long int64_t;
+ typedef unsigned short uint16_t;
+ typedef unsigned int uint32_t;
+ typedef unsigned long long uint64_t;
+#endif
+
+typedef int32_t VIndex;
+typedef int32_t Ordinal;
+
+#endif
+
+#include "ttf_manager.hpp"
+#include "init.h"
+#include "basics.h"
+
+extern string errorlog_prefix;
+
+void errorlog_string(const string &str)
+{
+ if(str.empty())return;
+
+ //SAVE AN ERROR TO THE LOG FILE
+ std::ofstream fseed("errorlog.txt", std::ios::out | std::ios::app);
+ if(fseed.is_open())
+ {
+ if(!errorlog_prefix.empty())
+ {
+ fseed<<errorlog_prefix.c_str()<<std::endl;
+ errorlog_prefix.clear();
+ }
+ fseed<<str.c_str()<<std::endl;
+ }
+ fseed.close();
+}
+
+void gamelog_string(const string &str)
+{
+ if(str.empty())return;
+
+ //SAVE AN ERROR TO THE LOG FILE
+ std::ofstream fseed("gamelog.txt",std::ios::out | std::ios::app);
+ if(fseed.is_open())
+ {
+ fseed<<str.c_str()<<std::endl;
+ }
+ fseed.close();
+}
+
+void errorlog_string(const char *ptr)
+{
+ if(ptr==NULL)return;
+
+ //SAVE AN ERROR TO THE LOG FILE
+ std::ofstream fseed("errorlog.txt", std::ios::out | std::ios::app);
+ if(fseed.is_open())
+ {
+ if(!errorlog_prefix.empty())
+ {
+ fseed<<errorlog_prefix.c_str()<<std::endl;
+ errorlog_prefix.clear();
+ }
+ fseed<<ptr<<std::endl;
+ }
+ fseed.close();
+}
+
+int32_t convert_string_to_long(string &str)
+{
+ return atoi(str.c_str());
+}
+
+uint32_t convert_string_to_ulong(string &str)
+{
+ return strtoul(str.c_str(),NULL,0);
+}
+
+void add_long_to_string(int32_t n,string &str)
+{
+ string str2;
+ convert_long_to_string(n,str2);
+ str+=str2;
+}
+
+void convert_long_to_string(int32_t n,string &str)
+{
+ std::ostringstream o;
+ o << n;
+ str = o.str();
+}
+
+void convert_ulong_to_string(uint32_t n,string &str)
+{
+ std::ostringstream o;
+ o << n;
+ str = o.str();
+}
+
+char grab_variable_token(string &str,string &token,char sec_comp,int32_t &pos,int32_t i_pos)
+{
+ token.erase();
+
+ for(pos=i_pos;pos<str.length();pos++)
+ {
+ if((str[pos]=='['&&pos+1<str.length())||sec_comp)
+ {
+ if(str[pos]=='['&&!sec_comp)pos++;
+ grab_token_string_pos(token,str,pos,':');
+ pos--;
+
+ if(token.length()>0)return 1;
+ }
+ }
+
+ return 0;
+}
+
+bool grab_token_expression(string &dest,string &source,int32_t &pos,char compc)
+{
+ dest.erase();
+ dest+="[";
+
+ string token1;
+ while(grab_token_string(token1,source,pos))
+ {
+ if(dest.length()>1)dest+=":";
+ dest+=token1;
+
+ if(pos<source.length())
+ {
+ if(source[pos]==']')break;//grab_token_string CAN'T HANDLE THESE
+ }
+ }
+ dest+="]";
+
+ return (dest.length()>2);
+}
+
+bool grab_token_list_as_string(string &dest,string &source,int32_t &pos,char compc)
+{
+ dest.erase();
+
+ string token1;
+ while(grab_token_string(token1,source,pos))
+ {
+ if(dest.length()>0)dest+=":";
+ dest+=token1;
+
+ if(pos<source.length())
+ {
+ if(source[pos]==']')break;//grab_token_string CAN'T HANDLE THESE
+ }
+ }
+
+ return (dest.length()>0);
+}
+
+bool grab_token_string(string &dest,string &source,int32_t &pos,char compc)
+{
+ dest.erase();
+ if(source.length()==0)return false;
+
+ pos++;//GET RID OF FIRST [ OR compc THAT IS ASSUMED TO BE THERE
+ if(pos>source.size())return false;
+
+ //GO UNTIL YOU HIT A compc, ], or the end
+ auto s=source.begin(),e=source.end();
+ s+=pos;
+ for(;s<e;++s)
+ {
+ if((*s)==compc||(*s)==']')break;
+ dest+=(*s);
+ pos++;
+ }
+ return (dest.length()>0);
+}
+
+bool grab_token_string(string &dest,string &source,char compc)
+{
+ dest.erase();
+ if(source.length()==0)return false;
+
+ //GO UNTIL YOU HIT A :, ], or the end
+ auto s=source.begin(),e=source.end();
+ for(;s<e;++s)
+ {
+ if((*s)==compc||(*s)==']')break;
+ dest+=(*s);
+ }
+ return (dest.length()>0);
+}
+
+bool grab_token_string_pos(string &dest,string &source,int32_t pos,char compc)
+{
+ dest.erase();
+ if(source.length()==0)return false;
+ if(pos>source.length())return false;
+
+ //GO UNTIL YOU HIT A :, ], or the end
+ auto s=source.begin(),e=source.end();
+ s+=pos;
+ for(;s<e;++s)
+ {
+ if((*s)==compc||(*s)==']')break;
+ dest+=(*s);
+ }
+ return (dest.length()>0);
+}
+
+bool grab_token_string(string &dest,const char *source,char compc)
+{
+ dest.erase();
+ int32_t sz=strlen(source);
+ if(sz==0)return false;
+
+ //GO UNTIL YOU HIT A :, ], or the end
+ int32_t s;
+ for(s=0;s<sz;s++)
+ {
+ if(source[s]==compc||source[s]==']')break;
+ dest+=source[s];
+ }
+ return (dest.length()>0);
+}
+
+
+void replace_token_string(string &token,string &str,int32_t pos,char compc,string &nw,char repc)
+{
+ string rep;
+ if(repc!=0)rep=repc;
+ rep+=token;
+ if(compc!=0)rep+=compc;
+
+ string::size_type wpos;
+
+ if ((wpos = str.find(rep)) != string::npos)
+ {
+ str.replace(wpos,rep.size(),nw);
+ }
+}
+
+void simplify_string(string &str)
+{
+ int32_t s;
+ for(s=0;s<str.length();s++)
+ {
+ //CAPITALIZE
+ if(str[s]>='A'&&str[s]<='Z')
+ {
+ str[s]-='A';
+ str[s]+='a';
+ }
+ switch(str[s])
+ {
+ case (char)129:
+ case (char)150:
+ case (char)151:
+ case (char)154:
+ case (char)163:
+ str[s]='u';
+ break;
+ case (char)152:
+ str[s]='y';
+ break;
+ case (char)164:
+ case (char)165:
+ str[s]='n';
+ break;
+ case (char)131:
+ case (char)132:
+ case (char)133:
+ case (char)134:
+ case (char)142:
+ case (char)143:
+ case (char)145:
+ case (char)146:
+ case (char)160:
+ str[s]='a';
+ break;
+ case (char)130:
+ case (char)136:
+ case (char)137:
+ case (char)138:
+ case (char)144:
+ str[s]='e';
+ break;
+ case (char)139:
+ case (char)140:
+ case (char)141:
+ case (char)161:
+ str[s]='i';
+ break;
+ case (char)147:
+ case (char)148:
+ case (char)149:
+ case (char)153:
+ case (char)162:
+ str[s]='o';
+ break;
+ case (char)128:
+ case (char)135:
+ str[s]='c';
+ break;
+ }
+ }
+}
+
+void lower_case_string(string &str)
+{
+ int32_t s;
+ for(s=0;s<str.length();s++)
+ {
+ //CAPITALIZE
+ if(str[s]>='A'&&str[s]<='Z')
+ {
+ str[s]-='A';
+ str[s]+='a';
+ }
+ switch(str[s])
+ {
+ case (char)154:str[s]=(char)129;break;
+ case (char)165:str[s]=(char)164;break;
+ case (char)142:str[s]=(char)132;break;
+ case (char)143:str[s]=(char)134;break;
+ case (char)144:str[s]=(char)130;break;
+ case (char)153:str[s]=(char)148;break;
+ case (char)128:str[s]=(char)135;break;
+ case (char)146:str[s]=(char)145;break;
+ }
+ }
+}
+
+void upper_case_string(string &str)
+{
+ int32_t s;
+ for(s=0;s<str.length();s++)
+ {
+ //CAPITALIZE
+ if(str[s]>='a'&&str[s]<='z')
+ {
+ str[s]-='a';
+ str[s]+='A';
+ }
+ switch(str[s])
+ {
+ case (char)129:str[s]=(char)154;break;
+ case (char)164:str[s]=(char)165;break;
+ case (char)132:str[s]=(char)142;break;
+ case (char)134:str[s]=(char)143;break;
+ case (char)130:str[s]=(char)144;break;
+ case (char)148:str[s]=(char)153;break;
+ case (char)135:str[s]=(char)128;break;
+ case (char)145:str[s]=(char)146;break;
+ }
+ }
+}
+
+void capitalize_string_words(string &str)
+{
+ char conf;
+ int32_t s;
+ for(s=0;s<str.length();s++)
+ {
+ conf=0;
+ if(s>0)
+ {
+ if(str[s-1]==' '||
+ str[s-1]=='\"')conf=1;
+ if(str[s-1]=='\'')
+ {
+ //DISCOUNT SINGLE QUOTE IF IT ISN'T PRECEDED BY SPACE, COMMA OR NOTHING
+ if(s<=0)conf=1;
+ else if(s>=2)
+ {
+ if(str[s-2]==' '||
+ str[s-2]==',')conf=1;
+ }
+ }
+ }
+ if(s==0||conf)
+ {
+ //CAPITALIZE
+ if(str[s]>='a'&&str[s]<='z')
+ {
+ str[s]-='a';
+ str[s]+='A';
+ }
+ switch(str[s])
+ {
+ case (char)129:str[s]=(char)154;break;
+ case (char)164:str[s]=(char)165;break;
+ case (char)132:str[s]=(char)142;break;
+ case (char)134:str[s]=(char)143;break;
+ case (char)130:str[s]=(char)144;break;
+ case (char)148:str[s]=(char)153;break;
+ case (char)135:str[s]=(char)128;break;
+ case (char)145:str[s]=(char)146;break;
+ }
+ }
+ }
+}
+
+void capitalize_string_first_word(string &str)
+{
+ char conf;
+ int32_t s;
+ for(s=0;s<str.length();s++)
+ {
+ conf=0;
+ if(s>0)
+ {
+ if(str[s-1]==' '||
+ str[s-1]=='\"')conf=1;
+ if(str[s-1]=='\'')
+ {
+ //DISCOUNT SINGLE QUOTE IF IT ISN'T PRECEDED BY SPACE, COMMA OR NOTHING
+ if(s<=0)conf=1;
+ else if(s>=2)
+ {
+ if(str[s-2]==' '||
+ str[s-2]==',')conf=1;
+ }
+ }
+ }
+ if(s==0||conf)
+ {
+ //CAPITALIZE
+ if(str[s]>='a'&&str[s]<='z')
+ {
+ str[s]-='a';
+ str[s]+='A';
+ return;
+ }
+ switch(str[s])
+ {
+ case (char)129:str[s]=(char)154;return;
+ case (char)164:str[s]=(char)165;return;
+ case (char)132:str[s]=(char)142;return;
+ case (char)134:str[s]=(char)143;return;
+ case (char)130:str[s]=(char)144;return;
+ case (char)148:str[s]=(char)153;return;
+ case (char)135:str[s]=(char)128;return;
+ case (char)145:str[s]=(char)146;return;
+ }
+ if(str[s]!=' '&&str[s]!='\"')return;
+ }
+ }
+}
+
+static void abbreviate_string_helper(string &str, int len) {
+ if(str.length()>=2)
+ {
+ if((str[0]=='A'||str[0]=='a')&&
+ str[1]==' ')
+ {
+ str.erase(str.begin()+1);
+ str.erase(str.begin());
+
+ if(str.length()<=len)return;
+ }
+
+ if(str.length()>=3)
+ {
+ if((str[0]=='A'||str[0]=='a')&&
+ (str[1]=='N'||str[1]=='n')&&
+ str[2]==' ')
+ {
+ str.erase(str.begin()+2);
+ str.erase(str.begin()+1);
+ str.erase(str.begin());
+
+ if(str.length()<=len)return;
+ }
+
+ if(str.length()>=4)
+ {
+ if((str[0]=='T'||str[0]=='t')&&
+ (str[1]=='H'||str[1]=='h')&&
+ (str[2]=='E'||str[2]=='e')&&
+ str[3]==' ')
+ {
+ str.erase(str.begin()+3);
+ str.erase(str.begin()+2);
+ str.erase(str.begin()+1);
+ str.erase(str.begin());
+
+ if(str.length()<=len)return;
+ }
+ }
+ }
+ }
+
+ int32_t l;
+ for(l=(int32_t)str.length()-1;l>=1;l--)
+ {
+ if(str[l-1]==' ')continue;
+
+ if(str[l]=='a'||
+ str[l]=='e'||
+ str[l]=='i'||
+ str[l]=='o'||
+ str[l]=='u'||
+ str[l]=='A'||
+ str[l]=='E'||
+ str[l]=='I'||
+ str[l]=='O'||
+ str[l]=='U')
+ {
+ str.erase(str.begin()+l);
+ if(str.length()<=len)return;
+ }
+ }
+
+ if(str.length()>len)str.resize(len);
+}
+
+
+void abbreviate_string(string &str, int32_t len)
+{
+ if (ttf_manager.ttf_active()) {
+ // We'll need to use TTF-aware text shrinking.
+ while (ttf_manager.size_text(str) > len)
+ abbreviate_string_helper(str, str.length() - 1);
+ } else if(str.length()>len){
+ // 1 letter = 1 tile.
+ abbreviate_string_helper(str, len);
+ }
+}
+
+
+
+void get_number(int32_t number,string &str)
+{
+ str.erase();
+
+ if(number<0)
+ {
+ number*=-1;
+ str="negative ";
+ }
+ switch(number)
+ {
+ case 0:str="zero";break;
+ case 1:str="one";break;
+ case 2:str="two";break;
+ case 3:str="three";break;
+ case 4:str="four";break;
+ case 5:str="five";break;
+ case 6:str="six";break;
+ case 7:str="seven";break;
+ case 8:str="eight";break;
+ case 9:str="nine";break;
+ case 10:str="ten";break;
+ case 11:str="eleven";break;
+ case 12:str="twelve";break;
+ case 13:str="thirteen";break;
+ case 14:str="fourteen";break;
+ case 15:str="fifteen";break;
+ case 16:str="sixteen";break;
+ case 17:str="seventeen";break;
+ case 18:str="eighteen";break;
+ case 19:str="nineteen";break;
+ default:
+ {
+ if(number>=1000000000)
+ {
+ string nm;
+ get_number(number/1000000000,nm);
+ str+=nm;
+ str+=" billion";
+ if(number%1000000000!=0)
+ {
+ str+=" ";
+ get_number(number%1000000000,nm);
+ str+=nm;
+ }
+ return;
+ }
+ if(number>=1000000&&number<1000000000)
+ {
+ string nm;
+ get_number(number/1000000,nm);
+ str+=nm;
+ str+=" million";
+ if(number%1000000!=0)
+ {
+ str+=" ";
+ get_number(number%1000000,nm);
+ str+=nm;
+ }
+ return;
+ }
+ if(number>=1000&&number<1000000)
+ {
+ string nm;
+ get_number(number/1000,nm);
+ str+=nm;
+ str+=" thousand";
+ if(number%1000!=0)
+ {
+ str+=" ";
+ get_number(number%1000,nm);
+ str+=nm;
+ }
+ return;
+ }
+ if(number>=100&&number<1000)
+ {
+ string nm;
+ get_number(number/100,nm);
+ str+=nm;
+ str+=" hundred";
+ if(number%100!=0)
+ {
+ str+=" ";
+ get_number(number%100,nm);
+ str+=nm;
+ }
+ return;
+ }
+ if(number>=20&&number<100)
+ {
+ switch(number/10)
+ {
+ case 2:str="twenty";break;
+ case 3:str="thirty";break;
+ case 4:str="forty";break;
+ case 5:str="fifty";break;
+ case 6:str="sixty";break;
+ case 7:str="seventy";break;
+ case 8:str="eighty";break;
+ case 9:str="ninety";break;
+ }
+ if(number%10!=0)
+ {
+ str+="-";
+ string nm;
+ get_number(number%10,nm);
+ str+=nm;
+ }
+ return;
+ }
+ add_long_to_string(number,str);
+ break;
+ }
+ }
+}
+
+void get_ordinal(int32_t number,string &str,bool shorten)
+{
+ str.erase();
+
+ if(shorten)
+ {
+ if(number<0)
+ {
+ number*=-1;
+ str="-";
+ }
+ add_long_to_string(number,str);
+ switch(number%10)
+ {
+ case 1:
+ if(number%100==11)str+="th";
+ else str+="st";
+ break;
+ case 2:
+ if(number%100==12)str+="th";
+ else str+="nd";
+ break;
+ case 3:
+ if(number%100==13)str+="th";
+ else str+="rd";
+ break;
+ default:
+ str+="th";
+ break;
+ }
+ return;
+ }
+
+
+ if(number<0)
+ {
+ number*=-1;
+ str="Negative ";
+ }
+ switch(number)
+ {
+ case 0:str="Zeroth";break;
+ case 1:str="First";break;
+ case 2:str="Second";break;
+ case 3:str="Third";break;
+ case 4:str="Fourth";break;
+ case 5:str="Fifth";break;
+ case 6:str="Sixth";break;
+ case 7:str="Seventh";break;
+ case 8:str="Eighth";break;
+ case 9:str="Ninth";break;
+ case 10:str="Tenth";break;
+ case 11:str="Eleventh";break;
+ case 12:str="Twelfth";break;
+ case 13:str="Thirteenth";break;
+ case 14:str="Fourteenth";break;
+ case 15:str="Fifteenth";break;
+ case 16:str="Sixteenth";break;
+ case 17:str="Seventeenth";break;
+ case 18:str="Eighteenth";break;
+ case 19:str="Nineteenth";break;
+ default:
+ add_long_to_string(number,str);
+ switch(number%10)
+ {
+ case 1:
+ if(number%100==11)str+="th";
+ else str+="st";
+ break;
+ case 2:
+ if(number%100==12)str+="th";
+ else str+="nd";
+ break;
+ case 3:
+ if(number%100==13)str+="th";
+ else str+="rd";
+ break;
+ default:
+ str+="th";
+ break;
+ }
+ break;
+ }
+}
+
+// Map DF's CP437 to Unicode
+// see: http://dwarffortresswiki.net/index.php/Character_table
+int charmap[256] = {
+ ' ', 0x263A, 0x263B, 0x2665, 0x2666, 0x2663, 0x2660, 0x2022,
+ 0x25D8, 0x25CB, 0x25D9, 0x2642, 0x2640, 0x266A, 0x266B, 0x263C,
+ 0x25BA, 0x25C4, 0x2195, 0x203C, 0x00B6, 0x00A7, 0x25AC, 0x21A8,
+ 0x2191, 0x2193, 0x2192, 0x2190, 0x221F, 0x2194, 0x25B2, 0x25BC,
+ /* 0x20 */
+ 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f,
+ 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,
+ 0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f,
+ 0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5a,0x5b,0x5c,0x5d,0x5e,0x5f,
+ 0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6a,0x6b,0x6c,0x6d,0x6e,0x6f,
+ 0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7a,0x7b,0x7c,0x7d,0x7e,0x2302,
+ /* 0x80 */
+ 0xC7, 0xFC, 0xE9, 0xE2, 0xE4, 0xE0, 0xE5, 0xE7,
+ 0xEA, 0xEB, 0xE8, 0xEF, 0xEE, 0xEC, 0xC4, 0xC5,
+ 0xC9, 0xE6, 0xC6, 0xF4, 0xF6, 0xF2, 0xFB, 0xF9,
+ 0xFF, 0xD6, 0xDC, 0xA2, 0xA3, 0xA5, 0x20A7, 0x192,
+ 0xE1, 0xED, 0xF3, 0xFA, 0xF1, 0xD1, 0xAA, 0xBA,
+ 0xBF, 0x2310, 0xAC, 0xBD, 0xBC, 0xA1, 0xAB, 0xBB,
+ 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556,
+ 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510,
+ 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F,
+ 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567,
+ 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B,
+ 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580,
+ 0x3B1, 0xDF/*yay*/, 0x393, 0x3C0, 0x3A3, 0x3C3, 0xB5, 0x3C4,
+ 0x3A6, 0x398, 0x3A9, 0x3B4, 0x221E, 0x3C6, 0x3B5, 0x2229,
+ 0x2261, 0xB1, 0x2265, 0x2264, 0x2320, 0x2321, 0xF7, 0x2248,
+ 0xB0, 0x2219, 0xB7, 0x221A, 0x207F, 0xB2, 0x25A0, 0xA0
+};
diff --git a/g_src/basics.h b/g_src/basics.h
new file mode 100755
index 0000000..ce3a3a2
--- /dev/null
+++ b/g_src/basics.h
@@ -0,0 +1,117 @@
+#ifndef BASICS_H
+#define BASICS_H
+
+#ifndef WIN32
+#include <stdint.h>
+#endif
+#include <string>
+using std::string;
+
+#ifndef BITS
+
+#define BITS
+
+#define BIT1 1
+#define BIT2 2
+#define BIT3 4
+#define BIT4 8
+#define BIT5 16
+#define BIT6 32
+#define BIT7 64
+#define BIT8 128
+#define BIT9 256
+#define BIT10 512
+#define BIT11 1024
+#define BIT12 2048
+#define BIT13 4096
+#define BIT14 8192
+#define BIT15 16384
+#define BIT16 32768
+#define BIT17 65536UL
+#define BIT18 131072UL
+#define BIT19 262144UL
+#define BIT20 524288UL
+#define BIT21 1048576UL
+#define BIT22 2097152UL
+#define BIT23 4194304UL
+#define BIT24 8388608UL
+#define BIT25 16777216UL
+#define BIT26 33554432UL
+#define BIT27 67108864UL
+#define BIT28 134217728UL
+#define BIT29 268435456UL
+#define BIT30 536870912UL
+#define BIT31 1073741824UL
+#define BIT32 2147483648UL
+
+#endif
+
+void gamelog_string(const string &str);
+void errorlog_string(const string &str);
+void errorlog_string(const char *ptr);
+
+bool grab_token_string(string &dest,string &source,char compc=':');
+bool grab_token_string(string &dest,string &source,int32_t &pos,char compc=':');
+bool grab_token_string_pos(string &dest,string &source,int32_t pos,char compc=':');
+void replace_token_string(string &token,string &str,int32_t pos,char compc,string &nw,char repc);
+bool grab_token_list_as_string(string &dest,string &source,int32_t &pos,char compc=':');
+bool grab_token_expression(string &dest,string &source,int32_t &pos,char compc=':');
+char grab_variable_token(string &str,string &token,char sec_comp,int32_t &pos,int32_t i_pos);
+
+int32_t convert_string_to_long(string &str);
+uint32_t convert_string_to_ulong(string &str);
+void add_long_to_string(int32_t n,string &str);
+void convert_long_to_string(int32_t n,string &str);
+void convert_ulong_to_string(uint32_t n,string &str);
+
+void lower_case_string(string &str);
+void upper_case_string(string &str);
+void simplify_string(string &str);
+void capitalize_string_words(string &str);
+void capitalize_string_first_word(string &str);
+void abbreviate_string(string &str,int32_t len);
+
+void get_number(int32_t number,string &str);
+void get_ordinal(int32_t number,string &str,bool shorten);
+
+enum GameMode
+{
+ GAMEMODE_DWARF,
+ GAMEMODE_ADVENTURE,
+ GAMEMODENUM,
+ GAMEMODE_NONE
+};
+
+enum GameType
+{
+ GAMETYPE_DWARF_MAIN,
+ GAMETYPE_ADVENTURE_MAIN,
+ GAMETYPE_VIEW_LEGENDS,
+ GAMETYPE_DWARF_RECLAIM,
+ GAMETYPE_DWARF_ARENA,
+ GAMETYPE_ADVENTURE_ARENA,
+ GAMETYPE_ADVENTURE_DUNGEON,
+ GAMETYPE_DWARF_TUTORIAL,
+ GAMETYPE_DWARF_UNRETIRE,
+ GAMETYPE_ADVENTURE_WORLD_DEBUG,
+ GAMETYPENUM,
+ GAMETYPE_NONE
+};
+
+enum Song
+{
+ SONG_TITLE,
+ SONG_GAME,
+ SONGNUM
+};
+
+
+enum justification : unsigned char {
+ justify_left, justify_center, justify_right,
+ justify_cont,
+ not_truetype
+};
+
+extern int charmap[256];
+
+#endif
diff --git a/g_src/bimap.h b/g_src/bimap.h
new file mode 100755
index 0000000..968f770
--- /dev/null
+++ b/g_src/bimap.h
@@ -0,0 +1,17 @@
+#ifndef BIMAP_H
+#define BIMAP_H
+
+#include <map>
+
+template<typename A, typename B>
+struct bimap {
+ std::map<A,B> left;
+ std::map<B,A> right;
+
+ void insert(A a, B b) {
+ left.insert(std::pair<A,B>(a,b));
+ right.insert(std::pair<B,A>(b,a));
+ }
+};
+
+#endif
diff --git a/g_src/command_line.cpp b/g_src/command_line.cpp
new file mode 100755
index 0000000..422f88f
--- /dev/null
+++ b/g_src/command_line.cpp
@@ -0,0 +1,132 @@
+#include "platform.h"
+#include <string.h>
+#include <math.h>
+#include <iosfwd>
+#include <iostream>
+#include <ios>
+#include <streambuf>
+#include <istream>
+#include <ostream>
+#include <iomanip>
+#include <sstream>
+#include <cstdlib>
+#include <fstream>
+#include <zlib.h>
+
+#include "svector.h"
+using std::string;
+
+#include "endian.h"
+
+#include "files.h"
+
+#include "enabler.h"
+
+#include "textlines.h"
+
+#include "basics.h"
+
+#include "command_line.h"
+
+void command_linest::init(const string &str)
+{
+ original=str;
+
+ //BUILD THE TOKEN LIST
+ long pos=0;
+ while(grab_arg(original,pos));
+
+ //HANDLE EACH TOKEN
+ long l;
+ for(l=0;l<arg_vect.str.size();l++)
+ {
+ handle_arg(arg_vect.str[l]->dat);
+ }
+}
+
+char command_linest::grab_arg(string &source,long &pos)
+{
+ string dest;
+
+ while(pos<source.length())
+ {
+ //HIT A NEW ARGUMENT? RETURN, OTHERWISE SKIP AND START UP
+ if(source[pos]=='-')
+ {
+ if(dest.empty()){pos++;continue;}
+ else
+ {
+ pos++;
+ arg_vect.add_string(dest);
+ return 1;
+ }
+ }
+
+ dest+=source[pos];
+
+ pos++;
+ }
+
+ if(!dest.empty())arg_vect.add_string(dest);
+ return 0;
+}
+
+void command_linest::handle_arg(string &arg)
+{
+ long pos=0;
+ string dest;
+
+ grab_token_string_pos(dest,arg,pos,' ');
+ pos+=dest.length();
+
+ short arg_pos=0;
+ if(dest=="gen")
+ {
+ //KEEP GOING FOR A NUMBER
+ while(pos+1<arg.length())
+ {
+ dest.erase();
+ pos++;
+ auto s=arg.begin(),e=arg.end();
+ s+=pos;
+ bool quote=false;
+ for(;s<e;++s)
+ {
+ if((*s)=='"')
+ {
+ if(quote)break;
+ else quote=true;
+ ++pos;
+ continue;
+ }
+ else if((*s)==' '&&!quote)break;
+ dest+=(*s);
+ }
+ pos+=dest.length();
+
+
+ if(!dest.empty())
+ {
+ if(arg_pos==0)gen_id=convert_string_to_long(dest);
+ if(arg_pos==1)
+ {
+ if(dest!="RANDOM")
+ {
+ world_seed=convert_string_to_ulong(dest);
+ use_seed=1;
+ }
+ }
+ if(arg_pos==2)
+ {
+ if(dest!="NONE")
+ {
+ world_param=dest;
+ use_param=1;
+ }
+ }
+
+ arg_pos++;
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/g_src/command_line.h b/g_src/command_line.h
new file mode 100755
index 0000000..e2606fb
--- /dev/null
+++ b/g_src/command_line.h
@@ -0,0 +1,25 @@
+class command_linest
+{
+ public:
+ string original;
+ stringvectst arg_vect;
+
+ long gen_id;
+ unsigned long world_seed;
+ char use_seed;
+ string world_param;
+ char use_param;
+
+
+
+ void init(const string &str);
+ char grab_arg(string &source,long &pos);
+ void handle_arg(string &arg);
+
+ command_linest()
+ {
+ gen_id=-1;
+ use_seed=0;
+ use_param=0;
+ }
+}; \ No newline at end of file
diff --git a/g_src/curses.h b/g_src/curses.h
new file mode 100755
index 0000000..1253f60
--- /dev/null
+++ b/g_src/curses.h
@@ -0,0 +1,28 @@
+#ifndef DF_CURSES_H
+#define DF_CURSES_H
+
+extern "C" {
+#include "GL/glew.h"
+#if defined(__unix__) || defined(__APPLE__)
+#ifdef __APPLE__
+# include "ncursesw/curses.h"
+#else
+# include <ncursesw/curses.h>
+#endif
+# undef COLOR_BLUE
+# undef COLOR_CYAN
+# undef COLOR_RED
+# undef COLOR_YELLOW
+# include <dlfcn.h>
+#endif
+}
+
+#if defined(__unix__) || defined(__APPLE__)
+extern "C" {
+ void init_curses();
+ extern WINDOW **stdscr_p;
+};
+#endif
+
+
+#endif
diff --git a/g_src/enabler.cpp b/g_src/enabler.cpp
new file mode 100755
index 0000000..282eb34
--- /dev/null
+++ b/g_src/enabler.cpp
@@ -0,0 +1,968 @@
+#ifdef __APPLE__
+# include "osx_messagebox.h"
+#elif defined(unix)
+# include <gtk/gtk.h>
+#endif
+
+#include <cassert>
+
+#include "platform.h"
+#include "enabler.h"
+#include "random.h"
+#include "init.h"
+#include "music_and_sound_g.h"
+
+#ifdef unix
+# include <locale.h>
+#endif
+
+using namespace std;
+
+enablerst enabler;
+
+
+// For the printGLError macro
+int glerrorcount = 0;
+
+// Set to 0 when the game wants to quit
+static int loopvar = 1;
+
+// Reports an error to the user, using a MessageBox and stderr.
+void report_error(const char *error_preface, const char *error_message)
+{
+ char *buf = NULL;
+ // +4 = +colon +space +newline +nul
+ buf = new char[strlen(error_preface) + strlen(error_message) + 4];
+ sprintf(buf, "%s: %s\n", error_preface, error_message);
+ MessageBox(NULL, buf, "Error", MB_OK);
+ fprintf(stderr, "%s", buf);
+ delete [] buf;
+}
+
+Either<texture_fullid,texture_ttfid> renderer::screen_to_texid(int x, int y) {
+ const int tile = x * gps.dimy + y;
+ const unsigned char *s = screen + tile*4;
+
+ struct texture_fullid ret;
+ int ch;
+ int bold;
+ int fg;
+ int bg;
+
+ // TTF text does not get the full treatment.
+ if (s[3] == GRAPHICSTYPE_TTF) {
+ texture_ttfid texpos = *((unsigned int *)s) & 0xffffff;
+ return Either<texture_fullid,texture_ttfid>(texpos);
+ } else if (s[3] == GRAPHICSTYPE_TTFCONT) {
+ // TTFCONT means this is a tile that does not have TTF anchored on it, but is covered by TTF.
+ // Since this may actually be stale information, we'll draw it as a blank space,
+ ch = 32;
+ fg = bg = bold = 0;
+ } else {
+ // Otherwise, it's a normal (graphical?) tile.
+ ch = s[0];
+ bold = (s[3] != 0) * 8;
+ fg = (s[1] + bold) % 16;
+ bg = s[2] % 16;
+ }
+
+ static bool use_graphics = init.display.flag.has_flag(INIT_DISPLAY_FLAG_USE_GRAPHICS);
+
+ if (use_graphics) {
+ const long texpos = screentexpos[tile];
+ const char addcolor = screentexpos_addcolor[tile];
+ const unsigned char grayscale = screentexpos_grayscale[tile];
+ const unsigned char cf = screentexpos_cf[tile];
+ const unsigned char cbr = screentexpos_cbr[tile];
+
+ if (texpos) {
+ ret.texpos = texpos;
+ if (grayscale) {
+ ret.r = enabler.ccolor[cf][0];
+ ret.g = enabler.ccolor[cf][1];
+ ret.b = enabler.ccolor[cf][2];
+ ret.br = enabler.ccolor[cbr][0];
+ ret.bg = enabler.ccolor[cbr][1];
+ ret.bb = enabler.ccolor[cbr][2];
+ } else if (addcolor) {
+ goto use_ch;
+ } else {
+ ret.r = ret.g = ret.b = 1;
+ ret.br = ret.bg = ret.bb = 0;
+ }
+ goto skip_ch;
+ }
+ }
+
+ ret.texpos = enabler.is_fullscreen() ?
+ init.font.large_font_texpos[ch] :
+ init.font.small_font_texpos[ch];
+ use_ch:
+ ret.r = enabler.ccolor[fg][0];
+ ret.g = enabler.ccolor[fg][1];
+ ret.b = enabler.ccolor[fg][2];
+ ret.br = enabler.ccolor[bg][0];
+ ret.bg = enabler.ccolor[bg][1];
+ ret.bb = enabler.ccolor[bg][2];
+
+ skip_ch:
+
+ return Either<texture_fullid,texture_ttfid>(ret);
+}
+
+
+#ifdef CURSES
+# include "renderer_curses.cpp"
+#endif
+#include "renderer_2d.hpp"
+#include "renderer_opengl.hpp"
+
+
+enablerst::enablerst() {
+ fullscreen = false;
+ sync = NULL;
+ renderer = NULL;
+ calculated_fps = calculated_gfps = frame_sum = gframe_sum = frame_last = gframe_last = 0;
+ fps = 100; gfps = 20;
+ fps_per_gfps = fps / gfps;
+ last_tick = 0;
+}
+
+void renderer::display()
+{
+ const int dimx = init.display.grid_x;
+ const int dimy = init.display.grid_y;
+ static bool use_graphics = init.display.flag.has_flag(INIT_DISPLAY_FLAG_USE_GRAPHICS);
+ if (gps.force_full_display_count) {
+ // Update the entire screen
+ update_all();
+ } else {
+ Uint32 *screenp = (Uint32*)screen, *oldp = (Uint32*)screen_old;
+ if (use_graphics) {
+ int off = 0;
+ for (int x2=0; x2 < dimx; x2++) {
+ for (int y2=0; y2 < dimy; y2++, ++off, ++screenp, ++oldp) {
+ // We don't use pointers for the non-screen arrays because we mostly fail at the
+ // *first* comparison, and having pointers for the others would exceed register
+ // count.
+ // Partial printing (and color-conversion): Big-ass if.
+ if (*screenp == *oldp &&
+ screentexpos[off] == screentexpos_old[off] &&
+ screentexpos_addcolor[off] == screentexpos_addcolor_old[off] &&
+ screentexpos_grayscale[off] == screentexpos_grayscale_old[off] &&
+ screentexpos_cf[off] == screentexpos_cf_old[off] &&
+ screentexpos_cbr[off] == screentexpos_cbr_old[off])
+ {
+ // Nothing's changed, this clause deliberately empty
+ } else {
+ update_tile(x2, y2);
+ }
+ }
+ }
+ } else {
+ for (int x2=0; x2 < dimx; ++x2) {
+ for (int y2=0; y2 < dimy; ++y2, ++screenp, ++oldp) {
+ if (*screenp != *oldp) {
+ update_tile(x2, y2);
+ }
+ }
+ }
+ }
+ }
+ if (gps.force_full_display_count > 0) gps.force_full_display_count--;
+}
+
+void renderer::cleanup_arrays() {
+ if (screen) delete[] screen;
+ if (screentexpos) delete[] screentexpos;
+ if (screentexpos_addcolor) delete[] screentexpos_addcolor;
+ if (screentexpos_grayscale) delete[] screentexpos_grayscale;
+ if (screentexpos_cf) delete[] screentexpos_cf;
+ if (screentexpos_cbr) delete[] screentexpos_cbr;
+ if (screen_old) delete[] screen_old;
+ if (screentexpos_old) delete[] screentexpos_old;
+ if (screentexpos_addcolor_old) delete[] screentexpos_addcolor_old;
+ if (screentexpos_grayscale_old) delete[] screentexpos_grayscale_old;
+ if (screentexpos_cf_old) delete[] screentexpos_cf_old;
+ if (screentexpos_cbr_old) delete[] screentexpos_cbr_old;
+}
+
+void renderer::gps_allocate(int x, int y) {
+ cleanup_arrays();
+
+ gps.screen = screen = new unsigned char[x*y*4];
+ memset(screen, 0, x*y*4);
+ gps.screentexpos = screentexpos = new long[x*y];
+ memset(screentexpos, 0, x*y*sizeof(long));
+ gps.screentexpos_addcolor = screentexpos_addcolor = new char[x*y];
+ memset(screentexpos_addcolor, 0, x*y);
+ gps.screentexpos_grayscale = screentexpos_grayscale = new unsigned char[x*y];
+ memset(screentexpos_grayscale, 0, x*y);
+ gps.screentexpos_cf = screentexpos_cf = new unsigned char[x*y];
+ memset(screentexpos_cf, 0, x*y);
+ gps.screentexpos_cbr = screentexpos_cbr = new unsigned char[x*y];
+ memset(screentexpos_cbr, 0, x*y);
+
+ screen_old = new unsigned char[x*y*4];
+ memset(screen_old, 0, x*y*4);
+ screentexpos_old = new long[x*y];
+ memset(screentexpos_old, 0, x*y*sizeof(long));
+ screentexpos_addcolor_old = new char[x*y];
+ memset(screentexpos_addcolor_old, 0, x*y);
+ screentexpos_grayscale_old = new unsigned char[x*y];
+ memset(screentexpos_grayscale_old, 0, x*y);
+ screentexpos_cf_old = new unsigned char[x*y];
+ memset(screentexpos_cf_old, 0, x*y);
+ screentexpos_cbr_old = new unsigned char[x*y];
+ memset(screentexpos_cbr_old, 0, x*y);
+
+ gps.resize(x,y);
+}
+
+void renderer::swap_arrays() {
+ screen = screen_old; screen_old = gps.screen; gps.screen = screen;
+ screentexpos = screentexpos_old; screentexpos_old = gps.screentexpos; gps.screentexpos = screentexpos;
+ screentexpos_addcolor = screentexpos_addcolor_old; screentexpos_addcolor_old = gps.screentexpos_addcolor; gps.screentexpos_addcolor = screentexpos_addcolor;
+ screentexpos_grayscale = screentexpos_grayscale_old; screentexpos_grayscale_old = gps.screentexpos_grayscale; gps.screentexpos_grayscale = screentexpos_grayscale;
+ screentexpos_cf = screentexpos_cf_old; screentexpos_cf_old = gps.screentexpos_cf; gps.screentexpos_cf = screentexpos_cf;
+ screentexpos_cbr = screentexpos_cbr_old; screentexpos_cbr_old = gps.screentexpos_cbr; gps.screentexpos_cbr = screentexpos_cbr;
+
+ gps.screen_limit = gps.screen + gps.dimx * gps.dimy * 4;
+}
+
+void enablerst::pause_async_loop() {
+ struct async_cmd cmd;
+ cmd.cmd = async_cmd::pause;
+ async_tobox.write(cmd);
+ async_wait();
+}
+
+// Wait until the previous command has been acknowledged, /or/
+// async_loop has quit. Incidentally execute any requests in the
+// meantime.
+void enablerst::async_wait() {
+ if (loopvar == 0) return;
+ async_msg r;
+ bool reset_textures = false;
+ for (;;) {
+ async_frombox.read(r);
+ switch (r.msg) {
+ case async_msg::quit:
+ loopvar = 0;
+ return;
+ case async_msg::complete:
+ if (reset_textures) {
+ puts("Resetting textures");
+ textures.remove_uploaded_textures();
+ textures.upload_textures();
+ }
+ return;
+ case async_msg::set_fps:
+ set_fps(r.fps);
+ async_fromcomplete.write();
+ break;
+ case async_msg::set_gfps:
+ set_gfps(r.fps);
+ async_fromcomplete.write();
+ break;
+ case async_msg::push_resize:
+ override_grid_size(r.x, r.y);
+ async_fromcomplete.write();
+ break;
+ case async_msg::pop_resize:
+ release_grid_size();
+ async_fromcomplete.write();
+ break;
+ case async_msg::reset_textures:
+ reset_textures = true;
+ break;
+ default:
+ puts("EMERGENCY: Unknown case in async_wait");
+ abort();
+ }
+ }
+}
+
+void enablerst::async_loop() {
+ async_paused = false;
+ async_frames = 0;
+ int total_frames = 0;
+ int fps = 100; // Just a thread-local copy
+ for (;;) {
+ // cout << "FRAMES: " << frames << endl;
+ // Check for commands
+ async_cmd cmd;
+ bool have_cmd = true;
+ do {
+ if (async_paused || (async_frames == 0 && !(enabler.flag & ENABLERFLAG_MAXFPS)))
+ async_tobox.read(cmd);
+ else
+ have_cmd = async_tobox.try_read(cmd);
+ // Obey the command, would you kindly.
+ if (have_cmd) {
+ switch (cmd.cmd) {
+ case async_cmd::pause:
+ async_paused = true;
+ // puts("Paused");
+ async_frombox.write(async_msg(async_msg::complete));
+ break;
+ case async_cmd::start:
+ async_paused = false;
+ async_frames = 0;
+ // puts("UNpaused");
+ break;
+ case async_cmd::render:
+ if (flag & ENABLERFLAG_RENDER) {
+ total_frames++;
+ renderer->swap_arrays();
+ if (total_frames % 1800 == 0)
+ ttf_manager.gc();
+ render_things();
+ flag &= ~ENABLERFLAG_RENDER;
+ update_gfps();
+ }
+ async_frombox.write(async_msg(async_msg::complete));
+ break;
+ case async_cmd::inc:
+ async_frames += cmd.val;
+ if (async_frames > fps*3) async_frames = fps*3; // Just in case
+ break;
+ case async_cmd::set_fps:
+ fps = cmd.val;
+ break;
+ }
+ }
+ } while (have_cmd);
+ // Run the main-loop, maybe
+ if (!async_paused && (async_frames || (enabler.flag & ENABLERFLAG_MAXFPS))) {
+ if (mainloop()) {
+ async_frombox.write(async_msg(async_msg::quit));
+ return; // We're done.
+ }
+ simticks.lock();
+ simticks.val++;
+ simticks.unlock();
+ async_frames--;
+ if (async_frames < 0) async_frames = 0;
+ update_fps();
+ }
+ SDL_NumJoysticks(); // Hook for dfhack
+ }
+}
+
+void enablerst::do_frame() {
+ // Check how long it's been, exactly
+ const Uint32 now = SDL_GetTicks();
+ const Uint32 interval = CLAMP(now - last_tick, 0, 1000); // Anything above a second doesn't count
+ // cout << last_tick << " + " << interval << " = " << now << endl;
+ last_tick = now;
+
+ // Update outstanding-frame counts
+ outstanding_frames += interval * fps / 1000;
+ outstanding_gframes += interval * gfps / 1000;
+ if (outstanding_gframes > 3) {
+ outstanding_gframes = 3;
+ }
+ // cout << outstanding_frames << " " << outstanding_gframes << endl;
+
+ // Update the loop's tick-counter suitably
+ if (outstanding_frames >= 1) {
+ async_cmd cmd(async_cmd::inc);
+ cmd.val = outstanding_frames;
+ outstanding_frames -= cmd.val;
+ async_tobox.write(cmd);
+ }
+
+ // Store the current time, for things that are fine with approximations
+ enabler.clock = SDL_GetTicks();
+
+ // If it's time to render..
+ if (outstanding_gframes >= 1 &&
+ (!sync || glClientWaitSync(sync, 0, 0) == GL_ALREADY_SIGNALED)) {
+ // Get the async-loop to render_things
+ async_cmd cmd(async_cmd::render);
+ async_tobox.write(cmd);
+ async_wait();
+ // Then finish here
+ renderer->display();
+ renderer->render();
+ gputicks.lock();
+ gputicks.val++;
+ gputicks.unlock();
+ outstanding_gframes--;
+ }
+
+ // Sleep until the next gframe
+ if (outstanding_gframes < 1) {
+ float fragment = 1 - outstanding_gframes;
+ float milliseconds = fragment / gfps * 1000;
+ // cout << milliseconds << endl;
+ SDL_Delay(milliseconds);
+ }
+}
+
+void enablerst::eventLoop_SDL()
+{
+
+ SDL_Event event;
+ const SDL_Surface *screen = SDL_GetVideoSurface();
+ Uint32 mouse_lastused = 0;
+ SDL_ShowCursor(SDL_DISABLE);
+
+ // Initialize the grid
+ renderer->resize(screen->w, screen->h);
+
+ while (loopvar) {
+ Uint32 now = SDL_GetTicks();
+ bool paused_loop = false;
+
+ // Check for zoom commands
+ zoom_commands zoom;
+ while (async_zoom.try_read(zoom)) {
+ if (overridden_grid_sizes.size())
+ continue; // No zooming in movies
+ if (!paused_loop) {
+ pause_async_loop();
+ paused_loop = true;
+ }
+ if (zoom == zoom_fullscreen)
+ renderer->set_fullscreen();
+ else
+ renderer->zoom(zoom);
+ }
+
+ // Check for SDL events
+ while (SDL_PollEvent(&event)) {
+ // Make sure mainloop isn't running while we're processing input
+ if (!paused_loop) {
+ pause_async_loop();
+ paused_loop = true;
+ }
+ // Handle SDL events
+ switch (event.type) {
+ case SDL_KEYDOWN:
+ // Disable mouse if it's been long enough
+ if (mouse_lastused + 5000 < now) {
+ if(init.input.flag.has_flag(INIT_INPUT_FLAG_MOUSE_PICTURE)) {
+ // hide the mouse picture
+ // enabler.set_tile(0, TEXTURE_MOUSE, enabler.mouse_x, enabler.mouse_y);
+ }
+ SDL_ShowCursor(SDL_DISABLE);
+ }
+ case SDL_KEYUP:
+ case SDL_QUIT:
+ enabler.add_input(event, now);
+ break;
+ case SDL_MOUSEBUTTONDOWN:
+ case SDL_MOUSEBUTTONUP:
+ if (!init.input.flag.has_flag(INIT_INPUT_FLAG_MOUSE_OFF)) {
+ int isdown = (event.type == SDL_MOUSEBUTTONDOWN);
+ if (event.button.button == SDL_BUTTON_LEFT) {
+ enabler.mouse_lbut = isdown;
+ enabler.mouse_lbut_down = isdown;
+ if (!isdown)
+ enabler.mouse_lbut_lift = 0;
+ } else if (event.button.button == SDL_BUTTON_RIGHT) {
+ enabler.mouse_rbut = isdown;
+ enabler.mouse_rbut_down = isdown;
+ if (!isdown)
+ enabler.mouse_rbut_lift = 0;
+ } else
+ enabler.add_input(event, now);
+ }
+ break;
+ case SDL_MOUSEMOTION:
+ // Deal with the mouse hiding bit
+ mouse_lastused = now;
+ if(init.input.flag.has_flag(INIT_INPUT_FLAG_MOUSE_PICTURE)) {
+ // turn on mouse picture
+ // enabler.set_tile(gps.tex_pos[TEXTURE_MOUSE], TEXTURE_MOUSE,enabler.mouse_x, enabler.mouse_y);
+ } else {
+ SDL_ShowCursor(SDL_ENABLE);
+ }
+ break;
+ case SDL_ACTIVEEVENT:
+ enabler.clear_input();
+ if (event.active.state & SDL_APPACTIVE) {
+ if (event.active.gain) {
+ enabler.flag|=ENABLERFLAG_RENDER;
+ gps.force_full_display_count++;
+ }
+ }
+ break;
+ case SDL_VIDEOEXPOSE:
+ gps.force_full_display_count++;
+ enabler.flag|=ENABLERFLAG_RENDER;
+ break;
+ case SDL_VIDEORESIZE:
+ if (is_fullscreen());
+ //errorlog << "Caught resize event in fullscreen??\n";
+ else {
+ //gamelog << "Resizing window to " << event.resize.w << "x" << event.resize.h << endl << flush;
+ renderer->resize(event.resize.w, event.resize.h);
+ }
+ break;
+ } // switch (event.type)
+ } //while have event
+
+ // Update mouse state
+ if (!init.input.flag.has_flag(INIT_INPUT_FLAG_MOUSE_OFF)) {
+ int mouse_x = -1, mouse_y = -1, mouse_state;
+ // Check whether the renderer considers this valid input or not, and write it to gps
+ if ((SDL_GetAppState() & SDL_APPMOUSEFOCUS) &&
+ renderer->get_mouse_coords(mouse_x, mouse_y)) {
+ mouse_state = 1;
+ } else {
+ mouse_state = 0;
+ }
+ if (mouse_x != gps.mouse_x || mouse_y != gps.mouse_y ||
+ mouse_state != enabler.tracking_on) {
+ // Pause rendering loop and update values
+ if (!paused_loop) {
+ pause_async_loop();
+ paused_loop = true;
+ }
+ enabler.tracking_on = mouse_state;
+ gps.mouse_x = mouse_x;
+ gps.mouse_y = mouse_y;
+ }
+ }
+
+ if (paused_loop)
+ unpause_async_loop();
+
+ do_frame();
+#if !defined(NO_FMOD)
+ // Call FMOD::System.update(). Manages a bunch of sound stuff.
+ musicsound.update();
+#endif
+ }
+}
+
+int enablerst::loop(string cmdline) {
+ command_line = cmdline;
+
+ // Initialize the tick counters
+ simticks.write(0);
+ gputicks.write(0);
+
+ // Call DF's initialization routine
+ if (!beginroutine())
+ exit(EXIT_FAILURE);
+
+ // Allocate a renderer
+ if (init.display.flag.has_flag(INIT_DISPLAY_FLAG_TEXT)) {
+#ifdef CURSES
+ renderer = new renderer_curses();
+#else
+ report_error("PRINT_MODE", "TEXT not supported on windows");
+ exit(EXIT_FAILURE);
+#endif
+ } else if (init.display.flag.has_flag(INIT_DISPLAY_FLAG_2D)) {
+ renderer = new renderer_2d();
+ } else if (init.display.flag.has_flag(INIT_DISPLAY_FLAG_ACCUM_BUFFER)) {
+ renderer = new renderer_accum_buffer();
+ } else if (init.display.flag.has_flag(INIT_DISPLAY_FLAG_FRAME_BUFFER)) {
+ renderer = new renderer_framebuffer();
+ } else if (init.display.flag.has_flag(INIT_DISPLAY_FLAG_PARTIAL_PRINT)) {
+ if (init.display.partial_print_count)
+ renderer = new renderer_partial();
+ else
+ renderer = new renderer_once();
+ } else if (init.display.flag.has_flag(INIT_DISPLAY_FLAG_VBO)) {
+ renderer = new renderer_vbo();
+ } else {
+ renderer = new renderer_opengl();
+ }
+
+ // At this point we should have a window that is setup to render DF.
+ if (init.display.flag.has_flag(INIT_DISPLAY_FLAG_TEXT)) {
+#ifdef CURSES
+ eventLoop_ncurses();
+#endif
+ } else {
+ SDL_EnableUNICODE(1);
+ eventLoop_SDL();
+ }
+
+ endroutine();
+
+ // Clean up graphical resources
+ delete renderer;
+}
+
+void enablerst::override_grid_size(int x, int y) {
+ if (SDL_ThreadID() != renderer_threadid) {
+ // Ask the renderer to do it
+ async_msg m(async_msg::push_resize);
+ m.x = x; m.y = y;
+ async_frombox.write(m);
+ async_fromcomplete.read();
+ } else {
+ // We are the renderer; do it.
+ overridden_grid_sizes.push(make_pair(init.display.grid_x,init.display.grid_y));
+ renderer->grid_resize(x, y);
+ }
+}
+
+void enablerst::release_grid_size() {
+ if (SDL_ThreadID() != renderer_threadid) {
+ async_frombox.write(async_msg(async_msg::pop_resize));
+ async_fromcomplete.read();
+ } else {
+ if (!overridden_grid_sizes.size()) return;
+ // FIXME: Find out whatever is causing release to be called too rarely; right now
+ // we're overriding once per movie but apparently only releasing for the last one.
+ pair<int,int> sz;
+ while (overridden_grid_sizes.size()) {
+ sz = overridden_grid_sizes.top();
+ overridden_grid_sizes.pop();
+ }
+ zoom_display(zoom_resetgrid);
+ }
+}
+
+void enablerst::zoom_display(zoom_commands command) {
+ async_zoom.write(command);
+}
+
+int enablerst::calculate_fps() {
+ if (frame_timings.size() < 50)
+ return get_fps();
+ else
+ return calculated_fps;
+}
+int enablerst::calculate_gfps() {
+ if (gframe_timings.size() < 50)
+ return get_gfps();
+ else
+ return calculated_gfps;
+}
+
+void enablerst::do_update_fps(queue<int> &q, int &sum, int &last, int &calc) {
+ while (q.size() > 50 && sum > 10000) {
+ sum -= q.front();
+ q.pop();
+ }
+ const int now = SDL_GetTicks();
+ const int interval = now - last;
+ q.push(interval);
+ sum += interval;
+ last = now;
+ if (sum)
+ calc = q.size() * 1000 / sum;
+}
+
+void enablerst::clear_fps() {
+ while (frame_timings.size())
+ frame_timings.pop();
+ frame_sum = 0;
+ frame_last = SDL_GetTicks();
+ calculated_fps = get_fps();
+}
+
+void enablerst::update_fps() {
+ do_update_fps(frame_timings, frame_sum, frame_last, calculated_fps);
+}
+
+void enablerst::update_gfps() {
+ do_update_fps(gframe_timings, gframe_sum, gframe_last, calculated_gfps);
+}
+
+void enablerst::set_fps(int fps) {
+ if (SDL_ThreadID() != renderer_threadid) {
+ async_msg m(async_msg::set_fps);
+ m.fps = fps;
+ async_paused = true;
+ async_frombox.write(m);
+ async_fromcomplete.read();
+ } else {
+ if (fps == 0)
+ fps = 1048576;
+ this->fps = fps;
+ fps_per_gfps = fps / gfps;
+ struct async_cmd cmd;
+ cmd.cmd = async_cmd::set_fps;
+ cmd.val = fps;
+ async_tobox.write(cmd);
+ async_tobox.write(async_cmd(async_cmd::start));
+ }
+}
+
+void enablerst::set_gfps(int gfps) {
+ if (SDL_ThreadID() != renderer_threadid) {
+ async_msg m(async_msg::set_gfps);
+ m.fps = gfps;
+ async_frombox.write(m);
+ async_fromcomplete.read();
+ } else {
+ if (gfps == 0)
+ gfps = 50;
+ this->gfps = gfps;
+ fps_per_gfps = fps / gfps;
+ }
+}
+
+int call_loop(void *dummy) {
+ enabler.async_loop();
+ return 0;
+}
+
+int main (int argc, char* argv[]) {
+#ifdef unix
+ setlocale(LC_ALL, "");
+#endif
+#if !defined(__APPLE__) && defined(unix)
+ bool gtk_ok = false;
+ if (getenv("DISPLAY"))
+ gtk_ok = gtk_init_check(&argc, &argv);
+#endif
+
+ // Initialise minimal SDL subsystems.
+ int retval = SDL_Init(SDL_INIT_TIMER);
+ // Report failure?
+ if (retval != 0) {
+ report_error("SDL initialization failure", SDL_GetError());
+ return false;
+ }
+ enabler.renderer_threadid = SDL_ThreadID();
+
+ // Spawn simulation thread
+ SDL_CreateThread(call_loop, NULL);
+
+ init.begin(); // Load init.txt settings
+
+#if !defined(__APPLE__) && defined(unix)
+ if (!gtk_ok && !init.display.flag.has_flag(INIT_DISPLAY_FLAG_TEXT)) {
+ puts("Display not found and PRINT_MODE not set to TEXT, aborting.");
+ exit(EXIT_FAILURE);
+ }
+ if (init.display.flag.has_flag(INIT_DISPLAY_FLAG_TEXT) &&
+ init.display.flag.has_flag(INIT_DISPLAY_FLAG_USE_GRAPHICS)) {
+ puts("Graphical tiles are not compatible with text output, sorry");
+ exit(EXIT_FAILURE);
+ }
+#endif
+
+ // Initialize video, if we /use/ video
+ retval = SDL_InitSubSystem(init.display.flag.has_flag(INIT_DISPLAY_FLAG_TEXT) ? 0 : SDL_INIT_VIDEO);
+ if (retval != 0) {
+ report_error("SDL initialization failure", SDL_GetError());
+ return false;
+ }
+
+#ifdef linux
+ if (!init.media.flag.has_flag(INIT_MEDIA_FLAG_SOUND_OFF)) {
+ // Initialize OpenAL
+ if (!musicsound.initsound()) {
+ puts("Initializing OpenAL failed, no sound will be played");
+ init.media.flag.add_flag(INIT_MEDIA_FLAG_SOUND_OFF);
+ }
+ }
+#endif
+
+#ifdef WIN32
+ // Attempt to get as good a timer as possible
+ int ms = 1;
+ while (timeBeginPeriod(ms) != TIMERR_NOERROR) ms++;
+#endif
+
+ // Load keyboard map
+ keybinding_init();
+ enabler.load_keybindings("data/init/interface.txt");
+
+ string cmdLine;
+ for (int i = 1; i < argc; ++i) {
+ char *option = argv[i];
+ string opt=option;
+ if(opt.length()>=1)
+ {
+ //main removes quotes, unlike the winmain version, so it has to be rebuilt
+ if(opt[0]=='-')
+ {
+ cmdLine += opt;
+ cmdLine += " ";
+ }
+ else
+ {
+ cmdLine += "\"";
+ cmdLine += opt;
+ cmdLine += "\"";
+ cmdLine += " ";
+ }
+ }
+ }
+ int result = enabler.loop(cmdLine);
+
+ SDL_Quit();
+
+#ifdef WIN32
+ timeEndPeriod(ms);
+#endif
+
+ return result;
+}
+
+void text_system_file_infost::initialize_info()
+{
+ std::ifstream fseed(filename.c_str());
+ if(fseed.is_open())
+ {
+ string str;
+
+ while(std::getline(fseed,str))
+ {
+ if(str.length()>0)number++;
+ }
+ }
+ else
+ {
+ string str;
+ str="Error Initializing Text: ";
+ str+=filename;
+ errorlog_string(str);
+ }
+ fseed.close();
+}
+
+void text_system_file_infost::get_text(text_infost &text)
+{
+ text.clean();
+
+ if(number==0)return;
+
+ std::ifstream fseed(filename.c_str());
+ if(fseed.is_open())
+ {
+ string str;
+
+ int num=trandom(number);
+
+ //SKIP AHEAD TO THE RIGHT SPOT
+ while(num>0)
+ {
+ std::getline(fseed,str);
+ num--;
+ }
+
+ //PROCESS THE STRING INTO TEXT ELEMENTS
+ if(std::getline(fseed,str))
+ {
+ int curpos;
+ string nextstr;
+ char doing_long=0;
+
+ text_info_elementst *newel;
+ long end=str.length();
+
+ while(end>0)
+ {
+ if(isspace(str[end-1]))end--;
+ else break;
+ }
+
+ str.resize(end);
+
+ for(curpos=0;curpos<end;curpos++)
+ {
+ //HANDLE TOKEN OR ENDING
+ //TWO FILE TOKENS IN A ROW MEANS LONG
+ //ONE MEANS STRING
+ if(str[curpos]==file_token || curpos==end-1)
+ {
+ if(str[curpos]!=file_token)nextstr+=str[curpos];
+
+ //HAVE SOMETHING == SAVE IT
+ if(!nextstr.empty())
+ {
+ if(doing_long)
+ {
+ newel=new text_info_element_longst(atoi(nextstr.c_str()));
+ text.element.push_back(newel);
+ doing_long=0;
+ }
+ else
+ {
+ newel=new text_info_element_stringst(nextstr);
+ text.element.push_back(newel);
+ }
+
+ nextstr.erase();
+ }
+ //STARTING A LONG
+ else
+ {
+ doing_long=1;
+ }
+ }
+ //JUST ADD IN ANYTHING ELSE
+ else
+ {
+ nextstr+=str[curpos];
+ }
+ }
+ }
+ }
+ fseed.close();
+}
+
+void curses_text_boxst::add_paragraph(const string &src,int32_t para_width)
+{
+ stringvectst sp;
+ sp.add_string(src);
+ add_paragraph(sp,para_width);
+}
+
+void curses_text_boxst::add_paragraph(stringvectst &src,int32_t para_width)
+{
+ bool skip_leading_spaces=false;
+
+ //ADD EACH OF THE STRINGS ON IN TURN
+ string curstr;
+ long strlength=0;
+ long s,pos;
+ for(s=0;s<src.str.size();s++)
+ {
+ //GRAB EACH WORD, AND SEE IF IT FITS, IF NOT START A NEW LINE
+ for(pos=0;pos<src.str[s]->dat.size();pos++)
+ {
+ if(skip_leading_spaces)
+ {
+ if(src.str[s]->dat[pos]==' ')continue;
+ else skip_leading_spaces=false;
+ }
+
+ //ADD TO WORD
+ curstr+=src.str[s]->dat[pos];
+
+ //IF TOO LONG, CUT BACK TO FIRST SPACE
+ if(curstr.length()>para_width)
+ {
+ long opos=pos;
+
+ long minus=0;
+ do
+ {
+ pos--;
+ minus++;
+ }while(src.str[s]->dat[pos]!=' '&&pos>0);
+
+ //IF WENT ALL THE WAY BACK, INTRODUCE A SPACE
+ if(minus==curstr.size())
+ {
+ src.str[s]->dat.insert(opos-1," ");
+ }
+ else
+ {
+ curstr.resize(curstr.size()-minus);
+ text.add_string(curstr);
+ skip_leading_spaces=true;
+ }
+ curstr.erase();
+ }
+ }
+ }
+
+ //FLUSH FINAL BIT
+ if(!curstr.empty())text.add_string(curstr);
+}
diff --git a/g_src/enabler.h b/g_src/enabler.h
new file mode 100755
index 0000000..f524e1d
--- /dev/null
+++ b/g_src/enabler.h
@@ -0,0 +1,1027 @@
+//some of this stuff is based on public domain code from nehe or opengl books over the years
+//additions and modifications Copyright (c) 2008, Tarn Adams
+//All rights reserved. See game.cpp or license.txt for more information.
+
+#ifndef ENABLER_H
+#define ENABLER_H
+
+#include "platform.h"
+#include <SDL/SDL.h>
+#include <SDL/SDL_thread.h>
+#ifdef __APPLE__
+# include <SDL_ttf/SDL_ttf.h>
+# include <SDL_image/SDL_image.h>
+#else
+# include <SDL/SDL_ttf.h>
+# include <SDL/SDL_image.h>
+#endif
+
+#include "GL/glew.h"
+
+#include <map>
+#include <vector>
+#include <algorithm>
+#include <utility>
+#include <list>
+#include <iostream>
+#include <sstream>
+#include <stack>
+#include <queue>
+#include <set>
+#include <functional>
+
+using std::vector;
+using std::pair;
+using std::map;
+using std::set;
+using std::list;
+using std::stack;
+using std::queue;
+
+#include "basics.h"
+#include "svector.h"
+#include "endian.h"
+#include "files.h"
+#include "enabler_input.h"
+#include "mail.hpp"
+
+#define ENABLER
+
+#ifndef BITS
+
+#define BITS
+
+#define BIT1 1
+#define BIT2 2
+#define BIT3 4
+#define BIT4 8
+#define BIT5 16
+#define BIT6 32
+#define BIT7 64
+#define BIT8 128
+#define BIT9 256
+#define BIT10 512
+#define BIT11 1024
+#define BIT12 2048
+#define BIT13 4096
+#define BIT14 8192
+#define BIT15 16384
+#define BIT16 32768
+#define BIT17 65536UL
+#define BIT18 131072UL
+#define BIT19 262144UL
+#define BIT20 524288UL
+#define BIT21 1048576UL
+#define BIT22 2097152UL
+#define BIT23 4194304UL
+#define BIT24 8388608UL
+#define BIT25 16777216UL
+#define BIT26 33554432UL
+#define BIT27 67108864UL
+#define BIT28 134217728UL
+#define BIT29 268435456UL
+#define BIT30 536870912UL
+#define BIT31 1073741824UL
+#define BIT32 2147483648UL
+
+#endif
+
+#define GAME_TITLE_STRING "Dwarf Fortress"
+
+class pstringst
+{
+ public:
+ string dat;
+};
+
+class stringvectst
+{
+ public:
+ svector<pstringst *> str;
+
+ void add_string(const string &st)
+ {
+ pstringst *newp=new pstringst;
+ newp->dat=st;
+ str.push_back(newp);
+ }
+
+ long add_unique_string(const string &st)
+ {
+ long i;
+ for(i=(long)str.size()-1;i>=0;i--)
+ {
+ if(str[i]->dat==st)return i;
+ }
+ add_string(st);
+ return (long)str.size()-1;
+ }
+
+ void add_string(const char *st)
+ {
+ if(st!=NULL)
+ {
+ pstringst *newp=new pstringst;
+ newp->dat=st;
+ str.push_back(newp);
+ }
+ }
+
+ void insert_string(long k,const string &st)
+ {
+ pstringst *newp=new pstringst;
+ newp->dat=st;
+ if(str.size()>k)str.insert(k,newp);
+ else str.push_back(newp);
+ }
+
+ ~stringvectst()
+ {
+ clean();
+ }
+
+ void clean()
+ {
+ while(str.size()>0)
+ {
+ delete str[0];
+ str.erase(0);
+ }
+ }
+
+ void read_file(file_compressorst &filecomp,long loadversion)
+ {
+ long dummy;
+ filecomp.read_file(dummy);
+ str.resize(dummy);
+
+ long s;
+ for(s=0;s<dummy;s++)
+ {
+ str[s]=new pstringst;
+ filecomp.read_file(str[s]->dat);
+ }
+ }
+ void write_file(file_compressorst &filecomp)
+ {
+ long dummy=str.size();
+ filecomp.write_file(dummy);
+
+ long s;
+ for(s=0;s<dummy;s++)
+ {
+ filecomp.write_file(str[s]->dat);
+ }
+ }
+
+ void copy_from(stringvectst &src)
+ {
+ clean();
+
+ str.resize(src.str.size());
+
+ long s;
+ for(s=(long)src.str.size()-1;s>=0;s--)
+ {
+ str[s]=new pstringst;
+ str[s]->dat=src.str[s]->dat;
+ }
+ }
+
+ bool has_string(const string &st)
+ {
+ long i;
+ for(i=(long)str.size()-1;i>=0;i--)
+ {
+ if(str[i]->dat==st)return true;
+ }
+ return false;
+ }
+
+ void remove_string(const string &st)
+ {
+ long i;
+ for(i=(long)str.size()-1;i>=0;i--)
+ {
+ if(str[i]->dat==st)
+ {
+ delete str[i];
+ str.erase(i);
+ }
+ }
+ }
+
+ void operator=(stringvectst &two);
+};
+
+class flagarrayst
+{
+ public:
+ flagarrayst()
+ {
+ slotnum=0;
+ array=NULL;
+ }
+ ~flagarrayst()
+ {
+ if(array!=NULL)delete[] array;
+ array=NULL;
+ slotnum=0;
+ }
+
+ void set_size_on_flag_num(long flagnum)
+ {
+ if(flagnum<=0)return;
+
+ set_size(((flagnum-1)>>3)+1);
+ }
+
+ void set_size(long newsize)
+ {
+ if(newsize<=0)return;
+
+ if(array!=NULL)delete[] array;
+ array=new unsigned char[newsize];
+ memset(array,0,sizeof(unsigned char)*newsize);
+
+ slotnum=newsize;
+ }
+
+ void clear_all()
+ {
+ if(slotnum<=0)return;
+
+ if(array!=NULL)memset(array,0,sizeof(unsigned char)*slotnum);
+ }
+
+ void copy_from(flagarrayst &src)
+ {
+ clear_all();
+
+ if(src.slotnum>0)
+ {
+ set_size(src.slotnum);
+ memmove(array,src.array,sizeof(unsigned char)*slotnum);
+ }
+ }
+
+ bool has_flag(long checkflag)
+ {
+ if(checkflag<0)return false;
+ long slot=checkflag>>3;
+ return (slot>=0&&slot<slotnum&&((array[slot] & (1<<(checkflag&7)))!=0));
+ }
+
+ void add_flag(long checkflag)
+ {
+ if(checkflag<0)return;
+ long slot=checkflag>>3;
+ if(slot>=0&&slot<slotnum)array[slot]|=(1<<(checkflag&7));
+ }
+
+ void toggle_flag(long checkflag)
+ {
+ if(checkflag<0)return;
+ long slot=checkflag>>3;
+ if(slot>=0&&slot<slotnum)array[slot]^=(1<<(checkflag&7));
+ }
+
+ void remove_flag(long checkflag)
+ {
+ if(checkflag<0)return;
+ long slot=checkflag>>3;
+ if(slot>=0&&slot<slotnum)array[slot]&=~(1<<(checkflag&7));
+ }
+
+ void write_file(file_compressorst &filecomp)
+ {
+ filecomp.write_file(slotnum);
+ if(slotnum>0)
+ {
+ long ind;
+ for(ind=0;ind<slotnum;ind++)filecomp.write_file(array[ind]);
+ }
+ }
+
+ void read_file(file_compressorst &filecomp,long loadversion)
+ {
+ long newsl;
+ filecomp.read_file(newsl);
+ if(newsl>0)
+ {
+ //AVOID UNNECESSARY DELETE/NEW
+ if(array!=NULL&&slotnum!=newsl)
+ {
+ delete[] array;
+ array=new unsigned char[newsl];
+ }
+ if(array==NULL)array=new unsigned char[newsl];
+
+ long ind;
+ for(ind=0;ind<newsl;ind++)filecomp.read_file(array[ind]);
+
+ slotnum=newsl;
+ }
+ else if(array!=NULL)
+ {
+ delete[] array;
+ array=NULL;
+
+ slotnum=0;
+ }
+ }
+
+ private:
+ unsigned char *array;
+ long slotnum;
+};
+
+#ifdef ENABLER
+
+#define COLOR_BLACK 0
+#define COLOR_BLUE 1
+#define COLOR_GREEN 2
+#define COLOR_CYAN 3
+#define COLOR_RED 4
+#define COLOR_MAGENTA 5
+#define COLOR_YELLOW 6
+#define COLOR_WHITE 7
+
+enum ColorData
+ {
+ COLOR_DATA_WHITE_R,
+ COLOR_DATA_WHITE_G,
+ COLOR_DATA_WHITE_B,
+ COLOR_DATA_RED_R,
+ COLOR_DATA_RED_G,
+ COLOR_DATA_RED_B,
+ COLOR_DATA_GREEN_R,
+ COLOR_DATA_GREEN_G,
+ COLOR_DATA_GREEN_B,
+ COLOR_DATA_BLUE_R,
+ COLOR_DATA_BLUE_G,
+ COLOR_DATA_BLUE_B,
+ COLOR_DATA_YELLOW_R,
+ COLOR_DATA_YELLOW_G,
+ COLOR_DATA_YELLOW_B,
+ COLOR_DATA_MAGENTA_R,
+ COLOR_DATA_MAGENTA_G,
+ COLOR_DATA_MAGENTA_B,
+ COLOR_DATA_CYAN_R,
+ COLOR_DATA_CYAN_G,
+ COLOR_DATA_CYAN_B,
+ COLOR_DATANUM
+ };
+
+#define TILEFLAG_DEAD BIT1
+#define TILEFLAG_ROTATE BIT2
+#define TILEFLAG_PIXRECT BIT3
+#define TILEFLAG_HORFLIP BIT4
+#define TILEFLAG_VERFLIP BIT5
+#define TILEFLAG_LINE BIT6
+#define TILEFLAG_RECT BIT7
+#define TILEFLAG_BUFFER_DRAW BIT8
+#define TILEFLAG_MODEL_PERSPECTIVE BIT9
+#define TILEFLAG_MODEL_ORTHO BIT10
+#define TILEFLAG_MODEL_TRANSLATE BIT11
+#define TILEFLAG_LINE_3D BIT12
+
+#define TRIMAX 9999
+
+enum render_phase {
+ setup, // 0
+ complete,
+ phase_count
+};
+
+class texture_bo {
+ GLuint bo, tbo;
+ public:
+ texture_bo() { bo = tbo = 0; }
+ void reset() {
+ if (bo) {
+ glDeleteBuffers(1, &bo);
+ glDeleteTextures(1, &tbo);
+ bo = tbo = 0;
+ printGLError();
+ }
+ }
+ void buffer(GLvoid *ptr, GLsizeiptr sz) {
+ if (bo) reset();
+ glGenBuffersARB(1, &bo);
+ glGenTextures(1, &tbo);
+ glBindBufferARB(GL_TEXTURE_BUFFER_ARB, bo);
+ glBufferDataARB(GL_TEXTURE_BUFFER_ARB, sz, ptr, GL_STATIC_DRAW_ARB);
+ printGLError();
+ }
+ void bind(GLenum texture_unit, GLenum type) {
+ glActiveTexture(texture_unit);
+ glBindTexture(GL_TEXTURE_BUFFER_ARB, tbo);
+ glTexBufferARB(GL_TEXTURE_BUFFER_ARB, type, bo);
+ printGLError();
+ }
+ GLuint texnum() { return tbo; }
+};
+
+
+class shader {
+ string filename;
+ std::ostringstream lines;
+ public:
+ std::ostringstream header;
+ void load(const string &filename) {
+ this->filename = filename;
+ std::ifstream file(filename.c_str());
+ string version;
+ getline(file, version);
+ header << version << std::endl;
+ while (file.good()) {
+ string line;
+ getline(file, line);
+ lines << line << std::endl;
+ }
+ file.close();
+ }
+ GLuint upload(GLenum type) {
+ GLuint shader = glCreateShader(type);
+ string lines_done = lines.str(), header_done = header.str();
+ const char *ptrs[3];
+ ptrs[0] = header_done.c_str();
+ ptrs[1] = "#line 1 0\n";
+ ptrs[2] = lines_done.c_str();
+ glShaderSource(shader, 3, ptrs, NULL);
+ glCompileShader(shader);
+ // Let's see if this compiled correctly..
+ GLint status;
+ glGetShaderiv(shader, GL_COMPILE_STATUS, &status);
+ if (status == GL_FALSE) { // ..no. Check the compilation log.
+ GLint log_size;
+ glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &log_size);
+ //errorlog << filename << " preprocessed source:" << std::endl;
+ std::cerr << filename << " preprocessed source:" << std::endl;
+ //errorlog << header_done << "#line 1 0\n" << lines_done;
+ std::cerr << header_done << "#line 1 0\n" << lines_done;
+ //errorlog << filename << " shader compilation log (" << log_size << "):" << std::endl;
+ std::cerr << filename << " shader compilation log (" << log_size << "):" << std::endl;
+ char *buf = new char[log_size];
+ glGetShaderInfoLog(shader, log_size, NULL, buf);
+ //errorlog << buf << std::endl;
+ std::cerr << buf << std::endl;
+ //errorlog.flush();
+ delete[] buf;
+ MessageBox(NULL, "Shader compilation failed; details in errorlog.txt", "Critical error", MB_OK);
+ abort();
+ }
+ printGLError();
+ return shader;
+ }
+};
+
+
+class text_info_elementst
+{
+ public:
+ virtual string get_string()
+ {
+ string empty;
+ return empty;
+ }
+ virtual long get_long()
+ {
+ return 0;
+ }
+
+ virtual ~text_info_elementst(){}
+};
+
+class text_info_element_stringst : public text_info_elementst
+{
+ public:
+ virtual string get_string()
+ {
+ return str;
+ }
+ text_info_element_stringst(const string &newstr)
+ {
+ str=newstr;
+ }
+
+ protected:
+ string str;
+};
+
+class text_info_element_longst : public text_info_elementst
+{
+ public:
+ virtual long get_long()
+ {
+ return val;
+ }
+ text_info_element_longst(long nval)
+ {
+ val=nval;
+ }
+
+ protected:
+ long val;
+};
+
+class text_infost
+{
+ public:
+ svector<text_info_elementst *> element;
+
+ void clean()
+ {
+ while(element.size()>0)
+ {
+ delete element[0];
+ element.erase(0);
+ }
+ }
+
+ string get_string(int e)
+ {
+ if(e<0||e>=element.size())
+ {
+ string empty;
+ return empty;
+ }
+ if(element[e]==NULL)
+ {
+ string empty;
+ return empty;
+ }
+ return element[e]->get_string();
+ }
+
+ long get_long(int e)
+ {
+ if(e<0||e>=element.size())
+ {
+ return 0;
+ }
+ if(element[e]==NULL)
+ {
+ return 0;
+ }
+ return element[e]->get_long();
+ }
+
+ ~text_infost()
+ {
+ clean();
+ }
+};
+
+class text_system_file_infost
+{
+ public:
+ long index;
+ string filename;
+
+ static text_system_file_infost *add_file_info(const string &newf,long newi,char newft)
+ {
+ return new text_system_file_infost(newf,newi,newft);
+ }
+
+ void initialize_info();
+ void get_text(text_infost &text);
+ void get_specific_text(text_infost &text,long num);
+
+ protected:
+ char file_token;
+ long number;
+
+ text_system_file_infost(const string &newf,long newi,char newft)
+ {
+ filename=newf;
+ file_token=newft;
+ index=newi;
+ number=0;
+ }
+};
+
+class text_systemst
+{
+ public:
+ void register_file_fixed(const string &file_name,int32_t index,char token,char initialize)
+ {
+ text_system_file_infost *tsfi=text_system_file_infost::add_file_info(file_name,index,token);
+ if(initialize)tsfi->initialize_info();
+ file_info.push_back(tsfi);
+ }
+ void register_file(const string &file_name,int32_t &index,char token,char initialize)
+ {
+ int32_t t;
+ for(t=(int32_t)file_info.size()-1;t>=0;t--)
+ {
+ if(file_info[t]->filename==file_name)
+ {
+ //RESET CALLING INDEX AND BAIL IF THIS FILE IS ALREADY IN THE SYSTEM
+ index=file_info[t]->index;
+ return;
+ }
+ }
+
+ text_system_file_infost *tsfi=text_system_file_infost::add_file_info(file_name,index,token);
+ if(initialize)tsfi->initialize_info();
+ file_info.push_back(tsfi);
+ }
+ void initialize_system()
+ {
+ int32_t t;
+ for(t=(int32_t)file_info.size()-1;t>=0;t--)file_info[t]->initialize_info();
+ }
+ void get_text(int32_t index,text_infost &text)
+ {
+ int32_t t;
+ for(t=(int32_t)file_info.size()-1;t>=0;t--)
+ {
+ if(file_info[t]->index==index)
+ {
+ file_info[t]->get_text(text);
+ return;
+ }
+ }
+ }
+ void get_text(const string &file_name,text_infost &text)
+ {
+ int32_t t;
+ for(t=(int32_t)file_info.size()-1;t>=0;t--)
+ {
+ if(file_info[t]->filename==file_name)
+ {
+ file_info[t]->get_text(text);
+ return;
+ }
+ }
+ }
+ void get_specific_text(int32_t index,text_infost &text,int32_t num)
+ {
+ int32_t t;
+ for(t=(int32_t)file_info.size()-1;t>=0;t--)
+ {
+ if(file_info[t]->index==index)
+ {
+ file_info[t]->get_specific_text(text,num);
+ return;
+ }
+ }
+ }
+
+ ~text_systemst()
+ {
+ while(file_info.size()>0)
+ {
+ delete file_info[0];
+ file_info.erase(0);
+ }
+ }
+
+ protected:
+ svector<text_system_file_infost *> file_info;
+};
+
+class curses_text_boxst
+{
+ public:
+ stringvectst text;
+
+ void add_paragraph(stringvectst &src,int32_t para_width);
+ void add_paragraph(const string &src,int32_t para_width);
+
+ void read_file(file_compressorst &filecomp,int32_t loadversion)
+ {
+ text.read_file(filecomp,loadversion);
+ }
+ void write_file(file_compressorst &filecomp)
+ {
+ text.write_file(filecomp);
+ }
+ void clean()
+ {
+ text.clean();
+ }
+};
+
+#define COPYTEXTUREFLAG_HORFLIP BIT1
+#define COPYTEXTUREFLAG_VERFLIP BIT2
+
+#define ENABLERFLAG_RENDER BIT1
+#define ENABLERFLAG_MAXFPS BIT2
+
+// GL texture positions
+struct gl_texpos {
+ GLfloat left, right, top, bottom;
+};
+
+// Covers every allowed permutation of text
+struct ttf_id {
+ std::string text;
+ unsigned char fg, bg, bold;
+
+ bool operator< (const ttf_id &other) const {
+ if (fg != other.fg) return fg < other.fg;
+ if (bg != other.bg) return bg < other.bg;
+ if (bold != other.bold) return bold < other.bold;
+ return text < other.text;
+ }
+
+ bool operator== (const ttf_id &other) const {
+ return fg == other.fg && bg == other.bg && bold == other.bold && text == other.text;
+ }
+};
+
+namespace std {
+ template<> struct hash<ttf_id> {
+ size_t operator()(ttf_id val) const {
+ // Not the ideal hash function, but it'll do. And it's better than GCC's. id? Seriously?
+ return hash<string>()(val.text) + val.fg + (val.bg << 4) + (val.bold << 8);
+ }
+ };
+};
+
+// Being a texture catalog interface, with opengl, sdl and truetype capability
+class textures
+{
+ friend class enablerst;
+ friend class renderer_opengl;
+ private:
+ vector<SDL_Surface *> raws;
+ bool uploaded;
+ long add_texture(SDL_Surface*);
+ protected:
+ GLuint gl_catalog; // texture catalog gennum
+ struct gl_texpos *gl_texpos; // Texture positions in the GL catalog, if any
+ public:
+ // Initialize state variables
+ textures() {
+ uploaded = false;
+ gl_texpos = NULL;
+ }
+ ~textures() {
+ for (auto it = raws.cbegin(); it != raws.cend(); ++it)
+ SDL_FreeSurface(*it);
+}
+ int textureCount() {
+ return raws.size();
+ }
+ // Upload in-memory textures to the GPU
+ // When textures are uploaded, any alteration to a texture
+ // is automatically reflected in the uploaded copy - eg. it's replaced.
+ // This is very expensive in opengl mode. Don't do it often.
+ void upload_textures();
+ // Also, you really should try to remove uploaded textures before
+ // deleting a window, in case of driver memory leaks.
+ void remove_uploaded_textures();
+ // Returns the most recent texture data
+ SDL_Surface *get_texture_data(long pos);
+ // Clone a texture
+ long clone_texture(long src);
+ // Remove all color, but not transparency
+ void grayscale_texture(long pos);
+ // Loads dimx*dimy textures from a file, assuming all tiles
+ // are equally large and arranged in a grid
+ // Texture positions are saved in row-major order to tex_pos
+ // If convert_magenta is true and the file does not have built-in transparency,
+ // any magenta (255,0,255 RGB) is converted to full transparency
+ // The calculated size of individual tiles is saved to disp_x, disp_y
+ void load_multi_pdim(const string &filename,long *tex_pos,long dimx,long dimy,
+ bool convert_magenta,
+ long *disp_x, long *disp_y);
+ // Loads a single texture from a file, returning the handle
+ long load(const string &filename, bool convert_magenta);
+ // To delete a texture..
+ void delete_texture(long pos);
+};
+
+struct tile {
+ int x, y;
+ long tex;
+};
+
+typedef struct { // Window Creation Info
+ char* title; // Window Title
+ int width; // Width
+ int height; // Height
+ int bitsPerPixel; // Bits Per Pixel
+ BOOL isFullScreen; // FullScreen?
+} GL_WindowInit; // GL_WindowInit
+
+typedef struct { // Contains Information Vital To A Window
+ GL_WindowInit init; // Window Init
+ BOOL isVisible; // Window Visible?
+} GL_Window; // GL_Window
+
+enum zoom_commands { zoom_in, zoom_out, zoom_reset, zoom_fullscreen, zoom_resetgrid };
+
+
+struct texture_fullid {
+ int texpos;
+ float r, g, b;
+ float br, bg, bb;
+
+ bool operator< (const struct texture_fullid &other) const {
+ if (texpos != other.texpos) return texpos < other.texpos;
+ if (r != other.r) return r < other.r;
+ if (g != other.g) return g < other.g;
+ if (b != other.b) return b < other.b;
+ if (br != other.br) return br < other.br;
+ if (bg != other.bg) return bg < other.bg;
+ return bb < other.bb;
+ }
+};
+
+typedef int texture_ttfid; // Just the texpos
+
+class renderer {
+ void cleanup_arrays();
+ protected:
+ unsigned char *screen;
+ long *screentexpos;
+ char *screentexpos_addcolor;
+ unsigned char *screentexpos_grayscale;
+ unsigned char *screentexpos_cf;
+ unsigned char *screentexpos_cbr;
+ // For partial printing:
+ unsigned char *screen_old;
+ long *screentexpos_old;
+ char *screentexpos_addcolor_old;
+ unsigned char *screentexpos_grayscale_old;
+ unsigned char *screentexpos_cf_old;
+ unsigned char *screentexpos_cbr_old;
+
+ void gps_allocate(int x, int y);
+ Either<texture_fullid,texture_ttfid> screen_to_texid(int x, int y);
+ public:
+ void display();
+ virtual void update_tile(int x, int y) = 0;
+ virtual void update_all() = 0;
+ virtual void render() = 0;
+ virtual void set_fullscreen() {} // Should read from enabler.is_fullscreen()
+ virtual void zoom(zoom_commands cmd) {};
+ virtual void resize(int w, int h) = 0;
+ virtual void grid_resize(int w, int h) = 0;
+ void swap_arrays();
+ renderer() {
+ screen = NULL;
+ screentexpos = NULL;
+ screentexpos_addcolor = NULL;
+ screentexpos_grayscale = NULL;
+ screentexpos_cf = NULL;
+ screentexpos_cbr = NULL;
+ screen_old = NULL;
+ screentexpos_old = NULL;
+ screentexpos_addcolor_old = NULL;
+ screentexpos_grayscale_old = NULL;
+ screentexpos_cf_old = NULL;
+ screentexpos_cbr_old = NULL;
+ }
+ virtual ~renderer() {
+ cleanup_arrays();
+ }
+ virtual bool get_mouse_coords(int &x, int &y) = 0;
+ virtual bool uses_opengl() { return false; };
+};
+
+class enablerst : public enabler_inputst
+{
+ friend class initst;
+ friend class renderer_2d_base;
+ friend class renderer_2d;
+ friend class renderer_opengl;
+ friend class renderer_curses;
+
+ bool fullscreen;
+ stack<pair<int,int> > overridden_grid_sizes;
+
+ class renderer *renderer;
+ void eventLoop_SDL();
+#ifdef CURSES
+ void eventLoop_ncurses();
+#endif
+
+ // Framerate calculations
+ int calculated_fps, calculated_gfps;
+ queue<int> frame_timings, gframe_timings; // Milisecond lengths of the last few frames
+ int frame_sum, gframe_sum;
+ int frame_last, gframe_last; // SDL_GetTick returns
+ void do_update_fps(queue<int> &q, int &sum, int &last, int &calc);
+
+ public:
+ void clear_fps();
+ private:
+ void update_fps();
+ void update_gfps();
+
+ // Frame timing calculations
+ float fps, gfps;
+ float fps_per_gfps;
+ Uint32 last_tick;
+ float outstanding_frames, outstanding_gframes;
+
+ // Async rendering
+ struct async_cmd {
+ enum cmd_t { pause, start, render, inc, set_fps } cmd;
+ int val; // If async_inc, number of extra frames to run. If set_fps, current value of fps.
+ async_cmd() {}
+ async_cmd(cmd_t c) { cmd = c; }
+ };
+
+ struct async_msg {
+ enum msg_t { quit, complete, set_fps, set_gfps, push_resize, pop_resize, reset_textures } msg;
+ union {
+ int fps; // set_fps, set_gfps
+ struct { // push_resize
+ int x, y;
+ };
+ };
+ async_msg() {}
+ async_msg(msg_t m) { msg = m; }
+ };
+
+ unsigned int async_frames; // Number of frames the async thread has been asked to run
+ bool async_paused;
+ Chan<async_cmd> async_tobox; // Messages to the simulation thread
+ Chan<async_msg> async_frombox; // Messages from the simulation thread, and acknowledgements of those to
+ Chan<zoom_commands> async_zoom; // Zoom commands (from the simulation thread)
+ Chan<void> async_fromcomplete; // Barrier for async_msg requests that require acknowledgement
+ public:
+ Uint32 renderer_threadid;
+ private:
+
+ void pause_async_loop();
+ void async_wait();
+ void unpause_async_loop() {
+ struct async_cmd cmd;
+ cmd.cmd = async_cmd::start;
+ async_tobox.write(cmd);
+ }
+
+ public:
+
+ string command_line;
+
+ float ccolor[16][3]; // The curses-RGB mapping used for non-curses display modes
+
+ enablerst();
+ unsigned long flag; // ENABLERFLAG_RENDER, ENABLERFLAG_MAXFPS
+
+ int loop(string cmdline);
+ void async_loop();
+ void do_frame();
+
+ // Framerate interface
+ void set_fps(int fps);
+ void set_gfps(int gfps);
+ int get_fps() { return (int)fps; }
+ int get_gfps() { return (int)gfps; }
+ int calculate_fps(); // Calculate the actual provided (G)FPS
+ int calculate_gfps();
+
+ // Mouse interface, such as it is
+ char mouse_lbut,mouse_rbut,mouse_lbut_down,mouse_rbut_down,mouse_lbut_lift,mouse_rbut_lift;
+ char tracking_on; // Whether we're tracking the mouse or not
+
+ // OpenGL state (wrappers)
+ class textures textures; // Font/graphics texture catalog
+ GLsync sync; // Rendering barrier
+ void reset_textures() {
+ async_frombox.write(async_msg(async_msg::reset_textures));
+ }
+ bool uses_opengl() {
+ if (!renderer) return false;
+ return renderer->uses_opengl();
+ }
+
+ // Grid-size interface
+ void override_grid_size(int w, int h); // Pick a /particular/ grid-size
+ void release_grid_size(); // Undoes override_grid_size
+ void zoom_display(zoom_commands command);
+
+
+ // Window management
+ bool is_fullscreen() { return fullscreen; }
+ void toggle_fullscreen() {
+ fullscreen = !fullscreen;
+ async_zoom.write(zoom_fullscreen);
+ }
+
+ // Conversations
+ text_systemst text_system;
+
+ // TOADY: MOVE THESE TO "FRAMERATE INTERFACE"
+ MVar<int> simticks, gputicks;
+ Uint32 clock; // An *approximation* of the current time for use in garbage collection thingies, updated every frame or so.
+};
+#endif
+
+// Function prototypes for deep-DF calls
+char beginroutine();
+char mainloop();
+void endroutine();
+
+extern enablerst enabler;
+
+#endif //ENABLER_H
diff --git a/g_src/enabler_input.cpp b/g_src/enabler_input.cpp
new file mode 100755
index 0000000..e16486d
--- /dev/null
+++ b/g_src/enabler_input.cpp
@@ -0,0 +1,1095 @@
+#include <SDL/SDL.h>
+#include <map>
+#include <vector>
+#include <iostream>
+#include <sstream>
+#include <algorithm>
+#include <stdlib.h>
+#include <math.h>
+using namespace std;
+
+#include "enabler_input.h"
+#include "init.h"
+extern initst init;
+#include "platform.h"
+#include "files.h"
+#include "find_files.h"
+#include "svector.h"
+#include "curses.h"
+
+// The timeline events we actually pass back from get_input. Well, no,
+// that's just k, but..
+struct Event {
+ Repeat r;
+ InterfaceKey k;
+ int repeats; // Starts at 0, increments once per repeat
+ int serial;
+ int time;
+ int tick; // The sim-tick at which we last returned this event
+ bool macro; // Created as part of macro playback.
+
+ bool operator== (const Event &other) const {
+ if (r != other.r) return false;
+ if (k != other.k) return false;
+ if (repeats != other.repeats) return false;
+ if (serial != other.serial) return false;
+ if (time != other.time) return false;
+ if (macro != other.macro) return false;
+ return true;
+ }
+
+ // We sort by time first, and then serial number.
+ // The order of the other bits is unimportant.
+ bool operator< (const Event &o) const {
+ if (time != o.time) return time < o.time;
+ if (serial != o.serial) return serial < o.serial;
+ if (r != o.r) return r < o.r;
+ if (k != o.k) return k < o.k;
+ if (repeats != o.repeats) return repeats < o.repeats;
+ if (macro != o.macro) return macro < o.macro;
+ return false;
+ }
+};
+
+// Used to decide which key-binding to display. As a heuristic, we
+// prefer whichever display string is shortest.
+struct less_sz {
+ bool operator() (const string &a, const string &b) const {
+ if (a.size() < b.size()) return true;
+ if (a.size() > b.size()) return false;
+ return a < b;
+ }
+};
+
+// These change dynamically in the normal process of DF
+static int last_serial = 0; // Input serial number, to differentiate distinct physical presses
+static set<Event> timeline; // A timeline of pending key events (for next get_input)
+static set<EventMatch> pressed_keys; // Keys we consider "pressed"
+static int modState; // Modifier state
+
+// These do not change as part of the normal dynamics of DF, only at startup/when editing.
+static multimap<EventMatch,InterfaceKey> keymap;
+static map<InterfaceKey,Repeat> repeatmap;
+static map<InterfaceKey,set<string,less_sz> > keydisplay; // Used only for display, not for meaning
+
+// Macro recording
+static bool macro_recording = false;
+static macro active_macro; // Active macro
+static map<string,macro> macros;
+static Time macro_end = 0; // Time at which the currently playing macro will end
+
+// Prefix command state
+static bool in_prefix_command = false;
+static string prefix_command;
+
+// Keybinding editing
+static bool key_registering = false;
+static list<EventMatch> stored_keys;
+
+// Interface-file last loaded
+static string interfacefile;
+
+
+// Returns an unused serial number
+static Time next_serial() {
+ return ++last_serial;
+}
+
+static void update_keydisplay(InterfaceKey binding, string display) {
+ // Need to filter out space/tab, for obvious reasons.
+ if (display == " ") display = "Space";
+ if (display == "\t") display = "Tab";
+ map<InterfaceKey,set<string,less_sz> >::iterator it = keydisplay.find(binding);
+ if (it == keydisplay.end()) {
+ set<string,less_sz> s; s.insert(display);
+ keydisplay[binding] = s;
+ } else {
+ keydisplay[binding].insert(display);
+ }
+}
+
+static void assertgood(ifstream &s) {
+ if (s.eof())
+ MessageBox(NULL, "EOF while parsing keyboard bindings", 0, 0);
+ else if (!s.good())
+ MessageBox(NULL, "I/O error while parsing keyboard bindings", 0, 0);
+ else
+ return;
+ abort();
+}
+
+// Decodes an UTF-8 encoded string into a /single/ UTF-8 character,
+// discarding any overflow. Returns 0 on parse error.
+int decode_utf8(const string &s) {
+ int unicode = 0, length, i;
+ if (s.length() == 0) return 0;
+ length = decode_utf8_predict_length(s[0]);
+ switch (length) {
+ case 1: unicode = s[0]; break;
+ case 2: unicode = s[0] & 0x1f; break;
+ case 3: unicode = s[0] & 0x0f; break;
+ case 4: unicode = s[0] & 0x07; break;
+ default: return 0;
+ }
+
+ // Concatenate the follow-up bytes
+ if (s.length() < length) return 0;
+ for (i = 1; i < length; i++) {
+ if ((s[i] & 0xc0) != 0x80) return 0;
+ unicode = (unicode << 6) | (s[i] & 0x3f);
+ }
+ return unicode;
+}
+
+// Returns the length of an utf-8 sequence, based on its first byte
+int decode_utf8_predict_length(char byte) {
+ if ((byte & 0x80) == 0) return 1;
+ if ((byte & 0xe0) == 0xc0) return 2;
+ if ((byte & 0xf0) == 0xe0) return 3;
+ if ((byte & 0xf8) == 0xf0) return 4;
+ return 0; // Invalid start byte
+}
+
+// Encode an arbitrary unicode value as a string. Returns an empty
+// string if the value is out of range.
+string encode_utf8(int unicode) {
+ string s;
+ int i;
+ if (unicode < 0 || unicode > 0x10ffff) return ""; // Out of range for utf-8
+ else if (unicode <= 0x007f) { // 1-byte utf-8
+ s.resize(1, 0);
+ }
+ else if (unicode <= 0x07ff) { // 2-byte utf-8
+ s.resize(2, 0);
+ s[0] = 0xc0;
+ }
+ else if (unicode <= 0xffff) { // 3-byte utf-8
+ s.resize(3, 0);
+ s[0] = 0xe0;
+ }
+ else { // 4-byte utf-8
+ s.resize(4, 0);
+ s[0] = 0xf0;
+ }
+
+ // Build up the string, right to left
+ for (i = s.length()-1; i > 0; i--) {
+ s[i] = 0x80 | (unicode & 0x3f);
+ unicode >>= 6;
+ }
+ // Finally, what's left goes in the low bits of s[0]
+ s[0] |= unicode;
+ return s;
+}
+
+string translate_mod(Uint8 mod) {
+ string ret;
+ if (mod & 1) ret += "Shift+";
+ if (mod & 2) ret += "Ctrl+";
+ if (mod & 4) ret += "Alt+";
+ return ret;
+}
+
+static string display(const EventMatch &match) {
+ ostringstream ret;
+ ret << translate_mod(match.mod);
+ switch (match.type) {
+ case type_unicode: ret << (char)match.unicode; break;
+ case type_key: {
+ map<SDLKey,string>::iterator it = sdlNames.left.find(match.key);
+ if (it != sdlNames.left.end())
+ ret << it->second;
+ else
+ ret << "SDL+" << (int)match.key;
+ break;
+ }
+ case type_button:
+ ret << "Button " << (int)match.button;
+ break;
+ }
+ return ret.str();
+}
+
+static string translate_repeat(Repeat r) {
+ switch (r) {
+ case REPEAT_NOT: return "REPEAT_NOT";
+ case REPEAT_SLOW: return "REPEAT_SLOW";
+ case REPEAT_FAST: return "REPEAT_FAST";
+ default: return "REPEAT_BROKEN";
+ }
+}
+
+// Update the modstate, since SDL_getModState doesn't /work/ for alt
+static void update_modstate(const SDL_Event &e) {
+ if (e.type == SDL_KEYUP) {
+ switch (e.key.keysym.sym) {
+ case SDLK_RSHIFT:
+ case SDLK_LSHIFT:
+ modState &= ~1;
+ break;
+ case SDLK_RCTRL:
+ case SDLK_LCTRL:
+ modState &= ~2;
+ break;
+ case SDLK_RALT:
+ case SDLK_LALT:
+ modState &= ~4;
+ break;
+ }
+ } else if (e.type == SDL_KEYDOWN) {
+ switch (e.key.keysym.sym) {
+ case SDLK_RSHIFT:
+ case SDLK_LSHIFT:
+ modState |= 1;
+ break;
+ case SDLK_RCTRL:
+ case SDLK_LCTRL:
+ modState |= 2;
+ break;
+ case SDLK_RALT:
+ case SDLK_LALT:
+ modState |= 4;
+ break;
+ }
+ }
+}
+
+// Converts SDL mod states to ours, collapsing left/right shift/alt/ctrl
+Uint8 getModState() {
+ return modState;
+}
+
+// Not sure what to call this, but it ain't using regexes.
+static bool parse_line(const string &line, const string &regex, vector<string> &parts) {
+ parts.clear();
+ parts.push_back(line);
+ int bytes;
+ for (int l = 0, r = 0; r < regex.length();) {
+ switch (regex[r]) {
+ case '*': // Read until ], : or the end of the line, but at least one character.
+ {
+ const int start = l;
+ for (; l < line.length() && (l == start || (line[l] != ']' && line[l] != ':')); l++)
+ ;
+ parts.push_back(line.substr(start, l - start));
+ r++;
+ }
+ break;
+ default:
+ if (line[l] != regex[r]) return false;
+ r++; l++;
+ break;
+ }
+ }
+ // We've made it this far, clearly the string parsed
+ return true;
+}
+
+void enabler_inputst::load_keybindings(const string &file) {
+ cout << "Loading bindings from " << file << endl;
+ interfacefile = file;
+ ifstream s(file.c_str());
+ if (!s.good()) {
+ MessageBox(NULL, (file + " not found, or I/O error encountered").c_str(), 0, 0);
+ abort();
+ }
+
+ list<string> lines;
+ while (s.good()) {
+ string line;
+ getline(s, line);
+ lines.push_back(line);
+ }
+
+ static const string bind("[BIND:*:*]");
+ static const string sym("[SYM:*:*]");
+ static const string key("[KEY:*]");
+ static const string button("[BUTTON:*:*]");
+
+ list<string>::iterator line = lines.begin();
+ vector<string> match;
+
+ while (line != lines.end()) {
+ if (parse_line(*line, bind, match)) {
+ map<string,InterfaceKey>::iterator it = bindingNames.right.find(match[1]);
+ if (it != bindingNames.right.end()) {
+ InterfaceKey binding = it->second;
+ // Parse repeat data
+ if (match[2] == "REPEAT_FAST")
+ repeatmap[(InterfaceKey)binding] = REPEAT_FAST;
+ else if (match[2] == "REPEAT_SLOW")
+ repeatmap[(InterfaceKey)binding] = REPEAT_SLOW;
+ else if (match[2] == "REPEAT_NOT")
+ repeatmap[(InterfaceKey)binding] = REPEAT_NOT;
+ else {
+ repeatmap[(InterfaceKey)binding] = REPEAT_NOT;
+ cout << "Broken repeat request: " << match[2] << endl;
+ }
+ ++line;
+ // Add symbols/keys/buttons
+ while (line != lines.end()) {
+ EventMatch matcher;
+ // SDL Keys
+ if (parse_line(*line, sym, match)) {
+ map<string,SDLKey>::iterator it = sdlNames.right.find(match[2]);
+ if (it != sdlNames.right.end()) {
+ matcher.mod = atoi(string(match[1]).c_str());
+ matcher.type = type_key;
+ matcher.key = it->second;
+ keymap.insert(pair<EventMatch,InterfaceKey>(matcher, (InterfaceKey)binding));
+ update_keydisplay(binding, display(matcher));
+ } else {
+ cout << "Unknown SDLKey: " << match[2] << endl;
+ }
+ ++line;
+ } // Unicode
+ else if (parse_line(*line, key, match)) {
+ matcher.type = type_unicode;
+ matcher.unicode = decode_utf8(match[1]);
+ matcher.mod = KMOD_NONE;
+ if (matcher.unicode) {
+ keymap.insert(make_pair(matcher, (InterfaceKey)binding));
+ if (matcher.unicode < 256) {
+ // This unicode key is part of the latin-1 mapped portion of unicode, so we can
+ // actually display it. Nice.
+ char c[2] = {char(matcher.unicode), 0};
+ update_keydisplay(binding, display(matcher));
+ }
+ } else {
+ cout << "Broken unicode: " << *line << endl;
+ }
+ ++line;
+ } // Mouse buttons
+ else if (parse_line(*line, button, match)) {
+ matcher.type = type_button;
+ string str = match[2];
+ matcher.button = atoi(str.c_str());
+ if (matcher.button) {
+ matcher.mod = atoi(string(match[1]).c_str());
+ keymap.insert(pair<EventMatch,InterfaceKey>(matcher, (InterfaceKey)binding));
+ update_keydisplay(binding, display(matcher));
+ } else {
+ cout << "Broken button (should be [BUTTON:#:#]): " << *line << endl;
+ }
+ ++line;
+ } else {
+ break;
+ }
+ }
+ } else {
+ cout << "Unknown binding: " << match[1] << endl;
+ ++line;
+ }
+ } else {
+ // Retry with next line
+ ++line;
+ }
+ }
+}
+
+void enabler_inputst::save_keybindings(const string &file) {
+ cout << "Saving bindings to " << file << endl;
+ string temporary = file + ".partial";
+ ofstream s(temporary.c_str());
+ multimap<InterfaceKey,EventMatch> map;
+ InterfaceKey last_key = INTERFACEKEY_NONE;
+
+ if (!s.good()) {
+ string t = "Failed to open " + temporary + " for writing";
+ MessageBox(NULL, t.c_str(), 0, 0);
+ s.close();
+ return;
+ }
+ // Invert keyboard map
+ for (multimap<EventMatch,InterfaceKey>::iterator it = keymap.begin(); it != keymap.end(); ++it)
+ map.insert(pair<InterfaceKey,EventMatch>(it->second,it->first));
+ // Insert an empty line for the benefit of note/wordpad
+ s << endl;
+ // And write.
+ for (multimap<InterfaceKey,EventMatch>::iterator it = map.begin(); it != map.end(); ++it) {
+ if (!s.good()) {
+ MessageBox(NULL, "I/O error while writing keyboard mapping", 0, 0);
+ s.close();
+ return;
+ }
+ if (it->first != last_key) {
+ last_key = it->first;
+ s << "[BIND:" << bindingNames.left[it->first] << ":"
+ << translate_repeat(repeatmap[it->first]) << "]" << endl;
+ }
+ switch (it->second.type) {
+ case type_unicode:
+ s << "[KEY:" << encode_utf8(it->second.unicode) << "]" << endl;
+ break;
+ case type_key:
+ s << "[SYM:" << (int)it->second.mod << ":" << sdlNames.left[it->second.key] << "]" << endl;
+ break;
+ case type_button:
+ s << "[BUTTON:" << (int)it->second.mod << ":" << (int)it->second.button << "]" << endl;
+ break;
+ }
+ }
+ s.close();
+ replace_file(temporary, file);
+}
+
+void enabler_inputst::save_keybindings() {
+ save_keybindings(interfacefile);
+}
+
+void enabler_inputst::add_input(SDL_Event &e, Uint32 now) {
+ // Before we can use this input, there are some issues to deal with:
+ // - SDL provides unicode translations only for key-press events, not
+ // releases. We need to keep track of pressed keys, and generate
+ // unicode release events whenever any modifiers are hit, or if
+ // that raw keycode is released.
+ // - Generally speaking, when modifiers are hit/released, we discard those
+ // events and generate press/release events for all pressed non-modifiers.
+ // - It's possible for multiple events to be generated on the same tick.
+ // These are of course separate keypresses, and must be kept separate.
+ // That's what the serial is for.
+
+ set<EventMatch>::iterator pkit;
+ list<pair<KeyEvent, int> > synthetics;
+ update_modstate(e);
+
+ // Convert modifier state changes
+ if ((e.type == SDL_KEYUP || e.type == SDL_KEYDOWN) &&
+ (e.key.keysym.sym == SDLK_RSHIFT ||
+ e.key.keysym.sym == SDLK_LSHIFT ||
+ e.key.keysym.sym == SDLK_RCTRL ||
+ e.key.keysym.sym == SDLK_LCTRL ||
+ e.key.keysym.sym == SDLK_RALT ||
+ e.key.keysym.sym == SDLK_LALT )) {
+ for (pkit = pressed_keys.begin(); pkit != pressed_keys.end(); ++pkit) {
+ // Release currently pressed keys
+ KeyEvent synth;
+ synth.release = true;
+ synth.match = *pkit;
+ synthetics.push_back(make_pair(synth, next_serial()));
+ // Re-press them, with new modifiers, if they aren't unicode. We can't re-translate unicode.
+ if (synth.match.type != type_unicode) {
+ synth.release = false;
+ synth.match.mod = getModState();
+ if (!key_registering) // We don't want extras when registering keys
+ synthetics.push_back(make_pair(synth, next_serial()));
+ }
+ }
+ } else {
+ // It's not a modifier. If this is a key release, then we still need
+ // to find and release pressed unicode keys with this scancode
+ if (e.type == SDL_KEYUP) {
+ for (pkit = pressed_keys.begin(); pkit != pressed_keys.end(); ++pkit) {
+ if (pkit->type == type_unicode && pkit->scancode == e.key.keysym.scancode) {
+ KeyEvent synth;
+ synth.release = true;
+ synth.match = *pkit;
+ synthetics.push_back(make_pair(synth, next_serial()));
+ }
+ }
+ }
+ // Since it's not a modifier, we also pass on symbolic/button
+ // (always) and unicode (if defined) events
+ //
+ // However, since SDL ignores(?) ctrl and alt when translating to
+ // unicode, we want to ignore unicode events if those are set.
+ const int serial = next_serial();
+
+ KeyEvent real;
+ real.release = (e.type == SDL_KEYUP || e.type == SDL_MOUSEBUTTONUP) ? true : false;
+ real.match.mod = getModState();
+ if (e.type == SDL_MOUSEBUTTONUP || e.type == SDL_MOUSEBUTTONDOWN) {
+ real.match.type = type_button;
+ real.match.scancode = 0;
+ real.match.button = e.button.button;
+ synthetics.push_back(make_pair(real, serial));
+ }
+ if (e.type == SDL_KEYUP || e.type == SDL_KEYDOWN) {
+ real.match.type = type_key;
+ real.match.scancode = e.key.keysym.scancode;
+ real.match.key = e.key.keysym.sym;
+ synthetics.push_back(make_pair(real, serial));
+ }
+ if (e.type == SDL_KEYDOWN && e.key.keysym.unicode && getModState() < 2) {
+ real.match.mod = KMOD_NONE;
+ real.match.type = type_unicode;
+ real.match.scancode = e.key.keysym.scancode;
+ real.match.unicode = e.key.keysym.unicode;
+ synthetics.push_back(make_pair(real, serial));
+ }
+ if (e.type == SDL_QUIT) {
+ // This one, we insert directly into the timeline.
+ Event e = {REPEAT_NOT, (InterfaceKey)INTERFACEKEY_OPTIONS, 0, next_serial(), now, 0};
+ timeline.insert(e);
+ }
+ }
+
+ list<pair<KeyEvent, int> >::iterator lit;
+ for (lit = synthetics.begin(); lit != synthetics.end(); ++lit) {
+ // Add or remove the key from pressed_keys, keeping that up to date
+ if (lit->first.release) pressed_keys.erase(lit->first.match);
+ else pressed_keys.insert(lit->first.match);
+ // And pass the event on deeper.
+ add_input_refined(lit->first, now, lit->second);
+ }
+}
+
+// Input encoding:
+// 1 and up are ncurses symbols, as returned by getch.
+// -1 and down are unicode values.
+// esc is true if this key was part of an escape sequence.
+#ifdef CURSES
+void enabler_inputst::add_input_ncurses(int key, Time now, bool esc) {
+ // TODO: Deal with shifted arrow keys, etc. See man 5 terminfo and tgetent.
+
+ EventMatch sdl, uni; // Each key may provoke an unicode event, an "SDL-key" event, or both
+ const int serial = next_serial();
+ sdl.type = type_key;
+ uni.type = type_unicode;
+ sdl.scancode = uni.scancode = 0; // We don't use this.. hang on, who does? ..nobody. FIXME!
+ sdl.mod = uni.mod = 0;
+ sdl.key = SDLK_UNKNOWN;
+ uni.unicode = 0;
+
+ if (esc) { // Escape sequence, meaning alt was held. I hope.
+ sdl.mod = uni.mod = DFMOD_ALT;
+ }
+
+ if (key == -10) { // Return
+ sdl.key = SDLK_RETURN;
+ uni.unicode = '\n';
+ } else if (key == -9) { // Tab
+ sdl.key = SDLK_TAB;
+ uni.unicode = '\t';
+ } else if (key == -27) { // If we see esc here, it's the actual esc key. Hopefully.
+ sdl.key = SDLK_ESCAPE;
+ } else if (key == -127) { // Backspace/del
+ sdl.key = SDLK_BACKSPACE;
+ } else if (key < 0 && key >= -26) { // Control-a through z (but not ctrl-j, or ctrl-i)
+ sdl.mod |= DFMOD_CTRL;
+ sdl.key = (SDLKey)(SDLK_a + (-key) - 1);
+ } else if (key <= -32 && key >= -126) { // ASCII character set
+ uni.unicode = -key;
+ sdl.key = (SDLKey)-key; // Most of this maps directly to SDL keys, except..
+ if (sdl.key > 64 && sdl.key < 91) { // Uppercase
+ sdl.key = (SDLKey)(sdl.key + 32); // Maps to lowercase, and
+ sdl.mod |= DFMOD_SHIFT; // Add shift.
+ }
+ } else if (key < -127) { // Unicode, no matching SDL keys
+ uni.unicode = -key;
+ } else if (key > 0) { // Symbols such as arrow-keys, etc, no matching unicode.
+ switch (key) {
+ case KEY_DOWN: sdl.key = SDLK_DOWN; break;
+ case KEY_UP: sdl.key = SDLK_UP; break;
+ case KEY_LEFT: sdl.key = SDLK_LEFT; break;
+ case KEY_RIGHT: sdl.key = SDLK_RIGHT; break;
+ case KEY_BACKSPACE: sdl.key = SDLK_BACKSPACE; break;
+ case KEY_F(1): sdl.key = SDLK_F1; break;
+ case KEY_F(2): sdl.key = SDLK_F2; break;
+ case KEY_F(3): sdl.key = SDLK_F3; break;
+ case KEY_F(4): sdl.key = SDLK_F4; break;
+ case KEY_F(5): sdl.key = SDLK_F5; break;
+ case KEY_F(6): sdl.key = SDLK_F6; break;
+ case KEY_F(7): sdl.key = SDLK_F7; break;
+ case KEY_F(8): sdl.key = SDLK_F8; break;
+ case KEY_F(9): sdl.key = SDLK_F9; break;
+ case KEY_F(10): sdl.key = SDLK_F10; break;
+ case KEY_F(11): sdl.key = SDLK_F11; break;
+ case KEY_F(12): sdl.key = SDLK_F12; break;
+ case KEY_F(13): sdl.key = SDLK_F13; break;
+ case KEY_F(14): sdl.key = SDLK_F14; break;
+ case KEY_F(15): sdl.key = SDLK_F15; break;
+ case KEY_DC: sdl.key = SDLK_DELETE; break;
+ case KEY_NPAGE: sdl.key = SDLK_PAGEDOWN; break;
+ case KEY_PPAGE: sdl.key = SDLK_PAGEUP; break;
+ case KEY_ENTER: sdl.key = SDLK_RETURN; break;
+ }
+ }
+
+ // We may be registering a new mapping, in which case we skip the
+ // rest of this function.
+ if (key_registering) {
+ if (uni.unicode) {
+ stored_keys.push_back(uni);
+ }
+ if (sdl.key) {
+ stored_keys.push_back(sdl);
+ }
+ Event e; e.r = REPEAT_NOT; e.repeats = 0; e.time = now; e.serial = serial; e.k = INTERFACEKEY_KEYBINDING_COMPLETE; e.tick = enabler.simticks.read();
+ timeline.insert(e);
+ key_registering = false;
+ return;
+ }
+
+ // Key repeat is handled by the terminal, and we don't get release
+ // events anyway.
+ KeyEvent kev; kev.release = false;
+ Event e; e.r = REPEAT_NOT; e.repeats = 0; e.time = now;
+ if (sdl.key) {
+ set<InterfaceKey> events = key_translation(sdl);
+ for (set<InterfaceKey>::iterator k = events.begin(); k != events.end(); ++k) {
+ e.serial = serial;
+ e.k = *k;
+ timeline.insert(e);
+ }
+ }
+ if (uni.unicode) {
+ set<InterfaceKey> events = key_translation(uni);
+ for (set<InterfaceKey>::iterator k = events.begin(); k != events.end(); ++k) {
+ e.serial = serial;
+ e.k = *k;
+ timeline.insert(e);
+ }
+ }
+}
+#endif
+
+void enabler_inputst::add_input_refined(KeyEvent &e, Uint32 now, int serial) {
+ // We may be registering a new mapping, in which case we skip the
+ // rest of this function.
+ if (key_registering && !e.release) {
+ stored_keys.push_back(e.match);
+ Event e; e.r = REPEAT_NOT; e.repeats = 0; e.time = now; e.serial = serial; e.k = INTERFACEKEY_KEYBINDING_COMPLETE; e.tick = enabler.simticks.read();
+ timeline.insert(e);
+ return;
+ }
+
+ // If this is a key-press event, we add it to the timeline. If it's
+ // a release, we remove any pending repeats, but not those that
+ // haven't repeated yet (which are on their first cycle); those we
+ // just set to non-repeating.
+ set<InterfaceKey> keys = key_translation(e.match);
+ if (e.release) {
+ set<Event>::iterator it = timeline.begin();
+ while (it != timeline.end()) {
+ set<Event>::iterator el = it++;
+ if (keys.count(el->k)) {
+ if (el->repeats) {
+ timeline.erase(el);
+ } else {
+ Event new_el = *el;
+ new_el.r = REPEAT_NOT;
+ timeline.erase(el);
+ timeline.insert(new_el);
+ }
+ }
+ }
+ } else {
+ set<InterfaceKey>::iterator key;
+ // As policy, when the user hits a non-repeating key we'd want to
+ // also cancel any keys that are currently repeating. This allows
+ // for easy recovery from stuck keys.
+ //
+ // Unfortunately, each key may be bound to multiple
+ // commands. So, lacking information on which commands are
+ // accepted at the moment, there is no way we can know if it's
+ // okay to cancel repeats unless /all/ the bindings are
+ // non-repeating.
+ for (set<InterfaceKey>::iterator k = keys.begin(); k != keys.end(); ++k) {
+ Event e = {key_repeat(*k), *k, 0, serial, now, enabler.simticks.read()};
+ timeline.insert(e);
+ }
+ // if (cancel_ok) {
+ // // Set everything on the timeline to non-repeating
+ // multimap<Time,Event>::iterator it;
+ // for (it = timeline.begin(); it != timeline.end(); ++it) {
+ // it->second.r = REPEAT_NOT;
+ // }
+ }
+}
+
+
+void enabler_inputst::clear_input() {
+ timeline.clear();
+ pressed_keys.clear();
+ modState = 0;
+ last_serial = 0;
+}
+
+set<InterfaceKey> enabler_inputst::get_input(Time now) {
+ // We walk the timeline, returning all events corresponding to a
+ // single physical keypress, and inserting repeats relative to the
+ // current time, not when the events we're now returning were
+ // *supposed* to happen.
+
+ set<InterfaceKey> input;
+ set<Event>::iterator ev = timeline.begin();
+ if (ev == timeline.end() || ev->time > now) {
+ return input; // No input (yet).
+ }
+
+ const Time first_time = ev->time;
+ const int first_serial = ev->serial;
+ int simtick = enabler.simticks.read();
+ bool event_from_macro = false;
+ while (ev != timeline.end() && ev->time == first_time && ev->serial == first_serial) {
+ // Avoid recording macro-sources events as macro events.
+ if (ev->macro) event_from_macro = true;
+ // To make sure the user had a chance to cancel (by lifting the key), we require there
+ // to be at least three simulation ticks before the first repeat.
+ if (ev->repeats == 1 && ev->tick > simtick - 3) {
+ } else {
+ input.insert(ev->k);
+ }
+ // Schedule a repeat
+ Event next = *ev;
+ next.repeats++;
+ switch (next.r) {
+ case REPEAT_NOT:
+ break;
+ case REPEAT_SLOW:
+ if (ev->repeats == 0) {
+ next.time = now + init.input.hold_time;
+ timeline.insert(next);
+ break;
+ }
+ case REPEAT_FAST:
+ double accel = 1;
+ if (ev->repeats >= init.input.repeat_accel_start) {
+ // Compute acceleration
+ accel = MIN(init.input.repeat_accel_limit,
+ sqrt(double(next.repeats - init.input.repeat_accel_start) + 16) - 3);
+ }
+ next.time = now + double(init.input.repeat_time) / accel;
+ timeline.insert(next);
+ break;
+ }
+ // Delete the event from the timeline and iterate
+ timeline.erase(ev++);
+ }
+#ifdef DEBUG
+ if (input.size() && !init.display.flag.has_flag(INIT_DISPLAY_FLAG_TEXT)) {
+ cout << "Returning input:\n";
+ set<InterfaceKey>::iterator it;
+ for (it = input.begin(); it != input.end(); ++it)
+ cout << " " << GetKeyDisplay(*it) << ": " << GetBindingDisplay(*it) << endl;
+ }
+#endif
+ // It could be argued that the "record event" step of recording
+ // belongs in add_input, not here. I don't hold with this
+ // argument. The whole point is to record events as the user seems
+ // them happen.
+ if (macro_recording && !event_from_macro) {
+ set<InterfaceKey> macro_input = input;
+ macro_input.erase(INTERFACEKEY_RECORD_MACRO);
+ macro_input.erase(INTERFACEKEY_PLAY_MACRO);
+ macro_input.erase(INTERFACEKEY_SAVE_MACRO);
+ macro_input.erase(INTERFACEKEY_LOAD_MACRO);
+ if (macro_input.size())
+ active_macro.push_back(macro_input);
+ }
+ return input;
+}
+
+set<InterfaceKey> enabler_inputst::key_translation(EventMatch &match) {
+ set<InterfaceKey> bindings;
+ pair<multimap<EventMatch,InterfaceKey>::iterator,multimap<EventMatch,InterfaceKey>::iterator> its;
+
+ for (its = keymap.equal_range(match); its.first != its.second; ++its.first)
+ bindings.insert((its.first)->second);
+
+ return bindings;
+}
+
+string enabler_inputst::GetKeyDisplay(int binding) {
+ map<InterfaceKey,set<string,less_sz> >::iterator it = keydisplay.find(binding);
+ if (it != keydisplay.end() && it->second.size())
+ return *it->second.begin();
+ else {
+ cout << "Missing binding displayed: " + bindingNames.left[binding] << endl;
+ return "?";
+ }
+}
+
+string enabler_inputst::GetBindingDisplay(int binding) {
+ map<InterfaceKey,string>::iterator it = bindingNames.left.find(binding);
+ if (it != bindingNames.left.end())
+ return it->second;
+ else
+ return "NO BINDING";
+}
+
+string enabler_inputst::GetBindingTextDisplay(int binding) {
+ map<InterfaceKey,string>::iterator it = displayNames.left.find(binding);
+ if (it !=displayNames.left.end())
+ return it->second;
+ else
+ return "NO BINDING";
+}
+
+Repeat enabler_inputst::key_repeat(InterfaceKey binding) {
+ map<InterfaceKey,Repeat>::iterator it = repeatmap.find(binding);
+ if (it != repeatmap.end())
+ return it->second;
+ else
+ return REPEAT_NOT;
+}
+
+void enabler_inputst::key_repeat(InterfaceKey binding, Repeat repeat) {
+ repeatmap[binding] = repeat;
+}
+
+void enabler_inputst::record_input() {
+ active_macro.clear();
+ macro_recording = true;
+}
<