Methods and Algorithms of Artificial Intelligence

2008/2009

Politechnika Wroclawska





Reinforcement Learning for roguelike type games (eliteMod v0.9)




Juan Manuel Sanchez Fernandez 175053







1. Introduction

EliteMod is an implementation in a Ruby language of an agent. Which through the application of reinforcement learning it attempt to survive in a rogue-like game type (NetHack).



2. Summary

The purpose of the project is to implement the Temporal Difference learning algorithm to the agent that acts in nethack.

A free server (www.alt.org/nethack) that provides the telnet service to communicate the client with the server.


Through a console interface, the agent sends and receives messages with server.

Have been implemented over 40 actions available to the agent, most of these basic movements of a single compound. And the possibility to choose one random mind. Some actions are pasives and dont take time of play, they only provide information about the environment. Most of the normal actions take a complete turn.

The agent has a number of semi-permanent features that can be checked and updated every turn. To assess the state of the agent has been restricted to these characteristics that determine and affect directly to the chance of survival of the agent in a short period of time (eg: health points) and those attributes of the game that vary rapidly and those that primarily derib the final punctuation of the agent (eg dungeon level, experience of the character and actual game turn).




3. Problems founded during the develop of the project.


3.1 Technical problems:

The main problems of implementation have been: Low level programming for communication with the server using telnet. And interpreting the interface of responses to this entry and the correct visualization of data.


Both have been a major source of problems, even as these mostly unique adaptations of the original project. To this day, and after implement all the solutions remains the main drawback. Communication is interrupted after a first iteration and the reception of data is of poor quality, which requires to restart completely the application (most of the time manualy by killing the process). It makes very difficult to extrapolate data from one session to other.


These problems add another drawback in an indirect way. Communication with the server is relatively slow which makes the serialization of these tests and require a long time.


3.2 Gameplaying:

Another serious drawback for the interpretation of data (entries from the server) is the way in which the game provides such data. The graphical interface is completely designed with ASCII characters. That is, each ASCII symbol (not only the alpha-numeric) have a role in the game and represent some item or conduct of any aspect of the game. And in most cases the same symbol can represent different items depending on the context or symbols that accompany it. Besides plain text menus and help in natural language in the middle of the game window, depending on certain events or commands. It dificult too much the sysntactic analisys of the data inputs.


To play it is needed some experience and knowledge of the commands, and the many activities available, their combination and variety of results, it becomes necessary to continually have a manual referenciapara for an human player.


3.3 Others

Ruby, the programming language used has been new for me which I needed for continuous learning during the development of the project and it has brought me big time delays for implementation of small problems.



4. Conclusions


Temporal difference learning algorithm was the elected for this implementation. But by applying this algorithm described results are not satisfactory, the algorithm tend to monopolize the first movements because of the penalty added in each turn to the following movements. Thus, by failing to reward early stages, each different from the first movement is ruled out as having a worse evaluation.
To prevent the monopoly of a single action it has added a corrective action that break this for no repeat twice on a row the same action, in this case it electes a random action. This points help to keep an exploration policy which is recomended for do not get into a loop of not-optimal actions.



4.2 Temporal difference learning algorithm (pseudocode)

function PTDA(percept) returns an action

inputs: percept, a percept indicating the current state s' and reward signal r'

static: M, a fixed policy

U, a table of utilities, initially empty

Ns, a table of frequencies for states, initially zero

s, a, r, the previous state, action, and reward, initially null

if s' is new then U[s'] ← r'

if s is not null then do

increment Ns[s]

