~ (      !"#$%&'()*+,-./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 { | } ~                                                                 !"#$%&'()*+,-./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*:*;*<*=+>+?+@+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,{,|,},~,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,----------------------------....................//////////////////////////////////////000000000000001111 1 1 1 1 1111111111111122222 2!2"2#2$2%2&2'2(2)2*2+2,2-2.2/202122232425262728393:3;3<3=3>3?3@3A3B3C4D4E4F4G4H4I4J4K4L4M4N4O4P4Q4R4S4T4U4V4W4X4Y4Z4[4\4]4^4_4`4a4b4c4d4e4f4g4h4i4j4k4l4m4n4o4p4q4r4s4t5u5v5w5x5y5z5{5|5}6~6666666666666666666777777777777777788888888888888888888888888888888888999999999999999999999999999999999999999999999999999999999999999999999 9 9 9 9 9999999999999999999 9!9"9#9$9%9&9'9(9)9*9+9,9-9.9/909192939495969798999:9;9<9=9>9?9@9A9B9C9D9E9F9G9H9I9J9K9L9M9N9O9P: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@ yA zA {A |A }A ~A A A A A A A A A A A A A A A A A A A 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 C C C C C C C C 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 F F 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 I I I J J J J J J J K K K K K K K K K K K K K K K L L L L L L !L "L #L $L %L &L 'L (L )L *L +L ,L -M .M /M 0M 1M 2M 3M 4M 5M 6M 7M 8M 9M :M ;M <N =N >N ?N @N AN BN CN DN EN FN GN HN IN JN KN LN MN NN ON PN QO RO SO TO UO VO WO XO YO ZO [O \O ]P ^P _P `P aP bP cP dP eP fP gQ hQ iQ jQ kQ lQ mQ nQ oQ pQ qQ rQ sQ tQ uQ vQ wQ xQ yQ zQ {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 S S S S S S S S S S S S S T T T T T T T T T T U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U V V V V V W W W W W X X X X X X X X X X X X X X Y Y Y Y Y Y Y Z Z !Z "Z #Z $Z %Z &Z '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] {^ |^ }^ ~^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ` ` ` ` ` a a b b b b b b b b c c c c c 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 f f g g g g g g g g g !g "g #g $g %g &g 'g (g )g *g +g ,g -g .g /h 0h 1h 2h 3h 4h 5h 6h 7h 8i 9i :i ;i <i =i >i ?i @i Ai Bi Ci Di Ei Fi Gi Hj Ij Jj Kj Lj Mj Nj Oj Pj Qj Rj Sj Tj Uj Vj Wj Xj Yk Zk [k \k ]k ^k _k `k ak bk ck dk ek fk gk hk ik jk kk lk mk nk ok pk qk rk sl tl ul vl wl xl yl zm {m |m }m ~m m m m m m m m m m m m m m m m m m m m m n n n n n n n n o o o o o o o o p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p 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 r r r r r s s s s s s s s s s s s s s t t t t t t t t t t t t t t t t t t t t t t u u u u u u u u u u u !u "u #u $u %u &u 'u{None "#$V]^j Show and pack the result. Integer division, rounding up. ( ) * + , - . / 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 { | } ~         !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~   7 4None "#$6V]^j 2D 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.)Spacial dimension for points and vectors.)Spacial dimension for points and vectors.|The maximum number of bits for level X and Y dimension (16). The value is chosen to support architectures with 32-bit Ints.Maximal supported level X and Y dimension. Not checked anywhere. The value is chosen to support architectures with 32-bit Ints.9The distance between two points in the chessboard metric..Squared euclidean distance between two points.\Checks whether two points are adjacent on the map (horizontally, vertically or diagonally).'Checks that a point belongs to an area.=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.=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.See  Bhttp://roguebasin.roguelikedevelopment.org/index.php/Digital_lines.zA list of all points on a straight vertical or straight horizontal line between two points. Fails if no such line exists.   None "#$V]^jc%Arrays of, effectively, Word8 , indexed by Point.&Arrays indexed by Point.. Array lookup.05Construct an array updated with the association list.4*Create an array from a replicated element.51Create an array from a replicated monadic action.6 Create an array from a function.7(Create an array from a monadic function.9Content identifiers array size.:Fold right over an array.;"Fold right strictly over an array.<!Fold left strictly over an array.=SFold left strictly over an array (function applied to each element and its index).>KFold right over an array (function applied to each element and its index).?TFold right strictly over an array (function applied to each element and its index).@(Fold monadically strictly over an array.AZFold monadically strictly over an array (function applied to each element and its index).BMap over an array.CCMap over an array (function applied to each element and its index).DgMap monadically over an array (function applied to each element and its index) and ignore the results.E.Set all elements to the given value, in place.F;Set all elements to the given value, in place, if possible.G[Yield the point coordinates of a minimum element of the array. The array may not be empty.HbYield the point coordinates of the last minimum element of the array. The array may not be empty.IbYield the point coordinates of all the minimum elements of the array. The array may not be empty.JcYield the point coordinates of the first maximum element of the array. The array may not be empty.KbYield the point coordinates of the last maximum element of the array. The array may not be empty.L/Force the array not to retain any extra memory.*%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMN*&'()*%,-./0123456789:;<>?=@ABCDFEGHIJKLMN+&'()*None"#$6FKTV]^jRTactic of non-leader actors. Apart of determining AI operation, each tactic implies a skill modifier, that is added to the non-leader skills defined in  fskillsOther field of Player.S;if enemy nearby, attack, if no items, etc., explore unknownT:always follow leader's target or his position if no targetU/follow but don't do any item management nor useVonly melee and do ranged combatWonly melee (or wait)X.always only wait, even if enemy in melee rangeY9if enemy nearby, attack, if no items, etc., roam randomlyZdfind 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[Absolute 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.]Rarity on given depths.^6For 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.fActor's item stores.lItem container type.pfor bootstrapping actor bodiesq/A unique identifier of an actor in the dungeon.rAbstract level identifiers.s+A unique identifier of a faction in a game.wWRe-exported English phrase creation functions, applied to default irregular word sets.xWRe-exported English phrase creation functions, applied to default irregular word sets.y Level bounds.z breturn b a = [a | b]{mPersonal data directory for the game. Depends on the OS and the game, e.g., for LambdaHack under Linux it's ~/.LambdaHack/./RSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~/srqlmnopfghijk`abcde_^][\RSTUVWXYZtuvwxyz{|}~ RSTUVWXYZ[\_`abcdefghijklmnopqrsNone "#$V]^jZSerialize, compress and save data. Note that LBS.writeFile opens the file in binary mode.;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.?Read, decompress and deserialize data with an EOF marker. The OKr EOF marker ensures any easily detectable file corruption is discovered and reported before the function returns.Try 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.Try 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.vNone "#$V]^jNone"#$3456V]^j"H The 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."give acces to raw frequency values!short description for debug, etc.(Uniform discrete frequency distribution.RTakes a name and a list of frequencies and items into the frequency distribution.MScale frequency distribution, multiplying it by a positive integer constant.(Change the description of the frequency.Set frequency of an element.,Test if the frequency distribution is empty.Average value of an Into distribution, rounded up to avoid truncating it in the other code higher up, which would equate 1d0 with 1d1. None"#$6;=V]^jEqDice for rolling a pair of integer parameters pertaining to, respectively, the X and Y cartesian 2D coordinates.Multiple 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 signumk defined, because the functions for computing minimum, maximum and mean dice results would be too costly.mCast dice scaled with current level depth. Note that at the first level, the scaled dice are always ignored.EThe implementation calls RNG as many times as there are dice rolls, which is costly, so content should prefer to case 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./A die, rolled the given number of times. E.g., 1  2 rolls 2-sided die one time.YA die rolled the given number of times, with the result scaled with dungeon level depth.gA die, starting from zero, ending at one less than the bound, rolled the given number of times. E.g., 1  1 always rolls zero.A die, starting from zero, ending at one less than the bound, rolled the given number of times, with the result scaled with dungeon level depth./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.CMaximal value of dice. The scaled part taken assuming median level.CMinimal value of dice. The scaled part taken assuming median level.@Mean value of dice. The scaled part taken assuming median level.Maximal value of DiceXY.Minimal value of DiceXY.Mean value of DiceXY.None "#$V]^jK @The general type of a particular game content, e.g., item kinds. !symbol, e.g., to print on the map!name, e.g., to show to the playerfrequency within groups-validate a content item and list all offencesEvalidate the whole defined content of this type and list all offencesall content of this type            None"#$6DKV]^jXkOptimized representation of .)Character to display, with its attribute.0Text attributes: foreground color and highlight.foreground colour highlightaAdditional map cell highlight, e.g., a colorful square around the cell or a colorful background.')Colours supported by the major frontends.83The default colours, to optimize attribute setting.9AA helper for the terminal frontends that display bright via bold.: Colour sets.; Colour sets.< Colour sets.=@Translationg to heavily modified Linux console color RGB values.1Warning: SDL frontend sadly duplicates this code.oFor reference, the original Linux console colors. Good old retro feel and more useful than xterm (e.g. brown).>5The default attribute, to optimize attribute setting.6 !"#$%&'()*,-./+0123456789:;<=>?@ABCDEFGHI6'()*+,-./0123456789:;<= !"#$%&>?@ABCDEFGHI !"#$%&'()*+,-./01234567 None "#$6V]^jd eThe type of item flavours.*how fancy should the colour description bethe colour of the flavourg%Turn a colour set into a flavour set.h%Turn a colour set into a flavour set.i%Turn a colour set into a flavour set.j"The standard full set of flavours.k,Get the underlying base colour of a flavour.l%Construct the full name of a flavour.m4Human-readable names for item colors. The plain set.n4Human-readable names for item colors. The fancy set.o5Human-readable names for item colors. The liquid set.p8Simple names for team colors (bright colours preferred). efghijklmnop eghijklmnpfoef None "#$6V]^jj}$Skill level in particular abilities.This representation is sparse, so better than a record when there are more item kinds (with few abilities) than actors (with many abilities), especially if the number of abilities grows as the engine is developed. It's also easier to code and maintain.~DActor and faction abilities corresponding to client-server requests.}~~}~ None "#$QV]^jxjColor mode for the display.normal, with full coloursblack and white only|Sparse screen overlay representation where only the indicated rows are overlayed and the remaining rows are kept unchanged.A series of screen lines that either fit the width of the screen or are intended for truncation when displayed. The length of overlay may exceed the length of the screen, unlike in  SingleFrameZ. An exception is lines generated from animation, which have to fit in either dimension.Line of colourful text.3Render line of text in the given foreground colour.Split a string into lines. Avoids ending the line with a character other than whitespace or punctuation. Space characters are removed from the start, but never from the end of lines. Newlines are respected.6 None "#$QV]^j -Sequences of screen frames, including delays.An overlay that fits on the screen (or is meant to be truncated on display) and is padded to fill the whole screen and is displayed as a single game screen frame.Note that we don't provide a list of color-highlighed positions separately, because overlays need to obscure not only map, but the highlights as well.Efficiently 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 .[Representation of an operation of overwriting a frame with a single line at the given row.Truncate 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.sAdd a space at the message end, for display overlayed over the level map. Also trim (do not wrap!) too long lines.Overlays 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 "#$6V]^jEOptions that affect the behaviour of the client (but not game rules).0Font family to use for the GTK main game window./Font file to use for the SDL2 main game window.DPixels to add to map cells on top of scalable font max glyph height.@Pixels to add to map cells on top of .fon font max glyph height.*Font size to use for the main game window.6Whether to use bold attribute for colorful characters.Maximal 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.8Never auto-answer all prompts, even if under AI control.Don't show any animations.,Start a new game, overwriting the save file.7Don't create directories and files and show time stats."Prefix of the save game file name.)Whether to use the stdout/stdin frontend./Whether to use null (no input/output) frontend.:Whether to use lazy (output not even calculated) frontend.&Show clients' internal debug messages. Default value of client options.None"#$6KV]^jD 3State of legality of moves between adjacent points.6Weighted distance between points along shortest paths.QThe minimal distance value assigned to paths that don't enter any unknown tiles.The 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.The distance value that denotes that path search was aborted at this tile due to too large actual distance and that the tile was known and not blocked. It is also a true distance value for this tile (shifted by minKnownBfs, as all distances of known tiles).The 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.&Fill out the given BFS array. Unsafe  PointArray 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.IFind 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.>Access a BFS array and interpret the looked up distance value.starting positioninitial array, with apartBfsNone"#$345NV]^jT LA strategy is a choice of (non-empty) frequency tables of possible actions.UStrategy where only the actions from the given single frequency table can be picked.TStrategy with the actions from both argument strategies, with original frequencies. Strategy with no actions at all. Conditionally accepted strategy.Strategy with all actions not satisfying the predicate removed. The remaining actions keep their original relative frequency values.cWhen better choices are towards the start of the list, this is the best frequency of the strategy.AOverwrite the description of all frequencies within the strategy.Like  h*, but pick a name of the single frequency.  23None "#$V]^j] Fractional chance.6The monad of computations with random generator state.?Get a random object within a range with a uniform distribution.@Get a random object of a given type with a uniform distribution.1Get any element of a list with equal probability. 5Gen an element according to a frequency distribution. 6Randomly choose an item according to the distribution. Give True., with probability determined by the fraction. mCast dice scaled with current level depth. Note that at the first level, the scaled dice are always ignored. 5Cast dice scaled with current level depth and return True$ if the results is greater than 50.<Cast dice, scaled with current level depth, for coordinates.            None"#$KQV]^j[ +Content operations for the content of type a.content element at given id;the id of the unique member of a singleton content groupCpick a random id belonging to a group and satisfying a predicate"fold over all content elements of afold strictly over all content afold over the given group onlysize of content a)Content identifiers for the content type c.  None "#$V]^j "Animation is a list of frame modifications to play one by one, where each modification if a map from positions to level map symbols.#+Render animations on top of a screen frame.Located in this module to keep  Animation abstract.+GAttack animation. A part of it also reused for self-damage and healing.,!Attack that hits through a block.-Attack that is blocked..$Death animation for an organic body./GDeath animation for an organic body, short version (e.g., for enemies).0Mark actor location animation.1Actor teleport animation.21Swap-places animation, both hostile and friendly."#$%&'()*+,-./0123"#)*+,-./0123$%&'("None "#$6V]^j64Ring buffers of a size determined at initialization.6789:;6789:;6None "#$V]^j?@?@None"#$3KV]^j%ASpeed 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).BtOne-dimentional vectors. Introduced to tell apart the 2 uses of Time: as an absolute game time and as an increment.DsGame time in ticks. The time dimension. One tick is 1 microsecond (one millionth of a second), one turn is 0.5 s.E5Start of the game time, or zero lenght time interval.FThe 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.GAn infinitesimal time period.HAt 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.I|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).J'This many turns fit in a single second.K7This many ticks fits in a single second. Do not export,LjAbsolute time addition, e.g., for summing the total game session time from the times of individual games.NuAbsolute time negation. To be used for reversing time flow, e.g., for comparing absolute times in the reverse order.OSHow many time intervals of the latter kind fits in an interval of the former kind.P^How many time intervals of the latter kind cover an interval of the former kind (rounded up).Q+Shifting an absolute time by a time vector.RTime time vector between the second and the first absolute times. The arguments are in the same order as in the underlying scalar subtraction.STime time vector between the second and the first absolute times. The arguments are in the same order as in the underlying scalar subtraction.TReverse a time vector.UScale the time vector by an Int scalar value.V*Take the given percent of the time vector.WDivide a time vector.XfRepresent the main 10 thresholds of a time range by digits, given the total length of the time range.Y#Number of seconds in a mega-second.Z$Constructor for content definitions.[CPretty-printing of speed in the format used in content definitions.]#No movement possible at that speed.^CFast walk speed (2 m/s) that suffices to move one tile in one turn._Limp 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.`5Sword 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.aModify damage when projectiles is at a non-standard speed. Energy and so damage is proportional to the square of speed, hence the formula.bScale speed by an Int scalar value.cSpeed addition.dSpeed negation.eEThe number of time ticks it takes to walk 1 meter at the given speed.fZCalculate projectile speed from item weight in grams and velocity percent modifier. See  =https://github.com/LambdaHack/LambdaHack/wiki/Item-statistics.gGCalculate maximum range in meters of a projectile from its speed. See  =https://github.com/LambdaHack/LambdaHack/wiki/Item-statisticsq. With this formula, each projectile flies for at most 1 second, that is 2 turns, and then drops to the ground.hBCalculate maximum range taking into account the linger percentage.(ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefgh(DEGHIKLMNOPBCQRSTUVWXAZ[]^_`abcdefhFJY\gABCDNone"#$6KV]^j,zAThe history of reports. This is a ring buffer of the given length{EThe set of messages, with repetitions, to show at the screen at once.}"The type of a single game message.)the colours and characters of the message-whether message should be recorded in historyEmpty set of messages.%Test if the set of messages is empty.&Construct a singleton set of messages.@Add a message to the end of report. Deletes old prompt messages.`Add a message to the end of report. Does not delete old prompt messages nor handle repetitions.*Render a report as a (possibly very long) .5Empty history of reports of the given maximal length..Add a report to history, handling repetitions.<Render history as many lines of text, wrapping if necessary.z{|}~}|{z~z{|}None "#$6V]^jR2D 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.-Maximal supported vector X and Y coordinates.8Tells if a vector has length 1 in the chessboard metric.Checks whether a unit vector is a diagonal direction, as opposed to cardinal. If the vector is not unit, it checks that the vector is not horizontal nor vertical.Reverse an arbirary vector.NThe lenght of a vector in the chessboard metric, where diagonal moves cost 1./Squared euclidean distance between two vectors.TVectors of all unit moves in the chessboard metric, clockwise, starting north-west.HVectors of all cardinal direction unit moves, clockwise, starting north.HVectors of all diagonal direction unit moves, clockwise, starting north.Currently unused.=All (8 at most) closest neighbours of a point within an area.HAll (4 at most) cardinal direction neighbours of a point within an area.Translate a point by a vector.FTranslate a point by a vector, but only if the result fits in an area.1A list of points that a list of vectors leads to.HA list of points that a list of vectors leads to, bounded by level size.: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.+A list of vectors between a list of points.Rotate a vector by the given angle (expressed in radians) counterclockwise and return a unit vector approximately in the resulting direction.Given 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._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.limit the search to this areaposition to find neighbours oflimit the search to this areaposition to find neighbours of  None "#$6V]^jg,Key, modifier and position of mouse pointer.Key and modifier.Our own encoding of modifiers.0Frontend-independent datatype to represent keys.3a keypad key for a character (digits and operators)a single printable character function keyleft mouse button pressedmiddle mouse button pressedright mouse button pressedleft mouse button releasedmiddle mouse button releasedright mouse button releasedmouse wheel rotated northmouse wheel rotated south+an unknown key, registered to warn the user Common and terse names for keys.#Show a key with a modifier, if any.bConfigurable event handler for the direction keys. Used for directed commands such as close door.5Binding of both sets of movement keys, vi and laptop.Translate 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/keyname-table.h9Translate key from a Web API string description (https:/developer.mozilla.orgen-USdocsWebAPIKeyboardEvent/key#Key_values) to our internal key type. To be used in web frontends. The argument says whether Shift is pressed.S     S     None "#$V]^jm-wRaw frontend definition. The minimal closed set of values that need to depend on the specifics of the chosen frontend.5Empty the keyboard channel.7)Translates modifiers to our own encoding. -./01234567 -./01234567-./012None "#$V]^jq8The name of the frontend.9%Set up the frontend input and output.&Output to the screen via the frontend.the screen frame to draw8998None "#$V]^jx:(Session data maintained by the frontend.EThe name of the frontend.F:Set up and start the main loop providing input and output.:Apparently some SDL backends are not thread-safe (https:/wiki.libsdl.org-FAQDevelopment), so we stick to main thread.JAdd a frame to be drawn.L9Translates modifiers to our own encoding, ignoring Shift.Jfrontend session datathe screen frame to drawKfrontend session datathe screen frame to draw:;<=>?@ABCDEFGHIJKLMNFED:;<=>?@ABCGHIJKLMN: ;<=>?@ABCwNone "#$V]^jzEFFENone"#$&'FQV]^j O[Machinery allocated for an individual frontend at its startup, unchanged for its lifetime.PConnection channel between a frontend and a client. Frontend acts as a server, serving keys, etc., when given frames to display.RUThe instructions sent by clients to the raw frontend, indexed by the returned value.S Show a frame.T.Perform an explicit delay of the given length.U5Flush frames, display a frame and ask for a keypress.VInspect the fkeyPressed MVar.W#Discard a key in the queue, if any.XAdd a key to the queue.Y7Set in the frontend that it should auto-answer prompts.ZShut the frontend down.^@Initialize the frontend chosen by the player via client options.e The name of the chosen frontend.OPQRSTUVWXYZ[\]^_`abcdefghRSTUVWXYZ[\]PQ^eO_`abcdfghOPQR STUVWXYZ[\]None "#$6V]^j^Ui+AI and UI hints about the role of the item.wFeatures of item. Publicly visible. Affect only the item in question, not the actor, and so not additive in any sense.-drop and break at target tile, even if no hit#drop at target tile, even if no hit)don't break even when hitting or applyingparameters modifying a throwthe item starts identified!AI and UI flag: consider applying6AI and UI flag: consider equipping (independent of i#, e.g., in case of mixed blessings)&AI and UI flag: consider meleeing with_AI and UI flag: don't risk identifying by use; also, can't throw or apply if not calm enoughoverrides actor's tactickParameters modifying a throw of a projectile or flight of pushed actor. Not additive and don't start at 0.,fly with this percentage of base throw speed"fly for this percentage of 2 turns'Aspects of items. Those that are named Add*[ are additive (starting at 0) for all items wielded by an actor and they affect the actor.Fsome effects disabled until item recharges; expressed in game turns percentage damage bonus in melee$percentage armor bonus against melee%percentage armor bonus against ranged maximal hp maximal calm*speed in m/10s (not when pushed or pulled)+FOV radius, where 1 means a single tile FOV smell radius shine radiusnoctovision radius+aggression, e.g., when closing in for meleebonus to an abilitypSpecification of how to randomly roll a timer at item creation to obtain a fixed timer for the item's lifetime.Effects of items. Can be invoked by the item wielder to affect another actor or the wielder himself. Many occurences in the same item are possible.+secret (learned as effect) name of the item)AI and UI flag that leaks item propertiesburn with this damage&explode producing this group of blasts%modify HP of the actor by this amount'modify Calm of the actor by this amountchange actor's allegiance$make actor susceptible to domination/summon the given number of actors of this group&ascend to another level of the dungeonescape from the dungeon!paralyze for this many game clips/give free time to actor of this many game turns*teleport actor across rougly this distanceTcreate an item of the group and insert into the store with the given random timermake 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 copie of each kind to dropafind a suitable (i.e., numerous enough) item, starting from the floor, and polymorph it randomlyVfind a suitable (i.e., not identified) item, starting from the floor, and identify it)detect all on the map in the given radius,detect actors on the map in the given radius+detect items on the map in the given radius+detect exits on the map in the given radius,detect hidden tiles on the map in the radius.send an actor flying (push or pull, depending) push an actor pull an actor#make the actor drop its best weaponTactivate all items with this symbol in inventory; space character means all symbolsremove all smell on the level1trigger one of the effects with equal probabilityBtrigger the effect when item smashed (not when applied nor meleed))this effect inactive until timeout passesthe item is temporary, vanishes at even void Periodic activation, unless Durable and not Fragile, and shows message with this verb at last copy activation or at each activation unless Durable and Fragile&at most one copy can ever be generated$in equipment, triggered as often as Timeout permits/only fire next effect if previous was triggered9Item properties that are fixed for a given kind of items. map symbol generic namefrequency within groupspossible flavourscreated in that quantityrarity on given depths"the verb&noun for applying and hitweight in grams frequency of basic impact damagekeep the aspect continuouslycause the effect when triggeredpublic properties descriptionaccompanying organs and itemsTWhether the effect has a chance of exhibiting any potentially noticeable behaviour.$Catch invalid item kind definitions.Validate all item kinds.|ijklmnopqrstuvwxyz{|}~|ijklmnopqrstuvwxyz{|}~ijklmnopqrstuvwxyz{|}~  $None "#$V]^j2The type of game rule sets and assorted game data.yIn principle, it'se possible to have many rule sets and switch between them during a game session or even a single game.a symbolshort descriptionfrequency within groupstitle of the game (not lib)%font directory for the game (not lib)version of the gamename of the UI config file#the default UI settings config filethe ASCII art for the Main Menu6whether first non-spawner actor death ends the gamegame is saved that often'server switches leader level that oftenname of the scores file what distance between actors is nearby$Catch invalid rule kind definitions.HSince we have only one rule kind, the set of rule kinds is always valid. A dummy instance of the  o class, to satisfy general requirments about content. We won't don't expect to ever print out whole rule sets. None "#$6V]^j4#All possible terrain tile features.5ninitially an item of this group is embedded; we assume the item has effects and is supposed to be triggered6Agoes from a closed to (randomly closed or) open tile when altered7Bgoes from an open to (randomly opened or) closed tile when altered8,alters tile, but does not change walkability92when hidden, looks as the unique tile of the group:Cwhen generating, may be transformed to the unique tile of the group;Bwhen generating in opening, can be revealed to belong to the group<Ewhen generating in solid wall, can be revealed to belong to the group=actors can walk through>actors can see through? is not lit with an ambient light@#initial items often generated thereA$initial actors often generated thereBno items ever generated thereCno actors ever generated thereD0is allowed to have the same look as another tileEKeven if otherwise uninteresting, taken into account for triggering by AIF,used for visible trails throughout the levelGin place normal legend and in override, don't roll a tile kind only once per place, but roll for each position; one non-spicy and at most one spicy is rolled per place and then one of the two is rolled for each positionH(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  KindOps.Id index. The talter for unknown space is 1' and no other tile kind has that value.J map symbolKshort descriptionLfrequency within groupsM map colorNmap color when not in FOVO&minimal skill needed to alter the tileP propertiesQValidate a single tile kind.SValidate all tile kinds.aIf tiles look the same on the map (symbol and color), their substantial features should be the same, too. Otherwise, the player has to inspect manually all the tiles of that kind, or even experiment with them, to see if any is special. This would be tedious. Note that tiles may freely differ wrt text blurb, dungeon generation, AI preferences, etc.UFeatures of tiles that differentiate them substantially from one another. The intention is the player can easily tell such tiles apart by their behaviour and only looking at the map, not tile name nor description. So if running uses this function, it won't stop at places that the player can't himself tell from other places, and so running does not confer any advantages, except UI convenience. Hashes are accurate enough for our purpose, given that we use arbitrary heuristics anyway.<!"#$%&'()*+,-./01234>56789:;<=?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\<HIJKLMNOP456789:;<=>?@ABCDEFG#$%&'()*+,-./0123!"QSUVWXYZ[\RT!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOP!None "#$V]^jne)The choice of a fence type for the place.f'put a solid wall fence around the placeg*leave an empty space, like the rooms floorh+leave an empty space, like the caves groundi1skip the fence and fill all with the place properjA 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.k8reflect every other corner, overlapping 1 row and columnl6fill symmetrically 4 corners and stretch their bordersm7tile separately and symmetrically quarters of the placen7just build the given interior, without filling the areao6build the given interior in one of 4 mirrored variantspDParameters for the generation of small areas within a dungeon level.ra symbolsshort descriptiontfrequency within groupsurarity on given depthsv+how to fill whole place based on the cornerw(whether to fence place with solid borderx(plan of the top-left corner of the placeylegend overridezwCatch invalid place kind definitions. In particular, verify that the top-left corner map is rectangular and not empty.{1Validate all place kinds. Currently always valid.efghijklmnopqrstuvwxyz{pqrstuvwxyjklmnoefghiz{efghijklmnop qrstuvwxy"None "#$V]^j5${Parameters for the generation of dungeon levels. Warning: for efficiency, avoid embedded items in any of the common tiles.a symbolshort descriptionfrequency within groupsX size of the whole caveY size of the whole cave$the dimensions of the grid of places#minimal size of places; for mergingmaximal size of placesthe chance a place is darkthe chance the cave is dark!a proportion of extra connections,at most this proportion of rooms may be voidminimal distance between stairs!extra stairs on top of from above"the chance of a door in an openingif there's a door, is it open?"if not open, hidden one in n times"the lower, the more monsters spawnactor groups to considerthe number of items in the caveitem groups to considerplace groups to consider$are passable default tiles permittedthe default cave tilethe dark cave corridor tilethe lit cave corridor tilethe filler wallthe outer fence wallthe dark place plan legendthe lit place plan legendescape, if anyrplace groups to consider for stairs; in this case the rarity of items in the group does not affect group choicecave descriptionCatch caves with not enough space for all the places. Check the size of the cave descriptions to make sure they fit on screen. Etc.}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.%%"#None "#$6V]^ja(leader 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 wellclient 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 factionIf a faction with LeaderUI and LeaderAI has any actor, it has a leader.5faction can have no leader, is whole under AI controlleader under AI control!leader under UI control, assumes fhasUI"Properties of a particular player.name of the playerlnames of actor groups that may naturally fall under player's control, e.g., upon spawning or summoningufixed skill modifiers to the non-leader actors; also summed with skills implied by ftactic (which is not fixed)!the player can escape the dungeon(the faction declared killed if no actorsscore polynomial for the playerwhether actors have genderNnon-leaders behave according to this tactic; can be changed during the game the mode of switching the leaderIdoes the faction have a UI client (for control or passive observation)FConditional polynomial representing score calculation for this player.Outcome of a game.the faction was eliminated(the faction lost the game in another waygame is supended(the player won by eliminating all rivals$the player escaped the dungeon alivegame is restarted/The specification of players for the game mode.Yplayers in the particular team and levels, numbers and groups of their initial membersthe initial enmity matrixthe initial aliance matrixJRequested cave groups for particular levels. The second component is the Escape feature on the level. True means it's represented by <, False, by >.Game mode specification.a symbolshort descriptionfrequency within groupsplayers taking part in the gamearena of the game description)Catch invalid game mode kind definitions.Checks, 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."Validate game mode kinds together.88 $None "#$V]^jg4Operations for all content types, gathered together./The standard ruleset used for level operations.#Create content operations for type a% from definition of content of type a.%None "#$<V]^j. CWhether a tile does not block vision. Essential for efficiency of FOV, hence tabulated.UWhether a tile has ambient light --- is lit on its own. Essential for efficiency of  Perception, hence tabulated._Whether actors can walk into a tile. Essential for efficiency of pathfinding, hence tabulated.dWhether a tile is a door, open or closed. Essential for efficiency of pathfinding, hence tabulated.Whether a tile is changable.UWhether a tile is suspect. Essential for efficiency of pathfinding, hence tabulated.Whether 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 (walkable and) explorable status. Door 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.`Whether a tile kind (specified by its id) has an OpenTo feature and reasonable alter min skill.*Whether a tile kind has the given feature.@Whether a tile kind (specified by its id) has the given feature.(@Whether a tile kind (specified by its id) has an OpenTo feature.)@Whether a tile kind (specified by its id) has a CloseTo feature."      !"#$%&'()"  !"#$%&'()    &None"#$6KV]^j *WAll items in the dungeon (including in actor inventories), indexed by item identifier.+A 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.,Number 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./Fields are intentionally kept non-strict, because they are recomputed often, but not used every time. The fields are, in order: 1. whether the item should be kept in equipment (not in pack nor 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) benefit of hitting a foe in meleeing with the item 5. the (usually negative) benefit of flinging an item at an opponent6IThe map of item kind indexes to identifiers of items that have that kind.7]The map of item kind indexes to item kind ids. The full map, as known by the server, is 1-1.8BPartial information about item kinds. These are assigned to each K. There is an item kinda, mean aspect value computed (and here cached) for items of that kind and a flag saying whether the item's aspects are constant rather than random or dependent on dungeon level where the item is created.=Full information about an item.CcThe secret part of the information about an item. If a faction knows the aspects of the item (the I> field is not empty), this is a complete secret information/.JA seed for rolling aspects of an item Clients have partial knowledge of how item ids map to the seeds. They gain knowledge by identifying items.KAn 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.LJThe map of item ids to item aspects. The full map is known by the server.MBRecord of sums of aspect values of an item, container, actor, etc.\HGame items in actor possesion or strewn around the dungeon. The fields jsymbol, jname and jflavourt make it possible to refer to and draw an unidentified item. Full information about item is available through the jkindIx) index as soon as the item is identified.^&index pointing to the kind of the item_$lowest level the item was created at`)the faction that created the item, if anya map symbolb generic namecflavourdpublic propertieseweight in grams, obvious enoughf'impact damage of this particular weapong.A unique identifier of an item in the dungeon.h/Price an item, taking count into consideration.O*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxOg\]^_`abcdefhijklMNOPQRSTUVWXYZ[LmnopKJCDEFGHI=>?@AB89:;<76/012345.stuvx-,+*wqr /01234589:;<=>?@ABCDEFGHIJKMNOPQRSTUVWXYZ[\ ]^_`abcdefg'None "#$V]^j(None "#$6V]^j&Possible causes of failure of request.**")None "#$6V]^j5All actors on the level, indexed by actor identifier. resource change this player turn resource change last player turn5Actor properties that are changing throughout the game. If they appear dublets of properties of 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.#the trunk organ of the actor's bodycurrent hit points * 1MHP delta this turn * 1Mcurrent calm * 1Mcalm delta this turn * 1Mcurrent positionprevious position, if any current level&faction the actor currently belongs to8trajectory the actor must travel and his travel speedorganspersonal equipmentpersonal inventory pack&number of weapons among eqp and organsis the actor waiting right now?Eis a projectile? (shorthand only, this can be deduced from btrunk)0Whether an actor is braced for combat this clip.Chance that a new monster is generated. Currently depends on the number of monsters already present, and on the level. In the future, the strength of the character and the strength of the monsters present could further influence the chance, and the chance could also affect which monster is generated. How many and which monsters are generated will also depend on the cave kind used to build the level.5How long until an actor's smell vanishes from a tile.*q*q*None "#$V]^j +A view on single, inhabited dungeon level.  RememberedC fields carry a subset of the info in the client copies of levels.absolute depth of the level#remembered items lying on the floor%remembered items embedded in the tile%seen actors at positions on the levelremembered level mapwidth of the levelheight of the levelremembered smells on the levelpositions of (up, down) stairs currently remembered clear tiles total number of explorable tiles)local time on the level (possibly frozen)"the lower, the more monsters spawn +frequency of spawned actors; [] for clients!&number of initial items, 0 for clients"*frequency of initial items; [] for clients#positions of IK.Escape tiles$(whether the level is covered in darkness% level name&level description'Current smell on map tiles.(Tile kinds on the map.)Items located on map tiles.*Items located on map tiles.+?The complete dungeon is a map from level identifiers to levels.,FLevels in the current branch, one level up (or down) from the current.-XCompute 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.5 Query for tile kinds on the map.69Find a random position on the map satisfying a predicate.79Find a random position on the map satisfying a predicate.8@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 as many times, as needed, with only the mandatory predicate.-level of the stairsposition of the stairsoptional forced directioncurrent game dungeon5destination level and the pos of its receiving stairs8the number of trieslook up in this mapmandatory predicateoptional predicates9the number of trieslook up in this mapmandatory predicateoptional predicatesgood to have predicateworst case predicates+[r !"#$%&'()*+,-./0123456789+r[+,-*)(' !"#$%&0123456789./ !"#$%&+None "#$V]^jX=JSuffix 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.=>?@ABCDEFGHIJ=>?@ABDEFJCGHI,None "#$6V]^j|#M)game difficulty level (HP bonus or malus)N1lone wolf challenge (only one starting character)O-cold fish challenge (no healing from enemies)PThe goal of an actor.Q(last seen position of the targeted actorR)embedded item that can be triggered; in TPoint (TEmbed bag p) _ q usually bag is embbedded in p and q is an adjacent open tileSitem lying on the groundT!smell potentially left by enemiesUan unknown tile to be exploredVa known tile to be patrolledWan unspecified goalXThe type of na actor target.YDtarget an actor; cycle only trough seen foes, unless the flag is setZtarget a concrete spot[!target position relative to actor\Current game status.^current game outcome_depth of the final encounter`new game group to start, if anybGDiplomacy states. Higher overwrite lower in case of asymmetric content.gThe faction datatype.iindividual namejcolor of actors or their framesk the player spec for this factionlinitial actorsmdiplomatic modencause of game end/exitoFthe leader of the faction; don't use in place of sleader on clientspfaction's shared inventoryqmembers killedr=members killed in the past, by game mode and difficulty levels8All factions in the game, indexed by faction identifier.v;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.|/Check if factions are at war. Assumes symmetry.}/Check if factions are allied. Assumes symmetry.9sKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~9ssghijklmnopqrbcdef\]^_`XYZ[PQRSTUVWKLMNOtuvwxyz{|}~aKLMNOPQRSTUVWXYZ[\]^_`bcdefg hijklmnopqr-None"#$6KV]^jBPerception indexed by faction identifier. This can't be added to  FactionDict3, because clients can't see it for other factions.<Perception of a single faction, indexed by level identifier.=The type representing the perception of a faction on a level.Smelled positions.Visible positions..The set of tiles visible by at least one hero.,The set of tiles smelt by at least one hero..None"#$6KV]^j01A dictionary from game mode IDs to scores tables.(The list of scores, in decreasing order.A single score record. Records are ordered in the highscore table, from the best to the worst, in lexicographic ordering wrt the fields below. the score)game time spent (negated, so less better)"date of the last game interruptionreason of the game interruptionchallenge setup of the gamename of the faction's gplayer allies lost foes killedEmpty score tableqInsert a new score into the table, Return new table and the ranking. Make sure the table doesn't grow too large.&Register a new score in a score table.IShow a single high score, from the given ranking in the high score table.jShow a screenful of the high scores table. Parameter height is the number of (3-line) scores to be shown.8Produce a couple of renderings of the high scores table.:Generate a slideshow with the current and previous scores.  old table the total value of faction itemsgame time spentreason of the game interruption current datechallenge setupname of the faction's gplayer allies lost foes killedcurrent score table*position of the current score in the tablethe name of the game mode"the timezone where the game is run   /None "#$V]^jB#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).remembered dungeon)absolute dungeon depth, for item creation remembered actors in the dungeonremembered items in the dungeon&spotted items with the same kind indexremembered sides still in game%global game time, for UI display onlyremembered contenthigh score tablecurrent game modeitem kind discoveries dataitem aspect dataactor aspect data#Initial complete global game state.Initial empty state.QLocal state created by removing secret information from global state components.!Update dungeon data within state.Update dungeon depth.Update the actor dictionary.Update the item dictionary.Update the item kind index map.!Update faction data within state. Update global time within state.!Update content data within state.##0None "#$V]^jF`The part of speech describing the item parameterized by the number of effects/aspects to show..'The part of speech describing the item.1None "#$6V]^jJindividual map symbol individual name individual pronoun individual map color (The part of speech describing the actor.0The part of speech containing the actor pronoun.             2None"#$&'-0FV]^jTpRequests that take game time, indexed by actor ability that is needed for performing the corresponding actions.%EBasic form of requests, sent by both AI and UI clients to the server.'.Possible forms of requests sent by UI clients./vRequests sent by UI clients to the server. If faction leader is to be changed, it's included as the second component.0.Possible forms of requests sent by AI clients.3vRequests sent by AI clients to the server. If faction leader is to be changed, it's included as the second component. !"#$%&'()*+,-./01233012/'()*+,-.%& !"#$  !"#$%&'()*+,-.0123None "#$V]^jfO8How 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. 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 or temporary effects, the difference in value is only slight.BCompute the whole /m structure, containing various facets of AI item preference, for an item with the given effects and aspects.Note: result has non-strict fields, so arguments are forced to avoid leaks. When AI looks at items (including organs) more often, force the fields. 89:;<=>?@AB B89:;<=>?@A4None "#$NV]^jtO+Calculate loot's worth for a given faction.awChecks 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)b'Get current time from the dungeon data.lwDetermine the dungeon level of the container. If the item is in a shared stash, the level depends on which actor asks.pRequire 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).1CDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrs1CDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrs5None "#$NV]^j|tOMonad 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. tuvwxyz{| tuvwxyz{|tu6None "#$V]^j}-Mapping from slot labels to item identifiers.HSlot label. Usually just a character. Sometimes with a numerical prefix.qAssigns a slot to an item, for inclusion in the inventory of a hero. Tries to to use the requested slot, if any. }~ }~}~7None "#$V]^j}A list of active screenfulls to be shown one after another. Each screenful has an independent numbering of rows and columns.An 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.>A key or an item slot label at a given position on the screen.8None "#$V]^j0Exception 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.>The monad for writing to the main game state. Atomic updates ( UpdAtomic%) are given semantics in this monad.!!9None "#$6V]^jRDescription of how item manipulation is triggered and communicated to the player.)Abstract syntax of human player commands.This 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.Symbolic representation of areas of the screen used to define the meaning of mouse button presses relative to where the mouse points to.q      !"#$%&'()*+,-./01234s'()*+,-./0123 !"#$%&4     M       !"#$%&' ()*+,-./012:None "#$6V]^jP)Options that affect the UI of the client.T(the option for Vi keys takes precendenceU'because the laptop keys are the default`+Hardwired commandline arguments to process.bRead and parse UI config file.c&Modify client options with UI options.PQ`TURSVWXYZ[\]^_abcPQRSTUVWXYZ[\]^_`bcaPQRSTUVWXYZ[\]^_`;None "#$V]^jhDKey-command mappings to be specified in content and used for the UI.idefault client UI commandshijklmnopqrstuvwxyz{|}~hijklnopqrstuvwyz{|}mx~hi<None "#$NV]^j;Bindings and other information about human player commands.binding of keys to commands:the properly ordered list of commands for the help menuand from commands to their keyspCreate binding of keys to movement and other standard commands, as well as commands defined in the config file.9Produce a set of help/menu screens from the key bindings.3Turn the specified portion of bindings into a menu.%default key bindings from the contentUI client optionsconcrete binding=None "#$KV]^j^*BState of last recorded and currently being recorded key sequences.'accumulated keys of the current command.keys of the rest of the recorded command batch/space left for commands to record in this batchParameters of the current run."the original leader from run start!the list of actors that take partHinitial run continuation by any run participant, including run leader!message with the next stop reason)waiting for others to move out of the way Current aiming mode of a client.The 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.the common xhairassigned actor UI presentationsmap from slots to itemslast used slotlast item move storesconnection with the frontendbinding of keys to commandsUI options as set by the player aiming modelast mouse aiming not vacuusselected item, if any$the set of currently selected actors%parameters of the current run, if anycurrent messageshistory of messagesmouse pointer positionstate of key sequence recordingstate of key sequence playback!actors that just got out of sight"player just waited this many timesmark leader and party FOV#mark smell, if the leader can smellindices of last used menu itemscurrent level needs displaying'how to show keys hints when no messagesthis session start timethis game start time1clips from start of session to current game startthis game current frame count7frame count from start of session to current game start88>None "#$6V]^jYSymbolic representation of text messages sent by server to clients and shown to players.xAbstract syntax of atomic special effects, that is, atomic commands that only display special effects and don't change .TAbstract syntax of atomic updates, that is, atomic commands that really change the . 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. "PAbstract syntax of atomic commands, that is, atomic game state transformations. #atomic updates $atomic special effects[                           ! " # $ % & '[ " # $                           ! % & ' 2                           ! " # $?None "#$V]^jx 8The 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. 9(whomever sees all the positions, notices : observers and the faction notice ;*whomever smells all the positions, notices <(only the faction notices, server doesn't =faction and server notices >only the server notices ?everybody notices @$never broadcasted, but sent manually AProduce 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. BBProduce the positions where the atomic special effect takes place. G?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. HeGiven the client, its perception and an atomic command, determine if the client notices the command. IZDetermine whether the server would see a command that has the given visibilty conditions. 8 9 : ; < = > ? @ A B C D E F G H I 8 9 : ; < = > ? @ A B G H I C D E F 8 9 : ; < = > ? @@None "#$V]^j LmThe game-state semantics of atomic game commands. There is no corresponding definition for special effects (), because they don't modify .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 ?x). 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.- 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- 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 xyNone "#$V]^jl                           ! " # $ 8 9 : ; < = > ? @ A B G H I Ll " # $                           ! L 8 9 : ; < = > ? @ A B G H IANone "#$6V]^j)4 y(Actor's target and a path to it, if any. }lPathfinding distances to all reachable positions of an actor and a shortest paths to some of the positions. ,Client state, belonging to a single faction. &a parameter of the aiming digital line $targets of our actors in the dungeon  the set of fully explored levels pathfinding data for our actors !atomic commands performed to date remembered AI benefits of items #faction perception indexed by level 'cached alter ability data for positions current random generator Icandidate new leader of the faction; Faction.gleader is the old leader  faction controlled by the client exit the game loop current game challenge setup next game challenge setup next game scenario number  whether to mark suspect features &last in-melee condition for each level 'won games at particular difficulty lvls client options  Initial empty game client state.  Cycle the   setting. -Update target parameters within client state. (Get target parameters from client state. :Update picked leader within state. Verify actor's faction.& y z { | }  ~ & } ~  y z { |  y z { | } ~   BNone "#$V]^j.K "Monad for writing to client state. FInvoke pseudo-random computation with the generator kept in the state. GInvoke pseudo-random computation, don't change generator kept in state.   CNone "#$-V]^j4 'Get the current perception of a client. ,Calculate the position of an actor's target. Counts the number of steps until the projectile would hit an 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.  DNone "#$NV]^jV JGet cached BFS array and path or, if not stored, generate and store first. AGet cached BFS array or, if not stored, generate and store first. @Get cached BFS path or, if not stored, generate and store first. $Furthest (wrt paths) known position. 0Closest 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.nIf the level has inaccessible open areas (at least from the stairs AI used) the level will be nevertheless here finally marked 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. Finds 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. WClosest (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. Check 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 tactic, 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. Closest (wrt paths) items. !Closest (wrt paths) enemy actors.    ENone "#$V]^joA 6Require that the target enemy is visible by the party. ARequire that the target enemy is remembered on the actor's level. !Check if the target is nonmoving. eRequire that any non-dying foe is adjacent, except projectiles that (possibly) explode upon contact. GRequire the actor stands adjacent to a triggerable tile (e.g., stairs). (Produce 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 then when melee is started, it's usually too late to retreat. ?Require the actor blocks the paths of any of his party members. CRequire the actor stands over a weapon that would be auto-equipped. 3Check whether the actor has no weapon in equipment. -Require that the actor can project any items. ^Produce the list of items with a given property available to the actor and the items' values. 4Require that the actor stands over a desirable item. UProduce the list of items on the ground beneath the actor that are worth picking up. ^Require that the actor stands in the dark and so would be betrayed by his own equipped light, 8Produce a list of acceptable adjacent points to flee to.  FNone "#$NV]^js Verify and possibly change the target of an actor. This function both updates the target in the client state and returns the new target explicitly. 8AI proposes possible targets for the actor. Never empty.  GNone "#$V]^jw] wPick a new leader from among the actors on the current level. Refresh the target of the new leader, even if unchanged. DInspect the tactics of the actor and set his target according to it.  HNone "#$-V]^jx /Pick the most desirable AI ation for the actor.   INone"#$&'V]^j sHandle the move of an actor under AI control (regardless if the whole faction is under human or computer control). Pick an actor to move and an action for him to perform, given an optional previous candidate actor and action and the server-proposed actor. QCheck if any non-dying foe (projectile or not) is adjacent to any of our normal actors (whether they can melee or just need to flee, in which case alert is needed so that they are not slowed down by others) and record this per-level. This is needed only by AI and computed as lazily as possible before each round of AI deliberations.      JNone "#$V]^j Abstract 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. change State! by performing this atomic update put the given State1, which results from performing the atomic update ?compute an AI move for the actor and send (the semantics of) it 4perform special effects (animations, messages, etc.) Dprompt the human player for a command and send (the semantics of) it               KNone "#$V]^j -Client monad for saving and restarting games. Effect 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).                            LNone "#$V]^j <The type of areas. The bottom left and the top right points. /Checks if it's an area with at least one field. %`Divide uniformly a larger area into the given number of smaller areas overlapping at the edges.When a list of fixed centers (some important points inside) of (non-overlapping) areas is given, incorporate those, with as little disruption, as possible. &7Shrink the given area on all fours sides by the amount. $ maximum size(the containing area, not the room itselfthe center point      ! " # $ % & ' (  ! " # $     % & ' (     MNone "#$V]^jC -4The coordinates of consecutive fields of a corridor. .2The choice of horizontal and vertical orientation. 1#Pick a random point within an area. 2ICreate a void room, i.e., a single point area within the designated area. 33Create a random room according to given parameters. 4Pick a subset of connections between adjacent areas within a grid until there is only one connected component in the graph of all areas. 6DSort the sequence of two points, in the derived lexicographic order. 7EPick a single random connection between adjacent areas within a grid. 8Create 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. 9Try 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. 3 minimum size maximum size(the containing area, not the room itself 8#orientation of the starting sectionstarting pointstarting is inside FGround or FFloor ending pointending is inside FGround or FFloor*the area containing the intermediate point!straight sections of the corridor - . / 0 1 2 3 4 5 6 7 8 9 : 1 2 3 4 7 . / 0 - 9 5 6 8 : . / 0NNone "#$QV]^j <The 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. =iThe parameters of a place. All are immutable and rolled and fixed at the time when a place is generated. FFor  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. G"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. H-Given a few parameters, roll and construct a  =9 datastructure and fill a cave section acccording to it. JERoll a legend of a place plan: a map from plan symbols to tile kinds. L;Construct a fence around an area, with the given tile kind. M<Construct a fence around an area, with the given tile group. N"Create a place by tiling patterns. Fthe area to fillthe place kind to construct H the game contentcurrent cave kindwhether the cave is dark dark fence tile, if fence hollowlit fence tile, if fence hollowcurrent level depthabsolute depthsecret tile seed'whole area of the place, fence included optional fixed place group Nthe area to fillthe place kind to construct < = > @ ? A B C D E F G H I J K L M N = > ? @ A B C D E < F H I M G J K L N = > ? @ A B C D EONone "#$V]^j Q5The type of caves (not yet inhabited dungeon levels). Sthe kind of the cave Tsecret tile seed Utile kinds in the cave Vplaces generated in the cave Wwhether the cave is dark YhGenerate 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. Ycontent definitionsdepth of the level to generateabsolute depthsecret tile seedcave kind to use for generationpos of stairs, etc. Q R W T S U V X Y Z [ Q R S T U V W X Y Z [ Q R S T U V WPNone "#$V]^j ]0Freshly generated and not yet populated dungeon. _maps for all levels `absolute dungeon depth f$Generate the dungeon for a new game. ] ^ _ ` a b c d e f ] ^ _ ` f a b c d e ] ^ _ `QNone "#$V]^j  g0The area left to be scanned, delimited by edges. hLAn edge (comprising of a line and a convex hull) of the area to be scanned. i,Convex hull represented as a list of points. jStraight line between points. lRotated 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. p;Progress along an arc with a constant distance from (0, 0). q4Distance from the (0, 0) point where FOV originates. r!Calculates the list of tiles, in BumpA coordinates, visible from (0, 0), within the given sight range. sCheck if the line from the second point to the first is more steep than the line from the third point to the first. This is related to the formal notion of gradient (or angle), but hacked wrt signs to work fast in this particular setup. Returns True for ill-defined lines. tExtends a convex hull of bumps with a new bump. Nothing needs to be done if the new bump already lies within the hull. The first argument is typically  s5, optionally negated, applied to the second argument. u<Create a line from two points. Debug: check if well-defined. vCompare steepness of (p1, f) and (p2, f)D. Debug: Verify that the results of 2 independent checks are equal. wThe X coordinate, represented as a fraction, of the intersection of a given line and the line of diagonals of diamonds at distance d from (0, 0). xDebug functions for DFOV:EDebug: calculate steeper for DFOV in another way and compare results. y5Debug: check if a view border line for DFOV is legal. rvisiblity distancecoordinate transformation ta comparison functiona new bump to consider,a convex hull of bumps represented as a list g h i j k l m o n p q r s t u v w x y r l m n o q p j k i h g s t u v w x y j k l m n oRNone "#$V]^j3k ~3Level positions with tiles that have ambient light. 3Level positions that pass through light and vision. ELevel positions with either ambient light or shining items or actors. {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). ;Server cache of perceptions, indexed by faction identifier. NServer cache of perceptions of a single faction, indexed by level identifier. Visually reachable positions (light passes through them to the actor). They need to be intersected with lucid positions to obtain visible positions. /Main perception validity map, for all factions. fCompute 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). Compute 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. Update 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). Compute 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). >Calculate the perception and its caches for the whole dungeon. "Calculate perception of a faction. Perform a full scan for a given position. Returns the positions that are currently in the field of view. The Field of View algorithm to use is passed in the second argument. The actor's own position is considred reachable by him. the array with clear pointsscanning radiusposition of the spectator5 | } ~  5 ~  } |  ~         SNone "#$KV]^jI, GFlavours assigned by the server to item kinds, in this particular game. <The map of item ids to item seeds, needed for item creation. The reverse map to  DiscoveryKind, needed for item creation. VReverse item map, for item creation, to keep items and item identifiers in bijection. ,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 meaningul properties can be derived from them. Note 1: jlid is not meaningful; it gets forgotten if items from different levels roll the same random properties and so are merged. However, the first item generated by the server wins, which is most of the time the lower jlid2 item, which makes sense for the client. Note 2: ItemSeed 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. #Build an item with the given stats.  Generate an item based on level.Assigns flavours to item kinds. Assures no flavor is repeated for the same symbol, except for items with only one permitted flavour. :Randomly chooses flavour for all item kinds for this game.  zSafe "#$V]^jJ%TNone "#$V]^jMf 6Repeatedly save serialized snapshots of current state. hRestore a saved game, if it exists. Initialize directory structure and copy over data files, if needed. UNone "#$V]^j[ 8The monad that gives the client access to UI operations. %The row where the dungeon map starts. BWrite a UI request to the frontend and read a corresponding reply. APush frames or delays to the frame queue. The frames depict the lid level. Write UF UI request to the frontend, read the reply, set pointer, return key. @Initialize the frontend chosen by the player via client options. The part of speech describing the actor or "you" if a leader of the client's faction. The actor may be not present in the dungeon. The part of speech with the actor's pronoun or "you" if a leader of the client's faction. The actor may be not present in the dungeon. The part of speech describing the actor (designated by actor id and present in the dungeon) or a special name if a leader of the observer's faction. 9Try to read saved client game state from the file system.( (   VNone "#$QV]^jj (Continue running in the given direction. 8This 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.        WNone "#$V]^jn $Add a message to the current report. #Add a prompt to the current report. )Add a prompt with basic keys description. #Add a prompt to the current report. 5Store current report in the history and reset report.          XNone "#$V]^jp' 1Draw the whole screen: level map and status area.                    YNone "#$V]^jy Draw the current level with the overlay on top. If the overlay is too long, it's truncated. Similarly, for each line of the overlay, if it's too wide, it's truncated. Push 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. 5Render animations on top of the current screen frame. ARender and display animations on top of the current screen frame.              ZNone "#$V]^j' XAdd current report to the overlay, split the result and produce, possibly, many slides. &Split current report into a slideshow. !=Split current report into a slideshow. Keep report unchanged. "Display a message. Return value indicates if the player wants to continue. Feature: if many pages, only the last SPACE exits (but first ESC). #iDisplay a message. Ignore keypresses. Feature: if many pages, only the last SPACE exits (but first ESC). %~Print a yes/no question and return the player's answer. Use black and white colours to turn player's attention to the choice. 'Display 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.  ! " # $ % & '  ! " # $ % & '[None "#$V]^j *9Message describing the cause of failure of human command. 2CSwitches current member to the next on the level, if any, wrapping. 3GSwitches current member to the previous in the whole dungeon, wrapping. 51Select a faction leader. False, if nothing to do. :Produces a textual description of the terrain and items at an already explored position. Mute for unknown positions. The detailed variant is for use in the aiming mode. : detailed?how to start tile descriptioncan be seen right now?position to describethe actor that looksan extra sentence to print ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : * + ) , ( - . / 0 1 2 3 4 5 6 7 8 9 : *\None "#$-V]^j BLet 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. CDisplay 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. DLet 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.VLet the human player choose a single, preferably suitable, item from a list of items. B which items to consider suitable'specific prompt for only suitable itemsgeneric promptinitial legal modes)legal modes after Calm taken into account Chow to describe suitable items initial mode D which items to consider suitable'specific prompt for only suitable itemsgeneric promptinitial legal modes(legal modes with Calm taken into accountFwhether to ask, when the only item in the starting mode is suitable,whether to permit multiple items as a result which items to consider suitable'specific prompt for only suitable itemsgeneric promptfirst mode, legal or notthe (rest of) legal modesFwhether to ask, when the only item in the starting mode is suitable,whether to permit multiple items as a resultall legal modes < = > ? @ A B C D < = > D B C ? @ A < = >  ]None "#$V]^jB H-Clear current messages, cycle key hints mode. JPDisplay items from a given container store and possibly let the user chose one. O`Check whether one is permitted to aim (for projecting) at a target (this is only checked for actor targets so that the player doesn't miss enemy getting out of sight; but for positions we let player shoot at obstacles, e.g., to destroy them, and shoot at a lying item and then at its posision, after enemy picked up the item). Returns a different seps% if needed to reach the target actor.Note: Perception is not enough for the check, because the target actor can be obscured by a glass wall or be out of sight range, but in weapon range. WHSwitch current member to the next on the viewed level, if any, wrapping. XESwitch current member to the previous in the whole dungeon, wrapping. c0End aiming mode, rejecting the current position. dMAccept the current x-hair position as target, ending aiming mode, if active. e0End aiming mode, accepting the current position. i\Perform look around in the current position of the xhair. Does nothing outside aiming mode. j$Move the xhair. Assumes aiming mode. k Start aiming. l^Cycle aiming mode. Do not change position of the xhair, switch among things at that position. ovChange the displayed level in aiming mode to (at most) k levels shallower. Enters aiming mode, if not already in one. p Tweak the eps& parameter of the aiming digital line.4 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 z4 G H I J K L S Q R T U V W X Y [ \ ] ^ _ ` a b c d g h j k l m n o p r s t u w y z M N O P Z e f i q v x^None "#$V]^j {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. =Display special effects (text, animation) sent to the client. { | } ~   { | } ~  _None"#$&'-V]^j zPick command depending on area the mouse pointer is in. The first matching area is chosen. If none match, only interrupt. 'Leader waits a turn (and blocks, etc.). :Leader waits a 1/10th of a turn (and doesn't block, etc.). 3Actor attacks an enemy actor or his own projectile. "Actor swaps position with another. ELeader moves or searches or alters. No visible actor at the position. GAsk for a direction and alter a tile in the specified way, if possible. ;Try to alter a tile using a feature in the given direction. :Try to alter a tile using a feature at the given position. 6Verify important effects, such as fleeing the dungeon.]This is contrived for now, the embedded items are not analyzed, but only recognized by name. -Guess and report why the bump command failed. 6Try to alter a tile using a feature under the pointer. Display command help. Display the main menu. Display the settings menu. Display the challenges menu.4 4 `None "#$V]^j DThe semantics of human player commands in terms of the client monad.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. NCommands 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.  aNone "#$V]^j "Handle the move of a human player. ALet the human player issue commands until any command takes time.2PP`bch  { 3  { hP`c`bP   bNone "#$<V]^j BMonad for executing atomic game state transformations on a client. 3Execute an atomic update that changes the client's . vPut state that is intended to be the result of performing an atomic update by the server on its copy of the client's . :Client monad in which one can send requests to the client. Handle 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.     cNone "#$<V]^j @Client monad in which one can receive responses from the server. &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  .    {None "#$V]^j( !"#$%&'()*+,-./0123P`bch     * 3012/'()*+,-.%& !"#$     hP`c`bdNone "#$V]^jH GOptions that affect the behaviour of the server (including game rules).  Default value of server options.     eNone "#$V]^j  APosition in time for each actor, grouped by level and by faction. wState with server-specific data, including a copy of each client's basic game state, but not the server's basic state. absolute times of next actions #reverse map, used for item creation already generated unique items map from item ids to item seeds &reverse id map, used for item creation association of flavour to items stores next actor index stores next item index !atomic commands performed to date &each faction state, as seen by clients perception of all factions $perception validity for all factions  perception cache of all factions "ambient or shining light positions clear tiles positions ambient light positions  active arenas whether active arenas valid current random generator initial random generators exit the game loop write savegame to a file now current commandline options options for the next game !Initial, empty game server state.                                        fNone "#$/V]^j 5Parser for server options from commandline arguments.    gNone "#$V]^j :The monad for executing atomic game state transformations. fExecute an atomic command that changes the state on the server and on all clients that can notice it. EExecute an atomic command that changes the state on the server only. RExecute an atomic command that changes the state on the given single client only. ZExecute an atomic command that changes the state on the given single client only. Catch ' and indicate if it was in fact raised. =Execute an atomic command that only displays special effects. *:Dumps to stdout the RNG states from the start of the game. +CRead the high scores dictionary. Return the empty table if no file. ,+Generate a new score, register it and save. -FInvoke pseudo-random computation with the generator kept in the state. .[Gets a random generator from the user-submitted options or, if not present, generates one.         ! " # $ % & ' ( ) * + , - .  ! " #        $ % & ' ( ) * + , - .         ! " #hNone "#$V]^j 7-Mapping over actor's items from a give store. / 0 1 2 3 4 5 6 7 0 2 3 4 5 6 7 / 1iNone "#$V]^j#= 8Effect 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). 8 9 : ; < = > ? @ A B C D E F G 8 9 : ; < = > ? @ A B C D E F GjNone "#$V]^j$U H I P J K M L N O Q R S T U V W R U V Q S T H I J K L M N O P W H I J K L M N O PkNone "#$V]^j.8 Y>The server monad with the ability to communicate with clients. ]:Connection channel between the server and a single client. bGConnection information for all factions, indexed by faction identifier. iIf the  AtomicFailB conditions hold, send a command to client, otherwise do nothing. j*Send a command to client, crashing if the  AtomicFail< conditions don't hold when executed on the client's state. qUpdate connections to the new definition of factions. Connect to clients in old or newly spawned threads that read and write directly to the channels. Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r c b ] ^ _ ` a Y Z [ \ h i j k l m n o p q r d e f g Y Z [ \ ] ^ _ ` alNone "#$NV]^j1 t5Send an atomic action to all clients that can see it. u)Messages for some unseen atomic commands. vMessages for some unseen sfx. s t u v w x y t w s u v x ymNone "#$NV]^j? }CGenerate the atomic updates that jointly perform a given item move. 2Tell 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. -actor projecting the item (is on current lvl)!target position of the projectiledigital line parameterthe item to be projected/whether the items comes from floor or inventorywhether the item is a blast -actor projecting the item (is on current lvl) starting point of the projectile(rest of the trajectory of the projectilethe item to be projected/whether the items comes from floor or inventorywhether the item is a blast z { | } ~   z { | } ~  nNone "#$V]^jG TFind starting postions for all factions. Try to make them distant from each other. Place as many of the factions, as possible, over stairs, starting from the end of the list, including placing the last factions over escapes (we assume they are guardians of the escapes). This implies the inital factions (if any) start far from escapes. )Apply options that don't need a new game.  oNone "#$V]^jKp fSpawn, possibly, a monster according to the level's actor groups. We assume heroes are never spawned. )Advance the move time for the given actor OSwap the relative move times of two actors (e.g., when switching a UI leader).  pNone "#$NV]^jm The source actor affects the target actor, with a given item. If any of the effects fires up, the item gets identified. This function is mutually recursive with effect and so it's a part of Effect semantics.Note that if we activate a durable item, e.g., armor, 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). The source actor affects the target actor, with a given effect and power. Both actors are on the current level and can be the same actor. The item may or may not still be in the container. The boolean result indicates if the effect actually fired up, as opposed to fizzled. The faction leaves the dungeon. aAdvance target actor time by this many time clips. Not by actor moves, to hurt fast actors more. }Give target actor the given number of extra moves. Don't give an absolute amount of time units, to benefit slow actors more. XTeleport the target actor. Note that projectiles can be teleported, too, for extra fun. Make the target actor drop all items in a store from the given group (not just a random single item, or cluttering equipment with rubbish would be beneficial). Drop a single actor's item. 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). MSend the target actor flying like a projectile. The arguments correspond to ToThrow and Linger properties of items. 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. 3Make the target actor drop his best weapon (stack). Activate all items with the given symbol in the target actor's equipment (there's no variant that activates a random one, to avoid the incentive for carrying garbage). Only one item of each stack is activated (and possibly consumed).3 3 qNone"#$&'V]^j] LThe semantics of server commands. AI always takes time and so doesn't loop. GThe semantics of server commands. Only the first two cases affect time. (This is a shorthand. Instead of setting bwait in ReqWaitU and unsetting in all other requests, we call this once before executing a request. @Clear deltas for Calm and HP for proper UI display and AI hints. Add a smell trace for the actor to the level. For now, only actors with gender leave strong and unique enough smell. 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. ]Actor moves or attacks. 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. Resolves the result of an actor moving into another. Actors on blocked 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. +Actor tries to swap positions with another. Search and/or alter the tile.  Do nothing.Something is sometimes done in  . -actor projecting the item (is on current lvl)!target position of the projectiledigital line parameterthe item to be projected/whether the items comes from floor or inventory -actor applying the item (is on current level)the item to be appliedthe location of the item  rNone "#$V]^jE %Continue or exit or restart the game. Drop all actor's items. $Save game on server and all clients.  sNone"#$&'V]^j \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  . Handle 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. Handle 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. :Check if the given actor is dominated and update his calm. 9Trigger periodic items for all actors on the given level. "Manage trajectory of a projectile.;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. player-supplied server options9function that initializes a client and runs its main loop  |None "#$V]^j  ] ^ _ ` a  ] ^ _ ` a  tNone "#$KV]^j "Client state transformation monad. current global state current client state UI state, empty for AI clients "this client connection information connection to the save thread URun the main client loop, with the given arguments and empty initial states, in the IO monad.                          uNone "#$KV]^j "Server state transformation monad. current global state current server state $client-server connection information connection to the save thread URun the main server loop, with the given arguments and empty initial states, in the IO monad.                              }~}~}~}~}      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqqrstuvwxyz{|}~                                                                                                                                                ! " # $ % & ' ( ) ) * + + , - . / 0 1 2 3 4556789:;<=>?@ABCDEFGHIJKLMNOOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~s      !"#$%&'()*+,-./0123456789:;<=>>?@AABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-../0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuuvwxyz{|}~ M M                                                H            V U g h i j !!!!!!!!!!!!!!!!!!!!!!!!!!!!""""""""""""""""""""""""""""""""""""""############# # # # # #################### #!#!#"###$#%#&#&#'#(#)#*#+#,#-#.#/#0#1#2#3#4#5#6#7#8#9#:#;#<#=#>#?#@#A#B#C#D#E#F#G#H#I#J#K#L#M$N$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)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*{*|*}*~*******++++++++++++++,,,,,,,,,,,,,,,,,,,,,,,,,f,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,----------------------------............ . . . . ..../////////////// /!/"/#/$/%/&/'/(/)/*/+/,/-/.///0/1/2/3/4/5/6/708090:0;0<0=0>0?0@0A0B0C0D0E1F1G1G1H1I1J1K1L1M1N1O1P1Q1R1S1T1U1V1W1X1Y1Z2[2\2]2^2_2`2a2b2c2d2e2e2f2g2h2i2j2k2l2m2n2o2p2q2r2s2t2u2v3w3x3y3z3{3|3}3~3334444444444444444444444444444444444444444444444444555555555666666666666666666667777777777777777888888888888888888888888888888888889999999999 9 9 9 9 9999999999999999999 9!9"9#9$9%9&99'99(9)9*9+9,9-9.9/9091929394959969798999:9;9<9=9>9?9@9A9B9C9D9E9F9G9H9I9J9K9L9M9N9O9P9Q9R9S9T9U9V9W9X9Y9Z9[9\9]9^9_9`9a9b9c9d9e9f9g9h9i9j9k9l9m9n9o9p9q9r9s9t9u9v9w9x9y9z9{9|9}9~9999999999::::::::::::::::::::::::;;;;;;;;;;;;;;;;;;;;;;;;;;;;<<<<<<<<=================================================================>> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > !> "> #> $> %> &> '> (> )> *> +> ,> -> .> /> 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?x? 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 A A A A 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 C C C C C C C C 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 F F 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 -I .I /I 0J 1J 2J 3J 4J 5J 6J 7K 8K 9K :K ;K <K =K >K ?K @K AK K BK K CK DL EL EL FL GL HL IL JL KL LL ML NL OL PL QL RL SL TL UM VM WM XM YM ZM [M \M ]M ^M _M `M aM bM cM dN eN fN fN gN hN iN jN kN lN mN nN oN pN qN rN sN tN uN vN wN xO yO yO zO {O |O }O ~O O O O O P P P P P P P P P P 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 R R R R R R R R R R R R R R S S S S S S S S S S S S S T T T T T T T T T T U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U U V V V V V W !W "W #W $W %X &X 'X (X )X *X +X ,X -X .X /X 0X 1X 2X 3Y 4Y 5Y 6Y 7Y 8Y 9Y :Z ;Z <Z =Z >Z ?Z @Z AZ BZ 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 b b b b b b b b c c c c c 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 (f )f *g +g g ,g -g .g /g 0g 1g 2g 3g 4g g 5g 6g g 7g 8g 9g :g ;g <g g =h >h ?h @h Ah Bh Ch Dh Eh Fi Gi Hi Ii Ji Ki Li Mi Ni Oi Pi Qi Ri Si Ti Ui Vj Wj Wj Xj Yj Zj [j \j ]j ^j _j `j aj bj cj dj ej fk gk hk ik k jk jk kk lk mk nk ok pk qk rk sk tk uk vk wk xk yk zk {k |k }k l ~l l l l l l m m m m m m m m m m m m m m m m m m m m m m m m m n n n n n n n n o o o o o o o o p %p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p p 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 r r r r r s s s s s s s s s s s s s s t t t t t t t t t t t t t t t t t t t t t t u u u u u u !u "u #u $u %u &u 'u (u )u *u +u ,u -} . / 0 1 2} 3 4} 3 5} 6} 7 8} 7 9} . :} . ;} . <} . =} > ?} > @} A B} . C} D E} D F} D G} D H} D I} D J} D K} D L} D M} D N} D O} D P 0 Q R 0 Q S 0 Q T} U V} U W} U X} U Y} U Z} U [} U \} U ]} U ^} U _} U `} U a} U b} U c} U d} U e} U f} U g} U h} > i} > j} > k} > l} > m} > n} > o} > p} > q} > r} > s} > t} . u} . v} . w} . x} . y} . z} . {} . |} } ~} } } } } } } } } } } } } } 0 Q 0 Q 0 Q 0 Q 0 Q 0 Q 0 Q 0 Q }  } } } > } > } U } U } U } U } U } U } U } U } U } U } U } U } U } U } U } > } > } > } > } > } > }  } } } } . } . } . } . } . }  } } } } } } } } } } } } } }  } } } } } . } . } . } . 0  0  0  0 \ 0  0  0   } . } . } . 0  0  0  0  } > 0  0  }  } R} S} . }  } } } A } A } A } A } A } A } A } A } A } A } A } A } A } A } } } } }}}}}}}}}}  }  }  } } } } } } } } } } } } } } } } } } } } }  } !} !} "} #} #} $} %} %} &} '} '} (} )} )} *} +} +} ,} H} H} -}./}.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}gh}gi} j} k} l}mn}op}oq} >r} >s} >t} >u} >v} >w} x} y} z} {} 3|} 3}} 3~} 3} 3} 3} 3} 3} 3} 3} 3} 3} 3} 3} 3} 3} 3} 3} 3} 3} 3} 3} 3} 3} 3} 3} 3} 3} 3} 3}}}}}}}}}} 7} 7} }} .} .} .} .} .} .} .} .} .} .} .} .} .} .} .} .} .} .} }  0 Q 0 Q 0 QV        Yk&&&..........//////////////7HHL HSS zzzzzzzz[ F[\\\\\\\\\)LambdaHack-0.7.0.0-3XPyz9bw1i28qJIoWU6CaMGame.LambdaHack.Common.PreludeGame.LambdaHack.Common.HSFileGame.LambdaHack.Common.Point!Game.LambdaHack.Common.PointArrayGame.LambdaHack.Common.Misc Game.LambdaHack.Common.FrequencyGame.LambdaHack.Common.Dice!Game.LambdaHack.Common.ContentDefGame.LambdaHack.Common.ColorGame.LambdaHack.Common.FlavourGame.LambdaHack.Common.Ability!Game.LambdaHack.Client.UI.OverlayGame.LambdaHack.Client.UI.Frame$Game.LambdaHack.Client.ClientOptionsGame.LambdaHack.Client.Bfs"Game.LambdaHack.Client.AI.StrategyGame.LambdaHack.Common.RandomGame.LambdaHack.Common.KindOps#Game.LambdaHack.Client.UI.Animation!Game.LambdaHack.Common.RingBufferGame.LambdaHack.Common.ThreadGame.LambdaHack.Common.TimeGame.LambdaHack.Client.UI.MsgGame.LambdaHack.Common.VectorGame.LambdaHack.Client.UI.Key)Game.LambdaHack.Client.UI.Frontend.Common+Game.LambdaHack.Client.UI.Frontend.Teletype&Game.LambdaHack.Client.UI.Frontend.Sdl"Game.LambdaHack.Client.UI.Frontend Game.LambdaHack.Content.ItemKind Game.LambdaHack.Content.RuleKind Game.LambdaHack.Content.TileKind!Game.LambdaHack.Content.PlaceKind Game.LambdaHack.Content.CaveKind Game.LambdaHack.Content.ModeKindGame.LambdaHack.Common.KindGame.LambdaHack.Common.TileGame.LambdaHack.Common.Item$Game.LambdaHack.Common.ItemStrongest!Game.LambdaHack.Common.ReqFailureGame.LambdaHack.Common.ActorGame.LambdaHack.Common.Level+Game.LambdaHack.Client.UI.EffectDescriptionGame.LambdaHack.Common.Faction!Game.LambdaHack.Common.Perception Game.LambdaHack.Common.HighScoreGame.LambdaHack.Common.State)Game.LambdaHack.Client.UI.ItemDescription!Game.LambdaHack.Client.UI.ActorUIGame.LambdaHack.Client.Request"Game.LambdaHack.Client.Preferences!Game.LambdaHack.Common.ActorState%Game.LambdaHack.Common.MonadStateRead"Game.LambdaHack.Client.UI.ItemSlot#Game.LambdaHack.Client.UI.Slideshow&Game.LambdaHack.Atomic.MonadStateWrite"Game.LambdaHack.Client.UI.HumanCmd#Game.LambdaHack.Client.UI.UIOptions)Game.LambdaHack.Client.UI.Content.KeyKind%Game.LambdaHack.Client.UI.KeyBindings#Game.LambdaHack.Client.UI.SessionUI Game.LambdaHack.Atomic.CmdAtomic$Game.LambdaHack.Atomic.PosAtomicRead(Game.LambdaHack.Atomic.HandleAtomicWriteGame.LambdaHack.Client.State"Game.LambdaHack.Client.MonadClientGame.LambdaHack.Client.CommonMGame.LambdaHack.Client.BfsM$Game.LambdaHack.Client.AI.ConditionM%Game.LambdaHack.Client.AI.PickTargetM$Game.LambdaHack.Client.AI.PickActorM(Game.LambdaHack.Client.AI.HandleAbilityMGame.LambdaHack.Client.AIGame.LambdaHack.Client.Response$Game.LambdaHack.Client.HandleAtomicM&Game.LambdaHack.Server.DungeonGen.Area)Game.LambdaHack.Server.DungeonGen.AreaRnd'Game.LambdaHack.Server.DungeonGen.Place&Game.LambdaHack.Server.DungeonGen.Cave!Game.LambdaHack.Server.DungeonGen!Game.LambdaHack.Server.FovDigitalGame.LambdaHack.Server.FovGame.LambdaHack.Server.ItemRevGame.LambdaHack.Common.Save'Game.LambdaHack.Client.UI.MonadClientUIGame.LambdaHack.Client.UI.RunMGame.LambdaHack.Client.UI.MsgMGame.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.DisplayAtomicM,Game.LambdaHack.Client.UI.HandleHumanGlobalM&Game.LambdaHack.Client.UI.HandleHumanMGame.LambdaHack.Client.UI&Game.LambdaHack.Client.HandleResponseMGame.LambdaHack.Client.LoopM$Game.LambdaHack.Server.ServerOptionsGame.LambdaHack.Server.State"Game.LambdaHack.Server.Commandline"Game.LambdaHack.Server.MonadServerGame.LambdaHack.Server.ItemM$Game.LambdaHack.Server.HandleAtomicMGame.LambdaHack.Server.DebugM Game.LambdaHack.Server.ProtocolM&Game.LambdaHack.Server.BroadcastAtomicGame.LambdaHack.Server.CommonMGame.LambdaHack.Server.StartM Game.LambdaHack.Server.PeriodicM$Game.LambdaHack.Server.HandleEffectM%Game.LambdaHack.Server.HandleRequestMGame.LambdaHack.Server.EndMGame.LambdaHack.Server.LoopM6Game.LambdaHack.SampleImplementation.SampleMonadClient6Game.LambdaHack.SampleImplementation.SampleMonadServerGame.LambdaHack.Common.File)Game.LambdaHack.Client.UI.Frontend.Chosen posUpdAtomicGame.LambdaHack.AtomicPaths_LambdaHackGame.LambdaHack.ClientGame.LambdaHack.Serverbase Control.Arrowfirst&&&***second System.IOreadFiledirectory-1.3.0.2System.Directory doesFileExist renameFile(minimorph-0.1.6.1-FkYm4FsNi7NLxnAjcI7Js5NLP.Minimorph.Util<+>#text-1.2.2.2-EakMpasry3jA6OIwSZhq9MData.Text.InternalTexttshowdivUp<$$> partitionMPointpxpyYXmaxLevelDimExponent maxLevelDim chessDist euclidDistSqadjacentinsideblablaXY balancedWordfromTo originPoint $fEnumPoint $fNFDataPoint $fBinaryPoint $fShowPoint $fEqPoint $fOrdPoint$fGenericPointArrayGArrayaxsizeaysizeavectorcnvpindexpunindex!accessI// unsafeUpdateA unsafeWriteAunsafeWriteManyA replicateA replicateMA generateA generateMA unfoldrNAsizeAfoldrAfoldrA'foldlA'ifoldlA'ifoldrAifoldrA'foldMA'ifoldMA'mapAimapAimapMA_ unsafeSetAsafeSetA minIndexA minLastIndexA minIndexesA maxIndexA maxLastIndexAforceA fromListAtoListA$fBinaryGArray $fShowGArray $fEqGArrayTacticTExploreTFollowTFollowNoItemsTMeleeAndRangedTMeleeAdjacentTBlockTRoamTPatrolAbsDepthRarityFreqs GroupNameItemDialogModeMStoreMOwnedMStats MLoreItem MLoreOrganCStoreCGroundCOrganCEqpCInvCSha ContainerCFloorCEmbedCActorCTrunkActorIdLevelId FactionId toGroupNamevalidateRaritydescribeTactic makePhrase makeSentencenormalLevelBoundbreturn appDataDirxMxDminusMminusM1oneM$fNFDataPolarity$fNFDataPerson $fNFDataPart$fHashableEnumMap$fAdjustableEnumMap$fLookupEnumMap$fIndexableEnumMap$fTraversableWithKeyEnumMap$fFoldableWithKeyEnumMap$fKeyedEnumMap$fZipWithKeyEnumMap $fZipEnumMap$fBinaryHashMap$fBinaryNominalDiffTime$fBinaryEnumSet$fBinaryEnumMap$fNFDataCStore$fHashableCStore$fBinaryCStore$fBinaryContainer$fBinaryItemDialogMode$fNFDataItemDialogMode$fNFDataGroupName$fShowGroupName$fIsStringGroupName$fHashableTactic$fBinaryTactic $fShowTactic$fShowFactionId $fEqFactionId$fOrdFactionId$fEnumFactionId$fHashableFactionId$fBinaryFactionId $fShowLevelId $fEqLevelId $fOrdLevelId $fEnumLevelId$fHashableLevelId$fBinaryLevelId $fShowActorId $fEqActorId $fOrdActorId $fEnumActorId$fBinaryActorId $fShowCStore $fReadCStore $fEqCStore $fOrdCStore $fEnumCStore$fBoundedCStore$fGenericCStore$fShowContainer $fEqContainer$fOrdContainer$fGenericContainer$fShowItemDialogMode$fReadItemDialogMode$fEqItemDialogMode$fOrdItemDialogMode$fGenericItemDialogMode$fReadGroupName $fEqGroupName$fOrdGroupName$fHashableGroupName$fBinaryGroupName$fGenericGroupName$fShowAbsDepth $fEqAbsDepth $fOrdAbsDepth$fHashableAbsDepth$fBinaryAbsDepth $fEqTactic $fOrdTactic $fEnumTactic$fBoundedTactic$fGenericTactic encodeData encodeEOFstrictDecodeEOF tryCreateDir tryWriteFile Frequency runFrequency nameFrequency uniformFreqtoFreq scaleFreq renameFreqsetFreqnullFreqminFreqmaxFreqmostFreqmeanFreq$fNFDataFrequency$fBinaryFrequency$fHashableFrequency$fAlternativeFrequency$fMonadPlusFrequency$fApplicativeFrequency$fFunctorFrequency$fMonadFrequency$fShowFrequency $fEqFrequency$fOrdFrequency$fFoldableFrequency$fTraversableFrequency$fGenericFrequencyDiceXYDicecastDiceddlzzl intToDice minmaxDicemaxDiceminDicemeanDice reduceDice maxDiceXY minDiceXY meanDiceXY $fNumDice $fNFDataDice $fBinaryDice$fHashableDice $fShowDice$fBinaryDiceXY$fHashableDiceXY$fEqDice $fOrdDice $fGenericDice $fShowDiceXY$fGenericDiceXY ContentDef getSymbolgetNamegetFreqvalidateSingle validateAllcontentcontentFromList AttrCharW32 attrCharW32AttrCharacAttracCharAttrfgbg Highlight HighlightNone HighlightRed HighlightBlueHighlightYellow HighlightGreyHighlightWhiteHighlightMagentaColorBlackRedGreenBrownBlueMagentaCyanWhiteBrBlackBrRedBrGreenBrYellowBrBlue BrMagentaBrCyanBrWhitedefFGisBrightdarkCol brightColstdCol colorToRGBdefAttr attrCharToW32attrCharFromW32 fgFromW32 bgFromW32 charFromW32 attrFromW32attrEnumFromW32 spaceAttrW32 retAttrW32attrChar2ToW32attrChar1ToW32$fHashableColor $fBinaryColor$fHashableHighlight$fBinaryHighlight $fEnumAttr $fShowColor $fEqColor $fOrdColor $fEnumColor$fBoundedColor$fGenericColor$fShowHighlight $fEqHighlight$fOrdHighlight$fEnumHighlight$fBoundedHighlight$fGenericHighlight $fShowAttr$fEqAttr $fOrdAttr$fShowAttrChar $fEqAttrChar $fOrdAttrChar$fShowAttrCharW32$fEqAttrCharW32$fEnumAttrCharW32$fBinaryAttrCharW32Flavour FancyNamezipPlainzipFancy zipLiquidstdFlavflavourToColor flavourToNamecolorToPlainNamecolorToFancyNamecolorToLiquidNamecolorToTeamName$fBinaryFancyName$fHashableFancyName$fBinaryFlavour$fHashableFlavour$fShowFancyName $fEqFancyName$fOrdFancyName$fGenericFancyName $fShowFlavour $fEqFlavour $fOrdFlavour$fGenericFlavourSkillsAbilityAbMoveAbMelee AbDisplaceAbAlterAbWait AbMoveItem AbProjectAbApply zeroSkills unitSkills addSkills scaleSkills tacticSkills blockOnly meleeAdjacentmeleeAndRanged ignoreItems$fHashableAbility$fBinaryAbility$fNFDataAbility $fShowAbility $fEqAbility $fOrdAbility$fGenericAbility $fEnumAbility$fBoundedAbility ColorMode ColorFullColorBW IntOverlayOverlayAttrLine emptyAttrLinetextToALfgToAL stringToAL<+:> splitAttrLine linesAttrsplitAttrPhrase glueLines updateLines $fEqColorModeFrames SingleFrame singleFrame FrameForall unFrameForallFrameST writeLineblankSingleFrametruncateAttrLine overlayFrameoverlayFrameWithLines$fEqSingleFrame$fShowSingleFrame ClientOptionssgtkFontFamily sdlFontFile sdlTtfSizeAdd sdlFonSizeAdd sfontSize scolorIsBoldsmaxFpssdisableAutoYessnoAnim snewGameCli sbenchmarkstitlesfontDirssavePrefixClisfrontendTeletype sfrontendNull sfrontendLazy sdbgMsgClisstopAfterSecondssstopAfterFramesdefClientOptions$fBinaryClientOptions$fShowClientOptions$fEqClientOptions$fGenericClientOptionsAndPathNoPathpathListpathGoalpathLen MoveLegal MoveBlocked MoveToOpen MoveToClosed MoveToUnknown BfsDistance minKnownBfsapartBfsabortedKnownBfsabortedUnknownBfsfillBfs findPathBfs accessBfs$fBinaryAndPath$fShowBfsDistance$fEqBfsDistance$fOrdBfsDistance$fEnumBfsDistance$fBoundedBfsDistance$fBitsBfsDistance $fEqMoveLegal $fShowAndPath$fGenericAndPathStrategy nullStrategy liftFrequency.|reject.=>only bestVariantrenameStrategyreturN mapStrategyM$fAlternativeStrategy$fMonadPlusStrategy$fApplicativeStrategy$fFunctorStrategy$fMonadStrategy$fShowStrategy$fFoldableStrategy$fTraversableStrategyChanceRndrandomRrandomoneOf frequencyrollFreqchance chanceDice castDiceXYfoldrMfoldlM'Opsokind ouniqGroupopick ofoldrWithKeyofoldlWithKey' ofoldlGroup'olengthId$fShowId$fEqId$fOrdId$fEnumId $fBoundedId $fBinaryId Animation renderAnimblankcSymmapPosToOffset mzipSingleton mzipPairs pushAndDelayblinkColorActor twirlSplashblockHit blockMiss deathBodyshortDeathBodyactorXteleport swapPlacesfadeout $fEqAnimation$fShowAnimation RingBufferemptyconsunconstoListlength$fBinaryRingBuffer$fShowRingBuffer$fGenericRingBuffer forkChildwaitForChildrenSpeedDeltaTimetimeZero _timeTick timeEpsilontimeCliptimeTurn turnsInSecond timeSecondabsoluteTimeAddabsoluteTimeSubtractabsoluteTimeNegatetimeFit timeFitUp timeShifttimeDeltaToFromtimeDeltaSubtracttimeDeltaReversetimeDeltaScaletimeDeltaPercent timeDeltaDivtimeDeltaToDigitsInMstoSpeed fromSpeed minimalSpeed speedZero speedWalk speedLimp speedThrustmodifyDamageBySpeed speedScalespeedAdd speedNegate ticksPerMeterspeedFromWeightrangeFromSpeedrangeFromSpeedAndLinger $fShowSpeed $fShowTime$fEqTime $fOrdTime $fEnumTime $fBoundedTime $fBinaryTime $fShowDelta $fEqDelta $fOrdDelta $fEnumDelta$fBoundedDelta $fBinaryDelta$fFunctorDelta $fEqSpeed $fOrdSpeed $fBinarySpeedHistoryReportRepMsgNMsg UAttrLine uToAttrLine attrLineToUtoMsgtoPrompt emptyReport nullReportsingletonReport snocReportconsReportNoScrub renderReportrenderRepetition findInReportincrementInReportlastMsgOfReport emptyHistory addReportrenderTimeReport lengthHistorylastReportOfHistoryreplaceLastReportOfHistorysplitReportForHistory renderHistory $fBinaryMsg$fBinaryRepMsgN$fBinaryHistory $fShowMsg$fEqMsg $fGenericMsg $fShowRepMsgN$fGenericRepMsgN $fShowReport$fBinaryReport $fShowHistory$fGenericHistory RadianAngleVectorvxvy maxVectorDimisUnit isDiagonalnegchessDistVectoreuclidDistSqVectormoves movesCardinal movesDiagonal _moveTexts longMoveTexts compassTextvicinityvicinityUnsafevicinityCardinalvicinityCardinalUnsafesquareUnsafeSetshift shiftBoundedtrajectoryToPathtrajectoryToPathBounded vectorToFrompathToTrajectoryrotate normalizenormalizeVectortowards$fNFDataVector $fEnumVector$fBinaryVector $fShowVector $fReadVector $fEqVector $fOrdVector$fGenericVectorKMP kmpKeyMod kmpPointerKMmodifierkeyModifier NoModifierShiftControlAltKeyEscReturnSpaceTabBackTab BackSpacePgUpPgDnLeftRightUpDownEndBeginInsertDeleteHomeKPCharFunLeftButtonPressMiddleButtonPressRightButtonPressLeftButtonReleaseMiddleButtonReleaseRightButtonRelease WheelNorth WheelSouthUnknownDeadKeyshowKeyshowKMescKMspaceKM safeSpaceKMreturnKMpgupKMpgdnKM wheelNorthKM wheelSouthKMupKMdownKMleftKMrightKMhomeKMendKM backspaceKMleftButtonReleaseKMrightButtonReleaseKM dirKeypadKeydirKeypadShiftChardirKeypadShiftKey dirLaptopKeydirLaptopShiftKey dirViChardirViKey dirViShiftKeydirMoveNoModifierdirRunNoModifier dirRunControl dirRunShift dirAllKey handleDir moveBindingmkKMmkCharmkKP keyTranslatekeyTranslateWeb $fNFDataKey $fBinaryKey$fNFDataModifier$fBinaryModifier$fShowKM $fNFDataKM $fBinaryKM$fOrdKey$fEqKey $fGenericKey$fShowModifier $fOrdModifier $fEqModifier$fGenericModifier$fOrdKM$fEqKM $fGenericKM RawFrontendfdisplay fshutdownfshowNowfchanKey startupBoundcreateRawFrontend resetChanKeysaveKMPmodifierTranslate frontendNamestartupFrontendSessionswindow srenderersfontsatlasstexturespreviousFramesforcedShutdownsdisplayPermitted FontAtlas startupFunshutdown forceShutdowndisplay displayNoLock modTranslate colorToRGBA FrontSetup ChanFrontendFrontReq FrontFrame FrontDelayFrontKey FrontPressed FrontDiscardFrontAdd FrontAutoYes FrontShutdown frontFrame frontKeyKeys frontKeyFramechanFrontendIOgetKey fchanFrontend defaultMaxFps microInSecframeTimeoutThread lazyStartup nullStartupseqFrameEqpSlotEqpSlotMiscBonusEqpSlotAddHurtMeleeEqpSlotAddArmorMeleeEqpSlotAddArmorRangedEqpSlotAddMaxHPEqpSlotAddSpeedEqpSlotAddSightEqpSlotLightSource EqpSlotWeaponEqpSlotMiscAbility EqpSlotAbMoveEqpSlotAbMeleeEqpSlotAbDisplaceEqpSlotAbAlterEqpSlotAbProjectEqpSlotAbApplyEqpSlotAddMaxCalmEqpSlotAddSmellEqpSlotAddNoctoEqpSlotAddAggression EqpSlotAbWaitEqpSlotAbMoveItemFeatureFragileLobableDurableToThrow Identified Applicable Equipable MeleeablePreciousThrowMod throwVelocity throwLingerAspectTimeout AddHurtMelee AddArmorMeleeAddArmorRangedAddMaxHP AddMaxCalmAddSpeedAddSightAddSmellAddShineAddNocto AddAggression AddAbility TimerDice TimerNone TimerGameTurnTimerActorTurnEffectELabelBurnExplodeRefillHP RefillCalmDominateImpressSummonAscendEscapeParalyze InsertMoveTeleport CreateItemDropItemPolyItemIdentifyDetect DetectActor DetectItem DetectExit DetectHidden SendFlying PushActor PullActorDropBestWeapon ActivateInv ApplyPerfumeOneOfOnSmash Recharging TemporaryUniquePeriodic CompositeItemKindisymbolinameifreqiflavouricountirarityiverbHitiweightidamageiaspectsieffectsifeatureidescikitboostItemKindList boostItemKindforApplyEffect forIdEffecttoDmg toVelocitytoLingertoOrganGameTurntoOrganActorTurn toOrganNonevalidateSingleItemKind validateDupsvalidateDamagevalidateAllItemKindhardwiredItemGroups$fBinaryTimerDice$fHashableTimerDice$fNFDataTimerDice$fShowTimerDice$fBinaryAspect$fHashableAspect$fBinaryThrowMod$fHashableThrowMod$fNFDataThrowMod$fBinaryFeature$fHashableFeature$fBinaryEqpSlot$fHashableEqpSlot$fNFDataEqpSlot$fBinaryEffect$fHashableEffect$fNFDataEffect $fEqTimerDice$fGenericTimerDice $fShowAspect $fEqAspect $fOrdAspect$fGenericAspect$fShowThrowMod $fEqThrowMod $fOrdThrowMod$fGenericThrowMod $fShowFeature $fEqFeature $fOrdFeature$fGenericFeature $fShowEqpSlot $fEqEqpSlot $fOrdEqpSlot $fEnumEqpSlot$fBoundedEqpSlot$fGenericEqpSlot $fShowEffect $fEqEffect$fGenericEffect$fShowItemKindRuleKindrsymbolrnamerfreqrtitlerfontDir rexeVersion rcfgUIName rcfgUIDefault rmainMenuArtrfirstDeathEndsrwriteSaveClipsrleadLevelClips rscoresFilernearbyvalidateSingleRuleKindvalidateAllRuleKind$fShowRuleKind TileSpeedup isClearTabisLitTab isWalkableTab isDoorTabisChangableTab isSuspectTab isHideAsTabconsideredByAITabisOftenItemTabisOftenActorTab isNoItemTab isNoActorTab isEasyOpenTabalterMinSkillTabalterMinWalkTabEmbedOpenToCloseToChangeToHideAsBuildAsRevealAs ObscureAsWalkableClearDark OftenItem OftenActorNoItemNoActor IndistinctConsideredByAITrailSpiceTileKindtsymboltnametfreqtcolortcolor2taltertfeaturevalidateSingleTileKindvalidateAllTileKindhardwiredTileGroupsactionFeatures isUknownSpace unknownId isSuspectKindisOpenableKindisClosableKindtalterForStairs floorSymbol$fNFDataFeature$fShowTileKindFenceFWallFFloorFGroundFNoneCover CAlternateCStretchCReflect CVerbatimCMirror PlaceKindpsymbolpnamepfreqpraritypcoverpfenceptopLeft poverridevalidateSinglePlaceKindvalidateAllPlaceKind $fShowCover $fEqCover $fShowFence $fEqFence$fShowPlaceKindCaveKindcsymbolcnamecfreqcxsizecysizecgrid cminPlaceSize cmaxPlaceSize cdarkChance cnightChance cauxConnectscmaxVoid cminStairDist cextraStairs cdoorChance copenChancechidden cactorCoeff cactorFreqcitemNum citemFreq cplaceFreq cpassablecdefTile cdarkCorTile clitCorTile cfillerTilecouterFenceTileclegendDarkTileclegendLitTile cescapeGroup cstairFreqcdescvalidateSingleCaveKindvalidateAllCaveKind$fShowCaveKind AutoLeader autoDungeon autoLevel LeaderMode LeaderNullLeaderAILeaderUIPlayerfnamefgroups fskillsOther fcanEscape fneverEmpty fhiCondPoly fhasGenderftactic fleaderModefhasUIHiIndeterminantHiConstHiLootHiBlitz HiSurvivalHiKillHiLoss HiPolynomial HiSummand HiCondPolyOutcomeKilledDefeatedCampingConquerRestartRoster rosterList rosterEnemy rosterAllyCavesModeKindmsymbolmnamemfreqmrostermcavesmdescvalidateSingleModeKindvalidateSingleRostervalidateSinglePlayervalidateAllModeKindhardwiredModeGroups$fBinaryOutcome$fBinaryHiIndeterminant$fBinaryAutoLeader$fBinaryLeaderMode$fBinaryPlayer $fShowOutcome $fEqOutcome $fOrdOutcome $fEnumOutcome$fBoundedOutcome$fGenericOutcome$fShowHiIndeterminant$fEqHiIndeterminant$fOrdHiIndeterminant$fGenericHiIndeterminant$fShowAutoLeader$fEqAutoLeader$fOrdAutoLeader$fGenericAutoLeader$fShowLeaderMode$fEqLeaderMode$fOrdLeaderMode$fGenericLeaderMode $fShowPlayer $fEqPlayer$fGenericPlayer $fShowRoster$fShowModeKindCOpscocavecoitemcomodecoplacecorulecotile coTileSpeedup stdRuleset createOps$fEqCOps $fShowCOps createTabcreateTabWithKey accessTabspeedupalterMinSkillKindalterMinWalkKindisClearisLit isWalkableisDoor isChangable isSuspectisHideAsconsideredByAI isExplorable isOftenItem isOftenActorisNoItem isNoActor isEasyOpen alterMinSkill alterMinWalkkindHasFeature hasFeatureopenTocloseTo embeddedItemsrevealAs obscureAshideAsbuildAsisEasyOpenKind isOpenable isClosableItemDictItemBag ItemQuant ItemTimerDiscoveryBenefitBenefitbenInEqp benPickupbenApplybenMeleebenFling ItemIxMap DiscoveryKindKindMeankmKindkmMeankmConstItemFullitemBaseitemK itemTimer itemDisco ItemDisco itemKindIditemKinditemAspectMean itemConst itemAspectItemSeed ItemKindIxDiscoveryAspect AspectRecordaTimeout aHurtMelee aArmorMelee aArmorRangedaMaxHPaMaxCalmaSpeedaSightaSmellaShineaNocto aAggressionaSkillsItemjkindIxjlidjfidjsymboljnamejflavourjfeaturejweightjdamageItemId itemPriceisMelee goesIntoEqp goesIntoInv goesIntoShaemptyAspectRecordsumAspectRecordaspectRecordToList meanAspect addMeanAspectceilingMeanDice itemNoDisco itemToFull6 aspectsRandom seedToAspect castAspectaspectRecordFull$fHashableAspectRecord$fBinaryAspectRecord $fBinaryItem$fHashableItem$fBinaryKindMean$fBinaryBenefit $fShowItemId $fEqItemId $fOrdItemId $fEnumItemId$fBinaryItemId$fShowAspectRecord$fEqAspectRecord$fOrdAspectRecord$fGenericAspectRecord$fShowItemKindIx$fEqItemKindIx$fOrdItemKindIx$fEnumItemKindIx$fIxItemKindIx$fHashableItemKindIx$fBinaryItemKindIx $fShowItem$fEqItem $fGenericItem$fShowItemSeed $fEqItemSeed $fOrdItemSeed$fEnumItemSeed$fHashableItemSeed$fBinaryItemSeed$fShowItemDisco$fShowKindMean $fEqKindMean$fGenericKindMean $fShowBenefit$fGenericBenefit$fShowItemFullstrengthEffectstrengthOnSmashstrengthCreateOrganstrengthDropOrganstrengthEqpSlotstrengthToThrow strongestSlotcomputeTrajectoryitemTrajectory totalRange hasChargedamageUsefulnessstrongestMelee prEqpSlot unknownAspectunknownMeleeBonusfilterRechargingstripRecharging stripOnSmash ReqFailure MoveNothing MeleeSelf MeleeDistantDisplaceDistantDisplaceAccessDisplaceProjectiles DisplaceDyingDisplaceBracedDisplaceImmobileDisplaceSupportedAlterUnskilled AlterUnwalked AlterDistantAlterBlockActorAlterBlockItem AlterNothing EqpOverfull EqpStackFullApplyUnskilled ApplyReadApplyOutOfReach ApplyChargingApplyNoEffects ItemNothing ItemNotCalmNotCalmPreciousProjectUnskilledProjectAimOnselfProjectBlockTerrainProjectBlockActorProjectLobableProjectOutOfReachTriggerNothingNoChangeDunLeaderimpossibleReqFailureshowReqFailurepermittedPreciouspermittedPreciousAIpermittedProjectpermittedProjectAIpermittedApply$fBinaryReqFailure$fShowReqFailure$fEqReqFailure$fGenericReqFailure ActorDict ActorAspectResDeltaresCurrentTurnresPreviousTurnActorbtrunkbhpbhpDeltabcalm bcalmDeltabposboldposblidbfid btrajectoryborganbeqpbinvbweaponbwaitbproj deltaSerious deltaMild actorCanMeleebspeedbraced actorTemplatewaitedLastTurn actorDyingactorTrunkIsBlasthpTooLow calmEnoughhpEnough checkAdjacent eqpOverfulleqpFreeNmonsterGenChance smellTimeout$fBinaryResDelta $fBinaryActor$fShowResDelta $fEqResDelta$fGenericResDelta $fShowActor $fEqActor$fGenericActorLevelldepthlfloorlembedlactorltilelxsizelysizelsmelllstairlseen lexplorableltime lactorCoeff lactorFreqlitemNum litemFreqlescapelnightlnameldescSmellMapTileMapActorMap ItemFloorDungeonascendInBranchwhereToassertSparseItemsassertSparseActors updateFloor updateEmbedupdateActorMap updateTile updateSmellat findPointfindPos findPosTry findPosTry2 $fBinaryLevel $fShowLevel $fEqLeveleffectToSuffixslotToSentence slotToName slotToDescslotToDecorator statSlots tmodToSuffkindAspectToSuffix featureToSufffeatureToSentence affixBonus wrapInParenswrapInChevrons affixDice ChallengecdiffcwolfcfishTGoal TEnemyPosTEmbedTItemTSmellTUnknownTKnownTAnyTargetTEnemyTPointTVectorStatus stOutcomestDepth stNewGameDipl DiplomacyNeutralAllianceWarFactiongnamegcolorgplayerginitialgdiplgquit_gleadergshagvictims gvictimsD FactionDictgleadertgtKindDescription isHorrorFactnameOfHorrorFactnoRunWithMultiisAIFactautoDungeonLevelautomatePlayerisAtWarisAllieddifficultyBounddifficultyDefaultdifficultyCoeffdifficultyInversedefaultChallenge$fBinaryDiplomacy$fBinaryStatus$fBinaryFaction $fBinaryTGoal$fBinaryTarget$fBinaryChallenge$fShowDiplomacy $fEqDiplomacy$fOrdDiplomacy$fEnumDiplomacy$fGenericDiplomacy $fShowStatus $fEqStatus $fOrdStatus$fGenericStatus $fShowFaction $fEqFaction$fGenericFaction $fShowTGoal $fEqTGoal $fOrdTGoal$fGenericTGoal $fShowTarget $fEqTarget $fOrdTarget$fGenericTarget$fShowChallenge $fEqChallenge$fOrdChallenge$fGenericChallengePerFidPerLid Perceptionpsightpsmell PerSmelledpsmelled PerVisiblepvisible totalVisible totalSmelledemptyPernullPeraddPerdiffPer$fBinaryPerception$fShowPerVisible$fEqPerVisible$fBinaryPerVisible$fShowPerSmelled$fEqPerSmelled$fBinaryPerSmelled$fShowPerception$fEqPerception$fGenericPerception ScoreDict ScoreTable ScoreRecord insertPosregister showScoregetTable getRecord showTableshowNearbyScores highSlideshow$fBinaryScoreRecord$fShowScoreTable$fShowScoreRecord$fEqScoreRecord$fOrdScoreRecord$fGenericScoreRecord$fEqScoreTable$fBinaryScoreTableStatesdungeon stotalDepthsactorDsitemD sitemIxMap sfactionDstimescopsshigh sgameModeId sdiscoKind sdiscoAspect sactorAspect unknownLevelunknownTileMapdefStateGlobal emptyStatelocalFromGlobal updateDungeon updateDepth updateActorD updateItemDupdateItemIxMapupdateFactionD updateTime updateCOpsupdateDiscoKindupdateDiscoAspectupdateActorAspect getItemBodyaspectRecordFromItemaspectRecordFromIidaspectRecordFromActoractorAspectInDungeon $fBinaryState $fShowState $fEqState show64With2 partItemN textAllAEpartItem partItemShort partItemHigh partItemWsR partItemWspartItemWsRangedpartItemShortAWpartItemMediumAWpartItemShortWownWviewItemitemDesc ActorDictUIActorUIbsymbolbnamebpronounbcolor keySelected partActor partPronoun ppContainerppCStore ppCStoreIn ppCStoreWownWppContainerWownW verbCStore tryFindActor tryFindHeroK$fBinaryActorUI $fShowActorUI $fEqActorUI$fGenericActorUI RequestTimedReqMoveReqMelee ReqDisplaceReqAlterReqWait ReqWait10 ReqMoveItems ReqProjectReqApplyRequestAnyAbilityReqUIReqUINop ReqUITimedReqUIGameRestart ReqUIGameExit ReqUIGameSave ReqUITactic ReqUIAutomate RequestUIReqAIReqAINop ReqAITimed RequestAI $fShowReqUI $fShowReqAI$fShowRequestTimed$fShowRequestAnyAbilityeffectToBenefitaverageTurnValue avgItemDelay avgItemLifedurabilityMult organBenefit recBenefitfakeItemaspectToBenefitrecordToBenefittotalUsefulnessfidActorNotProjAssocs actorAssocsactorRegularAssocswarActorRegularListfriendlyActorRegularListfidActorRegularIds bagAssocs bagAssocsK posToAidsLvl posToAids posToAssocsnearbyFreePointscalculateTotalmergeItemQuant sharedInv sharedEqpsharedAllOwnedsharedAllOwnedFidfindIid getActorBodygetActorAspectgetCarriedAssocsgetCarriedIidCStoregetContainerBag getFloorBag getEmbedBaggetBodyStoreBagmapActorItems_getActorAssocsgetActorAssocsKmemActor getLocalTimeregenCalmDeltaactorInAmbientcanDeAmbientList actorSkills dispEnemy itemToFull fullAssocs storeFromCaidFromClidFromCposFromCisEscapeisStair anyFoeAdjactorAdjacentAssocsarmorHurtBonusinMeleeMonadStateRead getsStategetStategetLevelnUI getGameModeisNoConfirmsGame getEntryArena pickWeaponM ItemSlots itemSlots organSlotsSlotChar slotPrefixslotCharallSlots allZeroSlotsintSlots slotLabel assignSlot$fEnumSlotChar$fBinarySlotChar $fOrdSlotChar$fBinaryItemSlots$fShowSlotChar $fEqSlotChar$fShowItemSlots Slideshow slideshowOKXKYXemptySlideshowunsnoc toSlideshowmoreMsgendMsgmenuToSlideshowwrapOKXkeysOKX splitOverlaysplitOKX$fShowSlideshow $fEqSlideshow AtomicFailMonadStateWrite modifyState atomicFailputState updateLevel updateActor updateFaction moveActorMapinsertBagContainerinsertItemContainerinsertItemFloorinsertItemEmbedinsertItemActorinsertItemOrgan insertItemEqp insertItemInv insertItemShadeleteBagContainerdeleteItemContainerdeleteItemFloordeleteItemEmbeddeleteItemActordeleteItemOrgan deleteItemEqp deleteItemInv deleteItemSha rmFromBagaddAis itemsMatchaddItemToActorresetActorAspect$fExceptionAtomicFail$fShowAtomicFailTrigger ApplyItem AlterFeatureverbobjectsymbolfeatureHumanCmdMacroByArea ByAimMode ByItemModeComposeIfLocalComposeUnlessErrorCompose2ndLocal LoopOnNothingWaitWait10MoveDirRunDir RunOnceAheadMoveOnceToXhairRunOnceToXhairContinueToXhairMoveItemProjectApplyAlterDirAlterWithPointerHelpItemMenuMainMenuGameDifficultyIncrGameWolfToggleGameFishToggleGameScenarioIncr GameRestartGameExitGameSaveAutomate SortSlots ChooseItemChooseItemMenuChooseItemProjectChooseItemApply PickLeaderPickLeaderWithPointer MemberCycle MemberBack SelectActor SelectNoneSelectWithPointerRepeatRecord MarkVision MarkSmell MarkSuspect SettingsMenuChallengesMenuCancelAcceptTgtClear ItemClear MoveXhairAimTgtAimFloorAimEnemyAimItem AimAscendEpsIncr XhairUnknown XhairItem XhairStairXhairPointerFloorXhairPointerEnemyAimPointerFloorAimPointerEnemy explorationaimingts notChosenchosen CmdTripleCmdArea CaMessage CaMapLeader CaMapPartyCaMap CaLevelNumber CaArenaName CaPercentSeen CaXhairDesc CaSelected CaCalmGauge CaHPGauge CaTargetDesc CmdCategory CmdMainMenu CmdItemMenuCmdMoveCmdItemCmdAimCmdMetaCmdMouse CmdInternal CmdNoHelpCmdDebug CmdMinimalcategoryDescriptionareaDescription$fBinaryCmdCategory$fNFDataCmdCategory$fBinaryCmdArea$fNFDataCmdArea$fBinaryTrigger$fNFDataTrigger $fReadTrigger$fBinaryHumanCmd$fNFDataHumanCmd$fShowCmdCategory$fReadCmdCategory$fEqCmdCategory$fGenericCmdCategory $fShowCmdArea $fReadCmdArea $fEqCmdArea $fOrdCmdArea$fGenericCmdArea $fShowTrigger $fEqTrigger $fOrdTrigger$fGenericTrigger$fShowHumanCmd$fReadHumanCmd $fEqHumanCmd $fOrdHumanCmd$fGenericHumanCmd UIOptions uCommands uHeroNamesuViuLaptopuGtkFontFamily uSdlFontFileuSdlTtfSizeAdduSdlFonSizeAdd uFontSize uColorIsBold uHistoryMaxuMaxFpsuNoAnim uRunStopMsgsuCmdline parseConfig mkUIOptionsapplyUIOptions$fBinaryUIOptions$fNFDataUIOptions$fShowUIOptions$fGenericUIOptionsKeyKind evalKeyDefaddCmdCategory replaceDesc replaceCmdmoveItemTriple repeatTriplemouseLMBmouseMMBmouseRMBgoToCmd runToAllCmdautoexploreCmdautoexplore25Cmd aimFlingCmd projectICmdprojectIprojectAflingTsapplyIKapplyIgrabCmd grabItemsdropCmd dropItemsdescTsdefaultHeroSelectBindingbcmdMapbcmdListbrevMap stdBindingkeyHelpokxsN KeysHintModeKeysHintBlockedKeysHintAbsentKeysHintPresent LastRecord currentKeys previousKeys freeSpace RunParams runLeader runMembers runInitial runStopMsg runWaitingAimMode aimLevelId SessionUIsxhairsactorUIsslots slastSlot slastItemMoveschanFsbinding sUIOptionssaimMode sxhairMousedsitemSel sselectedsrunning_sreportshistoryspointer slastRecord slastPlay slastLost swaitTimes smarkVision smarkSmell smenuIxMapsdisplayNeeded skeysHintModesstartsgstartsallTimesnframes sallNframessreportemptySessionUItoggleMarkVisiontoggleMarkSmell getActorUI$fBinaryRunParams$fBinarySessionUI $fShowAimMode $fEqAimMode$fBinaryAimMode$fShowRunParams$fEqKeysHintMode$fEnumKeysHintMode$fBoundedKeysHintModeSfxMsg SfxUnexpected SfxLoudUpd SfxLoudStrike SfxLoudSummon SfxFizzlesSfxNothingHappensSfxVoidDetectionSfxSummonLackCalmSfxLevelNoMoreSfxLevelPushedSfxBracedImmuneSfxEscapeImpossibleSfxTransImpossibleSfxIdentifyNothingSfxPurposeNothingSfxPurposeTooFewSfxPurposeUnique SfxColdFishSfxTimerExtended SfxAtomic SfxStrike SfxRecoilSfxSteal SfxRelease SfxProject SfxReceiveSfxApplySfxCheck SfxTriggerSfxShun SfxEffect SfxMsgFid SfxSortSlots UpdAtomicUpdCreateActorUpdDestroyActor UpdCreateItemUpdDestroyItem UpdSpotActor UpdLoseActor UpdSpotItem UpdLoseItemUpdSpotItemBagUpdLoseItemBag UpdMoveActor UpdWaitActorUpdDisplaceActor UpdMoveItem UpdRefillHP UpdRefillCalm UpdTrajectoryUpdQuitFactionUpdLeadFactionUpdDiplFactionUpdTacticFactionUpdAutoFaction UpdRecordKill UpdAlterTileUpdAlterExplorable UpdSearchTile UpdHideTile UpdSpotTile UpdLoseTile UpdAlterSmell UpdSpotSmell UpdLoseSmell UpdTimeItem UpdAgeGame UpdUnAgeGame UpdDiscoverUpdCoverUpdDiscoverKind UpdCoverKindUpdDiscoverSeed UpdCoverSeedUpdDiscoverServerUpdCoverServer UpdPerception UpdRestartUpdRestartServer UpdResumeUpdResumeServer UpdKillExit UpdWriteSave CmdAtomic undoUpdAtomic undoSfxAtomic undoCmdAtomic$fBinaryUpdAtomic$fBinarySfxMsg$fBinarySfxAtomic$fBinaryCmdAtomic$fShowUpdAtomic $fEqUpdAtomic$fGenericUpdAtomic $fShowSfxMsg $fEqSfxMsg$fGenericSfxMsg$fShowSfxAtomic $fEqSfxAtomic$fGenericSfxAtomic$fShowCmdAtomic $fEqCmdAtomic$fGenericCmdAtomic PosAtomicPosSightPosFidAndSightPosSmellPosFid PosFidAndSerPosSerPosAllPosNone posSfxAtomic posProjBody singleAid doubleAidsingleContainerbreakUpdAtomic seenAtomicCli seenAtomicSer$fShowPosAtomic $fEqPosAtomichandleUpdAtomicupdCreateActorupdDestroyActor updCreateItemupdDestroyItemupdSpotItemBagupdLoseItemBag updMoveActor updWaitActorupdDisplaceActor updMoveItem updRefillHP updRefillCalm updTrajectoryupdQuitFactionupdLeadFactionupdDiplFactionupdTacticFactionupdAutoFaction updRecordKill updAlterTileupdAlterExplorable updSearchTile updSpotTile updLoseTile updAlterSmell updSpotSmell updLoseSmell updTimeItem updAgeGame updUnAgeGameageLevel updDiscoverupdCoverupdDiscoverKind discoverKind updCoverKindupdDiscoverSeed discoverSeed updCoverSeedupdDiscoverServerupdCoverServer updRestartupdRestartServerupdResumeServer TgtAndPathtapTgttapPath BfsAndPath BfsInvalidbfsArrbfsPathAlterLid StateClientsepsstargetD sexploredsbfsDsundo sdiscoBenefitsfpersaltersrandom_sleader_ssidesquitscurChalsnxtChal snxtScenario smarkSuspect scondInMelee svictoriessoptionsemptyStateClientcycleMarkSuspect updateTarget getTarget updateLeaderssidesleader$fBinaryTgtAndPath$fBinaryStateClient$fShowBfsAndPath$fShowTgtAndPath$fGenericTgtAndPath$fShowStateClient MonadClient getsClient modifyClientliftIO getClient putClientdebugPossiblyPrint rndToActionrndToActionForget getPerFid aidTgtToPosmakeLinemaxActorSkillsClientcurrentSkillsClientpickWeaponClient updateSalter createSalterFleeViaStairsOrEscape ViaStairs ViaStairsUp ViaStairsDown ViaEscape ViaNothing ViaAnythinginvalidateBfsAidinvalidateBfsLidinvalidateBfsAll createBfsupdatePathFromBfsgetCacheBfsAndPath getCacheBfs getCachePath createPathcondBFS furthestKnownclosestUnknown closestSmell embedBenefitclosestTriggerscondEnoughGearMunexploredDepth closestItems closestFoes$fShowFleeViaStairsOrEscape$fEqFleeViaStairsOrEscapecondAimEnemyPresentMcondAimEnemyRememberedMcondTgtNonmovingMcondAnyFoeAdjMcondAdjTriggerableMmeleeThreatDistListcondBlocksFriendsMcondFloorWeaponMcondNoEqpWeaponMcondCanProjectMcondProjectListMbenAvailableItemshinderscondDesirableFloorItemMbenGroundItems desirableItem condSupportcondShineWouldBetrayMfleeList refreshTargettargetStrategypickActorToMovesetTargetFromTacticsApplyItemGroup pickActionactionStrategy waitBlockNowpickup equipItemstoShare yieldUnneeded unEquipItemsgroupByEqpSlot bestByEqpSlotharmful meleeBlockermeleeAnytrigger projectItem applyItemflee displaceFoedisplaceBlockerdisplaceTowardschase moveTowards moveOrRunAid$fEqApplyItemGroupqueryAIpickActorAndActionudpdateCondInMeleeResponseRespUpdAtomicNoState RespUpdAtomic RespQueryAI RespSfxAtomic RespQueryUI$fShowResponseMonadClientSetup saveClient restartClientcmdAtomicSemCliwipeBfsIfItemAffectsSkillstileChangeAffectsBfs createActor destroyActoraddItemToDiscoBenefit perception coverKind coverSeedkillExit SpecialArea SpecialFixed SpecialMergedAreatoAreafromArea trivialArea isTrivialAreamkFixedgridshrinkexpandsumAreas $fBinaryArea $fShowArea$fEqArea$fShowSpecialAreaCorridorHVHorizVertxyInArea mkVoidRoommkRoom connectGrid connectGrid' sortPointrandomConnection mkCorridor connectPlaces borderPlace$fEqHV TileMapEMPlaceqkindqareaqseenqlegendqFWallqFFloorqFGround placeCheck interiorArea buildPlace isChancePosolegend ooverride buildFence buildFenceRnd tilePlace $fBinaryPlace $fShowPlaceCavedkinddsecretdmapdplacesdnightbootFixedCenters buildCave pickOpening digCorridors $fShowCave FreshDungeon freshDungeonfreshTotalDepthconvertTileMaps buildTileMap buildLevelplaceDownStairslevelFromCaveKind dungeonGen EdgeIntervalEdge ConvexHullLineBumpBbxbyProgressDistancescansteeperaddHulldlinedsteeper intersect _debugSteeper _debugLine $fShowBump $fShowLineMatrix FovLitLidFovLitfovLit FovClearLidFovClearfovClear FovLucidLidFovLucidfovLucidFovShinefovShine PerCacheFid PerCacheLidPerceptionCacheptotalperActorPerActorCacheBeforeLucid creachablecnoctocsmell PerReachable preachable PerValidFidFovValid FovInvalidperceptionFromPTotalperActorFromLevelboundSightByCalmcacheBeforeLucidFromActortotalFromPerActorlucidFromLevelshineFromLevelfloorLightSourceslucidFromItemsperFidInDungeon litFromLevel litInDungeonclearFromLevelclearInDungeonlucidInDungeonperLidFromFactionperceptionCacheFromLevelfullscan$fShowFovValid $fEqFovValid$fShowPerReachable$fEqPerReachable$fShowCacheBeforeLucid$fEqCacheBeforeLucid$fShowPerceptionCache$fEqPerceptionCache$fShowFovShine $fEqFovShine$fShowFovLucid $fEqFovLucid$fShowFovClear $fEqFovClear $fShowFovLit $fEqFovLit FlavourMap ItemSeedDictDiscoveryKindRev UniqueSetItemRev ItemKnown buildItemnewItem serverDiscosemptyFlavourMapdungeonFlavourMap$fShowFlavourMap$fBinaryFlavourMapChanSave saveToChanloopSave wrapInSaves restoreGamevExevLib showVersion2 delayPrint saveNameCli saveNameSer MonadClientUI getsSession modifySession clientPrintUI mapStartY getSession putSession connFrontend displayFrame displayFramesconnFrontendFrontKeysetFrontAutoYesfrontendShutdown chanFrontend anyKeyPresseddiscardPressedKey addPressedKey addPressedEsc getReportUI getLeaderUI getArenaUI viewedLevelUIleaderTgtToPos xhairToPos clearXhair clearAimModescoreToSlideshowdefaultHistory tellAllClipPStellGameClipPSelapsedSessionTimeGTresetSessionStartresetGameStartpartActorLeaderpartActorLeaderFunpartPronounLeader partAidLeader tryRestoreleaderSkillsClientUI continueRuncontinueRunDir enterableDir tryTurning checkAndRunmsgAdd promptAddpromptMainKeys promptAddAttr recordHistory targetDesctargetDescLeadertargetDescXhairdrawFrameTerraindrawFrameContent drawFramePathdrawFrameActordrawFrameExtradrawFrameStatus drawBaseFramedrawArenaStatusdrawLeaderStatusdrawLeaderDamage drawSelected drawOverlay pushFrame promptGetKey stopPlayBack renderFramesanimate fadeOutOrInoverlayToSlideshowreportToSlideshowreportToSlideshowKeepdisplaySpaceEsc displayMoredisplayMoreKeep displayYesNo getConfirmsdisplayChoiceScreen FailOrCmdMError FailError showFailError mergeMErrorfailWithfailSerfailMsg weaveJust sortSlots memberCycle memberBackpartyAfterLeader pickLeaderpickLeaderWithPointer itemOverlay statsOverlay pickNumberlookAt$fShowFailError SuitabilitySuitsEverythingSuitsSomethingppItemDialogModeppItemDialogModeFrom storeFromMode getGroupItem getStoreItemgetFull$fShowItemDialogState$fEqItemDialogState macroHuman clearHumansortSlotsHumanchooseItemHumanchooseItemDialogModechooseItemProjectHumanpermittedProjectClient projectCheck xhairLegalEps posFromXhairpsuitReqtriggerSymbolschooseItemApplyHumanpermittedApplyClientpickLeaderHumanpickLeaderWithPointerHumanmemberCycleHumanmemberBackHumanselectActorHuman selectAidselectNoneHumanselectWithPointerHuman repeatHuman recordHuman historyHumanmarkVisionHumanmarkSmellHumanmarkSuspectHuman cancelHuman acceptHuman endAiming endAimingMsg tgtClearHumanitemClearHumandoLookmoveXhairHuman aimTgtHuman aimFloorHuman aimEnemyHuman aimItemHumanaimAscendHuman epsIncrHuman flashAimingxhairUnknownHumanxhairItemHumanxhairStairHumanxhairPointerFloorHumanxhairPointerFloorxhairPointerEnemyHumanxhairPointerEnemyaimPointerFloorHumanaimPointerEnemyHumandisplayRespUpdAtomicUIupdateItemSlotmarkDisplayNeededupdateItemSlotSide lookAtMove actorVerbMU aidVerbMU itemVerbMU itemAidVerbMUmsgDuplicateScrap createActorUIdestroyActorUIspotItem moveActordisplaceActorUI moveItemUI quitFactionUIdiscoverdisplayRespSfxAtomicUIppSfxMsg setLastSlotstrike byAreaHumanareaToRectanglesbyAimModeHumanbyItemModeHumancomposeIfLocalHumancomposeUnlessErrorHumancompose2ndLocalHumanloopOnNothingHuman waitHuman waitHuman10 moveRunHumanmeleeAid displaceAidmoveSearchAlterrunOnceAheadHumanmoveOnceToXhairHuman goToXhairmultiActorGoTorunOnceToXhairHumancontinueToXhairHuman moveItemHumanselectItemsToMove moveItems projectHuman applyHuman alterDirHuman alterTilealterTileAtPos verifyAlters verifyEscape guessAlteralterWithPointerHuman helpHuman itemMenuHumanchooseItemMenuHumanartWithVersion generateMenu mainMenuHumansettingsMenuHumanchallengesMenuHumangameScenarioIncrgameDifficultyIncrgameWolfTogglegameFishTogglegameRestartHuman nxtGameMode gameExitHuman gameSaveHuman tacticHuman automateHuman cmdHumanSemnoRemoteHumanCmd cmdAction addNoError fmapTimedToUIqueryUI humanCommandMonadClientAtomic execUpdAtomic execPutStateMonadClientWriteRequest sendRequestAI sendRequestUI clientHasUIhandleResponseMonadClientReadResponsereceiveResponseinitAIinitUIloopCliRNGsdungeonRandomGeneratorstartingRandomGenerator ServerOptionssknowMap sknowEvents sknowItemssniff sallClearsboostRandomItem sgameMode sautomateAllskeepAutomated sdungeonRngsmainRng snewGameSer scurChalSer sdumpInitRngsssavePrefixSer sdbgMsgSersclientOptionsdefServerOptions$fBinaryServerOptions $fBinaryRNGs $fShowRNGs$fShowServerOptions ActorTime StateServer sactorTime sdiscoKindRev suniqueSet sitemSeedDsitemRevsflavour sacounter sicounter snumSpawned sclientStatessperFid sperValidFid sperCacheFid sfovLucidLid sfovClearLid sfovLitLidsarenas svalidArenassrngs swriteSave soptionsNxtemptyStateServerupdateActorTimeageActor$fBinaryStateServer$fShowStateServerserverOptionsPIserverOptionsPMonadServerAtomicexecUpdAtomicSerexecUpdAtomicFidexecUpdAtomicFidCatch execSfxAtomic execSendPer MonadServer getsServer modifyServerchanSaveServer getServer putServerdebugPossiblyPrintAndExit serverPrint saveServerdumpRngs restoreScore registerScore getSetGenonlyRegisterItem registerItemcreateLevelItem embedItemrollItemrollAndRegisterItemplaceItemsInDungeonembedItemsInDungeonmapActorCStore_cmdAtomicSemSerinvalidateArenas updateSclear updateSlitinvalidateLucidLidinvalidateLucidAid actorHasShineitemAffectsShineRadiusitemAffectsPerRadius addPerActoraddPerActorAnydeletePerActordeletePerActorAnyinvalidatePerActorreconsiderPerActorinvalidatePerLidDebugAidlabelaidfactionlidbHPbtimetime debugShow debugResponse debugPretty debugPlaindebugRequestAIdebugRequestUIdebugAid$fShowDebugAidMonadServerReadRequestgetsDict modifyDict ChanServer responseS requestAIS requestUISConnServerDict CliSerQueue writeQueue readQueueAI readQueueUInewQueueputDict sendUpdatesendUpdateChecksendUpdNoStatesendSfx sendQueryAI sendQueryUIkillAllClientschildrenServer updateConnhandleCmdAtomicServerhandleAndBroadcast loudUpdAtomic loudSfxAtomicsendPer atomicForgetatomicRemember execFailure revealItems moveStoresgeneralMoveItemcontainerMoveItemquitF deduceQuits keepArenaFact deduceKilledanyActorsAlive electLeadersupplantLeader updatePerrecomputeCachePer projectFail projectBla addProjectileaddActor registerActor addActorIiddiscoverIfNoEffectspickWeaponServercurrentSkillsServer getCacheLucid getCacheTotalinitPer reinitGame mapFromFuns resetFactions gameResetpopulateDungeon findEntryPoss applyDebug spawnMonster addAnyActor rollSpawnPos advanceTimeoverheadActorTimeswapTime udpateCalmleadLevelSwitchapplyMeleeDamagerefillHPmeleeEffectAndDestroyeffectAndDestroyimperishableKititemEffectEmbeddeditemEffectDisco effectSem effectBurn effectExplodeeffectRefillHPcutCalmeffectRefillCalmeffectDominatedominateFidSfx dominateFid effectImpress effectSummon effectAscend findStairExit switchLevels1 switchLevels2 effectEscapeeffectParalyzeeffectInsertMoveeffectTeleporteffectCreateItemeffectDropItem allGroupItemsdropCStoreItem pickDroppableeffectPolyItemeffectIdentify identifyIid effectDetect effectDetectXeffectDetectActoreffectDetectItemeffectDetectExiteffectDetectHiddeneffectSendFlyingsendFlyingVectoreffectDropBestWeaponeffectActivateInveffectTransformEqpeffectApplyPerfume effectOneOfeffectRechargingeffectTemporaryeffectCompositehandleRequestAIhandleRequestUIsetBWaithandleRequestTimedmanagePerRequesthandleRequestTimedCases switchLeader affectSmellreqMovereqMelee reqDisplacereqAlterreqWait reqMoveItems reqMoveItemcomputeRndTimeout reqProjectreqApplyreqGameRestart reqGameExit reqGameSave reqTactic reqAutomate endOrLoopgameExitdieSer dropAllItems writeSaveAllloopSer factionArena arenasForLoop handleFidUpdloopUpdendClipmanageCalmAndDominationapplyPeriodicLevelhandleTrajectories hTrajectories setTrajectory handleActorshActors restartGameCliImplementationrunCliImplementationCliStatecliState cliClient cliSessioncliDict cliToSave executorCli$$fMonadClientAtomicCliImplementation*$fMonadClientWriteRequestCliImplementation*$fMonadClientReadResponseCliImplementation $fMonadClientUICliImplementation#$fMonadClientSetupCliImplementation$fMonadClientCliImplementation"$fMonadStateWriteCliImplementation!$fMonadStateReadCliImplementation$fMonadCliImplementation$fFunctorCliImplementation$fApplicativeCliImplementationSerImplementationrunSerImplementationSerStateserState serServerserDict serToSave executorSer$$fMonadServerAtomicSerImplementation)$fMonadServerReadRequestSerImplementation$fMonadServerSerImplementation"$fMonadStateWriteSerImplementation!$fMonadStateReadSerImplementation$fMonadSerImplementation$fFunctorSerImplementation$fApplicativeSerImplementationGHC.Base++ghc-primGHC.PrimseqGHC.Listfilterzipprint Data.Tuplefstsnd otherwiseassertmap$GHC.Real fromIntegral realToFrac Control.MonadguardjoinGHC.EnumBoundedminBoundmaxBoundEnumenumFrom enumFromThenenumFromThenTo enumFromTofromEnumtoEnumsuccpred GHC.ClassesEq==/= GHC.FloatFloatingpiexplogsqrt**logBasesincostanasinacosatansinhcoshtanhasinhacoshatanh Fractional fromRational/recipIntegral toIntegerquotremdivmodquotRemdivModMonad>>=>>returnfailFunctorfmap<$GHC.NumNum*+-negate fromIntegerabssignumOrd>=minmax><<=compareGHC.ReadRead readsPrecreadListReal toRational RealFloat floatRadix floatDigits floatRange decodeFloat encodeFloatexponent significand scaleFloatisNaN isInfiniteisDenormalizedisNegativeZeroisIEEEatan2RealFracproperFractiontruncateroundceilingfloorGHC.ShowShowshow showsPrecshowList Applicativepure<*>*><* Data.FoldableFoldablefoldl'foldrfoldMapnullfoldlfoldl1sumproductfoldr1maximumminimumelemData.Traversable TraversabletraversemapM sequenceAsequenceMonoidmemptymappendmconcat GHC.TypesBoolFalseTrueDoubleFloatInt integer-gmpGHC.Integer.TypeIntegerMaybeNothingJustOrderingLTEQGTRationalIOWord Data.EitherEitherStringShowS Data.Monoid<>GHC.Errerror-assert-failure-0.1.2.2-3RQYh4HfdIV2UWA7SqZzgFControl.Exception.Assert.SugarallBswith showFailureblamemfilter<$!>unless replicateM_ replicateMfoldM_foldM zipWithM_zipWithM mapAndUnzipMforever<=<>=>filterM Data.ListisSubsequenceOf mapAccumR mapAccumLforMreadIOreadLninteract getContentsgetLinegetCharputStrLnputStrputCharGHC.IO.ExceptionioErrorGHC.IOFilePath userErrorIOErrorfindnotElem minimumBy maximumByallanyorand concatMapconcatmsum sequence_forM_mapM_DualgetDualEndoappEndoAllgetAllAnygetAnySumgetSumProduct getProductFirstgetFirstLastgetLastgetAlt Data.OldListunwordswordsunlineslinesunfoldrsortOnsortBysort permutations subsequencestailsinitsgroupBygroupdeleteFirstsByunzip7unzip6unzip5unzip4zipWith7zipWith6zipWith5zipWith4zip7zip6zip5zip4genericReplicate genericIndexgenericSplitAt genericDrop genericTake genericLengthinsertByinsert partition transpose intercalate intersperse intersectByunionByunion\\deleteBydeletenubBynub isInfixOf isSuffixOf isPrefixOf findIndices findIndex elemIndices elemIndex stripPrefix dropWhileEnd Text.Readreadreadseitherlex readParenText.ParserCombinators.ReadPReadS Data.Functorvoid<$>lcmgcd^^^oddeven showParen showStringshowCharshowsunzip3unzipzipWith3zipWithzip3!!lookupreversebreakspansplitAtdroptake dropWhile takeWhilecycle replicaterepeatiteratescanr1scanrscanl'scanl1scanlfoldl1'initlasttailhead Data.MaybemapMaybe catMaybes listToMaybe maybeToList fromMaybefromJust isNothingisJustmaybeuncurrycurrysubtractasTypeOfuntil$!flip.constidapliftM5liftM4liftM3liftM2liftMwhen=<< MonadPlusmzeromplus undefinederrorWithoutStackTrace&&||notDiceIDiceDDiceDLDiceZDiceZLDicePlus DiceTimes DiceNegate _olorToRGB fancyName baseColorPlainFancyLiquid truncateLines bfsDistance runStrategy rbCarrier rbMaxSizerbNextrbLength timeTicksmsgLinemsgHistrepMsg_repN fautoYesRef fasyncTimeoutfdelaypointsnegTimedatestatus challenge gplayerName ourVictims theirVictims _sdungeon _stotalDepth_sactorD_sitemD _sitemIxMap _sfactionD_stime_scops_shigh _sgameModeId _sdiscoKind _sdiscoAspect _sactorAspectApplyAll ApplyFirstAidrollFlavourMapversion getBinDir getLibDir getDynLibDir getDataDir getLibexecDir getSysconfDirgetDataFileName failErrorgetItem DefItemKeydefLabeldefCond defActionItemDialogState ISuitableIAll