# &       !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~                                                                                                                                                                   ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h ijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~             !!!!!!!!!!!!!!!!!!!!!!"##################### # # # # ##############$$$$$ %!%"%#%$%%%&%'%(%)%*%+%,%-%.%/%0%1%2%3%4%5%6%7%8%9%:%;%<%=%>%?%@%A&B&C'D'E'F'G'H'I'J'K'L'M'N'O'P'Q'R'S'T'U'V'W'X'Y'Z'['\']'^'_'`(a(b(c(d(e(f(g(h(i(j(k(l(m(n(o(p(q(r(s(t(u(v(w(x(y(z({(|(}(~((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((()))) ) ) ) ) ))))))))))))))))))) )!)")#)$)%)&)')()))*)+),)-).)/)0)1)2)3)4)5)6)7)8)9):);)<)=)>)?)@*A*B*C*D*E*F*G*H*I*J*K*L*M*N*O*P*Q*R*S*T*U*V*W*X*Y*Z*[*\*]*^*_*`*a*b*c*d*e*f*g+h+i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,{,|,},~,,,,,,,,,,-------------------------.................................................////////////////////////////////////////////// / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / !/ "/ #/ $/ %/ &/ '/ (/ )/ */ +/ ,/ -/ ./ // 0/ 1/ 2/ 3/ 4/ 5/ 6/ 7/ 8/ 9/ :/ ;/ <0 =0 >0 ?0 @0 A0 B0 C0 D0 E0 F0 G0 H0 I0 J0 K0 L0 M0 N0 O0 P0 Q0 R0 S0 T0 U0 V0 W0 X0 Y0 Z0 [0 \0 ]0 ^0 _0 `0 a0 b0 c1 d1 e1 f1 g1 h1 i1 j1 k1 l1 m1 n1 o1 p1 q1 r1 s1 t1 u1 v1 w1 x1 y1 z1 {1 |1 }1 ~1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 !7 "7 #7 $7 %7 &7 '7 (7 )7 *7 +7 ,7 -7 .7 /7 07 17 27 37 47 57 67 77 87 97 :7 ;7 <7 =7 >7 ?7 @7 A7 B7 C7 D7 E7 F7 G7 H7 I7 J7 K7 L7 M7 N7 O7 P7 Q7 R7 S7 T7 U7 V7 W7 X7 Y7 Z7 [7 \7 ]7 ^7 _7 `7 a7 b7 c7 d7 e7 f7 g7 h8 i8 j8 k8 l8 m8 n8 o8 p8 q8 r8 s8 t8 u8 v8 w8 x8 y8 z8 {8 |8 }8 ~8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; !; "; #; $; %; &; '; (; ); *; +; ,; -; .; /; 0; 1; 2; 3; 4; 5; 6; 7; 8; 9; :; ;; <; =; >; ?; @; A; B; C; D; E; F< G< H< I< J< K< L< M< N< O< P< Q< R< S< T< U< V< W< X< Y< Z< [< \< ]< ^< _< `< a< b< c< d< e< f< g< h< i< j< k< l< m< n= o= p= q= r= s= t= u= v= w= x= y= z= {= |= }= ~= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = > > > > > > > > > ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ A A A A A A A A A A A A A A A A A A A A B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B !B "C #C $D %D &D 'D (D )D *D +D ,D -D .D /D 0D 1D 2D 3D 4D 5D 6D 7D 8D 9D :D ;D <D =D >D ?D @D AD BD CD DD ED FD GD HD ID JD KD LD MD ND OD PD QD RD SD TD UD VD WD XD YD ZD [D \D ]D ^D _D `D aD bD cD dD eD fD gD hE iE jE kE lE mE nE oE pE qE rE sE tE uE vE wE xE yE zE {E |E }E ~E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E F F F F F F F F F F F F G G G G G G G H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H I I I I I J J J J J J K K K K K K K K K K K K K K K K K K K K K K K K !K "K #K $K %K &K 'K (K )K *K +K ,L -L .L /L 0L 1L 2L 3L 4L 5L 6L 7L 8L 9L :L ;L <L =L >L ?L @L AL BM CM DN EN FO GO HO IO JO KO LO MO NO OO PO QO RO SO TO UO VO WO XO YO ZO [O \O ]O ^O _P `P aQ bQ cQ dQ eQ fQ gQ hQ iQ jQ kQ lQ mQ nQ oQ pQ qQ rQ sQ tQ uQ vQ wQ xQ yQ zQ {Q |Q }Q ~Q Q Q Q R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R RRSSSSSSSS S S S S SSSSSSSSSSSSSSTTTTT T!T"T#T$T%T&T'T(T)T*T+T,T-T.T/T0T1T2T3T4T5T6T7T8T9T:T;T<T=T>T?T@TATBTCTDTETFTGTHTITJTKULUMUNUOUPUQURVSVTVUVVVWVXVYVZV[V\V]V^V_V`VaVbVcWdWeWfWgWhWiWjWkWlWmWnWoWpWqWrWsXtXuXvXwXxXyXzX{X|X}X~XYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ \ ] ] ] ]]]]]]]]]]]]]]]]]]] ]!]"]#]$]%]&]'](])]*]+],]-].]/]0]1]2]3]4]5]6]7]8]9]:];]<]=]>]?]@]A]B]C]D]E]F]G]H]I]J]K]L]M]N]O]P^Q^R^S^T^U^V_W_X_Y_Z_[_\_]_^___`_a_b_c_d_e_f_g_h_i_j_k_l_m_n_o_p_q_r_s`t`uavawaxayaza{a|a}a~aaabbbbbbbbbbbbbbbbbbccccccccdddddeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeffffffffffffffffffffffffffffffffffffffffffffffffffffffffggggg g g g g ggggggggggggggggggg g!g"g#g$g%g&g'g(g)g*g+g,g-g.g/g0g1g2g3g4g5g6g7g8g9g:g;g<h=h>h?h@hAhBhChDhEhFhGhHhIhJhKhLhMhNhOhPhQhRhShThUhVhWhXhYiZi[i\i]i^i_i`iaibicidieifigihjijjjkjljmjnjojpjqjrjsjtjujvjwjxjyjzj{j|j}j~jjjkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkllllllllllllllllllllllllllllmmmmmmmmmmmmmmmmmmmmmmmnnnnnnn n n n n nnnnnnnooooooooooop p!p"p#p$p%p&p'p(p)p*p+p,p-p.p/p0p1p2p3p4p5p6p7p8p9p:p;p<p=q>q?q@qAqBqCqDqEqFqGqHqIqJqKqLqMqNqOqPqQqRqSqTqUqVqWqXqYqZq[q\q]q^q_q`qaqbqcqdqeqfqgqhqiqjqkqlqmqnqoqpqqqrqsqtquqvqwqxqyqzq{q|q}q~qqqqqrrrrrrrrrrrrrrrrrrrrrrrrrsssssssssssssssssssssssssssssssttttttttttttuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuvvvvvvvvvvvvvvvvvvvvv v v w w wwwwwwwwwwwwxxxxxxx x!x"x#x$x%x&x'x(x)x*x+x,y-y.y/y0y1y2y3y4y5y6y7y8y9y:y;y<y=y>z?z@zAzBzCzDzEzFzGzHzIzJzKzLzMzNzOzPzQzRzSzTzUzVzWzX{Y{Z{[{\{]{^{_{`{a{b{c{d{e{f{g{h{i{j{k{l{m{n{o{p{q{r{s{t{u{v{w{x|y|z|{|||}|~||||}}}}}}}}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~None"#$/8HVX_`gmwd LambdaHackShow and pack the result.e LambdaHackInteger division, rounding up.i LambdaHackIA version specialized to lists to avoid errors such as taking length of  Maybe [a] instead of [a]`. Such errors are hard to detect, because the type of elements of the list is not constrained.j LambdaHackGA version specialized to lists to avoid errors such as taking null of  Maybe [a] instead of [a]`. Such errors are hard to detect, because the type of elements of the list is not constrained.k LambdaHack Re-exported Y, but please give it explicit type to make it obvious if wrapping, etc., may occur. Use lz instead, if possible, because it fails instead of wrapping, etc. In general, it may wrap or otherwise lose information.l LambdaHack Re-exported , but please give it explicit type to make it obvious if wrapping, etc., may occur and to trigger optimization. In general, it may crash.o LambdaHackKThis has a more specific type (unit result) than normally, to catch errors.p LambdaHackKThis has a more specific type (unit result) than normally, to catch errors.v #'  (   )Z*+ ,-.M/=<  ;:0TYXWVU12345S67%$&N89nmlk:; !"<HK=>?@ABIJCNOPDEFGLMQRTUVWXYZ[\]^_`abcdefghijpoqrsuvwxyz{|}~ !"#$%&'()*+,-./0123456789>?@ABCDEFGHIJKLQPORS[\]^abcdefghijklmnop '  (   )Z*+ ,-.M/=<  ;:0TYXWVU12345S67%$&N89nlmk:; !"<HK=>?@ABIJCNOPDEFGLMQRTrsuvwxyz{|}~ !"#$%&()*,-/01346789>?@ABCDLRS[\]#-.6lkYZ[\]^_`abcdefj5EFGHIJKLQPO ghi !"#$%&'()*+,-./0123^:UVWXbcdefghijaklmnoppoqe7g4None"#$/45678PX_`gm( LambdaHackThe frequency distribution type. Not normalized (operations may or may not group the same elements and sum their frequencies). However, elements with zero frequency are removed upon construction.The Eq instance compares raw representations, not relative, normalized frequencies, so operations don't need to preserve the expected equalities. LambdaHack"give acces to raw frequency values LambdaHack!short description for debug, etc. LambdaHack(Uniform discrete frequency distribution. LambdaHackRTakes a name and a list of frequencies and items into the frequency distribution. LambdaHackMScale frequency distribution, multiplying it by a positive integer constant. LambdaHack,Test if the frequency distribution is empty.None"#$/8MX_`gmU LambdaHackqDice for rolling a pair of integer parameters pertaining to, respectively, the X and Y cartesian 2D coordinates. LambdaHackAbsolute depth in the dungeon. When used for the maximum depth of the whole dungeon, this can be different than dungeon size, e.g., when the dungeon is branched, and it can even be different than the length of the longest branch, if levels at some depths are missing. LambdaHackMultiple dice rolls, some scaled with current level depth, in which case the sum of all rolls is scaled in proportion to current depth divided by maximal dungeon depth.IThe simple dice should have positive number of rolls and number of sides.The Num instance doesn't have abs nor signuml defined, because the functions for computing infimum, supremum and mean dice results would be too costly. LambdaHack\Cast dice scaled with current level depth. When scaling, we round up, so that the value of 1  1 is 13 even at the lowest level, but so is the value of 1  depth.EThe implementation calls RNG as many times as there are dice rolls, which is costly, so content should prefer to cast fewer dice and then multiply them by a constant. If rounded results are not desired (often they are, to limit the number of distinct item varieties in inventory), another dice may be added to the result.>A different possible implementation, with dice represented as  Frequency, makes only one RNG call per dice, but due to lists lengths proportional to the maximal value of the dice, it's is intractable for 1000d1000 and problematic already for 100d100. LambdaHack/A die, rolled the given number of times. E.g., 1  2 rolls 2-sided die one time. LambdaHackYA die rolled the given number of times, with the result scaled with dungeon level depth. LambdaHackmA die, starting from zero, ending at one less than second argument, rolled the given number of times. E.g., 1  1 always rolls zero. LambdaHackA die, starting from zero, ending at one less than second argument, rolled the given number of times, with the result scaled with dungeon level depth. LambdaHack/Minimal and maximal possible value of the dice.divUp& in the implementation corresponds to ceiling, applied to results of meanDicee elsewhere in the code, and prevents treating 1d1-power effects (on shallow levels) as null effects. LambdaHackCMaximal value of dice. The scaled part taken assuming median level. LambdaHackCMinimal value of dice. The scaled part taken assuming median level. LambdaHackMean value of dice. The scaled part taken assuming median level, but not taking into account rounding up, and so too low, especially for dice small compared to depth. To fix this, depth would need to be taken as argument. LambdaHackMaximal value of DiceXY. LambdaHackMinimal value of DiceXY.None"#$/8X_`gmVNone"#$/78X_`gmX LambdaHack4Ring buffers of a size determined at initialization.None"#$/78X_`gmg  LambdaHack8current libfreetype6 default, thin, large letter spacing LambdaHack9mimics OTF, blurry, thick, tight tracking, accurate shape LambdaHackfilename, size, hinting mode LambdaHackextra cell extension LambdaHack,size ignored for bitmap fonts and no hinting LambdaHackZRe-exported English phrase creation functions, applied to our custom irregular word sets. LambdaHackZRe-exported English phrase creation functions, applied to our custom irregular word sets. LambdaHack Apply the WWandW1 constructor, first representing repetitions as  CardinalWs. The parts are not sorted, only grouped, to keep the order. The internal structure of speech parts is compared, not their string rendering, so some coincidental clashes are avoided (and code is simpler). LambdaHackmPersonal data directory for the game. Depends on the OS and the game, e.g., for LambdaHack under Linux it's ~/.LambdaHack/.None"#$/48MX_`gm' LambdaHackSpeed in meters per 1 million seconds (m/Ms). Actors at normal speed (2 m/s) take one time turn (0.5 s) to make one step (move one tile, which is 1 m by 1 m). LambdaHacktOne-dimentional vectors. Introduced to tell apart the 2 uses of Time: as an absolute game time and as an increment. LambdaHacksGame time in ticks. The time dimension. One tick is 1 microsecond (one millionth of a second), one turn is 0.5 s. LambdaHack5Start of the game time, or zero lenght time interval. LambdaHackThe smallest unit of time. Should not be exported and used elsewhere, because the proportion of turn to tick is an implementation detail. The significance of this detail is only that it determines resolution of the time dimension. LambdaHackAn infinitesimal time period. LambdaHackAt least once per clip all moves are resolved and a frame or a frame delay is generated. Currently one clip is 0.05 s, but it may change, and the code should not depend on this fixed value. LambdaHack|One turn is 0.5 s. The code may depend on that. Actors at normal speed (2 m/s) take one turn to move one tile (1 m by 1 m). LambdaHack7This many ticks fits in a single second. Do not export, LambdaHack'This many turns fit in a single second. LambdaHackgThis many clips fit in one turn. Determines the resolution of actor move sampling and display updates. LambdaHackjAbsolute time addition, e.g., for summing the total game session time from the times of individual games. LambdaHackuAbsolute time negation. To be used for reversing time flow, e.g., for comparing absolute times in the reverse order. LambdaHackSHow many time intervals of the latter kind fits in an interval of the former kind. LambdaHack^How many time intervals of the latter kind cover an interval of the former kind (rounded up). LambdaHack+Shifting an absolute time by a time vector. LambdaHackTime time vector between the second and the first absolute times. The arguments are in the same order as in the underlying scalar subtraction. LambdaHackAddition of time deltas. LambdaHackiSubtraction of time deltas. The arguments are in the same order as in the underlying scalar subtraction. LambdaHackReverse a time vector. LambdaHackScale the time vector by an Int scalar value. LambdaHack*Take the given percent of the time vector. LambdaHackDivide a time vector. LambdaHackfRepresent the main 10 thresholds of a time range by digits, given the total length of the time range. LambdaHack#Number of seconds in a mega-second. LambdaHack$Constructor for content definitions. LambdaHackKReadable representation of speed in the format used in content definitions.  LambdaHackCPretty-print speed given in the format used in content definitions.  LambdaHackThe minimal speed is half a meter (half a step across a tile) per second (two standard turns, which the time span during which projectile moves, unless it has modified linger value). This is four times slower than standard human movement speed.It needen't be lower, because rangeFromSpeedq gives 0 steps with such speed, so the actor's trajectory is empty, so it drops down at once. Twice that speed already moves a normal projectile one step before it stops. It shouldn't be lower or a slow actor would incur such a time debt for performing a single action that he'd be paralyzed for many turns, e.g., leaving his dead body on the screen for very long.  LambdaHackCFast walk speed (2 m/s) that suffices to move one tile in one turn.  LambdaHackLimp speed (1 m/s) that suffices to move one tile in two turns. This is the minimal speed for projectiles to fly just one space and drop. LambdaHack5Sword thrust speed (10 m/s). Base weapon damages, both melee and ranged, are given assuming this speed and ranged damage is modified accordingly when projectile speeds differ. Differences in melee weapon swing speeds are captured in damage bonuses instead, since many other factors influence total damage.Billiard ball is 25 m!s, sword swing at the tip is 35 ms, medieval bow is 70 ms, AK47 is 700 ms. LambdaHackModify damage when projectiles is at a non-standard speed. Energy and so damage is proportional to the square of speed, hence the formula. LambdaHackScale speed by a scalar value. LambdaHackSpeed addition. LambdaHackEThe number of time ticks it takes to walk 1 meter at the given speed. LambdaHackZCalculate projectile speed from item weight in grams and velocity percent modifier. See  =https://github.com/LambdaHack/LambdaHack/wiki/Item-statistics. LambdaHackGCalculate maximum range in meters of a projectile from its speed. See  =https://github.com/LambdaHack/LambdaHack/wiki/Item-statisticsz. With this formula, each projectile flies for at most 1 second, that is 2 standard turns, and then drops to the ground. LambdaHackBCalculate maximum range taking into account the linger percentage.-     -     None"#$/8X_`gm LambdaHackPSerialize and save data. Note that LBS.writeFile opens the file in binary mode.# LambdaHack;Serialize, compress and save data with an EOF marker. The OKn is used as an EOF marker to ensure any apparent problems with corrupted files are reported to the user ASAP.$ LambdaHack?Read, decompress and deserialize data with an EOF marker. The OK1 EOF marker ensures any easily detectable file corruption is discovered and reported before any value is decoded from the second component and before the file handle is closed. OTOH, binary encoding corruption is not discovered until a version check elswere ensures that binary formats are compatible.% LambdaHackTry to create a directory, if it doesn't exist. We catch exceptions in case many clients try to do the same thing at the same time.& LambdaHackTry to write a file, given content, if the file not already there. We catch exceptions in case many clients try to do the same thing at the same time.t_`#$%&None"#$/8X_`gmDZt_`#$%&#$%_&t` None"#$/78X_`gm' LambdaHackEOptions that affect the behaviour of the client (but not game rules).) LambdaHack/Font set chosen by the player for the whole UI.* LambdaHack6The scale applied to all fonts, resizing the whole UI.+ LambdaHack*Available fonts as defined in config file., LambdaHack.Available font sets as defined in config file.- LambdaHack5Whether to start in fullscreen mode and in which one.. LambdaHackEHow much to log (e.g., from SDL). 1 is all, 5 is errors, the default./ LambdaHackMaximal frames per second. This is better low and fixed, to avoid jerkiness and delays that tell the player there are many intelligent enemies on the level. That's better than scaling AI sofistication down based on the FPS setting and machine speed.0 LambdaHack8Never auto-answer all prompts, even if under AI control.1 LambdaHackDon't show any animations.2 LambdaHack,Start a new game, overwriting the save file.3 LambdaHack7Don't create directories and files and show time stats.5 LambdaHack"Prefix of the save game file name.6 LambdaHack)Whether to use the stdout/stdin frontend.7 LambdaHack/Whether to use null (no input/output) frontend.8 LambdaHack:Whether to use lazy (output not even calculated) frontend.9 LambdaHack&Show clients' internal debug messages.@ LambdaHack*Kinds of fullscreen or windowed mode. See  Qhttps://hackage.haskell.org/package/sdl2-2.5.3.0/docs/SDL-Video.html#t:WindowMode.A LambdaHack%a normal window instead of fullscreenB LambdaHackZfake fullscreen; window the size of the desktop; this is the preferred one, if it worksC LambdaHack(real fullscreen with a video mode changeD LambdaHack Default value of client options.'(3)*+,-./012456789:;<=>?@ABCD@ABC'(3)*+,-./012456789:;<=>?D None"#$/4568PX_`gm]O LambdaHackLA strategy is a choice of (non-empty) frequency tables of possible actions.Currently, the way we use it, the list could have at most one element (we filter out void frequencies early and only ever access the first). except for the argument of  mapStrategyMu, which may even be process to the end of the list, if no earlier strategies can be transformed into non-null ones.Q LambdaHackUStrategy where only the actions from the given single frequency table can be picked.R LambdaHackTStrategy with the actions from both argument strategies, with original frequencies.S LambdaHack Strategy with no actions at all.T LambdaHack Conditionally accepted strategy.U LambdaHackStrategy with all actions not satisfying the predicate removed. The remaining actions keep their original relative frequency values.V LambdaHackcWhen better choices are towards the start of the list, this is the best frequency of the strategy.W LambdaHackLike *, but pick a name of the single frequency. OPQRSTUVWX OPQRSTUVWXR2T3 None"#$/8X_`gma LambdaHackFractional chance.b LambdaHack6The monad of computations with random generator state.c LambdaHackKGet a random object within a (inclusive) range with a uniform distribution.d LambdaHackGenerate random , in [0, x] range.e LambdaHack$Generate a random integral value in [0, x] range, where x is within Int32.The limitation to Int32B values is needed to keep it working on signed types. In package random\, a much more complex scheme is used to keep it working for arbitrary fixed number of bits.f LambdaHack Get a random  using full range.g LambdaHack1Get any element of a list with equal probability.h LambdaHackHGenerates a random permutation. Naive, but good enough for small inputs.i LambdaHack@Generates a random permutation, except for the existing mapping.j LambdaHack5Gen an element according to a frequency distribution.k LambdaHack6Randomly choose an item according to the distribution.l LambdaHackGive True., with probability determined by the fraction.m LambdaHack*Cast dice scaled with current level depth.n LambdaHack5Cast dice scaled with current level depth and return True$ if the results is greater than 50.o LambdaHack<Cast dice, scaled with current level depth, for coordinates.abcdefghijklmnopqbcdefghijalmnopqk None"#$/78MX_`gmIX"r LambdaHack+AI and UI hints about the role of the item. LambdaHackDoctrine of non-leader actors. Apart of determining AI operation, each doctrine implies a skill modifier, that is added to the non-leader skills defined in  fskillsOther field of Player. LambdaHack;if enemy nearby, attack, if no items, etc., explore unknown LambdaHack:always follow leader's target or his position if no target LambdaHack/follow but don't do any item management nor use LambdaHackonly melee and do ranged combat LambdaHackonly melee (or wait) LambdaHack.always only wait, even if enemy in melee range LambdaHack9if enemy nearby, attack, if no items, etc., roam randomly LambdaHackdfind an open and uncrowded area, patrol it according to sight radius and fallback temporarily to TRoamO when enemy is seen by the faction and is within the actor's sight radius LambdaHack,These flags correspond to the last cases of Flag~ and addtionally to all the universal circumstances of item activation, under which every item activates (even if vacuusly). LambdaHack5From here on, all items affected regardless of their  content. LambdaHackItem flag aspects. LambdaHackas a projectile, break at target tile, even if no hit; also, at each periodic activation a copy is destroyed and all other copies require full cooldown (timeout) LambdaHack#drop at target tile, even if no hit LambdaHack)don't break even when hitting or applying LambdaHack;AI and UI flag: consider equipping (may or may not have r#, e.g., if the benefit is periodic) LambdaHack-AI and UI flag: the item is not meant to harm LambdaHackAI and UI flag: don't risk identifying by use; also, can't throw or apply if not calm enough; also may be used for UI flavour or AI hints LambdaHack'the item is an explosion blast particle LambdaHackitem is a condition (buff or de-buff) of an actor and is displayed as such, not activated at death; this differs from belonging to the  CONDITIONg group, which doesn't guarantee any behaviour or display, but governs removal by items that drop  CONDITION LambdaHack&at most one copy can ever be generated LambdaHack9once identified, the item is known until savefile deleted LambdaHackoverride: the effects on this item are considered minor and so possibly not causing identification on use, and so this item will identify on pick-up LambdaHackloverride: don't show question marks by weapons in HUD even when unidentified item with this flag equipped LambdaHackQmeleeing with the item is permitted and so the item activates when meleed with LambdaHackat most one of any copies without cooldown (timeout) activates each turn; the cooldown required after activation is specified in TimeoutC (or is zero); the initial cooldown can also be specified as  TimerDice in  CreateItem effect; uniquely, this activation never destroys a copy, unless item is fragile; all this happens only for items in equipment or organs; kinetic damage is not applied LambdaHackactivates when non-projectile actor with this item as equipment or organ is under ranged attack; kinetic damage is not applied LambdaHackactivates when non-projectile actor with this item as equipment or organ is under melee attack; kinetic damage is not applied LambdaHackStrength of particular skills. This is cumulative from actor organs and equipment and so pertain to an actor as well as to items.This representation is sparse, so better than a record when there are more item kinds (with few skills) than actors (with many skills), especially if the number of skills grows as the engine is developed. It's also easier to code and maintain.JThe tree is by construction sparse, so the derived equality is semantical. LambdaHackCActor and faction skills. They are a subset of actor aspects. See ? for documentation. LambdaHack0FOV radius, where 1 means a single tile FOV area LambdaHackintended to reflect how many items granting complete invulnerability are among organs and equipment; this is not strength of deflection nor duration, etc. LambdaHack see abovegrstuvwxyz{|}~grstuvwxyz{|}~ None"#$/78FMX_`gm\2 LambdaHackOptimized representation of . LambdaHack)Character to display, with its attribute.  LambdaHack0Text attributes: foreground color and highlight.  LambdaHackforeground colour  LambdaHack highlight  LambdaHackaAdditional map cell highlight, e.g., a colorful square around the cell or a colorful background.sNote: the highlight underscored by the terminal cursor is the maximal element of this type present of this screen. LambdaHack)Colours supported by the major frontends.- LambdaHack3The default colours, to optimize attribute setting.. LambdaHackAA helper for the terminal frontends that display bright via bold./ LambdaHackColour sets. Sorted.0 LambdaHackColour sets. Sorted.1 LambdaHackColour sets. Sorted.2 LambdaHackColour sets. Sorted.D LambdaHack@Translationg to heavily modified Linux console color RGB values.1Warning: SDL frontend sadly duplicates this code.F LambdaHack5The default attribute, to optimize attribute setting.Q      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRQ !"#$%&'()*+,-./0123456789:;<=>?@ABCD     EFGHIJKLMNOPQRNone"#$/78MX_`gmpm LambdaHacka leader's storen LambdaHackleader's organso LambdaHackall party's itemsp LambdaHack+not items, but determined by leader's itemsq LambdaHack2not party's items, but all known generalized itemsr LambdaHack/places; not items at all, but definitely a lores LambdaHack2scenarios; not items at all, but definitely a loret LambdaHackItem slot and lore categories.{ LambdaHackActor's item stores. LambdaHack)Content identifiers for the content type c. LambdaHack[Rarity on given depths. The first element of the pair is normally in (0, 10] interval and, e.g., if there are 20 levels, 0.5 represents the first level and 10 the last. Exceptionally, it may be larger than 10, meaning appearance in the dungeon is not possible under normal circumstances and the value remains constant above the interval bound. LambdaHack6For each group that the kind belongs to, denoted by a  GroupNamer in the first component of a pair, the second component of a pair shows how common the kind is within the group. LambdaHack+Y xpacial dimension for points and vectors. LambdaHack+X spacial dimension for points and vectors.+ijklmnopqrstuvwxyz{|}~+{|}~tuvwxyzlmnopqrsijkNone"#$/8X_`gm[ LambdaHack<Verified and preprocessed content data of a particular kind. LambdaHackContent element at given id. LambdaHack9The id of the unique member of a singleton content group. LambdaHackAPick a random id belonging to a group and satisfying a predicate. LambdaHackFold strictly over all content a. LambdaHackFold over the given group only. LambdaHackSize of content a. LambdaHack-name of the content itme, used for validation LambdaHack5frequency in groups, for validation and preprocessing LambdaHack-validate a content item and list all offences LambdaHackEvalidate the whole defined content of this type and list all offence LambdaHackall content of this type LambdaHack&singleton group names for this content LambdaHack&remaining group names for this contentNone"#$/8X_`gm{  LambdaHack.The type of game rules and assorted game data. LambdaHacktitle of the game (not lib) LambdaHackCmaximum level width; for now, keep equal to ScreenContent.rwidth LambdaHackImaximum level height; for now, keep equal to ScreenContent.rheight - 3 LambdaHackversion of the game LambdaHackname of the UI config file LambdaHack#the default UI settings config file LambdaHack&game saved that often (not on browser) LambdaHack'server switches leader level that often LambdaHackname of the scores file LambdaHack'what is a close distance between actors LambdaHackHwords that can't be dropped from stair name as it goes through levels LambdaHack$Catch invalid rule kind definitions.None"#$/78X_`gmj  LambdaHackEnumeration representation of Point. LambdaHack2D points in cartesian representation. Coordinates grow to the right and down, so that the (0, 0) point is in the top-left corner of the screen. Coordinates are never negative. LambdaHackSThis is a hack to pass the X size of the dungeon, defined in game content, to the Enum instances of Point and Vector. This is already slower and has higher allocation than hardcoding the value, so passing the value explicitly to a generalization of the EnumQ conversions is out of the question. Perhaps this can be done cleanly and efficiently at link-time via Backpack, but it's probably not supported yet by GHCJS (not verified). For now, we need to be careful never to modify this array, except for setting it at program start before it's used for the first time. Which is easy, because Point1 is never mentioned in content definitions. The  PrimArray has much smaller overhead than IORef3 and reading from it looks cleaner, hence its use. LambdaHack9The distance between two points in the chessboard metric. LambdaHack.Squared euclidean distance between two points. LambdaHack\Checks whether two points are adjacent on the map (horizontally, vertically or diagonally). LambdaHack=Bresenham's line algorithm generalized to arbitrary starting eps (eps value of 0 gives the standard BLA). Skips the source point and goes through the second point to the edge of the level. Gives Nothing2 if the points are equal. The target is given as Point to permit aiming out of the level, e.g., to get uniform distributions of directions for explosions close to the edge of the level. LambdaHack=Bresenham's line algorithm generalized to arbitrary starting eps (epsn value of 0 gives the standard BLA). Includes the source point and goes through the target point to infinity. LambdaHackSee  Rhttp://roguebasin.roguelikedevelopment.org/index.php/index.php?title=Digital_lines. LambdaHackzA list of all points on a straight vertical or straight horizontal line between two points. Fails if no such line exists.None"#$/78X_`gm LambdaHackEnumeration representation of Vector. LambdaHack2D vectors in cartesian representation. Coordinates grow to the right and down, so that the (1, 1) vector points to the bottom-right corner of the screen. LambdaHack8Tells if a vector has length 1 in the chessboard metric. LambdaHackReverse an arbirary vector. LambdaHackNThe lenght of a vector in the chessboard metric, where diagonal moves cost 1. LambdaHack/Squared euclidean distance between two vectors. LambdaHackTVectors of all unit moves in the chessboard metric, clockwise, starting north-west. LambdaHackHVectors of all cardinal direction unit moves, clockwise, starting north. LambdaHackHVectors of all diagonal direction unit moves, clockwise, starting north. LambdaHack'Checks that a point belongs to an area. LambdaHack=All (8 at most) closest neighbours of a point within an area. LambdaHackHAll (4 at most) cardinal direction neighbours of a point within an area.  LambdaHackTranslate a point by a vector.  LambdaHackFTranslate a point by a vector, but only if the result fits in an area.  LambdaHack1A list of points that a list of vectors leads to. LambdaHackHA list of points that a list of vectors leads to, bounded by level size. LambdaHack:The vector between the second point and the first. We have -shift pos1 (pos2 `vectorToFrom` pos1) == pos2LThe arguments are in the same order as in the underlying scalar subtraction. LambdaHack+A list of vectors between a list of points. LambdaHackRotate a vector by the given angle (expressed in radians) counterclockwise and return a unit vector approximately in the resulting direction. LambdaHackGiven a vector of arbitrary non-zero length, produce a unit vector that points in the same direction (in the chessboard metric). Of several equally good directions it picks one of those that visually (in the euclidean metric) maximally align with the original vector. LambdaHack_Given two distinct positions, determine the direction (a unit vector) in which one should move from the first in order to get closer to the second. Ignores obstacles. Of several equally good directions (in the chessboard metric) it picks one of those that visually (in the euclidean metric) maximally align with the vector between the two points. LambdaHacklimit the search to this area LambdaHackposition to find neighbours of LambdaHacklimit the search to this area LambdaHackposition to find neighbours of"     "     None"#$/78MX_`gm) LambdaHackItem container type." LambdaHackfor bootstrapping actor bodies# LambdaHack/A unique identifier of an actor in the dungeon.$ LambdaHackAbstract level identifiers.% LambdaHack+A unique identifier of a faction in a game.& LambdaHack.A unique identifier of an item in the dungeon.  !"#$%& &%$# !"None"#$/18>HVX_`gmtB LambdaHackArrays indexed by Point.M LambdaHack Array lookup.O LambdaHack5Construct an array updated with the association list.P LambdaHack*Create an array from a replicated element.R LambdaHackFold right over an array.S LambdaHack"Fold right strictly over an array.T LambdaHack!Fold left strictly over an array.U LambdaHackSFold left strictly over an array (function applied to each element and its index).V LambdaHackTFold right strictly over an array (function applied to each element and its index).W LambdaHack(Fold monadically strictly over an array.X LambdaHackMap over an array.Y LambdaHackCMap over an array (function applied to each element and its index).Z LambdaHackgMap monadically over an array (function applied to each element and its index) and ignore the results.[ LambdaHackbYield the point coordinates of all the minimum elements of the array. The array may not be empty.\ LambdaHackcYield the point coordinates of the first maximum element of the array. The array may not be empty.] LambdaHackcYield the point coordinates of the first maximum element of the array. The array may not be empty.^ LambdaHackbYield the point coordinates of the last maximum element of the array. The array may not be empty.BCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_GHIJBCDEFLMNOPQRSTUVWXYZ[\]^_KNone"#$/78MX_`gmcg LambdaHackBPerception indexed by faction identifier. This can't be added to  FactionDict3, because clients can't see it for other factions.h LambdaHack<Perception of a single faction, indexed by level identifier.i LambdaHack=The type representing the perception of a faction on a level.m LambdaHackSmelled positions.p LambdaHackVisible positions.s LambdaHack.The set of tiles visible by at least one hero.t LambdaHack,The set of tiles smelt by at least one hero.ghijklmnopqrstuvwxpqrmnoijklhgstuvwxNone"#$/8X_`gm LambdaHackkCoordinates of the big square fonts. These are not game map coordinates, because the latter are offset by  mapStartY and represented by Point. LambdaHack UI screen coordinates, independent of whether square or monospace fonts are being placed on the screen (though square fonts are never placed on odd coordinates). These are not game map coordinates, becuse UI is larger and more fine-grained than just the game map. LambdaHack.The row where the dungeon map starts, both in PointUI and  PointSquare coordinates.  None"#$/8SX_`gm; LambdaHackA series of screen lines with start positions at which they should be overlayed over the base frame or a blank screen, depending on context. The position point is represented as in integer that is an index into the frame character array. The lines either fit the width of the screen or are intended for truncation when displayed. The start positions of lines may fall outside the length of the screen, too, unlike in  SingleFrame". Then they are simply not shown. LambdaHack9Line of colourful text. End of line characters forbidden. LambdaHack;String of colourful text. End of line characters permitted. LambdaHackSplit a string into lines. Avoids breaking the line at a character other than space. Remove space characters from the starts and ends of created lines. Newlines are respected.Note that we only split wrt White space, nothing else, and the width, in the first argument, is calculated in characters, not in UI (mono font) coordinates, so that taking and dropping characters is performed correctly.66None"#$/78MX_`gm, LambdaHackThe history of reports. This is a ring buffer of the given length containing old archived history and two most recent reports stored separately. LambdaHackEThe set of messages, with repetitions, to show at the screen at once. LambdaHack"The type of a single game message. LambdaHackthe colours and characters of the message to be shown on the screen; not just text, in case there was some colour not coming from the message class LambdaHack,the same to be saved in the message log only  LambdaHackIf only one of the message components is non-empty and non-whitespace, but its count is zero, the message is considered empty.  LambdaHackEmpty set of messages.  LambdaHack5Test if the list of non-whitespace messages is empty.  LambdaHack%Add a message to the start of report. LambdaHack*Render a report as a (possibly very long) X. Filter out messages not meant for display, unless not showing, but saving to history. LambdaHack*Render a report as a (possibly very long) . LambdaHack*Empty history of the given maximal length. LambdaHackuAdd a message to the new report of history, eliminating a possible duplicate and noting its existence in the result. LambdaHack@Add a newline to end of the new report of history, unless empty. LambdaHack}Archive old report to history, filtering out messages with 0 duplicates and prompts. Set up new report with a new timestamp. LambdaHacksRender history as many lines of text. New report is not rendered. It's expected to be empty when history is shown.q     q     None"#$/78X_`gmGDT LambdaHack,Key, modifier and position of mouse pointer.X LambdaHackKey and modifier.\ LambdaHackOur own encoding of modifiers.c LambdaHack0Frontend-independent datatype to represent keys.v LambdaHack3a keypad key for a character (digits and operators)w LambdaHacka single printable characterx LambdaHack function keyy LambdaHackleft mouse button pressedz LambdaHackmiddle mouse button pressed{ LambdaHackright mouse button pressed| LambdaHackleft mouse button released} LambdaHackmiddle mouse button released~ LambdaHackright mouse button released LambdaHackmouse wheel rotated north LambdaHackmouse wheel rotated south LambdaHack+an unknown key, registered to warn the user LambdaHack Common and terse names for keys. LambdaHack#Show a key with a modifier, if any. LambdaHackbConfigurable event handler for the direction keys. Used for directed commands such as close door. LambdaHack5Binding of both sets of movement keys, vi and laptop. LambdaHackTranslate key from a GTK string description to our internal key type. To be used, in particular, for the command bindings and macros in the config file.See ;https://github.com/twobob/gtk-/blob/master/gdk/keynames.txt LambdaHack2Translate key from a Web API string description ( Mhttps://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key#Key_valuesf) to our internal key type. To be used in web frontends. The argument says whether Shift is pressed.YTUVWXY[Z\ab`]^_cwlmfoxgdehijknpqrstuvyz{|}~Ycwlmfoxgdehijknpqrstuvyz{|}~\ab`]^_XY[ZTUVWNone"#$/8X_`gmN LambdaHack<The type of areas. The bottom left and the top right points. LambdaHack/Checks if it's an area with at least one field. LambdaHack'Checks that a point belongs to an area. LambdaHack7Shrink the given area on all fours sides by the amount.  None"#$/78MX_`gmTv LambdaHack.Statistics of past events concerning an actor. LambdaHack*Labels of individual kill count analytics. LambdaHackIStatistics of possible and actual generation of items for each lore kind. LambdaHack#Analytics data for each live actor. LambdaHack(Summary analytics data for each faction.None"#$/78X_`gm] LambdaHackRDescription of how item manipulation is triggered and communicated to the player. LambdaHack)Abstract syntax of human player commands.R LambdaHackThis triple of command categories, description and the command term itself defines the meaning of a human command as entered via a keypress, mouse click or chosen from a menu.S LambdaHackSymbolic representation of areas of the screen used to define the meaning of mouse button presses relative to where the mouse points to. :9     !"#$%&'()*+,-./012345678;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnobcdefghijklmnSTUVWXYZ[\]^_`aoRNOPQ :9     !"#$%&'()*+,-./012345678;<=>?@ABCDEFGHIJKLMNone"#$/78X_`gmg LambdaHackyOptions that affect the UI of the client, specified in the config file. More documentation is in the default config file. LambdaHack'HP percent at which warning is emitted. LambdaHackgPrefixes of message class constructor names paired with colors. The first prefix that matches, wins. LambdaHack+Hardwired commandline arguments to process.None"#$/8X_`gmo  LambdaHack&Screen layout and features definition. LambdaHack screen width LambdaHack screen height LambdaHack*wrap messages after this number of columns LambdaHack%an extra blurb line for the main menu LambdaHackGthe intro screen (first help screen) text and the rest of the manual LambdaHackverbs to use for apply actions LambdaHack!embedded game-supplied font files LambdaHack$Catch invalid rule kind definitions.  None"#$/8SX_`gm LambdaHackjA frame that is padded to fill the whole screen with an optional overlay to display in proportional font.Note that we don't provide a list of color-highlighed box positions to be drawn separately, because overlays need to obscure not only map, but the highlights as well, so highlights need to be included earlier. LambdaHackA simpler variant of  PreFrames3. LambdaHackA simpler variant of  PreFrame3. LambdaHackWSequence of screen frames, including delays. Potentially based on a single base frame. LambdaHackkComponents of a frame, before it's decided if the first can be overwritten in-place or needs to be copied. LambdaHack9A frame, that is, a base frame and all its modifications. LambdaHack<Action that results in a base frame, to be modified further. LambdaHackEfficiently composable representation of an operation on a frame, that is, on a mutable vector. When the composite operation is eventually performed, the vector is frozen to become a . LambdaHackColor mode for the display. LambdaHacknormal, with full colours LambdaHackblack and white only LambdaHack[Representation of an operation of overwriting a frame with a single line at the given row. LambdaHack7Truncate the overlay: for each line, if it's too long, it's truncated and if there are too many lines, excess is dropped and warning is appended. The width, in the second argument, is calculated in characters, not in UI (mono font) coordinates, so that taking and dropping characters is performed correctly. LambdaHackAdd a space at the message end, for display overlayed over the level map. Also trim (do not wrap!) too long lines. Also add many spaces when under longer lines. LambdaHackOverlays either the game map only or the whole empty screen frame. We assume the lines of the overlay are not too long nor too many. None"#$/8X_`gm: LambdaHackwRaw frontend definition. The minimal closed set of values that need to depend on the specifics of the chosen frontend. LambdaHack&Start up a frontend on a bound thread.xIn fact, it is started on the very main thread, via a hack, because apparently some SDL backends are not thread-safe ( &https://wiki.libsdl.org/FAQDevelopment; "this should only be run in the thread that initialized the video subsystem, and for extra safety, you should consider only doing those things on the main thread in any case") and at least the newer OS X obtusely requires the main thread, see  4https://github.com/AllureOfTheStars/Allure/issues/79 In case any other exotic architecture requires the main thread, we make the hack the default for all (on frontends that require a bound thread, e.g., SLD2 or GTK). LambdaHackEmpty the keyboard channel. LambdaHack)Translates modifiers to our own encoding.  !None"#$/8PX_`gmY  LambdaHackAnimation is a list of frame modifications to play one by one, where each modification if a map from positions to level map symbols. LambdaHack+Render animations on top of a screen frame.Located in this module to keep  Animation abstract. LambdaHackGAttack animation. A part of it also reused for self-damage and healing. LambdaHackShort attack animation. LambdaHack!Attack that hits through a block. LambdaHackAttack that is blocked. LambdaHack,Attack that is subtle (e.g., damage dice 0). LambdaHack$Death animation for an organic body. LambdaHackGDeath animation for an organic body, short version (e.g., for enemies). LambdaHackMark actor location animation. LambdaHackActor teleport animation. LambdaHack$Terrain feature vanishing animation. LambdaHack1Swap-places animation, both hostile and friendly."None"#$/8X_`gm LambdaHack2Description of default screen layout and features.#None"#$/8X_`gm LambdaHack;Bindings and other information about human player commands. LambdaHackbinding of keys to commands LambdaHack:the properly ordered list of commands for the help menu LambdaHackand from commands to their keys LambdaHackDKey-command mappings to be specified in content and used for the UI. LambdaHackpCreate binding of keys to movement and other standard commands, as well as commands defined in the config file. LambdaHackUI client options LambdaHack%default key bindings from the content LambdaHackconcrete binding'     '     $None"#$/8X_`gm LambdaHack4Operations for all content types, gathered together.%None"#$/78HMSVX_`gm & LambdaHack3State of legality of moves between adjacent points.+ LambdaHack6Weighted distance between points along shortest paths./ LambdaHackQThe minimal distance value assigned to paths that don't enter any unknown tiles.0 LambdaHackThe distance value that denotes no legal path between points, either due to blocked tiles or pathfinding aborted at earlier tiles, e.g., due to unknown tiles.1 LambdaHackMaximum value of the type.2 LambdaHackThe distance value that denotes that path search was aborted at this tile due to too large actual distance and that the tile was unknown. It is also a true distance value for this tile.4 LambdaHackCreate and fill a BFS array for the given level. Unsafe array operations are OK here, because the intermediate values of the vector don't leak anywhere outside nor are kept unevaluated and so they can't be overwritten by the unsafe side-effect.When computing move cost, we assume doors openable at no cost, because other actors use them, too, so the cost is shared and the extra visiblity is valuable, too. We treat unknown tiles specially. Whether suspect tiles are considered openable depends on  smarkSuspect.KInstead of a BFS queue (list) we use the two tabs (arrays), for (JS) speed.5 LambdaHackIFind a path, without the source position, with the smallest length. The eps coefficient determines which direction (of the closest directions available) that path should prefer, where 0 means north-west and 1 means north. The path tries hard to avoid actors and tries to avoid tiles that need altering and ambient light. Actors are avoided only close to the start of the path, because elsewhere they are likely to move before they are reached. Even projectiles are avoided, which sometimes has the effect of choosing a safer route (regardless if the projectiles are friendly fire or not).<An unwelcome side effect of avoiding actors is that friends will sometimes avoid displacing and instead perform two separate moves, wasting 1 turn in total (only if they had opposed direction of their goals; unlikely). But in corridors they will still displace and elsewhere this scenario was quite rare already.6 LambdaHack>Access a BFS array and interpret the looked up distance value. !"#$%&'()*+,-./01234567+&'()*./014 !"#$%56,-237&None"#$/8X_`gmA LambdaHack,Description of default key-command bindings.eIn addition to these commands, mouse and keys have a standard meaning when navigating various menus.ABAB'None"#$/78X_`gmC LambdaHackThe type of item flavours. LambdaHack*how fancy should the colour description be LambdaHackthe colour of the flavourF LambdaHack%Turn a colour set into a flavour set.G LambdaHack%Turn a colour set into a flavour set.H LambdaHack%Turn a colour set into a flavour set.I LambdaHack%Turn a colour set into a flavour set.J LambdaHack%Turn a colour set into a flavour set.K LambdaHack%Turn a colour set into a flavour set.L LambdaHack,Get the underlying base colour of a flavour.M LambdaHack%Construct the full name of a flavour.N LambdaHack4Human-readable names for item colors. The plain set.O LambdaHack4Human-readable names for item colors. The fancy set.P LambdaHack5Human-readable names for item colors. The liquid set.Q LambdaHack:Human-readable names for item colors. The plain glass set.R LambdaHack:Human-readable names for item colors. The fancy glass set. LambdaHack+Human-readable names for story item colors.S LambdaHack8Simple names for team colors (bright colours preferred).CDEFGHIJKLMNOPQRSCDFGHIJKLMNOSEPQR(None"#$/78X_`gmyO` LambdaHackkParameters modifying a throw of a projectile or flight of pushed actor. Not additive and don't start at 0.b LambdaHack,fly with this percentage of base throw speedc LambdaHack"fly for this percentage of 2 turnsd LambdaHackstart flight with this many HPe LambdaHackpSpecification of how to randomly roll a timer at item creation to obtain a fixed timer for the item's lifetime.t LambdaHackeEffects of items. Can be invoked by the item wielder to affect another actor or the wielder himself.Various effects of an item kind are all groupped in one list, at the cost of conditionals, sequences, etc., to ensure brevity and simplicity of content definitions. Most effects fire regardless of activation kind (the only exceptions are OnSmash and  OnCombine effects) so the deviations, handled via the conditionals, are rare and the definitions remain simple. Whether an item can be activated in any particular way, OTOH, is specified via simple flags elsewhere, again, by default, assuming that most activations are possible for all.u LambdaHackburn with this damagev LambdaHack&explode producing this group of blastsw LambdaHack%modify HP of the actor by this amountx LambdaHack'modify Calm of the actor by this amounty LambdaHackchange actor's allegiancez LambdaHack$make actor susceptible to domination{ LambdaHack$put actor to sleep, also calming him| LambdaHack2make the actor yell/yawn, waking him and others up} LambdaHack/summon the given number of actors of this group~ LambdaHack&ascend to another level of the dungeon LambdaHackescape from the dungeon LambdaHack!paralyze for this many game clips LambdaHack.paralyze for this many game clips due to water LambdaHack/give actor this many extra tenths of actor move LambdaHack*teleport actor across rougly this distance LambdaHack{create an item of the group and insert into the store with the given random timer; it cardinality not specified, roll it LambdaHackDdestroy some items of the group from the store; see below about Ints LambdaHackConsumeItems toUse toDestroy uses items matching toUse (destroys non-durable, without invoking OnSmash effects; applies normal effects of durable, without destroying them; the same behaviour as when transforming terrain using items) and destroys items matching  toDestroyP, invoking no effects, regardless of durability; the items are taken from CGround (but not from CEqp), preferring non-durable (since durable can harm when used and may be more vauable when destroyed); if not all required items are present, no item are destroyed; if an item belongs to many groups in the sum of toUse and  toDestroy , it counts for all (otherwise, some orders of destroying would succeed, while others would not); even if item durable, as many copies are needed as specified, not just one applied many times; items are first destroyed and then, if any copies left, applied LambdaHackmake the actor drop items of the given group from the given store; the first integer says how many item kinds to drop, the second, how many copies of each kind to drop; for non-organs, beware of not dropping all kinds, or cluttering store with rubbish becomes beneficial LambdaHack~reduce the cooldown period of this number of discharged items in the victim's equipment and organs by this dice of game clips; if the result is negative, set to 0, instantly recharging the item; starts with weapons with highest raw damage in equipment, then among organs, then non-weapons in equipment and among organs; beware of exploiting for healing periodic items LambdaHackJincrease the cooldown period of this number of fully recharged items in the victim's equipment and organs by this dice of game clips; starts with weapons with highest raw damage in equipment, then among organs, then non-weapons in equipment and among organs; beware of exploiting for hunger inducing and similar organs LambdaHackget a suitable (i.e., numerous enough) non-unique common item stack on the floor and polymorph it to a stack of random common items, with current depth coefficient LambdaHackget a suitable (i.e., with any random aspects) single item (even unique) on the floor and change the random bonuses of the items randomly, with maximal depth coefficient LambdaHackEexactly duplicate a single non-unique, non-valuable item on the floor LambdaHackXfind a suitable (i.e., not identified) item, starting from the floor, and identify it LambdaHack/detect something on the map in the given radius LambdaHack.send an actor flying (push or pull, depending) LambdaHack push an actor LambdaHack pull an actor LambdaHackremove all smell on the level LambdaHack1try to trigger a single random effect of the list LambdaHackKtrigger, with equal probability, one of the effects that don't end with UseDud LambdaHackBtrigger the effect when item smashed (not when applied nor meleed) LambdaHack;trigger the effect only when the actor explicitly desires to combine items or otherwise subtly tinker with an item or a tile, e.g., craft items from other items in a workshop; in particular, don't trigger the effects when entering a tile; trigger exclusively the effects when activating walkable terrain LambdaHack,apply the effect to the user, not the victim LambdaHacknothing happens, UseDud, no description LambdaHack*only fire second effect if first activated LambdaHack.only fire second effect if first not activated LambdaHack(fire all effects in order; always suceed LambdaHack]if condition not met, fail without a message; better avoided, since AI can't value it well LambdaHackYif condition met, fail without a message; better avoided, since AI can't value it well LambdaHackCconditional effect; better avoided, since AI can't value it well LambdaHack`a sentence with the actor causing the effect as subject, the given texts as the verb and the ending of the sentence (that may be ignored when the message is cited, e.g., as heard by someone) that is emitted when an activation causes an item to expire; no spam is emitted if a projectile; the ending is appended without a space in-between LambdaHackas  VerbNoLonger4 but that is emitted whenever the item is activated; LambdaHackas VerbMsg, but a failed effect (returns UseId) LambdaHackAspects of items. Aspect AddSkill is additive (starting at 0) for all items wielded by an actor and it affects the actor. The others affect only the item in question, not the actor carrying it, and so are not additive in any sense. LambdaHack1specifies the cooldown before an item may be applied again; if a copy of an item is applied manually (not via periodic activation), all effects on a single copy of the item are disabled until the copy recharges for the given time expressed in game turns; all copies recharge concurrently LambdaHackbonus to a skill; in content, avoid boosting skills such as SkApply via permanent equipment, to avoid micromanagement through swapping items among party members before each skill use LambdaHack item feature LambdaHack,extra label of the item; it's not pluralized LambdaHackparameters modifying a throw LambdaHack.until identified, presents as this unique kind LambdaHack+AI and UI flag that leaks item intended use LambdaHackPif level-scaled dice roll > 50, pick the former aspects, otherwise the latter LambdaHackItem properties that are fixed for a given kind of items. Of these, aspects and effects are jointly called item powers. Note that this type is mutually recursive with t and . LambdaHack map symbol LambdaHack%generic name; is pluralized if needed LambdaHackfrequency within groups LambdaHackpossible flavours LambdaHackcreated in that quantity LambdaHackrarity on given depths LambdaHackthe verb for hitting LambdaHackweight in grams LambdaHackbasic kinetic damage LambdaHackaffect the actor continuously LambdaHack cause the effects when triggered LambdaHack!accompanying organs and equipment LambdaHack description LambdaHackWhether the effect has a chance of exhibiting any potentially noticeable behaviour, except when the item is destroyed or combined. We assume at least one of OneOf effects must be noticeable. LambdaHack6Whether a non-nested effect always applies raw damage. LambdaHackpWhether an item is damaging. Such items may trigger embedded items and may collide with bursting items mid-air. LambdaHack$Catch invalid item kind definitions. LambdaHackValidate all item kinds.`abcdefghijklmnopqrst|uvwxyz{}~t|uvwxyz{}~nopqrsfghijklme`abcd)None"#$/8X_`gm  LambdaHackSMarks whether projectiles are permitted to trigger the tile transformation action. LambdaHack#All possible terrain tile features.  LambdaHackninitially an item of this group is embedded; we assume the item has effects and is supposed to be triggered  LambdaHack6goes from a closed to closed or open tile when altered  LambdaHack5goes from an open to open or closed tile when altered  LambdaHack,alters tile, but does not change walkability  LambdaHackalters tile, as before, using up all listed items from the ground and equipment; the list never empty; for simplicity, such tiles are never taken into account when pathfinding LambdaHack2when hidden, looks as the unique tile of the group LambdaHackCwhen generating, may be transformed to the unique tile of the group LambdaHackBwhen generating in opening, can be revealed to belong to the group LambdaHackEwhen generating in solid wall, can be revealed to belong to the group LambdaHackactors can walk through LambdaHackactors can see through LambdaHack is not lit with an ambient light LambdaHack#initial items often generated there LambdaHack(initial items very often generated there LambdaHack$initial actors often generated there LambdaHackno items ever generated there LambdaHackno actors ever generated there LambdaHackKeven if otherwise uninteresting, taken into account for triggering by AI LambdaHack,used for visible trails throughout the level LambdaHackin place normal legend and in override, don't roll a tile kind only once per place, but roll for each position; one non-spicy (according to frequencies of non-spicy) and at most one spicy (according to their frequencies) is rolled per place and then, once for each position, one of the two is semi-randomly chosen (according to their individual frequencies only) LambdaHack(The type of kinds of terrain tiles. See Tile.hs9 for explanation of the absence of a corresponding type Tile that would hold particular concrete tiles in the dungeon. Note that tile names (and any other content names) should not be plural (that would lead to "a stairs"), so "road with cobblestones" is fine, but "granite cobblestones" is wrong.,Tile kind for unknown space has the minimal  ContentId index. The talter for unknown space is 1' and no other tile kind has that value.! LambdaHack map symbol" LambdaHackshort description# LambdaHackfrequency within groups$ LambdaHack map color% LambdaHackmap color when not in FOV& LambdaHackminimal skill needed to activate embeds and, in case of big actors not standing on the tile, to alter the tile in any way' LambdaHackproperties; order matters. LambdaHackValidate a single tile kind.0 LambdaHackValidate all tile kinds.We don't check it any more, but if tiles look the same on the map (symbol and color), their substantial features should be the same, too, unless there is a good reason they shouldn't. Otherwise the player has to inspect manually all the tiles with this look to see if any is special. This tends to be tedious. Note that tiles may freely differ wrt text blurb, dungeon generation rules, AI preferences, etc., whithout causing the tedium.6      !"#$%&'()*+,-./0123456789:6-*),+( !"#$%&'     :3456789.0/21*None"#$/78X_`gmD LambdaHack)The choice of a fence type for the place.E LambdaHack'put a solid wall fence around the placeF LambdaHack+leave an empty space, like the room's floorG LambdaHack,leave an empty space, like the cave's groundH LambdaHack1skip the fence and fill all with the place properI LambdaHackA method of filling the whole area (except for CVerbatim and CMirror, which are just placed in the middle of the area) by transforming a given corner.J LambdaHack8reflect every other corner, overlapping 1 row and columnK LambdaHack6fill symmetrically 4 corners and stretch their bordersL LambdaHack7tile separately and symmetrically quarters of the placeM LambdaHack7just build the given interior, without filling the areaN LambdaHack6build the given interior in one of 4 mirrored variantsO LambdaHackDParameters for the generation of small areas within a dungeon level.Q LambdaHacka symbolR LambdaHack%short description, singular or pluralS LambdaHackfrequency within groupsT LambdaHackrarity on given depthsU LambdaHack(how to fill whole place using the cornerV LambdaHack(whether to fence place with solid borderW LambdaHack(plan of the top-left corner of the placeX LambdaHackdark legend overrideY LambdaHacklit legend override[ LambdaHackwCatch invalid place kind definitions. In particular, verify that the top-left corner map is rectangular and not empty.\ LambdaHackValidate all place kinds.@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]OPQRSTUVWXY]IJKLMNDEFGH@ABCZ[\+None"#$/8X_`gm̡g LambdaHackThe name of the frontend.h LambdaHack%Set up the frontend input and output. LambdaHack&Output to the screen via the frontend.ghhg,None"#$/8X_`gm֓i LambdaHack(Session data maintained by the frontend.} LambdaHackThe name of the frontend.~ LambdaHack:Set up and start the main loop providing input and output.Because of Windows and OS X, SDL2 needs to be on a bound thread, so we can't avoid the communication overhead of bound threads. LambdaHackAdd a frame to be drawn. LambdaHack)Translates modifiers to our own encoding. LambdaHackfrontend session data LambdaHackthe screen frame to draw LambdaHacke.g., game screen size LambdaHackclient options LambdaHackfrontend session data LambdaHackthe screen frame to drawijklmnopqrstuvwxyz{|}~~}|ijklmnopqrstuvwxyz{None"#$/8X_`gm9}~~}-None"#$&'/8HSX_`gmY LambdaHack[Machinery allocated for an individual frontend at its startup, unchanged for its lifetime. LambdaHackConnection channel between a frontend and a client. Frontend acts as a server, serving keys, etc., when given frames to display. LambdaHackUThe instructions sent by clients to the raw frontend, indexed by the returned value. LambdaHack Show a frame. LambdaHack.Perform an explicit delay of the given length. LambdaHack5Flush frames, display a frame and ask for a keypress. LambdaHackTell if a keypress is pending. LambdaHack#Discard a key in the queue, if any. LambdaHackDiscard all keys in the queue. LambdaHackAdd a key to the queue. LambdaHack7Set in the frontend that it should auto-answer prompts. LambdaHackShut the frontend down. LambdaHackTake screenshot. LambdaHack@Initialize the frontend chosen by the player via client options. LambdaHack The name of the chosen frontend..None"#$/8X_`gm N, LambdaHack{Parameters for the generation of dungeon levels. Warning: for efficiency, avoid embedded items in any of the common tiles. LambdaHacka symbol LambdaHackshort description LambdaHackfrequency within groups LambdaHack minimal X size of the whole cave LambdaHack minimal Y size of the whole cave LambdaHack"size of a map cell holding a place LambdaHack#minimal size of places; for merging LambdaHack#maximal size of places; for growing LambdaHack9the odds a place is dark (level-scaled dice roll > 50) LambdaHack:the odds the cave is dark (level-scaled dice roll > 50) LambdaHack!a proportion of extra connections LambdaHack,at most this proportion of rooms may be void LambdaHack"the chance of a door in an opening LambdaHackif there's a door, is it open? LambdaHack"if not open, hidden one in n times LambdaHack"the lower, the more monsters spawn LambdaHackactor groups to consider LambdaHack#number of initial items in the cave LambdaHackitem groups to consider LambdaHackplace groups to consider LambdaHack$are passable default tiles permitted LambdaHackwaste of time for AI to explore LambdaHackthe default cave tile LambdaHackthe dark cave corridor tile LambdaHackthe lit cave corridor tile LambdaHackthe tile used for FWall fence LambdaHacktile used for the fence corners LambdaHackthe outer fence N wall LambdaHackthe outer fence E wall LambdaHackthe outer fence S wall LambdaHackthe outer fence W wall LambdaHack are places touching fence banned LambdaHackthe dark place plan legend LambdaHackthe lit place plan legend LambdaHackminimal distance between stairs LambdaHackmaximum number of stairs LambdaHackescape groups, if any LambdaHackplace groups for created stairs LambdaHackextra groups for inherited LambdaHack(which faction starting positions to skip LambdaHackfull cave description LambdaHackCatch caves with not enough space for all the places. Check the size of the cave descriptions to make sure they fit on screen. Etc. LambdaHack}Validate all cave kinds. Note that names don't have to be unique: we can have several variants of a cave with a given name.00/None"#$/78MX_`gmA. LambdaHackleader switching between levels is automatically done by the server and client is not permitted to change to leaders from other levels (the frequency of leader level switching done by the server is controlled by RuleKind.rleadLevelClips); if the flag is False, server still does a subset of the automatic switching, e.g., when the old leader dies and no other actor of the faction resides on his level, but the client (particularly UI) is expected to do changes as well LambdaHackclient is discouraged from leader switching (e.g., because non-leader actors have the same skills as leader); server is guaranteed to switch leader within a level very rarely, e.g., when the old leader dies; if the flag is False, server still does a subset of the automatic switching, but the client is expected to do more, because it's advantageous for that kind of a faction LambdaHackIf a faction with LeaderUI and LeaderAI has any actor, it has a leader. LambdaHack5faction can have no leader, is whole under AI control LambdaHackleader under AI control LambdaHack!leader under UI control, assumes fhasUI LambdaHack"Properties of a particular player. LambdaHackname of the player LambdaHacklnames of actor groups that may naturally fall under player's control, e.g., upon spawning or summoning LambdaHackYfixed skill modifiers to the non-leader actors; also summed with skills implied by  fdoctrine (which is not fixed) LambdaHack!the player can escape the dungeon LambdaHack(the faction declared killed if no actors LambdaHackscore polynomial for the player LambdaHackwhether actors have gender LambdaHackPnon-leaders behave according to this doctrine; can be changed during the game LambdaHack the mode of switching the leader LambdaHackIdoes the faction have a UI client (for control or passive observation) LambdaHackFConditional polynomial representing score calculation for this player. LambdaHackOutcome of a game. LambdaHack$the player escaped the dungeon alive LambdaHack(the player won by eliminating all rivals LambdaHack(the faction lost the game in another way LambdaHackthe faction was eliminated LambdaHack#game is restarted; the quitter quit LambdaHackgame is supended LambdaHack7Team continuity index. Starting with 1, lower than 100. LambdaHack/The specification of players for the game mode. LambdaHackYplayers in the particular team and levels, numbers and groups of their initial members LambdaHackthe initial enmity matrix LambdaHackthe initial aliance matrix LambdaHack5Requested cave groups for particular level intervals.  LambdaHackGame mode specification.  LambdaHacka symbol  LambdaHackshort description  LambdaHackfrequency within groups  LambdaHack'whether to show tutorial messages, etc.  LambdaHackplayers taking part in the game  LambdaHackarena of the game  LambdaHack[messages displayed at each particular game ends; if message empty, the screen is skipped  LambdaHack rules note  LambdaHack description  LambdaHack"why/when the mode should be played  LambdaHack'hints in case player faces difficulties  LambdaHack)Catch invalid game mode kind definitions.  LambdaHackChecks, in particular, that there is at least one faction with fneverEmpty or the game would get stuck as soon as the dungeon is devoid of actors.  LambdaHack"Validate game mode kinds together.K                       K                       0None"#$/78X_`gmK < LambdaHack[Partial information about an item, deduced from its item kind. These are assigned to each . The kmConsty flag says whether the item's aspect record is constant rather than random or dependent on item creation dungeon level. > LambdaHack3whether the item doesn't need second identification ? LambdaHack,mean value of item's possible aspect records @ LambdaHackWRecord of skills conferred by an item as well as of item flags and other item aspects. < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y @ A B C D E F G H < = > ? I L J K N O P Q R S T U V W X Y M1None"#$/8X_`gmR" c LambdaHackA map morally indexed by ContentId TileKind. e LambdaHackRA lot of tabulated maps from tile kind identifier to a property of the tile kind. } LambdaHackGMap from an item kind identifier to the mean aspect value for the kind. ~ LambdaHack4Operations for all content types, gathered together.7 c d e f g h i j k l m n o p q r s t u v w x y z { | } ~  7 ~  } e f g h i j k l m n o p q r s t u v w x y z { | c d 2None"#$/8X_`gm]]  LambdaHack6Repeatedly save serialized snapshots of current state. Running with -N2 ca reduce  Max pause from 0.2s to 0.01s and bytes copied during GC$ 10-fold, but framerate nor the frequency of not making a backup save are unaffected (at standard backup settings), even with null frontend, because saving takes so few resources. So, generally, backup save settings are relevant only due to latency impact on very slow computers or in JS.  LambdaHackhRestore a saved game, if it exists. Initialize directory structure and copy over data files, if needed. 3None"#$/8X_`gm_  LambdaHackRead and parse UI config file.  LambdaHack&Modify client options with UI options.  4None"#$/78X_`gm~  LambdaHackThe difficulty level influencess HP of either the human player or the AI. The challenges restrict some abilities of the human player only.  LambdaHack)game difficulty level (HP bonus or malus)  LambdaHack-cold fish challenge (no healing from enemies)  LambdaHack)ready goods challenge (crafting disabled)  LambdaHack1lone wolf challenge (only one starting character)  LambdaHack1finder keeper challenge (ranged attacks disabled)  LambdaHackCurrent game status.  LambdaHackcurrent game outcome  LambdaHackdepth of the final encounter  LambdaHacknew game group to start, if any  LambdaHackGDiplomacy states. Higher overwrite lower in case of asymmetric content.  LambdaHackThe faction datatype.  LambdaHackindividual name  LambdaHackcolor of actors or their frames  LambdaHack the player spec for this faction  LambdaHack6identity of this faction across games and scenarios  LambdaHackinitial actors  LambdaHackdiplomatic standing  LambdaHackcause of game end/exit  LambdaHackFthe leader of the faction; don't use in place of sleader on clients  LambdaHack9level and position of faction's shared inventory stash  LambdaHackmembers killed  LambdaHack=members killed in the past, by game mode and difficulty level  LambdaHack8All factions in the game, indexed by faction identifier.  LambdaHack;Tell whether the faction consists of summoned horrors only.YHorror player is special, for summoned actors that don't belong to any of the main players of a given game. E.g., animals summoned during a skirmish game between two hero factions land in the horror faction. In every game, either all factions for which summoning items exist should be present or a horror player should be added to host them.  LambdaHack/Check if factions are at war. Assumes symmetry. LambdaHack/Check if factions are allied. Assumes symmetry.  LambdaHackGCheck if factions are allied or are the same faction. Assumes symmetry.0 0 5None"#$/78MX_`gmC  LambdaHack1A dictionary from game mode IDs to scores tables.  LambdaHack(The list of scores, in decreasing order.  LambdaHackA single score record. Records are ordered in the highscore table, from the best to the worst, in lexicographic ordering wrt the fields below. LambdaHack the score LambdaHack)game time spent (negated, so less better) LambdaHack"date of the last game interruption LambdaHackreason of the game interruption LambdaHackchallenge setup of the game LambdaHackname of the faction's gplayer LambdaHack allies lost LambdaHack foes killed  LambdaHackEmpty score table  LambdaHackqInsert a new score into the table, Return new table and the ranking. Make sure the table doesn't grow too large.  LambdaHack&Register a new score in a score table.  LambdaHackIShow a single high score, from the given ranking in the high score table.  LambdaHack old table LambdaHack the total value of faction items LambdaHack the total value of dungeon items LambdaHackgame time spent LambdaHackreason of the game interruption LambdaHack current date LambdaHackchallenge setup LambdaHackname of the faction's gplayer LambdaHack allies lost  LambdaHack foes killed  LambdaHack%number of (3-line) scores to be shown LambdaHackcurrent score table LambdaHack*position of the current score in the table LambdaHackthe name of the game mode 6None"#$/8X_`gm  LambdaHackRequests that take game time.  LambdaHack.Possible forms of requests sent by UI clients.  LambdaHackvRequests sent by UI clients to the server. If faction leader is to be changed, it's included as the second component.  LambdaHack.Possible forms of requests sent by AI clients.  LambdaHackvRequests sent by AI clients to the server. If faction leader is to be changed, it's included as the second component.                   7None"#$/78MPX_`gmF  LambdaHackZAll items in the dungeon (including those carried by actors), indexed by item identifier.  LambdaHackA bag of items, e.g., one of the stores of an actor or the items on a particular floor position or embedded in a particular map tile.  LambdaHackNumber of items in a bag, together with recharging timer, in case of items that need recharging, exists only temporarily or auto-activate at regular intervals. Data invariant: the length of the timer should be less or equal to the number of items.  LambdaHackThe absolute level's local time at which an item's copy becomes operational again. Even if item is not identified and so its timeout unknown, it's enough to compare this to the local level time to learn whether an item is recharged.This schema causes timeout jumps for items in stash, but timeout is reset when items move, so this is a minor problem. Global time can't be used even only for items in stash, or exploit would be possible when an actor on a desolate level waits to recharge items for actors on a busy level. It's probably impossible to avoid such exploits or, otherwise, timeout jumps, particularly for faction where many actors move on many levels and so an item in stash is not used by a single actor at a time.  LambdaHackoThe fields are, in order: 1. whether the item should be kept in equipment (not in stash) 2. the total benefit from picking the item up (to use or to put in equipment) 3. the benefit of applying the item to self 4. the (usually negative, for him) value of hitting a foe in melee with it 5. the (usually negative, for him) value of flinging the item at an opponent  LambdaHackThe map of item kind indexes to identifiers of items that have that kind. Used to update data about items when their kinds become known, e.g., AI item use benefit data.  LambdaHackThe map of item kind indexes to item kind ids. The full map, as known by the server, is 1-1. Because it's sparse and changes, we don't represent it as an (unboxed) vector, until it becomes a bottleneck (if ever, likely on JS, where only vectors are fast). " LambdaHackFull information about an item. ) LambdaHackThe secret part of the information about an item. If a faction knows the aspect record of the item, this is the complete secret information. Items that don't need second identification (the kmConst} flag is set) may be identified or not and both cases are OK (their display flavour will differ and that may be the point). , LambdaHackAn index of the kind identifier of an item. Clients have partial knowledge how these idexes map to kind ids. They gain knowledge by identifying items. The indexes and kind identifiers are 1-1. - LambdaHackPThe map of item ids to item aspect record. The full map is known by the server. . LambdaHackEither the explicit obvious kind of the item or the kind it's hidden under, with the details covered under the index indirection. 1 LambdaHackGame items in actor possesion or strewn around the dungeon. The information contained in this time is available to the player from the moment the item is first seen and is never mutated.'Some items are not created identified (IdentityCovered). Then they are presented as having a template kind that is really not their own, though usually close. Full kind information about item's kind is available through the  ItemKindIx index once the item is identified and full information about the value of item's aspect record is available elsewhere (both IdentityObvious and IdentityCoveredC items may or may not need identification of their aspect record). 3 LambdaHack&the kind of the item, or an indiretion 4 LambdaHack)the faction that created the item, if any 5 LambdaHack~flavour, always the real one, not hidden; people may not recognize shape, but they remember colour and old vs fancy look I LambdaHackDamage calculation. The armor and hurt skills are additive. They can't be multiplicative, because then 100% armor would minimize damage regardless of even 200% hurt skill. However, additive skills make the relative effectiveness of weapons dependent on the enemy, so even with -100% hurt skill a kinetic weapon can't be removed from the list, because an enemy may have negative armor skill. This is bad, but also KISS.<               ! " # & $ % ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M< 1 2 3 4 5 . / 0 , ) * + " # & $ % ' ( ! -               6 7 8 9 : < = > ? @ A B C E F G H I J K M ; D L8None"#$/8X_`gm r LambdaHackCWhether a tile does not block vision. Essential for efficiency of FOV, hence tabulated. s LambdaHackUWhether a tile has ambient light --- is lit on its own. Essential for efficiency of  Perception, hence tabulated. t LambdaHack4Whether a tile is a good hideout: walkable and dark. u LambdaHack_Whether actors can walk into a tile. Essential for efficiency of pathfinding, hence tabulated. v LambdaHackdWhether a tile is a door, open or closed. Essential for efficiency of pathfinding, hence tabulated. w LambdaHack1Whether a tile kind (specified by its id) has an OpenTo feature. x LambdaHack0Whether a tile kind (specified by its id) has a CloseTo feature. y LambdaHackWhether a tile is changable. LambdaHack-Whether a tile is modifiable with some items. z LambdaHackUWhether a tile is suspect. Essential for efficiency of pathfinding, hence tabulated. } LambdaHackWhether one can easily explore a tile, possibly finding a treasure, either spawned there or dropped there by a (dying from poison) foe. Doors can't be explorable since revealing a secret tile should not change it's explorable status. Also, door explorable status should not depend on whether they are open or not, so that a foe opening a door doesn't force us to backtrack to explore it. Still, a foe that digs through a wall will affect our exploration counter and if content lets walls contain threasure, such backtraking makes sense.  LambdaHack1Whether a tile kind (specified by its id) has an OpenTo. feature or is walkable even without opening.  LambdaHack*Whether a tile kind has the given feature.+ h i j k l m n o p q r s t u v w x y z { | } ~  + o r s t u v y z { | } ~  w x h i j k l m n p q9None"#$/8X_`gm  LambdaHack&Possible causes of failure of request.8 8 :None"#$/8X_`gm,  LambdaHack+A view on single, inhabited dungeon level.  RememberedC fields carry a subset of the info in the client copies of levels.  LambdaHack,the kind of cave the level is an instance of  LambdaHackabsolute depth of the level  LambdaHack#remembered items lying on the floor  LambdaHack%remembered items embedded in the tile  LambdaHackqseen big (non-projectile) actors at positions on the level; could be recomputed at resume, but small enough  LambdaHackLseen projectiles at positions on the level; could be recomputed at resume  LambdaHackremembered level map  LambdaHackroom entrances on the level  LambdaHackarea of the level  LambdaHackremembered smells on the level  LambdaHackpositions of (up, down) stairs  LambdaHackpositions of IK.Escape tiles  LambdaHack currently remembered clear tiles  LambdaHack total number of explorable tiles  LambdaHack)local time on the level (possibly frozen)  LambdaHack(whether the level is covered in darkness  LambdaHackEntries of places on the map.  LambdaHackCurrent smell on map tiles.  LambdaHackTile kinds on the map.  LambdaHack0Collections of projectiles located on map tiles.  LambdaHack Big actors located on map tiles.  LambdaHackItems located on map tiles.  LambdaHack?The complete dungeon is a map from level identifiers to levels.  LambdaHackFLevels in the current branch, one level up (or down) from the current.  LambdaHackXCompute the level identifier and stair position on the new level, after a level change.FWe assume there is never a staircase up and down at the same position.  LambdaHack Query for tile kinds on the map.  LambdaHack%Try to find a random position on the map satisfying conjunction of the mandatory and an optional predicate. If the permitted number of attempts is not enough, try again the same number of times without the next optional predicate, and fall back to trying with only the mandatory predicate.  LambdaHackGenerate a list of all passable points on (connected component of) the level in the order of path distance from the starting position (BFS). The starting position needn't be passable and is always included.  LambdaHacklevel of the stairs LambdaHackposition of the stairs LambdaHackoptional forced direction LambdaHackcurrent game dungeon LambdaHackpossible destinations  LambdaHackthe number of tries LambdaHacklook up in this level LambdaHackmandatory predicate LambdaHackoptional predicates  LambdaHackthe number of tries LambdaHacklook up in this level LambdaHackmandatory predicate LambdaHackoptional predicates LambdaHackgood to have pred. LambdaHackworst case predicates0 0 ;None"#$/78PX_`gmW  LambdaHack5All actors on the level, indexed by actor identifier.  LambdaHackRepresentation of recent changes to HP of Calm of an actor. This is reset every time the actor perfoms an action, so this is aggregated over actor turn (move), not time turn. The resource changes recorded in the tuple are, respectively, negative and positive.  LambdaHackresource change this move  LambdaHackresource change previous move  LambdaHack:Actor attributes that are changing throughout the game. If they appear to be dublets of aspects from actor kinds, e.g. HP, they may be results of casting the dice specified in their respective actor kind and/or may be modified temporarily, but return to the original value from their respective kind over time.9Other properties of an actor, in particular its current aspects, are derived from the actor's trunk, organs and equipment. A class of the aspects, the boolean ones, are called flags. Another class are skills. Stats are a subclass that determines if particular actions are permitted for the actor (or faction).  LambdaHack#the trunk organ of the actor's body  LambdaHack>continued team character identity index number in this game  LambdaHackcurrent hit points * 1M  LambdaHackHP delta this turn * 1M  LambdaHackcurrent calm * 1M  LambdaHackcalm delta this turn * 1M  LambdaHackcurrent position  LambdaHackprevious position, if any  LambdaHack current level  LambdaHack&faction the actor currently belongs to  LambdaHack8trajectory the actor must travel and his travel speed  LambdaHackorgans  LambdaHackpersonal equipment  LambdaHack&number of weapons among eqp and organs  LambdaHack$number of benign items among weapons  LambdaHack!state of the actor's watchfulness  LambdaHackMis a projectile? affects being able to fly through other projectiles, etc. ( LambdaHack8The speed from organs and gear; being pushed is ignored. , LambdaHackProjectile that ran out of steam or collided with obstacle, dies. Even if it pierced through an obstacle, but lost its payload while altering the obstacle during piercing, it dies, too. . LambdaHack3Check if actor calm enough to perform some actions.yIf max Calm is zero, always holds, to permit removing disastrous equipped items, which would otherwise be stuck forever. 1 LambdaHack:Has the skill and can wake up easily, so can sleep safely. 2 LambdaHackSCan't loot, not too aggresive, so sometimes prefers to sleep instead of exploring. 8 LambdaHackChance that a new monster is generated. Depends on the number of monsters already present, and on the level depth and its cave kind. 9 LambdaHack5How long until an actor's smell vanishes from a tile.9                           ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 99                          ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7  8 9<None"#$/8X_`gmr F LambdaHack#View on the basic game state. The  remembered fields, in client copies of the state, carry only a subset of the full information that the server keeps. Clients never directly change their State~, but apply atomic actions sent by the server to do so (and/or the server applies the actions to each client state in turn). LambdaHackremembered dungeon LambdaHack(absolute dungeon depth for item creation LambdaHack remembered actors in the dungeon LambdaHackremembered items in the dungeon LambdaHackRspotted items with the same kind index could be recomputed at resume, but small LambdaHackremembered sides still in game LambdaHack%global game time, for UI display only LambdaHackremembered content LambdaHack(total value of human trinkets in dungeon LambdaHackhigh score table LambdaHackcurrent game mode LambdaHackitem kind discoveries data LambdaHack%item aspect data; could be recomputed LambdaHack#actor maximal skills; is recomputed W LambdaHack#Initial complete global game state. X LambdaHackInitial empty state. Y LambdaHackQLocal state created by removing secret information from global state components. Z LambdaHack!Update dungeon data within state. [ LambdaHackUpdate dungeon depth. \ LambdaHackUpdate the actor dictionary. ] LambdaHackUpdate the item dictionary. ^ LambdaHackUpdate the item kind index map. _ LambdaHack!Update faction data within state. ` LambdaHack Update global time within state. a LambdaHack?Update content data within state and recompute the cached data. b LambdaHack'Update total gold value in the dungeon.% F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j% F G H I J K L M N O P Q R S T W X Y Z [ \ ] ^ _ ` a b c d e f g h i j U V=None"#$/8X_`gm ~ LambdaHack+Calculate loot's worth for a given faction.  LambdaHack/Price an item, taking count into consideration.  LambdaHackwChecks if the actor is present on the current level. The order of argument here and in other functions is set to allow b <- getsState (memActor a)  LambdaHack'Get current time from the dungeon data.  LambdaHackDetermine the dungeon level of the container. If the item is in the shared stash, the level depends on which actor asks, not where the stash is located physically.  LambdaHackRequire that any non-dying foe is adjacent. We include even projectiles that explode when stricken down, because they can be caught and then they don't explode, so it makes sense to focus on handling them. If there are many projectiles in a single adjacent position, we only test the first one, the one that would be hit in melee (this is not optimal if the actor would need to flee instead of meleeing, but fleeing with *many* projectiles adjacent is a possible waste of a move anyway).  LambdaHackCheck if any non-dying foe is adjacent to any of our normal actors and either can harm them via melee or can attack from a distance. Otherwise no point meleeing him. Projectiles are ignored, because they are not actively attempted to melee, see meleeAny. This is regardless of whether our actor can melee or just needs to flee, in which case alert is needed so that he is not slowed down by others. However, if our actor can't move nor melee, no real combat is taking place. This is needed only by AI and computed as lazily as possible.< n o p q r s t u v w x y z { | } ~  < n o p q r s t u v w x y z { | } ~  >None"#$/8X_`gm  LambdaHackOMonad for reading game state. A state monad with state modification disallowed (another constraint is needed to permit that). The basic server and client monads are like that, because server and clients freely modify their internal session data, but don't modify the main game state, except in very restricted and synchronized way. ?None"#$/78X_`gm  LambdaHackJSuffix to append to a basic content name if the content causes the effect.&We show absolute time in seconds, not moves, because actors can have different speeds (and actions can potentially take different time intervals). We call the time taken by one player move, when walking, a move. Turn and clipY are used mostly internally, the former as an absolute time unit. We show distances in stepsY, because one step, from a tile to another tile, is always 1 meter. We don't call steps tilesI, reserving that term for the context of terrain kinds or units of area.  @None"#$/78X_`gmO  LambdaHackindividual map symbol  LambdaHackindividual name  LambdaHackindividual pronoun  LambdaHackindividual map color  LambdaHack(The part of speech describing the actor.  LambdaHack2The part of speech containing the actor's pronoun. ANone"#$/8MX_`gm  LambdaHack>A collection of mappings from slot labels to item identifiers.  LambdaHackHSlot label. Usually just a character. Sometimes with a numerical prefix.  LambdaHack<Assigns a slot to an item, e.g., for inclusion in equipment of a hero. At first, e.g., when item is spotted on the floor, the slot is not user-friendly. After any player's item manipulation action, slots are sorted and a fully human-readable slot is then assigned. Only then the slot can be viewed by the player. BNone"#$/8X_`gms  LambdaHack}A list of active screenfulls to be shown one after another. Each screenful has an independent numbering of rows and columns.  LambdaHackAn Overlay of text with an associated list of keys or slots that activated when the specified screen position is pointed at. The list should be sorted wrt rows and then columns.  LambdaHack>A key or an item slot label at a given position on the screen.  LambdaHacktWidth of on-screen button text, expressed in characters, and so UI (mono font) width is deduced from the used font.  LambdaHack:Generate a slideshow with the current and previous scores.  LambdaHack6Show a screenful of the high scores table. Parameter entries. is the number of (3-line) scores to be shown.  LambdaHack8Produce a couple of renderings of the high scores table.  LambdaHackwidth of the display area LambdaHackheight of the display area LambdaHackcurrent score table LambdaHack*position of the current score in the table LambdaHackthe name of the game mode LambdaHack"the timezone where the game is run$                     $                     CNone"#$/8SX_`gm " LambdaHack9Produce a set of help/menu screens from the key bindings.When the intro screen mentions KP_5, this really is KP_Begin, but since that is harder to understand we assume a different, non-default state of NumLock in the help text than in the code that handles keys. # LambdaHack3Turn the specified portion of bindings into a menu.\The length of the button may be wrong if the two supplied fonts have very different widths. " # " #DNone"#$/78X_`gmX, $ LambdaHackThe goal of an actor. % LambdaHack1shared inventory stash of our or an enemy faction & LambdaHack(last seen position of the targeted actor ' LambdaHack)embedded item that can be triggered; in TPoint (TEmbed bag p) _ q usually bag is embbedded in p and q is an adjacent open tile ( LambdaHackitem lying on the ground ) LambdaHack!smell potentially left by enemies * LambdaHack_a blocking tile to be approached (and, e.g., revealed to be walkable or altered or searched) + LambdaHackan unknown tile to be explored , LambdaHacka known tile to be patrolled - LambdaHack<a hideout to either flee to or find a hidden enemy sniper in . LambdaHackThe type of na actor target. / LambdaHacktarget an enemy 0 LambdaHacktarget a friend or neutral 1 LambdaHacktarget a concrete spot 2 LambdaHack!target position relative to actor 3 LambdaHack(Actor's target and a path to it, if any. 7 LambdaHacklPathfinding distances to all reachable positions of an actor and a shortest paths to some of the positions. ; LambdaHack,Client state, belonging to a single faction. = LambdaHack&a parameter of the aiming digital line > LambdaHacktargets of our actors in the dungeon; this is only useful for AI and for directing non-pointmen, in particular with following doctrines, where non-pointmen go to the pointman's target ? LambdaHackJthe position and time of last fleeing attempt (regardless if succeeded) @ LambdaHack the set of fully explored levels A LambdaHackpathfinding data for our actors C LambdaHacktremembered AI benefits of items; could be recomputed at resume, but they are costly to generate and not too large D LambdaHack#faction perception indexed by level E LambdaHack4cached alter skill data for positions (actually, Tile.alterMinWalk instead) F LambdaHackcurrent random generator G LambdaHackIcandidate new leader of the faction; Faction.gleader is the old leader H LambdaHack faction controlled by the client I LambdaHackexit the game loop J LambdaHackcurrent game challenge setup K LambdaHacknext game challenge setup L LambdaHack whether to mark suspect features M LambdaHack|whether we are in melee, per level; this is not a set, due to an unbenchmarked theory that a constant shape map is faster N LambdaHack'won games at particular difficulty lvls O LambdaHack camped games P LambdaHackrestarted games Q LambdaHackclient options R LambdaHackInstead of a BFS queue (list) we use these two arrays, for (JS) speed. They need to be per-client distinct, because sometimes multiple clients interleave BFS computation. S LambdaHack Initial empty game client state. T LambdaHack Cycle the  L setting. U LambdaHack-Update target parameters within client state. V LambdaHack(Get target parameters from client state. W LambdaHack:Update picked leader within state. Verify actor's faction.6 $ * % & ' ( ) + , - . / 0 1 2 3 4 5 6 7 9 8 : ; < Q = > ? @ A B C D E F G H I J K L M N O P R S T U V W X Y6 ; < Q = > ? @ A B C D E F G H I J K L M N O P R : 7 9 8 3 4 5 6 . / 0 1 2 $ * % & ' ( ) + , - S T U V W X YENone"#$/78MX_`gm("5 h LambdaHackLast lore being aimed at. k LambdaHackParameters of the current run. m LambdaHack"the original leader from run start n LambdaHack!the list of actors that take part o LambdaHackHinitial run continuation by any run participant, including run leader p LambdaHack!message with the next stop reason q LambdaHack)waiting for others to move out of the way r LambdaHackIn-game macros. We record menu navigation keystrokes and keystrokes bound to commands with one exception --- we exclude keys that invoke the Record command, to avoid surprises. Keys are kept in the same order in which they're meant to be replayed, i.e. the first element of the list is replayed also as the first one. u LambdaHack Current aiming mode of a client. z LambdaHackLocal macro buffer frame. Predefined macros have their own in-game macro buffer, allowing them to record in-game macro, queue actions and repeat the last macro's action. Running predefined macro pushes new  KeyMacroFramef onto the stack. We pop buffers from the stack if locally there are no actions pending to be handled. | LambdaHack/record keystrokes in Left; repeat from Right } LambdaHackactions pending to be handled ~ LambdaHacklast pressed key  LambdaHackThe information that is used across a client playing session, including many consecutive games in a single session. Some of it is saved, some is reset when a new playing session starts. An important component is the frontend session.  LambdaHackthe common xhair  LambdaHackxhair set for last GoTo  LambdaHackassigned actor UI presentations  LambdaHackassigned item first seen level  LambdaHackmap from slots to items  LambdaHacklast item move stores  LambdaHackconnection with the frontend  LambdaHackUI client content  LambdaHackUI options as set by the player  LambdaHack aiming mode  LambdaHacklast mouse aiming not vacuus  LambdaHackNselected item, if any, it's store and whether to override suitability check  LambdaHack$the set of currently selected actors  LambdaHack%parameters of the current run, if any  LambdaHackhistory of messages  LambdaHackmouse pointer position  LambdaHackthe head of the key macro stack  LambdaHackthe tail of the key macro stack  LambdaHack!actors that just got out of sight  LambdaHack"player just waited this many times  LambdaHack$the player just exited AI automation  LambdaHackmark leader and party FOV  LambdaHack#mark smell, if the leader can smell  LambdaHacknext game scenario number  LambdaHack"whether current game is a tutorial  LambdaHack#whether next game is to be tutorial  LambdaHack"override display of tutorial hints  LambdaHack&tutorial hints already shown this game  LambdaHackindices of last used menu items  LambdaHacklast lore chosen to display  LambdaHackcurrent level needs displaying  LambdaHack'a frame was already displayed this turn  LambdaHackfwhether no visible report created last UI faction turn or the report wiped out from screen since  LambdaHackthis session start time  LambdaHackthis game start time  LambdaHack4clips from start of session to current game start  LambdaHackthis game current frame count  LambdaHack:frame count from start of session to current game start  LambdaHackcurrent random generator for UIF h i j k l m n o p q r s t u v x w y z { | } ~  F  y u v x w r s t z { | } ~ k l m n o p q h i j FNone"#$/8X_`gm-  LambdaHack"Monad for writing to client state.  LambdaHackMonad for reading client state.  LambdaHackFInvoke pseudo-random computation with the generator kept in the state. GNone"#$/8X_`gm6  LambdaHack'Get the current perception of a client.  LambdaHack;Calculate the position of an actor's target. This matches pathGoal$, but sometimes path is not defined.  LambdaHackHCounts the number of steps until the projectile would hit a non-projectile actor or obstacle. Starts searching with the given eps and returns the first found eps for which the number reaches the distance between actor and target position, or Nothing if none can be found. Treats unknown tiles as walkable, but prefers known.  HNone"#$/8X_`gmDb  LambdaHack\The monad that gives the client access to UI operations, but not to modifying client state.  LambdaHackBWrite a UI request to the frontend and read a corresponding reply.  LambdaHackAPush frames or delays to the frame queue. The frames depict the lid level.  LambdaHackWrite F UI request to the frontend, read the reply, set pointer, return key.  LambdaHack@Initialize the frontend chosen by the player via client options.  LambdaHacklThe part of speech describing the actor or the "you" pronoun if he is the leader of the observer's faction.  LambdaHackZThe part of speech with the actor's pronoun or "you" if a leader of the client's faction.  LambdaHack9Try to read saved client game state from the file system.  LambdaHackHInvoke pseudo-random computation with the generator kept in the session.0 0 INone"#$/8SX_`gmS  LambdaHack(Continue running in the given direction.  LambdaHack8This function implements the actual logic of running. It checks if we have to stop running because something interesting cropped up, it ajusts the direction given by the vector if we reached a corridor's corner (we never change direction except in corridors) and it increments the counter of traversed tiles.Note that while goto-xhair commands ignore items on the way, here we stop wnenever we touch an item. Running is more cautious to compensate that the player cannot specify the end-point of running. It's also more suited to open, already explored terrain. Goto-xhair works better with unknown terrain, e.g., it stops whenever an item is spotted, but then ignores the item, leaving it to the player to mark the item position as a goal of the next goto.    JNone"#$/8X_`gm\  LambdaHackFAdd a shared message to the current report. Say if it was a duplicate.  LambdaHackxAdd a message comprising of two different texts, one to show, the other to save to messages log, to the current report.  LambdaHack$Add a message to the current report.  LambdaHack\Add a message to the current report. End previously collected report, if any, with newline.  LambdaHack)Add a prompt with basic keys description.  LambdaHack7Store new report in the history and archive old report.            KNone"#$/8PX_`gmK  LambdaHackJGet cached BFS array and path or, if not stored, generate and store first.  LambdaHackAGet cached BFS array or, if not stored, generate and store first.  LambdaHack@Get cached BFS path or, if not stored, generate and store first.  LambdaHack$Furthest (wrt paths) known position.  LambdaHack0Closest reachable unknown tile position, if any.Note: some of these tiles are behind suspect tiles and they are chosen in preference to more distant directly accessible unknown tiles. This is in principle OK, but in dungeons with few hidden doors AI is at a disadvantage (and with many hidden doors, it fares as well as a human that deduced the dungeon properties). Changing Bfs to accomodate all dungeon styles would be complex and would slow down the engine.rIf the level has inaccessible open areas (at least from the stairs AI used) the level will be nevertheless here finally labeled as explored, to enable transition to other levels. We should generally avoid such levels, because digging and/or trying to find other stairs leading to disconnected areas is not KISS so we don't do this in AI, so AI is at a disadvantage.eIf the closest unknown is more than 126 tiles away from the targeting actor, the level will marked as explored. We could complicate the code and not mark if the unknown is too far as opposed to inaccessible, but then if it is both too distant and inaccessible, AI would be permanently stuck on such levels. To cope with this, escapes need to be placed on open or small levels, or in dispersed enough that they don't appear in such potentially unexplored potions of caves. Other than that, this is rather harmless and hard to exploit, so let it be. The principled way to fix this would be to extend BFS to Word16_, but then it takes too long to compute on maze levels, so we'd need to optimize hard for JS.  LambdaHackFinds smells closest to the actor, except under the actor, because actors consume smell only moving over them, not standing. Of the closest, prefers the newest smell. " LambdaHackWClosest (wrt paths) AI-triggerable tiles with embedded items. In AI, the level the actor is on is either explored or the actor already has a weapon equipped, so no need to explore further, he tries to find enemies on other levels, but before that, he triggers other tiles in hope of some loot or beneficial effect to enter next level with. # LambdaHackCheck whether the actor has enough gear to go look for enemies. We assume weapons in equipment are better than any among organs or at least provide some essential diversity. Disabled if, due to doctrine, actors follow leader and so would repeatedly move towards and away form stairs at leader change, depending on current leader's gear. Number of items of a single kind is ignored, because variety is needed. % LambdaHackClosest (wrt paths) items. & LambdaHack!Closest (wrt paths) enemy actors. ' LambdaHackClosest (wrt paths) enemy or our unguarded stash locations. If it's ours, we want to guard it, it enemy, loot it. Neutral and friendly stashes not chased to avoid loops of bloodless takeovers. ) LambdaHackFind the nearest walkable position in dark, if any. Deterministic, to let all friends gather up and defend in the same shelter. Ignore position underfoot.!                   ! " # $ % & ' ( )!                  ! " # % & ' ( ) $ LNone"#$/8X_`gmg , LambdaHack4Require that a target enemy is visible by the party. - LambdaHackCRequire that a target enemy or enemy stash is visible by the party. . LambdaHack?Require that a target enemy is remembered on the actor's level. / LambdaHack8Require that a target non-enemy is visible by the party. 0 LambdaHackRequire that the target is crucial to success, e.g., an item, or that it's not too far away and so the changes to get it are high. 1 LambdaHack)Check if the target is a nonmoving enemy. 2 LambdaHackNRequire the actor stands on or adjacent to a triggerable tile (e.g., stairs). 3 LambdaHackProduce the chess-distance-sorted list of non-low-HP, melee-cabable foes on the level. We don't consider path-distance, because we are interested in how soon the foe can close in to hit us, which can diverge greately from path distance for short distances, e.g., when terrain gets revealed. We don't consider non-moving actors, because they can't chase us and also because they can't be aggresive so to resolve the stalemate, the opposing AI has to be aggresive by ignoring them and closing in to melee distance. 4 LambdaHack?Require the actor blocks the paths of any of his party members. 5 LambdaHackyRequire the actor stands over a weapon that would be auto-equipped, if only it was a desirable item (checked elsewhere). 6 LambdaHack3Check whether the actor has no weapon in equipment. 7 LambdaHack-Require that the actor can project any items. 9 LambdaHack^Produce the list of items from the given stores available to the actor and the items' values. ; LambdaHack4Require that the actor stands over a desirable item. < LambdaHackUProduce the list of items on the ground beneath the actor that are worth picking up. @ LambdaHack^Require that the actor stands in the dark and so would be betrayed by his own equipped light, A LambdaHack8Produce a list of acceptable adjacent points to flee to. , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ AMNone"#$/8PX_`gmO B LambdaHackVerify and possibly change the target of an actor. This function both updates the target in the client state and returns the new target explicitly. B C B CNNone"#$/8X_`gme D LambdaHackwPick a new leader from among the actors on the current level. Refresh the target of the new leader, even if unchanged. E LambdaHackFInspect the doctrines of the actor and set his target according to it. D E D EONone"#$/8X_`gm G LambdaHack/Pick the most desirable AI ation for the actor. F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] G H I J K L M N O P Q R S T U F V W X Y Z [ \ ]PNone"#$/8X_`gm _ LambdaHacksHandle the move of an actor under AI control (regardless if the whole faction is under human or computer control). ` LambdaHackPick an actor to move and an action for him to perform, given an optional previous candidate actor and action and the server-proposed actor. _ ` _ `QNone"#$/8X_`gm~ a LambdaHackException signifying that atomic action failed because the information it carries is inconsistent with the client's state, (e.g., because the client knows too little to understand the command or already deduced the state change from earlier commands or is confused, amnesiac or sees illusory actors or tiles). Whenever we know the failure is logically impossible, we don't throw the  AtomicFail. exception, but insert a normal assertion or error* call, which are never caught nor handled. c LambdaHack>The monad for writing to the main game state. Atomic updates ( UpdAtomic%) are given semantics in this monad. a b c e d f g h i j k l m n o p q r s t u v w x y z { | } ~  c e d a b f g h i j k l m p t u x } ~  n o q r s v w y z { |RNone"#$/8X_`gm  LambdaHackYSymbolic representation of text messages sent by server to clients and shown to players.  LambdaHackxAbstract syntax of atomic special effects, that is, atomic commands that only display special effects and don't change  F nor client state.  LambdaHack|Symbolic representation of text messages about heard noises, sent by server to clients and shown to players and used by AI.  LambdaHackTAbstract syntax of atomic updates, that is, atomic commands that really change the  F. Most of them are an encoding of a game state diff, though they also carry some intentional hints that help clients determine whether and how to communicate it to players.  LambdaHackPAbstract syntax of atomic commands, that is, atomic game state transformations.  LambdaHackatomic updates  LambdaHackatomic special effectsz z SNone"#$/8X_`gm  LambdaHackUThe type representing visibility of atomic commands to factions, based on the position of the command, etc. Note that the server sees and smells all positions. Also note that hearing is not covered because it gives very restricted information, so hearing doesn't equal seeing (and we assume smelling actors get lots of data from smells). LambdaHack(whomever sees all the positions, notices LambdaHack observers and the faction notice LambdaHack*whomever smells all the positions, notices LambdaHack(whomever sees all the positions, notices LambdaHack(only the faction notices, server doesn't LambdaHackfaction and server notices LambdaHackonly the server notices  LambdaHackeverybody notices  LambdaHack$never broadcasted, but sent manually  LambdaHackProduce the positions where the atomic update takes place or, more generally, the conditions under which the update can be noticed by a client.#The goal of this mechanics is to ensure that atomic commands involving some positions visible by a client convey similar information as the client would get by directly observing the changes of the portion of server state limited to the visible positions. Consequently, when the visible commands are later applied to the client's state, the state stays consistent --- in sync with the server state and correctly limited by visiblity. There is some wiggle room both in what "in sync" and "visible" means and how they propagate through time.E.g., UpdDisplaceActor in a black room between two enemy actors, with only one actor carrying a 0-radius light would not be distinguishable by looking at the state (or the screen) from  UpdMoveActor' of the illuminated actor, hence such UpdDisplaceActor should not be observable, but  UpdMoveActor in similar cotext would be (or the former should be perceived as the latter). However, to simplify, we assign as strict visibility requirements to  UpdMoveActor as to UpdDisplaceActor and fall back to  UpdSpotActora (which provides minimal information that does not contradict state) if the visibility is lower.  LambdaHackBProduce the positions where the atomic special effect takes place.  LambdaHack=All items introduced by the atomic command, to be used in it. LambdaHackDAll items introduced by the atomic special effect, to be used in it. LambdaHack?Decompose an atomic action that is outside a client's visiblity. The decomposed actions give less information that the original command, but some of them may fall within the visibility range of the client. The original action may give more information than even the total sum of all actions it's broken into. E.g.,  UpdMoveActorq informs about the continued existence of the actor between moves vs popping out of existence and then back in.This is computed in server's State$ from before performing the command. LambdaHackWhat is the main map level the  PosAtomic refers to, if any. LambdaHackeGiven the client, its perception and an atomic command, determine if the client notices the command. LambdaHackZDetermine whether the server would see a command that has the given visibilty conditions.          TNone"#$/8>X_`gm( LambdaHackmThe game-state semantics of atomic game commands. There is no corresponding definition for special effects ( SfxAtomic), because they don't modify  F.For each of the commands, we are guaranteed that the client, the command is addressed to, perceives all the positions the command affects (as computed by S). In the code for each semantic function we additonally verify the client is aware of any relevant items and/or actors and we throw the  AtomicFail exception if it's not. The server keeps copies of all clients' states and, before sending a command to a client, applies it to the client's state copy. If  AtomicFail is signalled, the command is ignored for that client. This enables simpler server code that addresses commands to all clients that can see it, even though not all are able to process it.0 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJ0 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJNone"#$/8X_`gmV a b c e d             c e d a bUNone"#$/8X_`gm-K LambdaHackAbstract syntax of responses sent by server to an AI or UI client (or a universal client that can handle both roles, which is why this type is not separated into distinct AI and UI types). A response tells a client how to update game state or what information to send to the server.L LambdaHackchange State! by performing this atomic updateM LambdaHackput the given State1, which results from performing the atomic updateN LambdaHack?compute an AI move for the actor and send (the semantics of) itO LambdaHack4perform special effects (animations, messages, etc.)P LambdaHackDprompt the human player for a command and send (the semantics of) itKLMNOPKLMNOPVNone"#$/8X_`gm1, LambdaHack_The part of speech describing the item parameterized by the number of effects/aspects to show.T LambdaHack'The part of speech describing the item.RSTUVWXYZ[\]^_`abTUVWYZ[\]X^_`abRSWNone"#$/8X_`gm3Xk LambdaHack1Draw the whole screen: level map and status area.cdefghijklmnopqrcdkpqefghijlmnorXNone"#$/8X_`gm;*s LambdaHack/Draw the current level with the overlay on top.u LambdaHackPush the frame depicting the current level to the frame queue. Only one line of the report is shown, as in animations, because it may not be our turn, so we can't clear the message to see what is underneath.| LambdaHack5Render animations on top of the current screen frame.} LambdaHackARender and display animations on top of the current screen frame. stuvwxyz{|}~ uvwxyz}~st|{YNone"#$/8X_`gmO LambdaHackXAdd current report to the overlay, split the result and produce, possibly, many slides. LambdaHack&Split current report into a slideshow. LambdaHackSplit current report into a slideshow. Keep report unchanged. Assume the game either halts waiting for a key after this is shown, or many slides are produced, all but the last are displayed with player promts between and the last is either shown in full or ignored if inside macro (can be recovered from history, if important). Unless the prompts interrupt the macro, which is as well. LambdaHackDisplay a message. Return value indicates if the player wants to continue. Feature: if many pages, only the last SPACE exits (but first ESC). LambdaHackiDisplay a message. Ignore keypresses. Feature: if many pages, only the last SPACE exits (but first ESC). LambdaHack~Print a yes/no question and return the player's answer. Use black and white colours to turn player's attention to the choice. LambdaHackDisplay a, potentially, multi-screen menu and return the chosen key or item slot label (and the index in the whole menu so that the cursor can again be placed at that spot next time menu is displayed).HThis function is the only source of menus and so, effectively, UI modes.  ZNone"#$/8PX_`gmai LambdaHack9Message describing the cause of failure of human command. LambdaHackCSwitches current member to the next on the level, if any, wrapping. LambdaHackGSwitches current member to the previous in the whole dungeon, wrapping. LambdaHack1Select a faction leader. False, if nothing to do. LambdaHack9Produces a textual description of the tile at a position. LambdaHack7Produces a textual description of actors at a position. LambdaHack6Produces a textual description of items at a position. LambdaHackPProduces a textual description of everything at the requested level's position. LambdaHackcan be seen right now? LambdaHackposition to describe LambdaHackthe actor that looks LambdaHacklevel the position is at LambdaHack)grammatical person of the item(s), if any LambdaHackposition to describe LambdaHacklevel the position is at LambdaHackcan be seen right now? LambdaHackposition to describe LambdaHackthe actor that looks LambdaHackXpronoun for the big actor at the position, if any, and whether the big actor is alive##[None"#$/8X_`gm{s LambdaHackLet a human player choose any item from a given group. Note that this does not guarantee the chosen item belongs to the group, as the player can override the choice. Used e.g., for applying and projecting. LambdaHackDisplay all items from a store and let the human player choose any or switch to any other store. Used, e.g., for viewing inventory and item descriptions. LambdaHackLet the human player choose a single, preferably suitable, item from a list of items. Don't display stores empty for all actors. Start with a non-empty store. LambdaHackVLet the human player choose a single, preferably suitable, item from a list of items. LambdaHack which items to consider suitable LambdaHack'specific prompt for only suitable items LambdaHackgeneric prompt LambdaHackthe verb to use LambdaHackthe generic verb to use LambdaHackstores to cycle through LambdaHack initial mode LambdaHack which items to consider suitable LambdaHack'specific prompt for only suitable items LambdaHackgeneric prompt LambdaHackstores to cycle through LambdaHackFwhether to ask, when the only item in the starting mode is suitable LambdaHack,whether to permit multiple items as a result LambdaHack which items to consider suitable LambdaHack'specific prompt for only suitable items LambdaHackgeneric prompt LambdaHackfirst mode to display LambdaHackthe (rest of) modes LambdaHackFwhether to ask, when the only item in the starting mode is suitable LambdaHack,whether to permit multiple items as a result\None"#$/8PX_`gmw LambdaHack?Push a new macro frame to the stack whenever repeating a macro. LambdaHackPDisplay items from a given container store and possibly let the user chose one. LambdaHackCheck whether one is permitted to aim (for projecting) at a target. The check is stricter for actor targets, assuming the player simply wants to hit a single actor. In order to fine tune trick-shots, e.g., piercing many actors, other aiming modes should be used. Returns a different seps if needed to reach the target.{Note: Simple Perception check is not enough for the check, e.g., because the target actor can be obscured by a glass wall. LambdaHack On top of permittedProjectClientZ, it also checks legality of aiming at the target and projection range. It also modifies eps. LambdaHackHSwitch current member to the next on the viewed level, if any, wrapping. LambdaHackESwitch current member to the previous in the whole dungeon, wrapping. LambdaHack%Starts and stops recording of macros. LambdaHack0End aiming mode, rejecting the current position. LambdaHackPAccept the current crosshair position as target, ending aiming mode, if active. LambdaHack0End aiming mode, accepting the current position. LambdaHack<Cycle detail level of aiming mode descriptions, starting up. LambdaHack\Perform look around in the current position of the xhair. Does nothing outside aiming mode. LambdaHack$Move the xhair. Assumes aiming mode. LambdaHack Start aiming. LambdaHack^Cycle aiming mode. Do not change position of the xhair, switch among things at that position. LambdaHackvChange the displayed level in aiming mode to (at most) k levels shallower. Enters aiming mode, if not already in one. LambdaHack Tweak the eps& parameter of the aiming digital line.= = ]None"#$/8PX_`gm  LambdaHackzPick command depending on area the mouse pointer is in. The first matching area is chosen. If none match, only interrupt. LambdaHack'Leader waits a turn (and blocks, etc.). LambdaHack:Leader waits a 1/10th of a turn (and doesn't block, etc.). LambdaHack#Leader yells or yawns, if sleeping. LambdaHack3Actor attacks an enemy actor or his own projectile. LambdaHack"Actor swaps position with another. LambdaHackELeader moves or searches or alters. No visible actor at the position.* LambdaHack2Ask for a direction and alter a tile, if possible.+ LambdaHack:Try to alter a tile using a feature at the given position.We don't check if the tile is interesting, e.g., if any embedded item can be triggered, because the player explicitely requested the action. Consequently, even if all embedded items are recharching, the time will be wasted and the server will describe the failure in detail., LambdaHackVerify that the tile can be transformed or any embedded item effect triggered and the player is aware if the effect is dangerous or grave, such as ending the game.0 LambdaHack6Try to alter a tile using a feature under the pointer.1 LambdaHackEClose nearby open tile; ask for direction, if there is more than one.2 LambdaHackClose tile at given position.3 LambdaHackAdds message with proper names.4 LambdaHackPrompts user to pick a point.5 LambdaHackDisplay command help.6 LambdaHack4Display hint or, if already displayed, display help.7 LambdaHackDisplay the dashboard.; LambdaHackDisplay the main menu.< LambdaHackDisplay the main menu and set  swasAutomated.= LambdaHack Display the main menu and unset  swasAutomated.> LambdaHackDisplay the settings menu.? LambdaHackDisplay the challenge menu.F     !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOF    !"&(*0156789;<=>?@ABCDEFGHIJKLMNO #$%')+,-./234:^None"#$/8X_`gmFP LambdaHack^The semantics of human player commands in terms of the client monad, in context of the given km as the last action.Some time cosuming commands are enabled even in aiming mode, but cannot be invoked in aiming mode on a remote level (level different than the level of the leader), which is caught here.Q LambdaHackNCommands that are forbidden on a remote level, because they would usually take time when invoked on one, but not necessarily do what the player expects. Note that some commands that normally take time are not included, because they don't take time in aiming mode or their individual sanity conditions include a remote level check.PQRSTUPRQSTU_None"#$/8PX_`gmPV LambdaHack,Visualize atomic updates sent to the client. This is done in the global state after the command is executed and after the client state is modified by the command. Doesn't modify client state (except a few fields), but only client session (e.g., by displaying messages). This is enforced by types.p LambdaHackDisplay special effects (text, animation) sent to the client. Don't modify client state (except a few fields), but only client session (e.g., by displaying messages). This is enforced by types.VWXYZ[\]^_`abcdefghijklmnopqrVpmnoWXYZ[\]^_`abcdefghijklqr`None"#$/8X_`gms LambdaHack"Handle the move of a human player.t LambdaHackALet the human player issue commands until any command takes time.?  Vpst?s  Vp   taNone"#$/8X_`gm0u LambdaHackHow much AI benefits from applying the effect. The first component is benefit when applied to self, the second is benefit (preferably negative) when applied to enemy (via melee). This represents benefit from using the effect every  avgItemDelayy turns, so if the item is not durable, the value is adjusted down elsewhere. The benefit includes the drawback of having to use the actor's turn, except when there is battle and item is a weapon and so there is usually nothing better to do than to melee, or when the actor is stuck or idle or laying in wait or luring an enemy from a safe distance. So there is less than averageTurnValue included in each benefit, so in case when turn is not spent, e.g, periodic activation or conditions, the difference in value is only slight. LambdaHackCompute the whole  m structure, containing various facets of AI item preference, for an item with the given effects and aspects. uvwxyz{|}~ uvwxyz{|}~bNone"#$/8X_`gm LambdaHackClient monad for saving a game. LambdaHackEffect of atomic actions on client state. It is calculated with the global state from after the command is executed (except where the supplied oldState is used).cNone"#$/8>X_`gm[ LambdaHackBMonad for executing atomic game state transformations on a client. LambdaHack3Execute an atomic update that changes the client's  F. LambdaHackvPut state that is intended to be the result of performing an atomic update by the server on its copy of the client's  F. LambdaHack:Client monad in which one can send requests to the client. LambdaHackHandle server responses.CNote that for clients communicating with the server over the net, RespUpdAtomicNoState should be used, because executing a single command is cheaper than sending the whole state over the net. However, for the standalone exe mode, with clients in the same process as the server, a pointer to the state set with  execPutState is cheaper.dNone"#$/8>X_`gm LambdaHack@Client monad in which one can receive responses from the server. LambdaHack&The main game loop for an AI or UI client. It receives responses from the server, changes internal client state accordingly, analyzes ensuing human or AI commands and sends resulting requests to the server. Depending on whether it's an AI or UI client, it sends AI or human player requests.BThe loop is started in client state that is empty except for the sside and seps fields, see  S.None"#$/8X_`gm%         KLMNOP%          KLMNOP  eNone"#$/8X_`gm,,fNone"#$/8X_`gm88gNone"#$/8X_`gm  8      !"#$%&'()*+,-./0123456789:;8876543210/.-,+*)('&%$#"!      9:;hNone"#$/8X_`gm {<=>?@ABCDEFGHIJKLMNOPQRSTUVWXGUTSRQPONMLKJIHFEDCBA@?>=<WVXiNone"#$/8X_`gm _ LambdaHackNA special player, for summoned actors that don't belong to any of the main players of a given game. E.g., animals summoned during a brawl game between two hero factions land in the horror faction. In every game, either all factions for which summoning items exist should be present or a horror player should be added to host them.YZ[\]^_`abcdefgYZ[\]^_`abcdefgjNone"#$/8X_`gm hijklmnopqrstuvwxyz{|}~}|{zyxwvutsrqponmlkjih~kNone"#$/8X_`gm NNlNone"#$/8X_`gm 9mNone"#$/8X_`gm 6  LambdaHack4The coordinates of consecutive fields of a corridor. LambdaHack2The choice of horizontal and vertical orientation. LambdaHack#Pick a random point within an area. LambdaHackNFind a suitable position in the area, based on random points and a predicate. LambdaHackICreate a void room, i.e., a single point area within the designated area. LambdaHack3Create a random room according to given parameters. LambdaHackPick a subset of connections between adjacent areas within a grid until there is only one connected component in the graph of all areas. LambdaHackDSort the sequence of two points, in the derived lexicographic order. LambdaHackEPick a single random connection between adjacent areas within a grid. LambdaHackCreate a corridor, either horizontal or vertical, with a possible intermediate part that is in the opposite direction. There might not always exist a good intermediate point if the places are allowed to be close together and then we let the intermediate part degenerate. LambdaHackTry to connect two interiors of places with a corridor. Choose entrances some steps away from the edges, if the place is big enough. Note that with pfence == FNone^, the inner area considered is the strict interior of the place, without the outermost tiles.The corridor connects (touches) the inner areas and the turning point of the corridor (if any) is outside of the outer areas and inside the grid areas. LambdaHack`Divide uniformly a larger area into the given number of smaller areas overlapping at the edges.The list of fixed centers (some important points inside) of (non-overlapping) areas is given. Incorporate those, with as little disruption, as possible. Assume each of four boundaries of the cave are covered by a fixed centre. LambdaHack maximum size LambdaHack(the containing area, not the room itself LambdaHackthe center point LambdaHack minimum size LambdaHack maximum size LambdaHack(the containing area, not the room itself LambdaHack#orientation of the starting section LambdaHackstarting point LambdaHackstarting is inside FGround or FFloor LambdaHack ending point LambdaHackending is inside FGround or FFloor LambdaHack*the area containing the intermediate point LambdaHack!straight sections of the corridornNone"#$/8SX_`gm W  LambdaHackiThe parameters of a place. All are immutable and rolled and fixed at the time when a place is generated. LambdaHackThe map of tile kinds in a place (and generally anywhere in a cave). The map is sparse. The default tile that eventually fills the empty spaces is specified in the cave kind specification with cdefTile.  LambdaHackFor  CAlternate0 tiling, require the place be comprised of an even number of whole corners, with exactly one square overlap between consecutive coners and no trimming. For other tiling methods, check that the area is large enough for tiling the corner twice in each direction, with a possible one row/column overlap.  LambdaHack"Calculate interior room area according to fence type, based on the total area for the room and it's fence. This is used for checking if the room fits in the area, for digging up the place and the fence and for deciding if the room is dark or lit later in the dungeon generation process.  LambdaHack-Given a few parameters, roll and construct a 9 datastructure and fill a cave section acccording to it.  LambdaHackERoll a legend of a place plan: a map from plan symbols to tile kinds. LambdaHack!Construct a fence around a place. LambdaHackConstruct a fence around an area, with the given tile kind. Corners have a different kind, e.g., to avoid putting doors there. LambdaHack<Construct a fence around an area, with the given tile group. LambdaHack"Create a place by tiling patterns.  LambdaHackthe area to fill LambdaHackthe kind of place to construct  LambdaHackthe game content LambdaHackcurrent cave kind LambdaHackwhether the cave is dark LambdaHack dark fence tile, if fence hollow LambdaHacklit fence tile, if fence hollow LambdaHackcurrent level depth LambdaHackabsolute depth LambdaHacksecret tile seed LambdaHack'whole area of the place, fence included  LambdaHack!whole inner area of the grid cell  LambdaHackoptional fixed place freq LambdaHackthe area to fill LambdaHackthe place kind to construct          oNone"#$/8X_`gm s| LambdaHack5The type of caves (not yet inhabited dungeon levels). LambdaHackthe kind of the cave LambdaHackmap area of the cave LambdaHacktile kinds in the cave LambdaHack$stair places indexed by their center LambdaHackroom entrances in the cave LambdaHackwhether the cave is dark LambdaHackhGenerate a cave using an algorithm inspired by the original Rogue, as follows (in gross simplification):yThe available area is divided into a grid, e.g, 3 by 3, where each of the 9 grid cells has approximately the same size.In some of the 9 grid cells a room is placed at a random position and with a random size, but larger than the minimum size, e.g, 2 by 2 floor tiles.Rooms that are on horizontally or vertically adjacent grid cells may be connected by a corridor. Corridors consist of 3 segments of straight lines (either "horizontal, vertical, horizontal" or "vertical, horizontal, vertical"). They end in openings in the walls of the room they connect. It is possible that one or two of the 3 segments have length 0, such that the resulting corridor is L-shaped or even a single straight line.Corridors are generated randomly in such a way that at least every room on the grid is connected, and a few more might be. It is not sufficient to always connect all adjacent rooms, because not each cell holds a room.  LambdaHackcontent definitions LambdaHackdepth of the level to generate LambdaHackabsolute depth LambdaHackmap area of the cave LambdaHacksecret tile seed LambdaHackcave kind to use for generation LambdaHack$the dimensions of the grid of places LambdaHackpos of stairs, etc. LambdaHack%boot positions to be treated as fixed  pNone"#$/8X_`gm Y LambdaHack;The contiguous area left to be scanned, delimited by edges.  LambdaHackKAn edge (comprising of a line and a convex hull) of the area to be scanned.$ LambdaHack6Convex hull represented as a non-empty list of points.& LambdaHackStraight line between points.( LambdaHack2Two strict orderings of lines with a common point.) LambdaHackRotated and translated coordinates of 2D points, so that the points fit in a single quadrant area (e, g., quadrant I for Permissive FOV, hence both coordinates positive; adjacent diagonal halves of quadrant I and II for Digital FOV, hence y positive). The special coordinates are written using the standard mathematical coordinate setup, where quadrant I, with x and y positive, is on the upper right.- LambdaHack;Progress along an arc with a constant distance from (0, 0).. LambdaHack4Distance from the (0, 0) point where FOV originates./ LambdaHackOCalculates the list of tiles visible from (0, 0) within the given sight range.0 LambdaHackDSpecialized implementation for speed in the inner loop. Not partial.1 LambdaHack Standard foldl' over CHull.2 LambdaHackExtends a convex hull of bumps with a new bump. The new bump makes some old bumps unnecessary, e.g. those that are joined with the new steep bump with lines that are not shallower than any newer lines in the hull. Removing such unnecessary bumps slightly speeds up computation of 0. Recursion in  addToHullGoo seems spurious, but it's called each time with potentially different comparison predicate, so it's necessary.4 LambdaHackCreate a line from two points.Debug: check if well-defined.5 LambdaHack$Strictly compare steepness of lines (b1, bf) and (b2, bf), according to the  LineOrdering given. This is related to comparing the slope (gradient, angle) of two lines, but simplified wrt signs to work fast in this particular setup.ADebug: Verify that the results of 2 independent checks are equal.6 LambdaHackA pair (a, b) such that a divided by b] is the X coordinate of the intersection of a given line and the horizontal line at distance d above the X axis.2Derivation of the formula: The intersection point (xt, yt)$ satisfies the following equalities: ,yt = d (yt - y) (xf - x) = (xt - x) (yf - y)hence (yt - y) (xf - x) = (xt - x) (yf - y) (d - y) (xf - x) = (xt - x) (yf - y) (d - y) (xf - x) + x (yf - y) = xt (yf - y) xt = ((d - y) (xf - x) + x (yf - y)) / (yf - y)General remarks: The FOV agrees with physical properties of tiles as diamonds and visibility from any point to any point. A diamond is denoted by the left corner of it's encompassing tile. Hero is at (0, 0). Order of processing in the first quadrant rotated by 45 degrees is 45678 123 @Xso the first processed diamond is at (-1, 1). The order is similar as for the restrictive shadow casting algorithm and reversed wrt PFOV. The fast moving line when scanning is called the shallow line, and it's the one that delimits the view from the left, while the steep line is on the right, opposite to PFOV. We start scanning from the left.The  (( representation of Point!) coordinates are cartesian. The ) coordinates are cartesian, translated so that the hero is at (0, 0) and rotated so that he always looks at the first (rotated 45 degrees) quadrant. The (-, .) cordinates coincide with the Bump coordinates, unlike in PFOV.8Debug: check that the line fits in the upper half-plane.7 LambdaHackDebug functions for DFOV:GDebug: calculate steepness for DFOV in another way and compare results.8 LambdaHack5Debug: check if a view border line for DFOV is legal./ LambdaHackvisiblity distance LambdaHack!visually clear position predicate LambdaHackcoordinate transformation2 LambdaHackthe line ordering to use LambdaHacka new bump to consider LambdaHack,a convex hull of bumps represented as a list !"#$%&'()*,+-./012345678/)*,+.-(&'$%!"# 012345678qNone"#$/8X_`gm X? LambdaHack3Level positions with tiles that have ambient light.C LambdaHack3Level positions that pass through light and vision.G LambdaHackELevel positions with either ambient light or shining items or actors.J LambdaHack{Map from level positions that currently hold item or actor(s) with shine to the maximum of radiuses of the shining lights.\Note that floor and (many projectile) actors light on a single tile should be additive for FovShine to be incrementally updated.FovShine should not even be kept in  StateServer., because it's cheap to compute, compared to FovLucid; and invalidated almost as often (not invalidated only by  UpdAlterTile).M LambdaHack;Server cache of perceptions, indexed by faction identifier.N LambdaHackNServer cache of perceptions of a single faction, indexed by level identifier.Y LambdaHackVisually reachable positions (light passes through them to the actor). They need to be intersected with lucid positions to obtain visible positions.\ LambdaHack/Main perception validity map, for all factions.aThe inner type is not a set, due to an unbenchmarked theory that a constant shape map is faster.` LambdaHackfCompute positions visible (reachable and seen) by the party. A position is lucid, if it's lit by an ambient light or by a weak, portable light source, e.g,, carried by an actor. A reachable and lucid position is visible. Additionally, positions directly adjacent to an actor are assumed to be visible to him (through sound, touch, noctovision, whatever).d LambdaHackCompute positions reachable by the actor. Reachable are all fields on a visually unblocked path from the actor position. Also compute positions seen by noctovision and perceived by smell.f LambdaHackUpdate lights on the level. This is needed every (even enemy) actor move to show thrown torches. We need to update lights even if cmd doesn't change any perception, so that for next cmd that does, but doesn't change lights, and operates on the same level, the lights are up to date. We could make lights lazy to ensure no computation is wasted, but it's rare that cmd changed them, but not the perception (e.g., earthquake in an uninhabited corner of the active arena, but the we'd probably want some feedback, at least sound).i LambdaHackCompute all dynamically lit positions on a level, whether lit by actors or shining floor items. Note that an actor can be blind, in which case he doesn't see his own light (but others, from his or other factions, possibly do).j LambdaHack>Calculate the perception and its caches for the whole dungeon.p LambdaHack"Calculate perception of a faction.r LambdaHackPerform a full scan for a given position. Returns the positions that are currently in the field of view. The actor's own position is considred in his field of view.r LambdaHackscanning radius LambdaHackposition of the spectator LambdaHackthe array with clear positions6=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqr6]^_\YZ[TUVWXSOPQRNMJKLGHIFCDEB?@A>`bcefjadghiklmnopq=rrNone"#$/78MX_`gm  LambdaHackFlavours assigned by the server to item kinds, in this particular game. This is total and never changes, hence implemented as vector. Morally, it's indexed by ContentId ItemKind and elements are Flavour. LambdaHackThe reverse map to  DiscoveryKindu, needed for item creation. This is total and never changes, hence implemented as vector. Morally, it's indexed by ContentId ItemKind and elements are  ItemKindIx. LambdaHackVReverse item map, for item creation, to keep items and item identifiers in bijection. LambdaHack,The essential item properties, used for the ItemRev hash table from items to their ids, needed to assign ids to newly generated items. All the other meaningful properties can be derived from them. Note: item seed instead of  AspectRecordA is not enough, becaused different seeds may result in the same  AspectRecordB and we don't want such items to be distinct in UI and elsewhere. LambdaHack.Build an item with the given kind and aspects. LambdaHack!Roll an item kind based on given Freqs and kind rarities LambdaHackyGiven item kind frequency, roll item kind, generate item aspects based on level and put together the full item data set. LambdaHackAssigns flavours to item kinds. Assures no flavor is repeated for the same symbol, except for items with only one permitted flavour. LambdaHack:Randomly chooses flavour for all item kinds for this game.sNone"#$/8X_`gm  LambdaHackGOptions that affect the behaviour of the server (including game rules). LambdaHack Default value of server options.tNone"#$/8PX_`gm K LambdaHack0Freshly generated and not yet populated dungeon. LambdaHackmaps for all levels LambdaHackabsolute dungeon depth LambdaHack$Generate the dungeon for a new game.  uNone"#$/8X_`gm % LambdaHackBPer-team, per-actor metagame persistent favourite organs and gear. LambdaHack8Record who last propelled a given actor with trajectory. LambdaHackAPosition in time for each actor, grouped by level and by faction. LambdaHackwState with server-specific data, including a copy of each client's basic game state, but not the server's basic state. LambdaHack%absolute times of actors next actions LambdaHack%and same for actors with trajectories LambdaHack%culprits for actors with trajectories LambdaHacklmetagame persistent personal characteristics and favourite gear of each numbered continued team member LambdaHack@gear preferences to be taken into account in the current game LambdaHackJstores next continued team character identity index number in this game LambdaHack%various past events data for factions LambdaHack#various past events data for actors LambdaHack&item creation statistics, by item lore LambdaHackIactors currently in time stasis, invulnerable to time warps until move LambdaHack#reverse map, used for item creation LambdaHackalready generated unique items LambdaHack&reverse id map, used for item creation LambdaHack$association of flavour to item kinds LambdaHackstores next actor index LambdaHackstores next item index LambdaHack&each faction state, as seen by clients LambdaHackperception of all factions LambdaHack$perception validity for all factions LambdaHack perception cache of all factions LambdaHack"ambient or shining light positions LambdaHackclear tiles positions LambdaHackambient light positions LambdaHackthe set of active arenas LambdaHackwhether active arenas valid LambdaHackcurrent random generator LambdaHackinitial random generators LambdaHack@exit game loop after clip's end; usually no game save follows LambdaHack&exit game loop ASAP; usually with save LambdaHack&write savegame to file after loop exit LambdaHackcurrent commandline options LambdaHackoptions for the next game LambdaHack!Initial, empty game server state.++Safe"#$/8X_`gm " vNone"#$/8X_`gm 2  LambdaHack:The monad for executing atomic game state transformations. LambdaHackfExecute an atomic command that changes the state on the server and on all clients that can notice it. LambdaHackEExecute an atomic command that changes the state on the server only. LambdaHackRExecute an atomic command that changes the state on the given single client only. LambdaHackZExecute an atomic command that changes the state on the given single client only. Catch  a' and indicate if it was in fact raised. LambdaHack=Execute an atomic command that only displays special effects. LambdaHack:Dumps to stdout the RNG states from the start of the game. LambdaHackCRead the high scores dictionary. Return the empty table if no file. LambdaHack+Generate a new score, register it and save.  LambdaHackFInvoke pseudo-random computation with the generator kept in the state.  LambdaHack[Gets a random generator from the user-submitted options or, if not present, generates one.    wNone"#$/8X_`gm 4P LambdaHack-Mapping over actor's items from a give store.      xNone"#$/8X_`gm 8# LambdaHackEffect of atomic actions on server state is calculated with the global state from after the command is executed (except where the supplied oldState is used). !"#$%&'()*+ !"#$%&'()*+yNone"#$/8X_`gm 9i,-5./102346789:;<7:;689,-5./10234<zNone"#$/8X_`gm DA> LambdaHack>The server monad with the ability to communicate with clients.B LambdaHack:Connection channel between the server and a single client.G LambdaHackGConnection information for all factions, indexed by faction identifier.N LambdaHackIf the  AtomicFailB conditions hold, send a command to client, otherwise do nothing.O LambdaHack*Send a command to client, crashing if the  AtomicFail< conditions don't hold when executed on the client's state.V LambdaHackUpdate connections to the new definition of factions. Connect to clients in old or newly spawned threads that read and write directly to the channels.>?@ABCDEFGHIJKLMNOPQRSTUVWHGBCDEF>?@AMNOPQRSTUVWIJKL{None"#$/8PX_`gm YY LambdaHackCGenerate the atomic updates that jointly perform a given item move.] LambdaHack$Save game on server and all clients._ LambdaHack2Tell whether a faction that we know is still in game, keeps arena. Keeping arena means, if the faction is still in game, it always has a leader in the dungeon somewhere. So, leaderless factions and spawner factions do not keep an arena, even though the latter usually has a leader for most of the game.f  LambdaHackactor causing the projection LambdaHack/actor projecting the item (is on current level) LambdaHackMstarting position of the projectile; usually, but not always, position of origin LambdaHack!target position of the projectile LambdaHackdigital line parameter LambdaHack)whether to start at the origin's position LambdaHackthe item to be projected LambdaHack which store the items comes from LambdaHackwhether the item is a blastg LambdaHackactor causing the projection LambdaHack-actor projecting the item (is on current lvl) LambdaHack starting point of the projectile LambdaHack(rest of the trajectory of the projectile LambdaHackthe item to be projected LambdaHack which store the items comes from LambdaHackwhether the item is a blast XYZ[\]^_`abcdefghijklmnopqrstuvw XY\]^`bcdefhimnorstuvwZ[_agjklpq|None"#$/8X_`gm `e LambdaHack)Find starting postions for all factions. Try to make them distant from each other. Place as many of the factions, as possible, over stairs. Place the last faction(s) over escape(s) (we assume they are guardians of the escapes). This implies the inital factions (if any) start far from escapes. LambdaHack)Apply options that don't need a new game. xyz{|}~ xy~z{|}}None"#$/8X_`gm u_ LambdaHackfSpawn, possibly, a monster according to the level's actor groups. We assume heroes are never spawned. LambdaHack*Advance the move time for the given actor. LambdaHack:Advance the trajectory following time for the given actor. LambdaHackAdd communication overhead time delta to all non-projectile, non-dying faction's actors, except the leader. Effectively, this limits moves of a faction on a level to 10, regardless of the number of actors and their speeds. To avoid animals suddenly acting extremely sluggish whenever monster's leader visits a distant arena that has a crowd of animals, overhead applies only to actors on the same level. Since the number of active levels is limited, this bounds the total moves per turn of each faction as well.4Leader is immune from overhead and so he is faster than other faction members and of equal speed to leaders of other factions (of equal base speed) regardless how numerous the faction is. Thanks to this, there is no problem with leader of a numerous faction having very long UI turns, introducing UI lag. LambdaHackSwap the relative move times of two actors (e.g., when switching a UI leader). Notice that their trajectory move times are not swapped. LambdaHack%Continue or exit or restart the game.  ~None"#$/8PX_`gm  LambdaHackThe source actor affects the target actor, with a given item. If any of the effects fires up, the item gets identified. Even using raw damage (beating the enemy with the magic wand, for example) identifies the item. This means a costly  UpdDiscover is processed for each random timeout weapon hit and for most projectiles, but at least not for most explosion particles nor plain organs. And if not needed, the  UpdDiscover are eventually not sent to clients. So, enemy missiles that hit us are no longer mysterious until picked up, which is for the better, because the client knows their charging status and so can generate accurate messages in the case when not recharged. This also means that thrown consumables in flasks sturdy enough to cause damage are always identified at hit, even if no effect activated. So throwing them at foes is a better identification method than applying.Note that if we activate a durable non-passive item, e.g., a spiked shield, from the ground, it will get identified, which is perfectly fine, until we want to add sticky armor that can't be easily taken off (and, e.g., has some maluses). LambdaHackSource actor affects target actor, with a given effect and it strength. Both actors are on the current level and can be the same actor. The item may or may not still be in the container. LambdaHack Drop all actor's equipped items. LambdaHackThe faction leaves the dungeon. LambdaHackaAdvance target actor time by this many time clips. Not by actor moves, to hurt fast actors more. LambdaHack~Advance target actor time by this many time clips. Not by actor moves, to hurt fast actors more. Due to water, so resistable. LambdaHackGive target actor the given number of tenths of extra move. Don't give an absolute amount of time units, to benefit slow actors more. LambdaHackXTeleport the target actor. Note that projectiles can be teleported, too, for extra fun. LambdaHackMake the target actor destroy items in a store from the given group. The item that caused the effect itself is *not* immune, because often the item needs to destroy itself, e.g., to model wear and tear. In such a case, the item may need to be identified, in a container, when it no longer exists, at least in the container. This is OK. Durable items are not immune, unlike the tools in  ConsumeItems. LambdaHackDDrop a single actor's item (though possibly multiple copies). Note that if there are multiple copies, at most one explodes to avoid excessive carnage and UI clutter (let's say, the multiple explosions interfere with each other or perhaps larger quantities of explosives tend to be packaged more safely). Note also that OnSmash/ effects are activated even if item discharged. LambdaHackMake the target actor destroy the given items, if all present, or none at all, if any is missing. To be used in crafting. The item that caused the effect itself is not considered (any copies). LambdaHackMake the target actor drop items in a store from the given group. The item that caused the effect itself is immune (any copies). LambdaHackSend the target actor flying like a projectile. If the actors are adjacent, the vector is directed outwards, if no, inwards, if it's the same actor, boldpos is used, if it can't, a random outward vector of length 10 is picked.PPNone"#$/8X_`gm  LambdaHackLThe semantics of server commands. AI always takes time and so doesn't loop. LambdaHackGThe semantics of server commands. Only the first two cases affect time. LambdaHack(This is a shorthand. Instead of setting bwatch in ReqWait and unsetting in all other requests, we call this once after executing a request. In game state, we collect the number of server requests pertaining to the actor (the number of actor's "moves"), through which the actor was waiting. LambdaHack@Clear deltas for Calm and HP for proper UI display and AI hints. LambdaHackAdd a smell trace for the actor to the level. If smell already there and the actor can smell, remove smell. Projectiles are ignored. As long as an actor can smell, he doesn't leave any smell ever. Smell trace is never left in water tiles. LambdaHackrActor moves or attacks or alters by bumping. Note that client may not be able to see an invisible monster so it's the server that determines if melee took place, etc. Also, only the server is authorized to check if a move is legal and it needs full context for that, e.g., the initial actor position to check if melee attack does not try to reach to a distant tile. LambdaHackResolves the result of an actor moving into another. Actors on unwalkable positions can be attacked without any restrictions. For instance, an actor embedded in a wall can be attacked from an adjacent position. This function is analogous to projectGroupItem, but for melee and not using up the weapon. No problem if there are many projectiles at the spot. We just attack the one specified. LambdaHack+Actor tries to swap positions with another. LambdaHackSearch and/or alter the tile. LambdaHackJDo nothing. Wait skill 1 required. Bracing requires 2, sleep 3, lurking 4.Something is sometimes done in . LambdaHack Do nothing.Something is sometimes done in . LambdaHackYellyawnstretch/taunt. Wakes up (gradually) from sleep. Causes noise heard by enemies on the level even if out of their hearing range.QGoverned by the waiting skill (because everyone is supposed to have it). unlike ReqWait, induces overhead.This is similar to the effect Yell, but always voluntary. LambdaHack-actor projecting the item (is on current lvl) LambdaHack!target position of the projectile LambdaHackdigital line parameter LambdaHackthe item to be projected LambdaHack which store the items comes from LambdaHack-actor applying the item (is on current level) LambdaHackthe item to be applied LambdaHackthe location of the item  None"#$/8X_`gm  LambdaHack\Start a game session, including the clients, and then loop, communicating with the clients.7The loop is started in server state that is empty, see . LambdaHackHandle a clip (the smallest fraction of a game turn for which a frame may potentially be generated). Run the leader and other actors moves. Eventually advance the time and repeat. LambdaHackHandle the end of every clip. Do whatever has to be done every fixed number of clips, e.g., monster generation. Advance time. Perform periodic saves, if applicable.|This is never run if UI requested save or exit or restart and it's correct, because we know nobody moved and no time was or needs to be advanced and arenas are not changed. After game was saved and exited, on game resume the first clip is performed with empty arenas, so arena time is not updated and nobody moves, nor anything happens, but arenas are here correctly updated. LambdaHack:Check if the given actor is dominated and update his calm. LambdaHack9Trigger periodic items for all actors on the given level.  LambdaHack:Manage trajectory of a projectile or a pushed other actor.;Colliding with a wall or actor doesn't take time, because the projectile does not move (the move is blocked). Not advancing time forces dead projectiles to be destroyed ASAP. Otherwise, with some timings, it can stay on the game map dead, blocking path of human-controlled actors and alarming the hapless human. LambdaHackplayer-supplied server options LambdaHack9function that initializes a client and runs its main loop          None"#$/8PX_`gm  LambdaHack5Send an atomic action to all clients that can see it. LambdaHack)Messages for some unseen atomic commands. LambdaHackMessages for some unseen sfx.  None"#$/08X_`gm  LambdaHack5Parser for server options from commandline arguments.None"#$/8X_`gm IBCDEFBCDEFNone"#$/8MX_`gm ` LambdaHack"Client state transformation monad. LambdaHackcurrent global state  LambdaHackcurrent client state! LambdaHackUI state, empty for AI clients" LambdaHack"this client connection information# LambdaHackconnection to the save thread$ LambdaHackURun the main client loop, with the given arguments and empty initial states, in the IO monad.  !"#$ $ !"#None"#$/8MX_`gm E1 LambdaHack"Server state transformation monad.6 LambdaHackcurrent global state7 LambdaHackcurrent server state8 LambdaHack$client-server connection information9 LambdaHackconnection to the save thread: LambdaHackURun the main server loop, with the given arguments and empty initial states, in the IO monad. 123456789: :456789123None"#$/8X_`gm SCCNone"#$/8X_`gm  DEFGHIJKLMN IHGFEDJKLNMNone"#$/8X_`gm OPQRSTUVWXYZ[\]^_`abcdeba`_^]\[ZYXWVUTSRQPOcdeNone"#$/8X_`gm ufghijklmnopqrstuvwxyz{|}~~}|{zyxwvutsrqponmlkjihgfNone"#$/8X_`gm  LambdaHackyTie the LambdaHack engine client, server and frontend code with the game-specific content definitions, and run the game.8The custom monad types to be used are determined by the  executorSer call, which in turn calls  executorCli. If other functions are used in their place- the types are different and so the whole pattern of computation differs. Which of the frontends is run inside the UI client depends on the flags supplied when compiling the engine library. Similarly for the choice of native vs JS builds. LambdaHackHRuns tieKnotForAsync in an async and applies the main thread workaround.      !"#$%&'()*+,-./01.2.3456789:;<=>?@ABCDEFGHIHJHKHLHMHNHOHPHQHRHSHTHUHVHWHXHYHZH[H\H]H^H_H`HaHbHcHdHeHfHgHhHiHjHkHlHmHnHoHpHqHrHsHtHuHvHwHxHyHzH{H|H}H~HHH      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYYZZ[\]^_`abcdefghijklmnopqrstuvwx-yz{||}~                                                             ! " # $ % & ' ( ) * \ + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~                                                                                                                                                                      !"#$%&'()*+,-./0123456789:;<<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~v      !!"#$%&'()*+,-./012334456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwwxyz{|}~D      !"#$%&'()*+,-./01234566789:;<=>?@ABCDEFGHIJKLLMNOPQRSTUUVWXYZ[\]^^_``abcdefghijkl m m n o p q r s t u v w x!y!z!{!|!}!~!!!!!!!!!!!!!!!!"#######################################$$$$$%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%&&'''''''''''''''''''''''''''''(((((((((((((((b((((((( ( ( ( ( (((((((((((((((((((( (!("(#($(%(&('((()(*(+(,(-(.(/(0(1(2(3(4(5(6(7(8(9(:(;(/(<(=(=(>(?(@(A(B(C(D(E(F(G(H(I(J(K(L(M(N(O(P(Q(R(S(T(U(V(W(X(Y(Z([(\(](^(_(`(a(b(c(d(e(f(g(h(i(j(k(l(m(n(o(p(q(r(s(t(u(v(w(x(y(z({(|(}(~((((((((((((((((((((((())))))))))))))))))))))))))))))))))))L)))))))))b)c)))))))))))))***************************************++,,,,,,,,,,,,,,,,,,,,,,,, , , , , , ,T, - - - - - - - - - - - - - - - - - - - - - -- - - . . . . . . !. ". #. $. %. &. '. (. ). *. +. ,. -. .. /. 0. 1. 2. 3. 4. 5. 6. 7. 8. 9. :. ;. <. =. >. ?. @. A. B. C. D. E. F. G...c.. H/ I/ I/ J/ K/ L/ M/ N/ O/ P/ P/ Q/ R/ S/ T/ U/ V/ W/ X/ Y/ Z/ [/ \/ ]/ ^/ _/ `/ a/ b/ c/ d/ e/ f// g/ h/ i/ j/ k/ l/ l/ m/ m/ n/ o/ p/ q/ r/ r/ s/ t/ u/ v/ w/ x/ y/ z/ {/ |/ }/ ~/ / / / / / / / / // / //c// / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 111 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4*4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 !4 "4 #4 $4 %4 &4 '4 (4 )4 *4 +4 ,4 -4 .4 /4 04 14 24 34 44 54 64 74 84 94 :4 ;4 <4 =4 >4 ?4 @4 A4 B4 C4 D5 E5 F5 G5 H5v5 I5 J5 K5 L5 M5 N5 O5 P5 Q5 R5 S5 T5 U5 V5 W6 X6 Y6 Z6 [6 \6 ]6 ^6 _6 `6 a6 b6 c6 d6 e6 f6 g6 h6 i6 j6 k6 l6 m6 n6 o6 p6 q6 r6 s7 t7 u7 v7 w7 x7 y7 z7 z7 {7 |7 }7 ~7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 !9 "9 #9 $9 %9 &9 '9 (9 )9 *9 +9 ,: -: -: .: /: 0: 1: 2: 3: 4: 5: 6: 7: 8: 9: :: ;: <: =: >: ?: @: A: B: C: D: E: F: G: H: I: J: K: L: M: N: O: P: Q: R: S: T: U: V: W: X: Y: Z: [: \: ]: ^; _; `; a; b; c; d; e; f; f; g; h; i; i; j; k; l; m; n; o; p; q; r; s; t; u; v; w; x; y; z; {; |; }; ~; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = > > > > > > > > > ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ? ? ? ? !? "? #? $? %? &? '? (? )? *? +? ,? -@ .@ /@ /@ 0@ 1@ 2@ 3@ 4@ 5@ 6@ 7@ 8@ 9@ :@ ;@ <A =A =A >A ?A ?A @A AA BA CA DA EA FA GA HA IA JA KA LA MA NB OB PB QB RB SB SB TB UB VB VBB WB XB YB ZB [B \B ]B ^B _B `B aB bB cB dB eB fB gB hB iB jB kB lB mB nB oB pB qB rB sB tB uB vC wC xD yD zD {D |D }D ~DJD D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E F F F F F F F F F F F F G G G G G G G H H H H H H H H H !H "H #H $H %H &H 'H (H H )H *H +H ,H -H .H /H 0H 1H 2H 3H 4H 5H 6H 7H 8H 9H :H ;H <H =H >H ?H @H AH BH CH DH EH FH GI HI II JI KI LJ MJ NJ OJ PJ QJ RK SK TK UK VK WK XK YK ZK [K \K ]K ^K _K `K aK bK cK K K dK eK fK gK hK iK jK kK lK mK nK oK pK qK rK sL tL uL vL wL xL yL zL {L |L }L ~L L L L L L L L L L L M M N N O O O O O O O O O O O O O O O O O O O O O O O O O P P Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R RRRRRRRRRR R R R R RRRRRRRRRRRRRRRRRRR R!R"R#R$R%R&R'R(R)R*R+R,R-R.R/R0R1R2R3R4R5R6R7R8R9R:R;R<R=RR R>R?R@RARBRCRDRESFSGSHSISJSKSLSMSNSOSSPSQSRSSSTSUSVSWSXSYSZS[S\S]S^T_T`TaTbTcTdTeTfTgThTiTjTkTlTmTnToTpTqTrTsTtTuTvTwTxTyTzT{T|T}T~TTTTTTTTTTTTTTTTUUUUUUUVVVVVVVVVVVVVVVVVWWWWWWWWWWWWWWWWXXXXXXXXXXXXYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ[[[[[[[[[[[[[[[[[[[[[[[[[[[[ [ [ [ [ \\\\\\\\\\\\\\\\\\\ \!\"\#\$\%\&\'\(\)\*\+\,\-\.\/\0\1\2\3\4\5\6\7\8\9\:\;\<\=\>\?\@\A\B\C\D\E\F\G\H\I\J]K]L]M]N]O]P]Q]R]S]T]U]V]W]X]Y]Z][]\]]]^]_]`]a]b]c]d]e]f]g] ]h] ]i]j]k]l]m]n]o]p]q]r]s]t]u]v]w]x]y]z]{]|]}]~]]]]]]]]]]]]]]]]^^^^^^_____________________________``aaaaaaaaaaaabbbbbbbbbbbbbbbbbbccccccccdddddeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeef f f f f fffffffffffffffffff f!f"f#f$f%f&f'f(f)f*f+f,f-f.f/f0f1f2f3f4f5f6f7f8f9f:f;f<f=f>f?f@gAgBgCgDgEgFgGgHgIgJgKgLgMgNgOgPgQgRgSgTgUgVgWgXgYgZg[g\g]g^g_g`gagbgcgdgegfggghgigjgkglgmgngogpgqgrgsgtgugvgwgxhyhzh{h|h}h~hhhhhhhhhhhhhhhhhhhhhhhiiiiiiiiiiiiiiijjjjjjjjjjjjjjjjjjjjjjjjjkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk k k l l llllllllllllllllllll l!l"l#l l l m$m$m%m&m'm(m)m*m+m,m-m.m/m0m1m2m3m4m5m6m7m8m9n:n:n;n<n=n>n?n@nAnBnCnDnEnFnGnHnInJoKoKoLoMoNoOoPoQoRoSoTpUpVpWpXpYpZpZp[p[p\p]p^p_p`papbpcpdpepfpgphpipqpjpkplpmpnpoqpqqqrqrqsqtququqvqwqxqxqyqzqzq{q|q}q~q~qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqrrrrrrrrrrrrrrrrrrrrrrrrrsssssssssssssssssssssssssssssssttttttttttttuuuuuuuuuuuuuuuuuuuuuuu uuuuuuuu u u u u u uu uuuuuuuvvvvvvvvvvvv v v!v v"v#v$v%v&v'v v(w)w*w+w,w-w.w/w0w1w2w3w4w5w6x7x8x9x:x;x<x=x>x?x@xAxBxCxDxExFxGxHxIyJyJyKyLyMyNyOyPyQyRySyTyUyVyWyXyYyZz[z\z]z z^z^z_z`zazbzczdzezfzgzhzizjzkzlzmznzozpzqz D{r{s{t{u{v{w{x{y{z{{{|{}{~{{{{{{{{{{{{{{{{{{{||||||||||}}}}}}}}}}}~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~      !"#$%&'()*+,-./012234456789:;<=>?@ABCDEFGGHIIJKLMNOPQRSTUVWXYZ[\]   ^_`abcdefghijklmnopqrs   tuvwxyz{|}~!    '''+ 4555555558<<<<<<<<<<<<<<VrLambdaHack-0.10.2.0-inplaceGame.LambdaHack.Core.PreludeGame.LambdaHack.Common.FileGame.LambdaHack.Core.FrequencyGame.LambdaHack.Core.DiceGame.LambdaHack.Common.Thread!Game.LambdaHack.Common.RingBufferGame.LambdaHack.Common.MiscGame.LambdaHack.Common.Time$Game.LambdaHack.Common.ClientOptions"Game.LambdaHack.Client.AI.StrategyGame.LambdaHack.Core.Random"Game.LambdaHack.Definition.Ability Game.LambdaHack.Definition.ColorGame.LambdaHack.Definition.Defs&Game.LambdaHack.Definition.ContentData Game.LambdaHack.Content.RuleKindGame.LambdaHack.Common.PointGame.LambdaHack.Common.VectorGame.LambdaHack.Common.Types!Game.LambdaHack.Common.PointArray!Game.LambdaHack.Common.Perception!Game.LambdaHack.Client.UI.PointUI!Game.LambdaHack.Client.UI.OverlayGame.LambdaHack.Client.UI.MsgGame.LambdaHack.Client.UI.KeyGame.LambdaHack.Common.Area Game.LambdaHack.Common.Analytics"Game.LambdaHack.Client.UI.HumanCmd#Game.LambdaHack.Client.UI.UIOptions(Game.LambdaHack.Client.UI.Content.ScreenGame.LambdaHack.Client.UI.Frame)Game.LambdaHack.Client.UI.Frontend.Common#Game.LambdaHack.Client.UI.AnimationClient.UI.Content.Screen'Game.LambdaHack.Client.UI.Content.Input)Game.LambdaHack.Client.UI.ContentClientUIGame.LambdaHack.Client.BfsClient.UI.Content.Input"Game.LambdaHack.Definition.Flavour Game.LambdaHack.Content.ItemKind Game.LambdaHack.Content.TileKind!Game.LambdaHack.Content.PlaceKind+Game.LambdaHack.Client.UI.Frontend.Teletype&Game.LambdaHack.Client.UI.Frontend.Sdl"Game.LambdaHack.Client.UI.Frontend Game.LambdaHack.Content.CaveKind Game.LambdaHack.Content.ModeKind!Game.LambdaHack.Common.ItemAspectGame.LambdaHack.Common.KindGame.LambdaHack.Common.Save(Game.LambdaHack.Client.UI.UIOptionsParseGame.LambdaHack.Common.Faction Game.LambdaHack.Common.HighScoreGame.LambdaHack.Client.RequestGame.LambdaHack.Common.ItemGame.LambdaHack.Common.Tile!Game.LambdaHack.Common.ReqFailureGame.LambdaHack.Common.LevelGame.LambdaHack.Common.ActorGame.LambdaHack.Common.State!Game.LambdaHack.Common.ActorState%Game.LambdaHack.Common.MonadStateRead+Game.LambdaHack.Client.UI.EffectDescription!Game.LambdaHack.Client.UI.ActorUI"Game.LambdaHack.Client.UI.ItemSlot#Game.LambdaHack.Client.UI.Slideshow%Game.LambdaHack.Client.UI.KeyBindingsGame.LambdaHack.Client.State#Game.LambdaHack.Client.UI.SessionUI"Game.LambdaHack.Client.MonadClientGame.LambdaHack.Client.CommonM'Game.LambdaHack.Client.UI.MonadClientUIGame.LambdaHack.Client.UI.RunMGame.LambdaHack.Client.UI.MsgMGame.LambdaHack.Client.BfsM$Game.LambdaHack.Client.AI.ConditionM%Game.LambdaHack.Client.AI.PickTargetM$Game.LambdaHack.Client.AI.PickActorM%Game.LambdaHack.Client.AI.PickActionMGame.LambdaHack.Client.AI&Game.LambdaHack.Atomic.MonadStateWrite Game.LambdaHack.Atomic.CmdAtomic$Game.LambdaHack.Atomic.PosAtomicRead(Game.LambdaHack.Atomic.HandleAtomicWriteGame.LambdaHack.Client.Response)Game.LambdaHack.Client.UI.ItemDescriptionGame.LambdaHack.Client.UI.DrawM Game.LambdaHack.Client.UI.FrameM$Game.LambdaHack.Client.UI.SlideshowM'Game.LambdaHack.Client.UI.HandleHelperM$Game.LambdaHack.Client.UI.InventoryM+Game.LambdaHack.Client.UI.HandleHumanLocalM,Game.LambdaHack.Client.UI.HandleHumanGlobalM&Game.LambdaHack.Client.UI.HandleHumanM(Game.LambdaHack.Client.UI.DisplayAtomicMGame.LambdaHack.Client.UI"Game.LambdaHack.Client.Preferences$Game.LambdaHack.Client.HandleAtomicM&Game.LambdaHack.Client.HandleResponseMGame.LambdaHack.Client.LoopMContent.ItemKindTemporaryContent.ItemKindBlastContent.ItemKindOrganContent.ItemKindActorContent.ModeKindPlayerContent.ItemKindEmbedContent.TileKindContent.PlaceKind)Game.LambdaHack.Server.DungeonGen.AreaRnd'Game.LambdaHack.Server.DungeonGen.Place&Game.LambdaHack.Server.DungeonGen.Cave!Game.LambdaHack.Server.FovDigitalGame.LambdaHack.Server.FovGame.LambdaHack.Server.ItemRev$Game.LambdaHack.Server.ServerOptions!Game.LambdaHack.Server.DungeonGenGame.LambdaHack.Server.State"Game.LambdaHack.Server.MonadServerGame.LambdaHack.Server.ItemM$Game.LambdaHack.Server.HandleAtomicMGame.LambdaHack.Server.DebugM Game.LambdaHack.Server.ProtocolMGame.LambdaHack.Server.CommonMGame.LambdaHack.Server.StartM Game.LambdaHack.Server.PeriodicM$Game.LambdaHack.Server.HandleEffectM%Game.LambdaHack.Server.HandleRequestMGame.LambdaHack.Server.LoopM&Game.LambdaHack.Server.BroadcastAtomic"Game.LambdaHack.Server.Commandline(Implementation.MonadClientImplementation(Implementation.MonadServerImplementationContent.RuleKindContent.ItemKindContent.CaveKindContent.ModeKindTieKnotPrelude fromIntegral Data.BitstoIntegralSizedGame.LambdaHack.Common.HSFile skillDesc)Game.LambdaHack.Client.UI.Frontend.Chosen posUpdAtomicGame.LambdaHack.AtomicGame.LambdaHack.ClientPaths_LambdaHackGame.LambdaHack.ServerbaseGHC.Base++ghc-primGHC.PrimseqGHC.Listfilterzip System.IOprint Data.Tuplefstsnd otherwiseassertmap$GHC.Num fromInteger-GHC.Real fromRationalGHC.EnumenumFrom enumFromThen enumFromToenumFromThenTo GHC.Classes==>=negate>>=>>fmapreturnControl.Monad.Failfail Control.Arrowfirst realToFrac toInteger toRational Control.Monadguard<>memptymappendmconcatjoin<*>pure*>BoundedEnumEq GHC.FloatFloating FractionalIntegralMonadFunctorNumOrdGHC.ReadReadReal RealFloatRealFracGHC.ShowShow MonadFail Applicative Data.FoldableFoldableData.Traversable Traversable SemigroupMonoid GHC.TypesBoolCharDoubleFloatIntinteger-wired-inGHC.Integer.TypeInteger GHC.MaybeMaybeOrderingRationalIOWord Data.EitherEitherFalseNothingJustTrueLeftRightLTEQGTStringShowSshowGHC.ErrerrorWassert-failure-0.1.2.5-99cb0c41c5c21d9e8a01cd5f1bcb239f7d20db1fc153ce12fde284cf1f89355bControl.Exception.Assert.SugarallBswith showFailureblamemfilter<$!>unless replicateM_ replicateMfoldM_foldM zipWithM_zipWithM mapAndUnzipMforever<=<>=>filterM Data.ListisSubsequenceOf mapAccumR mapAccumLforMsequencemapM sequenceAtraverse&&&***secondreadIOreadLnreadFileinteract getContentsgetLinegetCharputStrLnputStrputCharGHC.IO.ExceptionioErrorGHC.IOFilePath userErrorIOErrorfindnotElem minimumBy maximumByallanyorand concatMapconcatmsum sequence_productminimummaximumelemfoldr1foldl'foldrfoldMap Data.OldListunwordswordsunlineslinesunfoldrsortOnsortBysort permutations subsequencestailsinitsgroupBygroupdeleteFirstsByunzip7unzip6unzip5unzip4zipWith7zipWith6zipWith5zipWith4zip7zip6zip5zip4genericReplicate genericIndexgenericSplitAt genericDrop genericTake genericLengthinsertByinsert partition transpose intercalate intersperse intersectBy intersectunionByunion\\deleteBydeletenubBynub isInfixOf isSuffixOf isPrefixOf findIndices findIndex elemIndices elemIndex stripPrefix dropWhileEnd Text.ReadreadreadseitherData.Ord comparinglex readParenreadList readsPrecText.ParserCombinators.ReadPReadSatanhacoshasinhtanhcoshsinhatanacosasintancossinlogBase**sqrtlogexppiatan2isIEEEisNegativeZeroisDenormalized isInfiniteisNaN scaleFloat significandexponent encodeFloat decodeFloat floatRange floatDigits floatRadixlcmgcd^^^oddevendivModquotRemmoddivremquotrecip/floorceilingroundtruncateproperFractionmaxBoundminBoundfromEnumtoEnumpredsucc showParen showStringshowCharshowsshowList showsPrecunzip3unzipzipWith3zipWithzip3!!lookupreversebreakspansplitAtdroptake dropWhile takeWhilecycle replicaterepeatiterate'iteratescanr1scanrscanl'scanl1scanlfoldl1'initlasttailunconshead Data.Maybemaybe Data.Functorvoid<$>uncurrycurrysubtractsignumabs*+asTypeOfuntil$!flip.constidapliftM5liftM4liftM3liftM2liftMwhen=<<<$<*mplusmzero MonadPlus undefinederrorWithoutStackTracecompare<<=>maxmin/=&&||notSbase-compat-0.11.2-24995b963fc943e0f59e528bbe3e143929024fceea84be16b037840197c356bdData.List.Compat singletondirectory-1.3.6.0System.Directory doesFileExist renameFileQint-cast-0.2.0.0-7c20dd29a411c3b9f3ec168919720c1b00ff5f9cd138920ad1bd0191fdb12fe1 Data.IntCastintCast text-1.2.4.0Data.Text.InternalTextRminimorph-0.3.0.0-09eb13b73e5bd2a9bbf1511a69f6d70c182f7129d9c8476722ee258d46ac1551NLP.Minimorph.Util<+>tshowdivUpsum<$$> partitionMlengthnullfromIntegralWraptoIntegralCrash intToDouble int64ToDoublemapM_forM_$fNFDataPolarity$fNFDataPerson $fNFDataPart$fHashableEnumSet$fHashableEnumMap$fAdjustableEnumMap$fLookupEnumMap$fIndexableEnumMap$fTraversableWithKeyEnumMap$fFoldableWithKeyEnumMap$fKeyedEnumMap$fZipWithKeyEnumMap $fZipEnumMap$fBinaryHashMap$fBinaryNominalDiffTime$fBinaryEnumSet$fBinaryEnumMap Frequency runFrequency nameFrequency maxBoundInt32 uniformFreqtoFreq scaleFreqnullFreq$fAlternativeFrequency$fMonadPlusFrequency$fApplicativeFrequency$fFunctorFrequency$fMonadFrequency$fShowFrequency $fEqFrequency$fOrdFrequency$fFoldableFrequency$fTraversableFrequency$fGenericFrequencyDiceXYAbsDepthDicecastDiceddLzzL intToDiceminDicemaxDice infsupDicesupDiceinfDicemeanDice reduceDice supDiceXY infDiceXY $fNumDice $fShowDice$fEqDice$fShowAbsDepth $fEqAbsDepth $fOrdAbsDepth$fBinaryAbsDepth $fShowDiceXY forkChildwaitForChildren RingBufferemptyconstoList$fBinaryRingBuffer$fShowRingBuffer$fGenericRingBufferFontSetfontMapScalable fontMapBitmapfontPropRegular fontPropBoldfontMono HintingMode HintingHeavy HintingLightFontDefinitionFontProportional FontMonospaceFontMapScalable FontMapBitmap makePhrase makeSentencesquashedWWandW appDataDirxMxDminusMminusM1minusM2oneMtenthM show64With2workaroundOnMainThreadMVar$fBinaryHintingMode$fNFDataHintingMode$fBinaryFontDefinition$fNFDataFontDefinition$fBinaryFontSet$fNFDataFontSet$fShowHintingMode$fEqHintingMode$fReadHintingMode$fGenericHintingMode$fShowFontDefinition$fEqFontDefinition$fReadFontDefinition$fGenericFontDefinition $fShowFontSet $fEqFontSet $fReadFontSet$fGenericFontSetSpeedDeltaTime timeTickstimeZero _timeTick timeEpsilontimeCliptimeTurn timeSecond turnsInSecond clipsInTurnabsoluteTimeAddabsoluteTimeSubtractabsoluteTimeNegatetimeFit timeFitUp timeRecent5 timeShifttimeDeltaToFrom timeDeltaAddtimeDeltaSubtracttimeDeltaReversetimeDeltaScaletimeDeltaPercent timeDeltaDivtimeDeltaToDigittimeDeltaInSecondsTextsInMstoSpeed fromSpeedminSpeed displaySpeed minimalSpeed speedWalk speedLimp speedThrustmodifyDamageBySpeed speedScalespeedAdd ticksPerMeterspeedFromWeightrangeFromSpeedrangeFromSpeedAndLinger $fShowSpeed $fShowTime$fEqTime $fOrdTime $fBinaryTime $fShowDelta $fEqDelta $fOrdDelta $fBinaryDelta$fFunctorDelta $fEqSpeed $fOrdSpeed $fBinarySpeed encodeEOFstrictDecodeEOF tryCreateDir tryWriteFile ClientOptionsschosenFontsetsallFontsScalesfonts sfontsetssfullscreenMode slogPrioritysmaxFpssdisableAutoYessnoAnim snewGameCli sbenchmarkstitlessavePrefixClisfrontendTeletype sfrontendNull sfrontendLazy sdbgMsgClisstopAfterSecondssstopAfterFramessprintEachScreen sexposePlaces sexposeItems sexposeActorsFullscreenMode NotFullscreenBigBorderlessWindow ModeChangedefClientOptions$fBinaryFullscreenMode$fNFDataFullscreenMode$fBinaryClientOptions$fShowFullscreenMode$fReadFullscreenMode$fEqFullscreenMode$fGenericFullscreenMode$fShowClientOptions$fEqClientOptions$fGenericClientOptionsStrategy nullStrategy liftFrequency.|reject.=>only bestVariantreturN mapStrategyM$fAlternativeStrategy$fMonadPlusStrategy$fApplicativeStrategy$fFunctorStrategy$fMonadStrategy$fShowStrategy$fFoldableStrategy$fTraversableStrategyChanceRndrandomRrandomR0 nextRandom randomWord32oneOfshuffle shuffleExcept frequencyrollFreqchanceoddsDice castDiceXYfoldrMfoldlM'EqpSlot EqpSlotMove EqpSlotMeleeEqpSlotDisplace EqpSlotAlter EqpSlotWaitEqpSlotMoveItemEqpSlotProject EqpSlotApplyEqpSlotSwimming EqpSlotFlyingEqpSlotHurtMeleeEqpSlotArmorMeleeEqpSlotArmorRanged EqpSlotMaxHP EqpSlotSpeed EqpSlotSight EqpSlotShineEqpSlotMiscBonusEqpSlotWeaponFastEqpSlotWeaponBigDoctrineTExploreTFollowTFollowNoItemsTMeleeAndRangedTMeleeAdjacentTBlockTRoamTPatrolFlagsflagsActivationFlagActivationMeleeableActivationPeriodicActivationUnderRangedActivationUnderMeleeActivationProjectileActivationTriggerActivationOnSmashActivationOnCombineActivationEmbedActivationConsumeFlagFragileLobableDurable EquipableBenignPreciousBlast ConditionUniqueMetaGame MinorEffects MinorAspects MeleeablePeriodic UnderRanged UnderMeleeSkillsSkillSkMoveSkMelee SkDisplaceSkAlterSkWait SkMoveItem SkProjectSkApply SkSwimmingSkFlying SkHurtMelee SkArmorMelee SkArmorRangedSkMaxHP SkMaxCalmSkSpeedSkSightSkSmellSkShineSkNocto SkHearing SkAggressionSkOdorSkDeflectRangedSkDeflectMeleegetSkaddSkcheckFl skillsToList zeroSkills addSkills scaleSkillssumScaledSkills nameDoctrinedescribeDoctrinedoctrineSkills blockOnly meleeAdjacentmeleeAndRanged ignoreItems$fHashableSkill $fBinarySkill$fHashableFlag $fBinaryFlag$fHashableDoctrine$fBinaryDoctrine$fHashableEqpSlot$fBinaryEqpSlot $fShowSkill $fEqSkill $fEnumSkill$fBoundedSkill$fGenericSkill $fShowSkills $fEqSkills $fOrdSkills$fHashableSkills$fBinarySkills $fShowFlag$fEqFlag $fEnumFlag $fBoundedFlag $fGenericFlag$fShowActivationFlag$fEqActivationFlag $fShowFlags $fEqFlags $fOrdFlags$fHashableFlags $fBinaryFlags$fShowDoctrine $fEqDoctrine$fEnumDoctrine$fBoundedDoctrine$fGenericDoctrine $fShowEqpSlot $fEqEqpSlot $fOrdEqpSlot $fEnumEqpSlot$fBoundedEqpSlot$fGenericEqpSlot AttrCharW32 attrCharW32AttrCharacAttracCharAttrfgbg Highlight HighlightNoneHighlightGreen HighlightBlueHighlightBrown HighlightCyan HighlightGreyHighlightWhiteHighlightMagenta HighlightRedHighlightYellowHighlightYellowAimHighlightRedAimHighlightNoneCursorColorBlackRedGreenBrownBlueMagentaCyanWhiteAltWhiteBrBlackBrRedBrGreenBrYellowBrBlue BrMagentaBrCyanBrWhitedefFGisBrightdarkCol brightColstdCol legalFgCol cVeryBadEvent cBadEventcRisk cGraveRiskcVeryGoodEvent cGoodEventcVistacSleepcWakeUpcGreed cNeutralEventcRareNeutralEventcIdentificationcMetacBoring cGameOver cTutorialHint colorToRGBhighlightToColordefAttr attrCharToW32attrCharFromW32 fgFromW32 bgFromW32 charFromW32 attrFromW32 spaceAttrW32 nbspAttrW32spaceCursorAttrW32trimmedLineAttrW32attrChar2ToW32attrChar1ToW32 $fNFDataColor $fBinaryColor $fShowColor $fReadColor $fEqColor $fOrdColor $fEnumColor$fGenericColor$fShowHighlight $fEqHighlight$fOrdHighlight$fEnumHighlight$fBoundedHighlight $fShowAttr$fEqAttr$fShowAttrChar $fEqAttrChar$fShowAttrCharW32$fEqAttrCharW32$fOrdAttrCharW32$fEnumAttrCharW32$fBinaryAttrCharW32 DirectionForwardBackwardItemDialogModeMStoreMOrgansMOwnedMSkillsMLoreMPlacesMModesSLoreSItemSOrganSTrunk SConditionSBlastSEmbedCStoreCGroundCOrganCEqpCStash ContentIdRarityFreqs GroupName fromGroupNameYXlinearInterpolation toContentId fromContentIdcontentIdIndexppCStore ppCStoreIn verbCStoreppSLore headingSLoreppItemDialogModeppItemDialogModeInppItemDialogModeFrom$fNFDataCStore$fBinaryCStore $fNFDataSLore $fBinarySLore$fBinaryItemDialogMode$fNFDataItemDialogMode$fBinaryDirection$fNFDataDirection$fShowGroupName $fEqGroupName$fOrdGroupName$fHashableGroupName$fBinaryGroupName$fNFDataGroupName$fShowContentId $fEqContentId$fOrdContentId$fEnumContentId$fHashableContentId$fBinaryContentId $fShowCStore $fReadCStore $fEqCStore $fOrdCStore $fEnumCStore$fBoundedCStore$fGenericCStore $fShowSLore $fReadSLore $fEqSLore $fOrdSLore $fEnumSLore$fBoundedSLore$fGenericSLore$fShowItemDialogMode$fReadItemDialogMode$fEqItemDialogMode$fOrdItemDialogMode$fGenericItemDialogMode$fShowDirection$fReadDirection $fEqDirection$fOrdDirection$fGenericDirection ContentDatavalidateRarity validFreqsemptyContentDatamakeContentDataokind omemberGroupoisSingletonGroup ouniqGroupopickofoldlWithKey' ofoldlGroup' omapVector oimapVectorolength RuleContentrtitlerXmaxrYmax rexeVersion rcfgUIName rcfgUIDefaultrwriteSaveClipsrleadLevelClips rscoresFilernearbyrstairWordCarriedrsymbolProjectileemptyRuleContentvalidateSinglemakeDataPointIPointpxpyspeedupHackXSize chessDist euclidDistSqadjacentblablaXY balancedWordfromTo originPoint $fEnumPoint $fBinaryPoint $fShowPoint $fEqPoint $fOrdPoint$fGenericPoint RadianAngleVectorIVectorvxvyisUnitnegchessDistVectoreuclidDistSqVectormoves movesCardinalmovesCardinalI movesDiagonalmovesDiagonalI longMoveTexts compassTextvicinityBoundedvicinityUnsafevicinityCardinalvicinityCardinalUnsafe movesSquaresquareUnsafeSetshift shiftBoundedtrajectoryToPathtrajectoryToPathBounded vectorToFrompathToTrajectorycomputeTrajectoryrotate normalizenormalizeVectortowards$fNFDataVector $fEnumVector$fBinaryVector $fShowVector $fReadVector $fEqVector $fOrdVector$fGenericVector ContainerCFloorCEmbedCActorCTrunkActorIdLevelId FactionIdItemId $fEnumLevelId$fBinaryContainer $fShowItemId $fEqItemId $fOrdItemId $fEnumItemId$fBinaryItemId$fShowFactionId $fEqFactionId$fOrdFactionId$fEnumFactionId$fHashableFactionId$fBinaryFactionId $fShowLevelId $fEqLevelId $fOrdLevelId$fHashableLevelId$fBinaryLevelId $fShowActorId $fEqActorId $fOrdActorId $fEnumActorId$fBinaryActorId$fShowContainer $fEqContainer$fOrdContainer$fGenericContainerArrayaxsizeaysizeavector UnboxRepClassUnboxReptoUnboxRepUnsafe fromUnboxRep toUnboxRep!accessI// replicateA unfoldrNAfoldrAfoldrA'foldlA'ifoldlA'ifoldrA'foldMA'mapAimapAimapMA_ minIndexesA maxIndexA maxIndexByA maxLastIndexAtoListA$fUnboxRepClassAttrCharW32$fUnboxRepClassContentId$fUnboxRepClassWord8$fUnboxRepClassBool $fBinaryArray $fShowArray $fEqArrayPerFidPerLid Perceptionpsightpsmell PerSmelledpsmelled PerVisiblepvisible totalVisible totalSmelledemptyPernullPeraddPerdiffPer$fBinaryPerception$fShowPerVisible$fEqPerVisible$fBinaryPerVisible$fShowPerSmelled$fEqPerSmelled$fBinaryPerSmelled$fShowPerception$fEqPerception$fGenericPerception PointSquarePointUI squareToUI uiToSquare mapStartY squareToMap mapToSquare $fEqPointUI $fShowPointUI$fEqPointSquare$fShowPointSquareOverlayAttrLineattrLine AttrStringblankAttrStringtextToAS textFgToAS stringToAS<+:><\:> emptyAttrLineattrStringToALfirstParagraphtextToAL textFgToAL stringToAL linesAttrsplitAttrStringindentSplitAttrStringindentSplitAttrString2splitAttrPhrase offsetOverlayoffsetOverlayX updateLine$fShowAttrLine $fEqAttrLineHistory newReportReportRepMsgNKMsgClassDistinctMsgSpottedItemMsgStatusSleepMsgStatusGoodUsMsgStatusBadUsMsgStatusOthersMsgStatusBenignMsgStatusWarningMsgStatusLongerUsMsgStatusLongThemMsgClassIgnoreMsgMacroOperationMsgRunStopReasonMsgStopPlayback MsgClassSaveMsgInnerWorkSpamMsgNumericReport MsgClassShowMsgPromptGenericMsgPromptFocusMsgPromptMentionMsgPromptModifyMsgPromptActorsMsgPromptItemsMsgPromptActionMsgActionAlertMsgSpottedThreatMsgClassShowAndSaveMsgBookKeepingMsgStatusWakeupMsgStatusStopUsMsgStatusStopThemMsgItemCreationMsgItemRuinationMsgDeathVictoryMsgDeathDeafeatMsgDeathBoringMsgRiskOfDeathMsgPointmanSwapMsgFactionIntelMsgFinalOutcomeMsgPlotExpositionMsgBackdropInfoMsgTerrainRevealMsgItemDiscoveryMsgSpottedActorMsgItemMovementMsgActionMajorMsgActionMinorMsgEffectMajorMsgEffectMediumMsgEffectMinorMsgMiscellanousMsgHeardOutsideMsgHeardNearbyMsgHeardFarawayMsgBackdropFocusMsgActionWarningMsgRangedMightyWeMsgRangedMightyUsMsgRangedOthersMsgRangedNormalUsMsgGoodMiscEventMsgBadMiscEventMsgNeutralEventMsgSpecialEventMsgMeleeMightyWeMsgMeleeMightyUsMsgMeleeComplexWeMsgMeleeComplexUsMsgMeleeOthersMsgMeleeNormalUsMsgActionCompleteMsgAtFeetMajorMsgAtFeetMinorMsgTutorialHintMsgClass MsgShared toMsgShared MsgPrototypeMsg UAttrString uToAttrString attrStringToUtoMsgtripleFromProto toMsgDistinctinterruptsRunningdisturbsResting scrapsRepeats tutorialHintmsgColor nullRepMsgNK emptyReportnullVisibleReport consReport renderReportrenderWholeReportrenderRepetition anyInReport emptyHistoryscrapRepetitionSinglescrapRepetition addToReportaddEolToNewReport archiveReportrenderTimeReport lengthHistory renderHistory$fBinaryMsgClassShowAndSave$fBinaryMsgClassShow$fBinaryMsgClassSave$fBinaryMsgClassIgnore$fBinaryMsgClassDistinct$fBinaryMsgClass $fBinaryMsg$fMsgSharedMsgClassIgnore$fMsgSharedMsgClassSave$fMsgSharedMsgClassShow$fMsgSharedMsgClassShowAndSave$fBinaryRepMsgNK$fBinaryHistory$fShowMsgClassShowAndSave$fEqMsgClassShowAndSave$fOrdMsgClassShowAndSave$fEnumMsgClassShowAndSave$fBoundedMsgClassShowAndSave$fGenericMsgClassShowAndSave$fShowMsgClassShow$fEqMsgClassShow$fOrdMsgClassShow$fEnumMsgClassShow$fBoundedMsgClassShow$fGenericMsgClassShow$fShowMsgClassSave$fEqMsgClassSave$fOrdMsgClassSave$fEnumMsgClassSave$fBoundedMsgClassSave$fGenericMsgClassSave$fShowMsgClassIgnore$fEqMsgClassIgnore$fOrdMsgClassIgnore$fEnumMsgClassIgnore$fBoundedMsgClassIgnore$fGenericMsgClassIgnore$fShowMsgClassDistinct$fEqMsgClassDistinct$fOrdMsgClassDistinct$fEnumMsgClassDistinct$fBoundedMsgClassDistinct$fGenericMsgClassDistinct$fShowMsgClass $fEqMsgClass $fOrdMsgClass$fGenericMsgClass $fShowMsg$fEqMsg$fOrdMsg $fGenericMsg$fShowRepMsgNK$fGenericRepMsgNK $fShowReport$fBinaryReport $fShowHistory$fGenericHistoryKMP kmpKeyMod kmpPointerKMmodifierkeyModifier NoModifier ControlShiftAltShiftShiftControlAltKeyEscReturnSpaceTabBackTab BackSpacePgUpPgDnUpDownEndBeginInsertDelete PrintScreenHomeKPFunLeftButtonPressMiddleButtonPressRightButtonPressLeftButtonReleaseMiddleButtonReleaseRightButtonRelease WheelNorth WheelSouthUnknownDeadKeyshowKeyshowKMescKM controlEscKMspaceKM safeSpaceKM undefinedKMreturnKMpgupKMpgdnKM wheelNorthKM wheelSouthKMupKMdownKMleftKMrightKMhomeKMendKM backspaceKMcontrolPleftButtonReleaseKMmiddleButtonReleaseKMrightButtonReleaseKM dirKeypadKeydirKeypadShiftChardirKeypadShiftKeydirLeftHandKeydirLeftHandShiftKey dirViChardirViKey dirViShiftKeydirMoveNoModifierdirRunNoModifier dirRunControl dirRunShift dirAllKey handleDir moveBindingmkKMmkChar keyTranslatekeyTranslateWeb $fNFDataKey $fBinaryKey$fNFDataModifier$fBinaryModifier$fShowKM $fNFDataKM $fBinaryKM$fOrdKey$fEqKey $fGenericKey$fShowModifier $fOrdModifier $fEqModifier$fGenericModifier$fOrdKM$fEqKM $fGenericKMAreatoAreafromAreaspanArea trivialArea isTrivialAreainsideshrinkexpand middlePointareaInnerBordersumAreaspunindex $fBinaryArea $fShowArea$fEqArea Analytics akillCountsKillMapKillHowKillKineticMeleeKillKineticRangedKillKineticBlastKillKineticPushKillOtherMeleeKillOtherRangedKillOtherBlast KillOtherPushKillActorLaunchKillTileLaunchKillDropLaunch KillCatchGenerationAnalyticsActorAnalyticsFactionAnalyticsemptyAnalyticsaddKilladdFactionKill addActorKill$fBinaryKillHow $fShowKillHow $fEqKillHow $fEnumKillHow$fGenericKillHow$fShowAnalytics $fEqAnalytics$fBinaryAnalytics TriggerItemtiverbtiobject tisymbolsHumanCmdMacroByArea ByAimModeComposeIfLocalComposeUnlessErrorCompose2ndLocal LoopOnNothingExecuteIfClearWaitWait10YellMoveDirRunDir RunOnceAheadMoveOnceToXhairRunOnceToXhairContinueToXhairMoveItemProjectApplyAlterDirAlterWithPointerCloseDirHelpHintItemMenuMainMenuMainMenuAutoOnMainMenuAutoOff DashboardGameTutorialToggleGameDifficultyIncrGameFishToggleGameGoodsToggleGameWolfToggleGameKeeperToggleGameScenarioIncr GameRestartGameQuitGameDropGameExitGameSaveAutomateAutomateToggle AutomateBack ChooseItemChooseItemMenuChooseItemProjectChooseItemApply PickLeaderPickLeaderWithPointer MemberCycleMemberCycleLevel SelectActor SelectNoneSelectWithPointerRepeat RepeatLastRecord AllHistory LastHistory MarkVision MarkSmell MarkSuspectMarkAnim OverrideTut SettingsMenu ChallengeMenuCancelAccept DetailCycleClearTargetIfItemClear ItemClear MoveXhairAimTgtAimFloorAimEnemyAimItem AimAscendEpsIncr XhairUnknown XhairItem XhairStairXhairPointerFloorXhairPointerMuteXhairPointerEnemyAimPointerFloorAimPointerEnemy AimModeCmd explorationaiming CmdTripleCmdArea CaMessage CaMapLeader CaMapPartyCaMap CaLevelNumber CaArenaName CaPercentSeen CaXhairDesc CaSelected CaCalmGauge CaCalmValue CaHPGauge CaHPValue CaLeaderDesc CmdCategory CmdMainMenu CmdDashboard CmdItemMenuCmdMoveCmdItemCmdAimCmdMetaCmdMouse CmdInternalCmdDebug CmdMinimalcategoryDescriptionareaDescription$fBinaryCmdCategory$fNFDataCmdCategory$fBinaryCmdArea$fNFDataCmdArea$fBinaryTriggerItem$fNFDataTriggerItem$fReadTriggerItem$fBinaryHumanCmd$fNFDataHumanCmd$fBinaryAimModeCmd$fNFDataAimModeCmd$fShowCmdCategory$fReadCmdCategory$fEqCmdCategory$fGenericCmdCategory $fShowCmdArea $fReadCmdArea $fEqCmdArea $fOrdCmdArea$fGenericCmdArea$fShowTriggerItem$fEqTriggerItem$fOrdTriggerItem$fGenericTriggerItem$fShowHumanCmd$fReadHumanCmd $fEqHumanCmd $fOrdHumanCmd$fGenericHumanCmd$fShowAimModeCmd$fReadAimModeCmd$fEqAimModeCmd$fOrdAimModeCmd$fGenericAimModeCmd UIOptions uCommands uHeroNamesuVi uLeftHanduChosenFontsetuAllFontsScaleuScreen1PerLineuHistory1PerLine uHistoryMaxuMaxFpsuNoAnimuhpWarningPercentuMessageColorsuCmdlineuFonts uFontsetsuFullscreenMode$fBinaryUIOptions$fNFDataUIOptions$fShowUIOptions$fGenericUIOptions ScreenContentrwidthrheightrwrap rwebAddress rintroScreen rapplyVerbMap rFontFiles OverlaySpace SingleFrame singleArraysinglePropOverlaysingleMonoOverlay PreFramesPreFrame PreFrames3 PreFrame3Frame FrameBase unFrameBase FrameForall unFrameForallFrameST ColorMode ColorFullColorBWblankSingleFrametruncateOverlaytruncateAttrLine overlayFrame $fEqColorMode$fEqSingleFrame$fShowSingleFrame RawFrontendfdisplay fshutdownfshowNowfchanKey fprintScreen fcoscreen startupBoundcreateRawFrontend resetChanKeysaveKMPmodifierTranslate Animation renderAnimblankcSymmapPosToOffset mzipSingleton mzipPairs pushAndDelay twirlSplashtwirlSplashShortblockHit blockMiss subtleHit deathBodyshortDeathBodyactorXteleportvanish swapPlacesfadeout $fEqAnimation$fShowAnimationstandardLayoutAndFeatures InputContentbcmdMapbcmdListbrevMapInputContentRaw evalKeyDefaddCmdCategory replaceDesc replaceCmdmoveItemTriple repeatTriplerepeatLastTriplemouseLMBmouseMMB mouseMMBMutemouseRMBgoToCmd runToAllCmdautoexploreCmdautoexplore25Cmd aimFlingCmd projectICmdprojectIprojectAflingTsapplyIKapplyIgrabCmd grabItemsdropCmd dropItemsdescIsdefaultHeroSelect macroRun25 memberCyclememberCycleLevelCCUIcoinputcoscreen emptyCCUIAndPath pathSourcepathListpathGoalpathLen MoveLegal MoveBlocked MoveToOpen MoveToClosed MoveToUnknown BfsDistancesuccBfsDistancepredBfsDistancesubtractBfsDistance minKnownBfsapartBfsmaxBfsDistanceabortedUnknownBfsmaskBfsfillBfs findPathBfs accessBfs distanceBfs$fUnboxRepClassBfsDistance$fBinaryAndPath$fShowBfsDistance$fEqBfsDistance$fOrdBfsDistance$fBitsBfsDistance $fEqMoveLegal $fShowAndPath$fGenericAndPathstandardKeysAndMouseapplyTsFlavour FancyNamezipPlainzipFancy zipLiquid zipGlassPlain zipGlassFancyzipStoryflavourToColor flavourToNamecolorToPlainNamecolorToFancyNamecolorToLiquidNamecolorToGlassPlainNamecolorToGlassFancyNamecolorToTeamName$fBinaryFlavour $fEnumFlavour$fShowFancyName $fEqFancyName$fOrdFancyName$fEnumFancyName$fBoundedFancyName$fGenericFancyName $fShowFlavour $fEqFlavour $fOrdFlavour$fGenericFlavourThrowMod throwVelocity throwLingerthrowHP TimerDice DetectKind DetectAll DetectActor DetectLoot DetectExit DetectHidden DetectEmbed DetectStashHpLeqHpGeqCalmLeqCalmGeq TriggeredByEffectBurnExplodeRefillHP RefillCalmDominateImpress PutToSleepSummonAscendEscapeParalyzeParalyzeInWater InsertMoveTeleport CreateItem DestroyItem ConsumeItemsDropItemRecharge DischargePolyItem RerollItemDupItemIdentifyDetect SendFlying PushActor PullActor ApplyPerfume AtMostOneOfOneOfOnSmash OnCombineOnUser NopEffect AndEffectOrEffect SeqEffectWhenUnless IfThenElse VerbNoLongerVerbMsg VerbMsgFailAspectTimeoutAddSkillSetFlagELabelToThrow PresentAsOddsItemKindisymbolinameifreqiflavouricountirarityiverbHitiweightidamageiaspectsieffectsikitidescHORRORAQUATICUNREPORTED_INVENTORYVALUABLE ANY_JEWELRY EXPLOSIVE ANY_FLASK ANY_POTION ANY_GLASS ANY_SCROLLTREASURE CRAWL_ITEM S_FRAGRANCES_SPARKS_SINGLE_SPARKMOBILE S_CURRENCY S_IMPRESSEDS_ASLEEPS_BRACED S_BONUS_HP COMMON_ITEM CONDITIONmandatoryGroupsSingletonmandatoryGroupsboostItemKindList boostItemKindforApplyEffectforDamageEffectisDamagingKind isEffEscapeisEffEscapeOrAscend timeoutAspectorEffect onSmashEffectonCombineEffectonSmashOrCombineEffectalwaysDudEffectstrengthOnSmashstrengthOnCombine getDropOrgansgetMandatoryPresentAsFromKinddamageUsefulnessverbMsgNoLonger verbMsgLess toVelocitytoLinger timerNone isTimerNone foldTimer toOrganBad toOrganGoodtoOrganNoTimer validateDupsvalidateDamage validateAll$fShowTimerDice$fHashableThrowMod$fBinaryThrowMod$fShowCondition $fEqCondition$fShowDetectKind$fEqDetectKind $fEqTimerDice$fShowThrowMod $fEqThrowMod $fOrdThrowMod$fGenericThrowMod $fShowAspect $fEqAspect$fShowItemKind $fShowEffect $fEqEffectProjectileTriggersProjYesProjNoFeatureEmbedOpenToCloseToChangeToOpenWith CloseWith ChangeWithHideAsBuildAsRevealAs ObscureAsWalkableClearDark OftenItem VeryOftenItem OftenActorNoItemNoActorConsideredByAITrailSpiceTileKindtsymboltnametfreqtcolortcolor2taltertfeature LEGEND_DARK LEGEND_LITS_BASIC_OUTER_FENCES_UNKNOWN_OUTER_FENCES_UNKNOWN_SPACE isUknownSpace unknownId isSuspectKindisOpenableKindisClosableKindtalterForStairs floorSymbol$fShowProjectileTriggers$fEqProjectileTriggers $fShowFeature $fEqFeature$fShowTileKind PlaceEntryPEntryPAroundPExistsFenceFWallFFloorFGroundFNoneCover CAlternateCStretchCReflect CVerbatimCMirror PlaceKindpsymbolpnamepfreqpraritypcoverpfenceptopLeft poverrideDark poverrideLit deadEndId$fBinaryPlaceEntry $fShowCover $fEqCover $fShowFence $fEqFence$fShowPlaceKind$fShowPlaceEntry$fEqPlaceEntry$fGenericPlaceEntry frontendNamestartupFrontendSessionswindow srenderer squareFontsquareFontSizemapFontIsBitmap spropFont sboldFont smonoFont squareAtlas smonoAtlas sbasicTexturestexturespreviousFramesforcedShutdownscontinueSdlLoop sframeQueue sframeDrawn FontAtlas startupFunshutdown forceShutdowndisplay drawFrame printScreen modTranslate colorToRGBA FrontSetup ChanFrontendFrontReq FrontFrame FrontDelayFrontKey FrontPressedFrontDiscardKeyFrontResetKeysFrontAdd FrontAutoYes FrontShutdownFrontPrintScreenchanFrontendIOgetKey fchanFrontend defaultMaxFps microInSecframeTimeoutThread lazyStartup nullStartupseqFrameCaveKindcsymbolcnamecfreq cXminSize cYminSize ccellSize cminPlaceSize cmaxPlaceSize cdarkOdds cnightOdds cauxConnectscmaxVoid cdoorChance copenChancechidden cactorCoeff cactorFreqcitemNum citemFreq cplaceFreq cpassable labyrinthcdefTile cdarkCorTile clitCorTile cwallTile ccornerTile cfenceTileN cfenceTileE cfenceTileS cfenceTileW cfenceApartclegendDarkTileclegendLitTile cminStairDist cmaxStairsNum cescapeFreq cstairFreq cstairAllowedcskipcdescDEFAULT_RANDOM$fShowCaveKind AutoLeader autoDungeon autoLevel LeaderMode LeaderNullLeaderAILeaderUIPlayerfnamefgroups fskillsOther fcanEscape fneverEmpty fhiCondPoly fhasGender fdoctrine fleaderModefhasUIHiIndeterminantHiConstHiLootHiSprintHiBlitz HiSurvivalHiKillHiLoss HiPolynomial HiSummand HiCondPolyOutcomeConquerDefeatedKilledRestartCampingTeamContinuityRoster rosterList rosterEnemy rosterAllyCavesModeKindmsymbolmnamemfreq mtutorialmrostermcavesmendMsgmrulesmdescmreasonmhint NO_CONFIRMS INSERT_COINCAMPAIGN_SCENARIO teamExplorervictoryOutcomesdeafeatOutcomesnameOutcomePastnameOutcomeVerbendMessageOutcome screensavevalidateSingleRostervalidateSinglePlayer$fBinaryTeamContinuity$fBinaryOutcome$fBinaryHiIndeterminant$fBinaryAutoLeader$fBinaryLeaderMode$fBinaryPlayer$fShowTeamContinuity$fEqTeamContinuity$fOrdTeamContinuity$fEnumTeamContinuity$fGenericTeamContinuity $fShowOutcome $fEqOutcome $fOrdOutcome $fEnumOutcome$fBoundedOutcome$fGenericOutcome$fShowHiIndeterminant$fEqHiIndeterminant$fGenericHiIndeterminant$fShowAutoLeader$fEqAutoLeader$fGenericAutoLeader$fShowLeaderMode$fEqLeaderMode$fGenericLeaderMode $fShowPlayer $fEqPlayer$fGenericPlayer $fShowRoster$fShowModeKindKindMeankmConstkmMean AspectRecordaTimeoutaSkillsaFlagsaELabelaToThrow aPresentAsaEqpSlotemptyAspectRecord castAspect aspectsRandom addMeanAspectceilingMeanDiceaspectRecordToListrollAspectRecordgetSkill checkFlag meanAspectonlyMinorEffectsitemTrajectory totalRangeisHumanTrinket goesIntoEqp loreFromModeloreFromContainer$fBinaryAspectRecord$fHashableAspectRecord$fShowAspectRecord$fEqAspectRecord$fOrdAspectRecord$fGenericAspectRecord$fShowKindMean $fEqKindMean $fOrdKindMean TileSpeedup isClearTabisLitTab isHideoutTab isWalkableTab isDoorTab isOpenableTab isClosableTabisChangableTabisModifiableWithTab isSuspectTab isHideAsTabconsideredByAITabisVeryOftenItemTabisCommonItemTabisOftenActorTab isNoItemTab isNoActorTab isEasyOpenTab isEmbedTab isAquaticTabalterMinSkillTabalterMinWalkTab ItemSpeedupCOpscocavecoitemcomodecoplacecorulecotile coItemSpeedup coTileSpeedup emptyCOpsemptyItemSpeedup getKindMean speedupItememptyTileSpeedupemptyTab$fEqCOps $fShowCOpsChanSave saveToChanloopSave wrapInSaves restoreGamecompatibleVersion delayPrint saveNameCli saveNameSer bkpAllSaves configError readError parseConfig mkUIOptionsapplyUIOptions ChallengecdiffcfishcgoodscwolfckeeperStatus stOutcomestDepth stNewGameDipl DiplomacyNeutralAllianceWarFactiongnamegcolorgplayer gteamContginitialgdiplgquit_gleadergstashgvictims gvictimsD FactionDicttshowChallengegleader isHorrorFactnoRunWithMultiisAIFactautoDungeonLevelautomatePlayerisFoeisFrienddifficultyBounddifficultyDefaultdifficultyCoeffdifficultyInversedefaultChallengepossibleActorFactions ppContainer$fBinaryDiplomacy$fBinaryStatus$fBinaryFaction$fBinaryChallenge$fShowDiplomacy $fEqDiplomacy$fEnumDiplomacy$fGenericDiplomacy $fShowStatus $fEqStatus $fOrdStatus$fGenericStatus $fShowFaction $fEqFaction$fGenericFaction$fShowChallenge $fEqChallenge$fOrdChallenge$fGenericChallenge ScoreDict ScoreTableunTable ScoreRecord insertPosregister showScoregetTable getRecord getStatusgetDate showAward$fBinaryScoreRecord$fShowScoreTable$fEqScoreRecord$fOrdScoreRecord$fGenericScoreRecord$fEqScoreTable$fBinaryScoreTable RequestTimedReqMoveReqMelee ReqDisplaceReqAlterReqWait ReqWait10ReqYell ReqMoveItems ReqProjectReqApplyReqUIReqUINop ReqUITimedReqUIGameRestartReqUIGameDropAndExitReqUIGameSaveAndExit ReqUIGameSave ReqUIDoctrine ReqUIAutomate RequestUIReqAIReqAINop ReqAITimed RequestAI$fShowRequestTimed $fShowReqUI $fShowReqAIItemDictItemBag ItemQuant ItemTimers ItemTimerDiscoveryBenefitBenefitbenInEqp benPickupbenApplybenMeleebenFling ItemIxMap DiscoveryKind ItemFullKitItemFullitemBase itemKindIditemKind itemDisco itemSuspect ItemDisco ItemDiscoFull ItemDiscoMean ItemKindIxDiscoveryAspect ItemIdentityIdentityObviousIdentityCoveredItemjkindjfidjflavour toItemKindIx quantSingle itemToFull6aspectRecordFull strongestSlotvalueAtEqpSlot itemTimerZerocreateItemTimershiftItemTimerdeltaOfItemTimerchargingncharges hasChargestrongestMelee unknownAspectunknownMeleeBonusunknownSpeedBonusconditionMeleeBonusconditionSpeedBonusarmorHurtCalculationmergeItemQuantlistToolsToConsumecountIidConsumedsubtractIidfromGrps$fBinaryItemIdentity$fHashableItemIdentity $fBinaryItem$fBinaryBenefit$fShowItemKindIx$fEqItemKindIx$fOrdItemKindIx$fEnumItemKindIx$fIxItemKindIx$fHashableItemKindIx$fBinaryItemKindIx$fShowItemIdentity$fEqItemIdentity$fGenericItemIdentity $fShowItem$fEqItem $fGenericItem$fShowItemDisco$fOrdItemDisco $fEqItemDisco$fShowItemFull $fShowBenefit$fGenericBenefit$fShowItemTimer $fEqItemTimer$fBinaryItemTimer TileAction EmbedActionToAction WithAction createTabcreateTabWithKey accessTab speedupTilealterMinSkillKindalterMinWalkKindisClearisLit isHideout isWalkableisDoor isOpenable isClosable isChangable isSuspectisHideAsconsideredByAI isExplorableisVeryOftenItem isCommonItem isOftenActorisNoItem isNoActor isEasyOpenisEmbed isAquatic alterMinSkill alterMinWalkkindHasFeatureopenTocloseTo embeddedItemsrevealAs obscureAshideAsbuildAsisEasyOpenKind isModifiableparseTileAction$fShowTileAction ReqFailure MoveUnskilledMoveUnskilledAsleep MoveNothingMeleeUnskilled MeleeSelf MeleeDistantMeleeNotWeaponDisplaceUnskilledDisplaceDistantDisplaceAccessDisplaceMultiple DisplaceDyingDisplaceBracedDisplaceImmobileDisplaceSupportedAlterUnskilled AlterUnwalked AlterDistantAlterBlockActorAlterBlockItem AlterNothing CloseDistant CloseClosed CloseNothingCloseNonClosable WaitUnskilled YellUnskilledMoveItemUnskilled EqpOverfull EqpStackFullApplyUnskilled ApplyFood ApplyRead ApplyPeriodicApplyOutOfReach ApplyChargingApplyNoEffects ItemNothing ItemNotCalm ItemOverStashNotCalmPreciousProjectUnskilledProjectAimOnselfProjectBlockTerrainProjectBlockActorProjectLobableProjectOutOfReachProjectFinderKeeperNoChangeDunLeaderimpossibleReqFailureshowReqFailurepermittedPreciouspermittedProjectpermittedProjectAIpermittedApply$fShowReqFailure$fEqReqFailureLevellkindldepthlfloorlembedlbiglprojltilelentrylarealsmelllstairlescapelseenlexplltimelnightEntryMapSmellMapTileMap ProjectileMap BigActorMap ItemFloorDungeon dungeonBoundsascendInBranchwhereToassertSparseItemsassertSparseProjectiles updateFloor updateEmbed updateBigMap updateProjMap updateTile updateEntry updateSmellat posToBigLvloccupiedBigLvl posToProjsLvloccupiedProjLvl posToAidsLvl findPosTry findPosTry2nearbyPassablePointsnearbyFreePoints sortEmbeds $fBinaryLevel $fShowLevel $fEqLevel WatchfulnessWWatchWWaitWSleepWWake ActorDictActorMaxSkillsResDeltaresCurrentTurnresPreviousTurnActorbtrunkbnumberbhpbhpDeltabcalm bcalmDeltabposboldposblidbfid btrajectoryborganbeqpbweapon bweapBenignbwatchbproj deltasSeriousdeltasSeriousThisTurn deltasHears deltaBenigndeltaWasBenign actorCanMeleeactorCanMeleeToHarmactorWorthChasingactorWorthKilling gearSpeed actorTemplate actorWaitsactorWaitsOrSleeps actorDyinghpTooLow calmEnoughcalmFullhpFullcanSleep prefersSleep checkAdjacent eqpOverfulleqpFreeNgetCarriedIidsAndTrunkgetCarriedIidCStoremonsterGenChance smellTimeout$fBinaryResDelta$fBinaryWatchfulness $fBinaryActor$fShowResDelta $fEqResDelta$fGenericResDelta$fShowWatchfulness$fEqWatchfulness$fGenericWatchfulness $fShowActor $fEqActor$fGenericActorStatesdungeon stotalDepthsactorDsitemD sitemIxMap sfactionDstimescopssgoldshigh sgameModeId sdiscoKind sdiscoAspectsactorMaxSkills unknownLevelunknownTileMapdefStateGlobal emptyStatelocalFromGlobal updateDungeon updateDepth updateActorD updateItemDupdateItemIxMapupdateFactionD updateTimeupdateCOpsAndCachedData updateGoldupdateDiscoKindupdateDiscoAspectupdateActorMaxSkills getItemBodyaspectRecordFromItemaspectRecordFromIidmaxSkillsFromActormaxSkillsInDungeon $fBinaryState $fShowState $fEqStatefidActorNotProjGlobalAssocs actorAssocsfidActorRegularAssocsfidActorRegularIdsfoeRegularAssocsfoeRegularListfriendRegularAssocsfriendRegularList bagAssocs bagAssocsKposToBig posToBigAssoc posToProjsposToProjAssocs posToAidsposToAidAssocscalculateTotal itemPricefindIidcombinedGround combinedOrgan combinedEqp combinedItems getActorBodygetActorMaxSkillsactorCurrentSkills canTraversegetCarriedAssocsAndTrunkgetContainerBag getFloorBag getEmbedBaggetBodyStoreBaggetFactionStashBagmapActorItems_getActorAssocsmemActor getLocalTimeregenCalmDeltaactorInAmbient dispEnemy itemToFull fullAssocs kitAssocs getItemKindId getIidKindId getItemKind getIidKindgetItemKindIdServergetIidKindIdServergetItemKindServergetIidKindServer tileAlterablelidFromCposFromC anyFoeAdjanyHarmfulFoeAdjadjacentBigAssocsadjacentProjAssocsarmorHurtBonusinMeleeMonadStateRead getsStategetStategetLevel getGameModeisNoConfirmsGame getEntryArena pickWeaponM displayTaunt DetailLevel DetailLow DetailMedium DetailHigh DetailAlldefaultDetailLeveleffectToSuffixconditionToObjectactivationFlagToObjectdetectToObject detectToVerbslotToSentence skillNameskillToDecorator skillSlots tmodToSuffkindAspectToSuffixaspectToSentence affixBonus wrapInParenswrapInChevrons affixDicedescribeToolsAlternativedescribeCrafting$fBinaryDetailLevel$fShowDetailLevel$fEqDetailLevel$fOrdDetailLevel$fEnumDetailLevel$fBoundedDetailLevel$fGenericDetailLevel ActorDictUIActorUIbsymbolbnamebpronounbcolor keySelected partActor partPronoun tryFindActor tryFindHeroK$fBinaryActorUI $fShowActorUI $fEqActorUI$fGenericActorUI ItemSlotsSingleItemSlotsSlotChar slotPrefixslotCharallSlotsintSlots slotLabel assignSlot sortSlotMapmergeItemSlots$fEnumSlotChar$fBinarySlotChar $fOrdSlotChar$fShowSlotChar $fEqSlotChar$fShowItemSlots$fBinaryItemSlots Slideshow slideshowOKXKYX ButtonWidth buttonFont buttonWidth FontSetupmonoFontpropFontFontOverlayMap DisplayFont isSquareFont isMonoFontmultiFontSetup monoFontSetupsingleFontSetuptextSizeemptySlideshowunsnoc toSlideshowattrLinesToFontMapmoreMsgendMsg maxYofOverlaymenuToSlideshowwrapOKXkeysOKX splitOverlaysplitOKX highSlideshow showTableshowNearbyScores$fShowDisplayFont$fEqDisplayFont$fEnumDisplayFont$fShowButtonWidth$fEqButtonWidth$fShowSlideshow $fEqSlideshowkeyHelpokxsNTGoalTStash TEnemyPosTEmbedTItemTSmellTUnknownTKnownTHideoutTargetTEnemy TNonEnemyTPointTVector TgtAndPathtapTgttapPath BfsAndPath BfsInvalidAlterLid StateClientsepsstargetDsfleeD sexploredsbfsDsundo sdiscoBenefitsfpersaltersrandom_sleader_ssidesquitscurChalsnxtChal smarkSuspect scondInMelee svictories scampings srestartssoptionsstabsemptyStateClientcycleMarkSuspect updateTarget getTarget updateLeaderssidesleader $fBinaryTGoal$fBinaryTarget$fBinaryTgtAndPath$fBinaryStateClient$fShowBfsAndPath $fShowTGoal $fEqTGoal$fGenericTGoal $fShowTarget $fEqTarget$fGenericTarget$fShowTgtAndPath$fGenericTgtAndPath$fShowStateClient ChosenLore ChosenNothing RunParams runLeader runMembers runInitial runStopMsg runWaitingKeyMacro unKeyMacroAimMode aimLevelId detailLevel ItemDictUI KeyMacroFramekeyMacroBuffer keyPendingkeyLast SessionUIsxhair sxhairGoTosactorUIsitemUIsslots slastItemMoveschanFsccui sUIOptionssaimMode sxhairMousedsitemSel sselectedsrunningshistoryspointer smacroFrame smacroStack slastLost swaitTimes swasAutomated smarkVision smarkSmell snxtScenario scurTutorial snxtTutorial soverrideTut susedHints smenuIxMap schosenLoresdisplayNeededsturnDisplayed sreportNullsstartsgstartsallTimesnframes sallNframes srandomUIemptySessionUIemptyMacroFrametoggleMarkVisiontoggleMarkSmellcycleOverrideTut getActorUI$fBinaryAimMode$fBinaryRunParams$fBinarySessionUI $fShowAimMode $fEqAimMode$fGenericAimMode$fShowKeyMacro $fEqKeyMacro$fBinaryKeyMacro$fSemigroupKeyMacro$fMonoidKeyMacro$fShowKeyMacroFrame$fShowRunParams MonadClient modifyClientMonadClientRead getsClientliftIO getClient putClientdebugPossiblyPrint createTabBFS dumpTextFile rndToAction condInMeleeM getPerFid aidTgtToPosmakeLinecurrentSkillsClientpickWeaponClient updateSalter createSalter MonadClientUI getsSession modifySessionupdateClientLeader getCacheBfs getCachePath clientPrintUIdebugPossiblyPrintUI getSession putSession connFrontend displayFrame displayFramesconnFrontendFrontKeysetFrontAutoYesfrontendShutdown chanFrontend anyKeyPresseddiscardPressedKeyresetPressedKeys addPressedKeyaddPressedControlEsc revCmdMap getReportUIcomputeChosenLoreminiHintAimingBareminiHintAimingLore getLeaderUI getArenaUI viewedLevelUI xhairToPossetXHairFromGUI clearAimMode getFontSetupscoreToSlideshowdefaultHistory tellAllClipPStellGameClipPSelapsedSessionTimeGTresetSessionStartresetGameStartpartActorLeaderpartPronounLeader tryRestoreleaderSkillsClientUI rndToActionUItryOpenBrowser continueRuncontinueRunDir walkableDir tryTurning checkAndRunmsgAddDuplicatemsgAddDistinctmsgAddmsgLnAddpromptMainKeys recordHistoryFleeViaStairsOrEscape ViaStairs ViaStairsUp ViaStairsDown ViaEscapeViaExit ViaNothing ViaAnythinginvalidateBfsAidinvalidateBfsPathAidinvalidateBfsLidinvalidateBfsPathLidinvalidateBfsAllinvalidateBfsPathAll createBfsupdatePathFromBfsgetCacheBfsAndPath createPathcondBFS furthestKnownclosestUnknown closestSmell embedBenefitclosestTriggerscondEnoughGearMunexploredDepth closestItems closestFoesclosestStashesoursExploringAssocsclosestHideout$fShowFleeViaStairsOrEscape$fEqFleeViaStairsOrEscapecondAimEnemyTargetedMcondAimEnemyOrStashMcondAimEnemyOrRememberedMcondAimNonEnemyPresentMcondAimCrucialMcondTgtNonmovingEnemyMcondAdjTriggerableMmeleeThreatDistListcondBlocksFriendsMcondFloorWeaponMcondNoEqpWeaponMcondCanProjectMcondProjectListMbenAvailableItemshinderscondDesirableFloorItemMbenGroundItems desirableItem condSupport condAloneMcondShineWouldBetrayMfleeList refreshTarget computeTargetpickActorToMovesetTargetFromDoctrinesApplyItemGroup pickActionactionStrategy waitBlockNowyellNowpickup equipItems yieldUnneeded unEquipItemsgroupByEqpSlot bestByEqpSlotharmful meleeBlockermeleeAnytrigger projectItem applyItemflee displaceFoedisplaceBlocker displaceTgtchase moveTowards moveOrRunAid$fEqApplyItemGroupqueryAIpickActorAndAction AtomicFailMonadStateWrite modifyStateputState atomicFail updateLevel updateActor updateFaction moveActorMap swapActorMapinsertBagContainerinsertItemContainerinsertItemFloorinsertItemEmbedinsertItemActorinsertItemOrgan insertItemEqpinsertItemStashdeleteBagContainerdeleteItemContainerdeleteItemFloordeleteItemEmbeddeleteItemActordeleteItemOrgan deleteItemEqpdeleteItemStash rmFromBag itemsMatchaddItemToActorMaxSkillsresetActorMaxSkills$fExceptionAtomicFail$fShowAtomicFailSfxMsg SfxUnexpected SfxExpectedSfxExpectedEmbed SfxFizzlesSfxNothingHappensSfxNoItemsForTileSfxVoidDetectionSfxUnimpressedSfxSummonLackCalmSfxSummonTooManyOwnSfxSummonTooManyAllSfxSummonFailureSfxLevelNoMoreSfxLevelPushedSfxBracedImmuneSfxEscapeImpossibleSfxStasisProtectsSfxWaterParalysisResistedSfxTransImpossibleSfxIdentifyNothingSfxPurposeNothingSfxPurposeTooFewSfxPurposeUniqueSfxPurposeNotCommonSfxRerollNothingSfxRerollNotRandom SfxDupNothing SfxDupUniqueSfxDupValuable SfxColdFish SfxReadyGoodsSfxTimerExtendedSfxCollideActor SfxItemYield SfxAtomic SfxStrike SfxRecoilSfxSteal SfxRelease SfxProject SfxReceiveSfxApplySfxCheck SfxTriggerSfxShun SfxEffectSfxItemApplied SfxMsgFid SfxRestartSfxCollideTileSfxTauntHearMsgHearUpd HearStrike HearSummonHearCollideTile HearTaunt UpdAtomicUpdRegisterItemsUpdCreateActorUpdDestroyActor UpdCreateItemUpdDestroyItem UpdSpotActor UpdLoseActor UpdSpotItem UpdLoseItemUpdSpotItemBagUpdLoseItemBag UpdMoveActor UpdWaitActorUpdDisplaceActor UpdMoveItem UpdRefillHP UpdRefillCalm UpdTrajectoryUpdQuitFactionUpdSpotStashFactionUpdLoseStashFactionUpdLeadFactionUpdDiplFactionUpdDoctrineFactionUpdAutoFaction UpdRecordKill UpdAlterTileUpdAlterExplorable UpdAlterGold UpdSearchTile UpdHideTile UpdSpotTile UpdLoseTile UpdSpotEntry UpdLoseEntry UpdAlterSmell UpdSpotSmell UpdLoseSmell UpdTimeItem UpdAgeGame UpdUnAgeGame UpdDiscoverUpdCoverUpdDiscoverKind UpdCoverKindUpdDiscoverAspectUpdCoverAspectUpdDiscoverServerUpdCoverServer UpdPerception UpdRestartUpdRestartServer UpdResumeUpdResumeServer UpdKillExit UpdWriteSave UpdHearFid CmdAtomic undoUpdAtomic undoSfxAtomic undoCmdAtomic $fShowHearMsg$fShowUpdAtomic $fShowSfxMsg$fShowSfxAtomic$fShowCmdAtomic PosAtomicPosSightPosFidAndSightPosSmellPosSightLevelsPosFid PosFidAndSerPosSerPosAllPosNone posSfxAtomic iidUpdAtomic iidSfxAtomicpointsProjBody posProjBody singleAid doubleAidsingleContainerStashsingleContainerActorbreakUpdAtomiclidOfPos seenAtomicCli seenAtomicSer$fShowPosAtomic $fEqPosAtomichandleUpdAtomicupdRegisterItemsupdCreateActorupdDestroyActor updCreateItemupdDestroyItemupdSpotItemBagupdLoseItemBag updMoveActor updWaitActorupdDisplaceActor updMoveItem updRefillHP updRefillCalm updTrajectoryupdQuitFactionupdSpotStashFactionupdLoseStashFactionupdLeadFactionupdDiplFactionupdDoctrineFactionupdAutoFaction updRecordKill updAlterTileupdAlterExplorable updSearchTile updSpotTile updLoseTile updAlterSmell updSpotSmell updLoseSmell updTimeItem updAgeGame updUnAgeGameageLevel updDiscoverupdCoverupdDiscoverKind discoverKind updCoverKindupdDiscoverAspectdiscoverAspectupdCoverAspectupdDiscoverServerupdCoverServer updRestartupdRestartServerupdResumeServerResponseRespUpdAtomicNoState RespUpdAtomic RespQueryAI RespSfxAtomic RespQueryUI$fShowResponse partItemN textAllPowerspartItem partItemShortpartItemShortest partItemHighpartItemWsRangedpartItemWsDetail partItemWspartItemWsShortestpartItemWsShortpartItemWsLongpartItemShortAWpartItemMediumAWpartItemShortWownWviewItemitemDesc targetDesctargetDescXhairdrawFrameTerraindrawFrameContent drawFramePathdrawFrameActordrawFrameExtradrawFrameStatus drawHudFramedrawArenaStatusdrawLeaderStatusdrawLeaderDamage drawSelectedcheckWarningHPcheckWarningCalm checkWarnings drawOverlayoneLineBasicFrame pushFrame promptGetKey addToMacrodropEmptyMacroFrameslastMacroFrame stopPlayBack resetPlayBackrenderAnimFramesanimate fadeOutOrInoverlayToSlideshowreportToSlideshowreportToSlideshowKeepHaltdisplaySpaceEsc displayMoredisplayMoreKeep displayYesNo getConfirmsdisplayChoiceScreen FailOrCmdMError FailError showFailError mergeMErrorfailWithfailSerfailMsg weaveJustpartyAfterLeader pickLeaderpickLeaderWithPointer itemOverlay skillsOverlayplacesFromState placesOverlay describeMode modesOverlay pickNumber lookAtTile lookAtActorsguardItemVerbs guardItemSize lookAtItems lookAtStashlookAtPositiondisplayItemLoredisplayItemLorePointedAt viewLoreItems cycleLore spoilsBlurbppContainerWownW nxtGameMode$fShowFailError $fEqFailError SuitabilitySuitsEverythingSuitsSomething DefItemKeydefLabeldefCond defActionResultItemDialogModeRStoreROrgansROwnedRSkillsRLoreRPlacesRModesItemDialogState ISuitableIAll accessModeBagslotsOfItemDialogMode getGroupItem getStoreItemstoreItemPromptgetFullgetItem transitionkeyOfEKM runDefItemKey$fShowItemDialogState$fEqItemDialogState$fShowResultItemDialogMode macroHumanmacroHumanTransitionchooseItemHumanchooseItemDialogModeLorechooseItemDialogModechooseItemProjectHumanpermittedProjectClient projectCheck xhairLegalEps posFromXhairpsuitReqtriggerSymbolschooseItemApplyHumanpermittedApplyClientpickLeaderHumanpickLeaderWithPointerHumanmemberCycleLevelHumanmemberCycleHumanselectActorHuman selectAidselectNoneHumanselectWithPointerHuman repeatHumanrepeatHumanTransitionrepeatLastHumanrepeatLastHumanTransition recordHumanrecordHumanTransitionallHistoryHuman eitherHistorylastHistoryHumanmarkVisionHumanmarkSmellHumanmarkSuspectHuman markAnimHumanoverrideTutHumanprintScreenHuman cancelHuman acceptHuman endAiming endAimingMsgdetailCycleHumanclearTargetIfItemClearHumandoLookitemClearHumanmoveXhairHuman aimTgtHuman aimFloorHuman aimEnemyHuman aimItemHumanaimAscendHuman epsIncrHuman flashAimingxhairUnknownHumanxhairItemHumanxhairStairHumanxhairPointerFloorHumanxhairPointerMuteHumanxhairPointerEnemyHumanaimPointerFloorHumanaimPointerEnemyHuman byAreaHumanareaToRectanglesbyAimModeHumancomposeIfLocalHumancomposeUnlessErrorHumancompose2ndLocalHumanloopOnNothingHumanexecuteIfClearHuman waitHuman waitHuman10 yellHuman moveRunHumanmeleeAid displaceAidmoveSearchAlter alterCommonrunOnceAheadHumanmoveOnceToXhairHuman goToXhairgoToXhairExplorationMode goToXhairGoTomultiActorGoTorunOnceToXhairHumancontinueToXhairHuman moveItemHumanmoveOrSelectItemselectItemsToMove moveItems projectHuman applyHuman alterDirHumanalterTileAtPos verifyAltersprocessTileActions verifyEscapeverifyToolEffectalterWithPointerHuman closeDirHumancloseTileAtPos msgAddDone pickPoint helpHuman hintHumandashboardHuman itemMenuHumanchooseItemMenuHuman generateMenu mainMenuHumanmainMenuAutoOnHumanmainMenuAutoOffHumansettingsMenuHumanchallengeMenuHumangameTutorialTogglegameDifficultyIncrgameFishTogglegameGoodsTogglegameWolfTogglegameKeeperTogglegameScenarioIncrgameRestartHuman gameQuitHuman gameDropHuman gameExitHuman gameSaveHuman doctrineHuman automateHumanautomateToggleHumanautomateBackHumanrestrictedCmdSemInCxtOfKMnoRemoteHumanCmd updateKeyLastcmdSemInCxtOfKM cmdSemantics addNoErrordisplayRespUpdAtomicUIupdateItemSlotmarkDisplayNeeded lookAtMove aidVerbMUaidVerbDuplicateMUitemVerbMUGeneral itemVerbMUitemVerbMUShort itemAidVerbMUmitemAidVerbMUitemAidDistinctMUmanyItemsAidVerbMU createActorUIdestroyActorUI spotItemBag moveActordisplaceActorUI moveItemUI quitFactionUIdisplayGameOverLootdisplayGameOverAnalyticsdiscover ppHearMsgppHearDistanceAdjectiveppHearDistanceAdverbdisplayRespSfxAtomicUIppSfxMsgstrikequeryUI humanCommandeffectToBenefitaverageTurnValue avgItemDelay avgItemLifedurabilityMult organBenefit recBenefitfakeItemaspectToBenefitcapStataspectRecordToBenefittotalUsefulnessMonadClientSetup saveClientcmdAtomicSemCliinvalidateInMeleeinvalidateInMeleeDueToItemwipeBfsIfItemAffectsSkillstileChangeAffectsBfs createActor destroyActoraddItemToDiscoBenefit perceptiondiscoverKindAndAspect coverKindcoverAspectAndKind coverAspectkillExitMonadClientAtomic execUpdAtomic execPutStateMonadClientWriteRequest sendRequestAI sendRequestUI clientHasUIhandleResponseMonadClientReadResponsereceiveResponseinitAIinitUIloopCliS_MORE_PRACTICALS_MORE_PROJECTING S_MORE_TIDYS_MORE_PATIENTS_MORE_MODIFYINGS_MORE_DISPLACINGS_MORE_COMBATIVE S_MORE_MOBILES_PARSIMONIOUS S_WITHHOLDINGS_DISPOSSESSED S_IMPATIENT S_RETAININGS_IRREPLACEABLE S_PACIFIED S_IMMOBILES_POISON_RESISTANTS_SLOW_RESISTANT S_POISONEDS_REGENERATING S_FRENZIEDS_DRUNKS_DEAF S_DEAFENED S_SHINY_EYEDS_MELEE_DEFLECTINGS_RANGED_DEFLECTINGS_ROSE_SMELLINGS_FOUL_SMELLINGS_KEEN_SMELLINGS_BLIND S_FAR_SIGHTEDS_SLOWEDS_HASTED S_RESOLUTE S_DEFENSELESSS_PROTECTED_FROM_RANGEDS_PROTECTED_FROM_MELEE S_WEAKENEDS_STRENGTHENEDnoStatGN bonusStatGNtemporariesGNSingleton temporaries ARMOR_MISCS_FOCUSED_BURNING_OIL_4S_FOCUSED_BURNING_OIL_3S_FOCUSED_BURNING_OIL_2S_BURNING_OIL_4S_BURNING_OIL_3S_BURNING_OIL_2S_VIOLENT_BURNING_OIL_4S_VIOLENT_BURNING_OIL_3S_VIOLENT_BURNING_OIL_2 S_PING_PLASHS_POISON_CLOUDS_YOUTH_SPRINKLES_WHISKEY_SPRAY S_EYE_SHINES_SMELLY_DROPLET S_IRON_FILING S_EYE_DROPS_SLOWNESS_MIST S_HASTE_SPRAYS_RESOLUTION_DUSTS_DEFENSELESSNESS_RUNOUTS_RANGE_PROTECTIVE_BALMS_MELEE_PROTECTIVE_BALMS_SPARSE_SHOWERS_DENSE_SHOWER S_SLEEP_MISTS_ANTIDOTE_MISTS_ANTI_SLOW_MISTS_WASTES_GLUES_BOILING_WATERS_SMOKE S_DISTORTIONS_WOUNDING_MISTS_HEALING_MIST_2S_HEALING_MISTS_DISTRESSING_ODORS_CALMING_MIST S_PHEROMONES_FOCUSED_GLASS_HAIL S_GLASS_HAILS_FOCUSED_FLASHS_VIOLENT_FLASHS_FOCUSED_CONCUSSION S_CONCUSSIONS_VIOLENT_CONCUSSIONS_FOCUSED_FRAGMENTATIONS_FRAGMENTATIONS_VIOLENT_FRAGMENTATION S_FIRECRACKERblastsGNSingletonblastsGN blastNoStatOfblastBonusStatOfblasts SCAVENGERS_PUPILS_LEFT_TORSIONS_RIGHT_TORSIONS_LASHS_TOOTHS_SPEED_GLAND_10S_SPEED_GLAND_5S_EAR_8S_EAR_6S_EAR_3 S_VISION_16 S_VISION_12 S_VISION_6S_EYE_8S_EYE_6S_EYE_3 S_SULFUR_VENTS_ARSENIC_VENTS_BOILING_VENT S_SCENT_GLANDS_ANIMAL_BRAINS_SAPIENT_BRAINS_INSECT_MORTALITYS_RATLLE S_NOSTRILS_BARKS_ARMORED_SKIN S_HUGE_TAIL S_LARGE_TAILS_SCREECHING_BEAK S_VENOM_FANG S_VENOM_TOOTHS_STING S_BEE_STINGS_SULFUR_FISSURES_ARSENIC_FISSURES_BOILING_FISSURES_THORNS_LIPS_TIP S_TENTACLE S_RHINO_HORNS_HORNS_ANTLER S_LARGE_JAWS_JAW S_SMALL_JAWS_SNOUT S_SMALL_CLAW S_HOOKED_CLAWS_FOOTS_FISTorgansGNSingletonorgansGNorgansGEMSTARTING_WEAPONSTARTING_ARMOR ANY_ARROWRING_OF_OPPORTUNITY_SNIPERFIREPROOF_CLOTHLIGHT_ATTENUATOR WEAK_ARROW ADD_NOCTO_1 ARMOR_RANGED ADD_SIGHTS_WOODEN_TORCHIMMOBILE_ANIMAL MOBILE_ANIMALANIMAL SCOUT_MONSTERMOBILE_MONSTERMONSTERCIVILIAN SOLDIER_HERO BRAWLER_HERO AMBUSHER_HERO ESCAPIST_HERO RANGER_HERO SCOUT_HEROHEROactorsGNSingletonactorsGNactors playerHeroplayerAntiHeroplayerCivilian playerMonsterplayerAntiMonster playerAnimal playerHorrorplayerMonsterTouristplayerHunamConvictplayerAnimalMagnificentplayerAnimalExquisite hiHeroShort hiHeroMedium hiHeroLong hiDwellerS_SANDSTONE_ROCK FROZEN_GROUND STRAIGHT_PATH SHALLOW_WATERLECTERNSTAIRS_TRAP_DOWNSTAIRS_TRAP_UPESCAPE STAIRS_DOWN STAIRS_UP DOORWAY_TRAPDOORWAY_TRAP_UNKNOWNRUBBLEFROSTBIG_FIRE SMALL_FIRESIGNAGETREASURE_CACHE_TRAPTREASURE_CACHE SUBTLE_FRESCOOBSCENE_PICTOGRAMSCRATCH_ON_WALLembedsGNSingletonembedsGNembedsS_SHADED_GROUNDS_FLOOR_ASHES_DARKS_FLOOR_ASHES_LITS_FLOOR_ACTOR_DARKS_FLOOR_ACTOR_LIT S_SMOKE_LIT S_FOG_LIT S_BUSH_LITS_PULPITS_WALL_HORIZONTAL_LIT S_WALL_LIT S_TREE_DARK S_TREE_LIT S_LAMP_POSTESCAPE_OUTDOOR_DOWN ESCAPE_DOWN ESCAPE_UPGATED_STAIRCASE_DOWNSTAIRCASE_OUTDOOR_DOWNORDINARY_STAIRCASE_DOWNSTAIRCASE_DOWNGATED_STAIRCASE_UPSTAIRCASE_OUTDOOR_UPORDINARY_STAIRCASE_UP STAIRCASE_UP SIGNBOARDCACHESTAIR_TERMINAL_DARKSTAIR_TERMINAL_LITFOG_CLUMP_DARK FOG_CLUMP_LITBUSH_CLUMP_DARKBUSH_CLUMP_LITGLASSHOUSE_HORIZONTAL_DARKGLASSHOUSE_HORIZONTAL_LITGLASSHOUSE_VERTICAL_DARKGLASSHOUSE_VERTICAL_LITSMOKE_CLUMP_DARKSMOKE_CLUMP_LITTREE_SHADE_WALKABLE_DARKTREE_SHADE_WALKABLE_LITRECT_WINDOWS_HORIZONTAL_DARKRECT_WINDOWS_HORIZONTAL_LITRECT_WINDOWS_VERTICAL_DARKRECT_WINDOWS_VERTICAL_LITARENA_SET_DARK ARENA_SET_LITAMBUSH_SET_DARKAMBUSH_SET_LITESCAPE_SET_DARKESCAPE_SET_LIT ZOO_SET_DARK ZOO_SET_LITSHOOTOUT_SET_LIT BRAWL_SET_LITBATTLE_SET_DARKBATTLE_SET_LITPOWER_SET_DARK POWER_SET_LIT NOISE_SET_LITEMPTY_SET_DARK EMPTY_SET_LITFLOOR_ARENA_DARKFLOOR_ARENA_LIT DIRT_DARKDIRT_LITOUTDOOR_OUTER_FENCEDAMP_FLOOR_DARKDAMP_FLOOR_LIT LAB_TRAIL_LITSAFE_TRAIL_LIT TRAIL_LITFLOOR_CORRIDOR_DARKFLOOR_CORRIDOR_LIT FILLER_WALLgroupNamesSingleton groupNamescontentOUTDOOR_WALLED_STAIRCASEOUTDOOR_CLOSED_STAIRCASEOUTDOOR_TINY_STAIRCASEGATED_CLOSED_STAIRCASEGATED_OPEN_STAIRCASEGATED_TINY_STAIRCASEWALLED_STAIRCASECLOSED_STAIRCASEOPEN_STAIRCASETINY_STAIRCASEOUTDOOR_ESCAPE_DOWNINDOOR_ESCAPE_UPINDOOR_ESCAPE_DOWNEMPTYMINENOISEBATTLEAMBUSHARENASHOOTOUTBRAWLZOO LABORATORYROGUE SpecialArea SpecialFixed SpecialMergedCorridorHVHorizVertmkFixed pointInAreafindPointInArea mkVoidRoommkRoom connectGrid connectGrid' sortPointrandomConnection mkCorridor connectPlaces borderPlacegrid$fEqHV$fShowSpecialAreaPlaceqkindqareaqmapqfence TileMapEM placeCheck interiorArea buildPlace isChancePosolegendpover buildFence buildFenceMap buildFenceRnd tilePlace $fShowPlaceCavedkinddareadmapdstairsdentrydnight buildCave pickOpening $fShowCave EdgeIntervalEdgeCHullCHNilCHCons ConvexHullLine LineOrderingBumpBbxbyProgressDistancescansteepestInHull foldlCHull' addToHull addToHullGo createLine steepness _debugSteeper _debugLine $fShowBump $fShowLine $fShowCHull$fShowConvexHullMatrix FovLitLidFovLitfovLit FovClearLidFovClearfovClear FovLucidLidFovLucidfovLucidFovShinefovShine PerCacheFid PerCacheLidPerceptionCacheptotalperActorPerActorCacheBeforeLucid creachablecnoctocsmell PerReachable preachable PerValidFidFovValid FovInvalidperceptionFromPTotalperceptionFromPTotalNoStashperActorFromLevelboundSightByCalmcacheBeforeLucidFromActortotalFromPerActorlucidFromLevelshineFromLevelfloorLightSourceslucidFromItemsperFidInDungeon litFromLevel litInDungeonclearFromLevelclearInDungeonlucidInDungeonperLidFromFactionperceptionCacheFromLevelfullscan$fShowFovValid $fEqFovValid$fShowPerReachable$fEqPerReachable$fShowCacheBeforeLucid$fEqCacheBeforeLucid$fShowPerceptionCache$fEqPerceptionCache$fShowFovShine $fEqFovShine$fShowFovLucid $fEqFovLucid$fShowFovClear $fEqFovClear $fShowFovLit $fEqFovLit FlavourMapDiscoveryKindRev UniqueSetItemRevNewItem NoNewItem ItemKnown buildItem newItemKindnewItememptyDiscoveryKindRev serverDiscosemptyFlavourMapdungeonFlavourMap$fHashableItemKnown$fBinaryItemKnown$fShowItemKnown $fEqItemKnown$fGenericItemKnown$fShowDiscoveryKindRev$fBinaryDiscoveryKindRev$fShowFlavourMap$fBinaryFlavourMapRNGsdungeonRandomGeneratorstartingRandomGenerator ServerOptionssknowMap sknowEvents sknowItemssniff sallClearsboostRandomItem sgameMode sautomateAllskeepAutomated sdungeonRngsmainRng snewGameSer scurChalSer sdumpInitRngsssavePrefixSer sdbgMsgSersassertExploredsshowItemSamplessstopAfterGameOversclientOptionsdefServerOptions$fBinaryServerOptions $fBinaryRNGs $fShowRNGs$fShowServerOptions FreshDungeon freshDungeonfreshTotalDepthconvertTileMaps buildTileMap anchorDown buildLevelsnapToStairListplaceDownStairs levelFromCave dungeonGen GearOfTeams ActorPushedBy ActorTime StateServer sactorTime strajTime strajPushedBy steamGear steamGearCur stcounter sfactionAnsactorAn sgenerationAn sactorStasis sdiscoKindRev suniqueSetsitemRevsflavour sacounter sicounter snumSpawned sclientStatessperFid sperValidFid sperCacheFid sfovLucidLid sfovClearLid sfovLitLidsarenas svalidArenassrngs sbreakLoop sbreakASAP swriteSave soptionsNxtemptyStateServerupdateActorTimelookupActorTimeageActor$fBinaryStateServer$fShowStateServerMonadServerAtomicexecUpdAtomicSerexecUpdAtomicFidexecUpdAtomicFidCatch execSfxAtomic execSendPer MonadServer getsServer modifyServerchanSaveServer getServer putServerdebugPossiblyPrintAndExit serverPrint saveServerdumpRngs restoreScore registerScore getSetGenonlyRegisterItem registerItemmoveStashIfNeededrandomResetTimeoutcomputeRndTimeoutcreateCaveItemcreateEmbedItemembedItemOnPosprepareItemKindrollItemAspectrollAndRegisterItemplaceItemsInDungeonembedItemsInDungeonmapActorCStore_cmdAtomicSemSer validateFloorvalidateFloorBag levelOfStashinvalidateArenas updateSclear updateSlitinvalidateLucidLidinvalidateLucidAid actorHasShineitemAffectsShineRadiusitemAffectsPerRadius addPerActoraddPerActorAnydeletePerActordeletePerActorAnyinvalidatePerActorreconsiderPerActorinvalidatePerLidDebugAidlabelaidfactionlidbHPbtimebtrTimetime debugShow debugResponse debugPretty debugPlaindebugRequestAIdebugRequestUIdebugAid$fShowDebugAidMonadServerCommgetsDict modifyDict ChanServer responseS requestAIS requestUISConnServerDict CliSerQueue writeQueue readQueueAI readQueueUInewQueueputDict sendUpdatesendUpdateChecksendUpdNoStatesendSfx sendQueryAI sendQueryUIkillAllClientschildrenServer updateConn revealItemsgeneralMoveItemcontainerMoveItemquitF deduceQuits writeSaveAll verifyCaches keepArenaFact deduceKilledanyActorsAlive electLeadersetFreshLeader updatePerrecomputeCachePer projectFail projectBlaaddActorFromGroup registerActor addProjectileaddNonProjectile addActorIiddiscoverIfMinorEffectspickWeaponServercurrentSkillsServer getCacheLucid getCacheTotal allGroupItems addConditionremoveConditionSingleaddSleepremoveSleepSingleaddKillToAnalyticsinitPer reinitGame sampleTrunks sampleItems mapFromFuns resetFactions gameResetpopulateDungeon findEntryPoss applyDebug spawnMonster addAnyActor rollSpawnPos advanceTimeadvanceTimeTrajoverheadActorTimeswapTime updateCalmleadLevelSwitch endOrLoopgameExit EffApplyFlagseffToUse effVoluntaryeffUseAllCopieseffKineticPerformed effActivation effMayDestroyEffToUseEffBareEffBareAndOnCombine EffOnCombine UseResultUseDudUseIdUseUpapplyKineticDamagerefillHPcutCalmkineticEffectAndDestroyeffectAndDestroyAndAddKilleffectAndDestroyimperishableKititemEffectEmbeddeditemEffectDisco effectSem effectBurn effectExplodeeffectRefillHPeffectRefillCalmeffectDominatehighestImpressiondominateFidSfx dominateFiddropAllEquippedItems effectImpresseffectPutToSleep effectYell effectSummon effectAscend findStairExit switchLevels1 switchLevels2 effectEscapeeffectParalyzeparalyzeeffectParalyzeInWatereffectInsertMoveeffectTeleporteffectCreateItemeffectDestroyItemdropCStoreItem pickDroppableeffectConsumeItems consumeItemseffectDropItemeffectRechargeeffectPolyItemeffectRerollItem effectDupItemeffectIdentify identifyIid effectDetect effectDetectXeffectSendFlyingsendFlyingVectoreffectApplyPerfumeeffectAtMostOneOf effectOneOfeffectAndEffecteffectAndEffectSemeffectOrEffecteffectSeqEffect effectWhen effectUnlesseffectIfThenElseeffectVerbNoLonger effectVerbMsgeffectVerbMsgFail $fEqUseResult$fOrdUseResult $fEqEffToUse execFailurehandleRequestAIhandleRequestUI checkWaitingprocessWatchfulness affectStashhandleRequestTimedmanagePerRequesthandleRequestTimedCases switchLeader affectSmellreqMovereqMoveGenericreqMeleereqMeleeChecked reqDisplacereqDisplaceGenericreqAlter reqAlterFailreqWait reqWait10reqYell reqMoveItems reqMoveItem reqProjectreqApplyreqGameRestartreqGameDropAndExitreqGameSaveAndExit reqGameSave reqDoctrine reqAutomateloopSer factionArena arenasForLoop handleFidUpdloopUpdendClipmanageCalmAndDominationapplyPeriodicLevelhandleTrajectories hTrajectoriesadvanceTrajectory handleActorshActorsdieSer restartGamehandleCmdAtomicServerhandleAndBroadcastcmdItemsFromIids hearUpdAtomic hearSfxAtomic filterHearsendPer atomicForgetatomicRememberserverOptionsPIserverOptionsPCliImplementationrunCliImplementationCliStatecliState cliClient cliSessioncliDict cliToSave executorCli$$fMonadClientAtomicCliImplementation*$fMonadClientWriteRequestCliImplementation*$fMonadClientReadResponseCliImplementation $fMonadClientUICliImplementation#$fMonadClientSetupCliImplementation$fMonadClientCliImplementation"$fMonadClientReadCliImplementation"$fMonadStateWriteCliImplementation!$fMonadStateReadCliImplementation$fMonadCliImplementation$fFunctorCliImplementation$fApplicativeCliImplementationSerImplementationrunSerImplementationSerStateserState serServerserDict serToSave executorSer$$fMonadServerAtomicSerImplementation"$fMonadServerCommSerImplementation$fMonadServerSerImplementation"$fMonadStateWriteSerImplementation!$fMonadStateReadSerImplementation$fMonadSerImplementation$fFunctorSerImplementation$fApplicativeSerImplementation standardRules CHIC_GEAR CLOTHING_MISC ARMOR_LOOSERING_OF_OPPORTUNITY_GRENADIER EDIBLE_PLANTHARPOONotherItemContentitems CAVE_SAFARI_3 CAVE_SAFARI_2 CAVE_SAFARI_1 CAVE_BATTLE CAVE_AMBUSHCAVE_ZOO CAVE_ESCAPE CAVE_HUNT CAVE_SHOOTOUT CAVE_BRAWL CAVE_RAIDCAVE_OUTERMOSTCAVE_SHALLOW_ROGUE CAVE_EMPTY CAVE_MINE CAVE_NOISECAVE_LABORATORY CAVE_SMOKING CAVE_ARENA CAVE_ROGUE DEFENSE_EMPTYDEFENSEBATTLE_SURVIVALBATTLE_DEFENSESAFARI_SURVIVALCRAWL_SURVIVAL CRAWL_EMPTYSHORTSEEDIGSAFARIRANGEDBURNINGNIGHTHUNTPERILOUSFOGGYCRAWLLONGRAIDtieKnotForAsynctieKnotmapMaybe catMaybes listToMaybe maybeToList fromMaybefromJust isNothingisJust encodeDataGHC.WordWord32insidePmsgShowmsgSave writeLine fancyName baseColorcolorToStoryNameisAllypointsnegTimedatestatus challenge gplayerName ourVictims theirVictimsisModifiableWith _sdungeon _stotalDepth_sactorD_sitemD _sitemIxMap _sfactionD_stime_scops_sgold_shigh _sgameModeId _sdiscoKind _sdiscoAspect_sactorMaxSkills partItemN3rollFlavourMapversiongetDataFileName getBinDir getLibDir getDynLibDir getDataDir getLibexecDir getSysconfDir