U[s] ← U[s] + a(Ns[s]) + yU[s'] – U[s])

if Terminal?[s'] then s,a,r ← null else s, a ,r ← s', M[s'], r'

return a



Note: alpha = 1/n

landa => 0 < landa < 1

s' and s: by the difficulty of choosing a state that describes the location of the agent, has chosen the simple state of current hit points.

r' and r: It is the evaluation of

((actual dungeon lvl) * expirience gained) + score – turns of game


Applying Reinforcement Learning to the project could bring results, but it is very difficult and tedious. The results of any single action will be vary enormously and the various dangers to which the agent is facing vary in the same proportion. This means that if we ignore the basic movements (such as walking, attacking, brandish a weapon or to drink a potion, etc) the result after hundreds of iterations is only a few actions are actually worthly repeated, but possibly in the next time to be used it will be unnecessary or counterproductive.


The results are improved a little, ignoring completely the actions of a very specific use or difficult to apply in very specific situations.

Yet, the basic actions only provide a slight chance of survival because of the level of randomization of the game. To achieve efficiency, algorithms should be applied to calculate trajectories, detection of objects on the map, identification of the object and its properties, and a complete mapping of the level with objects and mosters to find the exact location of each point identified.


The rewards in experience and levels are too remote in time and space of individual actions, so it is hard to quickly affect the learning of the agent.

Based on experience with the agent and testing for this concret proyect, it is even difficult indeed to leave a room. In most of the games completed successfully, and quite surprisingly and curiously the fact that most of the deaths are suicides “by kicking a wall”. (or even “killed by kicking 55 gold pieces”). Other case common of death is “pray” to the agent's God, if it pray to often, the god gets angry and the agent lose all its beneffits and it is attacked by various evil forces.


The main problem is that one action, or object that could be very useful for one situation, in other is worthless or even dangerous.


Only in two case It successed to achieve level2 of experience, that represent less than 2% of the total games. And in one it research the DungeonLevel2.


In fact, of all similar projects with which I have documented only a few have reached a real success on applying artificial intelligence in this game. None of them focuses Reinforcement Learning. Quite the contrary, they have complex algorithms to detect complex situations or locations and getting the maximum benefit from them, avoiding or running away from everything else. Through a series of predefined algorithms and actions for each event.



4.1 Screen of the game

At the end of the document, as apendix there are several printscreen of the agent working.


5 Extra Information


5.1 The world format

The roguelike is a sub-genre of role-playing video games, characterized by randomization for replayability, permanent death, and turn-base movement. The interface is on ASCII graphics. Games are typically dungeons crawls, with many mosnters, items, and enviromental features.


5.2 The Game

Nethack is open source and remains one of the oldest computer games still actively developed (more than 20 years). It is a single-player game, turn based and it is the main exponent of roguelike video games.


For start a game, the player is asked to name his character and then select race, role, gender and alignment (or allow the game to assign them).

The main objetive to win the game is to retreive the Amulet of Yendor, found at the lowest level of the dungeon, and sacrifice it to the deity of the character. The player's character is usually accompained by a pet animal.


5.3 Dungeon levels.

Nethack spans about 50 levels, of which most are randomly generated when the player character first encounters them. A typical level contains a way “up” and a way “down”, along with several "rooms" joined by corridors. Some "special" levels are of fixed design in every game session. There are several dungeon branches, including Soloban puzzle and Vlad's Tower.


5.4 Items and tools

Nethack features a variety of items: weapons, armor, scrolls, spellbooks, potions and an assortment of tools. One important aspect of the gameplay is the identification of items and its properties.


5.5 Character death

Like rogelikes in general, NetHack features permanent death: expired characters cannot be revived without having made backup copies of the actual save files. The game sporadically saves a level on which a character has died and then integrates that level into a later game.


5.6 Spoilers

NetHack is largely based on discovering secrets and tricks during gameplay. It can take years for one to become well-versed in them, and even experienced players routinely discover new ones.



5.7 Interface

NetHack was originally created with only a simple ASCII graphical user interface, although the option to use something more elaborate was added later in its development. Interface elements — environment, entities, and objects — are represented by arrangements of ASCII or Extended ASCII glyphs used in plain text.



A detailed example:

 You see here a silver ring.
                                           ------------
                                         ##....._.....|
                                           |...........#          ------
                                          #...........|           |....|
                      ---------------   ###------------           |...(|
                      |..%...........|##########               ###-@...|
                      |...%...........###    #                 ## |....|
                      +.......<......|       ###              ### |..!.|
                      ---------------          #              #   ------
                                               ###          ###
                                                 #          #
                                              ---.-----   ###
                                              |.......|   #
                                              |........####
                                              |.......|
                                              |.......|
                                              ---------
 Hacker the Conjurer            St:11 Dx:13 Co:12 In:11 Wi:18 Ch:11  Lawful
 Dlvl:3  $:120 HP:39(41) Pw:36(36) AC:6  Exp:5 T:1073




6. Ruby (programming language)

Ruby is a dynamic, reflective, general purpose object-oriented programming language that conbines syntax inspired by Perl with Smalltalk-like features. Ruby supports multiple programming paradigms, including functional, object oriented, imperative and reflexive. It also has a dynamic tye system and automatic memory management; it is therefore similar in varying respectes to Python and Perl.





7. Reinforcement Learning.

Reinforcement learning is learning what to do--how to map situations to actions--so as to maximize a numerical reward signal. The learner is not told which actions to take, as in most forms of machine learning, but instead must discover which actions yield the most reward by trying them. In the most interesting and challenging cases, actions may affect not only the immediate reward but also the next situation and, through that, all subsequent rewards. These two characteristics--trial-and-error search and delayed reward--are the two most important distinguishing features of reinforcement learning.

Such an agent must be able to sense the state of the environment to some extent and must be able to take actions that affect the state. The agent also must have a goal or goals relating to the state of the environment. The formulation is intended to include just these three aspects--sensation, action, and goal--in their simplest possible forms without trivializing any of them.

Reinforcement learning is different from supervised learning, the kind of learning studied in most current research in machine learning, statistical pattern recognition, and artificial neural networks. Supervised learning is learning from examples provided by a knowledgable external supervisor. This is an important kind of learning, but alone it is not adequate for learning from interaction. In interactive problems it is often impractical to obtain examples of desired behavior that are both correct and representative of all the situations in which the agent has to act. In uncharted territory--where one would expect learning to be most beneficial--an agent must be able to learn from its own experience.

Another key feature of reinforcement learning is that it explicitly considers the whole problem of a goal-directed agent interacting with an uncertain environment.

Reinforcement learning takes the opposite tack, starting with a complete, interactive, goal-seeking agent. All reinforcement learning agents have explicit goals, can sense aspects of their environments, and can choose actions to influence their environments. Moreover, it is usually assumed from the beginning that the agent has to operate despite significant uncertainty about the environment it faces. When reinforcement learning involves planning, it has to address the interplay between planning and real-time action selection, as well as the question of how environmental models are acquired and improved. When reinforcement learning involves supervised learning, it does so for specific reasons that determine which capabilities are critical and which are not. For learning research to make progress, important subproblems have to be isolated and studied, but they should be subproblems that play clear roles in complete, interactive, goal-seeking agents, even if all the details of the complete agent cannot yet be filled in.



7.1 Temporal difference learning

Temporal difference (TD) learning is a prediction method. It has been mostly used for solving the reinforcement learning problem. "TD learning is a combination of Monte Carlo ideas and dynamic programming (DP) ideas. TD resembles a Monte Carlo method because it learns by sampling the environment according to some policy. TD is related to dynamic programming techniques because it approximates its current estimate based on previously learned estimates (a process known as bootstrapping). The TD learning algorithm is related to the temporal difference model of animal learning.

As a prediction method, TD learning takes into account the fact that subsequent predictions are often correlated in some sense. In standard supervised predictive learning, one learns only from actually observed values: A prediction is made, and when the observation is available, the prediction is adjusted to better match the observation. The core idea of TD learning is that we adjust predictions to match other, more accurate, predictions about the feature. This procedure is a form of bootstrapping.



7.2 Temporal difference learning algorithm

function PTDA(percept) returns an action

inputs: percept, a percept indicating the current state s' and reward signal r'

static: M, a fixed policy

U, a table of utilities, initially empty

Ns, a table of frequencies for states, initially zero

s, a, r, the previous state, action, and reward, initially null

if s' is new then U[s'] ← r'

if s is not null then do

increment Ns[s]

U[s] ← U[s] + a(Ns[s]) + yU[s'] – U[s])

if Terminal?[s'] then s,a,r ← null else s, a ,r ← s', M[s'], r'

return a





References:



EliteBot: Copyright (c) 2006, The EliteBot DevTeam

NetHack: http://www.nethack.org/

Public NetHack server: http://alt.org/nethack/

www.wikipedia.org

Reinforcement learning, Class notes: http://zpcir.ict.pwr.wroc.pl/~witold/ai/aie_rlearn_s.pdf

Reinforcement Learning: An Introduction (Richard S. Sutton and Andrew G. Barto )

Ruby: http://rubytutorial.wikidot.com/

An other agents of net hack:

Saiph http://projects.exent.net/saiph.git

TAEB http://sartak.org/code/TAEB/

And a lot of fast references to “www.google.com”





Appendix “screens”

Here we can see the normal screen of the game, the main character is the “@” simbol, “d” is a peaceful pet, “<” is the stairs to the exit, the entrance to the game. “.” are empty floor, “|” and “-” walls.

On the top of the screen we can see how the main “enviromentals” events are notice in a plain text

In the bottom of the picture there are 2 lines with the attributes of the character.





























Apendix History statics



A general historial about the games, in cronologic order, extracted from alt.org/nethack

Rank Score Lev/Max HP/Max Type Death

1 20 01/01 18/18 Val Dwa Fem Law quit

2 0 01/01 0/14 Mon Hum Mal Cha killed by a kobold

3 7 01/01 10/10 Tou Hum Mal Neu escaped

4 2 01/01 13/13 Pri Elf Fem Cha escaped

5 44 01/01 06/06 Mon Hum Mal Law killed by the wrath of Shan Lai Ching

6 44 01/01 -4/13 Hea Hum Mal Neu killed by an air elemental of Hermes

7 68 01/01 -1/2 Hea Hum Fem Neu killed by kicking 3 gold pieces

8 5 01/01 16/16 Cav Hum Fem Neu escaped

9 48 01/01 -1/14 Ran Gno Mal Neu killed by an air elemental of Venus

10 44 01/01 0/11 Rog Orc Mal Cha killed by a kobold

11 56 01/01 01/06/14 Mon Hum Mal Law killed by the wrath of Shan Lai Ching

12 122 02/02 0/16 Bar Hum Fem Cha killed by a grid bug

13 0 01/01 0/1 Tou Hum Fem Neu killed by kicking a wall

14 0 01/01 10/10 Tou Hum Mal Neu escaped

15 3 01/01 14/14 Ran Elf Fem Cha escaped

16 5 01/01 02/10 Tou Hum Fem Neu escaped

17 0 01/01 0/1 Tou Hum Fem Neu killed by kicking a wall

18 0 01/01 -1/10 Ran Elf Mal Cha killed by an incubus of Mars, while helpless

19 0 01/01 -2/1 Rog Hum Fem Cha killed by kicking a wall

20 0 01/01 0/14 Mon Hum Mal Cha killed by kicking an iron chain

21 4 01/01 0/4 Rog Hum Mal Cha killed by an orcish dagger

22 44 01/01 -2/9 Ran Hum Mal Cha killed by a marilith of Mars

23 3 01/01 03/12 Arc Gno Mal Neu escaped

24 44 01/01 -3/13 Pri Elf Mal Cha killed by a goblin

25 0 01/01 -15/10 Tou Hum Fem Neu killed by a water elemental of The Lady

26 0 01/01 -3/1 Rog Hum Fem Cha killed by kicking the stairs

27 0 01/01 0/3 Pri Elf Mal Cha killed by kicking a wall

28 0 01/01 0/14 Ran Elf Fem Cha killed by kicking a wall

29 0 01/01 -2/10 Tou Hum Mal Neu killed by kicking a wall

30 0 01/01 0/4 Rog Hum Fem Cha killed by kicking a wall

31 48 01/01 0/6 Val Dwa Fem Law killed by kicking a wall

32 0 01/01 0/12 Hea Gno Fem Neu killed by kicking a wall

33 0 01/01 -4/3 Rog Orc Mal Cha killed by kicking a wall

34 0 01/01 03 Hea Hum Fem Neu killed by the wrath of Hermes

35 48 01/01 0/11 Rog Orc Fem Cha killed by a jackal

36 0 01/01 -2/14 Ran Elf Mal Cha killed by kicking a wall

37 0 01/01 -1/9 Sam Hum Fem Law killed by kicking a wall

38 0 01/01 0/12 Hea Gno Mal Neu killed by kicking a wall

39 44 01/01 0/3 Bar Orc Fem Cha killed by kicking a wall

40 0 01/01 -2/8 Rog Orc Fem Cha killed by kicking a wall

41 0 01/01 -1/2 Bar Hum Mal Cha killed by kicking a wall

42 0 01/01 11/11 Wiz Gno Mal Neu killed by the wrath of Thoth

43 0 01/01 -7/15 Cav Gno Fem Neu killed by a fire elemental of Ishtar, while helpless

44 0 01/01 0/13 Hea Hum Fem Neu killed by kicking a wall

45 0 01/01 -2/3 Wiz Orc Mal Cha killed by kicking a wall

46 0 01/01 -8/10 Tou Hum Fem Neu killed by a water elemental of The Lady

47 44 01/01 14/15 Bar Orc Mal Cha killed by the wrath of Set

48 44 01/01 08/11 Wiz Orc Mal Cha killed by the wrath of Anhur

49 0 01/01 -1/14 Mon Hum Mal Neu killed by a jackal

50 0 01/01 0/8 Val Dwa Fem Law killed by a jackal

51 0 01/01 05/08 Kni Hum Mal Law killed by the wrath of Lugh

52 0 01/01 -2/18 Cav Dwa Fem Law killed by a couatl of Anu

53 0 01/01 -6/11 Wiz Gno Mal Neu killed by a fire elemental of Thoth

54 0 01/01 -6/12 Kni Hum Fem Law killed by a couatl of Lugh

55 4 01/01 01/07/14 Mon Hum Fem Neu killed by the wrath of Chih Sung-tzu

56 0 01/01 -1/1 Bar Orc Fem Cha killed by a newt

57 4 01/01 0/10 Tou Hum Fem Neu killed by a jackal

58 44 01/01 01 /15 Arc Dwa Mal Law killed by the wrath of Quetzalcoatl

59 4 01/01 -1/4 Sam Hum Mal Law killed by kicking a wall

60 0 01/01 -4/1 Tou Hum Fem Neu killed by kicking a wall

61 0 01/01 -2/12 Arc Gno Fem Neu killed by kicking a wall

62 44 01/01 0/9 Ran Hum Mal Neu killed by an air elemental of Venus

63 0 01/01 -5/8 Hea Gno Fem Neu killed by a fire elemental of Hermes

64 0 01/01 0/1 Tou Hum Fem Neu killed by kicking a wall

65 0 01/01 -2/11 Wiz Gno Fem Neu killed by kicking a wall

66 0 01/01 01/08/16 Val Hum Fem Neu killed by the wrath of Odin

67 0 01/01 -1/12 Wiz Hum Mal Neu killed by kicking a wall

68 0 01/01 11/11 Wiz Elf Mal Cha died of starvation

69 0 01/01 -1/14 Mon Hum Mal Cha killed by an incubus of Huan Ti

70 0 01/01 0/14 Mon Hum Mal Cha killed by kicking a wall

71 0 01/01 0/3 Tou Hum Mal Neu killed by kicking a rock

72 44 01/01 -1/14 Ran Elf Mal Cha killed by kicking a wall

73 44 01/01 -1/14 Mon Hum Mal Cha killed by kicking the stairs

74 0 01/01 -2/18 Cav Dwa Mal Law killed by a couatl of Anu

75 44 01/01 -1/8 Val Hum Fem Law killed by a couatl of Tyr

76 0 01/01 -3/14 Ran Gno Fem Neu killed by kicking a wall

77 44 01/01 0/12 Rog Hum Fem Cha killed by kicking a wall

78 0 01/01 -1/7 Mon Hum Mal Cha killed by kicking a wall

79 0 01/01 -1/11 Wiz Gno Fem Neu killed by kicking a wall

80 0 01/01 -8/1 Hea Hum Fem Neu killed by an air elemental of Hermes

81 0 01/01 -2/15 Ran Hum Mal Cha killed by a fox, while helpless

82 44 01/01 0/11 Wiz Gno Fem Neu killed by kicking a wall

83 16 01/01 -1/16 Cav Hum Mal Neu killed by kicking a wall

84 0 01/01 04/08 Sam Hum Fem Law killed by the wrath of Amaterasu Omikami

85 0 01/01 -1/13 Arc Hum Mal Law killed by a sewer rat, while helpless

86 0 01/01 -2/12 Arc Gno Mal Neu killed by kicking a wall

87 4 01/01 0/8 Bar Hum Mal Neu killed by kicking a wall

88 0 01/01 0/12 Arc Gno Mal Neu killed by a sewer rat

89 0 01/01 0/11 Wiz Orc Fem Cha killed by a fox

90 0 01/01 08/11 Wiz Elf Mal Cha killed by the wrath of Anhur

91 0 01/01 01/06 Pri Hum Mal Cha killed by the wrath of Huhetotl

92 0 01/01 18/18 Val Dwa Fem Law killed by the wrath of Tyr

93 8 01/01 0/15 Sam Hum Mal Law killed by a grid bug

94 0 01/01 0/16 Kni Hum Fem Law killed by kicking a wall

95 0 01/01 0/14 Pri Hum Fem Cha killed by kicking a wall

96 0 01/01 0/13 Hea Hum Mal Neu killed by kicking a wall

97 0 01/01 -1/10 Tou Hum Mal Neu killed by kicking a wall

98 0 01/01 -1/18 Val Dwa Fem Law killed by kicking a wall

99 0 01/01 0/12 Hea Gno Fem Neu killed by kicking a wall

100 0 01/01 0/13 Pri Elf Fem Cha killed by kicking a wall

101 50 02/02 -3/14 Ran Elf Mal Cha killed by kicking a wall

102 0 01/01 -3/15 Ran Hum Fem Neu killed by kicking a wall

103 0 01/01 0/12 Rog Hum Fem Cha killed by kicking a wall

104 4 01/01 0/10 Tou Hum Fem Neu killed by kicking a wall

105 0 01/01 0/15 Sam Hum Mal Law killed by kicking a wall

106 0 01/01 -3/16 Kni Hum Mal Law killed by kicking a wall

107 0 01/01 -1/14 Mon Hum Mal Law killed by kicking a wall

108 0 01/01 0/16 Cav Hum Mal Law killed by kicking a wall

109 0 01/01 0/11 Wiz Gno Fem Neu killed by kicking a wall

110 0 01/01 0/14 Mon Hum Fem Law killed by kicking a wall

111 0 01/01 -2/12 Rog Hum Fem Cha killed by kicking a wall

112 0 01/01 0/10 Tou Hum Mal Neu killed by kicking a wall

113 0 01/01 -2/15 Cav Gno Fem Neu killed by kicking a wall

114 0 01/01 -1/18 Val Dwa Fem Law killed by kicking a wall

115 0 01/01 -1/14 Mon Hum Fem Neu killed by kicking a wall

116 0 01/01 -1/15 Cav Gno Mal Neu killed by kicking a wall

117 0 01/01 0/14 Pri Hum Mal Neu killed by kicking a wall

118 0 01/01 -7/16 Val Hum Fem Law killed by a dwarvish spear

119 0 01/01 -1/12 Rog Hum Mal Cha killed by kicking a wall

120 0 01/01 0/15 Bar Orc Mal Cha killed by kicking a wall

121 0 01/01 -2/15 Sam Hum Mal Law killed by kicking a wall

122 0 01/01 0/11 Rog Orc Fem Cha killed by a jackal

123 0 01/01 0/16 Bar Hum Fem Cha killed by kicking a wall

124 0 01/01 0/12 Wiz Hum Mal Cha killed by kicking a wall

125 0 01/01 -3/11 Rog Orc Fem Cha killed by kicking a wall

126 0 01/01 0/14 Ran Gno Fem Neu killed by kicking a wall

127 0 01/01 0/18 Val Dwa Fem Law killed by kicking a wall

128 0 01/01 -2/15 Bar Orc Mal Cha killed by kicking a wall

129 20 01/01 0/15 Sam Hum Mal Law killed by kicking a wall

130 0 01/01 0/12 Wiz Hum Fem Neu killed by kicking a wall

131 0 01/01 -2/15 Sam Hum Mal Law killed by kicking a wall

132 0 01/01 -2/14 Mon Hum Mal Law killed by a fox

133 0 01/01 0/15 Bar Orc Mal Cha killed by kicking a wall

134 0 01/01 -1/14 Mon Hum Fem Law killed by a fox

135 0 01/01 -2/10 Tou Hum Mal Neu killed by kicking a wall

136 0 01/01 0/14 Pri Hum Mal Cha killed by kicking a wall

137 0 01/01 0/18 Cav Dwa Mal Law killed by kicking a wall

138 0 01/01 01 /14 Pri Hum Mal Law quit

139 4 01/01 -1/13 Hea Hum Mal Neu killed by kicking a wall

140 4 01/01 0/11 Wiz Elf Fem Cha killed by kicking a wall

141 0 01/01 10/10 Tou Hum Fem Neu quit

142 4 01/01 -1/14 Pri Hum Fem Law killed by kicking a wall

143 0 01/01 0/15 Cav Gno Mal Neu killed by kicking a wall

144 0 01/01 0/14 Pri Hum Fem Neu killed by a falling rock

145 0 01/01 -2/15 Bar Orc Fem Cha killed by kicking a wall

146 0 01/01 -1/11 Rog Orc Fem Cha killed by kicking a wall

147 0 01/01 -4/13 Arc Hum Fem Law killed by a goblin

148 0 01/01 -2/12 Hea Gno Fem Neu killed by kicking 55 gold pieces

149 0 01/01 -1/11 Rog Orc Mal Cha killed by kicking a wall

150 0 01/01 0/15 Bar Orc Mal Cha killed by kicking a wall

151 0 01/01 -2/14 Pri Hum Mal Law killed by kicking a wall

152 4 01/01 0/16 Val Hum Fem Law killed by a sewer rat

153 0 01/01 0/13 Arc Hum Mal Law killed by kicking a wall

154 0 01/01 0/14 Mon Hum Mal Neu killed by kicking a wall

155 0 01/01 0/15 Sam Hum Fem Law killed by kicking the stairs

156 0 01/01 -3/14 Ran Elf Mal Cha killed by kicking the stairs

157 0 01/01 0/16 Kni Hum Fem Law killed by kicking a wall

158 0 01/01 0/12 Rog Hum Mal Cha killed by kicking a wall

159 0 01/01 0/10 Tou Hum Mal Neu killed by kicking a wall

160 0 01/01 -4/12 Hea Gno Mal Neu killed by kicking a wall

161 0 01/01 -1/12 Wiz Hum Mal Cha killed by kicking a wall

162 4 01/01 0/14 Mon Hum Mal Cha killed by kicking a wall

163 0 01/01 -1/15 Sam Hum Mal Law killed by a jackal

164 0 01/01 0/13 Arc Hum Fem Neu killed by a jackal

165 0 01/01 0/16 Bar Hum Fem Neu killed by kicking a wall

166 0 01/01 0/13 Arc Hum Mal Neu killed by a jackal

167 0 01/01 0/16 Bar Hum Mal Neu killed by kicking a wall

168 16 01/01 -2/14 Mon Hum Fem Cha killed by kicking the stairs

169 0 01/01 0/10 Tou Hum Fem Neu killed by kicking the stairs

170 0 01/01 0/12 Rog Hum Fem Cha killed by a jackal

171 4 01/01 0/11 Wiz Elf Fem Cha killed by a jackal

172 0 01/01 -1/16 Bar Hum Fem Neu killed by kicking a wall

173 0 01/01 0/10 Tou Hum Mal Neu killed by kicking a wall

174 0 01/01 0/15 Sam Hum Fem Law killed by kicking a wall

175 0 01/01 0/13 Arc Hum Fem Law killed by kicking the stairs

176 0 01/01 -2/14 Ran Gno Fem Neu killed by kicking a wall

177 0 01/01 -1/16 Kni Hum Fem Law killed by kicking a wall

178 0 01/01 -3/1 Arc Dwa Mal Law killed by kicking a wall

179 0 01/01 0/1 Arc Dwa Fem Law killed by kicking a wall

180 0 01/01 -1/13 Arc Hum Fem Law killed by kicking a wall

181 0 01/01 0/13 Hea Hum Fem Neu killed by kicking a wall

182 4 01/01 0/16 Bar Hum Mal Neu killed by kicking a wall

183 44 01/01 -3/12 Rog Hum Mal Cha killed by kicking a wall

184 0 01/01 0/11 Wiz Orc Fem Cha killed by a newt

185 0 01/01 0/10 Tou Hum Fem Neu killed by a jackal

186 0 01/01 -1/14 Pri Hum Mal Cha killed by kicking a wall

187 68 01/01 -1/14 Pri Hum Fem Neu killed by a goblin

188 0 01/01 -3/15 Bar Orc Fem Cha killed by a falling rock

189 44 01/01 -2/14 Ran Gno Mal Neu killed by kicking a wall

190 44 01/01 -1/15 Sam Hum Mal Law killed by kicking a wall

191 112 01/01 0/22 Kni Hum Mal Law killed by a jackal

192 0 01/01 -1/10 Tou Hum Fem Neu killed by kicking the stairs

193 44 01/01 -1/13 Arc Hum Fem Neu killed by a newt, while helpless

194 0 01/01 -2/11 Rog Orc Fem Cha killed by kicking a wall

195 0 01/01 -1/2 Pri Elf Mal Cha killed by kicking a wall

196 0 01/01 -2/12 Hea Gno Mal Neu killed by kicking a wall

197 0 01/01 0/15 Ran Hum Fem Cha killed by kicking a wall

198 0 01/01 -2/16 Bar Hum Fem Neu killed by kicking a wall

199 0 01/01 -1/14 Pri Hum Fem Neu killed by kicking a wall