class GameBlockReader(BlockReader):
    def __init__(self, gamestate):
        BlockReader.__init__(self, gamestate)
        self.state['leaves'] = []

        self.actionBlockReader = ActionBlockReader(gamestate)

        self.defineRange(0x1A, 0x1C, 'StartBlock',  Skip(4))
        self.defineRange(0x1E, 0x1F, 'TimeSlot')

        self.define(0x22, 'RandomSeed',             Skip(5))
        self.define(0x23, 'Unknown',                Skip(10))
        self.define(0x2F, 'ForcedCountdown',        Skip(8))

        self.define(0x17, 'LeaveGame')
        self.define(0x20, 'ChatMessage')
        self.define(0x00, 'Finish')

    def handleLeaveGame(self, block, io):
        reason, player_id, result, unknown = extract('IBII', io)
        self.state['leaves'].append((
            self.state['gametime'], reason, player_id, result))

    def handleChatMessage(self, block, io):
        sender, size, flags, mode = extract('bhbi', io)
        message = extractString(io)

    def handleFinish(self, block, io):
        io.read()

    def handleTimeSlot(self, block, io):
        n_bytes, time_inc = extract('HH', io)
        cmdio = extractIO(n_bytes-2, io)

        self.state['gametime'] += time_inc

        while True:
            try:
                player_id, block_length = extract('bH', cmdio)
                actionio = extractIO(block_length, cmdio)
            except ExtractionError:
                break
            self.actionBlockReader.currentPlayer = (
                        self.state['players'][player_id])

            #_p = actionio.tell()
            #dump(actionio.read())
            #actionio.seek(_p)

            self.actionBlockReader.parse(actionio)
    def __init__(self, gamestate):
        BlockReader.__init__(self, gamestate)
        self.state['leaves'] = []

        self.actionBlockReader = ActionBlockReader(gamestate)

        self.defineRange(0x1A, 0x1C, 'StartBlock',  Skip(4))
        self.defineRange(0x1E, 0x1F, 'TimeSlot')

        self.define(0x22, 'RandomSeed',             Skip(5))
        self.define(0x23, 'Unknown',                Skip(10))
        self.define(0x2F, 'ForcedCountdown',        Skip(8))

        self.define(0x17, 'LeaveGame')
        self.define(0x20, 'ChatMessage')
        self.define(0x00, 'Finish')