diff --git a/.gitignore b/.gitignore index 38af831..8fb8120 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,5 @@ /server/dfhack /server/build /server/deps +/package/ +*.zip diff --git a/COMPILING.md b/COMPILING.md index 4f9f1bc..2466d11 100644 --- a/COMPILING.md +++ b/COMPILING.md @@ -1,90 +1,52 @@ ## HOW TO COMPILE ## -Unfortunately, Webfort does not have a solid build process in place (issue #3). -Until it does, use this page to document any holistic steps taken for -later. +Webfort currently compiles as a submodule of DFHack, much like +stonesense. -### Ubuntu 14.04 LTS, 64-bit ### -a quick recording of what it took to compile and run webfort on my -Ubuntu 14.04 machine, 64bit. Fair warning: this will take a significant -chunk of time. +It requires only minimal changes to the default DFHack release, which +can be found at . -webfort depends on some unpackaged dependencies: +To get a working copy: -* Dwarf Fortress 0.34.11 (download a fresh copy, just for webfort) + git clone https://github.com/Alloyed/dfhack + git checkout webfort + git submodule update --init --recursive -* dfhack 0.34.11-r5 +Then you can follow the usual +[DFHack compiling process](https://github.com/Alloyed/dfhack/blob/webfort/Compile.rst). -* SDL 1.2 (just the headers) +Below are extra notes which you should probably read. -* nopoll 0.2.6.b130 +### Windows 7 VS2010 ### -All of these need to be 32-bit, because Dwarf Fortress is 32-bit. We'll -install all of them in a 32-bit lxc container, because Ubuntu's -multiarch support isn't so great. +On Windows, all Webfort dependencies are automatically installed by +downloading and extracting this archive: -First step, make the container. +https://s3.amazonaws.com/webfort/webfort-deps-r1.tar.gz - # lxc-create -t ubuntu -n dfhack -- --bindhome -a i386 - -boot into it, using the credentials of your current user - - # lxc-start -n dfhack - - -then install all this - - # apt-get install curl git build-essential cmake libsdl1.2-dev \ - libsdl-image1.2 libsdl-ttf2.0-0 libgtk2.0-0 libjpeg62 libglu1-mesa \ - libopenal1 libxml-libxml-perl libxml-libxslt-perl libssl-dev +This includes a number of Boost binaries, as well as SDL headers. -then get Dwarf Fortress. DF needs an extra spriteset and init to be -properly configured, but I didn't do that at the time of writing so add -your own steps. +### Ubuntu 14.04 LTS 64-bit ### - $ curl http://www.bay12games.com/dwarves/df_34_11_linux.tar.bz2 | tar jxf - +In my experience, Multilib support on Debian/Ubuntu is bad enough to +make the linux container option suggested by upstream DFHack to be the +only sane option. -then build dfhack +Get a container by executing: - $ git clone http://github.com/DFHack/dfhack.git - $ cd dfhack - $ git checkout 0.34.11-r5 - $ git submodule update --init --recursive - $ mkdir build && cd build - $ cmake .. -DCMAKE_BUILD_TYPE:string=Release -DCMAKE_INSTALL_PREFIX=$PWD/../../df_linux - $ make && make install - $ cd ../.. - -then build nopoll - - $ curl https://no-poll.googlecode.com/files/nopoll-0.2.6.b130.tar.gz | - tar zxf - - $ cd nopoll-0.2.6.b130 - $ ./configure - $ make - $ cd .. - -then build webfort. - - $ make - $ make install + # lxc-create -t ubuntu -n dfhack -- --bindhome -a i386 -and then try running dfhack from your new df install. chances are you -come across this: -https://github.com/DFHack/dfhack/blob/master/Compile.rst#fixing-the-libstdc-version-bug -So just follor the fix there +Where `````` is your username, and ubuntu is whichever distro you'd +like. Then boot into it, using the credentials of that user: -#### websocketpp branch #### -you'll also need + # lxc-start -n dfhack -* libboost_system -* libasio -* websocketpp (already a submodule) -* not nopoll +Once there you can install the necessary dependencies for webfort: -TODO. I, personally, used my package manager for boost and asio. + # apt-get install libboost-system-dev libboost-regex-dev libasio-dev libsdl1.2-dev +In addition to everything you need for dfhack: -### Windows 7, VS2010 ### + # apt-get install curl git build-essential cmake libxml-libxml-perl libxml-libxslt-perl -TODO +Then follow the usual instructions. diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md new file mode 100644 index 0000000..545b696 --- /dev/null +++ b/CONTRIBUTORS.md @@ -0,0 +1,11 @@ +Here is a non-exhaustive list of everyone whose work went into creating +webfortress. If you'd like your name to be here, just contact + + +mifki +alloyed +Dragoon209 + +Web fortress also uses tilesets/colorschemes created by the wider DF +community, their names can be found in the static/art and static/colors +folders respectively diff --git a/INSTALLING.txt b/INSTALLING.txt new file mode 100644 index 0000000..6fde823 --- /dev/null +++ b/INSTALLING.txt @@ -0,0 +1,68 @@ +## INSTALLING ## + +### FROM BINARY ### + +If you recieved your copy of Webfort as a Windows binary, this is the procedure +to follow. + +1. Installing the plugin. + +One half of Webfort is the dfhack plugin that gets added directly to your Dwarf +Fortress install. Because Web Fortress requires that many of your settings and +keybindings get changed, it's recommended you install it in a new copy of Dwarf +Fortress. You will need +* Dwarf Fortress 0.34.11 (the last DF2012 release) + http://www.bay12games.com/dwarves/older_versions.html +* DFHack 0.34.11-r5 + http://dffd.wimbli.com/file.php?id=8682 + +Then, just extract this zip file over your DF install. + +After that, you can test that Web Fortress is correctly installed by running +Dwarf Fortress. In the DFHack Console, you should see a line that says: + + [WEBFORT] [2014-11-10 06:11:06] [application] Web Fortress started on port 1234 + +If you see something like that, then Web Fortress has been properly installed. + +2. Running the frontend + +To connect to your fortress, users will need to connect to a webserver serving +the files located in the web/ folder. You can either + +* Use somebody else's hosted version of these files: + + http://alloyed.me/webfort/v2.0/webfort.html?host= + +Just replace with your actual IP. It can be found by typing +"What is my IP Address" into Google. + +* Host them yourself + +Any server that can host static files will do. Mongoose is easy to use. + + http://cesanta.com/mongoose.shtml + +Just move the mongoose.exe into your web/ directory and run it. with Moongoose, +the URL to connect to your webfort will be: + + http://:8080/webfort.html + +3. Port Forwarding + +For external users to connect to your webfort, they will need to access port +1234, and port 8080 if you installed Mongoose. This is typically done via port +forwarding. If you haven't done this before, see + + http://portforward.com/ + +for a list of guides for common routers. + +### From Source ### + +Installing from the github source is less well implemented. Following the +COMPILING.md instructions, you should be able to install using the normal +DfHack install process. Then, afterward, you will need to manually copy +everything over from the server/dist folder into your DF root directory, and +move everything in static/ to /web/. Everything else should be +identical to the binary install. diff --git a/LICENSE b/LICENSE index 5dde79f..7b81a1e 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,5 @@ Copyright (c) 2014, Vitaly Pronkin +Copyright (c) 2014, Kyle Mclamb Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above diff --git a/NEWS b/NEWS new file mode 100644 index 0000000..e0b100d --- /dev/null +++ b/NEWS @@ -0,0 +1,19 @@ +v2.0.0 +====== +* New maintainer +* Changed socket library to websocketpp +* Moved build system to CMake +* Removed queuing system +* Removed idle timer +* Added environment vars for basic configuration +* Changed from host-side resizing to a fixed game size +* Added letterboxing to client-side views +* Added IRC sidepane +* Added user count, time left, and player nicknames to UI +* Added configurable client parameters +* Moved from fixed-delay to capped framerate +* Added version negotation + +v1.10 +===== +* Initial release diff --git a/README.md b/README.md index cf397e1..267b0e2 100644 --- a/README.md +++ b/README.md @@ -20,26 +20,20 @@ If you would like to recieve (likely buggy) prerelease builds, email ### Compiling ### -Web Fortress in known to compile with clang on linux, and VS2010 on -Windows. See for more. +Web Fortress in known to compile with 32bit clang/gcc on linux, and VS2010 on +Windows. See [COMPILING.md](COMPILING.md) for more. ### Installation ### -1. Install webfort plugin as usual. -2. Copy `ShizzleClean.png` or any other text font to `data/art` folder. -3. Copy all `.dll` files to your DF folder. -4. Ensure that `PRINT_MODE` is set to `STANDARD` in your `init.txt`, and set `FONT` to `ShizzleClean.png`. -5. Open `static/js/webchat.js` and edit the `iframeURL` variable to - point to your preferred embeddable chat client. One possible choice -is [qwebirc](http://qwebirc.org). -6. Use any web server to serve files from `static` folder. You can use [Mongoose](http://cesanta.com/mongoose.shtml), just copy it to `static` folder and run. -7. Navigate to `http:///webfort.html` and enjoy. +Installation is documented in [INSTALLING.txt](INSTALLING.txt), which +should come with your release of Web Fortress. ### Authors and Links ### [Original Source](https://github.com/mifki/df-webfort) -- [Discussion](http://www.bay12forums.com/smf/index.php?topic=139167.0) -- [Report an Issue](https://github.com/Ankoku/df-webfort/issues) Copyright (c) 2014, Vitaly Pronkin +Copyright (c) 2014, Kyle McLamb Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above diff --git a/server/dist/ShizzleClean.png b/dist/data/art/ShizzleClean.png similarity index 100% rename from server/dist/ShizzleClean.png rename to dist/data/art/ShizzleClean.png diff --git a/dist/data/init/init.txt b/dist/data/init/init.txt new file mode 100644 index 0000000..d5405cf --- /dev/null +++ b/dist/data/init/init.txt @@ -0,0 +1,155 @@ +This init.txt was copied over From the Web Fortress project. +anything labelled are webfort-specific setting changes, and should +have a comment explaining their rationale. + +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:NO] + +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:NO] + +This lets you set the starting windowed/fullscreen setting. Can be YES, NO or PROMPT. + Cannot run fullscreen. +[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. + + All FONT values must be 16x16 +[WINDOWEDX:80] +[WINDOWEDY:50] +[FONT:curses_square_16x16.png] + +You may disable window resizing if you wish. +[RESIZABLE:NO] + +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:ShizzleClean.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 May 2012, 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 must be turned on, and set to a different tileset. + Webfort is hardcoded to 80x50 tiles. +[GRAPHICS:YES] +[GRAPHICS_WINDOWEDX:80] +[GRAPHICS_WINDOWEDY:50] +[GRAPHICS_FONT:ShizzleClean.png] +[GRAPHICS_FULLSCREENX:0] +[GRAPHICS_FULLSCREENY:0] +[GRAPHICS_FULLFONT:ShizzleClean.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:, 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. + + Webfort hooks into the OpenGL drawcalls, like TWBT. STANDARD mode is required. +[PRINT_MODE:STANDARD] + 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:200] + +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:NEAREST] + +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] diff --git a/dist/data/init/interface.txt b/dist/data/init/interface.txt new file mode 100644 index 0000000..4a35b22 --- /dev/null +++ b/dist/data/init/interface.txt @@ -0,0 +1,2908 @@ +This interface.txt was copied over From the Web Fortress project. +It is built to avoid the F1-12 keys, and other similarly uninterceptable keys. + +[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:MOVIES:REPEAT_NOT] +[KEY:;] +[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:TOGGLE_TTF:REPEAT_NOT] +[SYM:0:F12] +[BIND:FPS_UP:REPEAT_SLOW] +[SYM:4:Equals] +[BIND:FPS_DOWN:REPEAT_SLOW] +[SYM:4:Minus] +[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:MENU_CONFIRM:REPEAT_NOT] +[KEY:y] +[BIND:SAVE_BINDINGS:REPEAT_NOT] +[KEY:s] +[BIND:LOAD_BINDINGS:REPEAT_NOT] +[KEY:l] +[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:PREFIX:REPEAT_SLOW] +[SYM:2:u] +[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: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: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_LOAD:REPEAT_NOT] +[SYM:1:1] +[BIND:WORLD_PARAM_SAVE:REPEAT_NOT] +[SYM:1:6] +[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_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: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: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_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: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_ATTACK:REPEAT_NOT] +[KEY:A] +[BIND:A_ATTACK_CONFIRM:REPEAT_NOT] +[SYM:4:y] +[BIND:A_LOOK:REPEAT_NOT] +[KEY:l] +[BIND:A_SEARCH:REPEAT_NOT] +[KEY:L] +[BIND:A_TALK:REPEAT_NOT] +[KEY:k] +[BIND:A_INTERACT:REPEAT_NOT] +[KEY:I] +[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_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_CENTER:REPEAT_NOT] +[KEY:v] +[BIND:A_COMPANIONS:REPEAT_NOT] +[KEY:c] +[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: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:>] +[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:e] +[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_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: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: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:1:1] +[BIND:SETUP_BIOME_2:REPEAT_NOT] +[SYM:1:2] +[BIND:SETUP_BIOME_3:REPEAT_NOT] +[SYM:1:3] +[BIND:SETUP_BIOME_4:REPEAT_NOT] +[SYM:1:4] +[BIND:SETUP_BIOME_5:REPEAT_NOT] +[SYM:1:5] +[BIND:SETUP_BIOME_6:REPEAT_NOT] +[SYM:1:6] +[BIND:SETUP_BIOME_7:REPEAT_NOT] +[SYM:1:7] +[BIND:SETUP_BIOME_8:REPEAT_NOT] +[SYM:1:8] +[BIND:SETUP_BIOME_9:REPEAT_NOT] +[SYM:1:9] +[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: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:BUILDJOB_ADD:REPEAT_NOT] +[KEY:a] +[BIND:BUILDJOB_CANCEL:REPEAT_NOT] +[KEY:c] +[BIND:BUILDJOB_PROMOTE:REPEAT_NOT] +[KEY:p] +[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_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: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_HATCH:REPEAT_NOT] +[KEY: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_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_DIRT:REPEAT_NOT] +[KEY:O] +[BIND:HOTKEY_BUILDING_ROAD_PAVED: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_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_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_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_VERTICAL:REPEAT_NOT] +[KEY:v] +[BIND:HOTKEY_BUILDING_MACHINE_AXLE_HORIZONTAL:REPEAT_NOT] +[KEY:h] +[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_CONSTRUCTION:REPEAT_NOT] +[KEY:C] +[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: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_DYER:REPEAT_NOT] +[KEY:d] +[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_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: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_DOWN:REPEAT_NOT] +[KEY:t] +[BIND:BUILDING_TRIGGER_MIN_TRACK_CART_UP:REPEAT_NOT] +[KEY:y] +[BIND:BUILDING_TRIGGER_MAX_TRACK_CART_DOWN:REPEAT_NOT] +[KEY:g] +[BIND:BUILDING_TRIGGER_MAX_TRACK_CART_UP:REPEAT_NOT] +[KEY:h] +[BIND:BUILDING_TRIGGER_ENABLE_CREATURE:REPEAT_NOT] +[KEY:c] +[BIND:BUILDING_TRIGGER_ENABLE_LOCALS:REPEAT_NOT] +[KEY:l] +[BIND:BUILDING_TRIGGER_RESETS:REPEAT_NOT] +[KEY:o] +[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_ROLLERS_SPEED_UP:REPEAT_NOT] +[KEY:w] +[BIND:BUILDING_ROLLERS_SPEED_DOWN:REPEAT_NOT] +[KEY:q] +[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:DESTROYBUILDING:REPEAT_NOT] +[KEY:x] +[BIND:SUSPENDBUILDING:REPEAT_NOT] +[KEY:s] +[BIND:BUILDINGLIST_ZOOM_T:REPEAT_NOT] +[KEY:t] +[BIND:BUILDINGLIST_ZOOM_Q:REPEAT_NOT] +[KEY:q] +[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_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_BAG:REPEAT_NOT] +[KEY:b] +[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_SPIKE:REPEAT_NOT] +[KEY:S] +[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_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_STOCKPILE_MASTER:REPEAT_NOT] +[KEY:t] +[BIND:BUILDJOB_STOCKPILE_LINK_ANYWHERE:REPEAT_NOT] +[KEY:a] +[BIND:BUILDJOB_STOCKPILE_GIVE_TO:REPEAT_NOT] +[KEY:g] +[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:STOCKPILE_ANIMAL:REPEAT_NOT] +[KEY:a] +[BIND:STOCKPILE_FOOD:REPEAT_NOT] +[KEY:f] +[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_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_NONE:REPEAT_NOT] +[KEY:x] +[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: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_DUMP:REPEAT_NOT] +[KEY:g] +[BIND:CIVZONE_POND:REPEAT_NOT] +[KEY:p] +[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_ACTIVE:REPEAT_NOT] +[KEY:a] +[BIND:CIVZONE_MEETING:REPEAT_NOT] +[KEY:m] +[BIND:CIVZONE_ANIMAL_TRAINING:REPEAT_NOT] +[KEY:t] +[BIND:CIVZONE_PEN:REPEAT_NOT] +[KEY:n] +[BIND:CIVZONE_PEN_OPTIONS:REPEAT_NOT] +[KEY:N] +[BIND:CIVZONE_POND_OPTIONS:REPEAT_NOT] +[KEY:P] +[BIND:CIVZONE_POND_WATER:REPEAT_NOT] +[KEY:f] +[BIND:CIVZONE_HOSPITAL_OPTIONS:REPEAT_NOT] +[KEY:H] +[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:PET_BUTCHER:REPEAT_NOT] +[KEY:b] +[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: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_LOOM:REPEAT_NOT] +[KEY:l] +[BIND:ORDERS_DYED_CLOTH:REPEAT_NOT] +[KEY:d] +[BIND:ORDERS_EXCEPTIONS:REPEAT_NOT] +[KEY:x] +[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_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: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:1:1] +[BIND:D_HOTKEY2:REPEAT_NOT] +[SYM:1:2] +[BIND:D_HOTKEY3:REPEAT_NOT] +[SYM:1:3] +[BIND:D_HOTKEY4:REPEAT_NOT] +[SYM:1:4] +[BIND:D_HOTKEY5:REPEAT_NOT] +[SYM:1:5] +[BIND:D_HOTKEY6:REPEAT_NOT] +[SYM:1:6] +[BIND:D_HOTKEY7:REPEAT_NOT] +[SYM:1:7] +[BIND:D_HOTKEY8:REPEAT_NOT] +[SYM:1:8] +[BIND:D_HOTKEY9:REPEAT_NOT] +[SYM:1:9] +[BIND:D_HOTKEY10:REPEAT_NOT] +[SYM:1:0] +[BIND:D_HOTKEY11:REPEAT_NOT] +[SYM:3:1] +[BIND:D_HOTKEY12:REPEAT_NOT] +[SYM:3:2] +[BIND:D_HOTKEY13:REPEAT_NOT] +[SYM:3:3] +[BIND:D_HOTKEY14:REPEAT_NOT] +[SYM:3:4] +[BIND:D_HOTKEY15:REPEAT_NOT] +[SYM:3:5] +[BIND:D_HOTKEY16:REPEAT_NOT] +[SYM:3:6] +[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_ROOMS:REPEAT_NOT] +[KEY:R] +[BIND:D_SQUADS:REPEAT_NOT] +[KEY:s] +[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_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: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: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: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: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:r] +[BIND:UNITJOB_ZOOM_CRE:REPEAT_NOT] +[KEY:c] +[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: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_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_STAIR_UP:REPEAT_NOT] +[KEY:u] +[BIND:DESIGNATE_STAIR_DOWN:REPEAT_NOT] +[KEY:j] +[BIND:DESIGNATE_STAIR_UPDOWN:REPEAT_NOT] +[KEY:i] +[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:a] +[BIND:DESIGNATE_TRACK:REPEAT_NOT] +[KEY:T] +[BIND:DESIGNATE_TOGGLE_ENGRAVING:REPEAT_NOT] +[KEY:v] +[BIND:DESIGNATE_UNDO:REPEAT_NOT] +[KEY:x] +[BIND:DESIGNATE_REMOVE_CONSTRUCTION:REPEAT_NOT] +[KEY:n] +[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: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: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_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_VIEW:REPEAT_NOT] +[KEY:z] +[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:CUSTOMIZE_UNIT_NICKNAME:REPEAT_NOT] +[KEY:n] +[BIND:CUSTOMIZE_UNIT_PROFNAME:REPEAT_NOT] +[KEY:p] +[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_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: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_A127: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:ÿ] diff --git a/package.sh b/package.sh new file mode 100755 index 0000000..3471b77 --- /dev/null +++ b/package.sh @@ -0,0 +1,39 @@ +#!/bin/sh +# Build script for windows, written in unix :P +# This file is a part of Web Fortress +# (c) 2014 Kyle Mclamb + +if [ ! -r "$1" ]; then + echo "Invalid file: $1" + echo "Usage: $0 " + exit 1 +fi + +rm -rf package +mkdir -v package +mkdir -vp package/hack/plugins + +cp -v "$1" package/hack/plugins/ +cp -vr dist/* package/ +cp -vr static package/web + +cp_prefixed() { + cp -v $1 package/WF-$1 +} + +cp_prefixed README.md +cp_prefixed INSTALLING.txt +cp_prefixed LICENSE +echo "## CLIENT ##" >> package/WF-USING.txt +cat static/README.md >> package/WF-USING.txt +echo "" >> package/WF-USING.txt +echo "## SERVER ##" >> package/WF-USING.txt +cat server/README.md >> package/WF-USING.txt + +zipname="webfort-$(git describe --tag).zip" + +rm -v "$zipname" +(cd package && zip -r "../$zipname" ./*) + +rm -rf package +echo "$zipname: Done." diff --git a/server/CMakeLists.txt b/server/CMakeLists.txt index 093e56f..4346616 100644 --- a/server/CMakeLists.txt +++ b/server/CMakeLists.txt @@ -49,7 +49,7 @@ else(UNIX) -D_WEBSOCKETPP_CPP11_MEMORY_ -DNOMINMAX ) - option(DL_DEPS "Download dependencies as windows binaries over http. Insecure." ON) + option(DL_DEPS "Download dependencies as windows binaries over https." ON) # Download deps if(DL_DEPS) message("Downloading dependencies. This may take a while.") diff --git a/server/dist/building_type.h b/server/dist/building_type.h deleted file mode 100644 index c666417..0000000 --- a/server/dist/building_type.h +++ /dev/null @@ -1,87 +0,0 @@ -/* THIS FILE WAS GENERATED. DO NOT EDIT. */ -#ifndef DF_BUILDING_TYPE_H -#define DF_BUILDING_TYPE_H -namespace df { - namespace enums { - namespace building_type { - enum building_type : int32_t { - NONE = -1, - Chair, - Bed, - Table, - Coffin, - FarmPlot, - Furnace, - TradeDepot, - Shop, - Door, - Floodgate, - Box, - Weaponrack, - Armorstand, - Workshop, - Cabinet, - Statue, - WindowGlass, - WindowGem, - Well, - Bridge, - RoadDirt, - RoadPaved, - SiegeEngine, - Trap, - AnimalTrap, - Support, - ArcheryTarget, - Chain, - Cage, - Stockpile, - Civzone, - Weapon, - Wagon, - ScrewPump, - Construction, - Hatch, - GrateWall, - GrateFloor, - BarsVertical, - BarsFloor, - GearAssembly, - AxleHorizontal, - AxleVertical, - WaterWheel, - Windmill, - TractionBench, - Slab, - Nest, - NestBox, - Hive, - Rollers - }; - } - } - using enums::building_type::building_type; - template<> struct DFHACK_EXPORT identity_traits { - static enum_identity identity; - static enum_identity *get() { return &identity; } - }; - template<> struct DFHACK_EXPORT enum_traits { - typedef int32_t base_type; - typedef building_type enum_type; - static const base_type first_item_value = -1; - static const base_type last_item_value = 50; - static inline bool is_valid(enum_type value) { - return (base_type(value) >= first_item_value && base_type(value) <= last_item_value); - } - static const enum_type first_item = (enum_type)first_item_value; - static const enum_type last_item = (enum_type)last_item_value; - static const char *const key_table[52]; - struct attr_entry_type { - const char* classname; - static struct_identity _identity; - }; - static const attr_entry_type attr_table[52+1]; - static const attr_entry_type &attrs(enum_type value); - }; -} -#endif diff --git a/server/dist/buildings_other_id.h b/server/dist/buildings_other_id.h deleted file mode 100644 index 678a4b2..0000000 --- a/server/dist/buildings_other_id.h +++ /dev/null @@ -1,142 +0,0 @@ -/* THIS FILE WAS GENERATED. DO NOT EDIT. */ -#ifndef DF_BUILDINGS_OTHER_ID_H -#define DF_BUILDINGS_OTHER_ID_H -#ifndef DF_BUILDING_TYPE_H -#include "building_type.h" -#endif -#ifndef DF_CIVZONE_TYPE_H -#include "civzone_type.h" -#endif -#ifndef DF_FURNACE_TYPE_H -#include "furnace_type.h" -#endif -#ifndef DF_WORKSHOP_TYPE_H -#include "workshop_type.h" -#endif -namespace df { - namespace enums { - namespace buildings_other_id { - enum buildings_other_id : int32_t { - ANY = -1, - /** - * actually on the map, as opposed to in an offloaded fortress elsewhere - */ - IN_PLAY, - STOCKPILE, - ANY_ZONE, - ACTIVITY_ZONE, - ANY_ACTUAL, - ANY_MACHINE, - ANY_HOSPITAL_STORAGE, - ANY_STORAGE, - ANY_BARRACKS, - ANY_NOBLE_ROOM, - ANY_HOSPITAL, - BOX, - CABINET, - TRAP, - DOOR, - FLOODGATE, - HATCH, - GRATE_WALL, - GRATE_FLOOR, - BARS_VERTICAL, - BARS_FLOOR, - WINDOW_ANY, - WELL, - TABLE, - BRIDGE, - CHAIR, - TRADE_DEPOT, - NEST, - NEST_BOX, - HIVE, - WAGON, - SHOP, - BED, - TRACTION_BENCH, - ANY_ROAD, - FARM_PLOT, - GEAR_ASSEMBLY, - ROLLERS, - AXLE_HORIZONTAL, - AXLE_VERTICAL, - SUPPORT, - ARCHERY_TARGET, - SCREW_PUMP, - WATER_WHEEL, - WINDMILL, - CHAIN, - CAGE, - STATUE, - SLAB, - COFFIN, - WEAPON_RACK, - ARMOR_STAND, - FURNACE_ANY, - FURNACE_WOOD, - FURNACE_SMELTER_ANY, - FURNACE_SMELTER_MAGMA, - FURNACE_KILN_ANY, - FURNACE_GLASS_ANY, - FURNACE_CUSTOM, - WORKSHOP_ANY, - WORKSHOP_BUTCHER, - WORKSHOP_MASON, - WORKSHOP_KENNEL, - WORKSHOP_FISHERY, - WORKSHOP_JEWELER, - WORKSHOP_LOOM, - WORKSHOP_TANNER, - WORKSHOP_DYER, - WORKSHOP_MILL_ANY, - WORKSHOP_QUERN, - WORKSHOP_TOOL, - WORKSHOP_MILLSTONE, - WORKSHOP_KITCHEN, - WORKSHOP_STILL, - WORKSHOP_FARMER, - WORKSHOP_ASHERY, - WORKSHOP_CARPENTER, - WORKSHOP_CRAFTSDWARF, - WORKSHOP_MECHANIC, - WORKSHOP_SIEGE, - WORKSHOP_CLOTHIER, - WORKSHOP_LEATHER, - WORKSHOP_BOWYER, - WORKSHOP_MAGMA_FORGE, - WORKSHOP_FORGE_ANY, - WORKSHOP_CUSTOM, - WEAPON_UPRIGHT - }; - } - } - using enums::buildings_other_id::buildings_other_id; - template<> struct DFHACK_EXPORT identity_traits { - static enum_identity identity; - static enum_identity *get() { return &identity; } - }; - template<> struct DFHACK_EXPORT enum_traits { - typedef int32_t base_type; - typedef buildings_other_id enum_type; - static const base_type first_item_value = -1; - static const base_type last_item_value = 86; - static inline bool is_valid(enum_type value) { - return (base_type(value) >= first_item_value && base_type(value) <= last_item_value); - } - static const enum_type first_item = (enum_type)first_item_value; - static const enum_type last_item = (enum_type)last_item_value; - static const char *const key_table[88]; - struct attr_entry_type { - df::building_type building; - enum_list_attr generic_building; - enum_list_attr workshop; - enum_list_attr furnace; - enum_list_attr civzone; - static struct_identity _identity; - }; - static const attr_entry_type attr_table[88+1]; - static const attr_entry_type &attrs(enum_type value); - }; -} -#endif diff --git a/server/dist/item_type.h b/server/dist/item_type.h deleted file mode 100644 index 892cda5..0000000 --- a/server/dist/item_type.h +++ /dev/null @@ -1,396 +0,0 @@ -/* THIS FILE WAS GENERATED. DO NOT EDIT. */ -#ifndef DF_ITEM_TYPE_H -#define DF_ITEM_TYPE_H -namespace df { - namespace enums { - namespace item_type { - enum item_type : int16_t { - NONE = -1, - /** - * Bars, such as metal, fuel, or soap. - */ - BAR, - /** - * Cut gemstones usable in jewelers workshop - */ - SMALLGEM, - /** - * Blocks of any kind. - */ - BLOCKS, - /** - * Rough gemstones. - */ - ROUGH, - /** - * Raw mined stone. - */ - BOULDER, - /** - * Wooden logs. - */ - WOOD, - /** - * Doors. - */ - DOOR, - /** - * Floodgates. - */ - FLOODGATE, - /** - * Beds. - */ - BED, - /** - * Chairs and thrones. - */ - CHAIR, - /** - * Restraints. - */ - CHAIN, - /** - * Flasks. - */ - FLASK, - /** - * Goblets. - */ - GOBLET, - /** - * Musical instruments. - */ - INSTRUMENT, - /** - * Toys. - */ - TOY, - /** - * Glass windows. - */ - WINDOW, - /** - * Cages. - */ - CAGE, - /** - * Barrels. - */ - BARREL, - /** - * Buckets. - */ - BUCKET, - /** - * Animal traps. - */ - ANIMALTRAP, - /** - * Tables. - */ - TABLE, - /** - * Coffins. - */ - COFFIN, - /** - * Statues. - */ - STATUE, - /** - * Corpses. Does not have a material. - */ - CORPSE, - /** - * Weapons. - */ - WEAPON, - /** - * Armor and clothing worn on the upper body. - */ - ARMOR, - /** - * Armor and clothing worn on the feet. - */ - SHOES, - /** - * Shields and bucklers. - */ - SHIELD, - /** - * Armor and clothing worn on the head. - */ - HELM, - /** - * Armor and clothing worn on the hands. - */ - GLOVES, - /** - * Chests (wood), coffers (stone), boxes (glass), and bags (cloth or leather). - */ - BOX, - /** - * Bins. - */ - BIN, - /** - * Armor stands. - */ - ARMORSTAND, - /** - * Weapon racks. - */ - WEAPONRACK, - /** - * Cabinets. - */ - CABINET, - /** - * Figurines. - */ - FIGURINE, - /** - * Amulets. - */ - AMULET, - /** - * Scepters. - */ - SCEPTER, - /** - * Ammunition for hand-held weapons. - */ - AMMO, - /** - * Crowns. - */ - CROWN, - /** - * Rings. - */ - RING, - /** - * Earrings. - */ - EARRING, - /** - * Bracelets. - */ - BRACELET, - /** - * Large gems. - */ - GEM, - /** - * Anvils. - */ - ANVIL, - /** - * Body parts. Does not have a material. - */ - CORPSEPIECE, - /** - * Dead vermin bodies. Material is CREATURE_ID:CASTE. - */ - REMAINS, - /** - * Butchered meat. - */ - MEAT, - /** - * Prepared fish. Material is CREATURE_ID:CASTE. - */ - FISH, - /** - * Unprepared fish. Material is CREATURE_ID:CASTE. - */ - FISH_RAW, - /** - * Live vermin. Material is CREATURE_ID:CASTE. - */ - VERMIN, - /** - * Tame vermin. Material is CREATURE_ID:CASTE. - */ - PET, - /** - * Seeds from plants. - */ - SEEDS, - /** - * Plants. - */ - PLANT, - /** - * Tanned skins. - */ - SKIN_TANNED, - /** - * Leaves, usually from quarry bushes. - */ - LEAVES, - /** - * Thread gathered from webs or made at the farmers workshop. - */ - THREAD, - /** - * Cloth made at the loom. - */ - CLOTH, - /** - * Skull totems. - */ - TOTEM, - /** - * Armor and clothing worn on the legs. - */ - PANTS, - /** - * Backpacks. - */ - BACKPACK, - /** - * Quivers. - */ - QUIVER, - /** - * Catapult parts. - */ - CATAPULTPARTS, - /** - * Ballista parts. - */ - BALLISTAPARTS, - /** - * Siege engine ammunition. - */ - SIEGEAMMO, - /** - * Ballista arrow heads. - */ - BALLISTAARROWHEAD, - /** - * Mechanisms. - */ - TRAPPARTS, - /** - * Trap components. - */ - TRAPCOMP, - /** - * Alcoholic drinks. - */ - DRINK, - /** - * Powders such as flour, gypsum plaster, dye, or sand. - */ - POWDER_MISC, - /** - * Pieces of cheese. - */ - CHEESE, - /** - * Prepared meals. Subtypes come from item_food.txt - */ - FOOD, - /** - * Liquids such as water, lye, and extracts. - */ - LIQUID_MISC, - /** - * Coins. - */ - COIN, - /** - * Fat, tallow, pastes/pressed objects, and small bits of molten rock/metal. - */ - GLOB, - /** - * Small rocks (usually sharpened and/or thrown in adventurer mode) - */ - ROCK, - /** - * Pipe sections. - */ - PIPE_SECTION, - /** - * Hatch covers. - */ - HATCH_COVER, - /** - * Grates. - */ - GRATE, - /** - * Querns. - */ - QUERN, - /** - * Millstones. - */ - MILLSTONE, - /** - * Splints. - */ - SPLINT, - /** - * Crutches. - */ - CRUTCH, - /** - * Traction benches. - */ - TRACTION_BENCH, - /** - * Casts - */ - ORTHOPEDIC_CAST, - /** - * Tools. - */ - TOOL, - /** - * Slabs. - */ - SLAB, - /** - * Eggs. Material is CREATURE_ID:CASTE. - */ - EGG, - /** - * Books. - */ - BOOK - }; - } - } - using enums::item_type::item_type; - template<> struct DFHACK_EXPORT identity_traits { - static enum_identity identity; - static enum_identity *get() { return &identity; } - }; - template<> struct DFHACK_EXPORT enum_traits { - typedef int16_t base_type; - typedef item_type enum_type; - static const base_type first_item_value = -1; - static const base_type last_item_value = 88; - static inline bool is_valid(enum_type value) { - return (base_type(value) >= first_item_value && base_type(value) <= last_item_value); - } - static const enum_type first_item = (enum_type)first_item_value; - static const enum_type last_item = (enum_type)last_item_value; - static const char *const key_table[90]; - struct attr_entry_type { - const char* caption; - bool is_rawable; - bool is_stackable; - bool is_caste_mat; - const char* classname; - static struct_identity _identity; - }; - static const attr_entry_type attr_table[90+1]; - static const attr_entry_type &attrs(enum_type value); - }; -} -#endif diff --git a/server/dist/items_other_id.h b/server/dist/items_other_id.h deleted file mode 100644 index f53c278..0000000 --- a/server/dist/items_other_id.h +++ /dev/null @@ -1,173 +0,0 @@ -/* THIS FILE WAS GENERATED. DO NOT EDIT. */ -#ifndef DF_ITEMS_OTHER_ID_H -#define DF_ITEMS_OTHER_ID_H -#ifndef DF_ITEM_TYPE_H -#include "item_type.h" -#endif -namespace df { - namespace enums { - namespace items_other_id { - enum items_other_id : int32_t { - ANY = -1, - /** - * actually on the map, as opposed to in an offloaded fortress elsewhere - */ - IN_PLAY, - ANY_ARTIFACT, - WEAPON, - ANY_WEAPON, - ANY_SPIKE, - ANY_TRUE_ARMOR, - ANY_ARMOR_HELM, - ANY_ARMOR_SHOES, - SHIELD, - ANY_ARMOR_GLOVES, - ANY_ARMOR_PANTS, - QUIVER, - SPLINT, - ORTHOPEDIC_CAST, - CRUTCH, - BACKPACK, - AMMO, - WOOD, - BOULDER, - ROCK, - ANY_REFUSE, - ANY_GOOD_FOOD, - ANY_AUTO_CLEAN, - ANY_GENERIC23, - ANY_GENERIC24, - ANY_FURNITURE, - ANY_CAGE_OR_TRAP, - ANY_EDIBLE_RAW, - ANY_EDIBLE_CARNIVORE, - ANY_EDIBLE_BONECARN, - ANY_EDIBLE_VERMIN, - ANY_EDIBLE_VERMIN_BOX, - ANY_CAN_ROT, - ANY_MURDERED, - ANY_DEAD_DWARF, - ANY_GENERIC35, - ANY_GENERIC36, - ANY_GENERIC37, - ANY_GENERIC38, - DOOR, - FLOODGATE, - HATCH_COVER, - GRATE, - CAGE, - FLASK, - WINDOW, - GOBLET, - INSTRUMENT, - TOY, - TOOL, - BUCKET, - BARREL, - CHAIN, - ANIMALTRAP, - BED, - TRACTION_BENCH, - CHAIR, - COFFIN, - TABLE, - STATUE, - SLAB, - QUERN, - MILLSTONE, - BOX, - BIN, - ARMORSTAND, - WEAPONRACK, - CABINET, - ANVIL, - CATAPULTPARTS, - BALLISTAPARTS, - SIEGEAMMO, - TRAPPARTS, - ANY_WEBS, - PIPE_SECTION, - ANY_ENCASED, - ANY_IN_CONSTRUCTION, - DRINK, - ANY_DRINK, - LIQUID_MISC, - POWDER_MISC, - ANY_COOKABLE, - ANY_GENERIC82, - VERMIN, - PET, - ANY_CRITTER, - COIN, - GLOB, - TRAPCOMP, - BAR, - SMALLGEM, - BLOCKS, - ROUGH, - ANY_CORPSE, - CORPSE, - BOOK, - FIGURINE, - AMULET, - SCEPTER, - CROWN, - RING, - EARRING, - BRACELET, - GEM, - CORPSEPIECE, - REMAINS, - MEAT, - FISH, - FISH_RAW, - EGG, - SEEDS, - PLANT, - SKIN_TANNED, - LEAVES, - THREAD, - CLOTH, - TOTEM, - PANTS, - CHEESE, - FOOD, - BALLISTAARROWHEAD, - ARMOR, - SHOES, - HELM, - GLOVES, - ANY_GENERIC123, - FOOD_STORAGE, - ANY_RECENTLY_DROPPED, - ANY_MELT_DESIGNATED, - BAD - }; - } - } - using enums::items_other_id::items_other_id; - template<> struct DFHACK_EXPORT identity_traits { - static enum_identity identity; - static enum_identity *get() { return &identity; } - }; - template<> struct DFHACK_EXPORT enum_traits { - typedef int32_t base_type; - typedef items_other_id enum_type; - static const base_type first_item_value = -1; - static const base_type last_item_value = 129; - static inline bool is_valid(enum_type value) { - return (base_type(value) >= first_item_value && base_type(value) <= last_item_value); - } - static const enum_type first_item = (enum_type)first_item_value; - static const enum_type last_item = (enum_type)last_item_value; - static const char *const key_table[131]; - struct attr_entry_type { - df::item_type item; - enum_list_attr generic_item; - static struct_identity _identity; - }; - static const attr_entry_type attr_table[131+1]; - static const attr_entry_type &attrs(enum_type value); - }; -} -#endif diff --git a/server/dist/overrides.txt b/server/dist/overrides.txt deleted file mode 100644 index 655a0c3..0000000 --- a/server/dist/overrides.txt +++ /dev/null @@ -1,35 +0,0 @@ -# This file should be placed into data/init and allows to load additional tilesets -# and override tile numbers for certain item/building types. - -# Load additional tileset if you ran out of tiles in main and text fonts -# [TILESET:font.png:fullscreenfont.png] - -# Add an override -# [OVERRIDE:Tile:Kind:Id:Type:Subtype:Tileset:NewTile] -# Tile is the original tile number -# Kind is I for item or B for building -# Id see buildings_other_id.h or items_other_id.h -# Type see building_type.h or item_type.h, may be empty -# Subtype is some numberical value, don't know what values correspond to what -# Tileset is an index of tileset to use -# 0 is the main tileset -# 1 is a text tileset loaded by this plugin -# 2 and so on are tilesets specified above -# NewTile is the new tile number - -# Override tile if it didn't match any other rules -# Behaviour of this may change in future -# [OVERRIDE:Tile:Tileset:NewTile] - -# Examples - -# [OVERRIDE:177:B:WINDOW_ANY:WindowGem::0:48] -# Will make gem windows show as coffins (why not) - -# [OVERRIDE:197:I:DOOR:::0:197] -# [OVERRIDE:197:B:DOOR:::0:197] -# [OVERRIDE:197:0:229] -# Will make floor engraving in progess to show as anvils instead of doors - -# Check all values carefully as there's not error checking currently and the game will -# crash if you specify non-existing tileset index, for example. \ No newline at end of file diff --git a/server/server.cpp b/server/server.cpp index b050749..e4f36f8 100644 --- a/server/server.cpp +++ b/server/server.cpp @@ -28,6 +28,8 @@ using df::global::gps; int64_t TURNTIME = 600; // 10 minutes uint32_t MAX_CLIENTS = 32; uint16_t PORT = 1234; +#define WF_VERSION "WebFortress-v2.0" +#define WF_INVALID "WebFortress-invalid" conn_map clients; @@ -204,34 +206,61 @@ void set_active(conn newc) *out2 << newcl->nick << " is now active." << std::endl; } -bool validate_open(conn hdl) +bool validate_open(server* s, conn hdl) { - // TODO: version negotiation - return clients.size() < MAX_CLIENTS; + auto raw_conn = s->get_con_from_hdl(hdl); + + std::vector protos = raw_conn->get_requested_subprotocols(); + if (std::find(protos.begin(), protos.end(), WF_VERSION) != protos.end()) { + raw_conn->select_subprotocol(WF_VERSION); + } else if (std::find(protos.begin(), protos.end(), WF_INVALID) != protos.end()) { + raw_conn->select_subprotocol(WF_INVALID); + } + + return true; } void on_open(server* s, conn hdl) { - auto cl = new Client; + if (s->get_con_from_hdl(hdl)->get_subprotocol() == WF_INVALID) { + s->close(hdl, 4000, "Invalid version, expected '" WF_VERSION "'."); + return; + } + + if (clients.size() >= MAX_CLIENTS) { + s->close(hdl, 4001, "Server is full."); + return; + } + + auto raw_conn = s->get_con_from_hdl(hdl); + std::string nick = raw_conn->get_resource().substr(1); // remove leading '/' - auto con = s->get_con_from_hdl(hdl); - cl->addr = con->get_remote_endpoint(); - cl->nick = con->get_resource().substr(1); // remove leading '/' + if (nick == "__NOBODY") { + s->close(hdl, 4002, "Invalid nickname."); + return; + } + Client* cl = new Client; + cl->addr = raw_conn->get_remote_endpoint(); + cl->nick = nick; cl->atime = time(NULL); memset(cl->mod, 0, sizeof(cl->mod)); + assert(cl->addr); + assert(cl->nick); clients[hdl] = cl; } void on_close(server* s, conn c) { Client* cl = get_client(c); - if (conn_eq(c, active_conn)) { - set_active(null_conn); + if (cl != null_client) { + if (conn_eq(c, active_conn)) { + set_active(null_conn); + } + delete cl; } clients.erase(c); - delete cl; } void tock(server* s, conn hdl) @@ -240,7 +269,7 @@ void tock(server* s, conn hdl) Client* active_cl = get_client(active_conn); int32_t time_left = -1; - if (!conn_eq(active_conn, null_conn) && clients.size() > 1) + if (TURNTIME != 0 && !conn_eq(active_conn, null_conn) && clients.size() > 1) { time_t now = time(NULL); int played = now - active_cl->atime; @@ -432,7 +461,7 @@ void wsthreadmain(void *out) out2 = &astream; srv.set_socket_init_handler(&on_init); - srv.set_validate_handler(&validate_open); + srv.set_validate_handler(bind(&validate_open, &srv, ::_1)); srv.set_open_handler(bind(&on_open, &srv, ::_1)); srv.set_message_handler(bind(&on_message, &srv, ::_1, ::_2)); srv.set_close_handler(bind(&on_close, &srv, ::_1)); diff --git a/static/README.md b/static/README.md index 2fada67..c69431b 100644 --- a/static/README.md +++ b/static/README.md @@ -17,20 +17,43 @@ for debug purposes. here are all of them: | `nick` | any string | random | The nickname to use | | `store` | a boolean | undefined | if true, store all current settings | -And an example of using them: +A quick primer on query strings: - http://myhost/webfort.html?host=theirhost&port=80&hide-chat=true +Anything past a ? in a URL is a query string -Parameters can be stored into your browser's localStorage, where they can + http:///webfort.html?param=value + +here, the parameter `param` is being set to `value`. + + http:///webfort.html?param + +If you don't give a value. it is assumed to be true. So here, +`param` is true. + +You can also chain multiple parameters using & + + http:///webfort.html?param1=1¶m2=2 + +Here, `param1` is set to `1`, and `param2` is set to `2`. + +A real world example: + + http:///webfort.html?nick=Urist&hide-chat&tiles=ShizzleClean.png + +Will set your `nick` to Urist, hide the chat pane, and set the tileset +to `ShizzleClean.png`. + +Parameters can be stored into your browser's `localStorage`, where they can persist between sessions. for example, opening: - http://myhost/webfort.html?nick=myNick&store=true + http:///webfort.html?nick=Urist&store -will store the nick `myNick` and restore it such that +will store the nick `Urist` and restore it such that - http://myhost/webfort.html + http:///webfort.html -will also have the the nick `myNick`. ATM, storage can only be reset to +will also have the the nick `Urist`. ATM, storage can only be reset to defaults by using the console command: localStorage.clear() + diff --git a/static/art/CONTRIBUTORS.md b/static/art/CONTRIBUTORS.md new file mode 100644 index 0000000..a4b3bd8 --- /dev/null +++ b/static/art/CONTRIBUTORS.md @@ -0,0 +1,2 @@ +These tilesets were contributed by Dragoon209, and are (c) their +respective creators. diff --git a/static/art/Curses.png b/static/art/Curses.png new file mode 100644 index 0000000..eac84dc Binary files /dev/null and b/static/art/Curses.png differ diff --git a/static/art/Ironhand.png b/static/art/Ironhand.png new file mode 100644 index 0000000..c531bb3 Binary files /dev/null and b/static/art/Ironhand.png differ diff --git a/static/art/Ironhand_Square.png b/static/art/Ironhand_Square.png new file mode 100644 index 0000000..ebc0031 Binary files /dev/null and b/static/art/Ironhand_Square.png differ diff --git a/static/art/Mayday.png b/static/art/Mayday.png new file mode 100644 index 0000000..8cc808e Binary files /dev/null and b/static/art/Mayday.png differ diff --git a/static/art/Obsidian.png b/static/art/Obsidian.png new file mode 100644 index 0000000..1ae2a80 Binary files /dev/null and b/static/art/Obsidian.png differ diff --git a/static/art/Phoebus.png b/static/art/Phoebus.png new file mode 100644 index 0000000..b8a727b Binary files /dev/null and b/static/art/Phoebus.png differ diff --git a/static/art/ShizzleClean.png b/static/art/ShizzleClean.png old mode 100755 new mode 100644 diff --git a/static/art/SimpleMood.png b/static/art/SimpleMood.png new file mode 100644 index 0000000..1f05039 Binary files /dev/null and b/static/art/SimpleMood.png differ diff --git a/static/art/Spacefox.png b/static/art/Spacefox.png new file mode 100644 index 0000000..a39b6db Binary files /dev/null and b/static/art/Spacefox.png differ diff --git a/static/art/t_Anno.png b/static/art/t_Anno.png new file mode 100644 index 0000000..98d80fe Binary files /dev/null and b/static/art/t_Anno.png differ diff --git a/static/art/t_Bisasam.png b/static/art/t_Bisasam.png new file mode 100644 index 0000000..00b6b7a Binary files /dev/null and b/static/art/t_Bisasam.png differ diff --git a/static/art/t_Cheepicus.png b/static/art/t_Cheepicus.png new file mode 100644 index 0000000..b399028 Binary files /dev/null and b/static/art/t_Cheepicus.png differ diff --git a/static/art/t_Cheepicus8bit.png b/static/art/t_Cheepicus8bit.png new file mode 100644 index 0000000..17d3140 Binary files /dev/null and b/static/art/t_Cheepicus8bit.png differ diff --git a/static/art/t_Phoebus.png b/static/art/t_Phoebus.png new file mode 100644 index 0000000..003b752 Binary files /dev/null and b/static/art/t_Phoebus.png differ diff --git a/static/art/t_Phssthpok.png b/static/art/t_Phssthpok.png new file mode 100644 index 0000000..416d30e Binary files /dev/null and b/static/art/t_Phssthpok.png differ diff --git a/static/art/t_ShizzleClean.png b/static/art/t_ShizzleClean.png new file mode 100644 index 0000000..1a51898 Binary files /dev/null and b/static/art/t_ShizzleClean.png differ diff --git a/static/art/t_Spacefox.png b/static/art/t_Spacefox.png new file mode 100644 index 0000000..abeee71 Binary files /dev/null and b/static/art/t_Spacefox.png differ diff --git a/static/art/t_wanderlust.png b/static/art/t_wanderlust.png new file mode 100644 index 0000000..e0f474c Binary files /dev/null and b/static/art/t_wanderlust.png differ diff --git a/static/art/wanderlust.png b/static/art/wanderlust.png new file mode 100644 index 0000000..e0f474c Binary files /dev/null and b/static/art/wanderlust.png differ diff --git a/static/colors/CONTRIBUTORS.md b/static/colors/CONTRIBUTORS.md new file mode 100644 index 0000000..1eaa87c --- /dev/null +++ b/static/colors/CONTRIBUTORS.md @@ -0,0 +1,3 @@ +These colorfiles were contributed by Dragoon209 +The script used can be found at +https://github.com/Ankoku/df-webfort/issues/27 diff --git a/static/colors/CowThing.json b/static/colors/CowThing.json index ff0d7bd..5b3fb0c 100644 --- a/static/colors/CowThing.json +++ b/static/colors/CowThing.json @@ -1,18 +1,18 @@ -[ - 49, 49, 62, - 64, 81, 218, - 86, 182, 54, - 82, 183, 192, - 206, 49, 55, - 142, 58, 186, - 240, 162, 42, - 175, 181, 183, - 118, 118, 129, - 98, 149, 237, - 175, 242, 57, - 172, 235, 217, - 248, 80, 62, - 221, 98, 197, - 252, 239, 98, - 255, 255, 255 -] +[ + 49, 49, 62, + 64, 81, 218, + 86, 182, 54, + 82, 183, 192, + 206, 49, 55, + 142, 58, 186, + 240, 162, 42, + 175, 181, 183, + 118, 118, 129, + 98, 149, 237, + 175, 242, 57, + 172, 235, 217, + 248, 80, 62, + 221, 98, 197, + 252, 239, 98, + 255, 255, 255 +] diff --git a/static/colors/RedGreen.json b/static/colors/RedGreen.json new file mode 100644 index 0000000..ec5fc37 --- /dev/null +++ b/static/colors/RedGreen.json @@ -0,0 +1 @@ +[0,0,0,0,0,240,0,128,0,0,112,144,240,0,0,160,0,128,128,96,0,208,208,208,112,112,112,80,80,255,0,208,0,64,208,255,255,80,80,255,48,240,255,255,64,255,255,255] \ No newline at end of file diff --git a/static/colors/VheridAsh.json b/static/colors/VheridAsh.json new file mode 100644 index 0000000..5993bbb --- /dev/null +++ b/static/colors/VheridAsh.json @@ -0,0 +1 @@ +[0,0,0,73,73,73,103,103,103,165,165,165,37,37,37,85,85,85,60,60,60,142,142,142,52,52,52,129,129,129,219,219,219,247,247,247,80,80,80,119,119,120,182,182,182,255,255,255] \ No newline at end of file diff --git a/static/colors/VheridBone.json b/static/colors/VheridBone.json new file mode 100644 index 0000000..5059154 --- /dev/null +++ b/static/colors/VheridBone.json @@ -0,0 +1 @@ +[38,23,10,15,82,186,120,134,23,86,184,114,132,0,0,124,26,96,104,75,58,154,132,109,65,53,43,0,138,255,196,219,38,72,255,184,192,61,36,255,66,130,255,195,34,252,250,208] \ No newline at end of file diff --git a/static/colors/VheridDarkSand.json b/static/colors/VheridDarkSand.json new file mode 100644 index 0000000..e08a638 --- /dev/null +++ b/static/colors/VheridDarkSand.json @@ -0,0 +1 @@ +[2,1,16,4,81,140,93,109,6,12,79,76,142,40,0,131,0,52,114,89,58,51,69,84,17,35,51,0,176,238,166,176,0,12,187,160,206,73,1,160,3,7,255,183,77,230,245,247] \ No newline at end of file diff --git a/static/colors/VheridDefault.json b/static/colors/VheridDefault.json new file mode 100644 index 0000000..02e2827 --- /dev/null +++ b/static/colors/VheridDefault.json @@ -0,0 +1 @@ +[0,0,0,0,0,128,0,128,0,0,128,128,128,0,0,128,0,128,128,128,0,192,192,192,128,128,128,0,0,255,0,255,0,0,255,255,255,0,0,255,0,255,255,255,0,255,255,255] \ No newline at end of file diff --git a/static/colors/VheridDefaultPlus.json b/static/colors/VheridDefaultPlus.json new file mode 100644 index 0000000..24051d5 --- /dev/null +++ b/static/colors/VheridDefaultPlus.json @@ -0,0 +1 @@ +[0,0,0,18,51,175,0,128,0,0,178,178,107,0,0,128,0,128,118,94,0,192,192,192,80,80,80,0,114,255,0,255,0,0,255,255,255,0,0,209,0,172,255,255,0,255,255,255] \ No newline at end of file diff --git a/static/colors/VheridDusk.json b/static/colors/VheridDusk.json new file mode 100644 index 0000000..b89ab6c --- /dev/null +++ b/static/colors/VheridDusk.json @@ -0,0 +1 @@ +[10,10,10,4,81,140,93,109,6,12,79,76,142,40,0,131,0,52,235,136,0,128,109,99,48,38,45,0,176,238,166,176,0,12,187,160,206,73,1,160,3,7,255,183,77,242,247,230] \ No newline at end of file diff --git a/static/colors/VheridFallen.json b/static/colors/VheridFallen.json new file mode 100644 index 0000000..dad7151 --- /dev/null +++ b/static/colors/VheridFallen.json @@ -0,0 +1 @@ +[32,30,21,35,67,83,119,113,54,63,82,43,106,39,19,103,23,8,92,79,40,78,85,55,50,55,35,48,121,143,239,193,64,115,125,38,178,76,21,181,42,11,251,166,18,244,255,208] \ No newline at end of file diff --git a/static/colors/VheridFields.json b/static/colors/VheridFields.json new file mode 100644 index 0000000..296b051 --- /dev/null +++ b/static/colors/VheridFields.json @@ -0,0 +1 @@ +[17,11,22,39,68,92,107,104,25,62,116,102,92,37,20,98,24,6,141,85,12,79,67,58,51,44,39,47,172,199,190,188,39,157,220,133,175,59,20,164,36,6,224,164,4,235,222,198] \ No newline at end of file diff --git a/static/colors/VheridHeat.json b/static/colors/VheridHeat.json new file mode 100644 index 0000000..ac0bbd8 --- /dev/null +++ b/static/colors/VheridHeat.json @@ -0,0 +1 @@ +[23,11,11,57,75,69,125,111,16,81,122,78,110,44,13,116,30,4,156,92,8,98,74,40,71,52,27,66,176,182,199,192,26,170,222,108,186,66,13,176,42,4,228,168,2,238,224,181] \ No newline at end of file diff --git a/static/colors/VheridJade.json b/static/colors/VheridJade.json new file mode 100644 index 0000000..88828d0 --- /dev/null +++ b/static/colors/VheridJade.json @@ -0,0 +1 @@ +[17,11,9,46,73,94,108,107,37,92,99,58,118,42,27,174,44,59,114,85,57,69,60,49,42,30,27,76,136,158,195,193,61,112,161,108,175,101,47,171,66,30,203,154,69,219,214,156] \ No newline at end of file diff --git a/static/colors/VheridLaser.json b/static/colors/VheridLaser.json new file mode 100644 index 0000000..d91770d --- /dev/null +++ b/static/colors/VheridLaser.json @@ -0,0 +1 @@ +[10,10,0,0,51,33,136,109,53,9,131,19,98,32,12,74,14,3,132,78,7,56,64,35,41,39,2,40,112,53,239,193,64,35,202,55,175,59,20,165,33,3,233,171,4,204,239,115] \ No newline at end of file diff --git a/static/colors/VheridMatrix.json b/static/colors/VheridMatrix.json new file mode 100644 index 0000000..332f17f --- /dev/null +++ b/static/colors/VheridMatrix.json @@ -0,0 +1 @@ +[25,32,7,24,119,79,77,114,24,179,135,0,118,68,11,32,70,49,77,84,7,107,110,75,56,58,38,13,189,117,136,190,18,255,204,0,185,103,6,82,127,57,185,218,28,245,254,210] \ No newline at end of file diff --git a/static/colors/VheridMishka.json b/static/colors/VheridMishka.json new file mode 100644 index 0000000..3ba01ad --- /dev/null +++ b/static/colors/VheridMishka.json @@ -0,0 +1 @@ +[23,15,13,0,95,255,123,160,0,0,135,95,186,83,0,167,36,0,176,137,81,120,100,75,74,52,46,0,179,255,214,239,0,0,255,180,234,132,0,255,67,16,228,179,27,241,227,184] \ No newline at end of file diff --git a/static/colors/VheridMud.json b/static/colors/VheridMud.json new file mode 100644 index 0000000..21e47e4 --- /dev/null +++ b/static/colors/VheridMud.json @@ -0,0 +1 @@ +[32,30,21,35,67,83,119,113,54,68,84,21,137,54,14,132,103,34,92,79,40,78,85,55,50,55,35,48,121,143,173,164,94,118,139,32,188,74,19,204,160,54,251,166,18,255,252,227] \ No newline at end of file diff --git a/static/colors/VheridNatural.json b/static/colors/VheridNatural.json new file mode 100644 index 0000000..ff6642c --- /dev/null +++ b/static/colors/VheridNatural.json @@ -0,0 +1 @@ +[27,18,9,32,50,150,30,100,40,16,120,115,110,20,20,133,17,171,100,64,42,116,108,84,70,65,50,0,120,255,170,255,0,27,210,205,192,36,36,230,71,170,250,180,10,220,220,220] \ No newline at end of file diff --git a/static/colors/VheridSorrow.json b/static/colors/VheridSorrow.json new file mode 100644 index 0000000..3bd895e --- /dev/null +++ b/static/colors/VheridSorrow.json @@ -0,0 +1 @@ +[5,0,17,46,73,94,85,83,42,67,125,66,142,40,0,123,38,54,129,101,53,135,142,93,57,42,32,76,136,158,175,181,75,121,189,143,182,73,38,161,86,66,203,154,69,255,247,130] \ No newline at end of file diff --git a/static/colors/VheridWarm.json b/static/colors/VheridWarm.json new file mode 100644 index 0000000..b148261 --- /dev/null +++ b/static/colors/VheridWarm.json @@ -0,0 +1 @@ +[27,18,9,26,65,165,110,123,21,0,120,96,82,25,0,76,0,55,98,61,38,154,132,109,62,53,44,0,108,255,196,219,38,0,255,204,192,61,36,255,32,141,255,191,0,255,237,218] \ No newline at end of file diff --git a/static/colors/chroma.json b/static/colors/chroma.json index 5c5e074..8b4f7cf 100644 --- a/static/colors/chroma.json +++ b/static/colors/chroma.json @@ -1,18 +1,18 @@ -[ - 0, 0, 0, - 0, 0, 192, - 0, 128, 0, - 0, 112, 144, - 192, 0, 0, - 160, 0, 128, - 96, 96, 0, - 192, 192, 192, - 128, 128, 128, - 48, 48, 255, - 0, 208, 0, - 64, 208, 255, - 255, 48, 48, - 255, 64, 208, - 255, 255, 64, - 255, 255, 255 -] +[ + 0, 0, 0, + 0, 0, 192, + 0, 128, 0, + 0, 112, 144, + 192, 0, 0, + 160, 0, 128, + 96, 96, 0, + 192, 192, 192, + 128, 128, 128, + 48, 48, 255, + 0, 208, 0, + 64, 208, 255, + 255, 48, 48, + 255, 64, 208, + 255, 255, 64, + 255, 255, 255 +] diff --git a/static/colors/default.json b/static/colors/default.json index 05d59c4..40596fc 100644 --- a/static/colors/default.json +++ b/static/colors/default.json @@ -1,18 +1,18 @@ -[ - 32, 39, 49, - 0, 106, 255, - 68, 184, 57, - 114, 156, 251, - 212, 54, 85, - 176, 50, 255, - 217, 118, 65, - 170, 196, 178, - 128, 151, 156, - 48, 165, 255, - 144, 255, 79, - 168, 212, 255, - 255, 82, 82, - 255, 107, 255, - 255, 232, 102, - 255, 250, 232 -] +[ + 32, 39, 49, + 0, 106, 255, + 68, 184, 57, + 114, 156, 251, + 212, 54, 85, + 176, 50, 255, + 217, 118, 65, + 170, 196, 178, + 128, 151, 156, + 48, 165, 255, + 144, 255, 79, + 168, 212, 255, + 255, 82, 82, + 255, 107, 255, + 255, 232, 102, + 255, 250, 232 +] diff --git a/static/favicon.ico b/static/favicon.ico new file mode 100644 index 0000000..b506ccc Binary files /dev/null and b/static/favicon.ico differ diff --git a/static/js/params.js b/static/js/params.js new file mode 100644 index 0000000..9d3bd6a --- /dev/null +++ b/static/js/params.js @@ -0,0 +1,31 @@ +function getJsonFromUrl() { + var query = location.search.substr(1); + var result = {}; + var stored = localStorage.getItem("settings"); + if (stored) { + result = JSON.parse(stored); + } + query.split("&").forEach(function(part) { + var item = part.split("="); + var key = item[0].replace('-', '_'); + var val = item[1]; + + if (key !== 'nick') { // we want raw nicks + val = decodeURIComponent(val); + if (val === "false") { + val = false; + } + } + result[key] = val; + }); + return result; +} + +var params = getJsonFromUrl(); +console.log(JSON.stringify(params, null, 4)); + +if (params.store) { + delete params.store; + localStorage.setItem('settings', JSON.stringify(params)); +} + diff --git a/static/js/webfort.js b/static/js/webfort.js index 2f72a34..32233ed 100644 --- a/static/js/webfort.js +++ b/static/js/webfort.js @@ -3,6 +3,8 @@ * Copyright (c) 2014 mifki, ISC license. */ +/*jslint browser:true */ + // TODO: tag colors var colors = [ 32, 39, 49, @@ -23,31 +25,7 @@ var colors = [ 255, 250, 232 ]; -function getJsonFromUrl() { - var query = location.search.substr(1); - var result = {}; - var stored = localStorage.getItem("settings"); - if (stored) { - result = JSON.parse(stored) - } - query.split("&").forEach(function(part) { - var item = part.split("="); - var key = item[0].replace('-', '_'); - var val = item[1]; - - if (key !== 'nick') { // we want raw nicks - val = decodeURIComponent(val); - if (val === "false") { - val = false; - } - } - result[key] = val; - }); - return result; -} - -var params = getJsonFromUrl(); -console.log(JSON.stringify(params, null, 4)); +var MAX_FPS = 20; var host = params.host || document.location.hostname; var port = params.port || '1234'; @@ -56,13 +34,9 @@ var textSet = params.text || "ShizzleClean.png"; var colorscheme = params.colors || undefined; var nick = params.nick || ""; -if (params.store) { - delete params.store; - localStorage.setItem('settings', JSON.stringify(params)); -} - var wsUri = 'ws://' + host + ':' + port + '/' + nick; var active = false; +var lastFrame = 0; // Converts integer value in seconds to a time string, HH:MM:SS function toTime(n) { @@ -98,39 +72,39 @@ function setStatus(text, color, onclick) { function connect() { setStatus('Connecting...', 'orange'); - websocket = new WebSocket(wsUri); + websocket = new WebSocket(wsUri, ['WebFortress-v2.0', 'WebFortress-invalid']); websocket.binaryType = 'arraybuffer'; websocket.onopen = onOpen; websocket.onclose = onClose; websocket.onerror = onError; } -function fitCanvasToWindow() { - if (active) { - // FIXME: Canvas resizing meshes poorly with the chatbox. - //canvas.width = window.innerWidth & (~15); - //canvas.height = (window.innerHeight - 20) & (~15); - - var data = new Uint8Array([ - 112, - Math.floor(canvas.width / 16), - Math.floor(canvas.height / 16)]); - websocket.send(data); - } -} - function onOpen(evt) { setStatus('Connected', 'orange'); - fitCanvasToWindow(); websocket.send(new Uint8Array([115])); websocket.send(new Uint8Array([110])); websocket.onmessage = onMessage; } +var isError = false; function onClose(evt) { - setStatus('Disconnected. Click to retry.', 'red', connect); + console.log("Disconnect code #" + evt.code + ", reason: " + evt.reason); + console.log(isError); + if (isError) { + isError = false; + setStatus('Error connecting. Click to retry', 'red', connect); + } else if (evt.reason) { + setStatus(evt.reason + ' Click to try again.', 'red', connect); + } else { + setStatus('Unknown disconnect: Click to reconnect.', 'red', connect); + } +} + +function onError(ev) { + console.log("error triggered."); + isError = true; } function requestTurn() { @@ -141,7 +115,7 @@ function renderQueueStatus(isActive, activePlayer, players, timeLeft) { if (isActive) { active = true; setStatus("You're in charge now! Click here to end your turn.", 'green', requestTurn); - } else if (timeLeft === -1) { + } else if (activePlayer === "__NOBODY") { setStatus("Nobody is playing right now. Click here to ask for a turn.", 'grey', requestTurn); } else { var displayedName = activePlayer || "Somebody else"; @@ -160,8 +134,8 @@ function renderUpdate(ctx, data, offset) { var bg = data[k + 3] % 16; var fg = data[k + 4]; - var bg_x = ((bg % 4) * 256) + 15 * 16 - var bg_y = (Math.floor(bg / 4) * 256) + 15 * 16 + var bg_x = ((bg % 4) * 256) + 15 * 16; + var bg_y = (Math.floor(bg / 4) * 256) + 15 * 16; ctx.drawImage(cd, bg_x, bg_y, 16, 16, x * 16, y * 16, 16, 16); if (data[k + 3] & 64) { @@ -203,16 +177,10 @@ function onMessage(evt) { (data[4]<<16) | (data[5]<<24); + // FIXME: we shouldn't need resize data var neww = data[6] * 16; var newh = data[7] * 16; - // resizeCanvas - /* - if (neww != canvas.width || newh != canvas.height) { - canvas.width = neww; - canvas.height = newh; - } - */ - + var nickSize = data[8]; // this only works because we know the input is uri-encoded ascii var activeNick = ""; @@ -224,19 +192,18 @@ function onMessage(evt) { renderQueueStatus(isActive, activeNick, players, timeLeft); renderUpdate(ctx, data, nickSize+9); + var now = performance.now(); + var nextFrame = (1000 / MAX_FPS) - (now - lastFrame); + if (nextFrame < 4) { + websocket.send(new Uint8Array([110])); + } else { + setTimeout(function() { + websocket.send(new Uint8Array([110])); + }, nextFrame); + } + lastFrame = performance.now(); if (stats) { stats.end(); } - } else if (data[0] == 116) { - spectator = (data[1]==1 ? true : false); } - - setTimeout(function() { - websocket.send(new Uint8Array([110])); - }, 1000 / 30); -} - -function onError(ev) { - console.log(ev); - setStatus('Error', 'red'); } function colorize(img, cnv) { @@ -275,7 +242,6 @@ function init() { document.body.style.backgroundColor = 'rgb(' + colors[0] + ',' + colors[1] + ',' + colors[2] + ')'; - cd = document.createElement('canvas'); cd.width = cd.height = 1024; colorize(ts, cd); @@ -284,6 +250,8 @@ function init() { ct.width = ct.height = 1024; colorize(tt, ct); + lastFrame = performance.now(); + connect(); } @@ -334,7 +302,6 @@ if (colorscheme === undefined) { var cd, ct; - var canvas = document.getElementById('myCanvas'); document.onkeydown = function(ev) { @@ -342,9 +309,9 @@ document.onkeydown = function(ev) { return; if (ev.keyCode === 91 || - ev.keyCode === 18 || - ev.keyCode === 17 || - ev.keyCode === 16) { + ev.keyCode === 18 || + ev.keyCode === 17 || + ev.keyCode === 16) { return; } @@ -365,10 +332,26 @@ document.onkeypress = function(ev) { var mod = (ev.shiftKey << 1) | (ev.ctrlKey << 2) | ev.altKey; var data = new Uint8Array([111, 0, ev.charCode, mod]); - logCharCode(ev) + logCharCode(ev); websocket.send(data); ev.preventDefault(); }; -window.onresize = fitCanvasToWindow; + +function fitCanvasToParent() { + var maxw = canvas.parentNode.offsetWidth; + var maxh = canvas.parentNode.offsetHeight; + var aspectRatio = canvas.width / canvas.height; + + if (maxw / maxh < aspectRatio) { + canvas.style.width = maxw + 'px'; + canvas.style.height = ""; + } else { + canvas.style.width = ""; + canvas.style.height = maxh + 'px'; + } +} + +window.onresize = fitCanvasToParent; +window.onload = fitCanvasToParent; diff --git a/static/webfort.css b/static/webfort.css index a004ef3..eeed0f5 100644 --- a/static/webfort.css +++ b/static/webfort.css @@ -5,11 +5,11 @@ body { } .status { - height: 24px; - line-height: 24px; + height: 1.5em; + line-height: 1.5em; background-color: orange; color: white; - font-family: Verdana; + font-family: monospace; cursor: pointer; } @@ -58,35 +58,22 @@ body { .col-left { width: 75%; + height: 100vh; } .col-left.hide-chat { width: 100%; } -.col-left:before { - content: ""; - float: left; - /* - * Options include - * 80x60 == 4:3 == 1/0.75 - * 80x50 == 16:10 == 1/0.625 - * 80x45 == 16:9 == 1/0.5625 - * 80x40 == 2:1 == 1/0.5 - * 80x34 == 21:9~ == 1/0.425 - * 80x25 == 16:5 == 1/0.3125 (minimum) - */ - padding-bottom: 62.5%; -} - -.col-left:after { - content: ""; - display: table; - clear: both; +.canvas-container { + text-align: center; + position: absolute; + bottom: 0; + top: 0; + margin-top: 1.5em; + width: 100%; } canvas { - width: 100%; - height: 100%; + position: relative; } - diff --git a/static/webfort.html b/static/webfort.html index b9a23ce..ca9ed18 100644 --- a/static/webfort.html +++ b/static/webfort.html @@ -14,12 +14,15 @@
Loading...
-:--
- +
+ +
+