u\-      !"#$%&'()*+,-./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{|}~      !"#$%&'()*+ , - . / 0!1!2!3!4!5!6!7!8!9!:!;!<!=!>!?!@!A!B!C!D!E!F!G!H!I!J!K!L!M!N!O!P!Q!R!S!T!U!V!W!X!Y!Z![!\!]!^!_!`!a!b!c!d!e!f!g!h!i!j!k!l!m!n!o"p"q"r#s#t#u#v#w$x$y$z${$|$}$~$$$%%%%%%%%%%%%%%%%%%&&&&&&&&&''''''''''''''''''((((((((((((((((((((((((())))))))))))))))))))))))))))))))))***********************+++++++++ + + + + +,,,,,,,,---------. .!.".#.$.%.&.'.(.).*.+.,.-.../.0.1.2.3.4.5.6.7.8.9.:.;.<.=.>.?.@.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S/T/U/V/W/X/Y/Z/[/\/]/^/_/`/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/{/|0}0~0000000000001111111111111222222233333334444444444455555555555555555666666777777777777777777777777777777777777777788888888888999999999999::: : : : : ;;;;;;;;;;<<<<<<<<< <!<"<#<$<%<&<'<(<)<*=+=,=-=.=/=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@iAjAkAlAmAnAoApAqBrBsBtBuBvBwBxByBzB{B|B}B~BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBCCCCCCDDDDDDDDDDDDDDDDDDEFFFFFFFFFGHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH H H H H HHHHHHHHHIIIIIIIIII I!I"I#J$J%J&J'K(K)K*K+K,K-K.K/K0K1K2K3K4K5K6K7K8K9K:K;K<K=K>K?K@KAKBKCKDKEKFKGKHKIKJKKKLKMKNKOKPKQKRKSKTKUKVKWKXKYKZL[L\L]L^L_L`LaLbLcLdLeLfLgLhLiMjMkMlMmMnMoMpMqMrMsMtMuMvMwMxMyMzN{O|O}O~OOOOOOOOPQRRRRSSSSTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTUVVVVVVVVVVWWWWWWWWWXXYYYYYYYYZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ[[[[[[[[[[[[\]]^^___``aabccccc c c c c ccccccccccccccccccc c!c"c#c$c%c&c'c(c)c*c+c,c-c.c/c0c1c2c3c4c5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKeLfMfNfOfPgQgRgSgTgUgVgWgXhYhZh[h\h]h^h_h`hahbhchdhehfhgihiiijikjljmjnjojpjqjrjsjtjujvjwjxjyjzj{j|j}j~jklmmmmmnnnnnnoooooopppqqqrsv 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.    t Safe-InferredM  NoneMZSerialize, compress and save data. Note that LBS.writeFile opens the file in binary mode.;Serialize, compress and save data with an EOF marker. The OKn is used as an EOF marker to ensure any apparent problems with corrupted files are reported to the user ASAP.(Read and decompress the serialized data.&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. Terminate the program with an exception if the directory does not exist, but can't be created.!2Try to copy over data files, if not already there."mPersonal data directory for the game. Depends on the OS and the game, e.g., for LambdaHack under Linux it's ~/.LambdaHack/. !" !" !" !" Safe-Inferred 0M$DActor and faction abilities corresponding to client-server requests.#$%&'()*+,-./01#$%&'()*+,-./01$-,+*)('&%#./01 #$ -,+*)('&%./01NoneM 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.8|The maximum number of bits for level X and Y dimension (16). The value is chosen to support architectures with 32-bit Ints.Maximal supported level X and Y dimension. Not checked anywhere. The value is chosen to support architectures with 32-bit Ints.99The distance between two points in the chessboard metric.:.Squared euclidean distance between two points.;\Checks whether two points are adjacent on the map (horizontally, vertically or diagonally).<'Checks that a point belongs to an area.==Bresenham's line algorithm generalized to arbitrary starting eps (eps value of 0 gives the standard BLA). Skips the source point and goes through the second point to the edge of the level. GIves Nothing2 if the points are equal. The target is given as Point to permit aiming out of the level, e.g., to get uniform distributions of directions for explosions close to the edge of the level.=Bresenham's line algorithm generalized to arbitrary starting eps (epsn value of 0 gives the standard BLA). Includes the source point and goes through the target point to infinity.See  Bhttp://roguebasin.roguelikedevelopment.org/index.php/Digital_lines.>zA list of all points on a straight vertical or straight horizontal line between two points. Fails if no such line exists.23456789:;<=> 23456789:;<=> 76234589:;<=>23456789:;<=> None BM@2D 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.D8Tells if a vector has length 1 in the chessboard metric.EChecks 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.FReverse an arbirary vector.G/Squared euclidean distance between two vectors.HNThe lenght of a vector in the chessboard metric, where diagonal moves cost 1.ITVectors of all unit moves in the chessboard metric, clockwise, starting north-west.KHVectors of all cardinal direction unit moves, clockwise, starting north.LHVectors of all diagonal direction unit moves, clockwise, starting north.M=All (8 at most) closest neighbours of a point within an area.NHAll (4 at most) cardinal direction neighbours of a point within an area.OTranslate a point by a vector.PFTranslate a point by a vector, but only if the result fits in an area.Q1A list of points that a list of vectors leads to.RHA list of points that a list of vectors leads to, bounded by level size.S: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.T+A list of vectors between a list of points.URotate 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.V_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. ?@ABCDEFGHIJKLMlimit the search to this areaposition to find neighbours ofNlimit the search to this areaposition to find neighbours ofOPQRSTUV?@ABCDEFGHIJKLMNOPQRSTUV@ABCDEFHGIKLJMNOPQRST?UV?@ABCDEFGHIJKLMNOPQRSTUV NoneMWArrays indexed by Point.X Array lookup.Y5Construct an array updated with the association list.Z*Create an array from a replicated element.[2Create an array from a replicated monadic action.\(Create an array from a monadic function.]Content identifiers array size.^!Fold left strictly over an array._SFold left strictly over an array (function applied to each element and its index).`CMap over an array (function applied to each element and its index).a[Yield the point coordinates of a minimum element of the array. The array may not be empty.bbYield the point coordinates of the last minimum element of the array. The array may not be empty.ccYield the point coordinates of the first maximum element of the array. The array may not be empty.dbYield the point coordinates of the last maximum element of the array. The array may not be empty.WXYZ[\]^_`abcdWXYZ[\]^_`abcdWXYZ[\]^_`abcdWXYZ[\]^_`abcd None BMe3State of legality of moves between adjacent points.i6Weighted distance between points along shortest paths.jQThe minimal distance value assigned to paths that don't enter any unknown tiles.k<The distance value that denote no legal path between points.lFill out the given BFS array.mIFind 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.n>Access a BFS array and interpret the looked up distance value. efghijklis a move from known tile legalis a move from unknown legalstarting positioninitial array, with apartBfsarray with calculated distancesmn efghijklmn iehgfklmnjehgfijklmn NoneMo<The type of areas. The bottom left and the top right points.p/Checks if it's an area with at least one field.s`Divide uniformly a larger area into the given number of smaller areas overlapping at the edges.tDEnlarge (or shrink) the given area on all fours sides by the amount.opqrstopqrstopqrstopqrst None 0=BKM u/A unique identifier of an actor in the dungeon.vAbsolute 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.xAbstract level identifiers.y+A unique identifier of a faction in a game.Item container type.for bootstrapping actor bodies6For each group that the kind belongs to, denoted by a Textw name in the first component of a pair, the second component of a pair shows how common the kind is within the group.5What distance signifies that two actors are "nearby".@Level bounds. TODO: query terminal size instead and scroll view.Integer division, rounding up. breturn b a = [a | b](uvwxyz{|}~uvwxyz{|}~yxvwuz~}|{uvwxyz~}|{None -BMSpeed in meters per 1 million seconds (m/Ms). Actors at normal speed (2 m/s) take one time turn (0.5 s) to move one tile (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.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.# NoneM"Properties of a particular player.name of the player)name of faction(s) the player can control)whether the player is a spawn (score, AI),whether the player is a hero (score, AI, UI)%level where the initial members startnumber of initial membersRleaderless factions can't be controlled by a human or a user-supplied AI client is the faction under AI control?Idoes the faction have a UI client (for control or passive observation)/The specification of players for the game mode. players, both human and computerthe initial enmity matrixthe initial aliance matrixRequested cave groups for particular levels. The default is the "dng" group, which means a random choice from all caves that can randomly appear. The second component of the pair 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 descriptionNo specific possible problems for the content of this kind, so far, so the validation function always returns the empty list of offending kinds. NoneMField Of View scanning mode. digital FOVpermissive FOVrestrictive shadow casting2The 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 hold 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 groupsthe 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 backup is saved that often%flip AI/spawn leader level that oftenname of the scores filename of the savefile prefix$whether shared stashes are available&Validates the ASCII art format (TODO).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?Faction properties that are fixed for a given kind of factions.a symbolshort descriptionfrequency within groupsskills of the picked leaderskills of the other actorsNo specific possible problems for the content of this kind, so far, so the validation function always returns the empty list of offending kinds.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 and catch some offenders, if any$all the defined content of this typeNoneM)The choice of a fence type for the place.1skip the fence and fill all with the place proper+leave an empty floor space around the place'put a solid wall fence around the placeA method of filling the whole area (except for CVerbatim, which is just placed in the middle of the area), by transforming a given corner.7just build the given interior, without filling the area7tile separately and symmetrically quarters of the place6fill symmetrically 4 corners and stretch their borders8reflect every other corner, overlapping 1 row and columnDParameters for the generation of small areas within a dungeon level.a symbolshort descriptionfrequency within groupsrarity on given depths+how to fill whole place based on the corner,whether to fence the place with solid border(plan of the top-left corner of the place%legend override, ignoring tile symbolHFilter a list of kinds, passing through only the incorrect ones, if any.AVerify that the top-left corner map is rectangular and not empty. NoneM!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 0M 1Text 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 BM*A 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 boolean flag is set, the overlay is displayed over a blank screen, including the bottom lines.,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.0<The type of a set of messages to show at the screen at once.1The type of a single message.5WRe-exported English phrase creation functions, applied to default irregular word sets.6WRe-exported English phrase creation functions, applied to default irregular word sets.7'The "press something to see more" mark.8!The confirmation request message.9Add 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.BSplit 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.CEmpty history of reports.E)Construct a singleton history of reports.G<Render history as many lines of text, wrapping if necessary.H.Add a report to history, handling repetitions.I0Take the given prefix of reports from a history.QFSplit 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).R^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.1*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQR**+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQR*5612347890:;<=>?@A/CDEFHGIJ,-NOP*+QRLM.KB+*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQR2None ./0M SThe frequency distribution type. Not normalized (operations may or may not group the same elements and sum their frequencies).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).TLshort description for debug, etc.; keep it lazy, because it's rarely usedU"give acces to raw frequency valuesV(Uniform discrete frequency distribution.WRTakes a name and a list of frequencies and items into the frequency distribution.XLScale frequecy distribution, multiplying it by a positive integer constant.Y(Change the description of the frequency.ZSet frequency of an element.[,Test if the frequency distribution is empty.STUVWXYZ[\]^ STUVWXYZ[\]^STUVWXYZ[UT\]^STUVWXYZ[\]^None EM _LA strategy is a choice of (non-empty) frequency tables of possible actions.aUStrategy where only the actions from the given single frequency table can be picked.bTStrategy with the actions from both argument strategies, with original frequencies.c Strategy with no actions at all.d Conditionally accepted strategy.eStrategy with all actions not satisfying the predicate removed. The remaining actions keep their original relative frequency values.fcWhen better choices are towards the start of the list, this is the best frequency of the strategy.gAOverwrite the description of all frequencies within the strategy.hLike *, but pick a name of the single frequency.DStrategy is a monad. TODO: Can we write this as a monad transformer?_`abcdefghi _`abcdefghi _`abcdefghi_`abcdefghibdNone 024MjqDice for rolling a pair of integer parameters pertaining to, respectively, the X and Y cartesian 2D coordinates.lKDice 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 |*|.vkMaximal value of dice. The scaled part taken assuming maximum level. Assumes the frequencies are not null.wVMinimal value of dice. The scaled part ignored. Assumes the frequencies are not null.xhMean value of dice. The scaled part taken assuming average level. Assumes the frequencies are not null.zMaximal value of DiceXY.{Minimal value of DiceXY.|Mean value of DiceXY."jklmno     pqrstuvwxyz{|jklmnopqrstuvwxyz{|lmnomnoupqrstvwxyjkz{|jklmno     pqrstuvwxyz{|None -0M"eFeatures of item. Affect only the item in question, not the actor, and so not additive in any sense.JAI and UI flag: careful, can be precious; 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 hitting or applying$break even when not hitting an enemy!change to this group when altered@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 turnskAspects of items. Additive (starting at 0) for all items wielded by an actor and affect the actor (except Periodic4 that only affect the item and so is not additive).)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 damage bonus in ranged$percentage armor bonus against melee percentage damage bonus in melee#is activated this many times in 100Effects 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.enable the aspect for k clips0trigger if item smashed (not applied nor meleed)symbol ' ' means allsymbol ' ' means all, True means hit on drop1the Int says if can be placed on last level, etc.)explode, producing this group of shrapnel.Transform an effect using a stateful function..Transform an aspect using a stateful function.Q}~G}~G}~} ~ None 0M#All possible terrain tile features.,used for visible trails throughout the level)no actors nor stairs ever generated thereno items ever generated there/initial actors and stairs often generated there#initial items often generated there'can never be excavated nor seen through&sustains the effect continuously, TODO'may not be what it seems (clients only) is not lit with an ambient shineactors can see throughactors can walk through1if 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 causes the effect when triggered ! !None 0M Fractional chance.The monad of computations with random generator state. The lazy state monad is OK here: the state is small and regularly forced.?Get a random object within a range with a uniform distribution.@Get a random object of a given type with a uniform distribution.1Get any element of a list with equal probability.5Gen an element according to a frequency distribution."6Randomly choose an item according to the distribution.Give True., with probability determined by the fraction.mCast dice scaled with current level depth. Note that at the first level, the scaled dice are always ignored.5Cast dice scaled with current level depth and return True$ if the results is greater than 50.<Cast dice, scaled with current level depth, for coordinates. "   "NoneM 4The coordinates of consecutive fields of a corridor.#2The choice of horizontal and vertical orientation.#Pick a random point within an area.3Create a random room according to given parameters.ICreate a void room, i.e., a single point area within the designated area.Pick 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.EPick 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.Try 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. #&' minimum size maximum size(the containing area, not the room itself($%#orientation of the starting sectionstarting point ending point*the area containing the intermediate point!straight sections of the corridor #'&($%NoneM0Parameters for the generation of dungeon levels.a symbolshort descriptionfrequency within groupsX size of the whole caveY size of the whole cave$the dimensions of the grid of placesminimal size of placesmaximal size of placesthe chance a place is darkthe chance the cave is dark!a proportion of extra connections%at most this proportion of rooms voidminimal distance between stairs"the chance of a door in an openingif there's a door, is it open?"if not open, hidden one in n timesactor groups to considerthe number of items in the caveitem groups to considerplace groups to consider$are passable default tiles permitted the default cave tile group name&the dark cave corridor tile group name%the lit cave corridor tile group namethe filler wall group namethe outer fence wall group name%the dark place plan legend group name$the lit place plan legend group nameHFilter a list of kinds, passing through only the incorrect ones, if any.Catch caves with not enough space for all the places. Check the size of the cave descriptions to make sure they fit on screen.None 0M  *Our own encoding of modifiers. Incomplete. 0Frontend-independent datatype to represent keys.+an unknown key, registered to warn the usera 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.1      !"#$%)*+,-./0&'()*1234%      !"#$%&'()*%  '&()*    !"#$%      !"#$%)*+,-./0&'()*1234 NoneM5ARepeatedly save a simple serialized version of the current state..hRestore a saved game, if it exists. Initialize directory structure and cope over data files, if needed.+,5-./+,-./+,-./+,5-./!NoneM8#Abstract syntax of player commands.mCommands 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.nDescription of player commands.@0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmn6?0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnDckjihgfed8ba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:90421567563563mln0 4215675635638*ba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9ckjihgfedlmn6"NoneMo+Key-command mappings to be used for the UI.qdefault client UI commandsopqopqopqopq#NoneM7JSuffix to append to a basic content name if the content causes the effect.789:r;st<=>?uvrstuvstruv789:r;st<=>?uv$NoneM w(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.y map symbolzshort description{frequency within groups| map color}map color when not in FOV~ propertiesHFilter a list of kinds, passing through only the incorrect ones, if any.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.Features 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. wxyz{|}~ wxyz{|}~ wxyz{|}~wxyz{|}~%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.1Swap-places animation, both hostile and friendly.@ABCDLL@ABCD& Safe-Inferred 0M The type of item flavours.E/should the colour description be fancy or plainFthe colour of the flavour%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.6Human-readable names, for item colors. The simple set.5Human-readable names, for item colors. The fancy set.8Simple names for team colors (bright colours preferred).GEFHI   GEFHI'NoneM9Item 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 meleeweight in gramskeep the aspect continuouslycause the effect when triggeredpublic properties descriptionaccompanying organs and itemsHFilter a list of kinds, passing through only the incorrect ones, if any.(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.&JKLMNOPQRSTUV!LMNOPQRS JKTUVLMNOPQRS)None 0BMWAll 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 createdindividual map symbolindividual generic nameindividual flavourpublic 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 activatedA 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.)WXYZ[\]""WXYZ[\]*NoneM^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.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.+NoneM!^_`abcdefghijklmno    p           !^_`abcdefghijklmno    p ,NoneM`The part of speech describing the item parameterized by the number of effects/aspects to show..'The part of speech describing the item.-None BMVReverse 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.HThe map of item ids to item seeds. The full map is known by the server.The reverse map to  Discovery, needed for item creation.#Build an item with the given stats. Generate an item based on level.qqAssigns flavours to item kinds. Assures no flavor is repeated, except for items with only one permitted flavour.:Randomly chooses flavour for all item kinds for this game. rq   rq.None BM"5All actors on the level, indexed by actor identifier." resource change this player turn# resource change last player turn$`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.'individual map symbol(individual name)individual pronoun*individual map color Resources+absolute time of next action,current hit points * 1M-HP delta this turn * 1M.current calm * 1M/#calm delta this turn * 1M Location0current position1previous position2 current level3previous level4faction the actor belongs to5previous faction of the actor6?trajectory the actor must travel and his travel speed Items7organs8personal equipment9personal inventory Assorted:is the actor waiting right now?;Dis a projectile? (shorthand only, this can be deduced from bkind)BChance 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.C(The part of speech describing the actor.D0The part of speech containing the actor pronoun.EA template for a new actor.G=Add time taken by a single step at the actor's current speed.H0Whether an actor is braced for combat this clip.IThe actor waited last turn.MYChecks for the presence of actors in a position. Does not check if the tile is walkable.N5How long until an actor's smell vanishes from a tile.6 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRst5u !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQR5uBCD$%&'()*+,-./0123456789:; !"#<=>?@AFEGHIJKLMNOPQR !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRst/NoneMSCurrent game status.Ucurrent game outcomeVdepth of the final encounterWextra informationXOutcome of a game.Ygame is restartedZ$the player escaped the dungeon alive[(the player won by eliminating all rivals\game is supended](the faction lost the game in another way^the faction was eliminated_GDiplomacy states. Higher overwrite lower in case of assymetric content.fthe kind of the factiongindividual namehcolor of actors or their framesi the player spec for this factionjdiplomatic modekcause of game end/exitl!the leader of the faction, if anymfaction's shared inventorynmembers killedo8All factions in the game, indexed by faction identifier.p,Tell whether the faction consists of heroes.q5Tell whether the faction consists of human civilians.r;Tell whether the faction consists of summoned horrors only.sTell whether the faction is considered permanent dungeon dwellers (normally these are just spawning factions, but there are exceptions).tATell whether actors of the faction can be summoned by items, etc.u@Tell whether all moving actors of the factions can move at once.veTell whether a faction that we know is still in game, keeps arena. Such factions win if they can escape the dungeon. 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.w/Check if factions are at war. Assumes symmetry.x/Check if factions are allied. Assumes symmetry..STUVWXYZ[\]^u_`abcdefghijklmnopqrstuvwxyz{vwxy*ySTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{*yodefghijklmn_cba`X^]\[ZYSTUVWpqrstuvwxyz{STUVWX^]\[ZYu_cba`d efghijklmnopqrstuvwxyz{vwxy0None 0M ~%Font to use for the main game window.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./Auto-answer all prompts, e.g., for screensaver.Don't show any animations.,Start a new game, overwriting the save file.(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.|}~z|}~|}~| }~z1NoneMTFully 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.{|   {|2NoneM;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 bindinguNoneM}(Session data maintained by the frontend.~the widget to draw totext color tags for fg/bgchannel for keyboard inputState 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.oMost 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.client configurationscreen output channellast full frame shown(Perform an operation on the frame queue.The name of the frontend.^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.@Sets up and starts the main GTK loop providing input and output.&Output to the screen via the frontend.Maximal polls per second.+Add a given number of microseconds to time.FThe difference between the first and the second time, in microseconds.>Poll the frame queue often and draw frames at fixed intervals.>Poll the frame queue often and draw frames at fixed intervals.JAdd a game screen frame to the frame drawing channel, or show it ASAP if  immediate/ display is requested and the channel is empty.CTrim 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.+}~frontend session datathe screen frame to drawfrontend session datathe screen frame to draw}}~3NoneM8No 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 draw4None M The name of the chosen frontend.   5NoneM{Connection channel between a frontend and a client. Frontend acts as a server, serving keys, when given frames to display.exit frontend loop>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 in running mode (don't insert delay between frames) show a frameDisplay a prompt, wait for any of the specified keys (for any key, if the list is empty). Repeat if an unexpected key received. 6None 0BM(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 killed +whether the faction fights against spawnerscurrent score table*position of the current score in the table  7NoneM +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 floorremembered level mapwidth of the levelheight of the levelremembered smells on the levellevel description!destinations of (up, down) stairs currently remembered clear tiles%total number of initially clear tiles&date of the last activity on the level+frequency of spawned actors; [] for clients&number of initial items, 0 for clients*frequency of initial items; [] for clientssecret tile seedsecret tile densityhas an Effect.Escape tileCurrent 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.Query for items on the ground.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*vx*xv8None 0BMBPerception 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.   9None 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 constructthe 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 includedthe area to fillthe place kind to construct   :NoneM5The 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            ;NoneM 0Freshly generated and not yet populated dungeon.maps for all levelsabsolute dungeon depthCreate a level from a cave.)Build rudimentary level from a cave kind.$Generate the dungeon for a new game.       <NoneMView 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 table#Initial complete global game state.Initial empty state.QLocal state created by removing secret information from global state components.!Update dungeon data within state.Update dungeon depth.Update the actor dictionary.Update the item dictionary.!Update faction data within state.  Update global time within state.!!Update content data within state. !"#$%&'() !"#$%&'()"#$%&'() !  !"#$%&'()=NoneM 52Finds an actor at a position on the current level.86Calculate loot's worth for a faction of a given actor.;/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.DwChecks 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)G'Get current time from the dungeon data.LDetermine if the sight radius is high enough to deem the actor capable of projecting items and similar activities. Otherwise, the actor is assumed to use a combination of peripherial vision, hearing, etc., and not the actual focused, long-distance sight sense.,*+,-./0123456789:;<=level of the stairsposition of the stairsjump up this many levelscurrent game dungeon5target level and the position of its receiving stairs>?@ABCDEFGHIJKLMNOPQ(*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQ(*+,-./013489:@ABC7=?652D><G;EFHIJKLMNOPQ,*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQ>NoneMRSTUVWXRSTUVWXRSTUVWXRSTUVWX?NoneM\%Update the actor time priority queue.]#Update the items on the ground map.^Update the tile map._Update the smell map.`'Update a given level data within state.YZ[\]^_`abcdefYZ[\]^_`abcdefYZ[`abcdef\]^_YZ[\]^_`abcdef@NoneMgHow 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.CReturn the value to add to effect value and another to multiply it.hDetermine 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.ghghhgghANone BMo~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. ijklmnopijklmnopijklnpmoijklmnopBNone 0Mt*Abstract syntax of atomic special effects.#Abstract syntax of atomic commands.Kqrstuvwxyz{|}~Gqrstuvwxyz{|}~Gt~}|{zyxwvuqsr qsrt ~}|{zyxwvu0CNoneMDNoneMcThe type representing visibility of actions to factions, based on the position of the action, etc.$never broadcasted, but sent manuallyeverybody noticesonly the server noticesfaction and server noticesonly the faction notices*whomever smells all the positions, notices observers and the faction notice(whomever sees all the positions, noticesProduce the positions where the action takes place. If a faction is returned, the action is visible only for that faction, if Nothing is returned, it's never visible. Empty list of positions implies the action is visible always.The goal of the mechanics: client should not get significantly more information by looking at the atomic commands he is able to see than by looking at the state changes they enact. 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.BProduce the positions where the atomic special effect takes place.#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.pDecompose 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.#Decompose an atomic special effect.-Messages for some unseen game object creation destruction alteration.ENoneMDThe 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."     "     vNoneMWqrstuvwxyz{|}~Wt~}|{zyxwvuqsrFNoneM3Abstract syntax of client commands that use the UI.9Abstract syntax of client commands that don't use the UI.   GNoneM5Send an atomic action to all clients that can see it.HNone BM0Parameters of the current run."the original leader from run start!the list of actors that take part=distance of the run so far (plus one, if multiple runners)!message with the next stop reason!the direction of the initial stepThe 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 set#Current targeting mode of a client.Client 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 modethe 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 discoveries'remembered aspects and effects of items$faction perception indexed by levelscurrent random generatorstate of key sequence recordingstate of key sequence playback"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 level map from slots to items last used slot current game mode client debugging mode Initial game client state.-Update target parameters within client state.(Get target parameters from client state.:Update picked leader within state. Verify actor's faction.>     ;     ;           INoneM!{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.  !"  !"  !" !"JNone 368EHM#$%&#$%&%&#$#$%&KNone!"(*:=M@KClient-server requests that take game time. Sent by both AI and UI clients.L*Client-server requests sent by UI clients.T+Cclient-server requests sent by AI clients.3'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXY3'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXY3TWVULSRQPONM@IHGFEDCBAJK'?>=<;:9876543210/.-,+*)(YX'?>=<;:9876543210/.-,+*)(@ IHGFEDCBAJKLSRQPONMTWVUXYLNone (MZ'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.Z[\]^_`abcdefghZ[\]^_`abcdefghZ^_`][\abcdefghZ[\]^_`abcdefghMNoneMi6Require that the target enemy is visible by the party.jARequire that the target enemy is remembered on the actor's level.k+Require that any non-dying foe is adjacent.l%Require the actor's HP is low enough.m1Require the actor stands over a triggerable tile.nProduce 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.o?Require the actor blocks the paths of any of his party members.p'Require the actor stands over a weapon.q3Check whether the actor has no weapon in equipment.r-Require that the actor can project any items.s^Produce the list of items with a given property available to the actor and the items' values.t%Require the actor is not calm enough.u4Require that the actor stands over a desirable item.v:Produce the list of items on the ground beneath the actor.wRequire the actor is in a bad position to melee. We do not check if the actor has a weapon, because having no innate weapon is rare.xVRequire that the actor stands in the dark, but is betrayed by his own equipped light,y8Produce a list of acceptable adjacent points to flee to.ijklmnopqrstuvwxyijklmnopqrstuvwxyijklmopqrtuwxsvnyijklmnopqrstuvwxyNNoneMzzzzONone EM{Get 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 second argument can ever be true only if there's no escape from the dungeon.CClosest (wrt paths) items and changeable tiles (e.g., item caches).!Closest (wrt paths) enemy actors.{|}~ {|}~ {|}~{|}~PNone (M=AI strategy based on actor's sight, smell, etc. Never empty.A strategy to always just wait.;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. !"#$%&'()*+,-./012345 !"#$%&'()*+,-./012345QNoneM8AI proposes possible targets for the actor. Never empty.RNoneM Handle the move of an AI player.4Client signals to the server that it's still online.SNoneMColor mode for the display.black+white onlynormal, with full coloursDraw 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. 6789:;6789:;TNone HM The 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. Auxiliary AI and computer player clients have no sfs nor sbinding.connection with the frontendbinding of keys to commands<,Read a keystroke received from the frontend.=#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.)Push frames or delays to the frame queue.;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)./Draw the current level with the overlay on top.Get the key binding.&Sync frames display with the frontend.$<=>?##<=>?UNoneMWire together game content, the main loop 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.VNoneM@A yes-no confirmation.Display a message with a -more-F prompt. Return value indicates if the player tried to cancel/escape.~Print a yes/no question and return the player's answer. Use black and white colours to turn player's attention to the choice.Print 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).Push the frame depicting the current level to the frame queue. Only one screenful of the report is shown, the rest is ignored.The prompt is shown after the current message, but not added to history. This is useful, e.g., in targeting mode, not to spam history.The 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. @   @WNoneM$Add a message to the current report.4Wipe out and set a new value for the current report.5Store current report in the history and reset report.Produces a textual description of the terrain and items at an already explored position. Mute for unknown positions. The detailed variant is for use in the targeting mode.Create a list of item names.  detailed?how to start tile descriptioncan be seen right now?position to describethe actor that looksan extra sentence to print   XNone HM(Continue running in the given direction.DActor moves or searches or alters. No visible actor at the position.A8This 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.ABCABCYNoneMLet 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.cLet the human player choose any item from a list of items and let him specify the number of items.aDisplay all items from a store and let the human player choose any or switch to any other store.DVLet the human player choose a single, preferably suitable, item from a list of items.CSwitches current member to the next on the level, if any, wrapping.GSwitches current member to the previous in the whole dungeon, wrapping.1Select a faction leader. False, if nothing to do.EFGHIJKLM which items to consider suitablename of the item groupthe verb describing the actioninitial legal containers.legal containers after Calm taken into accountthe verb describing the actioninitial legal containers.legal containers after Calm taken into accountKwhether to ask, when the only item in the starting container is suitable&whether to ask for the number of items&how to describe suitable items in CSha(how to describe suitable items elsewherethe verb describing the actioninitial containerD which items to consider suitable&how to describe suitable items in CSha(how to describe suitable items elsewherethe verb describing the actioninitial legal containers-legal containers with Calm taken into accountKwhether to ask, when the only item in the starting container is suitablethe dialog state to start inN which items to consider suitable&how to describe suitable items in CSha(how to describe suitable items elsewherethe verb describing the actionOPQEFGHIJMLKDNOPQZNoneMCSwitches current member to the next on the level, if any, wrapping.GSwitches current member to the previous in the whole dungeon, wrapping.GDisplay items from a given container store and describe the chosen one.?Display the sum of equipments and inventory of the whole party.4Clear current messages, show the next screen if any.Display command help.Display the main menu.(Move the cursor. Assumes targeting mode.R{Perform look around in the current position of the cursor. Normally expects targeting mode and so that a leader is picked.SCreate a list of item names.bCycle targeting mode. Do not change position of the cursor, switch among things at that position.|Change the displayed level in targeting mode to (at most) k levels shallower. Enters targeting mode, if not already in one. Tweak the eps) parameter of the targeting digital line.~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.%WXRSTUVY%WXRSTUVY[None (M Z4Actor atttacks an enemy actor or his own projectile.["Actor swaps position with another.'Leader waits a turn (and blocks, etc.).2Ask for a direction and alter a tile, if possible.\-Player tries to alter a tile using a feature.]-Guess and report why the bump command failed.2Leader tries to trigger the tile he's standing on.^/Player tries to trigger a tile using a feature._?Verify important feature triggers, such as fleeing the dungeon.`-Guess and report why the bump command failed.Z[abc\d]^e_`  Z[abc\d]^e_`\NoneM7The 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).fFCompute the basic action for a command and mark whether it takes time.fgfg]NoneMClients 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. hijklmnop hijklmnop^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.q&Sentences such as "Dog barks loudly.".=Display special effects (text, animation) sent to the client.rqstuvwxyz{|}rqstuvwxyz{|}_NoneMHandle the move of a UI player.sDetermine and process the next human player command. The argument is the last stop message due to running, if any.kClient signals to the server that it's still online, flushes frames (if needed) and sends some extra info.oo`None 3M~~aNone 3MbNone 3MWire together game content, the main loop 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.cNoneMDebug commands. See wx for the descriptions.Global, server state.full item discoveries data)reverse disco map, used for item creation  full item aspect and effect data!map from item ids to item seeds"&reverse id map, used for item creation#association of flavour to items$stores next actor index%stores next item index&$actors are processed up to this time'!atomic commands performed to date(perception of all factions)current random generator*initial random generators+exit the game loop,make backup savefile now-this session start time.this game start time/$clips since the start of the session0hero names sent by clients1current debugging mode2 debugging mode for the next game3!Initial, empty game server state.5      !"#$%&'()*+,-./012341      !"#$%&'()*+,-./012341 !"#$%&'()*+,-./0123     4       !"#$%&'()*+,-./01234dNoneM?6Dumps RNG states from the start of the game to stderr.@>Read the high scores table. Return the empty table if no file.A+Generate a new score, register it and save.HwCompute and insert auxiliary optimized components into game content, to be used in time-critical sections of the code.IFInvoke pseudo-random computation with the generator kept in the state.JNGets a random generator from the arguments or, if not present, generates one.56789:;<=>?@ABCDEFGHIJ56789:;<=>?@ABCDEFGHIJ56789:;<=>?@ABCDEFGHIJ56789:;<=>?@ABCDEFGHIJeNoneMKKKKfNoneM All lit positions on a level.EVisually reachable position (light passes through them to the actor).*Calculate faction's perception of a level.MHCalculate faction's perception of a level based on the lit tiles cache.."Calculate perception of a faction.N.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 lit positions on a level, whether lit by actors or floor items. Note that an actor can be blind or a projectile, in which case he doesn't see his own light (but others, from his or other factions, possibly do).O(Compute all lit positions in the dungeonPerform 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.LMNO$tile content, determines clear tiles scanning modescanning radiusposition of the spectatorthe map that is scannedLMNONMLO LMNOgNoneMW-Mapping over actor's items from a give store.PQRSTUVWPQRSTUVWRPQSTUVWPQRSTUVWhNone EMYUpdate 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.7Create a projectile actor containing the given missile..Projectile has no organs except for the trunk.XYZ[\]^_`a-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 shrapnel-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 shrapnelbcdefXYZ[\]^_`abcdefXYZ[\]^_`bcadefXYZ[\]^_`abcdefiNoneMghijghijghijghijjNoneMk>The server monad with the ability to communicate with clients.qGConnection information for all factions, indexed by faction identifier.cConnections to the human-controlled client of a faction and to the AI client for the same faction.r:Connection channel between the server and a single client.~Update connections to the new definition of factions. Connect to clients in old or newly spawned threads that read and write directly to the channels.klmnopqrstuvwxyz{|}~klmnopqrstuvwxyz{|}~rstuqklmnopvwxyz{|}~klmnopqrstuvwxyz{|}~kNone 246BM"Server state transformation monad.current global statecurrent client state"this client connection informationconnection to the save thread#UI setup data, empty for AI clientsVInit the client, then run an action, with a given session, state and history, in the IO monad. lNone BM"Server state transformation monad.current global statecurrent server state$client-server connection informationconnection to the save thread5Send an atomic action to all clients that can see it.Run an action in the IO monad, with undefined state.LThe game-state semantics of atomic game commands as computed on the server. mNoneMfSapwn, possibly, a monster according to the level's actor groups. We assume heroes are never spawned.Advance the move time for the given actor, check if he's 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 cases a consistent regeneration UI indicator to be displayed each turn (not every few turns).nNoneM}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. If only one faction, also move it away from any stairs./Apply debug options that don't need a new game.  oNone EM The source actor affects the target actor, with a given item. If any of the effect effect 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 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.3Make the target actor drop his best weapon (stack). Drop a single actor's item. Note that if there 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).Make the target actor drop all items in his equiment with the given symbol (not just a random one, or cluttering equipment with rubbish would be beneficial).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.XTeleport the target actor. Note that projectiles can be teleported, too, for extra fun.Activate all activable 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).##pNoneM%Continue or exit or restart the game.QDrop all actor's items. If the actor hits another actor and this collision results in all item being dropped, all items are destroyed. If the actor does not hit, but dies, only fragile items are destroyed and only if the actor was a projectile (and so died by dropping to the ground due to exceeded range or bumping off an obstacle).qNone !"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.PAdd a smell trace for the actor to the level. For now, only heroes leave 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 yz.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 itemrNone !"M7Start a game session. Loop, communicating with clients.Trigger periodic items for all actors on the given level. This is done each game turn, not player turn, not to overpower fast actors (assuming the effects are positive).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.      sNoneMqFire up the frontend with the engine fueled by content. The action monad types to be used are determined by the exeSer and  executorCli calls. If other functions are used in their place the types are different and so the whole pattern of computation is different. Which of the frontends is run depends on the flags supplied when compiling the engine library. {|}~                                   !"#$%&'(()*+,--./01234567899:;<=>?@ABCDEFGHIJKLMMNOPQRSTTUVWXYZ[\]^_`abccdefghijklmnopqmnopqrrstuuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJJKLMNOPQRSTUVWXYZ[\]^_`abcdefghhijklmnopqrstuvwxyz{|}~     !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!2!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"""#####$$$$$$$$$$%%%%%%%%%%%%%%%%%%&&&&&&&&&''''''''''''''''''( ( ( ( ( ( (((((((((((((}(((((()) )!)")")#)$)%)&)')()))*)*)+),)-).).)/)0)1)2)3)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.t.u.v.w.w.x.y.z.{.|.}.~....................................../////////////////o////////////////////////0000000000000011111111111112222222333333344444444444555555555555555556666 6 6 7 7 7 7777777777777777777 7!7"7#7$7%7&7'7(7)7*7+7,7-7.7/7071728384858586868788898:8;9<9=9=9>9?9@9A9B9C9D9E9F:G:G:H:I:J:K:L;M;M;N;O;P;Q;R;S;T;U<V<W<X<Y<Z<[<\<]<^<_<`<a<b<c<d<e<f<g<h=i=j=k=l=m=n=o=p=q=r=s=t=u=v=w=x=y=z={=|=}=~==================>>>>>>>??????????????@@AAAAAAAABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBCCCCCCDDDDDDDDDDDDDDDD D D E F FFFFFFFFGHHHHHHHHHHH H!H"H#H#H$H%H&H&H'H(H)H*H+H,H-H.H/H0H1H2H3H4H5H6H7H8H9H:H;H<H=H>H?H@HAHBHCHDHEHFHGHHHIHJHKHLHMHNIOIPIQIRISITIUIVIWIXIIYIZJ[J\J]J^K_K`KaKbKcKdKeKfKgKhKiKjKkKlKmKnKoKpKqKrKsKtKuKvKwKxKyKzK{K|K}K~KKKKKKKKKKKKKKKKKKKLLLLLLLLLLLLLLLMMMMMMMMMMMMMMMMMNOOOOOOOOOOOPQRRRRSSSSTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTUVVVVVVVVVVWWWWWWWWWXXYYYYYYYYZZZZZZZZ Z Z Z Z ZZZZZZZZZZZZZZZZZ[[ [!["[#[$[%[&['[([)[*\+],]-^.^/_0_1_2`3`4a5a6b7c8c8c9c:c;c;c<c=c>c?c@cDcAcBcCcDcEcFcGcHcIcJcKcEcLcLc3cMc4cNcOcPcQcRcSc2cTc6cUc<cVcWcXcYcZc[c\c]c^d_d`dadbdcdTdddVdedXdfdgdhdidjdkdldmdndodZdpexfqfrfsftgugvgwgxgygzg{g|h}h~hhhhhhhhhhhhhiiiijjjjjjTjjjjjjjjjjjjjjklmmmmmnnnnnnoooooopppqqqrsttttttttttttt                                       {     { !"#$%&'()*+,-./012341,56789:;<=>?@ABCDEFG H!I#J#K#L#M#N#O#P#Q#R%%S%T%U%V&W&X&&Y&Z(}(([(\(](^(_(`(a(b(c(d(e)6)8)9)f)g)h)i+j+k+l+m+n+o+p+q+r+s+t+u+v+w+x+y+z+{+|-}-k.~./////011uuuuuuuEuuuuuuuuuuuuuuuuuuuuuuuuuu[uuuuuuuuuu3E33355566666666666666666778888999999:<<<<<<<<<V<<<====???????????@AABBBBDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE E E E G GHHHOOOPPPPPPPPPPPP P!P"P#P$P%P&P'PP(P)P*P+P,P-S.S/S0S1S2S3T4T5T6T7V8X9X:X;Y<Y=Y=Y>Y?Y@YAYBYCYDYEYFYGYHZIZJZKZLZMZNZOZP[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`uavcwcxcyczf{f|f}f~ffffff{ff|fhhhhiiiiiiiiiiijjjjjkkkkkkkkkkkkkkkkklllllllllllllllmmnnnnnnnooooooooooooooooooooooooooooopqqqqqqqqqqqqqqqqrrrrrrrLambdaHack-0.2.14Game.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.ModeKind Game.LambdaHack.Content.RuleKind#Game.LambdaHack.Content.FactionKind!Game.LambdaHack.Common.ContentDef!Game.LambdaHack.Content.PlaceKind"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.EffectGame.LambdaHack.Common.FeatureGame.LambdaHack.Common.Random)Game.LambdaHack.Server.DungeonGen.AreaRnd Game.LambdaHack.Content.CaveKindGame.LambdaHack.Client.KeyGame.LambdaHack.Common.Save"Game.LambdaHack.Client.UI.HumanCmd)Game.LambdaHack.Client.UI.Content.KeyKind(Game.LambdaHack.Common.EffectDescription Game.LambdaHack.Content.TileKind#Game.LambdaHack.Client.UI.AnimationGame.LambdaHack.Common.Flavour Game.LambdaHack.Content.ItemKindGame.LambdaHack.Common.KindGame.LambdaHack.Common.ItemGame.LambdaHack.Common.Tile$Game.LambdaHack.Common.ItemStrongest&Game.LambdaHack.Common.ItemDescriptionGame.LambdaHack.Server.ItemRevGame.LambdaHack.Common.ActorGame.LambdaHack.Common.Faction$Game.LambdaHack.Common.ClientOptions Game.LambdaHack.Client.UI.Config%Game.LambdaHack.Client.UI.KeyBindings&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.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.AI.PickActorClient Game.LambdaHack.Client.BfsClient-Game.LambdaHack.Client.AI.HandleAbilityClient*Game.LambdaHack.Client.AI.PickTargetClientGame.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.RunClient)Game.LambdaHack.Client.UI.InventoryClient0Game.LambdaHack.Client.UI.HandleHumanLocalClient1Game.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.ClientGame.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.LoopServerGame.LambdaHack.ServerPaths_LambdaHack&Game.LambdaHack.Client.UI.Frontend.GtkGame.LambdaHack.AtomicServer debugArgs LoopActionsetBWaitbase Data.Monoid<> EdgeIntervalEdge ConvexHullLineBumpBbxbyProgressDistancemaximalsteeperaddHullIntervalSBumpscan forkChildwaitForChildrenLQueue newLQueue nullLQueue lengthLQueue tryReadLQueue writeLQueue trimLQueuedropStartLQueue lastLQueue toListLQueue encodeEOFstrictDecodeEOF tryCreateDirtryCopyDataFiles appDataDirSkillsAbility AbTriggerAbApply AbProject AbMoveItemAbWaitAbAlter AbDisplaceAbMeleeAbMove zeroSkills unitSkills addSkills scaleSkillsPointpxpyYXmaxLevelDimExponent chessDist euclidDistSqadjacentinsideblafromTo RadianAngleVectorvxvyisUnit isDiagonalnegeuclidDistSqVectorchessDistVectormoves compassText movesCardinal movesDiagonalvicinityvicinityCardinalshift shiftBoundedtrajectoryToPathtrajectoryToPathBounded vectorToFrompathToTrajectoryrotatetowardsArray!// replicateA replicateMA generateMAsizeAfoldlAifoldlAimapA minIndexA minLastIndexA maxIndexA maxLastIndexA MoveLegal MoveToUnknown MoveToOpen MoveBlocked BfsDistance minKnownBfsapartBfsfillBfs findPathBfs accessBfsAreatoAreafromArea trivialAreagridshrinkActorIdAbsDepthLevelId FactionIdCStoreCShaCInvCEqpCOrganCGround ContainerCTrunkCActorCFloorFreqsnearbyserverSaveNamenormalLevelBounddivUpbreturnSpeedDeltaTimetimeZero timeEpsilontimeCliptimeTurnabsoluteTimeAdd timeShifttimeFit timeFitUptimeDeltaReverseabsoluteTimeNegatetimeDeltaToFromtimeDeltaScaletimeDeltaToDigittoSpeed fromSpeed speedZero speedNormal speedScalespeedAdd speedNegate ticksPerMeterspeedFromWeightrangeFromSpeedrangeFromSpeedAndLingerPlayer playerName playerFaction playerIsSpawn playerIsHero playerEntry playerInitial playerLeaderplayerAIplayerUIPlayers playersList playersEnemy playersAllyCavesModeKindmsymbolmnamemfreqmplayersmcavesmdescvalidateModeKindFovModeDigital PermissiveShadowRuleKindrsymbolrnamerfreq raccessibleraccessibleDoorrtitlerpathsDataFile rpathsVersion rcfgUIName rcfgUIDefault rmainMenuArtrfirstDeathEndsrfovMode rsaveBkpClipsrleadLevelClips rscoresFile rsavePrefix rsharedStashvalidateRuleKind FactionKindfsymbolfnameffreq fSkillsLeader fSkillsOthervalidateFactionKind ContentDef getSymbolgetNamegetFreqvalidatecontentFenceFNoneFFloorFWallCover CVerbatimCReflectCStretch CAlternate PlaceKindpsymbolpnamepfreqpraritypcoverpfenceptopLeft poverridevalidatePlaceKinddlinedsteeper intersect debugSteeper debugLineAttrCharacAttracCharAttrfgbgColorBrWhiteBrCyan BrMagentaBrBlueBrYellowBrGreenBrRedBrBlackWhiteCyanMagentaBlueBrownGreenRedBlackdefBGdefFGdefAttrisBrightlegalBGdarkCol brightColstdCol colorToRGB Slideshow slideshowOverlayoverlay ScreenLineHistoryReportMsg<+>tshowtoWidth makePhrase makeSentencemoreMsgyesnoMsg truncateMsg emptyReport nullReportsingletonReportaddMsg splitReport renderReport findInReportlastMsgOfReport splitText emptyHistory lengthHistorysingletonHistory mergeHistory renderHistory addReport takeHistorylastReportOfHistory toScreenLine encodeLine encodeOverlay emptyOverlaytruncateToOverlay toOverlay splitOverlay toSlideshow Frequency nameFrequency runFrequency uniformFreqtoFreq scaleFreq renameFreqsetFreqnullFreqmaxFreqminFreqmeanFreqStrategy nullStrategy liftFrequency.|reject.=>only bestVariantrenameStrategyreturN mapStrategyMDiceXYDice diceConst diceLevel diceScaledzdlzl intToDice|*|maxDiceminDicemeanDice reduceDice maxDiceXY minDiceXY meanDiceXYEqpSlot EqpSlotWeaponEqpSlotAddLightEqpSlotAddSmellEqpSlotAddSightEqpSlotAddSkillsEqpSlotAddSpeedEqpSlotAddMaxCalmEqpSlotAddMaxHPEqpSlotAddArmorRangedEqpSlotAddHurtRangedEqpSlotAddArmorMeleeEqpSlotAddHurtMeleeEqpSlotPeriodicFeaturePrecious Applicable IdentifiedToThrowDurableFragileChangeToThrowMod throwVelocity throwLingerAspectAddLightAddSmellAddSight AddSkillsAddSpeed AddMaxCalmAddMaxHPAddArmorRanged AddHurtRanged AddArmorMelee AddHurtMeleePeriodicEffect TimedAspectOnSmashOneOf ApplyPerfume ActivateInvDropEqpDropBestWeapon PullActor PushActor SendFlyingIdentifyPolyItemTeleport InsertMoveParalyzeEscapeAscend CreateItemSummon CallFriendImpressDominate RefillCalmRefillHPExplodeBurnHurtNoEffect effectTrav aspectTravTrailNoActorNoItem OftenActor OftenItem ImpenetrableAuraSuspectDarkClearWalkableRevealAsHideAsCloseToOpenToCauseChanceRndrandomRrandomoneOf frequencychancecastDice chanceDice castDiceXYCorridorxyInAreamkRoom mkVoidRoom connectGridrandomConnection connectPlacesCaveKindcsymbolcnamecfreqcxsizecysizecgrid cminPlaceSize cmaxPlaceSize cdarkChance cnightChance cauxConnectscmaxVoid cminStairDist cdoorChance copenChancechidden cactorFreqcitemNum citemFreq cplaceFreq cpassablecdefTile cdarkCorTile clitCorTile cfillerTilecouterFenceTileclegendDarkTileclegendLitTilevalidateCaveKindKMmodifierkeyModifierControl NoModifierKeyUnknownCharKPHomeBeginEndDownUpRightLeftPgDnPgUp BackSpaceBackTabTabSpaceReturnEscshowKeyshowKMescKMspaceKMpgupKMpgdnKM dirAllKey handleDir moveBindingmkKM keyTranslateChanSave saveToChan wrapInSaves restoreGame delayPrintTriggerTriggerFeature AlterFeaturefeature ApplyItemverbobjectsymbolHumanCmdAcceptCancelTgtClearEpsIncr TgtAscendTgtStairTgtItem TgtUnknownTgtEnemyTgtFloor MoveCursorMacroMainMenuHelp MarkSuspect MarkSmell MarkVisionRecordRepeat SelectNone SelectActorAllOwned DescribeItem MemberBack MemberCycle PickLeaderGameDifficultyCycleAutomateGameSaveGameExit GameRestart StepToTarget TriggerTileAlterDirApplyProjectMoveItemWaitRunMove CmdCategory CmdMinimalCmdDebugCmdMetaCmdAutoCmdTgtCmdItemCmdMoveCmdMenucategoryDescriptionnoRemoteHumanCmdcmdDescriptionKeyKindrhumanCommands featureToSuffeffectToSuffixaspectToSuffixkindEffectToSuffixkindAspectToSuffixTileKindtsymboltnametfreqtcolortcolor2tfeaturevalidateTileKindactionFeaturesFrames Animation SingleFramesfLevelsfTopsfBottomsfBlank decodeLineoverlayOverlay renderAnim restrictAnim twirlSplashblockHit blockMiss deathBody swapPlacesfadeoutFlavourzipPlainzipFancystdFlavflavourToColor flavourToNamecolorToPlainNamecolorToFancyNamecolorToTeamNameItemKindisymbolinameifreqiflavouricountirarityiverbHitiweightiaspectsieffectsifeatureidescikit toVelocitytoLingervalidateItemKindCOpscocave cofactioncoitemcomodecoplacecorulecotileOpsokind ouniqGroupopick ofoldrWithKey ofoldrGroupoboundsospeedupSpeedupId createTab accessTab createOps stdRuleset ItemKnownItemDictItemBagItemjkindIxjlidjsymboljnamejflavourjfeaturejweightItemFullitemBaseitemK itemDisco ItemDisco itemKindIditemKinditemAEDiscoAEItemAspectEffectjaspectsjeffectsItemSeed Discovery ItemKindIxItemId itemNoDiscoitemNoAEseedToAspectsEffects SmellTimekindHasFeature hasFeatureisClearisLit isWalkable isPassableisDoor isSuspect isChangeable isExplorable lookSimilarspeedupisPassableKindopenTocloseTo causeEffectsrevealAshideAs isOpenable isClosableisEscapeisStairstrengthOnSmashstrengthEqpSlotstrengthToThrowcomputeTrajectoryitemTrajectory totalRangestrengthFromEqpSlotstrongestSlotNoFilter strongestSlotsumSlotNoFilter sumSkillsunknownPreciouspermittedRanged unknownMelee partItemNpartItem textAllAE partItemWs partItemAW partItemWownWitemDescviewItemItemRev FlavourMap ItemSeedDictDiscoRev serverDiscos buildItemnewItememptyFlavourMapdungeonFlavourMap ActorDictResDeltaresCurrentTurnresPreviousTurnActorbtrunkbsymbolbnamebpronounbcolorbtimebhpbhpDeltabcalm bcalmDeltabposboldposblidboldlidbfidboldfid btrajectoryborganbeqpbinvbwaitbproj deltaSerious deltaMildxMminusM minusTwoMoneMmonsterGenChance partActor partPronoun actorTemplatebspeedtimeShiftFromSpeedbracedwaitedLastTurn actorDying actorNewBornhpTooLow unoccupied smellTimeout checkAdjacentmapActorItems_ppCStore ppContainerStatus stOutcomestDepthstInfoOutcomeRestartConquerCampingDefeatedKilled DiplomacyWarAllianceNeutralFactiongkindgnamegcolorgplayergdiplgquitgleadergshagvictims FactionDict isHeroFactisCivilianFact isHorrorFact isSpawnFact isSummonFact isAllMoveFact keepArenaFactisAtWarisAllieddifficultyBounddifficultyDefaultdifficultyCoeff DebugModeClisfontsmaxFpssnoDelaysnoMoresnoAnim snewGameClisdifficultyClissavePrefixCli sfrontendStd sfrontendNull sdbgMsgClidefDebugModeCliConfigconfigCommandsconfigHeroNamesconfigVi configLaptop configFontconfigHistoryMax configMaxFps configNoAnimconfigRunStopMsgsmkConfigapplyConfigToDebugBindingbcmdMapbcmdListbrevMap stdBindingkeyHelpFrontendSessionsescMVar frontendNamestartupfdisplay fsyncFrames fpromptGetKey RawFrontendfescMVar fdebugCli chosenStartup stdStartup nullStartup ChanFrontend responseFrequestFFrontReq FrontFinish FrontSlides frontClear frontSlidesFrontKeyfrontKMfrontFr FrontDelayFrontRunningFrameFrontNormalFrame frontFramestartupF ScoreTable showScore getRecordemptyregister highSlideshowLevelldepthlpriolfloorltilelxsizelysizelsmellldesclstairlseenlclearltime lactorFreqlitemNum litemFreqlsecretlhiddenlescapeSmellMapTileMap ItemFloor ActorPrioDungeonascendInBranchatatI checkAccesscheckDoorAccess accessibleaccessibleUnknown accessibleDir knownLsecret isSecretPoshideTilefindPos findPosTrymapLevelActors_mapDungeonActors_Pers FactionPers PerceptionPerceptionVisible totalVisible smellVisiblenullPeraddPerdiffPer TileMapEMPlaceqkindqareaqseenqlegend qsolidFence qhollowFence placeCheck buildPlace buildFenceRndCavedkinddmapdplacesdnight buildCave FreshDungeon freshDungeonfreshTotalDepthconvertTileMaps placeStairs buildLevellevelFromCaveKind findGenerator dungeonGenStatedefStateGlobal emptyStatelocalFromGlobal updateDungeon updateDepth updateActorD updateItemDupdateFactionD updateTime updateCOpssdungeon stotalDepthsactorDsitemD sfactionDstimescopsshighfidActorNotProjAssocsfidActorNotProjListactorAssocsLvl actorAssocs actorListactorRegularAssocsLvlactorRegularAssocsactorRegularList getItemBody bagAssocs bagAssocsK posToActor posToActorsnearbyFreePointscalculateTotalsharedAllOwnedsharedAllOwnedFid itemPrice tryFindHeroKwhereTo getActorBodygetCarriedAssocsgetCBag getActorBaggetBodyActorBaggetActorAssocsmemActor calmEnoughhpEnough getLocalTimeregenCalmDeltaactorInAmbient actorSkills dispEnemy radiusBlind fullAssocs itemToFull goesIntoInv eqpOverfull storeFromCMonadStateReadgetState getsStategetLevelnUIposOfAidfightsAgainstSpawnersMonadStateWrite modifyStateputState updatePrio updateFloor updateTile updateSmell updateLevel updateActor updateFactioninsertItemContainerinsertItemActordeleteItemContainerdeleteItemActoreffectToBenefittotalUsefulness ItemSlotsSlotCharslotChar slotRangeallSlots assignSlot slotLabel HitAtomicHitBlockHitClear SfxAtomic SfxActorStart SfxMsgAll SfxMsgFid SfxEffectSfxShun SfxTriggerSfxCheck SfxActivateSfxCatch SfxProject SfxRecoil SfxStrike UpdAtomicUpdRecordHistory UpdMsgAll UpdSaveBkp UpdKillExitUpdResumeServer UpdResumeUpdRestartServer UpdRestart UpdPerception UpdCoverSeedUpdDiscoverSeed UpdCoverKindUpdDiscoverKindUpdCover UpdDiscover UpdAgeGame UpdLoseSmell UpdSpotSmell UpdAlterSmell UpdLoseTile UpdSpotTileUpdLearnSecrets UpdSearchTile UpdAlterClear UpdAlterTile UpdRecordKillUpdAutoFactionUpdDiplFactionUpdLeadFactionUpdQuitFaction UpdColorActor UpdTrajectoryUpdOldFidActor 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 RespQueryAIRespUpdAtomicAIhandleAndBroadcast LastRecord RunParams runLeader runMembersrunDist runStopMsg runInitDirTargetTVectorTPoint TEnemyPosTEnemyTgtMode tgtLevelIdPathEtc StateClientstgtModescursorsepsstargetD sexploredsbfsD sselectedsrunningsreportshistory sdisplayedsundosdiscosdiscoAEsfpersrandom slastRecord slastPlay swaitTimes_sleader_ssidesquitsisAI smarkVision smarkSmell smarkSuspectscurDifficultysslots slastSlot sgameMode sdebugClidefStateClientdefaultHistory updateTarget getTarget updateLeaderssidetoggleMarkVisiontoggleMarkSmelltoggleMarkSuspect MonadClient getClient getsClient modifyClient putClientliftIOsaveChanClient debugPrint saveClientsaveNameremoveServerSave rndToActionMonadClientWriteRequest sendRequestMonadClientReadResponsereceiveResponse ReqFailureTriggerNothing ProjectBlindProjectBlockActorProjectBlockTerrainProjectAimOnself ItemNotCalm ItemNothingApplyOutOfReach ApplyBlindDurablePeriodicAbuse EqpOverfull AlterNothingAlterBlockItemAlterBlockActor AlterDistantDisplaceSupportedDisplaceBraced DisplaceDyingDisplaceProjectilesDisplaceAccessDisplaceDistant MeleeDistant MeleeSelf MoveNothing RequestTimed ReqTriggerReqApply ReqProject ReqMoveItemReqWaitReqAlter ReqDisplaceReqMeleeReqMoveRequestAnyAbility RequestUI ReqUIPong ReqUIAutomate ReqUIGameSave ReqUIGameExitReqUIGameRestart ReqUILeader ReqUITimed RequestAI ReqAIPong ReqAILeader ReqAITimedanyToUIshowReqFailure getPerFidpartActorLeaderpartPronounLeader partAidLeader aidTgtToPos aidTgtAimsmakeLineactorSkillsClientupdateItemSlotfullAssocsClientactiveItemsClientitemToFullClientpickWeaponClientsumOrganEqpClient getModeClientcondTgtEnemyPresentMcondTgtEnemyRememberedMcondAnyFoeAdjM condHpTooLowMcondOnTriggerableMthreatDistListcondBlocksFriendsMcondFloorWeaponMcondNoEqpWeaponMcondCanProjectMbenAvailableItemscondNotCalmEnoughMcondDesirableFloorItemMbenGroundItems condMeleeBadMcondLightBetraysMfleeListpickActorToMovegetCacheBfsAndPath getCacheBfsaccessCacheBfs furthestKnownclosestUnknown closestSmellclosestSuspectclosestTriggersunexploredDepth closestItems closestFoesactionStrategytargetStrategyqueryAIpongAI refreshTarget pickAction ColorModeColorBW ColorFulldraw MonadClientUI getsSession SessionUIschanFsbindingsconfig promptGetKeygetKeyOverlayCommandgetInitConfirms displayFrame displayDelay displayFramesdisplayActorStart drawOverlay stopPlayBack stopRunning askConfig askBinding syncFramestryTakeMVarSescMVarscoreToSlideshow getLeaderUI getArenaUI viewedLeveltargetDescLeadertargetDescCursorleaderTgtToPos leaderTgtAims cursorToPos srtFrontend displayMore displayYesNodisplayChoiceUI displayPushdisplayPushIfLidpromptToSlideshowoverlayToSlideshowoverlayToBlankSlideshowanimate fadeOutOrIn SlideOrCmdmsgAddmsgReset recordHistoryfailWith failSlidesfailSerlookAt itemOverlay continueRun moveRunAidfailMsg getGroupItem getAnyItem getStoreItem memberCycle memberBackmsgCannotChangeLeader pickLeadergameDifficultyCyclepickLeaderHumanmemberCycleHumanmemberBackHumandescribeItemHuman allOwnedHumanselectActorHumanselectNoneHuman clearHuman repeatHuman recordHuman historyHumanmarkVisionHumanmarkSmellHumanmarkSuspectHuman helpHuman mainMenuHuman macroHumanmoveCursorHuman tgtFloorHuman tgtEnemyHumantgtUnknownHuman tgtItemHuman tgtStairHumantgtAscendHuman epsIncrHuman tgtClearHuman cancelHuman acceptHuman moveRunHuman waitHuman moveItemHuman projectHuman applyHuman alterDirHumantriggerTileHumanstepToTargetHumangameRestartHuman gameExitHuman gameSaveHuman automateHuman cmdHumanSemcmdAtomicFilterClicmdAtomicSemClidisplayRespUpdAtomicUIdisplayRespSfxAtomicUIqueryUI humanCommandpongUIhandleResponseAIhandleResponseUIloopAIloopUI exeFrontendRNGsdungeonRandomGeneratorstartingRandomGenerator DebugModeSersknowMap sknowEventssniffInsniffOut sallClear sautomateAll sstopAfter sbenchmark sdungeonRngsmainRngsfovMode snewGameSersdifficultySer sdumpInitRngsssavePrefixSer sdbgMsgSer StateServer sdiscoRev sitemSeedDsitemRevsflavour sacounter sicounter sprocessedspersrngssbkpSavesstartsgstartsallTime sheroNames sdebugSer sdebugNxtemptyStateServerdefDebugModeSer MonadServer getServer getsServer modifyServer putServersaveChanServer saveServerdumpRngs restoreScore registerScoreresetSessionStartresetGameStartelapsedSessionTimeGT tellAllClipPStellGameClipPS tryRestore speedupCOps getSetGenPersLitfidLidPerceptiondungeonPerception litInDungeon registerItem createItemsrollAndRegisterItemplaceItemsInDungeonfullAssocsServeractiveItemsServeritemToFullServermapActorCStore_ execFailureresetFidPerceptionresetLitInDungeon revealItems moveStores deduceQuits deduceKilled electLeader projectFailaddActor addActorIidpickWeaponServersumOrganEqpServeractorSkillsServerdebugResponseAIdebugResponseUIdebugRequestAIdebugRequestUIMonadServerReadRequestgetDictgetsDict modifyDictputDictConnServerDict ChanServer responseSrequestS sendUpdateAI sendQueryAI sendPingAI sendUpdateUI sendQueryUI sendPingUIkillAllClientschildrenServer updateConn executorCli executorSer spawnMonster addAnyActordominateFidSfx advanceTime leadLevelFlipinitPer reinitGame gameReset recruitActors initDebug applyDebug applyItemitemEffectAndDestroy itemEffect effectsSemarmorHurtBonus dropEqpItem endOrLoopdieSer dropEqpItemshandleRequestAIhandleRequestUIreqMoveloopSermainSerdownBiasupBiascatchIOversionbindirlibdirdatadir libexecdir sysconfdir getBinDir getLibDir getDataDir getLibexecDir getSysconfDirgetDataFileName encodeDatastrictReadSerializedstrictDecodeData$fHashableAbility$fBinaryAbility $fShowAbility maxLevelDimblaXY balancedWord fromEnumPoint toEnumPoint $fEnumPoint $fBinaryPoint $fShowPoint maxVectorDim normalizefromEnumVector toEnumVector moveTextsnormalizeVector $fEnumVector$fBinaryVectoraxsizeaysizeavectorcnvpindexpunindex $fBinaryArray $fShowArray $fBinaryArea$fHashableEnumMap$fAdjustableEnumMap$fLookupEnumMap$fIndexableEnumMap$fTraversableWithKeyEnumMap$fFoldableWithKeyEnumMap$fKeyedEnumMap$fZipWithKeyEnumMap $fZipEnumMapTFCo:R:KeyEnumMap$fBinaryHashMap$fBinaryEnumSet$fBinaryEnumMap$fHashableCStore$fBinaryCStore$fBinaryContainer _timeTick turnsInSecond_ticksInSecondsInMs $fShowSpeed$fBinaryPlayer$fShowRuleKindGHC.ShowShow$fBinaryFovMode _olorToRGB $fBinaryColor$fEnumAttrChar $fEnumAttr$fHashableColorsplitReportListrenderRepetition splitText'$fMonoidSlideshow$fBinaryFrequency$fHashableFrequency$fAlternativeFrequency$fMonadPlusFrequency$fApplicativeFrequency$fFunctorFrequency$fMonadFrequencyGHC.Basereturn$fMonadStrategy runStrategynormalizeStrategy$fAlternativeStrategy$fMonadPlusStrategy$fApplicativeStrategy$fFunctorStrategy SimpleDicenormalizeSimple liftANameliftA2AdditiveName dieSimple zdieSimpleaffectBothDice$fBinaryDiceXY$fHashableDiceXY $fNumDice $fBinaryDice$fHashableDice $fShowDice$fNumFrequency$fBinaryEqpSlot$fBinaryFeature$fBinaryThrowMod$fBinaryAspect$fBinaryEffect$fHashableEqpSlot$fHashableFeature$fHashableThrowMod$fHashableAspect$fHashableEffectrollFreqHV sortPoint mkCorridorVertHoriz connectGrid' dirKeypadKeydirKeypadShiftChardirKeypadShiftKey dirLaptopKeydirLaptopShiftKey dirViChardirViKey dirViShiftKey $fBinaryKM$fShowKM$fBinaryModifier $fBinaryKeyloopSavetriggerDescription effectToSuff tmodToSuff aspectToSuffrawAspectToSuffdropPlus affixBonus wrapInParenswrapInChevrons affixDiceblank coloredSymbol mzipPairs$fBinarySingleFrame fancyName baseColor$fBinaryFlavour$fHashableFlavour TileSpeedup isClearTabisLitTab isWalkableTab isPassableTab isDoorTab isSuspectTabisChangeableTab$fEqCOps $fShowCOpsTFCo:R:SpeedupTileKind $fBinaryItem$fHashableItem$fHashableItemAspectEffect$fBinaryItemAspectEffectdice999strengthAspectstrengthAspectMaybestrengthEffect999strengthFeature strengthMeleestrengthPeriodicstrengthAddMaxHPstrengthAddMaxCalmstrengthAddSpeedstrengthAddSkillsstrengthAddHurtMeleestrengthAddHurtRangedstrengthAddArmorMeleestrengthAddArmorRangedstrengthAddSightstrengthAddSmellstrengthAddLight unknownAspectrollFlavourMap$fBinaryResDelta $fBinaryActorDipl$fBinaryStatus$fBinaryOutcome$fBinaryDiplomacy$fBinaryFaction$fBinaryDebugModeCli parseConfig$fNFDataConfigsviewstagsschanKey sframeState slastFullfpushedfshownonQueuerunGtkoutputmaxPollsaddTimediffTimepollFramesWait pollFramesAct pushFrametrimFrameStatedeadKeymodifierTranslateGtkFramegfChargfAttr FrameStateFPushed dummyFramesetTo picoInMicro microInSec defaultMaxFps evalFramedisplayAllFramesSyncdoAttr nextEventgetConfirmGeneric loopFrontend ScoreRecordpointsnegTimedatestatus 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 unknownLevelunknownTileMap $fBinaryState tryFindActor sharedInv sharedEqpgetActorAssocsKinsertItemFloorinsertItemBody insertItemEqp insertItemInv insertItemShadeleteItemFloordeleteItemBody deleteItemEqp deleteItemInv deleteItemSha rmFromBagaspectToBenefit$fEnumSlotChar $fOrdSlotChar$fBinaryHitAtomic$fBinarySfxAtomic$fBinaryUpdAtomic$fBinaryCmdAtomic posProjBodysingleFidAndAid singleAidsingleContainerupdCreateActorupdDestroyActor updCreateItemupdDestroyItem updRecordKill updAlterTile updAgeGamehandleUpdAtomic updMoveActor updWaitActorupdDisplaceActor updMoveItem updAgeActor updRefillHP updRefillCalmupdOldFidActor updTrajectory updColorActorupdQuitFactionupdLeadFactionupdDiplFactionupdAutoFaction updAlterClearupdLearnSecrets updSpotTile updLoseTile updAlterSmell updSpotSmell updLoseSmellageLevel updRestartupdRestartServerupdResumeServerhandleCmdAtomicServeratomicRemember$fBinaryTarget$fBinaryRunParams$fBinaryStateClient computeBFScomputePathBFScomputeAnythingBFS waitBlockNow moveOrRunAidApplyItemGroup ApplyFirstAidApplyAllToAnytoAnypickup equipItems unEquipItemsgroupByEqpSlot bestByEqpSlothindersharmfulunneeded meleeBlockermeleeAnytriggerrangedflee displaceFoedisplaceBlockerdisplaceTowardschase moveTowards inverseVideodrawArenaStatusdrawLeaderStatusdrawLeaderDamage drawSelecteddrawPlayerNamereadConnFrontendwriteConnFrontend drawOverlays targetDescgetYesNocontinueRunDir tryTurning checkAndRungetItem DefItemKeydefLabeldefCond defActionItemDialogStateIAll ISuitableINone transition runDefItemKey pickNumberpartyAfterLeaderdoLookfloorItemOverlay targetReject targetAccept endTargeting describeItemCmaxKendTargetingMsgmeleeAid displaceAid alterTile guessAlter triggerTile verifyTrigger guessTrigger projectPos projectEpstriggerSymbols alterFeaturestriggerFeatures cmdAction addNoSlides deleteSmell createActor destroyActor perception discoverKind coverKind discoverSeed coverSeedkillExit actorVerbMU lookAtMoveaVerbMU itemVerbMUaiVerbMUmsgDuplicateScrap createActorUIdestroyActorUI moveItemUIdisplaceActorUI quitFactionUIdiscoverstrike storeUndoinitCli $fBinaryRNGs$fBinaryDebugModeSer$fBinaryStateServer $fShowRNGs PerceptionLitPerceptionReachablelevelPerceptionfactionPerceptionvisibleOnLevelreachableFromActor litByItemsfullscan ActorEqpBodyplit preachable addProjectilequitFanyActorsAlive projectBlaDebugAidlabelcmdlidtimeaidfaction debugPretty debugPlaindebugAidConnServerFaction writeTQueueAI writeTQueueUI readTQueueAI readTQueueUICliImplementationcliState cliClientcliDict cliToSave cliSessionrunCliImplementationCliState$fMonadAtomicCliImplementation-$fMonadClientWriteRequestreqCliImplementation.$fMonadClientReadResponserespCliImplementation $fMonadClientUICliImplementation$fMonadClientCliImplementation"$fMonadStateWriteCliImplementation!$fMonadStateReadCliImplementationSerImplementationserState serServerserDict serToSavehandleAndBroadcastServer$fMonadAtomicSerImplementationrunSerImplementationSerState)$fMonadServerReadRequestSerImplementation$fMonadServerSerImplementation"$fMonadStateWriteSerImplementation!$fMonadStateReadSerImplementation rollSpawnPos dominateFid addMonsteraddHero findEntryPoss mapFromFuns lowercasecreateFactionspopulateDungeon effectSem effectEscapeeffectParalyzeeffectInsertMoveeffectDropBestWeapon effectDropEqpeffectSendFlyingeffectTeleporteffectActivateInveffectRefillHP halveCalm effectHurteffectRefillCalmeffectDominate effectImpresseffectCallFriend effectSummoneffectCreateItemeffectApplyPerfume effectBurn effectAscend switchLevels1 switchLevels2effectTransformEqpsendFlyingVectoreffectPolyItemeffectIdentify effectExplode effectOneOf equipAllItemsaddSmellreqMelee reqDisplacereqAlterreqWait reqTriggerhandleRequestTimed switchLeader reqMoveItem reqProjectreqApply triggerEffectreqGameRestart reqGameExit reqGameSave reqAutomateactivatePeriodicLevel handleActors saveBkpAll setTrajectoryendClipgameExit restartGame