Added Event classes to pyrisk.log
[pyrisk.git] / pyrisk / log.py
index e795374f2438a72412a2d2c01f775ba01bd46795..b6296163c9d02c9b6c5b3eecaea444c33589e525 100644 (file)
 """Define Logger class for saving and formatting game activity.
 """
 
+class Event (object):
+    """Base class for logged actions.
+    """
+    def __init__(self, message):
+        self.message = message
+    def __str__(self):
+        return self.message
+    def __repr__(self):
+        return self.__str__()
+
+class Announcement (Event):
+    """A statement about game status.
+    """
+
+class BeginGame (Announcement):
+    def __init__(self, players=[]):
+        # perhaps copy the list of players?
+        self.players = players
+        Announcement.__init__(self, 'Game started with %s' % self.players)
+
+class EndGame (Announcement):
+    def __init__(self, players=[]):
+        self.players = players
+        Announcement.__init__(self, 'Game over')
+        # perhaps add turns-survived ranking
+
+class Killed (Announcement):
+    def __init__(self, player, killer):
+        self.player = player
+        self.killer = killer
+        Announcement.__init__(
+            self, '%s killed by %s' % (self.player, self.killer))
+
+
+class StartTurn (Announcement):
+    def __init__(self, player, players=[], world=None):
+        self.player = player
+        self.players = players
+        self.world = world
+        Announcement.__init__(
+            self,
+            "%s's turn (territory score: %s)"
+            % (self.player,
+               [(p,len(list(p.territories(self.world))))
+                for p in self.players]))
+
+class DealtCards (Announcement):
+    """A player recieves cards from the deck.
+    """
+    def __init__(self, player, num_cards, num_remaining):
+        self.player = player
+        self.num_cards = num_cards
+        self.num_remaining = num_remaining
+        Announcement.__init__(
+            self,
+            '%s dealt %d cards (%d remaining)'
+            % (self.player, self.num_cards, self.num_remaining))
+
+class EarnsArmies (Announcement):
+    """A player recieves armies.
+    """
+    def __init__(self, player, prod=0, terr_prod={}, source='territories'):
+        self.player = player
+        self.prod = prod
+        self.terr_prod = terr_prod
+        self.source = source
+        if len(terr_prod) == 0:
+            msg = 'earns %d free armies from %s' % (self.prod, self.source)
+        elif self.prod == 0:
+            msg = 'earns %s territory armies from %s' % (self.terr_prod, self.source)
+        else:
+            msg = 'earns %d free armies and %s territory armies from %s' \
+                % (self.prod, self.terr_prod, self.source)
+        Announcement.__init__(self, msg)
+
+
+class PlayerAction (Event):
+    """Report a player decision and its result.
+    """
+    def __init__(self, player, message):
+        Event.__init__(self, message)
+        self.player = player
+    def __str__(self):
+        return '%s: %s' % (self.player, self.message)
+
+class SelectTerritory (PlayerAction):
+    def __init__(self, player, territory):
+        self.territory = territory
+        PlayerAction.__init__(
+            self, player, 'selects %s' % self.territory)
+
+class PlaceArmies (PlayerAction):
+    def __init__(self, player, placements):
+        self.placements = placements
+        PlayerAction.__init__(
+            self, player, 'places %s' % self.placements)
+
+class PlayCards (PlayerAction, EarnsArmies):
+    def __init__(self, player, cards, prod=0, terr_prod={}, source='cards'):
+        self.cards = cards
+        EarnsArmies.__init__(
+            self, player, prod, terr_prod, source)
+        msg = self.message
+        PlayerAction.__init__(self, player, 'plays %s' % self.cards)
+        self.message += ', %s' % msg
+
+class MoveArmies (PlayerAction):
+    def __init__(self, player, source, target, armies):
+        self.source = source
+        self.target = target
+        self.armies = armies
+        PlayerAction.__init__(
+        self, player, 'moves %d from %s to %s' % (armies, source, target))
+
+class Attack (MoveArmies):
+    def __init__(self, source, target, s_dice, t_dice, s_dead, t_dead, armies=None):
+        if armies == None:
+            armies = len(s_dice)
+        MoveArmies.__init__(self, source.player, source, target, armies)
+        self.s_dice = s_dice
+        self.t_dice = t_dice
+        self.s_dead = s_dead
+        self.t_dead = t_dead
+        self.message = 'attacked %s from %s with %d:%d.  Deaths %d:%d.  Remaining %d:%d' \
+            % (self.target, self.source, len(self.s_dice), len(self.t_dice),
+               self.s_dead, self.t_dead,
+               self.source.armies, self.target.armies)
+
+class Conquer (Attack):
+    def __init__(self, source, target, s_dice, t_dice, s_dead, t_dead):
+        Attack.__init__(self, source, target, s_dice, t_dice, s_dead, t_dead,
+                        armies=target.armies)
+        self.message = self.message.replace('attacked', 'conquered')
+
+class Fortify (MoveArmies):
+    def __init__(self, *arg, **kwarg):
+        MoveArmies.__init__(self, *arg, **kwarg)
+        self.message = 'fortifies %s from %s with %d' \
+            % (self.target, self.source, self.armies)
+
 class Logger (list):
     """Log messages generated by risk.base.Engine.