_      !"#$%&'()*+,-./0123456789:;<=>?@ 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[\]^_`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){)|)})~))*************************************++++++++++++++++,,,,,,,-----------................../////////000000000000000000000000000000000000000 0 0 1 1 1111111112222222222 2!2"2#3$3%3&3'3(3)3*4+4,4-4.4/404142434455565758595:5;5<5=5>5?5@5A5B5C5D5E5F5G5H6I6J6K6L6M6N6O6P6Q6R6S6T6U6V6W6X6Y6Z6[6\6]6^6_6`6a6b6c6d6e6f6g6h6i6j6k6l6m6n6o6p6q6r6s6t6u6v6w7x7y7z7{7|7}7~778888888888888899:::::::::;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<<<<<==============>>>>>>>???????????? ? ? ? ? ??????????????????? ?!?"?#?$?%?&?'?(?)?*?+?,?-?.?/?0?1?2?3?4?5?6?7?8?9?:?;?<?=?>???@?A?B?C?D?E?F@G@H@I@J@K@LAMANAOAPAQARASATAUAVAWAXAYAZA[A\A]A^B_C`CaCbCcCdCeCfCgChDiEjEkElEmEnEoEpEqErEsEtEuEvEwExEyEzE{E|E}E~EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFFFFFFFFGGGGHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIJJJ J J J J JJJJJJJJJJJJJJJKKKK K!K"K#K$K%K&K'K(L)M*M+N,O-O.O/O0P1P2P3P4Q5Q6Q7Q8Q9Q:Q;Q<Q=Q>Q?Q@QAQBQCQDQEQFQGQHQIQJQKQLQMQNQOQPQQQRQSRTSUSVSWSXSYSZS[S\S]S^T_T`TaTbTcTdTeTfTgThUiUjUkUlUmUnUoUpUqUrUsUtUuUvUwUxUyUzU{V|V}V~VVVVVVVVVVVVVVVVVVVVVVVVVWXXXXXXXXXXXXXXXXXYZZ[[\\\]]^^__________________________________________________________````````````````````````ab b b b b bbbbbcccccccccddddd d!d"d#d$d%d&d'd(d)d*e+e,e-e.f/f0f1f2f3f4f5f6f7f8f9f:f;f<f=f>f?f@fAfBfCgDgEhFhGiHiIiJiKiLiMjNjOjPjQjRjSkTkUkVkWkXkYlZl[m\m]m^ns Safe-InferredM 0The area left to be scanned, delimited by edges.LAn edge (comprising of a line and a convex hull) of the area to be scanned.,Convex hull represented as a list of points.Straight line between points.Rotated 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. ;Progress along an arc with a constant distance from (0, 0). 4Distance from the (0, 0) point where FOV originates. ~Maximal element of a non-empty list. Prefers elements from the rear, which is essential for PFOV, to avoid ill-defined lines. Check 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.Extends 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  5, optionally negated, applied to the second argument. a comparison functiona new bump to consider,a convex hull of bumps represented as a list      NoneMSThe area left to be scanned, delimited by fractions of the original arc. Interval (0, 1)J means the whole 45 degrees arc of the processed octant is to be scanned.bRotated and translated coordinates of 2D points, so that they fit in the same single octant area.!Calculates the list of tiles, in SBump" coordinates, visible from (0, 0).clear tile predicate the current distance from (0, 0)the current interval to scan_`_` Safe-InferredM Safe-InferredM #Queues implemented with two stacks.!Create a new empty mutable queue.Check if the queue is empty.The length of the queue.Try reading a queue. Return Nothing if empty.(Write to the queue. Faster than reading.$Remove all but the last written non-Nothing element of the queue.7Remove frames up to and including the first segment of NothingF frames. | If the resulting queue is empty, apply trimLQueue instead."Dump all but the last written non-Nothing element of the queue, if any.    o Safe-InferredM abcdefghijklmbhijklm abcdefghijklmNoneMnZSerialize, 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.o(Read and decompress the serialized data.p&Read, decompress and deserialize data.?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 copy over data files, if not already there. We catch exceptions in case many clients try to do the same thing at the same time."mPersonal data directory for the game. Depends on the OS and the game, e.g., for LambdaHack under Linux it's ~/.LambdaHack/.nop !" !" !"nop !" Safe-Inferred 0M$DActor and faction abilities corresponding to client-server requests.#$%&'()*+,-./01qrs#$%&'()*+,-./01$-,+*)('&%#./01 #$ -,+*)('&%./01qrsNone 0M 22D 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.6)Spacial dimension for points and vectors.7)Spacial dimension for points and vectors.9|The maximum number of bits for level X and Y dimension (16). The value is chosen to support architectures with 32-bit Ints.tMaximal 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.u=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.vSee  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.23456789twx:;<=>uv?yz{|23456789:;<=>?76234589:;<=>?23456789twx:;<=>uv?yz{| None 0MA2D 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.E8Tells if a vector has length 1 in the chessboard metric.FChecks 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.GReverse an arbirary vector.H/Squared euclidean distance between two vectors.INThe lenght of a vector in the chessboard metric, where diagonal moves cost 1.JTVectors of all unit moves in the chessboard metric, clockwise, starting north-west.LHVectors of all cardinal direction unit moves, clockwise, starting north.MHVectors of all diagonal direction unit moves, clockwise, starting north.N=All (8 at most) closest neighbours of a point within an area.OHAll (4 at most) cardinal direction neighbours of a point within an area.PTranslate a point by a vector.QFTranslate a point by a vector, but only if the result fits in an area.R1A list of points that a list of vectors leads to.SHA list of points that a list of vectors leads to, bounded by level size.T: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.U+A list of vectors between a list of points.VRotate 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.W_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."@ABCD}EFGHIJKLMNlimit the search to this areaposition to find neighbours ofOlimit the search to this areaposition to find neighbours ofPQRSTUV~W@ABCDEFGHIJKLMNOPQRSTUVWABCDEFGIHJLMKNOPQRSTU@VW@ABCD}EFGHIJKLMNOPQRSTUV~W NoneMXArrays indexed by Point.Y Array lookup.Z5Construct an array updated with the association list.\*Create an array from a replicated element.]1Create an array from a replicated monadic action.^ Create an array from a function._(Create an array from a monadic function.`Content identifiers array size.a!Fold left strictly over an array.bSFold left strictly over an array (function applied to each element and its index).cMap over an array.dCMap over an array (function applied to each element and its index).e.Set all elements to the given value, in place.f;Set all elements to the given value, in place, if possible.ggMap monadically over an array (function applied to each element and its index) and ignore the results.h[Yield the point coordinates of a minimum element of the array. The array may not be empty.ibYield the point coordinates of the last minimum element of the array. The array may not be empty.jbYield the point coordinates of all the minimum elements of the array. The array may not be empty.kcYield the point coordinates of the first maximum element of the array. The array may not be empty.lbYield the point coordinates of the last maximum element of the array. The array may not be empty.m/Force the array not to retain any extra memory.XYZ[\]^_`abcdefghijklmXYZ[\]^_`abcdefghijklmXYZ\]^_`abcdgfe[hijklmXYZ[\]^_`abcdefghijklm None BMn3State of legality of moves between adjacent points.r6Weighted distance between points along shortest paths.sQThe minimal distance value assigned to paths that don't enter any unknown tiles.tThe distance value that denote no legal path between points. The next value is the minimal distance value assigned to paths that don't enter any unknown tiles.u&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.vIFind a path, without the source position, with the smallest length. The eps coefficient determines which direction (or the closest directions available) that path should prefer, where 0 means north-west and 1 means north.w>Access a BFS array and interpret the looked up distance value. nopqrstuis a move from known tile legalis a move from unknown legalstarting positioninitial array, with apartBfsarray with calculated distancesvw nopqrstuvw rnqpotuvwsnqporstuvw NoneMx<The type of areas. The bottom left and the top right points.y/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.}DEnlarge (or shrink) the given area on all fours sides by the amount.xyz{|}xyz{|}xyz{|}xyz{|} None 0=BKMdfind an open and uncrowded area, patrol it according to sight radius and fallback temporarily to TRoam when enemy is seen by the faction and is within the actor's sight radius TODO (currently the same as TExplore; should it chase targets too (TRoam) and only switch to TPatrol when none?)9if enemy nearby, attack, if no items, etc., roam randomly;if enemy nearby, attack, if no items, etc., explore unknown:always follow leader's target or his position if no target.always only wait, even if enemy in melee range/A unique identifier of an actor in the dungeon.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.Abstract level identifiers.+A unique identifier of a faction in a game.Item container type.for bootstrapping actor bodiesRarity 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.@Level bounds. TODO: query terminal size instead and scroll view.Integer division, rounding up. breturn b a = [a | b]C~$~$~-~None -BM Speed 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).tOne-dimentional vectors. Introduced to tell apart the 2 uses of Time: as an absolute game time and as an increment.sGame time in ticks. The time dimension. One tick is 1 microsecond (one millionth of a second), one turn is 0.5 s.5Start of the game time, or zero lenght time interval.The smallest unit of time. Do not export, 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.An infinitesimal time period.At least once per clip all moves are resolved and a frame or a frame delay is generated. Currently one clip is 0.1 s, but it may change, and the code should not depend on this fixed value.|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).'This many turns fit in a single second.7This many ticks fits in a single second. Do not export,jAbsolute time addition, e.g., for summing the total game session time from the times of individual games.+Shifting an absolute time by a time vector.SHow many time intervals of the latter kind fits in an interval of the former kind.^How many time intervals of the latter kind cover an interval of the former kind (rounded up).Reverse a time vector.uAbsolute time negation. To be used for reversing time flow, e.g., for comparing absolute times in the reverse order.Time time vector between the second and the first absolute times. The arguments are in the same order as in the underlying scalar subtraction.Scale the time vector by an Int scalar value.Divide a time vector.fRepresent the main 10 thresholds of a time range by digits, given the total length of the time range.#Number of seconds in a mega-second.$Constructor for content definitions.CPretty-printing of speed in the format used in content definitions.#No movement possible at that speed.@Normal speed (2 m/s) that suffices to move one tile in one turn.Scale speed by an Int scalar value.Speed addition.Speed negation.EThe number of time ticks it takes to walk 1 meter at the given speed.ZCalculate projectile speed from item weight in grams and velocity percent modifier. See  =https://github.com/LambdaHack/LambdaHack/wiki/Item-statistics.GCalculate 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.BCalculate maximum range taking into account the linger percentage.%"NoneMField Of View scanning mode. digital FOVpermissive FOV+restrictive shadow casting (not symmetric!)2The type of game rule sets and assorted game data.IFor now the rules are immutable througout the game, so there is no type Rule' to hold any changing parameters, just RuleKind for the fixed set. However, in the future, if the rules can get changed during gameplay based on data mining of player behaviour, we may add such a type and then RuleKindM will become just a starting template, analogously as for the other content.The  raccessible field holds extra conditions that have to be met for a tile to be accessible, on top of being an open tile (or openable, in some contexts). The raccessibleDoor field contains yet additional conditions concerning tiles that are doors, whether open or closed. Precondition: the two positions are next to each other. We assume the predicate is symmetric.a symbolshort descriptionfrequency within groups see above see abovethe title of the gamethe path to data filesthe version of the gamebase name of the UI config file#the default UI settings config filethe ASCII art for the Main Menu6whether first non-spawner actor death ends the gameFOV calculation modegame is saved that often'server switches leader level that oftenname of the scores filename of the savefile prefix what distance between actors is nearby`Catch invalid rule kind definitions. In particular, this validates the ASCII art format (TODO).HSince we have only one rule kind, the set of rule kinds is always valid.A dummy instance of the  class, to satisfy general requirments about content. We won't have many rule sets and they contain functions, so defining a proper instance is not practical.NoneM@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 offences$all the defined content of this typeNone M!Calculates the list of tiles, in BumpA coordinates, visible from (0, 0), within the given sight range.<Create a line from two points. Debug: check if well-defined.Compare steepness of (p1, f) and (p2, f)D. Debug: Verify that the results of 2 independent checks are equal.The 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).Debug functions for DFOV:EDebug: calculate steeper for DFOV in another way and compare results.5Debug: check if a view border line for DFOV is legal.visiblity distanceclear tile predicateNoneM!Calculates the list of tiles, in Bump" coordinates, visible from (0, 0).<Create a line from two points. Debug: check if well-defined.Compare steepness of (p1, f) and (p2, f)D. Debug: Verify that the results of 2 independent checks are equal.The Y coordinate, represented as a fraction, of the intersection of a given line and the line of diagonals of squares at distance d from (0, 0).Debug functions for PFOV:EDebug: calculate steeper for PFOV in another way and compare results.+Debug: checks postconditions of borderLine.clear tile predicate Safe-Inferred 0M1Text attributes: foreground and backgroud colors.foreground colourbackgroud color)Colours supported by the major frontends.3The default colours, to optimize attribute setting.3The default colours, to optimize attribute setting.5The default attribute, to optimize attribute setting. AA helper for the terminal frontends that display bright via bold. kDue to the limitation of the curses library used in the curses frontend, only these are legal backgrounds.  Colour sets.  Colour sets.  Colour sets.@Translationg to heavily modified Linux console color RGB values.oFor reference, the original Linux console colors. Good old retro feel and more useful than xterm (e.g. brown).'     "     "          None BMA few overlays, displayed one by one upon keypress. When displayed, they are trimmed, not wrapped and any lines below the lower screen edge are not visible. If the first pair element is not Nothing, the overlay is displayed over a blank screen, including the bottom lines. The boolean flag then indicates whether to start at the topmost screenful or bottommost.A series of screen lines that may or may not fit the width nor height of the screen. An overlay may be transformed by adding the first line and/or by splitting into a slideshow of smaller overlays.The history of reports.<The type of a set of messages to show at the screen at once.The type of a single message.WRe-exported English phrase creation functions, applied to default irregular word sets.WRe-exported English phrase creation functions, applied to default irregular word sets.'The "press something to see more" mark.%The "end of screenfuls of text" mark.!The confirmation request message.Add a space at the message end, for display overlayed over the level map. Also trims (does not wrap!) too long lines. In case of newlines, displays only the first line, but marks the message as partial. Empty set of messages.!%Test if the set of messages is empty."&Construct a singleton set of messages.#!Add message to the end of report.%ySplit a messages into chunks that fit in one line. We assume the width of the messages line is the same as of level map.&1Render a report as a (possibly very long) string.)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.*Empty history of reports.+)Construct a singleton history of reports.,.Add a report to history, handling repetitions..<Render history as many lines of text, wrapping if necessary./0Take the given prefix of reports from a history.7FSplit an overlay into a slideshow in which each overlay, prefixed by msg and postfixed by moreMsgU except for the last one, fits on the screen wrt height (but lines may be too wide).8^Declare the list of raw overlays to be fit for display on the screen. In particular, current Report is eiter empty or unimportant or contained in the overlays and if any vertical or horizontal trimming of the overlays happens, this is intended.3 !"#$%&'()*+,-./012345678+ !"#$%&'()*+,-./012345678+ !"#$%&'(*-+,./045678231)- !"#$%&'()*+,-./012345678None ./0M 9The 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, unless they do some kind of normalization (see Dice).:"give acces to raw frequency values;Lshort description for debug, etc.; keep it lazy, because it's rarely used<(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.A,Test if the frequency distribution is empty.DAverage value of an Into distribution, rounded up to avoid truncating it in the other code higher up, which would equate 1d0 with 1d1.9:;<=>?@ABCD 9:;<=>?@ABCD9:;<=>?@A:;BCD9:;<=>?@ABCDNone ./EM ELA strategy is a choice of (non-empty) frequency tables of possible actions.GUStrategy where only the actions from the given single frequency table can be picked.HTStrategy with the actions from both argument strategies, with original frequencies.I Strategy with no actions at all.J Conditionally accepted strategy.KStrategy with all actions not satisfying the predicate removed. The remaining actions keep their original relative frequency values.LcWhen better choices are towards the start of the list, this is the best frequency of the strategy.MAOverwrite the description of all frequencies within the strategy.NLike *, but pick a name of the single frequency.DStrategy is a monad. TODO: Can we write this as a monad transformer?EFGHIJKLMNO EFGHIJKLMNO EFGHIJKLMNOEFGHIJKLMNOHJNone 024M PqDice for rolling a pair of integer parameters pertaining to, respectively, the X and Y cartesian 2D coordinates.RKDice for parameters scaled with current level depth. To the result of rolling the first set of dice we add the second, scaled in proportion to current depth divided by maximal dungeon depth. The result if then multiplied by the scale --- to be used to ensure that dice results are multiples of, e.g., 10. The scale is set with |*|.WA single simple dice.XDice scaled with level.[gMultiplying the dice, after all randomness is resolved, by a constant. Infix declaration ensures that  1 + 2 |*| 3 parses as  (1 + 2) |*| 3.\DMaximal value of dice. The scaled part taken assuming maximum level.]/Minimal value of dice. The scaled part ignored.^Mean value of dice. The level-dependent part is taken assuming the highest level, because that's where the game is the hardest. Assumes the frequencies are not null.`Maximal value of DiceXY.aMinimal value of DiceXY.bMean value of DiceXY.&PQRSTUVWXYZ[\]^_`abPQRSTUVWXYZ[\]^_`abRSTUSTU[WXYZ\]^_PQ`abV!PQRSTUVWXYZ[\]^_`ab[NoneM cFractional chance.dThe monad of computations with random generator state. The lazy state monad is OK here: the state is small and regularly forced.e?Get a random object within a range with a uniform distribution.f@Get a random object of a given type with a uniform distribution.g1Get any element of a list with equal probability.h5Gen an element according to a frequency distribution.6Randomly choose an item according to the distribution.iGive True., with probability determined by the fraction.jmCast dice scaled with current level depth. Note that at the first level, the scaled dice are always ignored.k5Cast dice scaled with current level depth and return True$ if the results is greater than 50.l<Cast dice, scaled with current level depth, for coordinates. cdefghijkl cdefghijkl defghcijkl cdefghijklNoneM m4The coordinates of consecutive fields of a corridor.2The choice of horizontal and vertical orientation.n#Pick a random point within an area.o3Create a random room according to given parameters.pICreate a void room, i.e., a single point area within the designated area.qPick a subset of connections between adjacent areas within a grid until there is only one connected component in the graph of all areas.DSort the sequence of two points, in the derived lexicographic order.rEPick a single random connection between adjacent areas within a grid.wCreate a corridor, either horizontal or vertical, with a possible intermediate part that is in the opposite direction.sTry to connect two interiors of places with a corridor. Choose entrances at least 4 or 3 tiles distant from the edges, if the place is big enough. Note that with pfence == FNoneX, the area considered is the strict interior of the place, without the outermost tiles. mno minimum size maximum size(the containing area, not the room itselfpqr#orientation of the starting sectionstarting point ending point*the area containing the intermediate point!straight sections of the corridorsmnopqrsnopqrms mnopqrsNone 0M y*Our own encoding of modifiers. Incomplete.~0Frontend-independent datatype to represent keys.+an unknown key, registered to warn the userright mouse button pressedmiddle mouse button pressedleft mouse button presseda single printable character3a keypad key for a character (digits and operators)#Show a key with a modifier, if any.bConfigurable event handler for the direction keys. Used for directed commands such as close door.&Binding of both sets of movement keys.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.Ctuvwxyz{|}~1tuvwxyz{|}~1~y}|{ztuvwx$tuvwxy}|{z~NoneM ARepeatedly save a simple serialized version of the current state.hRestore a saved game, if it exists. Initialize directory structure and copy over data files, if needed.  None 0BM-Sequences of screen frames, including delays.Animation is a list of frame modifications to play one by one, where each modification if a map from positions to level map symbols.6The data sufficent to draw a single game screen frame.(screen, from top to bottom, line by line%some extra lines to show over the top&some extra lines to show at the bottom display only sfTop, on blank screen Overlays the sfTop and sfBottom fields onto the sfLevel' field. The resulting frame has empty sfTop and sfBottomR. To be used by simple frontends that don't display overlays in separate windowspanesscrolled views.+Render animations on top of a screen frame.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.Mark actor location animation.1Swap-places animation, both hostile and friendly.    22     Safe-Inferred 0M The type of item flavours.*how fancy should the colour description bethe colour of the flavour%Turn a colour set into a flavour set.%Turn a colour set into a flavour set.%Turn a colour set into a flavour set."The standard full set of flavours.,Get the underlying base colour of a flavour.%Construct the full name of a flavour.4Human-readable names for item colors. The plain set.4Human-readable names for item colors. The fancy set.5Human-readable names for item colors. The liquid set.8Simple names for team colors (bright colours preferred).  None -./0M5-a hack exclusively for AI that shares weaponseFeatures of item. Affect only the item in question, not the actor, and so not additive in any sense.overrides actor's tactic (TODO)Ycan't throw or apply if not calm enough; AI and UI flag: don't risk identifying by use!AI and UI flag: goes to inventory!AI and UI flag: consider applyingthe item starts identifiedparameters modifying a throw)don't break even when hitting or applying-drop and break at target tile, even if no hit@Parameters modifying a throw. 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.)light radius, where 1 means a single tile)smell radius, where 1 means a single tile'FOV radius, where 1 means a single tileskills in particular abilitiesspeed in m/10s maximal calm maximal hp%percentage armor bonus against ranged$percentage armor bonus against melee!percentage damage bonus in ranged percentage damage bonus in melee2some effects will be disabled until item recharges in equipment, apply as often as Timeout permits&at most one copy can ever be generatedEffects 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. Constructors are sorted vs increasing impact/danger.Sthe item is temporary, vanishes at even void Periodic activation, unless Durable)this effect inactive until timeout passes0trigger if item smashed (not applied nor meleed)symbol ' ' means allDropItem CGround x True means stomp on itemsTcreate an item of the group and insert into the store with the given random timer 1the Int says if can be placed on last level, etc.'explode, producing this group of blasts9Item properties that are fixed for a given kind of items. map symbol generic namefrequency within groupspossible flavourscreated in that quantityrarity on given depthsthe verb for applying and melee weight in grams!keep the aspect continuously"cause the effect when triggered#public properties$ description%accompanying organs and items,$Catch invalid item kind definitions.-Validate all item kinds.v      !"#$%&'()*+,- !"#$%&'()*+f      !"#$%&'()*+,-f !"#$%     &'()*+,-      !"#$%&'()*+,- !"#$%&'()*+None 0M.#All possible terrain tile features./,used for visible trails throughout the level0)no actors nor stairs ever generated there1no items ever generated there2/initial actors and stairs often generated there3#initial items often generated there4'can never be excavated nor seen through5'may not be what it seems (clients only)6 is not lit with an ambient shine7actors can see through8actors can walk through91if secret, can be revealed to belong to the group:)when hidden, looks as a tile of the group;,alters tile, but does not change walkability</goes from an open to a closed tile when altered=/goes from a closed to an open tile when altered>7causes the effect when triggered; more succint than Embed), but will probably get supplanted by Embed?3embed an item of this group, to cause effects (WIP)@(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.B map symbolCshort descriptionDfrequency within groupsE map colorFmap color when not in FOVG propertiesHValidate a single tile kind.IValidate all tile kinds.TIf tiles look the same on the map, the description and the 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 iiles may freely differ wrt dungeon generation, AI preferences, etc.JFeatures of tiles that differentiate them substantially from one another. By tile content validation condition, this means the player can tell such tile apart, and only looking at the map, not tile name. 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. ./0123456789:;<=>?@ABCDEFGHIJ,-../0123456789:;<=>?@ABCDEFGHIJ@ABCDEFG.?>=<;:9876543210/HIJ.?>=<;:9876543210/@ABCDEFGHIJ,-.NoneMK)The choice of a fence type for the place.L1skip the fence and fill all with the place properM+leave an empty space, like the caves groundN*leave an empty space, like the rooms floorO'put a solid wall fence around the placePA method of filling the whole area (except for CVerbatim, which is just placed in the middle of the area) by transforming a given corner.Q7just build the given interior, without filling the areaR7tile separately and symmetrically quarters of the placeS6fill symmetrically 4 corners and stretch their bordersT8reflect every other corner, overlapping 1 row and columnUDParameters for the generation of small areas within a dungeon level.Wa symbolXshort descriptionYfrequency within groupsZrarity on given depths[+how to fill whole place based on the corner\(whether to fence place with solid border](plan of the top-left corner of the place^legend override_wCatch 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.KLMNOPQRSTUVWXYZ[\]^_`KLMNOPQRSTUVWXYZ[\]^_`UVWXYZ[\]^PTSRQKONML_`KONMLPTSRQU VWXYZ[\]^_` NoneM/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. /01abc2345deabcdebcade /01abc2345de!NoneM f{Parameters for the generation of dungeon levels. Warning: for efficiency, avoid embedded items in any of the common tiles.ha symbolishort descriptionjfrequency within groupskX size of the whole cavelY size of the whole cavem$the dimensions of the grid of placesnminimal size of placesomaximal size of placespthe chance a place is darkqthe chance the cave is darkr!a proportion of extra connectionss%at most this proportion of rooms voidtminimal distance between stairsu"the chance of a door in an openingvif there's a door, is it open?w"if not open, hidden one in n timesx"the lower, the more monsters spawnyactor groups to considerzthe number of items in the cave{item groups to consider|place groups to consider}$are passable default tiles permitted~the default cave tilethe dark cave corridor tilethe lit cave corridor tilethe filler wallthe outer fence wallthe dark place plan legendthe lit place plan legendCatch 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.!fghijklmnopqrstuvwxyz{|}~!fghijklmnopqrstuvwxyz{|}~!fghijklmnopqrstuvwxyz{|}~fghijklmnopqrstuvwxyz{|}~"None 0M+leader switching between levels is automatically done by the server and client is not permitted to change leaders (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 wellleader switching within a level is automatically done by the server and client is not permitted to change leaders (server is guaranteed to switch leader within a level very rarely, e.g., when the old leader dies); if the flag is Falseb, server still does a subset of the automatic switching, but the client is permitted to do moreIf a faction with LeaderUI and LeaderAI has any actor, it has a leader.!leader under UI control, assumes fhasUIleader under AI control5faction can have no leader, is whole under AI control"Properties of a particular player.name of the player$name of the monster group to controlskills of the other actors!the player can escape the dungeon(the faction declared killed if no actorsscore polynomial for the player(whether actors have numbers, not symbolswhether actors have gender'members behave according to this tactic%level where the initial members startnumber of initial members 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.game is restarted$the player escaped the dungeon alive(the player won by eliminating all rivalsgame is supended(the faction lost the game in another waythe faction was eliminated/The specification of players for the game mode.players in the particular teamthe 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 symbol (matches the keypress, if any)short descriptionfrequency within groupsplayers taking part in the gamearena of the game description)Catch invalid game mode kind definitions.6Checks, in particular, that there is at least one faction with fneverEmpty or the game could get stuck when the dungeon is devoid of actors5Validate all game mode kinds. Currently always valid.?6789:;<886789:;<#None =BHKM 4Operations for all content types, gathered together.+Content operations for the content of type a.the 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 over the given group only!bounds of identifiers of content aauxiliary speedup componentsNType family for auxiliary data structures for speeding up content operations.)Content identifiers for the content type c.#Create content operations for type a% from definition of content of type a./The standard ruleset used for level operations.=>?=>?$None 0BM,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 the two. Note that jlidx is not meaningful; it gets forgotten if items from different levels roll the same random properties and so are merged.WAll items in the dungeon (including in actor inventories), indexed by item identifier.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#the level on which item was created map symbol generic nameflavourpublic propertiesweight in grams, obvious enoughVThe map of item ids to item aspects and effects. The full map is known by the server.the aspects of the itemthe effects when appliedA seed for rolling aspects and effects of an item Clients have partial knowledge of how item ids map to the seeds. They gain knowledge by identifying items.eThe map of item kind indexes to item kind ids. The full map, as known by the server, is a bijection.An index of the kind id of an item. Clients have partial knowledge how these idexes map to kind ids. They gain knowledge by identifying items..A unique identifier of an item in the dungeon.,@ABCDEF%%@ABCDEF%NoneM%GHIJKLMNOPQRSTUVWXY      %GHIJKLMNOPQRSTUVWXY  &None =KM^The last time a hero left a smell in a given tile. To be used by monsters that hunt by smell.*Whether a tile kind has the given feature.@Whether a tile kind (specified by its id) has the given feature.CWhether a tile does not block vision. Essential for efficiency of FOV, hence tabulated.?Whether a tile 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.Whether actors can walk into a tile, perhaps opening a door first, perhaps a hidden door. Essential for efficiency of pathfinding, hence tabulated.Whether actors can walk into a tile, perhaps opening a door first, perhaps a hidden door. Essential for efficiency of pathfinding, hence tabulated. dWhether a tile is a door, open or closed. Essential for efficiency of pathfinding, hence tabulated.!UWhether a tile is suspect. Essential for efficiency of pathfinding, hence tabulated."|Whether a tile kind (specified by its id) has a ChangeTo feature. Essential for efficiency of pathfinding, hence tabulated.#JWhether one can easily explore a tile, possibly finding a treasure or a clue. 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.$.The player can't tell one tile from the other.,@Whether a tile kind (specified by its id) has an OpenTo feature.-@Whether a tile kind (specified by its id) has a CloseTo feature.) Z   !"#$%[&'()*+,-./0\&    !"#$%&'()*+,-./0& !#$%&'()*+,-"./0    Z   !"#$%[&'()*+,-./0\'NoneM1`The part of speech describing the item parameterized by the number of effects/aspects to show..2'The part of speech describing the item. 123456789 123456789 124567839 123456789(None BM:VReverse item map, for item creation, to keep items and item identifiers in bijection.;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.@#Build an item with the given stats.A 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.C:Randomly chooses flavour for all item kinds for this game. :;^<=>?@AB]C :;<=>?@ABC :@A<>?=;BC :;^<=>?@AB]C)NoneM#D5All actors on the level, indexed by actor identifier.G resource change this player turnH resource change last player turnI`Actor properties that are changing throughout the game. If they are dublets of properties from  ActorKindY, they are usually modified temporarily, but tend to return to the original value from  ActorKind over time. E.g., HP.Lindividual map symbolMindividual nameNindividual pronounOindividual map colorPabsolute time of next actionQcurrent hit points * 1MRHP delta this turn * 1MScurrent calm * 1MTcalm delta this turn * 1MUcurrent positionVprevious positionW current levelXprevious levelY&faction the actor currently belongs toZ!the faction actor is attracted to[!the original faction of the actor\8trajectory the actor must travel and his travel speed]organs^personal equipment_personal inventory`is the actor waiting right now?aDis a projectile? (shorthand only, this can be deduced from bkind)hChance 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.i(The part of speech describing the actor.j0The part of speech containing the actor pronoun.kA template for a new actor.m@Add time taken by a single 1m step at the actor's current speed.n0Whether an actor is braced for combat this clip.oThe actor waited last turn.xYChecks for the presence of actors in a position. Does not check if the tile is walkable.y5How long until an actor's smell vanishes from a tile.>DEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~_`=DEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~=hijIJKLMNOPQRSTUVWXYZ[\]^_`aEFGHbcdefglkmnopqxrstuvwDyz{|}~#DEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~_`*None MThe type of na actor target.!target position relative to actortarget a concrete spot(last seen position of the targeted actorDtarget an actor; cycle only trough seen foes, unless the flag is setCurrent game status.current game outcomedepth of the final encounternew game group to start, if anyGDiplomacy states. Higher overwrite lower in case of assymetric content.individual namecolor of actors or their frames the player spec for this factiondiplomatic modecause of game end/exit(the leader of the faction and his targetfaction's shared inventorymembers killed8All factions in the game, indexed by faction identifier.;Tell whether the faction consists of summoned horrors only.Horror 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 duel game between two hero players 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. Actors that can be summoned should have "horror" in their ifreq set./Check if factions are at war. Assumes symmetry./Check if factions are allied. Assumes symmetry.)abcd&& abcd+None 0M %Font 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.KDon't maintain any requested delays between frames, e.g., for screensaver.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.(The difficulty level for all UI clients.Prefix of the save game file.9Whether to use the stdout/stdin frontend for all clients.?Whether to use void (no input/output) frontend for all clients.&Show clients' internal debug messages.eepNone Mf(Session data maintained by the frontend.gthe widget to draw tohtext color tags for fg/bgichannel for keyboard inputjState of the frame finite machine. This mvar is locked for a short time only, because it's needed, among others, to display frames, which is done by a single polling thread, in real time.koMost recent full (not empty, not repeated) frame received and if any empty frame followed it. This mvar is locked for longer intervals to ensure that threads (possibly many) add frames in an orderly manner. This is not done in real time, though sometimes the frame display subsystem has to poll for a frame, in which case the locking interval becomes meaningful.lclient configurationmscreen output channelnlast full frame showno(Perform an operation on the frame queue.pThe name of the frontend.q^Starts GTK. The other threads have to be spawned after gtk is initialized, because they call  postGUIAsync , and need sview and stags. Because of Windows, GTK needs to be on a bound thread, so we can't avoid the communication overhead of bound threads, so there's no point spawning a separate thread for GTK.r@Sets up and starts the main GTK loop providing input and output.s&Output to the screen via the frontend.tMaximal polls per second.u+Add a given number of microseconds to time.vFThe difference between the first and the second time, in microseconds.w>Poll the frame queue often and draw frames at fixed intervals.x>Poll the frame queue often and draw frames at fixed intervals.yJAdd a game screen frame to the frame drawing channel, or show it ASAP if  immediate/ display is requested and the channel is empty.zCTrim current frame queue and display the most recent frame, if any.{Add a frame to be drawn.|Display a prompt, wait for any key. Starts in Push mode, ends in Push or None mode. Syncs with the drawing threads by showing the last or all queued frames.}Tells a dead key.~)Translates modifiers to our own encoding.,fghijklmnopqrsfrontend session datathe screen frame to drawtuvwxyz{frontend session datathe screen frame to draw|}~fpq{|fghijklmnopqrstuvwxyz{|}~,NoneM8No session data needs to be maintained by this frontend.client configurationThe name of the frontend.AStarts the main program loop using the frontend input and output.&Output to the screen via the frontend.Input key via the frontend.#Display a prompt, wait for any key. frontend session datathe screen frame to draw-None M The name of the chosen frontend.   .NoneM {Connection channel between a frontend and a client. Frontend acts as a server, serving keys, when given frames to display.DThe instructions sent by clients to the raw frontend over a channel.exit frontend loop2set the frontend option for auto-answering prompts>show a whole slideshow without interleaving with other clientsAflush frames, possibly show fadeout/fadein and ask for a keypressperform a single explicit delay show a frame_Initialize the frontend and apply the given continuation to the results of the initialization.Display a prompt, wait for any of the specified keys (for any key, if the list is empty). Repeat if an unexpected key received.debug settings continuation /None 0BM1A 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 interruptiondifficulty of the gamename of the faction's gplayer allies lost foes killedIShow a single high score, from the given ranking in the high score table.Empty 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.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 datedifficulty levelname of the faction's gplayer allies lost foes killedcurrent score table*position of the current score in the tablethe name of the game mode   0NoneM!+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 actor times on the level#remembered items lying on the flooritems embedded in the tileremembered level mapwidth of the levelheight of the levelremembered smells on the levellevel descriptionpositions of (up, down) stairs currently remembered clear tiles%total number of initially clear tiles&date of the last activity on the level"the lower, the more monsters spawn+frequency of spawned actors; [] for clients&number of initial items, 0 for clients*frequency of initial items; [] for clientssecret tile seedsecret tile densitypositions of IK.Escape tilesCurrent smell on map tiles.Tile kinds on the map.Items located on map tiles.Actor time priority queue.9The complete dungeon is a map from level names to levels.Levels in the current branch, k# levels shallower than the current. Query for tile kinds on the map.Check whether one position is accessible from another, using the formula from the standard ruleset. Precondition: the two positions are next to each other.Check whether one position is accessible from another, using the formula from the standard ruleset, but additionally treating unknown tiles as walkable. Precondition: the two positions are next to each other.pCheck whether actors can move from a position along a unit vector, using the formula from the standard ruleset.9Find a random position on the map satisfying a predicate.GTry to find a random position on the map satisfying the conjunction of the list of predicates. If the permitted number of attempts is not enough, try again the same number of times without the first predicate, then without the first two, etc., until only one predicate remains, at which point try as many times, as needed.+the number of trieslook up in this mapmandatory predicateoptional predicates  +  +    1None 0BM BPerception indexed by faction identifier. This can't be added to  FactionDict, because clients can't see it. <Perception of a single faction, indexed by level identifier. =The type representing the perception of a faction on a level.sum over all actorssum over actors that can smell.The set of tiles visible by at least one hero..The set of tiles smelled by at least one hero.              2None HM 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.]The parameters of a place. Most are immutable and set at the time when a place is generated. For  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.5Calculate 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 (e.g., for stairs).!-Given a few parameters, roll and construct a 9 datastructure and fill a cave section acccording to it.ERoll a legend of a place plan: a map from plan symbols to tile kinds.;Construct a fence around an area, with the given tile kind."<Construct a fence around an area, with the given tile group."Create a place by tiling patterns. the area to fillthe place kind to construct!the game contentcurrent cave kindwhether the cave is dark dark fence tile, if fence hollowlit fence tile, if fence hollowcurrent level depthabsolute depth'whole area of the place, fence included"the area to fillthe place kind to construct  !"  "!  !"3NoneM#5The type of caves (not yet inhabited dungeon levels).%the kind of the cave&tile kinds in the cave'places generated in the cave(whether the cave is dark)?Cave generation by an algorithm inspired by the original Rogue,#$%&'()content definitionsdepth of the level to generateabsolute depthcave kind to use for generation#$%&'()#$%&'()#$%&'()4None M*0Freshly generated and not yet populated dungeon.,maps for all levels-absolute dungeon depth0Create a level from a cave.1)Build rudimentary level from a cave kind.3$Generate the dungeon for a new game. *+,-./0123 *+,-./0123 *+,-3./012*+,-./01235NoneM4View on game state.  Rememberedl fields carry a subset of the info in the client copies of the state. Clients never directly change their State7, but apply atomic actions sent by the server to do so.remembered dungeon)absolute dungeon depth, for item creation remembered actors in the dungeonremembered items in the dungeonremembered sides still in gameglobal game timeremembered contenthigh score tablecurrent game mode5#Initial complete global game state.6Initial empty state.7QLocal state created by removing secret information from global state components.8!Update dungeon data within state.9Update dungeon depth.:Update the actor dictionary.;Update the item dictionary.<!Update faction data within state.= Update global time within state.>!Update content data within state.!456789:;<=>?@ABCDEFG456789:;<=>?@ABCDEFG4?@ABCDEFG56789:;<=>4 56789:;<=>?@ABCDEFG6None EM S2Finds an actor at a position on the current level.V6Calculate loot's worth for a faction of a given actor.Z/Price an item, taking count into consideration.ATries to finds an actor body satisfying a predicate on any level.\WCompute the level identifier and starting position on the level, after a level change.];Gets actor body from the current level. Error if not found.ewChecks 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)f'Get current time from the dungeon data.qwDetermine the dungeon level of the container. If the item is in a shared stash, the level depends on which actor asks.5HIJKLMNOPQRSTUVWXYZ[\level of the stairsposition of the stairsjump up this many levelscurrent game dungeon5target level and the position of its receiving stairs]^_`abcdefghijklmnopqrstuv/HIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuv/HIJKLMNOQRVWXY`abcdU\^_TSPe][fZghijklmnopqrstuv5HIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuv7NoneM wxyz{|}~ wxyz{|}~ wxyz{|}~wxyz{|}~8NoneM%Update the actor time priority queue.#Update the items on the ground map.1Update the items embedded in a tile on the level.Update the tile map.Update the smell map.'Update a given level data within state.9NoneMHow much AI benefits from applying the effect. Multipllied by item p. Negative means harm to the enemy when thrown at him. Effects with zero benefit won't ever be used, neither actively nor passively.(Return the value to add to effect value.Determine the total benefit from having an item in eqp or inv, according to item type, and also the benefit confered by equipping the item and from meleeing with it or applying it or throwing it.:None BM~Assigns a slot to an item, for inclusion in the inventory or equipment of a hero. Tries to to use the requested slot, if any.    ;None 0M#Abstract syntax of player commands.Commands that are forbidden on a remote level, because they would usually take time when invoked on one. Note that some commands that take time are not included, because they don't take time in targeting mode.Description of player commands.NJO  3 <NoneM+Key-command mappings to be used for the UI.default client UI commands=None 03MTFully typed contents of the UI config file. This config is a part of a game client.(the option for Vi keys takes precendence'because the laptop keys are the defaultRead and parse UI config file. >NoneM;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 keysiBinding of keys to movement and other standard commands, as well as commands defined in the config file.4Produce a set of help screens from the key bindings.%default key bindings from the content game configconcrete binding?None 0MHDetermine if a strike special effect should depict a block of an attack.Abstract syntax of atomic special effects, that is, atomic commands that only display special effects and don't change the state.  Abstract syntax of atomic updates, that is, atomic commands that really change the state. 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 them to players.@PAbstract syntax of atomic commands, that is, atomic game state transformations.Aatomic special effectsBatomic updatesM      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEI      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEI@BA ?>=<;:9876543210/.-,+*)('&%$#"!     CDE       2?>=<;:9876543210/.-,+*)('&%$#"! @BACDE@NoneMF:The monad for executing atomic game state transformations.G6Execute an arbitrary atomic game state transformation.H8Execute an atomic command that really changes the state.I=Execute an atomic command that only displays special effects.JBCreate and broadcast a set of atomic updates, one for each client.KJCreate and broadcast a set of atomic special effects, one for each client.FGHIJKFGHIJKFGHIJKFGHIJKANoneMLThe 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.M$never broadcasted, but sent manuallyNeverybody noticesOonly the server noticesPfaction and server noticesQonly the faction noticesR*whomever smells all the positions, noticesS observers and the faction noticeT(whomever sees all the positions, noticesU:Produce the positions where the atomic update takes place.The goal of the mechanics is to ensure the commands don't carry significantly more information than their corresponding state diffs would. In other words, the atomic commands involving the positions seen by a client should convey similar information as the client would get by directly observing the changes the commands enact on the visible portion of server game state. The client is then free to change its copy of game state accordingly or not --- it only partially reflects reality anyway.E.g., UpdDisplaceActor in a black room, with 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 should be (or the former should be perceived as the latter). However, to simplify, we assing 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.VBProduce the positions where the atomic special effect takes place.W#Determines if a command resets FOV.Invariant: if resetsFovCmdAtomic6 determines we do not need to reset Fov, perception (ptotal to be precise, psmellu is irrelevant) of any faction does not change upon recomputation. Otherwise, save/restore would change game state.XpDecompose an atomic action. The original action is visible if it's positions are visible both before and after the action (in between the FOV might have changed). The decomposed actions are only tested vs the FOV after the action and they give reduced information that still modifies client's state to match the server state wrt the current FOV and the subset of  posUpdAtomic that is visible. The original actions give more information not only due to spanning potentially more positions than those visible. E.g.,  UpdMoveActoru informs about the continued existence of the actor between moves, v.s., popping out of existence and then back in.Y#Decompose an atomic special effect.Z-Messages for some unseen game object creation destruction alteration.[fGiven the client, it's perception and an atomic command, determine if the client notices the command.]CGenerate the atomic updates that jointly perform a given item move.LMNOPQRSTUVWXYZ[\]LMNOPQRSTUVWXYZ[\]LTSRQPONMUVWXYZ[\]LTSRQPONMUVWXYZ[\]BNoneM^DThe game-state semantics of atomic game commands. Special effects ( SfxAtomic) don't modify state.Creates an actor. Note: after this command, usually a new leader for the party should be elected (in case this actor is the only one alive).Kills an actor.OCreate a few copies of an item that is already registered for the dungeon (in sitemRev field of  StateServer).2Destroy some copies (possibly not all) of an item.]Record a given number (usually just 1, or -1 for undo) of actor kills for score calculation.mAlter an attribute (actually, the only, the defining attribute) of a visible tile. This is similar to e.g.,  UpdTrajectory. Age the game.TODO: It leaks information that there is activity on various level, even if the faction has no actors there, so show this on UI somewhere, e.g., in the ~- menu of seen level indicate recent activity.%^           ^^%^           qNoneMY      !"#$%&'()*+,-./0123456789:;<=>?@ABFGHIJKLMNOPQRSTUV[]YFGHIJK@BA ?>=<;:9876543210/.-,+*)('&%$#"!     LTSRQPONMUV[]CNoneM_3Abstract syntax of client commands that use the UI.d9Abstract syntax of client commands that don't use the UI. _`abcdefg _`abcdefg dgfe_cba`_cba`dgfeDNoneMh5Send an atomic action to all clients that can see it. h hh h ENone BM.oParameters of the current run.q"the original leader from run startr!the list of actors that take partsHinitial run continuation by any run participant, including run leadert!message with the next stop reasonu)waiting for others to move out of the wayv#Current targeting mode of a client.zClient state, belonging to a single faction. Some of the data, e.g, the history, carries over from game to game, even across playing sessions. Data invariant: if _sleader is Nothing then so is srunning.|targeting mode}the common, cursor target~#a parameter of the tgt digital line$targets of our actors in the dungeon the set of fully explored levelsJpathfinding distances for our actors and paths to their targets, if any$the set of currently selected actors%parameters of the current run, if anycurrent messageshistory of messages#moves are displayed up to this time!atomic commands performed to dateremembered item discoveriesremembered effects&Co of items$faction perception indexed by levelscurrent random generatorlast issued key commandstate of key sequence recordingstate of key sequence playback!actors that just got out of sight"player just waited this many timescurrent picked party leader faction controlled by the clientexit the game loopwhether it's an AI clientmark leader and party FOV#mark smell, if the leader can smellmark suspect featurescurrent game difficulty levelmap from slots to itemslast used slotlast used store!just canceled AI control with ESCclient debugging modeInitial game client state.-Update target parameters within client state.(Get target parameters from client state.:Update picked leader within state. Verify actor's faction.@ijklmnopqrstuvwxyz{|}~  >ijklmnopqrstuvwxyz{|}~>z{|}~yvwxopqrstunimlkjimlkjnopqrstuvwxyz#{|}~  FNoneM{Assuming the client runs on the same machine and for the same user as the server, move the server savegame out of the way.FInvoke pseudo-random computation with the generator kept in the state.   GNone 368EHMHNone!"(*:=MKClient-server requests that take game time. Sent by both AI and UI clients.*Client-server requests sent by UI clients.+Cclient-server requests sent by AI clients.@@@   INone (M'Get the current perception of a client.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.,Calculate the position of an actor's target.Check whether one is permitted to aim at a target (this is only checked for actors; positions let player shoot at obstacles, e.g., to destroy them). This assumes  aidTgtToPos does not return Nothing. 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.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.JNoneM6Require that the target enemy is visible by the party.ARequire that the target enemy is remembered on the actor's level.ARequire that the target enemy is adjacent to at least one friend. !Check if the target is nonmoving. +Require that any non-dying foe is adjacent. %Require the actor's HP is low enough. 1Require the actor stands over a triggerable tile. Produce the chess-distance-sorted list of non-low-HP foes on the level. We don't consider path-distance, because we are interested in how soon the foe can hit us, which can diverge greately from path distance for short distances.?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.?Check whether the actor has enough gear to go look for enemies.-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.%Require the actor is not calm enough.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.FRequire the actor is in a bad position to melee or can't melee at all.VRequire that the actor stands in the dark, but is betrayed by his own equipped light,8Produce a list of acceptable adjacent points to flee to.                    KNone EMGet cached BFS data and path or, if not stored, generate, store and return. Due to laziness, they are not calculated until needed. $Furthest (wrt paths) known position.!0Closest reachable unknown tile position, if any.":Finds smells closest to the actor, except under the actor.#!Closest (wrt paths) suspect tile.$Closest (wrt paths) triggerable open tiles. 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.&CClosest (wrt paths) items and changeable tiles (e.g., item caches).'!Closest (wrt paths) enemy actors.   !"#$%&'  !"#$%&' %!#" $&'   !"#$%&'LNone (M(=AI strategy based on actor's sight, smell, etc. Never empty. A strategy to always just wait.  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. We don't verify the stairs are targeted by the actor, but at least the actor doesn't target a visible enemy at this point. ;Actor moves or searches or alters or attacks. Displaces if run. This function is very general, even though it's often used in contexts when only one or two of the many cases can possibly occur.     (     ! " # $ % & '  ( ) * + , - . / ((     (     ! " # $ % & '  ( ) * + , - . / MNone EM)8AI proposes possible targets for the actor. Never empty.)*)*)*)*NNone EM++++ONone M, Handle the move of an AI player.-4Client signals to the server that it's still online..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./0Pick an action the actor will perfrom this turn.,-.the actor to refresh/,-./,-./,-./PNoneM0Color mode for the display.1black+white only2normal, with full colours3Draw the whole screen: level map and status area. Pass at most a single page if overlay of text unchanged to the frontends to display separately or overlay over map, depending on the frontend. 0123 0 1 2 3 4 5012302130213 0 1 2 3 4 5QNone HM 48The monad that gives the client access to UI operations.7The information that is constant across a client playing session, including many consecutive games in a single session, but is completely disregarded and reset when a new playing session starts. This includes a frontend session and keybinding info.9connection with the frontend:binding of keys to commands 6,Read a keystroke received from the frontend. 7#Write a UI request to the frontend.>7Display an overlay and wait for a human player command.?JDisplay a slideshow, awaiting confirmation for each slide except the last.B;Push frames or delays to the frame queue. Additionally set  sdisplayed.. because animations not always happen after  SfxActorStart on the leader's level (e.g., death can lead to leader change to another level mid-turn, and there could be melee and animations on that level at the same moment). Insert delays, so that the animations don't look rushed.C/Draw the current level with the overlay on top.FGet the key binding.G&Sync frames display with the frontend.#456789:;< 6 7=>?@ABC 8DEFGHIJKLM 9NOPQR"012456789:;<=>?@ABCDEFGHIJKLMNOPQR"456789:;<021=>?@ABCDEFGHIJKLMNOPQR456789:;< 6 7=>?@ABC 8DEFGHIJKLM 9NOPQRRNoneMSWire together game content, the main loops of game clients, the main game loop assigned to this frontend (possibly containing the server loop, if the whole game runs in one process), UI config and the definitions of game commands.S UI main loop AI main loopkey and command content game contentclient debug parametersfrontend main loopSSSSNoneM :A yes-no confirmation.TDisplay a message with a -more-F prompt. Return value indicates if the player tried to cancel/escape.U~Print a yes/no question and return the player's answer. Use black and white colours to turn player's attention to the choice.VPrint a prompt and an overlay and wait for a player keypress. If many overlays, scroll screenfuls with SPACE. Do not wrap screenfuls (in some menus ?5 cycles views, so the user can restart from the top).WPush the frame depicting the current level to the frame queue. Only one screenful of the report is shown, the rest is ignored.YThe prompt is shown after the current message, but not added to history. This is useful, e.g., in targeting mode, not to spam history.ZThe prompt is shown after the current message at the top of each slide. Together they may take more than one line. The prompt is not added to history. The portions of overlay that fit on the the rest of the screen are displayed below. As many slides as needed are shown.\5Render animations on top of the current screen frame. :TUVWXYZ ;[\] TUVWXYZ[\] TUVWXYZ[\] :TUVWXYZ ;[\]TNoneM_$Add a message to the current report.`4Wipe out and set a new value for the current report.a5Store current report in the history and reset report.fProduces 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 targeting mode.gCreate a list of item names. ^_`abcdef detailed?how to start tile descriptioncan be seen right now?position to describethe actor that looksan extra sentence to printg ^_`abcdefg _`a^bcdefg ^_`abcdefgUNone (M <can be undefined if not defCondlLet 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.mLet the human player choose any item from a list of items and let him specify the number of items. Used, e.g., for picking up and inventory manipulation.nDisplay 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. =Let 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.oCSwitches current member to the next on the level, if any, wrapping.pGSwitches current member to the previous in the whole dungeon, wrapping.q1Select a faction leader. False, if nothing to do.t(Move the cursor. Assumes targeting mode.ubCycle targeting mode. Do not change position of the cursor, switch among things at that position.w Tweak the eps) parameter of the targeting digital line.y{Perform look around in the current position of the cursor. Normally expects targeting mode and so that a leader is picked. ?Create a list of item names.+hijk @ A < B C D E F G H I J K L Ml which items to consider suitable'specific prompt for only suitable itemsgeneric prompt+whether to enable setting cursor with mouseinitial legal modes)legal modes after Calm taken into accountmthe verb describing the actioninitial legal modes)legal modes after Calm taken into accountFwhether to ask, when the only item in the starting mode is suitable&whether to ask for the number of itemsnhow to describe suitable items initial mode =  which items to consider suitable'specific prompt for only suitable itemsgeneric prompt+whether to enable setting cursor with mouseinitial 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 resultthe dialog state to start in >  which items to consider suitable'specific prompt for only suitable itemsgeneric prompt+whether to enable setting cursor with mousefirst 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 the dialog state to start in N O P Q Rop Sqrstuvwxy ?zhijklmnopqrstuvwxyzhkjilmnopqrstuvwxyz hkji @ A < B C D H G F E I J K L Mlmn = > N O P Q Rop Sqrstuvwxy ?zVNoneM }CSwitches current member to the next on the level, if any, wrapping.~GSwitches current member to the previous in the whole dungeon, wrapping.4Clear current messages, show the next screen if any.Display command help.Display the main menu.|Change the displayed level in targeting mode to (at most) k levels shallower. Enters targeting mode, if not already in one.~Cancel something, e.g., targeting mode, resetting the cursor to the position of the leader. Chosen target is not invalidated. T3End targeting mode, rejecting the current position.Accept something, e.g., targeting mode, keeping cursor where it was. Or perform the default action, if nothing needs accepting. U3End targeting mode, accepting the current position. V3End targeting mode, accepting the current position."{|}~ W X T U V Y!tuvwx{|}~!{|}~tuvwx"{|}~ W X T U V YWNone HM(Continue running in the given direction. Z8This 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-cursor 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-cursor 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. Z [ \ Z [ \XNone !"(M ]4Actor atttacks an enemy actor or his own projectile. ^"Actor swaps position with another. _DActor moves or searches or alters. No visible actor at the position.'Leader waits a turn (and blocks, etc.).GDisplay items from a given container store and describe the chosen one.2Ask for a direction and alter a tile, if possible. `-Player tries to alter a tile using a feature. a-Guess and report why the bump command failed.2Leader tries to trigger the tile he's standing on. b/Player tries to trigger a tile using a feature. c?Verify important feature triggers, such as fleeing the dungeon. d-Guess and report why the bump command failed.  ] ^ _ e f g ` h a b i c d j k  ] ^ _ e f g ` h a b i c d j kYNoneM7The semantics of human player commands in terms of the Action monad. Decides if the action takes time and what action to perform. Some time cosuming commands are enabled in targeting mode, but cannot be invoked in targeting mode on a remote level (level different than the level of the leader). lFCompute the basic action for a command and mark whether it takes time. l m l mZNone EMClients keep a subset of atomic commands sent by the server and add some of their own. The result of this function is the list of commands kept for each command received.kEffect of atomic actions on client state is calculated in the global state before the command is executed.  n o p q r s t u  n o p q r s t u[NoneMVisualize atomic actions 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. v&Sentences such as "Dog barks loudly.".=Display special effects (text, animation) sent to the client. w x v y z { | } ~    w x v y z { | } ~   \None MHandle the move of a UI player.ALet the human player issue commands until any command takes time.kClient signals to the server that it's still online, flushes frames (if needed) and sends some extra info.01247ST_4S7021T_]None 3M  ^None 3M$The main game loop for an AI client.#The main game loop for a UI client.  rNone 3MSS_NoneMDebug commands. See st for the descriptions.client debug parametersGlobal, server state.full item kind discoveries data#reverse map, used for item creationalready generated unique itemsfull item effect&Co datamap from item ids to item seeds&reverse id map, used for item creationK(sight, smell, light) aspect bonus of the item; zeroes if not in the mapassociation of flavour to itemsstores next actor indexstores next item index$actors are processed up to this time!atomic commands performed to dateperception of all factionscurrent random generatorinitial random generatorsexit the game loopwrite savegame to a file nowthis session start timethis game start time$clips since the start of the sessionhero names sent by clientscurrent debugging mode debugging mode for the next game!Initial, empty game server state.? ::  `NoneM6Dumps RNG states from the start of the game to stderr.CRead the high scores dictionary. Return the empty table if no file.+Generate a new score, register it and save.wCompute and insert auxiliary optimized components into game content, to be used in time-critical sections of the code.FInvoke pseudo-random computation with the generator kept in the state.NGets a random generator from the arguments or, if not present, generates one.aNoneM9Parse server debug parameters from commandline arguments.bNone M The cache of FOV information for a level, such as sight, smell and light radiuses for each actor and bitmaps of clear and lit positions. qAll positions lit by dynamic lights on a level. Shared by all factions. The list may contain (many) repetitions. pVisually reachable positions (light passes through them to the actor). The list may contain (many) repetitions. *Calculate faction's perception of a level.GCalculate faction's perception of a level based on the lit tiles cache. "Calculate perception of a faction..Calculate the perception of the whole dungeon. bCompute positions visible (reachable and seen) by the party. A position can be directly lit by an ambient shine or by a weak, portable light source, e.g,, carried by an actor. A reachable and lit position is visible. Additionally, positions directly adjacent to an actor are assumed to be visible to him (through sound, touch, noctovision, whatever). yCompute positions reachable by the actor. Reachable are all fields on a visually unblocked path from the actor position. Compute all dynamically lit positions on a level, whether lit by actors or 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).)Compute all lit positions in the dungeon. 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 non-clear points scanning modescanning radiusposition of the spectator                     cNoneM-Mapping over actor's items from a give store.      dNone EMUpdate the cached perception for the selected level, for a faction. The assumption is the level, and only the level, has changed since the previous perception calculation. 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. 7Create a projectile actor containing the given missile..Projectile has no organs except for the trunk. ! " #$-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 %&'() !"#$%&'() !"#%&$'() ! " #$ %&'()eNoneM *+ ,- *+,-*+,-  *+ ,- fNone M.>The server monad with the ability to communicate with clients.4GConnection information for all factions, indexed by faction identifier.5cConnections to the human-controlled client of a faction and to the AI client for the same faction.6:Connection channel between the server and a single client.BUpdate connections to the new definition of factions. Connect to clients in old or newly spawned threads that read and write directly to the channels../0123456789 :;<=>?@AB./0123456789:;<=>?@AB67894./0123:;<=>?@AB5./0123456789 :;<=>?@ABgNone 246BMC"Client state transformation monad. current global state current client state "this client connection information connection to the save thread #UI setup data, empty for AI clientsDVInit the client, then run an action, with a given session, state and history, in the IO monad. GThe game-state semantics of atomic commands as computed on the client.C D CDDC C  D hNone BME"Server state transformation monad. current global state current server state $client-server connection information connection to the save thread 5Send an atomic action to all clients that can see it.FRun an action in the IO monad, with undefined state. GThe game-state semantics of atomic commands as computed on the server.E F EFFE E  F iNoneMGfSapwn, possibly, a monster according to the level's actor groups. We assume heroes are never spawned.J)Advance the move time for the given actorKCheck if the given actor is dominated and update his calm. We don't update calm once per game turn (even though it would make fast actors less overpowered), beucase the effects of close enemies would sometimes manifest only after a couple of player turns (or perhaps never at all, if the player and enemy move away before that moment). A side effect is that under peaceful circumstances, non-max calm causes a consistent Calm regeneration UI indicator to be displayed each turn (not every few turns).GH I JKLGHIJKLGHIJKLGH I JKLjNoneMP}Spawn actors of any specified faction, friendly or not. To be used for initial dungeon population and for the summon effect. [Create a new monster on the level, at a given position and with a given actor kind and HP. DCreate a new hero on the current level, close to the given position. Find starting postions for all factions. Try to make them distant from each other. Place as many of the initial factions, as possible, over stairs and escapes.R/Apply debug options that don't need a new game. MN O P QRMNOPQRONMPRQ MN O P QRkNone EM 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. 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 his equiment with the given symbol (not just a random single item, or cluttering equipment with rubbish would be beneficial).XDrop 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). NShend 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).(STUV W X STUVWXSTUVXW(STUV W X lNoneMY%Continue or exit or restart the game. Drop all actor's items.YZ YZYZYZ mNone !"M [gThe semantics of server commands. The resulting actor id is of the actor that carried out the request.\hThe semantics of server commands. The resulting actor id is of the actor that carried out the request. Nothing! means the command took no time. Add a smell trace for the actor to the level. For now, only heroes leave smell. If smell already there and the actor can smell, remove smell.]]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. Note that if serverTile /= freshClientTile, freshClientTile should not be alterable (but  serverTile may be).  Do nothing.Something is sometimes done in uv. APerform the effect specified for the tile in case it's triggered.[\ ] -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      [\][\][\ ]       nNone !"M^\Start a game session, including the clients, and then loop, communicating with the clients. 9Trigger periodic items for all actors on the given level. Perform moves for individual actors, as long as there are actors with the next move time less or equal to the end of current cut-off. |Save game on server and all clients. Clients are pinged first, which greatly reduced the chance of saves being out of sync. "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.^ game contentserver debug parametersthe code to run for UI clientsthe code to run for AI clients   ^^^   wNoneM^^ xyz{|}~~                                               !"#$%&'()*+,-./01234567889:;<=>?@ABCDEFGHIJKLMMNOPQRSTUVWXTUVYZ[[\]^^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@A1BCDEFGGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}}~@     !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!""""""""""""""""""""""""""""""""""""o" " " " " " """"""""""""""####### #!#"#"###$#%#&#'#(#)#*#+#,#-$.$/$0$1$2$3$3$4$5$6$7$8$9$:$;$;$<$=$>$?$@$@$A$B$C$D$E$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&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*0*0+0,0-0.0/000102030405060708090:0;0<0=0>0?0@0A0B0C0D0E0F0G0H0I0J0K0L0M0N0O0P0Q1R1S1T1T1U1U1V1W1X1Y1Z2[2\2\2]2^2_2`2a2b2c2d2e2f3g3g3h3i3j3k3l4m4m4n4o4p4q4r4s4t4u5v5w5x5y5z5{5|5}5~55555555555666666666666666666666666666666666666666666666667777777778888888888888899:::::::::;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; ; ;;;;;;;;;;;;;;;;;;; <!<!<"<#<$=%=%=&='=(=)=*=+=,=-=.=/=0=1>2>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?{?;?H?|?}?~@@@@@@AAAAAAAAAAAAAAAAAABCCCCCCCCCDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFFFFFFFFGGGGHHHHHHHHHHHHHHHHHHHHHHHHHHHHH H H H H HHHHHHHHHHHHHHHHHHHH H!H"H#H$H%H&H'H(H)H*H+I,I-I.I/I0I1I2I3I4I5I6I7I8I9J:J;J<J=J>J?J@JAJBJCJDJEJFJGJHJIJJJKJLJMJNJOKPKQKRKSKTKUKVKWKXKYKZK[L\M]M^N_O`OaObOcPdPePfPgQhQiQQjQjQkQlQQmQnQoQpQqQrQsQtQuQvQwQxQyQzQ{Q|Q}Q~QQQQQRSSSSSSSSSSTTTTTTTTTTUUUUUUUUUUUUUUUUUUUVVVVVVVVVVVVVVVVVVVVVVVVVVVVWXXXXXXXXXXXXXXXXXYZZ[[\\\]]^^___________________________________________ __ __ __ _ ________````````````` `!`"`#`$`%`&`'`(`)``*atb+b,b,b-b.b.b/b0b1b2c3c4c5c6c7c8c9c:c;d<d=d>d,d?d@dAdBdCdDdEdFdGdHdIeJeKeLeMfNfOfPfQfRffSfTfUfUfVfWfXfYfZf[f\f]f^f_f`gagbhchdieifigihiiijjkjljmjnjojpkqkrksktkukvlwlxmymzm{n|}~ooooooooooooo                                                     x{}x      !'"#$%&'()*+,-./0123456789:1+ ; < = > ? @ A"B"C"D"E"F"G"H#+#I#J$H$J$K$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+kpplpmpnpoppppqprpsppptpupvpwpxpypzp{p|pp p}p~ppppppppppppppppppp,,,,.n..////////////"/#///00111122222235555555555v5556666668888888888888899::::;;;;==????AAAAABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB B B B D D E E K L L L L L L L L L L L L L L L L L L L L LqL L L L L !L "P #P $P %P &P 'P (Q )Q *Q +Q ,S -S .U /U 0U 1U 2U 3U 3U 4U 5U 6U 7U 8U 9U :U ;U <U =U >U ?U @U AU BU CU DU EV FV GV HV IV JV KW LW MW NX OX PX QX RX SX TX UX VX WX X XX YX ZX [X \Y ]Y ^Z _Z `Z aZ bZ cZ dZ eZ f[ g[ h[ i[ j[ k[ l[ m[ n[ o[ p[ q[ r[ s[ t[ u[ v[ w] x^ y_ z_ {_ |_ }_ ~b b b b b b c c d d d d pd e e e e e e e e e e e e f f f f g g g g g g gag g g g g g g g g h h h h h h hch h h h h h h i i j j j j j j j k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k l 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 LambdaHack-0.4.101.0Game.LambdaHack.Common.Msg!Game.LambdaHack.Server.Fov.Common!Game.LambdaHack.Server.Fov.ShadowGame.LambdaHack.Common.ThreadGame.LambdaHack.Common.LQueueGame.LambdaHack.Common.FileGame.LambdaHack.Common.AbilityGame.LambdaHack.Common.PointGame.LambdaHack.Common.Vector!Game.LambdaHack.Common.PointArrayGame.LambdaHack.Client.Bfs&Game.LambdaHack.Server.DungeonGen.AreaGame.LambdaHack.Common.MiscGame.LambdaHack.Common.Time Game.LambdaHack.Content.RuleKind!Game.LambdaHack.Common.ContentDef"Game.LambdaHack.Server.Fov.Digital%Game.LambdaHack.Server.Fov.PermissiveGame.LambdaHack.Common.Color Game.LambdaHack.Common.Frequency"Game.LambdaHack.Client.AI.StrategyGame.LambdaHack.Common.DiceGame.LambdaHack.Common.Random)Game.LambdaHack.Server.DungeonGen.AreaRndGame.LambdaHack.Client.KeyGame.LambdaHack.Common.Save#Game.LambdaHack.Client.UI.AnimationGame.LambdaHack.Common.Flavour Game.LambdaHack.Content.ItemKind Game.LambdaHack.Content.TileKind!Game.LambdaHack.Content.PlaceKind(Game.LambdaHack.Common.EffectDescription Game.LambdaHack.Content.CaveKind Game.LambdaHack.Content.ModeKindGame.LambdaHack.Common.KindGame.LambdaHack.Common.Item$Game.LambdaHack.Common.ItemStrongestGame.LambdaHack.Common.Tile&Game.LambdaHack.Common.ItemDescriptionGame.LambdaHack.Server.ItemRevGame.LambdaHack.Common.ActorGame.LambdaHack.Common.Faction$Game.LambdaHack.Common.ClientOptions&Game.LambdaHack.Client.UI.Frontend.Std)Game.LambdaHack.Client.UI.Frontend.Chosen"Game.LambdaHack.Client.UI.Frontend Game.LambdaHack.Common.HighScoreGame.LambdaHack.Common.Level!Game.LambdaHack.Common.Perception'Game.LambdaHack.Server.DungeonGen.Place&Game.LambdaHack.Server.DungeonGen.Cave!Game.LambdaHack.Server.DungeonGenGame.LambdaHack.Common.State!Game.LambdaHack.Common.ActorState%Game.LambdaHack.Common.MonadStateRead&Game.LambdaHack.Atomic.MonadStateWrite%Game.LambdaHack.Client.AI.PreferencesGame.LambdaHack.Client.ItemSlot"Game.LambdaHack.Client.UI.HumanCmd)Game.LambdaHack.Client.UI.Content.KeyKind Game.LambdaHack.Client.UI.Config%Game.LambdaHack.Client.UI.KeyBindings Game.LambdaHack.Atomic.CmdAtomic"Game.LambdaHack.Atomic.MonadAtomic$Game.LambdaHack.Atomic.PosAtomicRead(Game.LambdaHack.Atomic.HandleAtomicWriteGame.LambdaHack.Common.Response+Game.LambdaHack.Atomic.BroadcastAtomicWriteGame.LambdaHack.Client.State"Game.LambdaHack.Client.MonadClient%Game.LambdaHack.Client.ProtocolClientGame.LambdaHack.Common.Request#Game.LambdaHack.Client.CommonClient)Game.LambdaHack.Client.AI.ConditionClient Game.LambdaHack.Client.BfsClient-Game.LambdaHack.Client.AI.HandleAbilityClient*Game.LambdaHack.Client.AI.PickTargetClient)Game.LambdaHack.Client.AI.PickActorClientGame.LambdaHack.Client.AI$Game.LambdaHack.Client.UI.DrawClient'Game.LambdaHack.Client.UI.MonadClientUI/Game.LambdaHack.Client.UI.StartupFrontendClient&Game.LambdaHack.Client.UI.WidgetClient#Game.LambdaHack.Client.UI.MsgClient)Game.LambdaHack.Client.UI.InventoryClient0Game.LambdaHack.Client.UI.HandleHumanLocalClient#Game.LambdaHack.Client.UI.RunClient1Game.LambdaHack.Client.UI.HandleHumanGlobalClient+Game.LambdaHack.Client.UI.HandleHumanClient)Game.LambdaHack.Client.HandleAtomicClient-Game.LambdaHack.Client.UI.DisplayAtomicClientGame.LambdaHack.Client.UI+Game.LambdaHack.Client.HandleResponseClient!Game.LambdaHack.Client.LoopClientGame.LambdaHack.Server.State"Game.LambdaHack.Server.MonadServer"Game.LambdaHack.Server.CommandlineGame.LambdaHack.Server.Fov!Game.LambdaHack.Server.ItemServer#Game.LambdaHack.Server.CommonServer"Game.LambdaHack.Server.DebugServer%Game.LambdaHack.Server.ProtocolServer6Game.LambdaHack.SampleImplementation.SampleMonadClient6Game.LambdaHack.SampleImplementation.SampleMonadServer%Game.LambdaHack.Server.PeriodicServer"Game.LambdaHack.Server.StartServer)Game.LambdaHack.Server.HandleEffectServer Game.LambdaHack.Server.EndServer*Game.LambdaHack.Server.HandleRequestServer!Game.LambdaHack.Server.LoopServerPaths_LambdaHack&Game.LambdaHack.Client.UI.Frontend.GtkGame.LambdaHack.AtomicGame.LambdaHack.ClientServer debugArgs LoopActionsetBWaitGame.LambdaHack.Serverbase Data.Monoid<> EdgeIntervalEdge ConvexHullLineBumpBbxbyProgressDistancemaximalsteeperaddHullIntervalSBumpscan forkChildwaitForChildrenLQueue newLQueue nullLQueue lengthLQueue tryReadLQueue writeLQueue trimLQueuedropStartLQueue lastLQueue toListLQueue encodeEOFstrictDecodeEOF tryCreateDirtryCopyDataFiles appDataDirSkillsAbility AbTriggerAbApply AbProject AbMoveItemAbWaitAbAlter AbDisplaceAbMeleeAbMove zeroSkills unitSkills addSkills scaleSkillsPointpxpyYX dummyPointmaxLevelDimExponent chessDist euclidDistSqadjacentinsideblafromTo RadianAngleVectorvxvyisUnit isDiagonalnegeuclidDistSqVectorchessDistVectormoves compassText movesCardinal movesDiagonalvicinityvicinityCardinalshift shiftBoundedtrajectoryToPathtrajectoryToPathBounded vectorToFrompathToTrajectoryrotatetowardsArray!// unsafeUpdateA replicateA replicateMA generateA generateMAsizeAfoldlAifoldlAmapAimapA unsafeSetAsafeSetA mapWithKeyMA minIndexA minLastIndexA minIndexesA maxIndexA maxLastIndexAforceA MoveLegal MoveToUnknown MoveToOpen MoveBlocked BfsDistance minKnownBfsapartBfsfillBfs findPathBfs accessBfsAreatoAreafromArea trivialAreagridshrinkTacticTPatrolTRoamTExploreTFollowTBlockActorIdAbsDepthLevelId FactionIdItemDialogModeMStatsMOwnedMStoreCStoreCShaCInvCEqpCOrganCGround ContainerCTrunkCActorCEmbedCFloorRarityFreqs GroupNameserverSaveNamenormalLevelBounddivUp toGroupNamevalidateRaritybreturnisRightSpeedDeltaTimetimeZero timeEpsilontimeCliptimeTurnabsoluteTimeAdd timeShifttimeFit timeFitUptimeDeltaReverseabsoluteTimeNegatetimeDeltaToFromtimeDeltaScale timeDeltaDivtimeDeltaToDigittoSpeed fromSpeed speedZero speedNormal speedScalespeedAdd speedNegate ticksPerMeterspeedFromWeightrangeFromSpeedrangeFromSpeedAndLingerFovModeDigital PermissiveShadowRuleKindrsymbolrnamerfreq raccessibleraccessibleDoorrtitlerpathsDataFile rpathsVersion rcfgUIName rcfgUIDefault rmainMenuArtrfirstDeathEndsrfovModerwriteSaveClipsrleadLevelClips rscoresFile rsavePrefixrnearbyvalidateSingleRuleKindvalidateAllRuleKind ContentDef getSymbolgetNamegetFreqvalidateSingle validateAllcontentdlinedsteeper intersect _debugSteeper _debugLine debugSteeper debugLineAttrCharacAttracCharAttrfgbgColorBrWhiteBrCyan BrMagentaBrBlueBrYellowBrGreenBrRedBrBlackWhiteCyanMagentaBlueBrownGreenRedBlackdefBGdefFGdefAttrisBrightlegalBGdarkCol brightColstdCol colorToRGB Slideshow slideshowOverlayoverlay ScreenLineHistoryReportMsg<+>tshowtoWidth makePhrase makeSentencemoreMsgendMsgyesnoMsg truncateMsg emptyReport nullReportsingletonReportaddMsg prependMsg splitReport renderReport findInReportlastMsgOfReport splitText emptyHistorysingletonHistory addReport lengthHistory renderHistory takeHistorylastReportOfHistory toScreenLine encodeLine encodeOverlay emptyOverlaytruncateToOverlay toOverlay splitOverlay toSlideshow Frequency runFrequency nameFrequency uniformFreqtoFreq scaleFreq renameFreqsetFreqnullFreqmaxFreqminFreqmeanFreqStrategy nullStrategy liftFrequency.|reject.=>only bestVariantrenameStrategyreturN mapStrategyMDiceXYDice diceConst diceLeveldiceMult SimpleDiceddsdl intToDice|*|maxDiceminDicemeanDice reduceDice maxDiceXY minDiceXY meanDiceXYChanceRndrandomRrandomoneOf frequencychancecastDice chanceDice castDiceXYCorridorxyInAreamkRoom mkVoidRoom connectGridrandomConnection connectPlacesKMkeymodifierpointerModifierAltControlShift NoModifierKeyUnknownRightButtonPressMiddleButtonPressLeftButtonPressCharKPHomeDeleteInsertBeginEndDownUpRightLeftPgDnPgUp BackSpaceBackTabTabSpaceReturnEsctoKMshowKeyshowKMescKMspaceKMreturnKMpgupKMpgdnKM leftButtonKM rightButtonKM dirAllKey handleDir moveBindingmkKM keyTranslateChanSave saveToChan wrapInSaves restoreGame delayPrintFrames Animation SingleFramesfLevelsfTopsfBottomsfBlank decodeLineoverlayOverlay renderAnim restrictAnim twirlSplashblockHit blockMiss deathBodyactorX swapPlacesmoveProjfadeoutFlavourzipPlainzipFancy zipLiquidstdFlavflavourToColor flavourToNamecolorToPlainNamecolorToFancyNamecolorToTeamNameEqpSlot EqpSlotWeaponEqpSlotAddLightEqpSlotAddSmellEqpSlotAddSightEqpSlotAddSkillsEqpSlotAddSpeedEqpSlotAddMaxCalmEqpSlotAddMaxHPEqpSlotAddArmorRangedEqpSlotAddHurtRangedEqpSlotAddArmorMeleeEqpSlotAddHurtMeleeEqpSlotTimeoutEqpSlotPeriodicFeaturePrecious Applicable IdentifiedToThrowDurableFragileThrowMod throwVelocity throwLingerAspectAddLightAddSmellAddSight AddSkillsAddSpeed AddMaxCalmAddMaxHPAddArmorRanged AddArmorMelee AddHurtRanged AddHurtMeleeTimeoutPeriodicUnique TimerDiceTimerActorTurn TimerGameTurn TimerNoneEffect Temporary RechargingOnSmashOneOf ApplyPerfume ActivateInvDropBestWeapon PullActor PushActor SendFlyingIdentifyPolyItemDropItem CreateItemTeleport InsertMoveParalyzeEscapeAscendSummon CallFriendImpressDominate OverfillCalm RefillCalm OverfillHPRefillHPExplodeBurnHurtNoEffectItemKindisymbolinameifreqiflavouricountirarityiverbHitiweightiaspectsieffectsifeatureidescikitslotName toVelocitytoLingertoOrganGameTurntoOrganActorTurn toOrganNonevalidateSingleItemKindvalidateAllItemKindTrailNoActorNoItem OftenActor OftenItem ImpenetrableSuspectDarkClearWalkableRevealAsHideAsChangeToCloseToOpenToCauseEmbedTileKindtsymboltnametfreqtcolortcolor2tfeaturevalidateSingleTileKindvalidateAllTileKindactionFeaturesFenceFNoneFGroundFFloorFWallCover CVerbatimCReflectCStretch CAlternate PlaceKindpsymbolpnamepfreqpraritypcoverpfenceptopLeft poverridevalidateSinglePlaceKindvalidateAllPlaceKind featureToSuffeffectToSuffixaspectToSuffixkindEffectToSuffixkindAspectToSuffixCaveKindcsymbolcnamecfreqcxsizecysizecgrid cminPlaceSize cmaxPlaceSize cdarkChance cnightChance cauxConnectscmaxVoid cminStairDist cdoorChance copenChancechidden cactorCoeff cactorFreqcitemNum citemFreq cplaceFreq cpassablecdefTile cdarkCorTile clitCorTile cfillerTilecouterFenceTileclegendDarkTileclegendLitTilevalidateSingleCaveKindvalidateAllCaveKind AutoLeader autoDungeon autoLevel LeaderModeLeaderUILeaderAI LeaderNullPlayerfnamefgroup fskillsOther fcanEscape fneverEmpty fhiCondPoly fhasNumbers fhasGenderftactic fentryLevelfinitialActors fleaderModefhasUI HiCondPoly HiSummand HiPolynomialHiIndeterminantHiLossHiKill HiSurvivalHiBlitzHiLootHiConstOutcomeRestartConquerCampingDefeatedKilledRoster rosterList rosterEnemy rosterAllyCavesModeKindmsymbolmnamemfreqmrostermcavesmdescvalidateSingleModeKindvalidateAllModeKindCOpscocavecoitemcomodecoplacecorulecotileOpsokind ouniqGroupopick ofoldrWithKey ofoldrGroupoboundsospeedupSpeedupId createOps stdRuleset ItemKnownItemDictItemBag ItemQuant ItemTimerItemjkindIxjlidjsymboljnamejflavourjfeaturejweightItemFullitemBaseitemK itemTimer itemDisco ItemDisco itemKindIditemKinditemAEDiscoveryEffectItemAspectEffectjaspectsjeffectsItemSeed DiscoveryKind ItemKindIxItemId itemNoDiscoitemNoAEseedToAspectsEffectsstrengthEffectstrengthOnSmashstrengthCreateOrganstrengthDropOrganstrengthEqpSlotstrengthToThrowcomputeTrajectoryitemTrajectory totalRangestrengthFromEqpSlotstrongestSlotNoFilter strongestSlotsumSlotNoFilter sumSkills unknownMelee allRechargingstripRecharging stripOnSmash TileSpeedup isClearTabisLitTab isWalkableTab isPassableTabisPassableNoSuspectTab isDoorTab isSuspectTabisChangeableTab SmellTime createTab accessTabkindHasFeature hasFeatureisClearisLit isWalkable isPassableisPassableNoSuspectisDoor isSuspect isChangeable isExplorable lookSimilarspeedupopenTocloseTo embedItems causeEffectsrevealAshideAs isOpenable isClosableisEscapeisStairascendTo partItemNpartItem textAllAE partItemWs partItemAWpartItemMediumAW partItemWownWitemDescviewItemItemRev FlavourMap UniqueSet ItemSeedDictDiscoveryKindRev serverDiscos buildItemnewItememptyFlavourMapdungeonFlavourMap ActorDictResDeltaresCurrentTurnresPreviousTurnActorbtrunkbsymbolbnamebpronounbcolorbtimebhpbhpDeltabcalm bcalmDeltabposboldposblidboldlidbfid bfidImpressed bfidOriginal btrajectoryborganbeqpbinvbwaitbproj deltaSerious deltaMildxMminusM minusTwoMoneMmonsterGenChance partActor partPronoun actorTemplatebspeedtimeShiftFromSpeedbracedwaitedLastTurn actorDying actorNewBornhpTooLowhpHuge calmEnough calmEnough10hpEnough hpEnough10 unoccupied smellTimeout checkAdjacent keySelected ppContainerppCStore ppCStoreIn verbCStoreTargetTVectorTPoint TEnemyPosTEnemyStatus stOutcomestDepth stNewGameDipl DiplomacyWarAllianceNeutralFactiongnamegcolorgplayergdiplgquitgleadergshagvictims FactionDict isHorrorFactnoRunWithMultiisAIFactautoDungeonLevelautomatePlayerisAtWarisAllieddifficultyBounddifficultyDefaultdifficultyCoeff DebugModeClisfont scolorIsBoldsmaxFpssnoDelaysdisableAutoYessnoAnim snewGameCli sbenchmarksdifficultyClissavePrefixCli sfrontendStd sfrontendNull sdbgMsgClidefDebugModeCliFrontendSessionsescMVar frontendNamestartupfdisplay fsyncFrames fpromptGetKey RawFrontendfescMVar fdebugCli chosenStartup stdStartup nullStartup ChanFrontend responseFrequestFFrontReq FrontFinish FrontAutoYes FrontSlides frontClear frontSlides frontFromTopFrontKeyfrontKMfrontFr FrontDelayFrontNormalFrame frontFramestartupF ScoreDict ScoreTable ScoreRecord showScoregetTable getRecordemptyregister highSlideshowLevelldepthlpriolfloorlembedltilelxsizelysizelsmellldesclstairlseenlclearltime lactorCoeff lactorFreqlitemNum litemFreqlsecretlhiddenlescapeSmellMapTileMap ItemFloor ActorPrioDungeonascendInBranchat checkAccesscheckDoorAccess accessibleaccessibleUnknown accessibleDir knownLsecret isSecretPoshideTilefindPos findPosTrymapLevelActors_mapDungeonActors_Pers FactionPers PerceptionPerceptionVisible totalVisible smellVisiblenullPeraddPerdiffPer TileMapEMPlaceqkindqareaqseenqlegendqFWallqFFloorqFGround placeCheck buildPlace buildFenceRndCavedkinddmapdplacesdnight buildCave FreshDungeon freshDungeonfreshTotalDepthconvertTileMaps placeStairs buildLevellevelFromCaveKind findGenerator dungeonGenStatedefStateGlobal emptyStatelocalFromGlobal updateDungeon updateDepth updateActorD updateItemDupdateFactionD updateTime updateCOpssdungeon stotalDepthsactorDsitemD sfactionDstimescopsshigh sgameModeIdfidActorNotProjAssocsfidActorNotProjListactorAssocsLvl actorAssocs actorListactorRegularAssocsLvlactorRegularAssocsactorRegularList getItemBody bagAssocs bagAssocsK posToActor posToActorsnearbyFreePointscalculateTotalmergeItemQuantsharedAllOwnedFidfindIid itemPrice tryFindHeroKwhereTo getActorBodygetCarriedAssocsgetCarriedIidCStoregetCBag getActorBaggetBodyActorBagmapActorItems_getActorAssocsmemActor getLocalTimeregenCalmDeltaactorInAmbient actorSkills dispEnemy fullAssocs itemToFull goesIntoInv goesIntoSha eqpOverfull storeFromClidFromCaidFromC hasChargestrongestMeleeisMelee isMeleeEqpMonadStateReadgetState getsStategetLevelnUIposOfAidfactionCanEscape factionLoots getGameModeMonadStateWrite modifyStateputState updatePrio updateFloor updateTile updateSmell updateLevel updateActor updateFactioninsertItemContainerinsertItemActordeleteItemContainerdeleteItemActoreffectToBenefittotalUsefulness ItemSlotsSlotChar slotPrefixslotChar slotRangeallSlots assignSlot slotLabelTriggerTriggerFeature AlterFeaturefeature ApplyItemverbobjectsymbolHumanCmdTgtPointerEnemyTgtPointerFloorCursorPointerEnemyCursorPointerFloorAcceptCancel CursorStair CursorItem CursorUnknownTgtClearEpsIncr TgtAscendTgtEnemyTgtFloor MoveCursorMacroMainMenuHelp MarkSuspect MarkSmell MarkVisionRecordRepeatSelectWithPointer StopIfTgtMode SelectNone SelectActor MemberBack MemberCycle PickLeaderGameDifficultyCycleAutomateGameSaveGameExit GameRestartContinueToCursorRunOnceToCursorMoveOnceToCursor RunOnceAhead TriggerTileAlterDirApplyProject DescribeItemMoveItemWaitRunMove CmdCategory CmdMinimalCmdDebug CmdInternalCmdMouseCmdMetaCmdAutoCmdTgtCmdItemCmdMoveCmdMenucategoryDescriptionnoRemoteHumanCmdcmdDescriptionKeyKindrhumanCommandsmacroLeftButtonPressmacroShiftLeftButtonPressConfigconfigCommandsconfigHeroNamesconfigVi configLaptop configFontconfigColorIsBoldconfigHistoryMax configMaxFps configNoAnimconfigRunStopMsgsmkConfigapplyConfigToDebugBindingbcmdMapbcmdListbrevMap stdBindingkeyHelp HitAtomicHitBlockHitClear SfxAtomic SfxActorStart SfxMsgAll SfxMsgFid SfxEffectSfxShun SfxTriggerSfxCheckSfxApplySfxCatch SfxProject SfxRecoil SfxStrike UpdAtomicUpdRecordHistory UpdMsgAll UpdWriteSave UpdKillExitUpdResumeServer UpdResumeUpdRestartServer UpdRestart UpdPerception UpdCoverSeedUpdDiscoverSeed UpdCoverKindUpdDiscoverKindUpdCover UpdDiscover UpdAgeGame UpdTimeItem UpdLoseSmell UpdSpotSmell UpdAlterSmell UpdLoseTile UpdSpotTileUpdLearnSecrets UpdSearchTile UpdAlterClear UpdAlterTile UpdRecordKillUpdAutoFactionUpdTacticFactionUpdDiplFactionUpdLeadFactionUpdQuitFaction UpdColorActor UpdTrajectoryUpdFidImpressedActor UpdRefillCalm UpdRefillHP UpdAgeActor UpdMoveItemUpdDisplaceActor UpdWaitActor UpdMoveActor UpdLoseItem UpdSpotItem UpdLoseActor UpdSpotActorUpdDestroyItem UpdCreateItemUpdDestroyActorUpdCreateActor CmdAtomic undoUpdAtomic undoSfxAtomic undoCmdAtomic MonadAtomic execAtomic execUpdAtomic execSfxAtomicbroadcastUpdAtomicbroadcastSfxAtomic PosAtomicPosNonePosAllPosSer PosFidAndSerPosFidPosSmellPosFidAndSightPosSight posUpdAtomic posSfxAtomicresetsFovCmdAtomicbreakUpdAtomicbreakSfxAtomic loudUpdAtomic seenAtomicCli seenAtomicSergeneralMoveItemhandleCmdAtomic ResponseUI RespPingUI RespQueryUIRespSfxAtomicUIRespUpdAtomicUI ResponseAI RespPingAI RespQueryAIRespUpdAtomicAIhandleAndBroadcastEscAI EscAIExited EscAIMenu EscAIStarted EscAINothing LastRecord RunParams runLeader runMembers runInitial runStopMsg runWaitingTgtMode tgtLevelIdPathEtc StateClientstgtModescursorsepsstargetD sexploredsbfsD sselectedsrunningsreportshistory sdisplayedsundo sdiscoKind sdiscoEffectsfpersrandomslastKM slastRecord slastPlay slastLost swaitTimes_sleader_ssidesquitsisAI smarkVision smarkSmell smarkSuspectscurDifficultysslots slastSlot slastStoresescAI sdebugClidefStateClientdefaultHistory updateTarget getTarget updateLeaderssidetoggleMarkVisiontoggleMarkSmelltoggleMarkSuspect MonadClient getClient getsClient modifyClient putClientliftIOsaveChanClient debugPrint saveClientsaveNameremoveServerSave rndToActionMonadClientWriteRequest sendRequestMonadClientReadResponsereceiveResponse ReqFailureNoChangeLvlLeaderNoChangeDunLeaderTriggerNothingProjectOutOfReachProjectFragileProjectNotRangedProjectUnskilledProjectBlockActorProjectBlockTerrainProjectAimOnselfNotCalmPrecious ItemNotCalm ItemNothing ApplyChargingApplyOutOfReach ApplyReadApplyUnskilled EqpOverfull AlterNothingAlterBlockItemAlterBlockActor AlterDistantDisplaceSupportedDisplaceImmobileDisplaceBraced DisplaceDyingDisplaceProjectilesDisplaceAccessDisplaceDistant MeleeDistant MeleeSelf MoveNothing RequestTimed ReqTriggerReqApply ReqProject ReqMoveItemsReqWaitReqAlter ReqDisplaceReqMeleeReqMoveRequestAnyAbility RequestUI ReqUIPong ReqUIAutomate ReqUITactic ReqUIGameSave ReqUIGameExitReqUIGameRestart ReqUILeader ReqUITimed RequestAI ReqAIPong ReqAILeader ReqAITimedanyToUIimpossibleReqFailureshowReqFailurepermittedPreciouspermittedProjectpermittedApply getPerFidpartActorLeaderpartPronounLeader partAidLeader aidTgtToPos aidTgtAimsmakeLineactorSkillsClientupdateItemSlotfullAssocsClientactiveItemsClientitemToFullClientpickWeaponClientsumOrganEqpClientcondTgtEnemyPresentMcondTgtEnemyRememberedMcondTgtEnemyAdjFriendMcondTgtNonmovingMcondAnyFoeAdjM condHpTooLowMcondOnTriggerableMthreatDistListcondBlocksFriendsMcondFloorWeaponMcondNoEqpWeaponMcondEnoughGearMcondCanProjectMbenAvailableItemshinderscondNotCalmEnoughMcondDesirableFloorItemMbenGroundItems desirableItem condMeleeBadMcondLightBetraysMfleeList invalidateBfsgetCacheBfsAndPath getCacheBfsaccessCacheBfs furthestKnownclosestUnknown closestSmellclosestSuspectclosestTriggersunexploredDepth closestItems closestFoesactionStrategytargetStrategy createPathpickActorToMovequeryAIpongAI refreshTarget pickAction ColorModeColorBW ColorFulldraw MonadClientUI getsSession SessionUIschanFsbindingsconfig promptGetKeygetKeyOverlayCommandgetInitConfirms displayFrame displayDelaydisplayActorStart drawOverlay stopPlayBack askConfig askBinding syncFramessetFrontAutoYestryTakeMVarSescMVarscoreToSlideshow getLeaderUI getArenaUI viewedLeveltargetDescLeadertargetDescCursorleaderTgtToPos leaderTgtAims cursorToPos srtFrontend displayMore displayYesNodisplayChoiceUI displayPushdescribeMainKeyspromptToSlideshowoverlayToSlideshowoverlayToBlankSlideshowanimate fadeOutOrIn SlideOrCmdmsgAddmsgReset recordHistoryfailWith failSlidesfailSerfailMsglookAt itemOverlay SuitabilitySuitsSomething SuitsNothingSuitsEverything getGroupItem getAnyItems getStoreItem memberCycle memberBack pickLeadercursorPointerFloorcursorPointerEnemymoveCursorHuman tgtFloorHuman tgtEnemyHuman epsIncrHuman tgtClearHumandoLook describeItemCgameDifficultyCyclepickLeaderHumanmemberCycleHumanmemberBackHumanselectActorHumanselectNoneHuman clearHumanstopIfTgtModeHumanselectWithPointer repeatHuman recordHuman historyHumanmarkVisionHumanmarkSmellHumanmarkSuspectHuman helpHuman mainMenuHuman macroHumantgtAscendHumancursorUnknownHumancursorItemHumancursorStairHuman cancelHuman acceptHumancursorPointerFloorHumancursorPointerEnemyHumantgtPointerFloorHumantgtPointerEnemyHuman continueRun moveRunHuman waitHuman moveItemHumandescribeItemHuman projectHuman applyHuman alterDirHumantriggerTileHumanrunOnceAheadHumanmoveOnceToCursorHumanrunOnceToCursorHumancontinueToCursorHumangameRestartHuman gameExitHuman gameSaveHuman tacticHuman automateHuman cmdHumanSemcmdAtomicFilterClicmdAtomicSemClidisplayRespUpdAtomicUIdisplayRespSfxAtomicUIqueryUI humanCommandpongUIhandleResponseAIhandleResponseUIloopAIloopUIRNGsdungeonRandomGeneratorstartingRandomGenerator DebugModeSersknowMap sknowEventssniffInsniffOut sallClear sgameMode sautomateAllskeepAutomated sstopAfter sdungeonRngsmainRngsfovMode snewGameSersdifficultySer sdumpInitRngsssavePrefixSer sdbgMsgSer FovCache3fovSightfovSmellfovLight StateServer sdiscoKindRev suniqueSet sitemSeedDsitemRev sItemFovCachesflavour sacounter sicounter snumSpawned sprocessedspersrngs swriteSavesstartsgstartsallTime sheroNames sdebugSer sdebugNxtemptyFovCache3emptyStateServerdefDebugModeSer MonadServer getServer getsServer modifyServer putServersaveChanServerdebugPossiblyPrintdebugPossiblyPrintAndExit serverPrint saveServerdumpRngs restoreScore registerScoreresetSessionStartresetGameStartelapsedSessionTimeGT tellAllClipPStellGameClipPS tryRestore speedupCOps getSetGenPersLitPerceptionDynamicLit pdynamicLitPerceptionReachable preachablefidLidPerceptiondungeonPerception litInDungeon registerItemrollItemrollAndRegisterItemplaceItemsInDungeonembedItemsInDungeonfullAssocsServeractiveItemsServeritemToFullServermapActorCStore_ execFailureresetFidPerceptionresetLitInDungeon revealItems moveStores deduceQuits deduceKilled electLeader projectFailaddActor addActorIidpickWeaponServersumOrganEqpServeractorSkillsServerdebugResponseAIdebugResponseUIdebugRequestAIdebugRequestUIMonadServerReadRequestgetDictgetsDict modifyDictputDictConnServerDictConnServerFaction ChanServer responseSrequestS sendUpdateAI sendQueryAI sendPingAI sendUpdateUI sendQueryUI sendPingUIkillAllClientschildrenServer updateConnCliImplementation executorCliSerImplementation executorSer spawnMonster addAnyActordominateFidSfx advanceTime managePerTurnleadLevelSwitchinitPer reinitGame gameReset recruitActors initDebug applyDebug applyItemitemEffectAndDestroyeffectAndDestroyitemEffectCausearmorHurtBonusdropCStoreItem endOrLoopdieSerhandleRequestAIhandleRequestUIreqMoveloopSerdownBiasupBiascatchIOversionbindirlibdirdatadir libexecdir sysconfdir getBinDir getLibDir getDataDir getLibexecDir getSysconfDirgetDataFileName encodeDatastrictReadSerializedstrictDecodeData$fHashableAbility$fBinaryAbility $fShowAbility maxLevelDimblaXY balancedWord fromEnumPoint toEnumPoint $fEnumPoint $fNFDataPoint $fBinaryPoint $fShowPoint maxVectorDim normalizefromEnumVector toEnumVector moveTextsvicinityUnsafenormalizeVector$fNFDataVector $fEnumVector$fBinaryVectoraxsizeaysizeavectorcnvpindexpunindex $fBinaryArray $fShowArray $fBinaryArea$fNFDataPolarity$fNFDataPerson $fNFDataPart$fHashableEnumMap$fAdjustableEnumMap$fLookupEnumMap$fIndexableEnumMap$fTraversableWithKeyEnumMap$fFoldableWithKeyEnumMap$fKeyedEnumMap$fZipWithKeyEnumMap $fZipEnumMapTFCo:R:KeyEnumMap$fBinaryHashMap$fBinaryEnumSet$fBinaryEnumMap$fHashableTactic$fBinaryTactic $fShowTactic$fNFDataItemDialogMode$fNFDataCStore$fHashableCStore$fBinaryCStore$fBinaryContainer$fNFDataGroupName$fShowGroupName$fIsStringGroupName _timeTick turnsInSecond_ticksInSecondsInMs minimalSpeed $fShowSpeed$fShowRuleKindGHC.ShowShow$fBinaryFovMode _olorToRGB $fBinaryColor$fEnumAttrChar $fEnumAttr$fHashableColorsplitReportListrenderRepetition splitText'splitReportForHistory$fMonoidSlideshow$fNFDataFrequency$fBinaryFrequency$fHashableFrequency$fAlternativeFrequency$fMonadPlusFrequency$fApplicativeFrequency$fFunctorFrequency$fMonadFrequencyGHC.Basereturn$fMonadStrategy runStrategynormalizeStrategy$fAlternativeStrategy$fMonadPlusStrategy$fApplicativeStrategy$fFunctorStrategynormalizeSimple liftANameliftA2AdditiveName dieSimple zdieSimpledieLevelSimplezdieLevelSimpleaffectBothDice_z_zl$fBinaryDiceXY$fHashableDiceXY $fNumDice $fNFDataDice $fBinaryDice$fHashableDice $fShowDice$fNumFrequencyrollFreqHV sortPoint mkCorridorVertHoriz connectGrid' dirKeypadKeydirKeypadShiftChardirKeypadShiftKey dirLaptopKeydirLaptopShiftKey dirViChardirViKey dirViShiftKeydirMoveNoModifierdirRunNoModifier dirRunControl $fBinaryKM$fShowKM $fNFDataKM$fNFDataModifier$fBinaryModifier $fNFDataKey $fBinaryKeyloopSaveblankcSym mzipPairs mzipTriples$fBinarySingleFrame fancyName baseColorcolorToLiquidName FancyNameLiquidFancyPlain$fBinaryFlavour$fHashableFlavour$fBinaryFancyName$fHashableFancyName$fBinaryEqpSlot$fBinaryFeature$fBinaryThrowMod$fBinaryAspect$fBinaryTimerDice$fBinaryEffect$fHashableEqpSlot$fHashableFeature$fHashableThrowMod$fHashableAspect$fHashableTimerDice$fHashableEffect$fNFDataThrowMod$fNFDataTimerDice$fShowTimerDice$fNFDataEffect$fNFDataFeature effectToSuff tmodToSuffrawAspectToSuff affixBonus wrapInParenswrapInChevrons affixDicevalidateSingleRostervalidateSinglePlayer$fBinaryAutoLeader$fBinaryLeaderMode$fBinaryPlayer$fBinaryHiIndeterminant$fBinaryOutcome$fEqCOps $fShowCOps $fBinaryItem$fHashableItem$fHashableItemAspectEffect$fBinaryItemAspectEffectstrengthAspectstrengthAspectMaybestrengthFeaturestrengthPeriodicstrengthTimeoutstrengthAddMaxHPstrengthAddMaxCalmstrengthAddSpeedstrengthAllAddSkillsstrengthAddSkillsstrengthAddHurtMeleestrengthAddHurtRangedstrengthAddArmorMeleestrengthAddArmorRangedstrengthAddSightstrengthAddSmellstrengthAddLight strengthMelee unknownAspectisPassableKindTFCo:R:SpeedupTileKindrollFlavourMap$fBinaryResDelta $fBinaryActor$fBinaryTarget$fBinaryStatus$fBinaryDiplomacy$fBinaryFaction$fBinaryDebugModeClisviewstagsschanKey sframeState slastFullfpushedfshownonQueuerunGtkoutputmaxPollsaddTimediffTimepollFramesWait pollFramesAct pushFrametrimFrameStatedeadKeymodifierTranslateGtkFramegfChargfAttr FrameStateFPushed dummyFramesetTo picoInMicro microInSec defaultMaxFps evalFramedisplayAllFramesSyncdoAttr extraAttr nextEventgetConfirmGeneric loopFrontendpointsnegTimedatestatus difficulty gplayerName ourVictims theirVictims insertPos tshowableshowCloseScores$fShowScoreTable$fBinaryScoreRecord$fBinaryClockTimeassertSparseItems $fBinaryLevelptotalpsmellpvisible$fBinaryPerception interiorAreaolegend buildFence tilePlace ooverride $fBinaryPlace digCorridors _sdungeon _stotalDepth_sactorD_sitemD _sfactionD_stime_scops_shigh _sgameModeId unknownLevelunknownTileMap $fBinaryState tryFindActor sharedInv sharedEqpsharedAllOwnedgetActorAssocsKstrMelee updateEmbedinsertItemFloorinsertItemEmbedinsertItemBody insertItemEqp insertItemInv insertItemShadeleteItemFloordeleteItemEmbeddeleteItemBody deleteItemEqp deleteItemInv deleteItemSha rmFromBagaspectToBenefit organBenefit allZeroSlots$fEnumSlotChar$fBinarySlotChar $fOrdSlotChartriggerDescription$fNFDataTrigger$fNFDataHumanCmd$fNFDataCmdCategory parseConfig$fNFDataConfig$fBinaryHitAtomic$fBinarySfxAtomic$fBinaryUpdAtomic$fBinaryCmdAtomic posProjBodysingleFidAndAid singleAidsingleContainercontainerMoveItemupdCreateActorupdDestroyActor updCreateItemupdDestroyItem updRecordKill updAlterTile updAgeGamehandleUpdAtomic itemsMatch updMoveActor updWaitActorupdDisplaceActor updMoveItem updAgeActor updRefillHP updRefillCalmupdFidImpressedActor updTrajectory updColorActorupdQuitFactionupdLeadFactionupdDiplFactionupdAutoFactionupdTacticFaction updAlterClearupdLearnSecrets updSpotTile updLoseTile updAlterSmell updSpotSmell updLoseSmell updTimeItemageLevel updRestartupdRestartServerupdResumeServerhandleCmdAtomicServeratomicRemember$fBinaryRunParams$fBinaryStateClientcondBFS waitBlockNowtrigger moveOrRunAidApplyItemGroup ApplyFirstAidApplyAllToAnytoAnypickup equipItemstoShare yieldUnneeded unEquipItemsgroupByEqpSlot bestByEqpSlotharmfulunneeded meleeBlockermeleeAny projectItemflee displaceFoedisplaceBlockerdisplaceTowardschase moveTowards inverseVideodrawArenaStatusdrawLeaderStatusdrawLeaderDamage drawSelecteddrawPlayerNamereadConnFrontendwriteConnFrontend drawOverlays targetDescgetYesNo msgPromptAIdefLabelgetFullgetItem_floorItemOverlay DefItemKeydefCond defActionItemDialogStateINoAll INoSuitableIAll ISuitableppItemDialogModeppItemDialogModeInppItemDialogModeFrom storeFromMode accessModeBag transition statsOverlaylegalWithUpdatedLeader runDefItemKey pickNumberpartyAfterLeader targetReject targetAccept endTargetingselectAidHumanmaxKendTargetingMsgcontinueRunDir tryTurning checkAndRunmeleeAid displaceAidmoveSearchAlterAid alterTile guessAlter triggerTile verifyTrigger guessTrigger projectChecktriggerSymbols alterFeaturestriggerFeatures goToCursormultiActorGoTo cmdAction addNoSlides createActor destroyActor perception discoverKind coverKind discoverSeed coverSeedkillExit actorVerbMUupdateItemSlotSide lookAtMove aidVerbMU itemVerbMU itemAidVerbMUmsgDuplicateScrap createActorUIdestroyActorUIanyActorsAlive moveActordisplaceActorUI moveItemUI quitFactionUIdiscover setLastSlotstrike storeUndoinitCli $fBinaryRNGs$fBinaryDebugModeSer$fBinaryFovCache3$fBinaryStateServer $fShowRNGslevelPerceptionfactionPerceptionvisibleOnLevelreachableFromActor litByItemsfullscancreateLevelItem embedItem keepArenaFact addProjectilequitF projectBlaDebugAidlabelcmdlidtimeaidfaction debugShow debugPretty debugPlaindebugAid writeTQueueAI writeTQueueUI readTQueueAI readTQueueUIcliState cliClientcliDict cliToSave cliSession$fMonadAtomicCliImplementationrunCliImplementationCliState-$fMonadClientWriteRequestreqCliImplementation.$fMonadClientReadResponserespCliImplementation $fMonadClientUICliImplementation$fMonadClientCliImplementation"$fMonadStateWriteCliImplementation!$fMonadStateReadCliImplementationserState serServerserDict serToSavehandleAndBroadcastServer$fMonadAtomicSerImplementationrunSerImplementationSerState)$fMonadServerReadRequestSerImplementation$fMonadServerSerImplementation"$fMonadStateWriteSerImplementation!$fMonadStateReadSerImplementation rollSpawnPos dominateFid addMonsteraddHero findEntryPoss mapFromFuns lowercasecreateFactionspopulateDungeonitemEffectDisco effectSem effectEscapeeffectParalyzeeffectInsertMoveeffectTeleporteffectDropItemeffectSendFlyingeffectDropBestWeaponeffectActivateInv itemEffect effectHurt halveCalm effectBurn effectExplodeeffectRefillHPeffectRefillCalmeffectDominate effectImpresseffectCallFriend effectSummon effectAscend switchLevels1 switchLevels2effectCreateItemeffectPolyItemeffectIdentify identifyIidsendFlyingVectoreffectTransformEqpeffectApplyPerfume effectOneOfeffectRechargingeffectTemporary dropAllItemsaddSmellreqMelee reqDisplacereqAlterreqWait reqTriggerhandleRequestTimed switchLeader reqMoveItems reqMoveItemcomputeRndTimeout reqProjectreqApply triggerEffectreqGameRestart reqGameExit reqGameSave reqTactic reqAutomateapplyPeriodicLevel handleActors writeSaveAll setTrajectoryendClipgameExit restartGame